summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libANGLE
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2020-05-18 15:16:30 +0200
committerLaszlo Agocs <laszlo.agocs@qt.io>2020-05-26 15:11:40 +0200
commit752497910b67b2a1a80560840ca44548d8893434 (patch)
tree541501c9abfd97c3d2fa450d2e6abb60582c4420 /src/3rdparty/angle/src/libANGLE
parent7db527dbdd911c79f31425d099d1fc9c63e42453 (diff)
Remove ANGLE
This marks the end of EGL and OpenGL ES support on Windows. The concepts of -opengl dynamic, -opengl desktop, QT_OPENGL=software, etc. remain unchanged, with the exception of the disapperance of everything ANGLE related. CMake builds now work identically to qmake on Windows: they default to 'dynamic' OpenGL on Windows, unless -DINPUT_opengl=desktop is specified. On Windows, Qt 6 is expected to default to the "dynamic" OpenGL model by default, just like Qt 5.15. This can be changed by switching to "desktop" OpenGL, which will link to opengl32 (publicly, so other libs and applications will do so as well) and disallows using another OpenGL DLL. The "dynamic" mode is essential still because the fallback to a software rasterizer, such as the opengl32sw.dll we ship with the Qt packages, has to to work exactly like in Qt 5, the removal of ANGLE does not change this concept in any way (except of course that the middle option of using ANGLE is now gone) When it comes to the windows plugin's OpenGL blacklist feature, it works like before and accepts the ANGLE/D3D related keywords. They will then be ignored. Similarly, requesting QT_OPENGL=angle is ignored (but will show a warning). The D3D11 and DXGI configure time tests are removed: Qt 5.14 already depends on D3D 11.1 and DXGI 1.3 headers being available unconditionally on Win32 (in QRhi's D3D11 backend). No need to test for these. [ChangeLog][Windows] ANGLE is no longer included with Qt. Dynamic OpenGL builds work like before but ANGLE is no longer an option. OpenGL proper or an alternative opengl32 implementation are the two remaining options now. Attempting to set QT_OPENGL=angle or Qt::AA_UseOpenGLES will have no effect on Windows. Fixes: QTBUG-79103 Change-Id: Ia404e0d07f3fe191b27434d863c81180112ecb3b Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE')
-rw-r--r--src/3rdparty/angle/src/libANGLE/AttributeMap.cpp110
-rw-r--r--src/3rdparty/angle/src/libANGLE/AttributeMap.h49
-rw-r--r--src/3rdparty/angle/src/libANGLE/BinaryStream.h261
-rw-r--r--src/3rdparty/angle/src/libANGLE/Buffer.cpp215
-rw-r--r--src/3rdparty/angle/src/libANGLE/Buffer.h123
-rw-r--r--src/3rdparty/angle/src/libANGLE/Caps.cpp1213
-rw-r--r--src/3rdparty/angle/src/libANGLE/Caps.h758
-rw-r--r--src/3rdparty/angle/src/libANGLE/Compiler.cpp221
-rw-r--r--src/3rdparty/angle/src/libANGLE/Compiler.h51
-rw-r--r--src/3rdparty/angle/src/libANGLE/Config.cpp309
-rw-r--r--src/3rdparty/angle/src/libANGLE/Config.h101
-rw-r--r--src/3rdparty/angle/src/libANGLE/Constants.h62
-rw-r--r--src/3rdparty/angle/src/libANGLE/Context.cpp5558
-rw-r--r--src/3rdparty/angle/src/libANGLE/Context.h1154
-rw-r--r--src/3rdparty/angle/src/libANGLE/ContextState.cpp839
-rw-r--r--src/3rdparty/angle/src/libANGLE/ContextState.h164
-rw-r--r--src/3rdparty/angle/src/libANGLE/Debug.cpp327
-rw-r--r--src/3rdparty/angle/src/libANGLE/Debug.h129
-rw-r--r--src/3rdparty/angle/src/libANGLE/Device.cpp125
-rw-r--r--src/3rdparty/angle/src/libANGLE/Device.h58
-rw-r--r--src/3rdparty/angle/src/libANGLE/Display.cpp1240
-rw-r--r--src/3rdparty/angle/src/libANGLE/Display.h219
-rw-r--r--src/3rdparty/angle/src/libANGLE/Error.cpp110
-rw-r--r--src/3rdparty/angle/src/libANGLE/Error.h267
-rw-r--r--src/3rdparty/angle/src/libANGLE/Error.inl189
-rw-r--r--src/3rdparty/angle/src/libANGLE/ErrorStrings.h173
-rw-r--r--src/3rdparty/angle/src/libANGLE/Fence.cpp135
-rw-r--r--src/3rdparty/angle/src/libANGLE/Fence.h81
-rw-r--r--src/3rdparty/angle/src/libANGLE/Framebuffer.cpp2182
-rw-r--r--src/3rdparty/angle/src/libANGLE/Framebuffer.h389
-rw-r--r--src/3rdparty/angle/src/libANGLE/FramebufferAttachment.cpp385
-rw-r--r--src/3rdparty/angle/src/libANGLE/FramebufferAttachment.h250
-rw-r--r--src/3rdparty/angle/src/libANGLE/HandleAllocator.cpp142
-rw-r--r--src/3rdparty/angle/src/libANGLE/HandleAllocator.h63
-rw-r--r--src/3rdparty/angle/src/libANGLE/HandleRangeAllocator.cpp229
-rw-r--r--src/3rdparty/angle/src/libANGLE/HandleRangeAllocator.h60
-rw-r--r--src/3rdparty/angle/src/libANGLE/Image.cpp245
-rw-r--r--src/3rdparty/angle/src/libANGLE/Image.h115
-rw-r--r--src/3rdparty/angle/src/libANGLE/ImageIndex.cpp249
-rw-r--r--src/3rdparty/angle/src/libANGLE/ImageIndex.h91
-rw-r--r--src/3rdparty/angle/src/libANGLE/IndexRangeCache.cpp121
-rw-r--r--src/3rdparty/angle/src/libANGLE/IndexRangeCache.h63
-rw-r--r--src/3rdparty/angle/src/libANGLE/LoggingAnnotator.cpp44
-rw-r--r--src/3rdparty/angle/src/libANGLE/LoggingAnnotator.h31
-rw-r--r--src/3rdparty/angle/src/libANGLE/MemoryProgramCache.cpp772
-rw-r--r--src/3rdparty/angle/src/libANGLE/MemoryProgramCache.h130
-rw-r--r--src/3rdparty/angle/src/libANGLE/PackedGLEnums.h111
-rw-r--r--src/3rdparty/angle/src/libANGLE/PackedGLEnums_autogen.cpp174
-rw-r--r--src/3rdparty/angle/src/libANGLE/PackedGLEnums_autogen.h84
-rw-r--r--src/3rdparty/angle/src/libANGLE/Path.cpp78
-rw-r--r--src/3rdparty/angle/src/libANGLE/Path.h71
-rw-r--r--src/3rdparty/angle/src/libANGLE/Platform.cpp69
-rw-r--r--src/3rdparty/angle/src/libANGLE/Program.cpp3066
-rw-r--r--src/3rdparty/angle/src/libANGLE/Program.h735
-rw-r--r--src/3rdparty/angle/src/libANGLE/ProgramLinkedResources.cpp1040
-rw-r--r--src/3rdparty/angle/src/libANGLE/ProgramLinkedResources.h274
-rw-r--r--src/3rdparty/angle/src/libANGLE/ProgramPipeline.cpp65
-rw-r--r--src/3rdparty/angle/src/libANGLE/ProgramPipeline.h65
-rw-r--r--src/3rdparty/angle/src/libANGLE/Query.cpp87
-rw-r--r--src/3rdparty/angle/src/libANGLE/Query.h60
-rw-r--r--src/3rdparty/angle/src/libANGLE/RefCountObject.h187
-rw-r--r--src/3rdparty/angle/src/libANGLE/Renderbuffer.cpp235
-rw-r--r--src/3rdparty/angle/src/libANGLE/Renderbuffer.h93
-rw-r--r--src/3rdparty/angle/src/libANGLE/ResourceManager.cpp483
-rw-r--r--src/3rdparty/angle/src/libANGLE/ResourceManager.h289
-rw-r--r--src/3rdparty/angle/src/libANGLE/ResourceMap.h305
-rw-r--r--src/3rdparty/angle/src/libANGLE/Sampler.cpp169
-rw-r--r--src/3rdparty/angle/src/libANGLE/Sampler.h85
-rw-r--r--src/3rdparty/angle/src/libANGLE/Shader.cpp561
-rw-r--r--src/3rdparty/angle/src/libANGLE/Shader.h212
-rw-r--r--src/3rdparty/angle/src/libANGLE/SizedMRUCache.h174
-rw-r--r--src/3rdparty/angle/src/libANGLE/State.cpp2433
-rw-r--r--src/3rdparty/angle/src/libANGLE/State.h602
-rw-r--r--src/3rdparty/angle/src/libANGLE/Stream.cpp271
-rw-r--r--src/3rdparty/angle/src/libANGLE/Stream.h143
-rw-r--r--src/3rdparty/angle/src/libANGLE/Surface.cpp484
-rw-r--r--src/3rdparty/angle/src/libANGLE/Surface.h238
-rw-r--r--src/3rdparty/angle/src/libANGLE/Texture.cpp1484
-rw-r--r--src/3rdparty/angle/src/libANGLE/Texture.h471
-rw-r--r--src/3rdparty/angle/src/libANGLE/Thread.cpp91
-rw-r--r--src/3rdparty/angle/src/libANGLE/Thread.h51
-rw-r--r--src/3rdparty/angle/src/libANGLE/TransformFeedback.cpp221
-rw-r--r--src/3rdparty/angle/src/libANGLE/TransformFeedback.h101
-rw-r--r--src/3rdparty/angle/src/libANGLE/Uniform.cpp226
-rw-r--r--src/3rdparty/angle/src/libANGLE/Uniform.h126
-rw-r--r--src/3rdparty/angle/src/libANGLE/VaryingPacking.cpp408
-rw-r--r--src/3rdparty/angle/src/libANGLE/VaryingPacking.h184
-rw-r--r--src/3rdparty/angle/src/libANGLE/Version.h34
-rw-r--r--src/3rdparty/angle/src/libANGLE/Version.inl59
-rw-r--r--src/3rdparty/angle/src/libANGLE/VertexArray.cpp267
-rw-r--r--src/3rdparty/angle/src/libANGLE/VertexArray.h205
-rw-r--r--src/3rdparty/angle/src/libANGLE/VertexAttribute.cpp162
-rw-r--r--src/3rdparty/angle/src/libANGLE/VertexAttribute.h107
-rw-r--r--src/3rdparty/angle/src/libANGLE/VertexAttribute.inl58
-rw-r--r--src/3rdparty/angle/src/libANGLE/Workarounds.h29
-rw-r--r--src/3rdparty/angle/src/libANGLE/WorkerThread.cpp157
-rw-r--r--src/3rdparty/angle/src/libANGLE/WorkerThread.h284
-rw-r--r--src/3rdparty/angle/src/libANGLE/angletypes.cpp259
-rw-r--r--src/3rdparty/angle/src/libANGLE/angletypes.h487
-rw-r--r--src/3rdparty/angle/src/libANGLE/angletypes.inl35
-rw-r--r--src/3rdparty/angle/src/libANGLE/entry_points_enum_autogen.h336
-rw-r--r--src/3rdparty/angle/src/libANGLE/es3_copy_conversion_formats.json44
-rw-r--r--src/3rdparty/angle/src/libANGLE/es3_copy_conversion_table_autogen.cpp171
-rw-r--r--src/3rdparty/angle/src/libANGLE/es3_format_type_combinations.json171
-rw-r--r--src/3rdparty/angle/src/libANGLE/features.h65
-rw-r--r--src/3rdparty/angle/src/libANGLE/format_map_autogen.cpp1570
-rw-r--r--src/3rdparty/angle/src/libANGLE/format_map_data.json142
-rw-r--r--src/3rdparty/angle/src/libANGLE/formatutils.cpp2133
-rw-r--r--src/3rdparty/angle/src/libANGLE/formatutils.h329
-rw-r--r--src/3rdparty/angle/src/libANGLE/histogram_macros.h112
-rw-r--r--src/3rdparty/angle/src/libANGLE/packed_gl_enums.json35
-rw-r--r--src/3rdparty/angle/src/libANGLE/params.cpp68
-rw-r--r--src/3rdparty/angle/src/libANGLE/params.h228
-rw-r--r--src/3rdparty/angle/src/libANGLE/queryconversions.cpp283
-rw-r--r--src/3rdparty/angle/src/libANGLE/queryconversions.h117
-rw-r--r--src/3rdparty/angle/src/libANGLE/queryutils.cpp1916
-rw-r--r--src/3rdparty/angle/src/libANGLE/queryutils.h162
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/BufferImpl.h69
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/BufferImpl_mock.h48
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/CompilerImpl.h34
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/ContextImpl.cpp119
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/ContextImpl.h186
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/DeviceImpl.cpp22
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/DeviceImpl.h37
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/DisplayImpl.cpp58
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/DisplayImpl.h96
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/EGLImplFactory.h68
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/FenceNVImpl.h34
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/Format.h105
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/Format_ID_autogen.inl147
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/Format_table_autogen.cpp434
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/FramebufferAttachmentObjectImpl.h54
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/FramebufferImpl.h95
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/FramebufferImpl_mock.h73
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/GLImplFactory.h93
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/ImageImpl.h42
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/ImageImpl_mock.h34
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/PathImpl.h36
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/ProgramImpl.h107
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/ProgramImpl_mock.h84
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/ProgramPipelineImpl.h32
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/QueryImpl.h44
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/RenderbufferImpl.h50
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/RenderbufferImpl_mock.h40
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/SamplerImpl.h39
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/ShaderImpl.h40
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/StreamProducerImpl.h39
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/SurfaceImpl.cpp28
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/SurfaceImpl.h73
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/SyncImpl.h34
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/TextureImpl.cpp63
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/TextureImpl.h159
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/TextureImpl_mock.h131
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/TransformFeedbackImpl.h39
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/TransformFeedbackImpl_mock.h41
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/VertexArrayImpl.h37
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/angle_format_data.json24
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/angle_format_map.json132
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/BufferD3D.cpp190
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/BufferD3D.h89
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/CompilerD3D.cpp30
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/CompilerD3D.h33
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/DeviceD3D.cpp105
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/DeviceD3D.h39
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/DisplayD3D.cpp361
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/DisplayD3D.h83
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.cpp1427
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h175
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp87
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.h55
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/FramebufferD3D.cpp405
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/FramebufferD3D.h134
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/HLSLCompiler.cpp354
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/HLSLCompiler.h64
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/ImageD3D.cpp62
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/ImageD3D.h105
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexBuffer.cpp189
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexBuffer.h100
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexDataManager.cpp320
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexDataManager.h105
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/NativeWindowD3D.cpp23
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/NativeWindowD3D.h38
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp2867
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/ProgramD3D.h523
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderTargetD3D.cpp36
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderTargetD3D.h47
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.cpp130
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.h62
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/RendererD3D.cpp260
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/RendererD3D.h359
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/SamplerD3D.h25
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderD3D.cpp247
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderD3D.h99
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderExecutableD3D.cpp71
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderExecutableD3D.h57
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp509
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.h136
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.cpp34
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.h83
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureD3D.cpp3974
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureD3D.h891
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureStorage.h82
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp293
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexBuffer.h175
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexDataManager.cpp646
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexDataManager.h152
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp2153
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.h332
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp1600
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h189
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp833
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.h100
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Context11.cpp405
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Context11.h155
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp119
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h37
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.cpp240
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.h60
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp507
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h104
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Image11.cpp657
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Image11.h112
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp159
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.h50
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp503
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.h135
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/NativeWindow11.h38
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp258
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.h93
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.cpp24
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.h27
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Query11.cpp375
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Query11.h68
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp273
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.h123
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp405
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.h131
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp4089
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.h576
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp533
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.h366
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp119
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h62
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp3075
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.h557
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.cpp102
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.h44
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp1075
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h137
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp3155
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h589
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.cpp124
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.h60
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Trim11.cpp100
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Trim11.h43
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp413
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h99
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp184
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.h62
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/copyvertex.h40
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/copyvertex.inl386
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_format_data.json118
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_format_map_autogen.cpp516
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_data.json1279
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp3042
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h49
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/formatutils11.cpp1023
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/formatutils11.h71
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp2421
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h431
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/BufferToTexture11.hlsl77
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Clear11.hlsl635
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/MultiplyAlpha.hlsl131
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Passthrough2D11.hlsl122
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Passthrough3D11.hlsl146
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/ResolveDepthStencil.hlsl56
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Swizzle11.hlsl99
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dms11ps.h155
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_data.json523
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_map.json78
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table.cpp35
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table.h105
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp1938
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_utils.h85
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.cpp217
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.h53
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.cpp208
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h90
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.cpp297
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h136
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.cpp126
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h51
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.cpp359
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h93
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp829
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.h153
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp139
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.h63
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Context9.cpp303
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Context9.h151
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.cpp36
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h29
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.cpp91
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.h38
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp411
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h63
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Image9.cpp920
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Image9.h102
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp168
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.h49
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/NativeWindow9.cpp39
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/NativeWindow9.h35
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Query9.cpp188
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Query9.h48
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.cpp163
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.h98
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp3310
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.h543
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderCache.h106
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.cpp47
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.h35
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.cpp945
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.h209
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp467
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.h81
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp647
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h154
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexArray9.h46
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp169
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.h53
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp257
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h65
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/formatutils9.cpp652
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/formatutils9.h94
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp671
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.h95
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/shaders/Blit.ps67
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/shaders/Blit.vs29
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/vertexconversion.h200
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/formatutilsD3D.h38
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/driver_utils.cpp120
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/driver_utils.h73
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/load_functions_data.json602
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/load_functions_table.h22
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/load_functions_table_autogen.cpp2459
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/renderer_utils.cpp549
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/renderer_utils.h254
-rw-r--r--src/3rdparty/angle/src/libANGLE/signal_utils.h187
-rw-r--r--src/3rdparty/angle/src/libANGLE/validationEGL.cpp2501
-rw-r--r--src/3rdparty/angle/src/libANGLE/validationEGL.h182
-rw-r--r--src/3rdparty/angle/src/libANGLE/validationES.cpp5828
-rw-r--r--src/3rdparty/angle/src/libANGLE/validationES.h601
-rw-r--r--src/3rdparty/angle/src/libANGLE/validationES2.cpp6351
-rw-r--r--src/3rdparty/angle/src/libANGLE/validationES2.h687
-rw-r--r--src/3rdparty/angle/src/libANGLE/validationES3.cpp3702
-rw-r--r--src/3rdparty/angle/src/libANGLE/validationES3.h614
-rw-r--r--src/3rdparty/angle/src/libANGLE/validationES31.cpp1786
-rw-r--r--src/3rdparty/angle/src/libANGLE/validationES31.h325
358 files changed, 0 insertions, 146543 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/AttributeMap.cpp b/src/3rdparty/angle/src/libANGLE/AttributeMap.cpp
deleted file mode 100644
index e10d3add7c..0000000000
--- a/src/3rdparty/angle/src/libANGLE/AttributeMap.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-#include "libANGLE/AttributeMap.h"
-
-#include "common/debug.h"
-
-namespace egl
-{
-
-AttributeMap::AttributeMap()
-{
-}
-
-AttributeMap::AttributeMap(const AttributeMap &other) = default;
-
-AttributeMap::~AttributeMap() = default;
-
-void AttributeMap::insert(EGLAttrib key, EGLAttrib value)
-{
- mAttributes[key] = value;
-}
-
-bool AttributeMap::contains(EGLAttrib key) const
-{
- return (mAttributes.find(key) != mAttributes.end());
-}
-
-EGLAttrib AttributeMap::get(EGLAttrib key) const
-{
- auto iter = mAttributes.find(key);
- ASSERT(iter != mAttributes.end());
- return iter->second;
-}
-
-EGLAttrib AttributeMap::get(EGLAttrib key, EGLAttrib defaultValue) const
-{
- auto iter = mAttributes.find(key);
- return (mAttributes.find(key) != mAttributes.end()) ? iter->second : defaultValue;
-}
-
-EGLint AttributeMap::getAsInt(EGLAttrib key) const
-{
- return static_cast<EGLint>(get(key));
-}
-
-EGLint AttributeMap::getAsInt(EGLAttrib key, EGLint defaultValue) const
-{
- return static_cast<EGLint>(get(key, static_cast<EGLAttrib>(defaultValue)));
-}
-
-bool AttributeMap::isEmpty() const
-{
- return mAttributes.empty();
-}
-
-std::vector<EGLint> AttributeMap::toIntVector() const
-{
- std::vector<EGLint> ret;
- for (const auto &pair : mAttributes)
- {
- ret.push_back(static_cast<EGLint>(pair.first));
- ret.push_back(static_cast<EGLint>(pair.second));
- }
- ret.push_back(EGL_NONE);
-
- return ret;
-}
-
-AttributeMap::const_iterator AttributeMap::begin() const
-{
- return mAttributes.begin();
-}
-
-AttributeMap::const_iterator AttributeMap::end() const
-{
- return mAttributes.end();
-}
-
-// static
-AttributeMap AttributeMap::CreateFromIntArray(const EGLint *attributes)
-{
- AttributeMap map;
- if (attributes)
- {
- for (const EGLint *curAttrib = attributes; curAttrib[0] != EGL_NONE; curAttrib += 2)
- {
- map.insert(static_cast<EGLAttrib>(curAttrib[0]), static_cast<EGLAttrib>(curAttrib[1]));
- }
- }
- return map;
-}
-
-// static
-AttributeMap AttributeMap::CreateFromAttribArray(const EGLAttrib *attributes)
-{
- AttributeMap map;
- if (attributes)
- {
- for (const EGLAttrib *curAttrib = attributes; curAttrib[0] != EGL_NONE; curAttrib += 2)
- {
- map.insert(curAttrib[0], curAttrib[1]);
- }
- }
- return map;
-}
-}
diff --git a/src/3rdparty/angle/src/libANGLE/AttributeMap.h b/src/3rdparty/angle/src/libANGLE/AttributeMap.h
deleted file mode 100644
index eddc1b72d0..0000000000
--- a/src/3rdparty/angle/src/libANGLE/AttributeMap.h
+++ /dev/null
@@ -1,49 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-#ifndef LIBANGLE_ATTRIBUTEMAP_H_
-#define LIBANGLE_ATTRIBUTEMAP_H_
-
-
-#include <EGL/egl.h>
-
-#include <map>
-#include <vector>
-
-namespace egl
-{
-
-class AttributeMap final
-{
- public:
- AttributeMap();
- AttributeMap(const AttributeMap &other);
- ~AttributeMap();
-
- void insert(EGLAttrib key, EGLAttrib value);
- bool contains(EGLAttrib key) const;
- EGLAttrib get(EGLAttrib key) const;
- EGLAttrib get(EGLAttrib key, EGLAttrib defaultValue) const;
- EGLint getAsInt(EGLAttrib key) const;
- EGLint getAsInt(EGLAttrib key, EGLint defaultValue) const;
- bool isEmpty() const;
- std::vector<EGLint> toIntVector() const;
-
- typedef std::map<EGLAttrib, EGLAttrib>::const_iterator const_iterator;
-
- const_iterator begin() const;
- const_iterator end() const;
-
- static AttributeMap CreateFromIntArray(const EGLint *attributes);
- static AttributeMap CreateFromAttribArray(const EGLAttrib *attributes);
-
- private:
- std::map<EGLAttrib, EGLAttrib> mAttributes;
-};
-
-}
-
-#endif // LIBANGLE_ATTRIBUTEMAP_H_
diff --git a/src/3rdparty/angle/src/libANGLE/BinaryStream.h b/src/3rdparty/angle/src/libANGLE/BinaryStream.h
deleted file mode 100644
index 3e4c0934cf..0000000000
--- a/src/3rdparty/angle/src/libANGLE/BinaryStream.h
+++ /dev/null
@@ -1,261 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// BinaryStream.h: Provides binary serialization of simple types.
-
-#ifndef LIBANGLE_BINARYSTREAM_H_
-#define LIBANGLE_BINARYSTREAM_H_
-
-#include <cstddef>
-#include <string>
-#include <vector>
-#include <stdint.h>
-
-#include "common/angleutils.h"
-#include "common/mathutil.h"
-
-namespace gl
-{
-
-class BinaryInputStream : angle::NonCopyable
-{
- public:
- BinaryInputStream(const void *data, size_t length)
- {
- mError = false;
- mOffset = 0;
- mData = static_cast<const uint8_t*>(data);
- mLength = length;
- }
-
- // readInt will generate an error for bool types
- template <class IntT>
- IntT readInt()
- {
- int value = 0;
- read(&value);
- return static_cast<IntT>(value);
- }
-
- template <class IntT>
- void readInt(IntT *outValue)
- {
- *outValue = readInt<IntT>();
- }
-
- template <class IntT, class VectorElementT>
- void readIntVector(std::vector<VectorElementT> *param)
- {
- unsigned int size = readInt<unsigned int>();
- for (unsigned int index = 0; index < size; ++index)
- {
- param->push_back(readInt<IntT>());
- }
- }
-
- bool readBool()
- {
- int value = 0;
- read(&value);
- return (value > 0);
- }
-
- void readBool(bool *outValue)
- {
- *outValue = readBool();
- }
-
- void readBytes(unsigned char outArray[], size_t count)
- {
- read<unsigned char>(outArray, count);
- }
-
- std::string readString()
- {
- std::string outString;
- readString(&outString);
- return outString;
- }
-
- void readString(std::string *v)
- {
- size_t length;
- readInt(&length);
-
- if (mError)
- {
- return;
- }
-
- angle::CheckedNumeric<size_t> checkedOffset(mOffset);
- checkedOffset += length;
-
- if (!checkedOffset.IsValid() || mOffset + length > mLength)
- {
- mError = true;
- return;
- }
-
- v->assign(reinterpret_cast<const char *>(mData) + mOffset, length);
- mOffset = checkedOffset.ValueOrDie();
- }
-
- void skip(size_t length)
- {
- angle::CheckedNumeric<size_t> checkedOffset(mOffset);
- checkedOffset += length;
-
- if (!checkedOffset.IsValid() || mOffset + length > mLength)
- {
- mError = true;
- return;
- }
-
- mOffset = checkedOffset.ValueOrDie();
- }
-
- size_t offset() const
- {
- return mOffset;
- }
-
- bool error() const
- {
- return mError;
- }
-
- bool endOfStream() const
- {
- return mOffset == mLength;
- }
-
- const uint8_t *data()
- {
- return mData;
- }
-
- private:
- bool mError;
- size_t mOffset;
- const uint8_t *mData;
- size_t mLength;
-
- template <typename T>
- void read(T *v, size_t num)
- {
- static_assert(std::is_fundamental<T>::value, "T must be a fundamental type.");
-
- angle::CheckedNumeric<size_t> checkedLength(num);
- checkedLength *= sizeof(T);
- if (!checkedLength.IsValid())
- {
- mError = true;
- return;
- }
-
- angle::CheckedNumeric<size_t> checkedOffset(mOffset);
- checkedOffset += checkedLength;
-
- if (!checkedOffset.IsValid() || checkedOffset.ValueOrDie() > mLength)
- {
- mError = true;
- return;
- }
-
- memcpy(v, mData + mOffset, checkedLength.ValueOrDie());
- mOffset = checkedOffset.ValueOrDie();
- }
-
- template <typename T>
- void read(T *v)
- {
- read(v, 1);
- }
-
-};
-
-class BinaryOutputStream : angle::NonCopyable
-{
- public:
- BinaryOutputStream();
- ~BinaryOutputStream();
-
- // writeInt also handles bool types
- template <class IntT>
- void writeInt(IntT param)
- {
- ASSERT(angle::IsValueInRangeForNumericType<int>(param));
- int intValue = static_cast<int>(param);
- write(&intValue, 1);
- }
-
- // Specialized writeInt for values that can also be exactly -1.
- template <class UintT>
- void writeIntOrNegOne(UintT param)
- {
- if (param == static_cast<UintT>(-1))
- {
- writeInt(-1);
- }
- else
- {
- writeInt(param);
- }
- }
-
- template <class IntT>
- void writeIntVector(std::vector<IntT> param)
- {
- writeInt(param.size());
- for (IntT element : param)
- {
- writeIntOrNegOne(element);
- }
- }
-
- void writeString(const std::string &v)
- {
- writeInt(v.length());
- write(v.c_str(), v.length());
- }
-
- void writeBytes(const unsigned char *bytes, size_t count)
- {
- write(bytes, count);
- }
-
- size_t length() const
- {
- return mData.size();
- }
-
- const void* data() const
- {
- return mData.size() ? &mData[0] : nullptr;
- }
-
- private:
- std::vector<char> mData;
-
- template <typename T>
- void write(const T *v, size_t num)
- {
- static_assert(std::is_fundamental<T>::value, "T must be a fundamental type.");
- const char *asBytes = reinterpret_cast<const char*>(v);
- mData.insert(mData.end(), asBytes, asBytes + num * sizeof(T));
- }
-
-};
-
-inline BinaryOutputStream::BinaryOutputStream()
-{
-}
-
-inline BinaryOutputStream::~BinaryOutputStream() = default;
-
-} // namespace gl
-
-#endif // LIBANGLE_BINARYSTREAM_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Buffer.cpp b/src/3rdparty/angle/src/libANGLE/Buffer.cpp
deleted file mode 100644
index a1ebfc1acb..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Buffer.cpp
+++ /dev/null
@@ -1,215 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Buffer.cpp: Implements the gl::Buffer class, representing storage of vertex and/or
-// index data. Implements GL buffer objects and related functionality.
-// [OpenGL ES 2.0.24] section 2.9 page 21.
-
-#include "libANGLE/Buffer.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/renderer/BufferImpl.h"
-#include "libANGLE/renderer/GLImplFactory.h"
-
-namespace gl
-{
-
-BufferState::BufferState()
- : mLabel(),
- mUsage(BufferUsage::StaticDraw),
- mSize(0),
- mAccessFlags(0),
- mAccess(GL_WRITE_ONLY_OES),
- mMapped(GL_FALSE),
- mMapPointer(nullptr),
- mMapOffset(0),
- mMapLength(0)
-{
-}
-
-BufferState::~BufferState()
-{
-}
-
-Buffer::Buffer(rx::GLImplFactory *factory, GLuint id)
- : RefCountObject(id), mImpl(factory->createBuffer(mState))
-{
-}
-
-Buffer::~Buffer()
-{
- SafeDelete(mImpl);
-}
-
-Error Buffer::onDestroy(const Context *context)
-{
- // In tests, mImpl might be null.
- if (mImpl)
- mImpl->destroy(context);
- return NoError();
-}
-
-void Buffer::setLabel(const std::string &label)
-{
- mState.mLabel = label;
-}
-
-const std::string &Buffer::getLabel() const
-{
- return mState.mLabel;
-}
-
-Error Buffer::bufferData(const Context *context,
- BufferBinding target,
- const void *data,
- GLsizeiptr size,
- BufferUsage usage)
-{
- const void *dataForImpl = data;
-
- // If we are using robust resource init, make sure the buffer starts cleared.
- // Note: the Context is checked for nullptr because of some testing code.
- // TODO(jmadill): Investigate lazier clearing.
- if (context && context->getGLState().isRobustResourceInitEnabled() && !data && size > 0)
- {
- angle::MemoryBuffer *scratchBuffer = nullptr;
- ANGLE_TRY(context->getZeroFilledBuffer(static_cast<size_t>(size), &scratchBuffer));
- dataForImpl = scratchBuffer->data();
- }
-
- ANGLE_TRY(mImpl->setData(context, target, dataForImpl, size, usage));
-
- mIndexRangeCache.clear();
- mState.mUsage = usage;
- mState.mSize = size;
-
- return NoError();
-}
-
-Error Buffer::bufferSubData(const Context *context,
- BufferBinding target,
- const void *data,
- GLsizeiptr size,
- GLintptr offset)
-{
- ANGLE_TRY(mImpl->setSubData(context, target, data, size, offset));
-
- mIndexRangeCache.invalidateRange(static_cast<unsigned int>(offset), static_cast<unsigned int>(size));
-
- return NoError();
-}
-
-Error Buffer::copyBufferSubData(const Context *context,
- Buffer *source,
- GLintptr sourceOffset,
- GLintptr destOffset,
- GLsizeiptr size)
-{
- ANGLE_TRY(
- mImpl->copySubData(context, source->getImplementation(), sourceOffset, destOffset, size));
-
- mIndexRangeCache.invalidateRange(static_cast<unsigned int>(destOffset), static_cast<unsigned int>(size));
-
- return NoError();
-}
-
-Error Buffer::map(const Context *context, GLenum access)
-{
- ASSERT(!mState.mMapped);
-
- mState.mMapPointer = nullptr;
- ANGLE_TRY(mImpl->map(context, access, &mState.mMapPointer));
-
- ASSERT(access == GL_WRITE_ONLY_OES);
-
- mState.mMapped = GL_TRUE;
- mState.mMapOffset = 0;
- mState.mMapLength = mState.mSize;
- mState.mAccess = access;
- mState.mAccessFlags = GL_MAP_WRITE_BIT;
- mIndexRangeCache.clear();
-
- return NoError();
-}
-
-Error Buffer::mapRange(const Context *context,
- GLintptr offset,
- GLsizeiptr length,
- GLbitfield access)
-{
- ASSERT(!mState.mMapped);
- ASSERT(offset + length <= mState.mSize);
-
- mState.mMapPointer = nullptr;
- ANGLE_TRY(mImpl->mapRange(context, offset, length, access, &mState.mMapPointer));
-
- mState.mMapped = GL_TRUE;
- mState.mMapOffset = static_cast<GLint64>(offset);
- mState.mMapLength = static_cast<GLint64>(length);
- mState.mAccess = GL_WRITE_ONLY_OES;
- mState.mAccessFlags = access;
-
- // The OES_mapbuffer extension states that GL_WRITE_ONLY_OES is the only valid
- // value for GL_BUFFER_ACCESS_OES because it was written against ES2. Since there is
- // no update for ES3 and the GL_READ_ONLY and GL_READ_WRITE enums don't exist for ES,
- // we cannot properly set GL_BUFFER_ACCESS_OES when glMapBufferRange is called.
-
- if ((access & GL_MAP_WRITE_BIT) > 0)
- {
- mIndexRangeCache.invalidateRange(static_cast<unsigned int>(offset), static_cast<unsigned int>(length));
- }
-
- return NoError();
-}
-
-Error Buffer::unmap(const Context *context, GLboolean *result)
-{
- ASSERT(mState.mMapped);
-
- *result = GL_FALSE;
- ANGLE_TRY(mImpl->unmap(context, result));
-
- mState.mMapped = GL_FALSE;
- mState.mMapPointer = nullptr;
- mState.mMapOffset = 0;
- mState.mMapLength = 0;
- mState.mAccess = GL_WRITE_ONLY_OES;
- mState.mAccessFlags = 0;
-
- return NoError();
-}
-
-void Buffer::onTransformFeedback()
-{
- mIndexRangeCache.clear();
-}
-
-void Buffer::onPixelUnpack()
-{
- mIndexRangeCache.clear();
-}
-
-Error Buffer::getIndexRange(const gl::Context *context,
- GLenum type,
- size_t offset,
- size_t count,
- bool primitiveRestartEnabled,
- IndexRange *outRange) const
-{
- if (mIndexRangeCache.findRange(type, offset, count, primitiveRestartEnabled, outRange))
- {
- return NoError();
- }
-
- ANGLE_TRY(
- mImpl->getIndexRange(context, type, offset, count, primitiveRestartEnabled, outRange));
-
- mIndexRangeCache.addRange(type, offset, count, primitiveRestartEnabled, *outRange);
-
- return NoError();
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/Buffer.h b/src/3rdparty/angle/src/libANGLE/Buffer.h
deleted file mode 100644
index 86d4a9fd6f..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Buffer.h
+++ /dev/null
@@ -1,123 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Buffer.h: Defines the gl::Buffer class, representing storage of vertex and/or
-// index data. Implements GL buffer objects and related functionality.
-// [OpenGL ES 2.0.24] section 2.9 page 21.
-
-#ifndef LIBANGLE_BUFFER_H_
-#define LIBANGLE_BUFFER_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/Debug.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/IndexRangeCache.h"
-#include "libANGLE/PackedGLEnums.h"
-#include "libANGLE/RefCountObject.h"
-
-namespace rx
-{
-class BufferImpl;
-class GLImplFactory;
-};
-
-namespace gl
-{
-class Buffer;
-class Context;
-
-class BufferState final : angle::NonCopyable
-{
- public:
- BufferState();
- ~BufferState();
-
- const std::string &getLabel();
-
- BufferUsage getUsage() const { return mUsage; }
- GLbitfield getAccessFlags() const { return mAccessFlags; }
- GLenum getAccess() const { return mAccess; }
- GLboolean isMapped() const { return mMapped; }
- void *getMapPointer() const { return mMapPointer; }
- GLint64 getMapOffset() const { return mMapOffset; }
- GLint64 getMapLength() const { return mMapLength; }
- GLint64 getSize() const { return mSize; }
-
- private:
- friend class Buffer;
-
- std::string mLabel;
-
- BufferUsage mUsage;
- GLint64 mSize;
- GLbitfield mAccessFlags;
- GLenum mAccess;
- GLboolean mMapped;
- void *mMapPointer;
- GLint64 mMapOffset;
- GLint64 mMapLength;
-};
-
-class Buffer final : public RefCountObject, public LabeledObject
-{
- public:
- Buffer(rx::GLImplFactory *factory, GLuint id);
- ~Buffer() override;
- Error onDestroy(const Context *context) override;
-
- void setLabel(const std::string &label) override;
- const std::string &getLabel() const override;
-
- Error bufferData(const Context *context,
- BufferBinding target,
- const void *data,
- GLsizeiptr size,
- BufferUsage usage);
- Error bufferSubData(const Context *context,
- BufferBinding target,
- const void *data,
- GLsizeiptr size,
- GLintptr offset);
- Error copyBufferSubData(const Context *context,
- Buffer *source,
- GLintptr sourceOffset,
- GLintptr destOffset,
- GLsizeiptr size);
- Error map(const Context *context, GLenum access);
- Error mapRange(const Context *context, GLintptr offset, GLsizeiptr length, GLbitfield access);
- Error unmap(const Context *context, GLboolean *result);
-
- void onTransformFeedback();
- void onPixelUnpack();
-
- Error getIndexRange(const gl::Context *context,
- GLenum type,
- size_t offset,
- size_t count,
- bool primitiveRestartEnabled,
- IndexRange *outRange) const;
-
- BufferUsage getUsage() const { return mState.mUsage; }
- GLbitfield getAccessFlags() const { return mState.mAccessFlags; }
- GLenum getAccess() const { return mState.mAccess; }
- GLboolean isMapped() const { return mState.mMapped; }
- void *getMapPointer() const { return mState.mMapPointer; }
- GLint64 getMapOffset() const { return mState.mMapOffset; }
- GLint64 getMapLength() const { return mState.mMapLength; }
- GLint64 getSize() const { return mState.mSize; }
-
- rx::BufferImpl *getImplementation() const { return mImpl; }
-
- private:
- BufferState mState;
- rx::BufferImpl *mImpl;
-
- mutable IndexRangeCache mIndexRangeCache;
-};
-
-} // namespace gl
-
-#endif // LIBANGLE_BUFFER_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Caps.cpp b/src/3rdparty/angle/src/libANGLE/Caps.cpp
deleted file mode 100644
index 44da2bbe27..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Caps.cpp
+++ /dev/null
@@ -1,1213 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-#include "libANGLE/Caps.h"
-
-#include "common/debug.h"
-#include "common/angleutils.h"
-
-#include "libANGLE/formatutils.h"
-
-#include "angle_gl.h"
-
-#include <algorithm>
-#include <sstream>
-
-static void InsertExtensionString(const std::string &extension, bool supported, std::vector<std::string> *extensionVector)
-{
- if (supported)
- {
- extensionVector->push_back(extension);
- }
-}
-
-namespace gl
-{
-
-TextureCaps::TextureCaps()
- : texturable(false),
- filterable(false),
- renderable(false),
- sampleCounts()
-{
-}
-
-TextureCaps::TextureCaps(const TextureCaps &other) = default;
-
-TextureCaps::~TextureCaps() = default;
-
-GLuint TextureCaps::getMaxSamples() const
-{
- return !sampleCounts.empty() ? *sampleCounts.rbegin() : 0;
-}
-
-GLuint TextureCaps::getNearestSamples(GLuint requestedSamples) const
-{
- if (requestedSamples == 0)
- {
- return 0;
- }
-
- for (SupportedSampleSet::const_iterator i = sampleCounts.begin(); i != sampleCounts.end(); i++)
- {
- GLuint samples = *i;
- if (samples >= requestedSamples)
- {
- return samples;
- }
- }
-
- return 0;
-}
-
-TextureCaps GenerateMinimumTextureCaps(GLenum sizedInternalFormat,
- const Version &clientVersion,
- const Extensions &extensions)
-{
- TextureCaps caps;
-
- const InternalFormat &internalFormatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
- caps.texturable = internalFormatInfo.textureSupport(clientVersion, extensions);
- caps.renderable = internalFormatInfo.renderSupport(clientVersion, extensions);
- caps.filterable = internalFormatInfo.filterSupport(clientVersion, extensions);
-
- caps.sampleCounts.insert(0);
- if (internalFormatInfo.isRequiredRenderbufferFormat(clientVersion))
- {
- if ((clientVersion.major >= 3 && clientVersion.minor >= 1) ||
- (clientVersion.major >= 3 && internalFormatInfo.componentType != GL_UNSIGNED_INT &&
- internalFormatInfo.componentType != GL_INT))
- {
- caps.sampleCounts.insert(4);
- }
- }
-
- return caps;
-}
-
-TextureCapsMap::TextureCapsMap()
-{
-}
-
-TextureCapsMap::~TextureCapsMap()
-{
-}
-
-void TextureCapsMap::insert(GLenum internalFormat, const TextureCaps &caps)
-{
- angle::Format::ID formatID = angle::Format::InternalFormatToID(internalFormat);
- get(formatID) = caps;
-}
-
-void TextureCapsMap::clear()
-{
- mFormatData.fill(TextureCaps());
-}
-
-const TextureCaps &TextureCapsMap::get(GLenum internalFormat) const
-{
- angle::Format::ID formatID = angle::Format::InternalFormatToID(internalFormat);
- return get(formatID);
-}
-
-const TextureCaps &TextureCapsMap::get(angle::Format::ID formatID) const
-{
- return mFormatData[static_cast<size_t>(formatID)];
-}
-
-TextureCaps &TextureCapsMap::get(angle::Format::ID formatID)
-{
- return mFormatData[static_cast<size_t>(formatID)];
-}
-
-void TextureCapsMap::set(angle::Format::ID formatID, const TextureCaps &caps)
-{
- get(formatID) = caps;
-}
-
-void InitMinimumTextureCapsMap(const Version &clientVersion,
- const Extensions &extensions,
- TextureCapsMap *capsMap)
-{
- for (GLenum internalFormat : GetAllSizedInternalFormats())
- {
- capsMap->insert(internalFormat,
- GenerateMinimumTextureCaps(internalFormat, clientVersion, extensions));
- }
-}
-
-Extensions::Extensions()
- : elementIndexUint(false),
- packedDepthStencil(false),
- getProgramBinary(false),
- rgb8rgba8(false),
- textureFormatBGRA8888(false),
- readFormatBGRA(false),
- pixelBufferObject(false),
- mapBuffer(false),
- mapBufferRange(false),
- colorBufferHalfFloat(false),
- textureHalfFloat(false),
- textureHalfFloatLinear(false),
- textureFloat(false),
- textureFloatLinear(false),
- textureRG(false),
- textureCompressionDXT1(false),
- textureCompressionDXT3(false),
- textureCompressionDXT5(false),
- textureCompressionS3TCsRGB(false),
- textureCompressionASTCHDR(false),
- textureCompressionASTCLDR(false),
- compressedETC1RGB8Texture(false),
- sRGB(false),
- depthTextures(false),
- depth32(false),
- textureStorage(false),
- textureNPOT(false),
- drawBuffers(false),
- textureFilterAnisotropic(false),
- maxTextureAnisotropy(0.0f),
- occlusionQueryBoolean(false),
- fence(false),
- disjointTimerQuery(false),
- queryCounterBitsTimeElapsed(0),
- queryCounterBitsTimestamp(0),
- robustness(false),
- robustBufferAccessBehavior(false),
- blendMinMax(false),
- framebufferBlit(false),
- framebufferMultisample(false),
- instancedArrays(false),
- packReverseRowOrder(false),
- standardDerivatives(false),
- shaderTextureLOD(false),
- fragDepth(false),
- multiview(false),
- maxViews(1u),
- textureUsage(false),
- translatedShaderSource(false),
- fboRenderMipmap(false),
- discardFramebuffer(false),
- debugMarker(false),
- eglImage(false),
- eglImageExternal(false),
- eglImageExternalEssl3(false),
- eglStreamConsumerExternal(false),
- unpackSubimage(false),
- packSubimage(false),
- vertexArrayObject(false),
- debug(false),
- maxDebugMessageLength(0),
- maxDebugLoggedMessages(0),
- maxDebugGroupStackDepth(0),
- maxLabelLength(0),
- noError(false),
- lossyETCDecode(false),
- bindUniformLocation(false),
- syncQuery(false),
- copyTexture(false),
- copyCompressedTexture(false),
- webglCompatibility(false),
- requestExtension(false),
- bindGeneratesResource(false),
- robustClientMemory(false),
- textureSRGBDecode(false),
- sRGBWriteControl(false),
- colorBufferFloatRGB(false),
- colorBufferFloatRGBA(false),
- colorBufferFloat(false),
- multisampleCompatibility(false),
- framebufferMixedSamples(false),
- textureNorm16(false),
- pathRendering(false),
- surfacelessContext(false),
- clientArrays(false),
- robustResourceInitialization(false),
- programCacheControl(false),
- textureRectangle(false),
- geometryShader(false),
- maxGeometryOutputVertices(0),
- maxGeometryShaderInvocations(0)
-{
-}
-
-std::vector<std::string> Extensions::getStrings() const
-{
- std::vector<std::string> extensionStrings;
-
- for (const auto &extensionInfo : GetExtensionInfoMap())
- {
- if (this->*(extensionInfo.second.ExtensionsMember))
- {
- extensionStrings.push_back(extensionInfo.first);
- }
- }
-
- return extensionStrings;
-}
-
-Limitations::Limitations()
- : noFrontFacingSupport(false),
- noSampleAlphaToCoverageSupport(false),
- attributeZeroRequiresZeroDivisorInEXT(false),
- noSeparateStencilRefsAndMasks(false),
- shadersRequireIndexedLoopValidation(false),
- noSimultaneousConstantColorAndAlphaBlendFunc(false)
-{
-}
-
-static bool GetFormatSupportBase(const TextureCapsMap &textureCaps,
- const GLenum *requiredFormats,
- size_t requiredFormatsSize,
- bool requiresTexturing,
- bool requiresFiltering,
- bool requiresRendering)
-{
- for (size_t i = 0; i < requiredFormatsSize; i++)
- {
- const TextureCaps &cap = textureCaps.get(requiredFormats[i]);
-
- if (requiresTexturing && !cap.texturable)
- {
- return false;
- }
-
- if (requiresFiltering && !cap.filterable)
- {
- return false;
- }
-
- if (requiresRendering && !cap.renderable)
- {
- return false;
- }
- }
-
- return true;
-}
-
-template <size_t N>
-static bool GetFormatSupport(const TextureCapsMap &textureCaps,
- const GLenum (&requiredFormats)[N],
- bool requiresTexturing,
- bool requiresFiltering,
- bool requiresRendering)
-{
- return GetFormatSupportBase(textureCaps, requiredFormats, N, requiresTexturing,
- requiresFiltering, requiresRendering);
-}
-
-// Check for GL_OES_packed_depth_stencil
-static bool DeterminePackedDepthStencilSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_DEPTH24_STENCIL8,
- };
-
- return GetFormatSupport(textureCaps, requiredFormats, false, false, true);
-}
-
-// Checks for GL_OES_rgb8_rgba8 support
-static bool DetermineRGB8AndRGBA8TextureSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_RGB8, GL_RGBA8,
- };
-
- return GetFormatSupport(textureCaps, requiredFormats, true, true, true);
-}
-
-// Checks for GL_EXT_texture_format_BGRA8888 support
-static bool DetermineBGRA8TextureSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_BGRA8_EXT,
- };
-
- return GetFormatSupport(textureCaps, requiredFormats, true, true, true);
-}
-
-// Checks for GL_OES_color_buffer_half_float support
-static bool DetermineColorBufferHalfFloatSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_RGBA16F, GL_RGB16F, GL_RG16F, GL_R16F,
- };
-
- return GetFormatSupport(textureCaps, requiredFormats, true, false, true);
-}
-
-// Checks for GL_OES_texture_half_float support
-static bool DetermineHalfFloatTextureSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_RGB16F, GL_RGBA16F,
- };
-
- return GetFormatSupport(textureCaps, requiredFormats, true, false, false);
-}
-
-// Checks for GL_OES_texture_half_float_linear support
-static bool DetermineHalfFloatTextureFilteringSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_RGB16F, GL_RGBA16F,
- };
-
- return DetermineHalfFloatTextureSupport(textureCaps) &&
- GetFormatSupport(textureCaps, requiredFormats, true, true, false);
-}
-
-// Checks for GL_OES_texture_float support
-static bool DetermineFloatTextureSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_RGB32F, GL_RGBA32F,
- };
-
- return GetFormatSupport(textureCaps, requiredFormats, true, false, false);
-}
-
-// Checks for GL_OES_texture_float_linear support
-static bool DetermineFloatTextureFilteringSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_RGB32F, GL_RGBA32F,
- };
-
- return DetermineFloatTextureSupport(textureCaps) &&
- GetFormatSupport(textureCaps, requiredFormats, true, true, false);
-}
-
-// Checks for GL_EXT_texture_rg support
-static bool DetermineRGHalfFloatTextureSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_R16F, GL_RG16F,
- };
- return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
-}
-
-static bool DetermineRGFloatTextureSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_R32F, GL_RG32F,
- };
- return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
-}
-
-static bool DetermineRGTextureSupport(const TextureCapsMap &textureCaps, bool checkHalfFloatFormats, bool checkFloatFormats)
-{
- if (checkHalfFloatFormats && !DetermineRGHalfFloatTextureSupport(textureCaps))
- {
- return false;
- }
-
- if (checkFloatFormats && !DetermineRGFloatTextureSupport(textureCaps))
- {
- return false;
- }
-
- constexpr GLenum requiredFormats[] = {
- GL_R8, GL_RG8,
- };
- return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
-}
-
-// Check for GL_EXT_texture_compression_dxt1
-static bool DetermineDXT1TextureSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
- };
-
- return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
-}
-
-// Check for GL_ANGLE_texture_compression_dxt3
-static bool DetermineDXT3TextureSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE,
- };
-
- return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
-}
-
-// Check for GL_ANGLE_texture_compression_dxt5
-static bool DetermineDXT5TextureSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE,
- };
-
- return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
-}
-
-// Check for GL_EXT_texture_compression_s3tc_srgb
-static bool DetermineS3TCsRGBTextureSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,
- GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,
- };
-
- return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
-}
-
-// Check for GL_KHR_texture_compression_astc_hdr and GL_KHR_texture_compression_astc_ldr
-static bool DetermineASTCTextureSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_COMPRESSED_RGBA_ASTC_4x4_KHR, GL_COMPRESSED_RGBA_ASTC_5x4_KHR,
- GL_COMPRESSED_RGBA_ASTC_5x5_KHR, GL_COMPRESSED_RGBA_ASTC_6x5_KHR,
- GL_COMPRESSED_RGBA_ASTC_6x6_KHR, GL_COMPRESSED_RGBA_ASTC_8x5_KHR,
- GL_COMPRESSED_RGBA_ASTC_8x6_KHR, GL_COMPRESSED_RGBA_ASTC_8x8_KHR,
- GL_COMPRESSED_RGBA_ASTC_10x5_KHR, GL_COMPRESSED_RGBA_ASTC_10x6_KHR,
- GL_COMPRESSED_RGBA_ASTC_10x8_KHR, GL_COMPRESSED_RGBA_ASTC_10x10_KHR,
- GL_COMPRESSED_RGBA_ASTC_12x10_KHR, GL_COMPRESSED_RGBA_ASTC_12x12_KHR,
- GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR,
- GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR,
- GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR,
- GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR,
- GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR,
- GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR,
- GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR,
- };
-
- return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
-}
-
-// Check for GL_ETC1_RGB8_OES
-static bool DetermineETC1RGB8TextureSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_ETC1_RGB8_OES,
- };
-
- return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
-}
-
-// Check for GL_ANGLE_texture_compression_dxt5
-static bool DetermineSRGBTextureSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFilterFormats[] = {
- GL_SRGB8, GL_SRGB8_ALPHA8,
- };
-
- constexpr GLenum requiredRenderFormats[] = {
- GL_SRGB8_ALPHA8,
- };
-
- return GetFormatSupport(textureCaps, requiredFilterFormats, true, true, false) &&
- GetFormatSupport(textureCaps, requiredRenderFormats, true, false, true);
-}
-
-// Check for GL_ANGLE_depth_texture
-static bool DetermineDepthTextureSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT32_OES, GL_DEPTH24_STENCIL8_OES,
- };
-
- return GetFormatSupport(textureCaps, requiredFormats, true, true, true);
-}
-
-// Check for GL_OES_depth32
-static bool DetermineDepth32Support(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_DEPTH_COMPONENT32_OES,
- };
-
- return GetFormatSupport(textureCaps, requiredFormats, false, false, true);
-}
-
-// Check for GL_CHROMIUM_color_buffer_float_rgb
-static bool DetermineColorBufferFloatRGBSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_RGB32F,
- };
-
- return GetFormatSupport(textureCaps, requiredFormats, true, false, true);
-}
-
-// Check for GL_CHROMIUM_color_buffer_float_rgba
-static bool DetermineColorBufferFloatRGBASupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_RGBA32F,
- };
-
- return GetFormatSupport(textureCaps, requiredFormats, true, false, true);
-}
-
-// Check for GL_EXT_color_buffer_float
-static bool DetermineColorBufferFloatSupport(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFormats[] = {
- GL_R16F, GL_RG16F, GL_RGBA16F, GL_R32F, GL_RG32F, GL_RGBA32F, GL_R11F_G11F_B10F,
- };
-
- return GetFormatSupport(textureCaps, requiredFormats, true, false, true);
-}
-
-// Check for GL_EXT_texture_norm16
-static bool DetermineTextureNorm16Support(const TextureCapsMap &textureCaps)
-{
- constexpr GLenum requiredFilterFormats[] = {
- GL_R16_EXT, GL_RG16_EXT, GL_RGB16_EXT, GL_RGBA16_EXT,
- GL_R16_SNORM_EXT, GL_RG16_SNORM_EXT, GL_RGB16_SNORM_EXT, GL_RGBA16_SNORM_EXT,
- };
-
- constexpr GLenum requiredRenderFormats[] = {
- GL_R16_EXT, GL_RG16_EXT, GL_RGBA16_EXT,
- };
-
- return GetFormatSupport(textureCaps, requiredFilterFormats, true, true, false) &&
- GetFormatSupport(textureCaps, requiredRenderFormats, true, false, true);
-}
-
-void Extensions::setTextureExtensionSupport(const TextureCapsMap &textureCaps)
-{
- packedDepthStencil = DeterminePackedDepthStencilSupport(textureCaps);
- rgb8rgba8 = DetermineRGB8AndRGBA8TextureSupport(textureCaps);
- textureFormatBGRA8888 = DetermineBGRA8TextureSupport(textureCaps);
- colorBufferHalfFloat = DetermineColorBufferHalfFloatSupport(textureCaps);
- textureHalfFloat = DetermineHalfFloatTextureSupport(textureCaps);
- textureHalfFloatLinear = DetermineHalfFloatTextureFilteringSupport(textureCaps);
- textureFloat = DetermineFloatTextureSupport(textureCaps);
- textureFloatLinear = DetermineFloatTextureFilteringSupport(textureCaps);
- textureRG = DetermineRGTextureSupport(textureCaps, textureHalfFloat, textureFloat);
- textureCompressionDXT1 = DetermineDXT1TextureSupport(textureCaps);
- textureCompressionDXT3 = DetermineDXT3TextureSupport(textureCaps);
- textureCompressionDXT5 = DetermineDXT5TextureSupport(textureCaps);
- textureCompressionS3TCsRGB = DetermineS3TCsRGBTextureSupport(textureCaps);
- textureCompressionASTCHDR = DetermineASTCTextureSupport(textureCaps);
- textureCompressionASTCLDR = textureCompressionASTCHDR;
- compressedETC1RGB8Texture = DetermineETC1RGB8TextureSupport(textureCaps);
- sRGB = DetermineSRGBTextureSupport(textureCaps);
- depthTextures = DetermineDepthTextureSupport(textureCaps);
- depth32 = DetermineDepth32Support(textureCaps);
- colorBufferFloatRGB = DetermineColorBufferFloatRGBSupport(textureCaps);
- colorBufferFloatRGBA = DetermineColorBufferFloatRGBASupport(textureCaps);
- colorBufferFloat = DetermineColorBufferFloatSupport(textureCaps);
- textureNorm16 = DetermineTextureNorm16Support(textureCaps);
-}
-
-const ExtensionInfoMap &GetExtensionInfoMap()
-{
- auto buildExtensionInfoMap = []() {
- auto enableableExtension = [](ExtensionInfo::ExtensionBool member) {
- ExtensionInfo info;
- info.Requestable = true;
- info.ExtensionsMember = member;
- return info;
- };
-
- auto esOnlyExtension = [](ExtensionInfo::ExtensionBool member) {
- ExtensionInfo info;
- info.ExtensionsMember = member;
- return info;
- };
-
- // clang-format off
- ExtensionInfoMap map;
- map["GL_OES_element_index_uint"] = enableableExtension(&Extensions::elementIndexUint);
- map["GL_OES_packed_depth_stencil"] = esOnlyExtension(&Extensions::packedDepthStencil);
- map["GL_OES_get_program_binary"] = enableableExtension(&Extensions::getProgramBinary);
- map["GL_OES_rgb8_rgba8"] = enableableExtension(&Extensions::rgb8rgba8);
- map["GL_EXT_texture_format_BGRA8888"] = enableableExtension(&Extensions::textureFormatBGRA8888);
- map["GL_EXT_read_format_bgra"] = esOnlyExtension(&Extensions::readFormatBGRA);
- map["GL_NV_pixel_buffer_object"] = enableableExtension(&Extensions::pixelBufferObject);
- map["GL_OES_mapbuffer"] = enableableExtension(&Extensions::mapBuffer);
- map["GL_EXT_map_buffer_range"] = enableableExtension(&Extensions::mapBufferRange);
- map["GL_EXT_color_buffer_half_float"] = enableableExtension(&Extensions::colorBufferHalfFloat);
- map["GL_OES_texture_half_float"] = enableableExtension(&Extensions::textureHalfFloat);
- map["GL_OES_texture_half_float_linear"] = enableableExtension(&Extensions::textureHalfFloatLinear);
- map["GL_OES_texture_float"] = enableableExtension(&Extensions::textureFloat);
- map["GL_OES_texture_float_linear"] = enableableExtension(&Extensions::textureFloatLinear);
- map["GL_EXT_texture_rg"] = enableableExtension(&Extensions::textureRG);
- map["GL_EXT_texture_compression_dxt1"] = enableableExtension(&Extensions::textureCompressionDXT1);
- map["GL_ANGLE_texture_compression_dxt3"] = enableableExtension(&Extensions::textureCompressionDXT3);
- map["GL_ANGLE_texture_compression_dxt5"] = enableableExtension(&Extensions::textureCompressionDXT5);
- map["GL_EXT_texture_compression_s3tc_srgb"] = enableableExtension(&Extensions::textureCompressionS3TCsRGB);
- map["GL_KHR_texture_compression_astc_hdr"] = enableableExtension(&Extensions::textureCompressionASTCHDR);
- map["GL_KHR_texture_compression_astc_ldr"] = enableableExtension(&Extensions::textureCompressionASTCLDR);
- map["GL_OES_compressed_ETC1_RGB8_texture"] = enableableExtension(&Extensions::compressedETC1RGB8Texture);
- map["GL_EXT_sRGB"] = enableableExtension(&Extensions::sRGB);
- map["GL_ANGLE_depth_texture"] = esOnlyExtension(&Extensions::depthTextures);
- map["GL_OES_depth32"] = esOnlyExtension(&Extensions::depth32);
- map["GL_EXT_texture_storage"] = esOnlyExtension(&Extensions::textureStorage);
- map["GL_OES_texture_npot"] = enableableExtension(&Extensions::textureNPOT);
- map["GL_EXT_draw_buffers"] = enableableExtension(&Extensions::drawBuffers);
- map["GL_EXT_texture_filter_anisotropic"] = enableableExtension(&Extensions::textureFilterAnisotropic);
- map["GL_EXT_occlusion_query_boolean"] = enableableExtension(&Extensions::occlusionQueryBoolean);
- map["GL_NV_fence"] = esOnlyExtension(&Extensions::fence);
- map["GL_EXT_disjoint_timer_query"] = enableableExtension(&Extensions::disjointTimerQuery);
- map["GL_EXT_robustness"] = esOnlyExtension(&Extensions::robustness);
- map["GL_KHR_robust_buffer_access_behavior"] = esOnlyExtension(&Extensions::robustBufferAccessBehavior);
- map["GL_EXT_blend_minmax"] = enableableExtension(&Extensions::blendMinMax);
- map["GL_ANGLE_framebuffer_blit"] = enableableExtension(&Extensions::framebufferBlit);
- map["GL_ANGLE_framebuffer_multisample"] = enableableExtension(&Extensions::framebufferMultisample);
- map["GL_ANGLE_instanced_arrays"] = enableableExtension(&Extensions::instancedArrays);
- map["GL_ANGLE_pack_reverse_row_order"] = enableableExtension(&Extensions::packReverseRowOrder);
- 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_ANGLE_texture_usage"] = enableableExtension(&Extensions::textureUsage);
- map["GL_ANGLE_translated_shader_source"] = esOnlyExtension(&Extensions::translatedShaderSource);
- map["GL_OES_fbo_render_mipmap"] = enableableExtension(&Extensions::fboRenderMipmap);
- map["GL_EXT_discard_framebuffer"] = esOnlyExtension(&Extensions::discardFramebuffer);
- map["GL_EXT_debug_marker"] = esOnlyExtension(&Extensions::debugMarker);
- map["GL_OES_EGL_image"] = esOnlyExtension(&Extensions::eglImage);
- map["GL_OES_EGL_image_external"] = esOnlyExtension(&Extensions::eglImageExternal);
- map["GL_OES_EGL_image_external_essl3"] = esOnlyExtension(&Extensions::eglImageExternalEssl3);
- map["GL_NV_EGL_stream_consumer_external"] = esOnlyExtension(&Extensions::eglStreamConsumerExternal);
- map["GL_EXT_unpack_subimage"] = enableableExtension(&Extensions::unpackSubimage);
- map["GL_NV_pack_subimage"] = enableableExtension(&Extensions::packSubimage);
- map["GL_EXT_color_buffer_float"] = enableableExtension(&Extensions::colorBufferFloat);
- map["GL_OES_vertex_array_object"] = esOnlyExtension(&Extensions::vertexArrayObject);
- map["GL_KHR_debug"] = esOnlyExtension(&Extensions::debug);
- // TODO(jmadill): Enable this when complete.
- //map["GL_KHR_no_error"] = esOnlyExtension(&Extensions::noError);
- map["GL_ANGLE_lossy_etc_decode"] = enableableExtension(&Extensions::lossyETCDecode);
- map["GL_CHROMIUM_bind_uniform_location"] = esOnlyExtension(&Extensions::bindUniformLocation);
- map["GL_CHROMIUM_sync_query"] = enableableExtension(&Extensions::syncQuery);
- map["GL_CHROMIUM_copy_texture"] = esOnlyExtension(&Extensions::copyTexture);
- map["GL_CHROMIUM_copy_compressed_texture"] = esOnlyExtension(&Extensions::copyCompressedTexture);
- map["GL_ANGLE_webgl_compatibility"] = esOnlyExtension(&Extensions::webglCompatibility);
- map["GL_ANGLE_request_extension"] = esOnlyExtension(&Extensions::requestExtension);
- map["GL_CHROMIUM_bind_generates_resource"] = esOnlyExtension(&Extensions::bindGeneratesResource);
- map["GL_ANGLE_robust_client_memory"] = esOnlyExtension(&Extensions::robustClientMemory);
- map["GL_EXT_texture_sRGB_decode"] = esOnlyExtension(&Extensions::textureSRGBDecode);
- map["GL_EXT_sRGB_write_control"] = esOnlyExtension(&Extensions::sRGBWriteControl);
- map["GL_CHROMIUM_color_buffer_float_rgb"] = enableableExtension(&Extensions::colorBufferFloatRGB);
- map["GL_CHROMIUM_color_buffer_float_rgba"] = enableableExtension(&Extensions::colorBufferFloatRGBA);
- map["GL_EXT_multisample_compatibility"] = esOnlyExtension(&Extensions::multisampleCompatibility);
- map["GL_CHROMIUM_framebuffer_mixed_samples"] = esOnlyExtension(&Extensions::framebufferMixedSamples);
- map["GL_EXT_texture_norm16"] = esOnlyExtension(&Extensions::textureNorm16);
- map["GL_CHROMIUM_path_rendering"] = esOnlyExtension(&Extensions::pathRendering);
- map["GL_OES_surfaceless_context"] = esOnlyExtension(&Extensions::surfacelessContext);
- map["GL_ANGLE_client_arrays"] = esOnlyExtension(&Extensions::clientArrays);
- map["GL_ANGLE_robust_resource_initialization"] = esOnlyExtension(&Extensions::robustResourceInitialization);
- map["GL_ANGLE_program_cache_control"] = esOnlyExtension(&Extensions::programCacheControl);
- map["GL_ANGLE_texture_rectangle"] = enableableExtension(&Extensions::textureRectangle);
- map["GL_EXT_geometry_shader"] = enableableExtension(&Extensions::geometryShader);
- // clang-format on
-
- return map;
- };
-
- static const ExtensionInfoMap extensionInfo = buildExtensionInfoMap();
- return extensionInfo;
-}
-
-TypePrecision::TypePrecision() : range({{0, 0}}), precision(0)
-{
-}
-
-TypePrecision::TypePrecision(const TypePrecision &other) = default;
-
-void TypePrecision::setIEEEFloat()
-{
- range = {{127, 127}};
- precision = 23;
-}
-
-void TypePrecision::setTwosComplementInt(unsigned int bits)
-{
- range = {{static_cast<GLint>(bits) - 1, static_cast<GLint>(bits) - 2}};
- precision = 0;
-}
-
-void TypePrecision::setSimulatedFloat(unsigned int r, unsigned int p)
-{
- range = {{static_cast<GLint>(r), static_cast<GLint>(r)}};
- precision = static_cast<GLint>(p);
-}
-
-void TypePrecision::setSimulatedInt(unsigned int r)
-{
- range = {{static_cast<GLint>(r), static_cast<GLint>(r)}};
- precision = 0;
-}
-
-void TypePrecision::get(GLint *returnRange, GLint *returnPrecision) const
-{
- std::copy(range.begin(), range.end(), returnRange);
- *returnPrecision = precision;
-}
-
-Caps::Caps()
- : maxElementIndex(0),
- max3DTextureSize(0),
- max2DTextureSize(0),
- maxRectangleTextureSize(0),
- maxArrayTextureLayers(0),
- maxLODBias(0),
- maxCubeMapTextureSize(0),
- maxRenderbufferSize(0),
- minAliasedPointSize(0),
- maxAliasedPointSize(0),
- minAliasedLineWidth(0),
- maxAliasedLineWidth(0),
-
- // Table 20.40
- maxDrawBuffers(0),
- maxFramebufferWidth(0),
- maxFramebufferHeight(0),
- maxFramebufferSamples(0),
- maxColorAttachments(0),
- maxViewportWidth(0),
- maxViewportHeight(0),
- maxSampleMaskWords(0),
- maxColorTextureSamples(0),
- maxDepthTextureSamples(0),
- maxIntegerSamples(0),
- maxServerWaitTimeout(0),
-
- // Table 20.41
- maxVertexAttribRelativeOffset(0),
- maxVertexAttribBindings(0),
- maxVertexAttribStride(0),
- maxElementsIndices(0),
- maxElementsVertices(0),
-
- // Table 20.43
- maxVertexAttributes(0),
- maxVertexUniformComponents(0),
- maxVertexUniformVectors(0),
- maxVertexUniformBlocks(0),
- maxVertexOutputComponents(0),
- maxVertexTextureImageUnits(0),
- maxVertexAtomicCounterBuffers(0),
- maxVertexAtomicCounters(0),
- maxVertexImageUniforms(0),
- maxVertexShaderStorageBlocks(0),
-
- // Table 20.44
- maxFragmentUniformComponents(0),
- maxFragmentUniformVectors(0),
- maxFragmentUniformBlocks(0),
- maxFragmentInputComponents(0),
- maxTextureImageUnits(0),
- maxFragmentAtomicCounterBuffers(0),
- maxFragmentAtomicCounters(0),
- maxFragmentImageUniforms(0),
- maxFragmentShaderStorageBlocks(0),
- minProgramTextureGatherOffset(0),
- maxProgramTextureGatherOffset(0),
- minProgramTexelOffset(0),
- maxProgramTexelOffset(0),
-
- // Table 20.45
- maxComputeWorkGroupInvocations(0),
- maxComputeUniformBlocks(0),
- maxComputeTextureImageUnits(0),
- maxComputeSharedMemorySize(0),
- maxComputeUniformComponents(0),
- maxComputeAtomicCounterBuffers(0),
- maxComputeAtomicCounters(0),
- maxComputeImageUniforms(0),
- maxCombinedComputeUniformComponents(0),
- maxComputeShaderStorageBlocks(0),
-
- // Table 20.46
- maxUniformBufferBindings(0),
- maxUniformBlockSize(0),
- uniformBufferOffsetAlignment(0),
- maxCombinedUniformBlocks(0),
- maxCombinedVertexUniformComponents(0),
- maxCombinedFragmentUniformComponents(0),
- maxVaryingComponents(0),
- maxVaryingVectors(0),
- maxCombinedTextureImageUnits(0),
- maxCombinedShaderOutputResources(0),
-
- // Table 20.47
- maxUniformLocations(0),
- maxAtomicCounterBufferBindings(0),
- maxAtomicCounterBufferSize(0),
- maxCombinedAtomicCounterBuffers(0),
- maxCombinedAtomicCounters(0),
- maxImageUnits(0),
- maxCombinedImageUniforms(0),
- maxShaderStorageBufferBindings(0),
- maxShaderStorageBlockSize(0),
- maxCombinedShaderStorageBlocks(0),
- shaderStorageBufferOffsetAlignment(0),
-
- // Table 20.48
- maxTransformFeedbackInterleavedComponents(0),
- maxTransformFeedbackSeparateAttributes(0),
- maxTransformFeedbackSeparateComponents(0),
-
- // Table 20.49
- maxSamples(0)
-{
- for (size_t i = 0; i < 3; ++i)
- {
- maxComputeWorkGroupCount[i] = 0;
- maxComputeWorkGroupSize[i] = 0;
- }
-}
-
-Caps::Caps(const Caps &other) = default;
-Caps::~Caps() = default;
-
-Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensions)
-{
- Caps caps;
-
- if (clientVersion >= Version(2, 0))
- {
- // Table 6.18
- caps.max2DTextureSize = 64;
- caps.maxCubeMapTextureSize = 16;
- caps.maxViewportWidth = caps.max2DTextureSize;
- caps.maxViewportHeight = caps.max2DTextureSize;
- caps.minAliasedPointSize = 1;
- caps.maxAliasedPointSize = 1;
- caps.minAliasedLineWidth = 1;
- caps.maxAliasedLineWidth = 1;
-
- // Table 6.19
- caps.vertexHighpFloat.setSimulatedFloat(62, 16);
- caps.vertexMediumpFloat.setSimulatedFloat(14, 10);
- caps.vertexLowpFloat.setSimulatedFloat(1, 8);
- caps.vertexHighpInt.setSimulatedInt(16);
- caps.vertexMediumpInt.setSimulatedInt(10);
- caps.vertexLowpInt.setSimulatedInt(8);
- caps.fragmentHighpFloat.setSimulatedFloat(62, 16);
- caps.fragmentMediumpFloat.setSimulatedFloat(14, 10);
- caps.fragmentLowpFloat.setSimulatedFloat(1, 8);
- caps.fragmentHighpInt.setSimulatedInt(16);
- caps.fragmentMediumpInt.setSimulatedInt(10);
- caps.fragmentLowpInt.setSimulatedInt(8);
-
- // Table 6.20
- caps.maxVertexAttributes = 8;
- caps.maxVertexUniformVectors = 128;
- caps.maxVaryingVectors = 8;
- caps.maxCombinedTextureImageUnits = 8;
- caps.maxTextureImageUnits = 8;
- caps.maxFragmentUniformVectors = 16;
- caps.maxRenderbufferSize = 1;
- }
-
- if (clientVersion >= Version(3, 0))
- {
- // Table 6.28
- caps.maxElementIndex = (1 << 24) - 1;
- caps.max3DTextureSize = 256;
- caps.max2DTextureSize = 2048;
- caps.maxArrayTextureLayers = 256;
- caps.maxLODBias = 2.0f;
- caps.maxCubeMapTextureSize = 2048;
- caps.maxRenderbufferSize = 2048;
- caps.maxDrawBuffers = 4;
- caps.maxColorAttachments = 4;
- caps.maxViewportWidth = caps.max2DTextureSize;
- caps.maxViewportHeight = caps.max2DTextureSize;
-
- // Table 6.29
- caps.compressedTextureFormats.push_back(GL_COMPRESSED_R11_EAC);
- caps.compressedTextureFormats.push_back(GL_COMPRESSED_SIGNED_R11_EAC);
- caps.compressedTextureFormats.push_back(GL_COMPRESSED_RG11_EAC);
- caps.compressedTextureFormats.push_back(GL_COMPRESSED_SIGNED_RG11_EAC);
- caps.compressedTextureFormats.push_back(GL_COMPRESSED_RGB8_ETC2);
- caps.compressedTextureFormats.push_back(GL_COMPRESSED_SRGB8_ETC2);
- caps.compressedTextureFormats.push_back(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2);
- caps.compressedTextureFormats.push_back(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2);
- caps.compressedTextureFormats.push_back(GL_COMPRESSED_RGBA8_ETC2_EAC);
- caps.compressedTextureFormats.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC);
- caps.vertexHighpFloat.setIEEEFloat();
- caps.vertexHighpInt.setTwosComplementInt(32);
- caps.vertexMediumpInt.setTwosComplementInt(16);
- caps.vertexLowpInt.setTwosComplementInt(8);
- caps.fragmentHighpFloat.setIEEEFloat();
- caps.fragmentHighpInt.setSimulatedInt(32);
- caps.fragmentMediumpInt.setTwosComplementInt(16);
- caps.fragmentLowpInt.setTwosComplementInt(8);
- caps.maxServerWaitTimeout = 0;
-
- // Table 6.31
- caps.maxVertexAttributes = 16;
- caps.maxVertexUniformComponents = 1024;
- caps.maxVertexUniformVectors = 256;
- caps.maxVertexUniformBlocks = 12;
- caps.maxVertexOutputComponents = 64;
- caps.maxVertexTextureImageUnits = 16;
-
- // Table 6.32
- caps.maxFragmentUniformComponents = 896;
- caps.maxFragmentUniformVectors = 224;
- caps.maxFragmentUniformBlocks = 12;
- caps.maxFragmentInputComponents = 60;
- caps.maxTextureImageUnits = 16;
- caps.minProgramTexelOffset = -8;
- caps.maxProgramTexelOffset = 7;
-
- // Table 6.33
- caps.maxUniformBufferBindings = 24;
- caps.maxUniformBlockSize = 16384;
- caps.uniformBufferOffsetAlignment = 256;
- caps.maxCombinedUniformBlocks = 24;
- caps.maxCombinedVertexUniformComponents =
- caps.maxVertexUniformBlocks * (caps.maxUniformBlockSize / 4) +
- caps.maxVertexUniformComponents;
- caps.maxCombinedFragmentUniformComponents =
- caps.maxFragmentUniformBlocks * (caps.maxUniformBlockSize / 4) +
- caps.maxFragmentUniformComponents;
- caps.maxVaryingComponents = 60;
- caps.maxVaryingVectors = 15;
- caps.maxCombinedTextureImageUnits = 32;
-
- // Table 6.34
- caps.maxTransformFeedbackInterleavedComponents = 64;
- caps.maxTransformFeedbackSeparateAttributes = 4;
- caps.maxTransformFeedbackSeparateComponents = 4;
-
- // Table 3.35
- caps.maxSamples = 4;
- }
-
- if (clientVersion >= Version(3, 1))
- {
- // Table 20.40
- caps.maxFramebufferWidth = 2048;
- caps.maxFramebufferHeight = 2048;
- caps.maxFramebufferSamples = 4;
- caps.maxSampleMaskWords = 1;
- caps.maxColorTextureSamples = 1;
- caps.maxDepthTextureSamples = 1;
- caps.maxIntegerSamples = 1;
-
- // Table 20.41
- caps.maxVertexAttribRelativeOffset = 2047;
- caps.maxVertexAttribBindings = 16;
- caps.maxVertexAttribStride = 2048;
-
- // Table 20.43
- caps.maxVertexAtomicCounterBuffers = 0;
- caps.maxVertexAtomicCounters = 0;
- caps.maxVertexImageUniforms = 0;
- caps.maxVertexShaderStorageBlocks = 0;
-
- // Table 20.44
- caps.maxFragmentUniformComponents = 1024;
- caps.maxFragmentUniformVectors = 256;
- caps.maxFragmentAtomicCounterBuffers = 0;
- caps.maxFragmentAtomicCounters = 0;
- caps.maxFragmentImageUniforms = 0;
- caps.maxFragmentShaderStorageBlocks = 0;
- caps.minProgramTextureGatherOffset = 0;
- caps.maxProgramTextureGatherOffset = 0;
-
- // Table 20.45
- caps.maxComputeWorkGroupCount = {{65535, 65535, 65535}};
- caps.maxComputeWorkGroupSize = {{128, 128, 64}};
- caps.maxComputeWorkGroupInvocations = 12;
- caps.maxComputeUniformBlocks = 12;
- caps.maxComputeTextureImageUnits = 16;
- caps.maxComputeSharedMemorySize = 16384;
- caps.maxComputeUniformComponents = 1024;
- caps.maxComputeAtomicCounterBuffers = 1;
- caps.maxComputeAtomicCounters = 8;
- caps.maxComputeImageUniforms = 4;
- caps.maxCombinedComputeUniformComponents =
- caps.maxComputeUniformBlocks * static_cast<GLuint>(caps.maxUniformBlockSize / 4) +
- caps.maxComputeUniformComponents;
- caps.maxComputeShaderStorageBlocks = 4;
-
- // Table 20.46
- caps.maxUniformBufferBindings = 36;
- caps.maxCombinedFragmentUniformComponents =
- caps.maxFragmentUniformBlocks * (caps.maxUniformBlockSize / 4) +
- caps.maxFragmentUniformComponents;
- caps.maxCombinedTextureImageUnits = 48;
- caps.maxCombinedShaderOutputResources = 4;
-
- // Table 20.47
- caps.maxUniformLocations = 1024;
- caps.maxAtomicCounterBufferBindings = 1;
- caps.maxAtomicCounterBufferSize = 32;
- caps.maxCombinedAtomicCounterBuffers = 1;
- caps.maxCombinedAtomicCounters = 8;
- caps.maxImageUnits = 4;
- caps.maxCombinedImageUniforms = 4;
- caps.maxShaderStorageBufferBindings = 4;
- caps.maxShaderStorageBlockSize = 1 << 27;
- caps.maxCombinedShaderStorageBlocks = 4;
- caps.shaderStorageBufferOffsetAlignment = 256;
- }
-
- if (extensions.textureRectangle)
- {
- caps.maxRectangleTextureSize = 64;
- }
-
- return caps;
-}
-}
-
-namespace egl
-{
-
-Caps::Caps()
- : textureNPOT(false)
-{
-}
-
-DisplayExtensions::DisplayExtensions()
- : createContextRobustness(false),
- d3dShareHandleClientBuffer(false),
- d3dTextureClientBuffer(false),
- surfaceD3DTexture2DShareHandle(false),
- querySurfacePointer(false),
- windowFixedSize(false),
- keyedMutex(false),
- surfaceOrientation(false),
- postSubBuffer(false),
- createContext(false),
- deviceQuery(false),
- image(false),
- imageBase(false),
- imagePixmap(false),
- glTexture2DImage(false),
- glTextureCubemapImage(false),
- glTexture3DImage(false),
- glRenderbufferImage(false),
- getAllProcAddresses(false),
- flexibleSurfaceCompatibility(false),
- directComposition(false),
- createContextNoError(false),
- stream(false),
- streamConsumerGLTexture(false),
- streamConsumerGLTextureYUV(false),
- streamProducerD3DTextureNV12(false),
- createContextWebGLCompatibility(false),
- createContextBindGeneratesResource(false),
- getSyncValues(false),
- swapBuffersWithDamage(false),
- pixelFormatFloat(false),
- surfacelessContext(false),
- displayTextureShareGroup(false),
- createContextClientArrays(false),
- programCacheControl(false),
- robustResourceInitialization(false)
-{
-}
-
-std::vector<std::string> DisplayExtensions::getStrings() const
-{
- std::vector<std::string> extensionStrings;
-
- // clang-format off
- // | Extension name | Supported flag | Output vector |
- InsertExtensionString("EGL_EXT_create_context_robustness", createContextRobustness, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_d3d_share_handle_client_buffer", d3dShareHandleClientBuffer, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_d3d_texture_client_buffer", d3dTextureClientBuffer, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_surface_d3d_texture_2d_share_handle", surfaceD3DTexture2DShareHandle, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_query_surface_pointer", querySurfacePointer, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_window_fixed_size", windowFixedSize, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_keyed_mutex", keyedMutex, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_surface_orientation", surfaceOrientation, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_direct_composition", directComposition, &extensionStrings);
- InsertExtensionString("EGL_NV_post_sub_buffer", postSubBuffer, &extensionStrings);
- InsertExtensionString("EGL_KHR_create_context", createContext, &extensionStrings);
- InsertExtensionString("EGL_EXT_device_query", deviceQuery, &extensionStrings);
- InsertExtensionString("EGL_KHR_image", image, &extensionStrings);
- InsertExtensionString("EGL_KHR_image_base", imageBase, &extensionStrings);
- InsertExtensionString("EGL_KHR_image_pixmap", imagePixmap, &extensionStrings);
- InsertExtensionString("EGL_KHR_gl_texture_2D_image", glTexture2DImage, &extensionStrings);
- InsertExtensionString("EGL_KHR_gl_texture_cubemap_image", glTextureCubemapImage, &extensionStrings);
- InsertExtensionString("EGL_KHR_gl_texture_3D_image", glTexture3DImage, &extensionStrings);
- InsertExtensionString("EGL_KHR_gl_renderbuffer_image", glRenderbufferImage, &extensionStrings);
- InsertExtensionString("EGL_KHR_get_all_proc_addresses", getAllProcAddresses, &extensionStrings);
- InsertExtensionString("EGL_KHR_stream", stream, &extensionStrings);
- InsertExtensionString("EGL_KHR_stream_consumer_gltexture", streamConsumerGLTexture, &extensionStrings);
- InsertExtensionString("EGL_NV_stream_consumer_gltexture_yuv", streamConsumerGLTextureYUV, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_flexible_surface_compatibility", flexibleSurfaceCompatibility, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_stream_producer_d3d_texture_nv12", streamProducerD3DTextureNV12, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_create_context_webgl_compatibility", createContextWebGLCompatibility, &extensionStrings);
- InsertExtensionString("EGL_CHROMIUM_create_context_bind_generates_resource", createContextBindGeneratesResource, &extensionStrings);
- InsertExtensionString("EGL_CHROMIUM_sync_control", getSyncValues, &extensionStrings);
- InsertExtensionString("EGL_EXT_swap_buffers_with_damage", swapBuffersWithDamage, &extensionStrings);
- InsertExtensionString("EGL_EXT_pixel_format_float", pixelFormatFloat, &extensionStrings);
- InsertExtensionString("EGL_KHR_surfaceless_context", surfacelessContext, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_display_texture_share_group", displayTextureShareGroup, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_create_context_client_arrays", createContextClientArrays, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_program_cache_control", programCacheControl, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_robust_resource_initialization", robustResourceInitialization, &extensionStrings);
- // TODO(jmadill): Enable this when complete.
- //InsertExtensionString("KHR_create_context_no_error", createContextNoError, &extensionStrings);
- // clang-format on
-
- return extensionStrings;
-}
-
-DeviceExtensions::DeviceExtensions()
- : deviceD3D(false)
-{
-}
-
-std::vector<std::string> DeviceExtensions::getStrings() const
-{
- std::vector<std::string> extensionStrings;
-
- // | Extension name | Supported flag | Output vector |
- InsertExtensionString("EGL_ANGLE_device_d3d", deviceD3D, &extensionStrings);
-
- return extensionStrings;
-}
-
-ClientExtensions::ClientExtensions()
- : clientExtensions(false),
- platformBase(false),
- platformDevice(false),
- platformANGLE(false),
- platformANGLED3D(false),
- platformANGLEOpenGL(false),
- platformANGLEVulkan(false),
- deviceCreation(false),
- deviceCreationD3D11(false),
- x11Visual(false),
- experimentalPresentPath(false),
- clientGetAllProcAddresses(false)
-{
-}
-
-ClientExtensions::ClientExtensions(const ClientExtensions &other) = default;
-
-std::vector<std::string> ClientExtensions::getStrings() const
-{
- std::vector<std::string> extensionStrings;
-
- // clang-format off
- // | Extension name | Supported flag | Output vector |
- InsertExtensionString("EGL_EXT_client_extensions", clientExtensions, &extensionStrings);
- InsertExtensionString("EGL_EXT_platform_base", platformBase, &extensionStrings);
- InsertExtensionString("EGL_EXT_platform_device", platformDevice, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_platform_angle", platformANGLE, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_platform_angle_d3d", platformANGLED3D, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_platform_angle_opengl", platformANGLEOpenGL, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_platform_angle_null", platformANGLENULL, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_platform_angle_vulkan", platformANGLEVulkan, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_device_creation", deviceCreation, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_device_creation_d3d11", deviceCreationD3D11, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_x11_visual", x11Visual, &extensionStrings);
- InsertExtensionString("EGL_ANGLE_experimental_present_path", experimentalPresentPath, &extensionStrings);
- InsertExtensionString("EGL_KHR_client_get_all_proc_addresses", clientGetAllProcAddresses, &extensionStrings);
- // clang-format on
-
- return extensionStrings;
-}
-
-} // namespace egl
diff --git a/src/3rdparty/angle/src/libANGLE/Caps.h b/src/3rdparty/angle/src/libANGLE/Caps.h
deleted file mode 100644
index 64bdf97112..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Caps.h
+++ /dev/null
@@ -1,758 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-#ifndef LIBANGLE_CAPS_H_
-#define LIBANGLE_CAPS_H_
-
-#include "angle_gl.h"
-#include "libANGLE/Version.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/renderer/Format.h"
-
-#include <map>
-#include <set>
-#include <string>
-#include <vector>
-#include <array>
-
-namespace gl
-{
-
-struct Extensions;
-
-typedef std::set<GLuint> SupportedSampleSet;
-
-struct TextureCaps
-{
- TextureCaps();
- TextureCaps(const TextureCaps &other);
- ~TextureCaps();
-
- // Supports for basic texturing: glTexImage, glTexSubImage, etc
- bool texturable;
-
- // Support for linear or anisotropic filtering
- bool filterable;
-
- // Support for being used as a framebuffer attachment or renderbuffer format
- bool renderable;
-
- // Set of supported sample counts, only guaranteed to be valid in ES3.
- SupportedSampleSet sampleCounts;
-
- // Get the maximum number of samples supported
- GLuint getMaxSamples() const;
-
- // Get the number of supported samples that is at least as many as requested. Returns 0 if
- // there are no sample counts available
- GLuint getNearestSamples(GLuint requestedSamples) const;
-};
-
-TextureCaps GenerateMinimumTextureCaps(GLenum internalFormat,
- const Version &clientVersion,
- const Extensions &extensions);
-
-class TextureCapsMap final : angle::NonCopyable
-{
- public:
- TextureCapsMap();
- ~TextureCapsMap();
-
- // These methods are deprecated. Please use angle::Format for new features.
- void insert(GLenum internalFormat, const TextureCaps &caps);
- const TextureCaps &get(GLenum internalFormat) const;
-
- void clear();
-
- // Prefer using angle::Format methods.
- const TextureCaps &get(angle::Format::ID formatID) const;
- void set(angle::Format::ID formatID, const TextureCaps &caps);
-
- private:
- TextureCaps &get(angle::Format::ID formatID);
-
- // Indexed by angle::Format::ID
- std::array<TextureCaps, angle::kNumANGLEFormats> mFormatData;
-};
-
-void InitMinimumTextureCapsMap(const Version &clientVersion,
- const Extensions &extensions,
- TextureCapsMap *capsMap);
-
-struct Extensions
-{
- Extensions();
-
- // Generate a vector of supported extension strings
- std::vector<std::string> getStrings() const;
-
- // Set all texture related extension support based on the supported textures.
- // Determines support for:
- // GL_OES_packed_depth_stencil
- // GL_OES_rgb8_rgba8
- // GL_EXT_texture_format_BGRA8888
- // GL_EXT_color_buffer_half_float,
- // GL_OES_texture_half_float, GL_OES_texture_half_float_linear
- // GL_OES_texture_float, GL_OES_texture_float_linear
- // GL_EXT_texture_rg
- // GL_EXT_texture_compression_dxt1, GL_ANGLE_texture_compression_dxt3,
- // GL_ANGLE_texture_compression_dxt5
- // GL_KHR_texture_compression_astc_hdr, GL_KHR_texture_compression_astc_ldr
- // GL_OES_compressed_ETC1_RGB8_texture
- // GL_EXT_sRGB
- // GL_ANGLE_depth_texture, GL_OES_depth32
- // GL_EXT_color_buffer_float
- // GL_EXT_texture_norm16
- void setTextureExtensionSupport(const TextureCapsMap &textureCaps);
-
- // ES2 Extension support
-
- // GL_OES_element_index_uint
- bool elementIndexUint;
-
- // GL_OES_packed_depth_stencil
- bool packedDepthStencil;
-
- // GL_OES_get_program_binary
- bool getProgramBinary;
-
- // GL_OES_rgb8_rgba8
- // Implies that TextureCaps for GL_RGB8 and GL_RGBA8 exist
- bool rgb8rgba8;
-
- // GL_EXT_texture_format_BGRA8888
- // Implies that TextureCaps for GL_BGRA8 exist
- bool textureFormatBGRA8888;
-
- // GL_EXT_read_format_bgra
- bool readFormatBGRA;
-
- // GL_NV_pixel_buffer_object
- bool pixelBufferObject;
-
- // GL_OES_mapbuffer and GL_EXT_map_buffer_range
- bool mapBuffer;
- bool mapBufferRange;
-
- // GL_EXT_color_buffer_half_float
- // Together with GL_OES_texture_half_float in a GLES 2.0 context, implies that half-float
- // textures are renderable.
- bool colorBufferHalfFloat;
-
- // GL_OES_texture_half_float and GL_OES_texture_half_float_linear
- // Implies that TextureCaps for GL_RGB16F, GL_RGBA16F, GL_ALPHA32F_EXT, GL_LUMINANCE32F_EXT and
- // GL_LUMINANCE_ALPHA32F_EXT exist
- bool textureHalfFloat;
- bool textureHalfFloatLinear;
-
- // GL_OES_texture_float and GL_OES_texture_float_linear
- // Implies that TextureCaps for GL_RGB32F, GL_RGBA32F, GL_ALPHA16F_EXT, GL_LUMINANCE16F_EXT and
- // GL_LUMINANCE_ALPHA16F_EXT exist
- bool textureFloat;
- bool textureFloatLinear;
-
- // GL_EXT_texture_rg
- // Implies that TextureCaps for GL_R8, GL_RG8 (and floating point R/RG texture formats if floating point extensions
- // are also present) exist
- bool textureRG;
-
- // GL_EXT_texture_compression_dxt1, GL_ANGLE_texture_compression_dxt3 and GL_ANGLE_texture_compression_dxt5
- // Implies that TextureCaps exist for GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
- // GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE and GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE
- bool textureCompressionDXT1;
- bool textureCompressionDXT3;
- bool textureCompressionDXT5;
-
- // GL_EXT_texture_compression_s3tc_srgb
- // Implies that TextureCaps exist for GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,
- // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, and
- // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
- bool textureCompressionS3TCsRGB;
-
- // GL_KHR_texture_compression_astc_hdr
- bool textureCompressionASTCHDR;
-
- // GL_KHR_texture_compression_astc_ldr
- bool textureCompressionASTCLDR;
-
- // GL_OES_compressed_ETC1_RGB8_texture
- // Implies that TextureCaps for GL_ETC1_RGB8_OES exist
- bool compressedETC1RGB8Texture;
-
- // GL_EXT_sRGB
- // Implies that TextureCaps for GL_SRGB8_ALPHA8 and GL_SRGB8 exist
- // TODO: Don't advertise this extension in ES3
- bool sRGB;
-
- // GL_ANGLE_depth_texture
- bool depthTextures;
-
- // GL_OES_depth32
- // Allows DEPTH_COMPONENT32_OES as a valid Renderbuffer format.
- bool depth32;
-
- // GL_EXT_texture_storage
- bool textureStorage;
-
- // GL_OES_texture_npot
- bool textureNPOT;
-
- // GL_EXT_draw_buffers
- bool drawBuffers;
-
- // GL_EXT_texture_filter_anisotropic
- bool textureFilterAnisotropic;
- GLfloat maxTextureAnisotropy;
-
- // GL_EXT_occlusion_query_boolean
- bool occlusionQueryBoolean;
-
- // GL_NV_fence
- bool fence;
-
- // GL_EXT_disjoint_timer_query
- bool disjointTimerQuery;
- GLuint queryCounterBitsTimeElapsed;
- GLuint queryCounterBitsTimestamp;
-
- // GL_EXT_robustness
- bool robustness;
-
- // GL_KHR_robust_buffer_access_behavior
- bool robustBufferAccessBehavior;
-
- // GL_EXT_blend_minmax
- bool blendMinMax;
-
- // GL_ANGLE_framebuffer_blit
- bool framebufferBlit;
-
- // GL_ANGLE_framebuffer_multisample
- bool framebufferMultisample;
-
- // GL_ANGLE_instanced_arrays
- bool instancedArrays;
-
- // GL_ANGLE_pack_reverse_row_order
- bool packReverseRowOrder;
-
- // GL_OES_standard_derivatives
- bool standardDerivatives;
-
- // GL_EXT_shader_texture_lod
- bool shaderTextureLOD;
-
- // GL_EXT_frag_depth
- bool fragDepth;
-
- // ANGLE_multiview
- bool multiview;
- GLuint maxViews;
-
- // GL_ANGLE_texture_usage
- bool textureUsage;
-
- // GL_ANGLE_translated_shader_source
- bool translatedShaderSource;
-
- // GL_OES_fbo_render_mipmap
- bool fboRenderMipmap;
-
- // GL_EXT_discard_framebuffer
- bool discardFramebuffer;
-
- // EXT_debug_marker
- bool debugMarker;
-
- // GL_OES_EGL_image
- bool eglImage;
-
- // GL_OES_EGL_image_external
- bool eglImageExternal;
-
- // GL_OES_EGL_image_external_essl3
- bool eglImageExternalEssl3;
-
- // NV_EGL_stream_consumer_external
- bool eglStreamConsumerExternal;
-
- // EXT_unpack_subimage
- bool unpackSubimage;
-
- // NV_pack_subimage
- bool packSubimage;
-
- // GL_OES_vertex_array_object
- bool vertexArrayObject;
-
- // GL_KHR_debug
- bool debug;
- GLuint maxDebugMessageLength;
- GLuint maxDebugLoggedMessages;
- GLuint maxDebugGroupStackDepth;
- GLuint maxLabelLength;
-
- // KHR_no_error
- bool noError;
-
- // GL_ANGLE_lossy_etc_decode
- bool lossyETCDecode;
-
- // GL_CHROMIUM_bind_uniform_location
- bool bindUniformLocation;
-
- // GL_CHROMIUM_sync_query
- bool syncQuery;
-
- // GL_CHROMIUM_copy_texture
- bool copyTexture;
-
- // GL_CHROMIUM_copy_compressed_texture
- bool copyCompressedTexture;
-
- // GL_ANGLE_webgl_compatibility
- bool webglCompatibility;
-
- // GL_ANGLE_request_extension
- bool requestExtension;
-
- // GL_CHROMIUM_bind_generates_resource
- bool bindGeneratesResource;
-
- // GL_ANGLE_robust_client_memory
- bool robustClientMemory;
-
- // GL_EXT_texture_sRGB_decode
- bool textureSRGBDecode;
-
- // GL_EXT_sRGB_write_control
- bool sRGBWriteControl;
-
- // GL_CHROMIUM_color_buffer_float_rgb
- bool colorBufferFloatRGB;
-
- // GL_CHROMIUM_color_buffer_float_rgba
- bool colorBufferFloatRGBA;
-
- // ES3 Extension support
-
- // GL_EXT_color_buffer_float
- bool colorBufferFloat;
-
- // GL_EXT_multisample_compatibility.
- // written against ES 3.1 but can apply to earlier versions.
- bool multisampleCompatibility;
-
- // GL_CHROMIUM_framebuffer_mixed_samples
- bool framebufferMixedSamples;
-
- // GL_EXT_texture_norm16
- // written against ES 3.1 but can apply to ES 3.0 as well.
- bool textureNorm16;
-
- // GL_CHROMIUM_path_rendering
- bool pathRendering;
-
- // GL_OES_surfaceless_context
- bool surfacelessContext;
-
- // GL_ANGLE_client_arrays
- bool clientArrays;
-
- // GL_ANGLE_robust_resource_initialization
- bool robustResourceInitialization;
-
- // GL_ANGLE_program_cache_control
- bool programCacheControl;
-
- // GL_ANGLE_texture_rectangle
- bool textureRectangle;
-
- // GL_EXT_geometry_shader
- bool geometryShader;
- // GL_EXT_geometry_shader (May 31, 2016) Table 20.43gs: Implementation dependent geometry shader
- // limits
- // TODO(jiawei.shao@intel.com): add all implementation dependent geometry shader limits.
- GLuint maxGeometryOutputVertices;
- GLuint maxGeometryShaderInvocations;
-};
-
-struct ExtensionInfo
-{
- // If this extension can be enabled with glRequestExtension (GL_ANGLE_request_extension)
- bool Requestable = false;
-
- // Pointer to a boolean member of the Extensions struct
- typedef bool(Extensions::*ExtensionBool);
- ExtensionBool ExtensionsMember = nullptr;
-};
-
-using ExtensionInfoMap = std::map<std::string, ExtensionInfo>;
-const ExtensionInfoMap &GetExtensionInfoMap();
-
-struct Limitations
-{
- Limitations();
-
- // Renderer doesn't support gl_FrontFacing in fragment shaders
- bool noFrontFacingSupport;
-
- // Renderer doesn't support GL_SAMPLE_ALPHA_TO_COVERAGE
- bool noSampleAlphaToCoverageSupport;
-
- // In glVertexAttribDivisorANGLE, attribute zero must have a zero divisor
- bool attributeZeroRequiresZeroDivisorInEXT;
-
- // Unable to support different values for front and back faces for stencil refs and masks
- bool noSeparateStencilRefsAndMasks;
-
- // Renderer doesn't support non-constant indexing loops in fragment shader
- bool shadersRequireIndexedLoopValidation;
-
- // Renderer doesn't support Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA
- // and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR blend functions.
- bool noSimultaneousConstantColorAndAlphaBlendFunc;
-};
-
-struct TypePrecision
-{
- TypePrecision();
- TypePrecision(const TypePrecision &other);
-
- void setIEEEFloat();
- void setTwosComplementInt(unsigned int bits);
- void setSimulatedFloat(unsigned int range, unsigned int precision);
- void setSimulatedInt(unsigned int range);
-
- void get(GLint *returnRange, GLint *returnPrecision) const;
-
- std::array<GLint, 2> range;
- GLint precision;
-};
-
-struct Caps
-{
- Caps();
- Caps(const Caps &other);
- ~Caps();
-
- // ES 3.1 (April 29, 2015) 20.39: implementation dependent values
- GLuint64 maxElementIndex;
- GLuint max3DTextureSize;
- GLuint max2DTextureSize;
- GLuint maxRectangleTextureSize;
- GLuint maxArrayTextureLayers;
- GLfloat maxLODBias;
- GLuint maxCubeMapTextureSize;
- GLuint maxRenderbufferSize;
- GLfloat minAliasedPointSize;
- GLfloat maxAliasedPointSize;
- GLfloat minAliasedLineWidth;
- GLfloat maxAliasedLineWidth;
-
- // ES 3.1 (April 29, 2015) 20.40: implementation dependent values (cont.)
- GLuint maxDrawBuffers;
- GLuint maxFramebufferWidth;
- GLuint maxFramebufferHeight;
- GLuint maxFramebufferSamples;
- GLuint maxColorAttachments;
- GLuint maxViewportWidth;
- GLuint maxViewportHeight;
- GLuint maxSampleMaskWords;
- GLuint maxColorTextureSamples;
- GLuint maxDepthTextureSamples;
- GLuint maxIntegerSamples;
- GLuint64 maxServerWaitTimeout;
-
- // ES 3.1 (April 29, 2015) Table 20.41: Implementation dependent values (cont.)
- GLint maxVertexAttribRelativeOffset;
- GLuint maxVertexAttribBindings;
- GLint maxVertexAttribStride;
- GLuint maxElementsIndices;
- GLuint maxElementsVertices;
- std::vector<GLenum> compressedTextureFormats;
- std::vector<GLenum> programBinaryFormats;
- std::vector<GLenum> shaderBinaryFormats;
- TypePrecision vertexHighpFloat;
- TypePrecision vertexMediumpFloat;
- TypePrecision vertexLowpFloat;
- TypePrecision vertexHighpInt;
- TypePrecision vertexMediumpInt;
- TypePrecision vertexLowpInt;
- TypePrecision fragmentHighpFloat;
- TypePrecision fragmentMediumpFloat;
- TypePrecision fragmentLowpFloat;
- TypePrecision fragmentHighpInt;
- TypePrecision fragmentMediumpInt;
- TypePrecision fragmentLowpInt;
-
- // ES 3.1 (April 29, 2015) Table 20.43: Implementation dependent Vertex shader limits
- GLuint maxVertexAttributes;
- GLuint maxVertexUniformComponents;
- GLuint maxVertexUniformVectors;
- GLuint maxVertexUniformBlocks;
- GLuint maxVertexOutputComponents;
- GLuint maxVertexTextureImageUnits;
- GLuint maxVertexAtomicCounterBuffers;
- GLuint maxVertexAtomicCounters;
- GLuint maxVertexImageUniforms;
- GLuint maxVertexShaderStorageBlocks;
-
- // ES 3.1 (April 29, 2015) Table 20.44: Implementation dependent Fragment shader limits
- GLuint maxFragmentUniformComponents;
- GLuint maxFragmentUniformVectors;
- GLuint maxFragmentUniformBlocks;
- GLuint maxFragmentInputComponents;
- GLuint maxTextureImageUnits;
- GLuint maxFragmentAtomicCounterBuffers;
- GLuint maxFragmentAtomicCounters;
- GLuint maxFragmentImageUniforms;
- GLuint maxFragmentShaderStorageBlocks;
- GLint minProgramTextureGatherOffset;
- GLuint maxProgramTextureGatherOffset;
- GLint minProgramTexelOffset;
- GLint maxProgramTexelOffset;
-
- // ES 3.1 (April 29, 2015) Table 20.45: implementation dependent compute shader limits
- std::array<GLuint, 3> maxComputeWorkGroupCount;
- std::array<GLuint, 3> maxComputeWorkGroupSize;
- GLuint maxComputeWorkGroupInvocations;
- GLuint maxComputeUniformBlocks;
- GLuint maxComputeTextureImageUnits;
- GLuint maxComputeSharedMemorySize;
- GLuint maxComputeUniformComponents;
- GLuint maxComputeAtomicCounterBuffers;
- GLuint maxComputeAtomicCounters;
- GLuint maxComputeImageUniforms;
- GLuint maxCombinedComputeUniformComponents;
- GLuint maxComputeShaderStorageBlocks;
-
- // ES 3.1 (April 29, 2015) Table 20.46: implementation dependent aggregate shader limits
- GLuint maxUniformBufferBindings;
- GLuint64 maxUniformBlockSize;
- GLuint uniformBufferOffsetAlignment;
- GLuint maxCombinedUniformBlocks;
- GLuint64 maxCombinedVertexUniformComponents;
- GLuint64 maxCombinedFragmentUniformComponents;
- GLuint maxVaryingComponents;
- GLuint maxVaryingVectors;
- GLuint maxCombinedTextureImageUnits;
- GLuint maxCombinedShaderOutputResources;
-
- // ES 3.1 (April 29, 2015) Table 20.47: implementation dependent aggregate shader limits (cont.)
- GLuint maxUniformLocations;
- GLuint maxAtomicCounterBufferBindings;
- GLuint maxAtomicCounterBufferSize;
- GLuint maxCombinedAtomicCounterBuffers;
- GLuint maxCombinedAtomicCounters;
- GLuint maxImageUnits;
- GLuint maxCombinedImageUniforms;
- GLuint maxShaderStorageBufferBindings;
- GLuint64 maxShaderStorageBlockSize;
- GLuint maxCombinedShaderStorageBlocks;
- GLuint shaderStorageBufferOffsetAlignment;
-
- // ES 3.1 (April 29, 2015) Table 20.48: implementation dependent transform feedback limits
- GLuint maxTransformFeedbackInterleavedComponents;
- GLuint maxTransformFeedbackSeparateAttributes;
- GLuint maxTransformFeedbackSeparateComponents;
-
- // ES 3.1 (April 29, 2015) Table 20.49: Framebuffer Dependent Values
- GLuint maxSamples;
-};
-
-Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensions);
-}
-
-namespace egl
-{
-
-struct Caps
-{
- Caps();
-
- // Support for NPOT surfaces
- bool textureNPOT;
-};
-
-struct DisplayExtensions
-{
- DisplayExtensions();
-
- // Generate a vector of supported extension strings
- std::vector<std::string> getStrings() const;
-
- // EGL_EXT_create_context_robustness
- bool createContextRobustness;
-
- // EGL_ANGLE_d3d_share_handle_client_buffer
- bool d3dShareHandleClientBuffer;
-
- // EGL_ANGLE_d3d_texture_client_buffer
- bool d3dTextureClientBuffer;
-
- // EGL_ANGLE_surface_d3d_texture_2d_share_handle
- bool surfaceD3DTexture2DShareHandle;
-
- // EGL_ANGLE_query_surface_pointer
- bool querySurfacePointer;
-
- // EGL_ANGLE_window_fixed_size
- bool windowFixedSize;
-
- // EGL_ANGLE_keyed_mutex
- bool keyedMutex;
-
- // EGL_ANGLE_surface_orientation
- bool surfaceOrientation;
-
- // EGL_NV_post_sub_buffer
- bool postSubBuffer;
-
- // EGL_KHR_create_context
- bool createContext;
-
- // EGL_EXT_device_query
- bool deviceQuery;
-
- // EGL_KHR_image
- bool image;
-
- // EGL_KHR_image_base
- bool imageBase;
-
- // EGL_KHR_image_pixmap
- bool imagePixmap;
-
- // EGL_KHR_gl_texture_2D_image
- bool glTexture2DImage;
-
- // EGL_KHR_gl_texture_cubemap_image
- bool glTextureCubemapImage;
-
- // EGL_KHR_gl_texture_3D_image
- bool glTexture3DImage;
-
- // EGL_KHR_gl_renderbuffer_image
- bool glRenderbufferImage;
-
- // EGL_KHR_get_all_proc_addresses
- bool getAllProcAddresses;
-
- // EGL_ANGLE_flexible_surface_compatibility
- bool flexibleSurfaceCompatibility;
-
- // EGL_ANGLE_direct_composition
- bool directComposition;
-
- // KHR_create_context_no_error
- bool createContextNoError;
-
- // EGL_KHR_stream
- bool stream;
-
- // EGL_KHR_stream_consumer_gltexture
- bool streamConsumerGLTexture;
-
- // EGL_NV_stream_consumer_gltexture_yuv
- bool streamConsumerGLTextureYUV;
-
- // EGL_ANGLE_stream_producer_d3d_texture_nv12
- bool streamProducerD3DTextureNV12;
-
- // EGL_ANGLE_create_context_webgl_compatibility
- bool createContextWebGLCompatibility;
-
- // EGL_CHROMIUM_create_context_bind_generates_resource
- bool createContextBindGeneratesResource;
-
- // EGL_CHROMIUM_get_sync_values
- bool getSyncValues;
-
- // EGL_EXT_swap_buffers_with_damage
- bool swapBuffersWithDamage;
-
- // EGL_EXT_pixel_format_float
- bool pixelFormatFloat;
-
- // EGL_KHR_surfaceless_context
- bool surfacelessContext;
-
- // EGL_ANGLE_display_texture_share_group
- bool displayTextureShareGroup;
-
- // EGL_ANGLE_create_context_client_arrays
- bool createContextClientArrays;
-
- // EGL_ANGLE_program_cache_control
- bool programCacheControl;
-
- // EGL_ANGLE_robust_resource_initialization
- bool robustResourceInitialization;
-};
-
-struct DeviceExtensions
-{
- DeviceExtensions();
-
- // Generate a vector of supported extension strings
- std::vector<std::string> getStrings() const;
-
- // EGL_ANGLE_device_d3d
- bool deviceD3D;
-};
-
-struct ClientExtensions
-{
- ClientExtensions();
- ClientExtensions(const ClientExtensions &other);
-
- // Generate a vector of supported extension strings
- std::vector<std::string> getStrings() const;
-
- // EGL_EXT_client_extensions
- bool clientExtensions;
-
- // EGL_EXT_platform_base
- bool platformBase;
-
- // EGL_EXT_platform_device
- bool platformDevice;
-
- // EGL_ANGLE_platform_angle
- bool platformANGLE;
-
- // EGL_ANGLE_platform_angle_d3d
- bool platformANGLED3D;
-
- // EGL_ANGLE_platform_angle_opengl
- bool platformANGLEOpenGL;
-
- // EGL_ANGLE_platform_angle_null
- bool platformANGLENULL;
-
- // EGL_ANGLE_platform_angle_vulkan
- bool platformANGLEVulkan;
-
- // EGL_ANGLE_device_creation
- bool deviceCreation;
-
- // EGL_ANGLE_device_creation_d3d11
- bool deviceCreationD3D11;
-
- // EGL_ANGLE_x11_visual
- bool x11Visual;
-
- // EGL_ANGLE_experimental_present_path
- bool experimentalPresentPath;
-
- // EGL_KHR_client_get_all_proc_addresses
- bool clientGetAllProcAddresses;
-};
-
-} // namespace egl
-
-#endif // LIBANGLE_CAPS_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Compiler.cpp b/src/3rdparty/angle/src/libANGLE/Compiler.cpp
deleted file mode 100644
index 236c7e1fc2..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Compiler.cpp
+++ /dev/null
@@ -1,221 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Compiler.cpp: implements the gl::Compiler class.
-
-#include "libANGLE/Compiler.h"
-
-#include "common/debug.h"
-#include "libANGLE/ContextState.h"
-#include "libANGLE/renderer/CompilerImpl.h"
-#include "libANGLE/renderer/GLImplFactory.h"
-
-namespace gl
-{
-
-namespace
-{
-
-// Global count of active shader compiler handles. Needed to know when to call sh::Initialize and
-// sh::Finalize.
-size_t activeCompilerHandles = 0;
-
-ShShaderSpec SelectShaderSpec(GLint majorVersion, GLint minorVersion, bool isWebGL)
-{
- if (majorVersion >= 3)
- {
- if (minorVersion == 1)
- {
- return isWebGL ? SH_WEBGL3_SPEC : SH_GLES3_1_SPEC;
- }
- else
- {
- return isWebGL ? SH_WEBGL2_SPEC : SH_GLES3_SPEC;
- }
- }
- return isWebGL ? SH_WEBGL_SPEC : SH_GLES2_SPEC;
-}
-
-} // anonymous namespace
-
-Compiler::Compiler(rx::GLImplFactory *implFactory, const ContextState &state)
- : mImplementation(implFactory->createCompiler()),
- mSpec(SelectShaderSpec(state.getClientMajorVersion(),
- state.getClientMinorVersion(),
- state.getExtensions().webglCompatibility)),
- mOutputType(mImplementation->getTranslatorOutputType()),
- mResources(),
- mFragmentCompiler(nullptr),
- mVertexCompiler(nullptr),
- mComputeCompiler(nullptr),
- mGeometryCompiler(nullptr)
-{
- ASSERT(state.getClientMajorVersion() == 2 || state.getClientMajorVersion() == 3);
-
- const gl::Caps &caps = state.getCaps();
- const gl::Extensions &extensions = state.getExtensions();
-
- sh::InitBuiltInResources(&mResources);
- mResources.MaxVertexAttribs = caps.maxVertexAttributes;
- mResources.MaxVertexUniformVectors = caps.maxVertexUniformVectors;
- mResources.MaxVaryingVectors = caps.maxVaryingVectors;
- mResources.MaxVertexTextureImageUnits = caps.maxVertexTextureImageUnits;
- mResources.MaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
- mResources.MaxTextureImageUnits = caps.maxTextureImageUnits;
- mResources.MaxFragmentUniformVectors = caps.maxFragmentUniformVectors;
- mResources.MaxDrawBuffers = caps.maxDrawBuffers;
- mResources.OES_standard_derivatives = extensions.standardDerivatives;
- mResources.EXT_draw_buffers = extensions.drawBuffers;
- mResources.EXT_shader_texture_lod = extensions.shaderTextureLOD;
- mResources.OES_EGL_image_external = extensions.eglImageExternal;
- mResources.OES_EGL_image_external_essl3 = extensions.eglImageExternalEssl3;
- mResources.NV_EGL_stream_consumer_external = extensions.eglStreamConsumerExternal;
- mResources.ARB_texture_rectangle = extensions.textureRectangle;
- // TODO: use shader precision caps to determine if high precision is supported?
- mResources.FragmentPrecisionHigh = 1;
- mResources.EXT_frag_depth = extensions.fragDepth;
-
- // OVR_multiview state
- mResources.OVR_multiview = extensions.multiview;
- mResources.MaxViewsOVR = extensions.maxViews;
-
- // GLSL ES 3.0 constants
- mResources.MaxVertexOutputVectors = caps.maxVertexOutputComponents / 4;
- mResources.MaxFragmentInputVectors = caps.maxFragmentInputComponents / 4;
- mResources.MinProgramTexelOffset = caps.minProgramTexelOffset;
- mResources.MaxProgramTexelOffset = caps.maxProgramTexelOffset;
-
- // GLSL ES 3.1 constants
- mResources.MaxProgramTextureGatherOffset = caps.maxProgramTextureGatherOffset;
- mResources.MinProgramTextureGatherOffset = caps.minProgramTextureGatherOffset;
- mResources.MaxImageUnits = caps.maxImageUnits;
- mResources.MaxVertexImageUniforms = caps.maxVertexImageUniforms;
- mResources.MaxFragmentImageUniforms = caps.maxFragmentImageUniforms;
- mResources.MaxComputeImageUniforms = caps.maxComputeImageUniforms;
- mResources.MaxCombinedImageUniforms = caps.maxCombinedImageUniforms;
- mResources.MaxCombinedShaderOutputResources = caps.maxCombinedShaderOutputResources;
- mResources.MaxUniformLocations = caps.maxUniformLocations;
-
- for (size_t index = 0u; index < 3u; ++index)
- {
- mResources.MaxComputeWorkGroupCount[index] = caps.maxComputeWorkGroupCount[index];
- mResources.MaxComputeWorkGroupSize[index] = caps.maxComputeWorkGroupSize[index];
- }
-
- mResources.MaxComputeUniformComponents = caps.maxComputeUniformComponents;
- mResources.MaxComputeTextureImageUnits = caps.maxComputeTextureImageUnits;
-
- mResources.MaxComputeAtomicCounters = caps.maxComputeAtomicCounters;
- mResources.MaxComputeAtomicCounterBuffers = caps.maxComputeAtomicCounterBuffers;
-
- mResources.MaxVertexAtomicCounters = caps.maxVertexAtomicCounters;
- mResources.MaxFragmentAtomicCounters = caps.maxFragmentAtomicCounters;
- mResources.MaxCombinedAtomicCounters = caps.maxCombinedAtomicCounters;
- mResources.MaxAtomicCounterBindings = caps.maxAtomicCounterBufferBindings;
- mResources.MaxVertexAtomicCounterBuffers = caps.maxVertexAtomicCounterBuffers;
- mResources.MaxFragmentAtomicCounterBuffers = caps.maxFragmentAtomicCounterBuffers;
- mResources.MaxCombinedAtomicCounterBuffers = caps.maxCombinedAtomicCounterBuffers;
- mResources.MaxAtomicCounterBufferSize = caps.maxAtomicCounterBufferSize;
-
- mResources.MaxUniformBufferBindings = caps.maxUniformBufferBindings;
- mResources.MaxShaderStorageBufferBindings = caps.maxShaderStorageBufferBindings;
-
- // Needed by point size clamping workaround
- mResources.MaxPointSize = caps.maxAliasedPointSize;
-
- if (state.getClientMajorVersion() == 2 && !extensions.drawBuffers)
- {
- mResources.MaxDrawBuffers = 1;
- }
-
- // Geometry Shader constants
- mResources.OES_geometry_shader = extensions.geometryShader;
- // TODO(jiawei.shao@intel.com): initialize all implementation dependent geometry shader limits.
- mResources.MaxGeometryOutputVertices = extensions.maxGeometryOutputVertices;
- mResources.MaxGeometryShaderInvocations = extensions.maxGeometryShaderInvocations;
-}
-
-Compiler::~Compiler()
-{
- if (mFragmentCompiler)
- {
- sh::Destruct(mFragmentCompiler);
- mFragmentCompiler = nullptr;
-
- ASSERT(activeCompilerHandles > 0);
- activeCompilerHandles--;
- }
-
- if (mVertexCompiler)
- {
- sh::Destruct(mVertexCompiler);
- mVertexCompiler = nullptr;
-
- ASSERT(activeCompilerHandles > 0);
- activeCompilerHandles--;
- }
-
- if (mComputeCompiler)
- {
- sh::Destruct(mComputeCompiler);
- mComputeCompiler = nullptr;
-
- ASSERT(activeCompilerHandles > 0);
- activeCompilerHandles--;
- }
-
- if (activeCompilerHandles == 0)
- {
- sh::Finalize();
- }
-
- ANGLE_SWALLOW_ERR(mImplementation->release());
-}
-
-ShHandle Compiler::getCompilerHandle(GLenum type)
-{
- ShHandle *compiler = nullptr;
- switch (type)
- {
- case GL_VERTEX_SHADER:
- compiler = &mVertexCompiler;
- break;
-
- case GL_FRAGMENT_SHADER:
- compiler = &mFragmentCompiler;
- break;
- case GL_COMPUTE_SHADER:
- compiler = &mComputeCompiler;
- break;
- case GL_GEOMETRY_SHADER_EXT:
- compiler = &mGeometryCompiler;
- break;
- default:
- UNREACHABLE();
- return nullptr;
- }
-
- if (!(*compiler))
- {
- if (activeCompilerHandles == 0)
- {
- sh::Initialize();
- }
-
- *compiler = sh::ConstructCompiler(type, mSpec, mOutputType, &mResources);
- ASSERT(*compiler);
- activeCompilerHandles++;
- }
-
- return *compiler;
-}
-
-const std::string &Compiler::getBuiltinResourcesString(GLenum type)
-{
- return sh::GetBuiltInResourcesString(getCompilerHandle(type));
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/Compiler.h b/src/3rdparty/angle/src/libANGLE/Compiler.h
deleted file mode 100644
index b7f7e9f31b..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Compiler.h
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Compiler.h: Defines the gl::Compiler class, abstracting the ESSL compiler
-// that a GL context holds.
-
-#ifndef LIBANGLE_COMPILER_H_
-#define LIBANGLE_COMPILER_H_
-
-#include "GLSLANG/ShaderLang.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/RefCountObject.h"
-
-namespace rx
-{
-class CompilerImpl;
-class GLImplFactory;
-}
-
-namespace gl
-{
-class ContextState;
-
-class Compiler final : public RefCountObjectNoID
-{
- public:
- Compiler(rx::GLImplFactory *implFactory, const ContextState &data);
-
- ShHandle getCompilerHandle(GLenum type);
- ShShaderOutput getShaderOutputType() const { return mOutputType; }
- const std::string &getBuiltinResourcesString(GLenum type);
-
- private:
- ~Compiler() override;
- std::unique_ptr<rx::CompilerImpl> mImplementation;
- ShShaderSpec mSpec;
- ShShaderOutput mOutputType;
- ShBuiltInResources mResources;
-
- ShHandle mFragmentCompiler;
- ShHandle mVertexCompiler;
- ShHandle mComputeCompiler;
- ShHandle mGeometryCompiler;
-};
-
-} // namespace gl
-
-#endif // LIBANGLE_COMPILER_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Config.cpp b/src/3rdparty/angle/src/libANGLE/Config.cpp
deleted file mode 100644
index 172c312ae0..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Config.cpp
+++ /dev/null
@@ -1,309 +0,0 @@
-//
-// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Config.cpp: Implements the egl::Config class, describing the format, type
-// and size for an egl::Surface. Implements EGLConfig and related functionality.
-// [EGL 1.5] section 3.4 page 19.
-
-#include "libANGLE/Config.h"
-#include "libANGLE/AttributeMap.h"
-
-#include <algorithm>
-#include <vector>
-
-#include "angle_gl.h"
-#include <EGL/eglext.h>
-
-#include "common/debug.h"
-
-namespace egl
-{
-
-Config::Config()
- : renderTargetFormat(GL_NONE),
- depthStencilFormat(GL_NONE),
- bufferSize(0),
- redSize(0),
- greenSize(0),
- blueSize(0),
- luminanceSize(0),
- alphaSize(0),
- alphaMaskSize(0),
- bindToTextureRGB(EGL_FALSE),
- bindToTextureRGBA(EGL_FALSE),
- colorBufferType(EGL_NONE),
- configCaveat(EGL_NONE),
- configID(0),
- conformant(0),
- depthSize(0),
- level(0),
- matchNativePixmap(EGL_FALSE),
- maxPBufferWidth(0),
- maxPBufferHeight(0),
- maxPBufferPixels(0),
- maxSwapInterval(0),
- minSwapInterval(0),
- nativeRenderable(EGL_FALSE),
- nativeVisualID(0),
- nativeVisualType(0),
- renderableType(0),
- sampleBuffers(0),
- samples(0),
- stencilSize(0),
- surfaceType(0),
- transparentType(EGL_NONE),
- transparentRedValue(0),
- transparentGreenValue(0),
- transparentBlueValue(0),
- optimalOrientation(0),
- colorComponentType(EGL_COLOR_COMPONENT_TYPE_FIXED_EXT)
-{
-}
-
-Config::~Config()
-{
-}
-
-Config::Config(const Config &other) = default;
-
-Config &Config::operator=(const Config &other) = default;
-
-ConfigSet::ConfigSet() = default;
-
-ConfigSet::ConfigSet(const ConfigSet &other) = default;
-
-ConfigSet &ConfigSet::operator=(const ConfigSet &other) = default;
-
-ConfigSet::~ConfigSet() = default;
-
-EGLint ConfigSet::add(const Config &config)
-{
- // Set the config's ID to a small number that starts at 1 ([EGL 1.5] section 3.4)
- EGLint id = static_cast<EGLint>(mConfigs.size()) + 1;
-
- Config copyConfig(config);
- copyConfig.configID = id;
- mConfigs.insert(std::make_pair(id, copyConfig));
-
- return id;
-}
-
-const Config &ConfigSet::get(EGLint id) const
-{
- ASSERT(mConfigs.find(id) != mConfigs.end());
- return mConfigs.find(id)->second;
-}
-
-void ConfigSet::clear()
-{
- mConfigs.clear();
-}
-
-size_t ConfigSet::size() const
-{
- return mConfigs.size();
-}
-
-bool ConfigSet::contains(const Config *config) const
-{
- for (auto i = mConfigs.begin(); i != mConfigs.end(); i++)
- {
- const Config &item = i->second;
- if (config == &item)
- {
- return true;
- }
- }
-
- return false;
-}
-
-// Function object used by STL sorting routines for ordering Configs according to [EGL 1.5] section 3.4.1.2 page 28.
-class ConfigSorter
-{
- public:
- explicit ConfigSorter(const AttributeMap &attributeMap)
- : mWantRed(false),
- mWantGreen(false),
- mWantBlue(false),
- mWantAlpha(false),
- mWantLuminance(false)
- {
- scanForWantedComponents(attributeMap);
- }
-
- bool operator()(const Config *x, const Config *y) const
- {
- return (*this)(*x, *y);
- }
-
- bool operator()(const Config &x, const Config &y) const
- {
- #define SORT(attribute) \
- if (x.attribute != y.attribute) \
- { \
- return x.attribute < y.attribute; \
- }
-
- static_assert(EGL_NONE < EGL_SLOW_CONFIG && EGL_SLOW_CONFIG < EGL_NON_CONFORMANT_CONFIG, "Unexpected EGL enum value.");
- SORT(configCaveat);
-
- static_assert(EGL_COLOR_COMPONENT_TYPE_FIXED_EXT < EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT,
- "Unexpected order of EGL enums.");
- SORT(colorComponentType);
-
- static_assert(EGL_RGB_BUFFER < EGL_LUMINANCE_BUFFER, "Unexpected EGL enum value.");
- SORT(colorBufferType);
-
- // By larger total number of color bits, only considering those that are requested to be > 0.
- EGLint xComponentsSize = wantedComponentsSize(x);
- EGLint yComponentsSize = wantedComponentsSize(y);
- if (xComponentsSize != yComponentsSize)
- {
- return xComponentsSize > yComponentsSize;
- }
-
- SORT(bufferSize);
- SORT(sampleBuffers);
- SORT(samples);
- SORT(depthSize);
- SORT(stencilSize);
- SORT(alphaMaskSize);
- SORT(nativeVisualType);
- SORT(configID);
-
- #undef SORT
-
- return false;
- }
-
- private:
-
- void scanForWantedComponents(const AttributeMap &attributeMap)
- {
- // [EGL 1.5] section 3.4.1.2 page 30
- // Sorting rule #3: by larger total number of color bits, not considering
- // components that are 0 or don't-care.
- for (auto attribIter = attributeMap.begin(); attribIter != attributeMap.end(); attribIter++)
- {
- EGLint attributeKey = attribIter->first;
- EGLint attributeValue = attribIter->second;
- if (attributeKey != 0 && attributeValue != EGL_DONT_CARE)
- {
- switch (attributeKey)
- {
- case EGL_RED_SIZE: mWantRed = true; break;
- case EGL_GREEN_SIZE: mWantGreen = true; break;
- case EGL_BLUE_SIZE: mWantBlue = true; break;
- case EGL_ALPHA_SIZE: mWantAlpha = true; break;
- case EGL_LUMINANCE_SIZE: mWantLuminance = true; break;
- }
- }
- }
- }
-
- EGLint wantedComponentsSize(const Config &config) const
- {
- EGLint total = 0;
-
- if (mWantRed) total += config.redSize;
- if (mWantGreen) total += config.greenSize;
- if (mWantBlue) total += config.blueSize;
- if (mWantAlpha) total += config.alphaSize;
- if (mWantLuminance) total += config.luminanceSize;
-
- return total;
- }
-
- bool mWantRed;
- bool mWantGreen;
- bool mWantBlue;
- bool mWantAlpha;
- bool mWantLuminance;
-};
-
-std::vector<const Config*> ConfigSet::filter(const AttributeMap &attributeMap) const
-{
- std::vector<const Config*> result;
- result.reserve(mConfigs.size());
-
- for (auto configIter = mConfigs.begin(); configIter != mConfigs.end(); configIter++)
- {
- const Config &config = configIter->second;
- bool match = true;
-
- for (auto attribIter = attributeMap.begin(); attribIter != attributeMap.end(); attribIter++)
- {
- EGLAttrib attributeKey = attribIter->first;
- EGLAttrib attributeValue = attribIter->second;
-
- if (attributeValue == EGL_DONT_CARE)
- {
- continue;
- }
-
- switch (attributeKey)
- {
- case EGL_BUFFER_SIZE: match = config.bufferSize >= attributeValue; break;
- case EGL_ALPHA_SIZE: match = config.alphaSize >= attributeValue; break;
- case EGL_BLUE_SIZE: match = config.blueSize >= attributeValue; break;
- case EGL_GREEN_SIZE: match = config.greenSize >= attributeValue; break;
- case EGL_RED_SIZE: match = config.redSize >= attributeValue; break;
- case EGL_DEPTH_SIZE: match = config.depthSize >= attributeValue; break;
- case EGL_STENCIL_SIZE: match = config.stencilSize >= attributeValue; break;
- case EGL_CONFIG_CAVEAT: match = config.configCaveat == (EGLenum)attributeValue; break;
- case EGL_CONFIG_ID: match = config.configID == attributeValue; break;
- case EGL_LEVEL: match = config.level >= attributeValue; break;
- case EGL_NATIVE_RENDERABLE: match = config.nativeRenderable == (EGLBoolean)attributeValue; break;
- case EGL_NATIVE_VISUAL_TYPE: match = config.nativeVisualType == attributeValue; break;
- case EGL_SAMPLES: match = config.samples >= attributeValue; break;
- case EGL_SAMPLE_BUFFERS: match = config.sampleBuffers >= attributeValue; break;
- case EGL_SURFACE_TYPE: match = (config.surfaceType & attributeValue) == attributeValue; break;
- case EGL_TRANSPARENT_TYPE: match = config.transparentType == (EGLenum)attributeValue; break;
- case EGL_TRANSPARENT_BLUE_VALUE: match = config.transparentBlueValue == attributeValue; break;
- case EGL_TRANSPARENT_GREEN_VALUE: match = config.transparentGreenValue == attributeValue; break;
- case EGL_TRANSPARENT_RED_VALUE: match = config.transparentRedValue == attributeValue; break;
- case EGL_BIND_TO_TEXTURE_RGB: match = config.bindToTextureRGB == (EGLBoolean)attributeValue; break;
- case EGL_BIND_TO_TEXTURE_RGBA: match = config.bindToTextureRGBA == (EGLBoolean)attributeValue; break;
- case EGL_MIN_SWAP_INTERVAL: match = config.minSwapInterval == attributeValue; break;
- case EGL_MAX_SWAP_INTERVAL: match = config.maxSwapInterval == attributeValue; break;
- case EGL_LUMINANCE_SIZE: match = config.luminanceSize >= attributeValue; break;
- case EGL_ALPHA_MASK_SIZE: match = config.alphaMaskSize >= attributeValue; break;
- case EGL_COLOR_BUFFER_TYPE: match = config.colorBufferType == (EGLenum)attributeValue; break;
- case EGL_RENDERABLE_TYPE: match = (config.renderableType & attributeValue) == attributeValue; break;
- case EGL_MATCH_NATIVE_PIXMAP: match = false; UNIMPLEMENTED(); break;
- case EGL_CONFORMANT: match = (config.conformant & attributeValue) == attributeValue; break;
- case EGL_MAX_PBUFFER_WIDTH: match = config.maxPBufferWidth >= attributeValue; break;
- case EGL_MAX_PBUFFER_HEIGHT: match = config.maxPBufferHeight >= attributeValue; break;
- case EGL_MAX_PBUFFER_PIXELS: match = config.maxPBufferPixels >= attributeValue; break;
- case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
- match = config.optimalOrientation == attributeValue;
- break;
- case EGL_COLOR_COMPONENT_TYPE_EXT:
- match = config.colorComponentType == static_cast<EGLenum>(attributeValue);
- break;
- default: UNREACHABLE();
- }
-
- if (!match)
- {
- break;
- }
- }
-
- if (match)
- {
- result.push_back(&config);
- }
- }
-
- // Sort the result
- std::sort(result.begin(), result.end(), ConfigSorter(attributeMap));
-
- return result;
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/Config.h b/src/3rdparty/angle/src/libANGLE/Config.h
deleted file mode 100644
index f2fbe8b95a..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Config.h
+++ /dev/null
@@ -1,101 +0,0 @@
-//
-// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Config.h: Defines the egl::Config class, describing the format, type
-// and size for an egl::Surface. Implements EGLConfig and related functionality.
-// [EGL 1.5] section 3.4 page 19.
-
-#ifndef INCLUDE_CONFIG_H_
-#define INCLUDE_CONFIG_H_
-
-#include "libANGLE/AttributeMap.h"
-
-#include "common/angleutils.h"
-
-#include <EGL/egl.h>
-#include <GLES2/gl2.h>
-
-#include <map>
-#include <vector>
-
-namespace egl
-{
-
-struct Config
-{
- Config();
- ~Config();
- Config(const Config &other);
- Config &operator=(const Config &other);
-
- GLenum renderTargetFormat; // TODO(geofflang): remove this
- GLenum depthStencilFormat; // TODO(geofflang): remove this
-
- EGLint bufferSize; // Depth of the color buffer
- EGLint redSize; // Bits of Red in the color buffer
- EGLint greenSize; // Bits of Green in the color buffer
- EGLint blueSize; // Bits of Blue in the color buffer
- EGLint luminanceSize; // Bits of Luminance in the color buffer
- EGLint alphaSize; // Bits of Alpha in the color buffer
- EGLint alphaMaskSize; // Bits of Alpha Mask in the mask buffer
- EGLBoolean bindToTextureRGB; // True if bindable to RGB textures.
- EGLBoolean bindToTextureRGBA; // True if bindable to RGBA textures.
- EGLenum colorBufferType; // Color buffer type
- EGLenum configCaveat; // Any caveats for the configuration
- EGLint configID; // Unique EGLConfig identifier
- EGLint conformant; // Whether contexts created with this config are conformant
- EGLint depthSize; // Bits of Z in the depth buffer
- EGLint level; // Frame buffer level
- EGLBoolean matchNativePixmap; // Match the native pixmap format
- EGLint maxPBufferWidth; // Maximum width of pbuffer
- EGLint maxPBufferHeight; // Maximum height of pbuffer
- EGLint maxPBufferPixels; // Maximum size of pbuffer
- EGLint maxSwapInterval; // Maximum swap interval
- EGLint minSwapInterval; // Minimum swap interval
- EGLBoolean nativeRenderable; // EGL_TRUE if native rendering APIs can render to surface
- EGLint nativeVisualID; // Handle of corresponding native visual
- EGLint nativeVisualType; // Native visual type of the associated visual
- EGLint renderableType; // Which client rendering APIs are supported.
- EGLint sampleBuffers; // Number of multisample buffers
- EGLint samples; // Number of samples per pixel
- EGLint stencilSize; // Bits of Stencil in the stencil buffer
- EGLint surfaceType; // Which types of EGL surfaces are supported.
- EGLenum transparentType; // Type of transparency supported
- EGLint transparentRedValue; // Transparent red value
- EGLint transparentGreenValue; // Transparent green value
- EGLint transparentBlueValue; // Transparent blue value
- EGLint optimalOrientation; // Optimal window surface orientation
- EGLenum colorComponentType; // Color component type
-};
-
-class ConfigSet
-{
- public:
- ConfigSet();
- ConfigSet(const ConfigSet &other);
- ~ConfigSet();
- ConfigSet &operator=(const ConfigSet &other);
-
- EGLint add(const Config &config);
- const Config &get(EGLint id) const;
-
- void clear();
-
- size_t size() const;
-
- bool contains(const Config *config) const;
-
- // Filter configurations based on the table in [EGL 1.5] section 3.4.1.2 page 29
- std::vector<const Config*> filter(const AttributeMap &attributeMap) const;
-
- private:
- typedef std::map<EGLint, Config> ConfigMap;
- ConfigMap mConfigs;
-};
-
-}
-
-#endif // INCLUDE_CONFIG_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Constants.h b/src/3rdparty/angle/src/libANGLE/Constants.h
deleted file mode 100644
index 2fe921af38..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Constants.h
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Contants.h: Defines some implementation specific and gl constants
-
-#ifndef LIBANGLE_CONSTANTS_H_
-#define LIBANGLE_CONSTANTS_H_
-
-#include "common/platform.h"
-
-namespace gl
-{
-
-// The binary cache is currently left disable by default, and the application can enable it.
-const size_t kDefaultMaxProgramCacheMemoryBytes = 0;
-
-enum
-{
- // Implementation upper limits, real maximums depend on the hardware
- MAX_SAMPLE_MASK_WORDS = 2,
-
- MAX_VERTEX_ATTRIBS = 16,
- MAX_VERTEX_ATTRIB_BINDINGS = 16,
-
- // Implementation upper limits, real maximums depend on the hardware
- IMPLEMENTATION_MAX_VARYING_VECTORS = 32,
- IMPLEMENTATION_MAX_DRAW_BUFFERS = 8,
- IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS =
- IMPLEMENTATION_MAX_DRAW_BUFFERS + 2, // 2 extra for depth and/or stencil buffers
-
- IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS = 16,
- IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS = 16,
- IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS =
- IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS +
- IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS,
-
- IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS = 4,
-
- // Maximum number of views which are supported by the implementation of ANGLE_multiview.
- IMPLEMENTATION_ANGLE_MULTIVIEW_MAX_VIEWS = 4,
-
- // These are the maximums the implementation can support
- // The actual GL caps are limited by the device caps
- // and should be queried from the Context
- IMPLEMENTATION_MAX_2D_TEXTURE_SIZE = 16384,
- IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 16384,
- IMPLEMENTATION_MAX_3D_TEXTURE_SIZE = 2048,
- IMPLEMENTATION_MAX_2D_ARRAY_TEXTURE_LAYERS = 2048,
-
- // 1+log2 of max of MAX_*_TEXTURE_SIZE
- IMPLEMENTATION_MAX_TEXTURE_LEVELS = 15,
-
- // Limit active textures so we can use fast bitsets.
- IMPLEMENTATION_MAX_SHADER_TEXTURES = 32,
- IMPLEMENTATION_MAX_ACTIVE_TEXTURES = IMPLEMENTATION_MAX_SHADER_TEXTURES * 2,
-};
-}
-
-#endif // LIBANGLE_CONSTANTS_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Context.cpp b/src/3rdparty/angle/src/libANGLE/Context.cpp
deleted file mode 100644
index f638beda58..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Context.cpp
+++ /dev/null
@@ -1,5558 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Context.cpp: Implements the gl::Context class, managing all GL state and performing
-// rendering operations. It is the GLES2 specific implementation of EGLContext.
-
-#include "libANGLE/Context.h"
-
-#include <string.h>
-#include <iterator>
-#include <sstream>
-#include <vector>
-
-#include "common/matrix_utils.h"
-#include "common/platform.h"
-#include "common/utilities.h"
-#include "common/version.h"
-#include "libANGLE/Buffer.h"
-#include "libANGLE/Compiler.h"
-#include "libANGLE/Display.h"
-#include "libANGLE/Fence.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/Path.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/ProgramPipeline.h"
-#include "libANGLE/Query.h"
-#include "libANGLE/Renderbuffer.h"
-#include "libANGLE/ResourceManager.h"
-#include "libANGLE/Sampler.h"
-#include "libANGLE/Surface.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/TransformFeedback.h"
-#include "libANGLE/VertexArray.h"
-#include "libANGLE/Workarounds.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/queryconversions.h"
-#include "libANGLE/queryutils.h"
-#include "libANGLE/renderer/ContextImpl.h"
-#include "libANGLE/renderer/EGLImplFactory.h"
-#include "libANGLE/renderer/Format.h"
-#include "libANGLE/validationES.h"
-
-namespace
-{
-
-#define ANGLE_HANDLE_ERR(X) \
- handleError(X); \
- return;
-#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
-
-template <typename T>
-std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
- GLsizei numPaths,
- const void *paths,
- GLuint pathBase)
-{
- std::vector<gl::Path *> ret;
- ret.reserve(numPaths);
-
- const auto *nameArray = static_cast<const T *>(paths);
-
- for (GLsizei i = 0; i < numPaths; ++i)
- {
- const GLuint pathName = nameArray[i] + pathBase;
-
- ret.push_back(resourceManager.getPath(pathName));
- }
-
- return ret;
-}
-
-std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
- GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase)
-{
- switch (pathNameType)
- {
- case GL_UNSIGNED_BYTE:
- return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
-
- case GL_BYTE:
- return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
-
- case GL_UNSIGNED_SHORT:
- return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
-
- case GL_SHORT:
- return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
-
- case GL_UNSIGNED_INT:
- return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
-
- case GL_INT:
- return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
- }
-
- UNREACHABLE();
- return std::vector<gl::Path *>();
-}
-
-template <typename T>
-gl::Error GetQueryObjectParameter(gl::Query *query, GLenum pname, T *params)
-{
- ASSERT(query != nullptr);
-
- switch (pname)
- {
- case GL_QUERY_RESULT_EXT:
- return query->getResult(params);
- case GL_QUERY_RESULT_AVAILABLE_EXT:
- {
- bool available;
- gl::Error error = query->isResultAvailable(&available);
- if (!error.isError())
- {
- *params = gl::CastFromStateValue<T>(pname, static_cast<GLuint>(available));
- }
- return error;
- }
- default:
- UNREACHABLE();
- return gl::InternalError() << "Unreachable Error";
- }
-}
-
-void MarkTransformFeedbackBufferUsage(gl::TransformFeedback *transformFeedback)
-{
- if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
- {
- for (size_t tfBufferIndex = 0; tfBufferIndex < transformFeedback->getIndexedBufferCount();
- tfBufferIndex++)
- {
- const gl::OffsetBindingPointer<gl::Buffer> &buffer =
- transformFeedback->getIndexedBuffer(tfBufferIndex);
- if (buffer.get() != nullptr)
- {
- buffer->onTransformFeedback();
- }
- }
- }
-}
-
-// Attribute map queries.
-EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
-{
- return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
-}
-
-EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
-{
- return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
-}
-
-gl::Version GetClientVersion(const egl::AttributeMap &attribs)
-{
- return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
-}
-
-GLenum GetResetStrategy(const egl::AttributeMap &attribs)
-{
- EGLAttrib attrib = attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT,
- EGL_NO_RESET_NOTIFICATION);
- switch (attrib)
- {
- case EGL_NO_RESET_NOTIFICATION:
- return GL_NO_RESET_NOTIFICATION_EXT;
- case EGL_LOSE_CONTEXT_ON_RESET:
- return GL_LOSE_CONTEXT_ON_RESET_EXT;
- default:
- UNREACHABLE();
- return GL_NONE;
- }
-}
-
-bool GetRobustAccess(const egl::AttributeMap &attribs)
-{
- return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
- ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
- 0);
-}
-
-bool GetDebug(const egl::AttributeMap &attribs)
-{
- return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
- ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
-}
-
-bool GetNoError(const egl::AttributeMap &attribs)
-{
- return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
-}
-
-bool GetWebGLContext(const egl::AttributeMap &attribs)
-{
- return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
-}
-
-bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
-{
- return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
-}
-
-bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
-{
- return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
-}
-
-bool GetRobustResourceInit(const egl::AttributeMap &attribs)
-{
- return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
-}
-
-std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
-{
- std::string labelName;
- if (label != nullptr)
- {
- size_t labelLength = length < 0 ? strlen(label) : length;
- labelName = std::string(label, labelLength);
- }
- return labelName;
-}
-
-void GetObjectLabelBase(const std::string &objectLabel,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *label)
-{
- size_t writeLength = objectLabel.length();
- if (label != nullptr && bufSize > 0)
- {
- writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
- std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
- label[writeLength] = '\0';
- }
-
- if (length != nullptr)
- {
- *length = static_cast<GLsizei>(writeLength);
- }
-}
-
-template <typename CapT, typename MaxT>
-void LimitCap(CapT *cap, MaxT maximum)
-{
- *cap = std::min(*cap, static_cast<CapT>(maximum));
-}
-
-} // anonymous namespace
-
-namespace gl
-{
-
-Context::Context(rx::EGLImplFactory *implFactory,
- const egl::Config *config,
- const Context *shareContext,
- TextureManager *shareTextures,
- MemoryProgramCache *memoryProgramCache,
- const egl::AttributeMap &attribs,
- const egl::DisplayExtensions &displayExtensions)
-
- : ValidationContext(shareContext,
- shareTextures,
- GetClientVersion(attribs),
- &mGLState,
- mCaps,
- mTextureCaps,
- mExtensions,
- mLimitations,
- GetNoError(attribs)),
- mImplementation(implFactory->createContext(mState)),
- mCompiler(),
- mConfig(config),
- mClientType(EGL_OPENGL_ES_API),
- mHasBeenCurrent(false),
- mContextLost(false),
- mResetStatus(GL_NO_ERROR),
- mContextLostForced(false),
- mResetStrategy(GetResetStrategy(attribs)),
- mRobustAccess(GetRobustAccess(attribs)),
- mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
- mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
- mSurfacelessFramebuffer(nullptr),
- mWebGLContext(GetWebGLContext(attribs)),
- mMemoryProgramCache(memoryProgramCache),
- mScratchBuffer(1000u),
- mZeroFilledBuffer(1000u)
-{
- mImplementation->setMemoryProgramCache(memoryProgramCache);
-
- bool robustResourceInit = GetRobustResourceInit(attribs);
- initCaps(displayExtensions, robustResourceInit);
- initWorkarounds();
-
- mGLState.initialize(this, GetDebug(attribs), GetBindGeneratesResource(attribs),
- GetClientArraysEnabled(attribs), robustResourceInit,
- mMemoryProgramCache != nullptr);
-
- mFenceNVHandleAllocator.setBaseHandle(0);
-
- // [OpenGL ES 2.0.24] section 3.7 page 83:
- // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
- // and cube map texture state vectors respectively associated with them.
- // In order that access to these initial textures not be lost, they are treated as texture
- // objects all of whose names are 0.
-
- Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, GL_TEXTURE_2D);
- mZeroTextures[GL_TEXTURE_2D].set(this, zeroTexture2D);
-
- Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, GL_TEXTURE_CUBE_MAP);
- mZeroTextures[GL_TEXTURE_CUBE_MAP].set(this, zeroTextureCube);
-
- if (getClientVersion() >= Version(3, 0))
- {
- // TODO: These could also be enabled via extension
- Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, GL_TEXTURE_3D);
- mZeroTextures[GL_TEXTURE_3D].set(this, zeroTexture3D);
-
- Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, GL_TEXTURE_2D_ARRAY);
- mZeroTextures[GL_TEXTURE_2D_ARRAY].set(this, zeroTexture2DArray);
- }
- if (getClientVersion() >= Version(3, 1))
- {
- Texture *zeroTexture2DMultisample =
- new Texture(mImplementation.get(), 0, GL_TEXTURE_2D_MULTISAMPLE);
- mZeroTextures[GL_TEXTURE_2D_MULTISAMPLE].set(this, zeroTexture2DMultisample);
-
- for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
- {
- bindBufferRange(BufferBinding::AtomicCounter, 0, i, 0, 0);
- }
-
- for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
- {
- bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
- }
- }
-
- const Extensions &nativeExtensions = mImplementation->getNativeExtensions();
- if (nativeExtensions.textureRectangle)
- {
- Texture *zeroTextureRectangle =
- new Texture(mImplementation.get(), 0, GL_TEXTURE_RECTANGLE_ANGLE);
- mZeroTextures[GL_TEXTURE_RECTANGLE_ANGLE].set(this, zeroTextureRectangle);
- }
-
- if (nativeExtensions.eglImageExternal || nativeExtensions.eglStreamConsumerExternal)
- {
- Texture *zeroTextureExternal =
- new Texture(mImplementation.get(), 0, GL_TEXTURE_EXTERNAL_OES);
- mZeroTextures[GL_TEXTURE_EXTERNAL_OES].set(this, zeroTextureExternal);
- }
-
- mGLState.initializeZeroTextures(this, mZeroTextures);
-
- bindVertexArray(0);
-
- if (getClientVersion() >= Version(3, 0))
- {
- // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
- // In the initial state, a default transform feedback object is bound and treated as
- // a transform feedback object with a name of zero. That object is bound any time
- // BindTransformFeedback is called with id of zero
- bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
- }
-
- for (auto type : angle::AllEnums<BufferBinding>())
- {
- bindBuffer(type, 0);
- }
-
- bindRenderbuffer(GL_RENDERBUFFER, 0);
-
- for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
- {
- bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
- }
-
- // Initialize dirty bit masks
- mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
- mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
- // No dirty objects.
-
- // Readpixels uses the pack state and read FBO
- mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
- mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
- mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
-
- mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
- mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
- mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
- mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
- mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
- mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
- mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
- mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
- mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
- mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
- mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
- mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
-
- mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
- mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
- mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
- mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
- mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
-
- handleError(mImplementation->initialize());
-}
-
-egl::Error Context::onDestroy(const egl::Display *display)
-{
- for (auto fence : mFenceNVMap)
- {
- SafeDelete(fence.second);
- }
- mFenceNVMap.clear();
-
- for (auto query : mQueryMap)
- {
- if (query.second != nullptr)
- {
- query.second->release(this);
- }
- }
- mQueryMap.clear();
-
- for (auto vertexArray : mVertexArrayMap)
- {
- if (vertexArray.second)
- {
- vertexArray.second->onDestroy(this);
- }
- }
- mVertexArrayMap.clear();
-
- for (auto transformFeedback : mTransformFeedbackMap)
- {
- if (transformFeedback.second != nullptr)
- {
- transformFeedback.second->release(this);
- }
- }
- mTransformFeedbackMap.clear();
-
- for (auto &zeroTexture : mZeroTextures)
- {
- ANGLE_TRY(zeroTexture.second->onDestroy(this));
- zeroTexture.second.set(this, nullptr);
- }
- mZeroTextures.clear();
-
- SafeDelete(mSurfacelessFramebuffer);
-
- ANGLE_TRY(releaseSurface(display));
- releaseShaderCompiler();
-
- mGLState.reset(this);
-
- mState.mBuffers->release(this);
- mState.mShaderPrograms->release(this);
- mState.mTextures->release(this);
- mState.mRenderbuffers->release(this);
- mState.mSamplers->release(this);
- mState.mSyncs->release(this);
- mState.mPaths->release(this);
- mState.mFramebuffers->release(this);
- mState.mPipelines->release(this);
-
- mImplementation->onDestroy(this);
-
- return egl::NoError();
-}
-
-Context::~Context()
-{
-}
-
-egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
-{
- mCurrentDisplay = display;
-
- if (!mHasBeenCurrent)
- {
- initRendererString();
- initVersionStrings();
- initExtensionStrings();
-
- int width = 0;
- int height = 0;
- if (surface != nullptr)
- {
- width = surface->getWidth();
- height = surface->getHeight();
- }
-
- mGLState.setViewportParams(0, 0, width, height);
- mGLState.setScissorParams(0, 0, width, height);
-
- mHasBeenCurrent = true;
- }
-
- // TODO(jmadill): Rework this when we support ContextImpl
- mGLState.setAllDirtyBits();
- mGLState.setAllDirtyObjects();
-
- ANGLE_TRY(releaseSurface(display));
-
- Framebuffer *newDefault = nullptr;
- if (surface != nullptr)
- {
- ANGLE_TRY(surface->setIsCurrent(this, true));
- mCurrentSurface = surface;
- newDefault = surface->getDefaultFramebuffer();
- }
- else
- {
- if (mSurfacelessFramebuffer == nullptr)
- {
- mSurfacelessFramebuffer = new Framebuffer(mImplementation.get());
- }
-
- newDefault = mSurfacelessFramebuffer;
- }
-
- // Update default framebuffer, the binding of the previous default
- // framebuffer (or lack of) will have a nullptr.
- {
- if (mGLState.getReadFramebuffer() == nullptr)
- {
- mGLState.setReadFramebufferBinding(newDefault);
- }
- if (mGLState.getDrawFramebuffer() == nullptr)
- {
- mGLState.setDrawFramebufferBinding(newDefault);
- }
- mState.mFramebuffers->setDefaultFramebuffer(newDefault);
- }
-
- // Notify the renderer of a context switch
- mImplementation->onMakeCurrent(this);
- return egl::NoError();
-}
-
-egl::Error Context::releaseSurface(const egl::Display *display)
-{
- // Remove the default framebuffer
- Framebuffer *currentDefault = nullptr;
- if (mCurrentSurface != nullptr)
- {
- currentDefault = mCurrentSurface->getDefaultFramebuffer();
- }
- else if (mSurfacelessFramebuffer != nullptr)
- {
- currentDefault = mSurfacelessFramebuffer;
- }
-
- if (mGLState.getReadFramebuffer() == currentDefault)
- {
- mGLState.setReadFramebufferBinding(nullptr);
- }
- if (mGLState.getDrawFramebuffer() == currentDefault)
- {
- mGLState.setDrawFramebufferBinding(nullptr);
- }
- mState.mFramebuffers->setDefaultFramebuffer(nullptr);
-
- if (mCurrentSurface)
- {
- ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
- mCurrentSurface = nullptr;
- }
-
- return egl::NoError();
-}
-
-GLuint Context::createBuffer()
-{
- return mState.mBuffers->createBuffer();
-}
-
-GLuint Context::createProgram()
-{
- return mState.mShaderPrograms->createProgram(mImplementation.get());
-}
-
-GLuint Context::createShader(GLenum type)
-{
- return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
-}
-
-GLuint Context::createTexture()
-{
- return mState.mTextures->createTexture();
-}
-
-GLuint Context::createRenderbuffer()
-{
- return mState.mRenderbuffers->createRenderbuffer();
-}
-
-GLuint Context::createPaths(GLsizei range)
-{
- auto resultOrError = mState.mPaths->createPaths(mImplementation.get(), range);
- if (resultOrError.isError())
- {
- handleError(resultOrError.getError());
- return 0;
- }
- return resultOrError.getResult();
-}
-
-// Returns an unused framebuffer name
-GLuint Context::createFramebuffer()
-{
- return mState.mFramebuffers->createFramebuffer();
-}
-
-GLuint Context::createFenceNV()
-{
- GLuint handle = mFenceNVHandleAllocator.allocate();
- mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
- return handle;
-}
-
-GLuint Context::createProgramPipeline()
-{
- return mState.mPipelines->createProgramPipeline();
-}
-
-GLuint Context::createShaderProgramv(GLenum type, GLsizei count, const GLchar *const *strings)
-{
- UNIMPLEMENTED();
- return 0u;
-}
-
-void Context::deleteBuffer(GLuint buffer)
-{
- if (mState.mBuffers->getBuffer(buffer))
- {
- detachBuffer(buffer);
- }
-
- mState.mBuffers->deleteObject(this, buffer);
-}
-
-void Context::deleteShader(GLuint shader)
-{
- mState.mShaderPrograms->deleteShader(this, shader);
-}
-
-void Context::deleteProgram(GLuint program)
-{
- mState.mShaderPrograms->deleteProgram(this, program);
-}
-
-void Context::deleteTexture(GLuint texture)
-{
- if (mState.mTextures->getTexture(texture))
- {
- detachTexture(texture);
- }
-
- mState.mTextures->deleteObject(this, texture);
-}
-
-void Context::deleteRenderbuffer(GLuint renderbuffer)
-{
- if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
- {
- detachRenderbuffer(renderbuffer);
- }
-
- mState.mRenderbuffers->deleteObject(this, renderbuffer);
-}
-
-void Context::deleteSync(GLsync sync)
-{
- // The spec specifies the underlying Fence object is not deleted until all current
- // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
- // and since our API is currently designed for being called from a single thread, we can delete
- // the fence immediately.
- mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
-}
-
-void Context::deleteProgramPipeline(GLuint pipeline)
-{
- if (mState.mPipelines->getProgramPipeline(pipeline))
- {
- detachProgramPipeline(pipeline);
- }
-
- mState.mPipelines->deleteObject(this, pipeline);
-}
-
-void Context::deletePaths(GLuint first, GLsizei range)
-{
- mState.mPaths->deletePaths(first, range);
-}
-
-bool Context::hasPathData(GLuint path) const
-{
- const auto *pathObj = mState.mPaths->getPath(path);
- if (pathObj == nullptr)
- return false;
-
- return pathObj->hasPathData();
-}
-
-bool Context::hasPath(GLuint path) const
-{
- return mState.mPaths->hasPath(path);
-}
-
-void Context::setPathCommands(GLuint path,
- GLsizei numCommands,
- const GLubyte *commands,
- GLsizei numCoords,
- GLenum coordType,
- const void *coords)
-{
- auto *pathObject = mState.mPaths->getPath(path);
-
- handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
-}
-
-void Context::setPathParameterf(GLuint path, GLenum pname, GLfloat value)
-{
- auto *pathObj = mState.mPaths->getPath(path);
-
- switch (pname)
- {
- case GL_PATH_STROKE_WIDTH_CHROMIUM:
- pathObj->setStrokeWidth(value);
- break;
- case GL_PATH_END_CAPS_CHROMIUM:
- pathObj->setEndCaps(static_cast<GLenum>(value));
- break;
- case GL_PATH_JOIN_STYLE_CHROMIUM:
- pathObj->setJoinStyle(static_cast<GLenum>(value));
- break;
- case GL_PATH_MITER_LIMIT_CHROMIUM:
- pathObj->setMiterLimit(value);
- break;
- case GL_PATH_STROKE_BOUND_CHROMIUM:
- pathObj->setStrokeBound(value);
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value) const
-{
- const auto *pathObj = mState.mPaths->getPath(path);
-
- switch (pname)
- {
- case GL_PATH_STROKE_WIDTH_CHROMIUM:
- *value = pathObj->getStrokeWidth();
- break;
- case GL_PATH_END_CAPS_CHROMIUM:
- *value = static_cast<GLfloat>(pathObj->getEndCaps());
- break;
- case GL_PATH_JOIN_STYLE_CHROMIUM:
- *value = static_cast<GLfloat>(pathObj->getJoinStyle());
- break;
- case GL_PATH_MITER_LIMIT_CHROMIUM:
- *value = pathObj->getMiterLimit();
- break;
- case GL_PATH_STROKE_BOUND_CHROMIUM:
- *value = pathObj->getStrokeBound();
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void Context::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- mGLState.setPathStencilFunc(func, ref, mask);
-}
-
-void Context::deleteFramebuffer(GLuint framebuffer)
-{
- if (mState.mFramebuffers->getFramebuffer(framebuffer))
- {
- detachFramebuffer(framebuffer);
- }
-
- mState.mFramebuffers->deleteObject(this, framebuffer);
-}
-
-void Context::deleteFenceNV(GLuint fence)
-{
- FenceNV *fenceObject = nullptr;
- if (mFenceNVMap.erase(fence, &fenceObject))
- {
- mFenceNVHandleAllocator.release(fence);
- delete fenceObject;
- }
-}
-
-Buffer *Context::getBuffer(GLuint handle) const
-{
- return mState.mBuffers->getBuffer(handle);
-}
-
-Texture *Context::getTexture(GLuint handle) const
-{
- return mState.mTextures->getTexture(handle);
-}
-
-Renderbuffer *Context::getRenderbuffer(GLuint handle) const
-{
- return mState.mRenderbuffers->getRenderbuffer(handle);
-}
-
-Sync *Context::getSync(GLsync handle) const
-{
- return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
-}
-
-VertexArray *Context::getVertexArray(GLuint handle) const
-{
- return mVertexArrayMap.query(handle);
-}
-
-Sampler *Context::getSampler(GLuint handle) const
-{
- return mState.mSamplers->getSampler(handle);
-}
-
-TransformFeedback *Context::getTransformFeedback(GLuint handle) const
-{
- return mTransformFeedbackMap.query(handle);
-}
-
-ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
-{
- return mState.mPipelines->getProgramPipeline(handle);
-}
-
-LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
-{
- switch (identifier)
- {
- case GL_BUFFER:
- return getBuffer(name);
- case GL_SHADER:
- return getShader(name);
- case GL_PROGRAM:
- return getProgram(name);
- case GL_VERTEX_ARRAY:
- return getVertexArray(name);
- case GL_QUERY:
- return getQuery(name);
- case GL_TRANSFORM_FEEDBACK:
- return getTransformFeedback(name);
- case GL_SAMPLER:
- return getSampler(name);
- case GL_TEXTURE:
- return getTexture(name);
- case GL_RENDERBUFFER:
- return getRenderbuffer(name);
- case GL_FRAMEBUFFER:
- return getFramebuffer(name);
- default:
- UNREACHABLE();
- return nullptr;
- }
-}
-
-LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
-{
- return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
-}
-
-void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
-{
- LabeledObject *object = getLabeledObject(identifier, name);
- ASSERT(object != nullptr);
-
- std::string labelName = GetObjectLabelFromPointer(length, label);
- object->setLabel(labelName);
-
- // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
- // specified object is active until we do this.
- mGLState.setObjectDirty(identifier);
-}
-
-void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
-{
- LabeledObject *object = getLabeledObjectFromPtr(ptr);
- ASSERT(object != nullptr);
-
- std::string labelName = GetObjectLabelFromPointer(length, label);
- object->setLabel(labelName);
-}
-
-void Context::getObjectLabel(GLenum identifier,
- GLuint name,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *label) const
-{
- LabeledObject *object = getLabeledObject(identifier, name);
- ASSERT(object != nullptr);
-
- const std::string &objectLabel = object->getLabel();
- GetObjectLabelBase(objectLabel, bufSize, length, label);
-}
-
-void Context::getObjectPtrLabel(const void *ptr,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *label) const
-{
- LabeledObject *object = getLabeledObjectFromPtr(ptr);
- ASSERT(object != nullptr);
-
- const std::string &objectLabel = object->getLabel();
- GetObjectLabelBase(objectLabel, bufSize, length, label);
-}
-
-bool Context::isSampler(GLuint samplerName) const
-{
- return mState.mSamplers->isSampler(samplerName);
-}
-
-void Context::bindTexture(GLenum target, GLuint handle)
-{
- Texture *texture = nullptr;
-
- if (handle == 0)
- {
- texture = mZeroTextures[target].get();
- }
- else
- {
- texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
- }
-
- ASSERT(texture);
- mGLState.setSamplerTexture(this, target, texture);
-}
-
-void Context::bindReadFramebuffer(GLuint framebufferHandle)
-{
- Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
- mImplementation.get(), mCaps, framebufferHandle);
- mGLState.setReadFramebufferBinding(framebuffer);
-}
-
-void Context::bindDrawFramebuffer(GLuint framebufferHandle)
-{
- Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
- mImplementation.get(), mCaps, framebufferHandle);
- mGLState.setDrawFramebufferBinding(framebuffer);
-}
-
-void Context::bindVertexArray(GLuint vertexArrayHandle)
-{
- VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
- mGLState.setVertexArrayBinding(vertexArray);
-}
-
-void Context::bindVertexBuffer(GLuint bindingIndex,
- GLuint bufferHandle,
- GLintptr offset,
- GLsizei stride)
-{
- Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
- mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
-}
-
-void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
-{
- ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
- Sampler *sampler =
- mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
- mGLState.setSamplerBinding(this, textureUnit, sampler);
-}
-
-void Context::bindImageTexture(GLuint unit,
- GLuint texture,
- GLint level,
- GLboolean layered,
- GLint layer,
- GLenum access,
- GLenum format)
-{
- Texture *tex = mState.mTextures->getTexture(texture);
- mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
-}
-
-void Context::useProgram(GLuint program)
-{
- mGLState.setProgram(this, getProgram(program));
-}
-
-void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
-{
- UNIMPLEMENTED();
-}
-
-void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
-{
- ASSERT(target == GL_TRANSFORM_FEEDBACK);
- TransformFeedback *transformFeedback =
- checkTransformFeedbackAllocation(transformFeedbackHandle);
- mGLState.setTransformFeedbackBinding(this, transformFeedback);
-}
-
-void Context::bindProgramPipeline(GLuint pipelineHandle)
-{
- ProgramPipeline *pipeline =
- mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
- mGLState.setProgramPipelineBinding(this, pipeline);
-}
-
-void Context::beginQuery(GLenum target, GLuint query)
-{
- Query *queryObject = getQuery(query, true, target);
- ASSERT(queryObject);
-
- // begin query
- ANGLE_CONTEXT_TRY(queryObject->begin());
-
- // set query as active for specified target only if begin succeeded
- mGLState.setActiveQuery(this, target, queryObject);
-}
-
-void Context::endQuery(GLenum target)
-{
- Query *queryObject = mGLState.getActiveQuery(target);
- ASSERT(queryObject);
-
- handleError(queryObject->end());
-
- // Always unbind the query, even if there was an error. This may delete the query object.
- mGLState.setActiveQuery(this, target, nullptr);
-}
-
-void Context::queryCounter(GLuint id, GLenum target)
-{
- ASSERT(target == GL_TIMESTAMP_EXT);
-
- Query *queryObject = getQuery(id, true, target);
- ASSERT(queryObject);
-
- handleError(queryObject->queryCounter());
-}
-
-void Context::getQueryiv(GLenum target, GLenum pname, GLint *params)
-{
- switch (pname)
- {
- case GL_CURRENT_QUERY_EXT:
- params[0] = mGLState.getActiveQueryId(target);
- break;
- case GL_QUERY_COUNTER_BITS_EXT:
- switch (target)
- {
- case GL_TIME_ELAPSED_EXT:
- params[0] = getExtensions().queryCounterBitsTimeElapsed;
- break;
- case GL_TIMESTAMP_EXT:
- params[0] = getExtensions().queryCounterBitsTimestamp;
- break;
- default:
- UNREACHABLE();
- params[0] = 0;
- break;
- }
- break;
- default:
- UNREACHABLE();
- return;
- }
-}
-
-void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
- handleError(GetQueryObjectParameter(getQuery(id), pname, params));
-}
-
-void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
- handleError(GetQueryObjectParameter(getQuery(id), pname, params));
-}
-
-void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
-{
- handleError(GetQueryObjectParameter(getQuery(id), pname, params));
-}
-
-void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
-{
- handleError(GetQueryObjectParameter(getQuery(id), pname, params));
-}
-
-Framebuffer *Context::getFramebuffer(GLuint handle) const
-{
- return mState.mFramebuffers->getFramebuffer(handle);
-}
-
-FenceNV *Context::getFenceNV(GLuint handle)
-{
- return mFenceNVMap.query(handle);
-}
-
-Query *Context::getQuery(GLuint handle, bool create, GLenum type)
-{
- if (!mQueryMap.contains(handle))
- {
- return nullptr;
- }
-
- Query *query = mQueryMap.query(handle);
- if (!query && create)
- {
- query = new Query(mImplementation->createQuery(type), handle);
- query->addRef();
- mQueryMap.assign(handle, query);
- }
- return query;
-}
-
-Query *Context::getQuery(GLuint handle) const
-{
- return mQueryMap.query(handle);
-}
-
-Texture *Context::getTargetTexture(GLenum target) const
-{
- ASSERT(ValidTextureTarget(this, target) || ValidTextureExternalTarget(this, target));
- return mGLState.getTargetTexture(target);
-}
-
-Texture *Context::getSamplerTexture(unsigned int sampler, GLenum type) const
-{
- return mGLState.getSamplerTexture(sampler, type);
-}
-
-Compiler *Context::getCompiler() const
-{
- if (mCompiler.get() == nullptr)
- {
- mCompiler.set(this, new Compiler(mImplementation.get(), mState));
- }
- return mCompiler.get();
-}
-
-void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
-{
- switch (pname)
- {
- case GL_SHADER_COMPILER:
- *params = GL_TRUE;
- break;
- case GL_CONTEXT_ROBUST_ACCESS_EXT:
- *params = mRobustAccess ? GL_TRUE : GL_FALSE;
- break;
- default:
- mGLState.getBooleanv(pname, params);
- break;
- }
-}
-
-void Context::getFloatvImpl(GLenum pname, GLfloat *params)
-{
- // Queries about context capabilities and maximums are answered by Context.
- // Queries about current GL state values are answered by State.
- switch (pname)
- {
- case GL_ALIASED_LINE_WIDTH_RANGE:
- params[0] = mCaps.minAliasedLineWidth;
- params[1] = mCaps.maxAliasedLineWidth;
- break;
- case GL_ALIASED_POINT_SIZE_RANGE:
- params[0] = mCaps.minAliasedPointSize;
- params[1] = mCaps.maxAliasedPointSize;
- break;
- case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
- ASSERT(mExtensions.textureFilterAnisotropic);
- *params = mExtensions.maxTextureAnisotropy;
- break;
- case GL_MAX_TEXTURE_LOD_BIAS:
- *params = mCaps.maxLODBias;
- break;
-
- case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
- case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
- {
- ASSERT(mExtensions.pathRendering);
- const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
- memcpy(params, m, 16 * sizeof(GLfloat));
- }
- break;
-
- default:
- mGLState.getFloatv(pname, params);
- break;
- }
-}
-
-void Context::getIntegervImpl(GLenum pname, GLint *params)
-{
- // Queries about context capabilities and maximums are answered by Context.
- // Queries about current GL state values are answered by State.
-
- switch (pname)
- {
- case GL_MAX_VERTEX_ATTRIBS:
- *params = mCaps.maxVertexAttributes;
- break;
- case GL_MAX_VERTEX_UNIFORM_VECTORS:
- *params = mCaps.maxVertexUniformVectors;
- break;
- case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
- *params = mCaps.maxVertexUniformComponents;
- break;
- case GL_MAX_VARYING_VECTORS:
- *params = mCaps.maxVaryingVectors;
- break;
- case GL_MAX_VARYING_COMPONENTS:
- *params = mCaps.maxVertexOutputComponents;
- break;
- case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
- *params = mCaps.maxCombinedTextureImageUnits;
- break;
- case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
- *params = mCaps.maxVertexTextureImageUnits;
- break;
- case GL_MAX_TEXTURE_IMAGE_UNITS:
- *params = mCaps.maxTextureImageUnits;
- break;
- case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
- *params = mCaps.maxFragmentUniformVectors;
- break;
- case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
- *params = mCaps.maxFragmentUniformComponents;
- break;
- case GL_MAX_RENDERBUFFER_SIZE:
- *params = mCaps.maxRenderbufferSize;
- break;
- case GL_MAX_COLOR_ATTACHMENTS_EXT:
- *params = mCaps.maxColorAttachments;
- break;
- case GL_MAX_DRAW_BUFFERS_EXT:
- *params = mCaps.maxDrawBuffers;
- break;
- // case GL_FRAMEBUFFER_BINDING: // now equivalent to
- // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
- case GL_SUBPIXEL_BITS:
- *params = 4;
- break;
- case GL_MAX_TEXTURE_SIZE:
- *params = mCaps.max2DTextureSize;
- break;
- case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
- *params = mCaps.maxRectangleTextureSize;
- break;
- case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
- *params = mCaps.maxCubeMapTextureSize;
- break;
- case GL_MAX_3D_TEXTURE_SIZE:
- *params = mCaps.max3DTextureSize;
- break;
- case GL_MAX_ARRAY_TEXTURE_LAYERS:
- *params = mCaps.maxArrayTextureLayers;
- break;
- case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
- *params = mCaps.uniformBufferOffsetAlignment;
- break;
- case GL_MAX_UNIFORM_BUFFER_BINDINGS:
- *params = mCaps.maxUniformBufferBindings;
- break;
- case GL_MAX_VERTEX_UNIFORM_BLOCKS:
- *params = mCaps.maxVertexUniformBlocks;
- break;
- case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
- *params = mCaps.maxFragmentUniformBlocks;
- break;
- case GL_MAX_COMBINED_UNIFORM_BLOCKS:
- *params = mCaps.maxCombinedTextureImageUnits;
- break;
- case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
- *params = mCaps.maxVertexOutputComponents;
- break;
- case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
- *params = mCaps.maxFragmentInputComponents;
- break;
- case GL_MIN_PROGRAM_TEXEL_OFFSET:
- *params = mCaps.minProgramTexelOffset;
- break;
- case GL_MAX_PROGRAM_TEXEL_OFFSET:
- *params = mCaps.maxProgramTexelOffset;
- break;
- case GL_MAJOR_VERSION:
- *params = getClientVersion().major;
- break;
- case GL_MINOR_VERSION:
- *params = getClientVersion().minor;
- break;
- case GL_MAX_ELEMENTS_INDICES:
- *params = mCaps.maxElementsIndices;
- break;
- case GL_MAX_ELEMENTS_VERTICES:
- *params = mCaps.maxElementsVertices;
- break;
- case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
- *params = mCaps.maxTransformFeedbackInterleavedComponents;
- break;
- case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
- *params = mCaps.maxTransformFeedbackSeparateAttributes;
- break;
- case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
- *params = mCaps.maxTransformFeedbackSeparateComponents;
- break;
- case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
- *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
- break;
- case GL_MAX_SAMPLES_ANGLE:
- *params = mCaps.maxSamples;
- break;
- case GL_MAX_VIEWPORT_DIMS:
- {
- params[0] = mCaps.maxViewportWidth;
- params[1] = mCaps.maxViewportHeight;
- }
- break;
- case GL_COMPRESSED_TEXTURE_FORMATS:
- std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
- params);
- break;
- case GL_RESET_NOTIFICATION_STRATEGY_EXT:
- *params = mResetStrategy;
- break;
- case GL_NUM_SHADER_BINARY_FORMATS:
- *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
- break;
- case GL_SHADER_BINARY_FORMATS:
- std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
- break;
- case GL_NUM_PROGRAM_BINARY_FORMATS:
- *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
- break;
- case GL_PROGRAM_BINARY_FORMATS:
- std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
- break;
- case GL_NUM_EXTENSIONS:
- *params = static_cast<GLint>(mExtensionStrings.size());
- break;
-
- // GL_KHR_debug
- case GL_MAX_DEBUG_MESSAGE_LENGTH:
- *params = mExtensions.maxDebugMessageLength;
- break;
- case GL_MAX_DEBUG_LOGGED_MESSAGES:
- *params = mExtensions.maxDebugLoggedMessages;
- break;
- case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
- *params = mExtensions.maxDebugGroupStackDepth;
- break;
- case GL_MAX_LABEL_LENGTH:
- *params = mExtensions.maxLabelLength;
- break;
-
- // GL_ANGLE_multiview
- case GL_MAX_VIEWS_ANGLE:
- *params = mExtensions.maxViews;
- break;
-
- // GL_EXT_disjoint_timer_query
- case GL_GPU_DISJOINT_EXT:
- *params = mImplementation->getGPUDisjoint();
- break;
- case GL_MAX_FRAMEBUFFER_WIDTH:
- *params = mCaps.maxFramebufferWidth;
- break;
- case GL_MAX_FRAMEBUFFER_HEIGHT:
- *params = mCaps.maxFramebufferHeight;
- break;
- case GL_MAX_FRAMEBUFFER_SAMPLES:
- *params = mCaps.maxFramebufferSamples;
- break;
- case GL_MAX_SAMPLE_MASK_WORDS:
- *params = mCaps.maxSampleMaskWords;
- break;
- case GL_MAX_COLOR_TEXTURE_SAMPLES:
- *params = mCaps.maxColorTextureSamples;
- break;
- case GL_MAX_DEPTH_TEXTURE_SAMPLES:
- *params = mCaps.maxDepthTextureSamples;
- break;
- case GL_MAX_INTEGER_SAMPLES:
- *params = mCaps.maxIntegerSamples;
- break;
- case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
- *params = mCaps.maxVertexAttribRelativeOffset;
- break;
- case GL_MAX_VERTEX_ATTRIB_BINDINGS:
- *params = mCaps.maxVertexAttribBindings;
- break;
- case GL_MAX_VERTEX_ATTRIB_STRIDE:
- *params = mCaps.maxVertexAttribStride;
- break;
- case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
- *params = mCaps.maxVertexAtomicCounterBuffers;
- break;
- case GL_MAX_VERTEX_ATOMIC_COUNTERS:
- *params = mCaps.maxVertexAtomicCounters;
- break;
- case GL_MAX_VERTEX_IMAGE_UNIFORMS:
- *params = mCaps.maxVertexImageUniforms;
- break;
- case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
- *params = mCaps.maxVertexShaderStorageBlocks;
- break;
- case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
- *params = mCaps.maxFragmentAtomicCounterBuffers;
- break;
- case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
- *params = mCaps.maxFragmentAtomicCounters;
- break;
- case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
- *params = mCaps.maxFragmentImageUniforms;
- break;
- case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
- *params = mCaps.maxFragmentShaderStorageBlocks;
- break;
- case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
- *params = mCaps.minProgramTextureGatherOffset;
- break;
- case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
- *params = mCaps.maxProgramTextureGatherOffset;
- break;
- case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
- *params = mCaps.maxComputeWorkGroupInvocations;
- break;
- case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
- *params = mCaps.maxComputeUniformBlocks;
- break;
- case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
- *params = mCaps.maxComputeTextureImageUnits;
- break;
- case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
- *params = mCaps.maxComputeSharedMemorySize;
- break;
- case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
- *params = mCaps.maxComputeUniformComponents;
- break;
- case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
- *params = mCaps.maxComputeAtomicCounterBuffers;
- break;
- case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
- *params = mCaps.maxComputeAtomicCounters;
- break;
- case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
- *params = mCaps.maxComputeImageUniforms;
- break;
- case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
- *params = mCaps.maxCombinedComputeUniformComponents;
- break;
- case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
- *params = mCaps.maxComputeShaderStorageBlocks;
- break;
- case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
- *params = mCaps.maxCombinedShaderOutputResources;
- break;
- case GL_MAX_UNIFORM_LOCATIONS:
- *params = mCaps.maxUniformLocations;
- break;
- case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
- *params = mCaps.maxAtomicCounterBufferBindings;
- break;
- case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
- *params = mCaps.maxAtomicCounterBufferSize;
- break;
- case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
- *params = mCaps.maxCombinedAtomicCounterBuffers;
- break;
- case GL_MAX_COMBINED_ATOMIC_COUNTERS:
- *params = mCaps.maxCombinedAtomicCounters;
- break;
- case GL_MAX_IMAGE_UNITS:
- *params = mCaps.maxImageUnits;
- break;
- case GL_MAX_COMBINED_IMAGE_UNIFORMS:
- *params = mCaps.maxCombinedImageUniforms;
- break;
- case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
- *params = mCaps.maxShaderStorageBufferBindings;
- break;
- case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
- *params = mCaps.maxCombinedShaderStorageBlocks;
- break;
- case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
- *params = mCaps.shaderStorageBufferOffsetAlignment;
- break;
- default:
- mGLState.getIntegerv(this, pname, params);
- break;
- }
-}
-
-void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
-{
- // Queries about context capabilities and maximums are answered by Context.
- // Queries about current GL state values are answered by State.
- switch (pname)
- {
- case GL_MAX_ELEMENT_INDEX:
- *params = mCaps.maxElementIndex;
- break;
- case GL_MAX_UNIFORM_BLOCK_SIZE:
- *params = mCaps.maxUniformBlockSize;
- break;
- case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
- *params = mCaps.maxCombinedVertexUniformComponents;
- break;
- case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
- *params = mCaps.maxCombinedFragmentUniformComponents;
- break;
- case GL_MAX_SERVER_WAIT_TIMEOUT:
- *params = mCaps.maxServerWaitTimeout;
- break;
-
- // GL_EXT_disjoint_timer_query
- case GL_TIMESTAMP_EXT:
- *params = mImplementation->getTimestamp();
- break;
-
- case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
- *params = mCaps.maxShaderStorageBlockSize;
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void Context::getPointerv(GLenum pname, void **params) const
-{
- mGLState.getPointerv(pname, params);
-}
-
-void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- // Queries about context capabilities and maximums are answered by Context.
- // Queries about current GL state values are answered by State.
-
- GLenum nativeType;
- unsigned int numParams;
- bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
- ASSERT(queryStatus);
-
- if (nativeType == GL_INT)
- {
- switch (target)
- {
- case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
- ASSERT(index < 3u);
- *data = mCaps.maxComputeWorkGroupCount[index];
- break;
- case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
- ASSERT(index < 3u);
- *data = mCaps.maxComputeWorkGroupSize[index];
- break;
- default:
- mGLState.getIntegeri_v(target, index, data);
- }
- }
- else
- {
- CastIndexedStateValues(this, nativeType, target, index, numParams, data);
- }
-}
-
-void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
- // Queries about context capabilities and maximums are answered by Context.
- // Queries about current GL state values are answered by State.
-
- GLenum nativeType;
- unsigned int numParams;
- bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
- ASSERT(queryStatus);
-
- if (nativeType == GL_INT_64_ANGLEX)
- {
- mGLState.getInteger64i_v(target, index, data);
- }
- else
- {
- CastIndexedStateValues(this, nativeType, target, index, numParams, data);
- }
-}
-
-void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- // Queries about context capabilities and maximums are answered by Context.
- // Queries about current GL state values are answered by State.
-
- GLenum nativeType;
- unsigned int numParams;
- bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
- ASSERT(queryStatus);
-
- if (nativeType == GL_BOOL)
- {
- mGLState.getBooleani_v(target, index, data);
- }
- else
- {
- CastIndexedStateValues(this, nativeType, target, index, numParams, data);
- }
-}
-
-void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
-{
- Buffer *buffer = mGLState.getTargetBuffer(target);
- QueryBufferParameteriv(buffer, pname, params);
-}
-
-void Context::getFramebufferAttachmentParameteriv(GLenum target,
- GLenum attachment,
- GLenum pname,
- GLint *params)
-{
- const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
- QueryFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params);
-}
-
-void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
- QueryRenderbufferiv(this, renderbuffer, pname, params);
-}
-
-void Context::getTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
- Texture *texture = getTargetTexture(target);
- QueryTexParameterfv(texture, pname, params);
-}
-
-void Context::getTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- Texture *texture = getTargetTexture(target);
- QueryTexParameteriv(texture, pname, params);
-}
-
-void Context::getTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
-{
- Texture *texture =
- getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
- QueryTexLevelParameteriv(texture, target, level, pname, params);
-}
-
-void Context::getTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
- Texture *texture =
- getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
- QueryTexLevelParameterfv(texture, target, level, pname, params);
-}
-
-void Context::texParameterf(GLenum target, GLenum pname, GLfloat param)
-{
- Texture *texture = getTargetTexture(target);
- SetTexParameterf(this, texture, pname, param);
- onTextureChange(texture);
-}
-
-void Context::texParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
- Texture *texture = getTargetTexture(target);
- SetTexParameterfv(this, texture, pname, params);
- onTextureChange(texture);
-}
-
-void Context::texParameteri(GLenum target, GLenum pname, GLint param)
-{
- Texture *texture = getTargetTexture(target);
- SetTexParameteri(this, texture, pname, param);
- onTextureChange(texture);
-}
-
-void Context::texParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
- Texture *texture = getTargetTexture(target);
- SetTexParameteriv(this, texture, pname, params);
- onTextureChange(texture);
-}
-
-void Context::drawArrays(GLenum mode, GLint first, GLsizei count)
-{
- ANGLE_CONTEXT_TRY(prepareForDraw());
- ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
- MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
-}
-
-void Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
-{
- ANGLE_CONTEXT_TRY(prepareForDraw());
- ANGLE_CONTEXT_TRY(
- mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
- MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
-}
-
-void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
-{
- ANGLE_CONTEXT_TRY(prepareForDraw());
- ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
-}
-
-void Context::drawElementsInstanced(GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei instances)
-{
- ANGLE_CONTEXT_TRY(prepareForDraw());
- ANGLE_CONTEXT_TRY(
- mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
-}
-
-void Context::drawRangeElements(GLenum mode,
- GLuint start,
- GLuint end,
- GLsizei count,
- GLenum type,
- const void *indices)
-{
- ANGLE_CONTEXT_TRY(prepareForDraw());
- ANGLE_CONTEXT_TRY(
- mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
-}
-
-void Context::drawArraysIndirect(GLenum mode, const void *indirect)
-{
- ANGLE_CONTEXT_TRY(prepareForDraw());
- ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
-}
-
-void Context::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
-{
- ANGLE_CONTEXT_TRY(prepareForDraw());
- ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
-}
-
-void Context::flush()
-{
- handleError(mImplementation->flush(this));
-}
-
-void Context::finish()
-{
- handleError(mImplementation->finish(this));
-}
-
-void Context::insertEventMarker(GLsizei length, const char *marker)
-{
- ASSERT(mImplementation);
- mImplementation->insertEventMarker(length, marker);
-}
-
-void Context::pushGroupMarker(GLsizei length, const char *marker)
-{
- ASSERT(mImplementation);
- mImplementation->pushGroupMarker(length, marker);
-}
-
-void Context::popGroupMarker()
-{
- ASSERT(mImplementation);
- mImplementation->popGroupMarker();
-}
-
-void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
-
- programObject->bindUniformLocation(location, name);
-}
-
-void Context::setCoverageModulation(GLenum components)
-{
- mGLState.setCoverageModulation(components);
-}
-
-void Context::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
-{
- mGLState.loadPathRenderingMatrix(matrixMode, matrix);
-}
-
-void Context::loadPathRenderingIdentityMatrix(GLenum matrixMode)
-{
- GLfloat I[16];
- angle::Matrix<GLfloat>::setToIdentity(I);
-
- mGLState.loadPathRenderingMatrix(matrixMode, I);
-}
-
-void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
-{
- const auto *pathObj = mState.mPaths->getPath(path);
- if (!pathObj)
- return;
-
- // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
- syncRendererState();
-
- mImplementation->stencilFillPath(pathObj, fillMode, mask);
-}
-
-void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
-{
- const auto *pathObj = mState.mPaths->getPath(path);
- if (!pathObj)
- return;
-
- // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
- syncRendererState();
-
- mImplementation->stencilStrokePath(pathObj, reference, mask);
-}
-
-void Context::coverFillPath(GLuint path, GLenum coverMode)
-{
- const auto *pathObj = mState.mPaths->getPath(path);
- if (!pathObj)
- return;
-
- // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
- syncRendererState();
-
- mImplementation->coverFillPath(pathObj, coverMode);
-}
-
-void Context::coverStrokePath(GLuint path, GLenum coverMode)
-{
- const auto *pathObj = mState.mPaths->getPath(path);
- if (!pathObj)
- return;
-
- // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
- syncRendererState();
-
- mImplementation->coverStrokePath(pathObj, coverMode);
-}
-
-void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
-{
- const auto *pathObj = mState.mPaths->getPath(path);
- if (!pathObj)
- return;
-
- // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
- syncRendererState();
-
- mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
-}
-
-void Context::stencilThenCoverStrokePath(GLuint path,
- GLint reference,
- GLuint mask,
- GLenum coverMode)
-{
- const auto *pathObj = mState.mPaths->getPath(path);
- if (!pathObj)
- return;
-
- // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
- syncRendererState();
-
- mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
-}
-
-void Context::coverFillPathInstanced(GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues)
-{
- const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
-
- // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
- syncRendererState();
-
- mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
-}
-
-void Context::coverStrokePathInstanced(GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues)
-{
- const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
-
- // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
- syncRendererState();
-
- mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
- transformValues);
-}
-
-void Context::stencilFillPathInstanced(GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLenum fillMode,
- GLuint mask,
- GLenum transformType,
- const GLfloat *transformValues)
-{
- const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
-
- // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
- syncRendererState();
-
- mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
- transformValues);
-}
-
-void Context::stencilStrokePathInstanced(GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLint reference,
- GLuint mask,
- GLenum transformType,
- const GLfloat *transformValues)
-{
- const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
-
- // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
- syncRendererState();
-
- mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
- transformValues);
-}
-
-void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLenum fillMode,
- GLuint mask,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues)
-{
- const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
-
- // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
- syncRendererState();
-
- mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
- transformType, transformValues);
-}
-
-void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLint reference,
- GLuint mask,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues)
-{
- const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
-
- // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
- syncRendererState();
-
- mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
- transformType, transformValues);
-}
-
-void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
-{
- auto *programObject = getProgram(program);
-
- programObject->bindFragmentInputLocation(location, name);
-}
-
-void Context::programPathFragmentInputGen(GLuint program,
- GLint location,
- GLenum genMode,
- GLint components,
- const GLfloat *coeffs)
-{
- auto *programObject = getProgram(program);
-
- programObject->pathFragmentInputGen(this, location, genMode, components, coeffs);
-}
-
-GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
-{
- const auto *programObject = getProgram(program);
- return QueryProgramResourceIndex(programObject, programInterface, name);
-}
-
-void Context::getProgramResourceName(GLuint program,
- GLenum programInterface,
- GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *name)
-{
- const auto *programObject = getProgram(program);
- QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
-}
-
-GLint Context::getProgramResourceLocation(GLuint program,
- GLenum programInterface,
- const GLchar *name)
-{
- const auto *programObject = getProgram(program);
- return QueryProgramResourceLocation(programObject, programInterface, name);
-}
-
-void Context::getProgramResourceiv(GLuint program,
- GLenum programInterface,
- GLuint index,
- GLsizei propCount,
- const GLenum *props,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params)
-{
- const auto *programObject = getProgram(program);
- QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
- length, params);
-}
-
-void Context::getProgramInterfaceiv(GLuint program,
- GLenum programInterface,
- GLenum pname,
- GLint *params)
-{
- const auto *programObject = getProgram(program);
- QueryProgramInterfaceiv(programObject, programInterface, pname, params);
-}
-
-void Context::handleError(const Error &error)
-{
- if (error.isError())
- {
- GLenum code = error.getCode();
- mErrors.insert(code);
- if (code == GL_OUT_OF_MEMORY && getWorkarounds().loseContextOnOutOfMemory)
- {
- markContextLost();
- }
-
- ASSERT(!error.getMessage().empty());
- mGLState.getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, error.getID(),
- GL_DEBUG_SEVERITY_HIGH, error.getMessage());
- }
-}
-
-// Get one of the recorded errors and clear its flag, if any.
-// [OpenGL ES 2.0.24] section 2.5 page 13.
-GLenum Context::getError()
-{
- if (mErrors.empty())
- {
- return GL_NO_ERROR;
- }
- else
- {
- GLenum error = *mErrors.begin();
- mErrors.erase(mErrors.begin());
- return error;
- }
-}
-
-// NOTE: this function should not assume that this context is current!
-void Context::markContextLost()
-{
- if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
- {
- mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
- mContextLostForced = true;
- }
- mContextLost = true;
-}
-
-bool Context::isContextLost()
-{
- return mContextLost;
-}
-
-GLenum Context::getResetStatus()
-{
- // Even if the application doesn't want to know about resets, we want to know
- // as it will allow us to skip all the calls.
- if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
- {
- if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
- {
- mContextLost = true;
- }
-
- // EXT_robustness, section 2.6: If the reset notification behavior is
- // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
- // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
- return GL_NO_ERROR;
- }
-
- // The GL_EXT_robustness spec says that if a reset is encountered, a reset
- // status should be returned at least once, and GL_NO_ERROR should be returned
- // once the device has finished resetting.
- if (!mContextLost)
- {
- ASSERT(mResetStatus == GL_NO_ERROR);
- mResetStatus = mImplementation->getResetStatus();
-
- if (mResetStatus != GL_NO_ERROR)
- {
- mContextLost = true;
- }
- }
- else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
- {
- // If markContextLost was used to mark the context lost then
- // assume that is not recoverable, and continue to report the
- // lost reset status for the lifetime of this context.
- mResetStatus = mImplementation->getResetStatus();
- }
-
- return mResetStatus;
-}
-
-bool Context::isResetNotificationEnabled()
-{
- return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
-}
-
-const egl::Config *Context::getConfig() const
-{
- return mConfig;
-}
-
-EGLenum Context::getClientType() const
-{
- return mClientType;
-}
-
-EGLenum Context::getRenderBuffer() const
-{
- const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
- if (framebuffer == nullptr)
- {
- return EGL_NONE;
- }
-
- const FramebufferAttachment *backAttachment = framebuffer->getAttachment(GL_BACK);
- ASSERT(backAttachment != nullptr);
- return backAttachment->getSurface()->getRenderBuffer();
-}
-
-VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
-{
- // Only called after a prior call to Gen.
- VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
- if (!vertexArray)
- {
- vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
- mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
-
- mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
- }
-
- return vertexArray;
-}
-
-TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
-{
- // Only called after a prior call to Gen.
- TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
- if (!transformFeedback)
- {
- transformFeedback =
- new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
- transformFeedback->addRef();
- mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
- }
-
- return transformFeedback;
-}
-
-bool Context::isVertexArrayGenerated(GLuint vertexArray)
-{
- ASSERT(mVertexArrayMap.contains(0));
- return mVertexArrayMap.contains(vertexArray);
-}
-
-bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
-{
- ASSERT(mTransformFeedbackMap.contains(0));
- return mTransformFeedbackMap.contains(transformFeedback);
-}
-
-void Context::detachTexture(GLuint texture)
-{
- // Simple pass-through to State's detachTexture method, as textures do not require
- // allocation map management either here or in the resource manager at detach time.
- // Zero textures are held by the Context, and we don't attempt to request them from
- // the State.
- mGLState.detachTexture(this, mZeroTextures, texture);
-}
-
-void Context::detachBuffer(GLuint buffer)
-{
- // Simple pass-through to State's detachBuffer method, since
- // only buffer attachments to container objects that are bound to the current context
- // should be detached. And all those are available in State.
-
- // [OpenGL ES 3.2] section 5.1.2 page 45:
- // Attachments to unbound container objects, such as
- // deletion of a buffer attached to a vertex array object which is not bound to the context,
- // are not affected and continue to act as references on the deleted object
- mGLState.detachBuffer(this, buffer);
-}
-
-void Context::detachFramebuffer(GLuint framebuffer)
-{
- // Framebuffer detachment is handled by Context, because 0 is a valid
- // Framebuffer object, and a pointer to it must be passed from Context
- // to State at binding time.
-
- // [OpenGL ES 2.0.24] section 4.4 page 107:
- // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
- // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
- // zero.
-
- if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
- {
- bindReadFramebuffer(0);
- }
-
- if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
- {
- bindDrawFramebuffer(0);
- }
-}
-
-void Context::detachRenderbuffer(GLuint renderbuffer)
-{
- mGLState.detachRenderbuffer(this, renderbuffer);
-}
-
-void Context::detachVertexArray(GLuint vertexArray)
-{
- // Vertex array detachment is handled by Context, because 0 is a valid
- // VAO, and a pointer to it must be passed from Context to State at
- // binding time.
-
- // [OpenGL ES 3.0.2] section 2.10 page 43:
- // If a vertex array object that is currently bound is deleted, the binding
- // for that object reverts to zero and the default vertex array becomes current.
- if (mGLState.removeVertexArrayBinding(vertexArray))
- {
- bindVertexArray(0);
- }
-}
-
-void Context::detachTransformFeedback(GLuint transformFeedback)
-{
- // Transform feedback detachment is handled by Context, because 0 is a valid
- // transform feedback, and a pointer to it must be passed from Context to State at
- // binding time.
-
- // The OpenGL specification doesn't mention what should happen when the currently bound
- // transform feedback object is deleted. Since it is a container object, we treat it like
- // VAOs and FBOs and set the current bound transform feedback back to 0.
- if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
- {
- bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
- }
-}
-
-void Context::detachSampler(GLuint sampler)
-{
- mGLState.detachSampler(this, sampler);
-}
-
-void Context::detachProgramPipeline(GLuint pipeline)
-{
- mGLState.detachProgramPipeline(this, pipeline);
-}
-
-void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
-{
- mGLState.setVertexAttribDivisor(this, index, divisor);
-}
-
-void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
-{
- Sampler *samplerObject =
- mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
- SetSamplerParameteri(samplerObject, pname, param);
- mGLState.setObjectDirty(GL_SAMPLER);
-}
-
-void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
-{
- Sampler *samplerObject =
- mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
- SetSamplerParameteriv(samplerObject, pname, param);
- mGLState.setObjectDirty(GL_SAMPLER);
-}
-
-void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
-{
- Sampler *samplerObject =
- mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
- SetSamplerParameterf(samplerObject, pname, param);
- mGLState.setObjectDirty(GL_SAMPLER);
-}
-
-void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
-{
- Sampler *samplerObject =
- mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
- SetSamplerParameterfv(samplerObject, pname, param);
- mGLState.setObjectDirty(GL_SAMPLER);
-}
-
-void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
-{
- const Sampler *samplerObject =
- mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
- QuerySamplerParameteriv(samplerObject, pname, params);
- mGLState.setObjectDirty(GL_SAMPLER);
-}
-
-void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
-{
- const Sampler *samplerObject =
- mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
- QuerySamplerParameterfv(samplerObject, pname, params);
- mGLState.setObjectDirty(GL_SAMPLER);
-}
-
-void Context::programParameteri(GLuint program, GLenum pname, GLint value)
-{
- gl::Program *programObject = getProgram(program);
- SetProgramParameteri(programObject, pname, value);
-}
-
-void Context::initRendererString()
-{
- std::ostringstream rendererString;
- rendererString << "ANGLE (";
- rendererString << mImplementation->getRendererDescription();
- rendererString << ")";
-
- mRendererString = MakeStaticString(rendererString.str());
-}
-
-void Context::initVersionStrings()
-{
- const Version &clientVersion = getClientVersion();
-
- std::ostringstream versionString;
- versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
- << ANGLE_VERSION_STRING << ")";
- mVersionString = MakeStaticString(versionString.str());
-
- std::ostringstream shadingLanguageVersionString;
- shadingLanguageVersionString << "OpenGL ES GLSL ES "
- << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
- << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
- << ")";
- mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
-}
-
-void Context::initExtensionStrings()
-{
- auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
- std::ostringstream combinedStringStream;
- std::copy(strings.begin(), strings.end(),
- std::ostream_iterator<const char *>(combinedStringStream, " "));
- return MakeStaticString(combinedStringStream.str());
- };
-
- mExtensionStrings.clear();
- for (const auto &extensionString : mExtensions.getStrings())
- {
- mExtensionStrings.push_back(MakeStaticString(extensionString));
- }
- mExtensionString = mergeExtensionStrings(mExtensionStrings);
-
- const gl::Extensions &nativeExtensions = mImplementation->getNativeExtensions();
-
- mRequestableExtensionStrings.clear();
- for (const auto &extensionInfo : GetExtensionInfoMap())
- {
- if (extensionInfo.second.Requestable &&
- !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
- nativeExtensions.*(extensionInfo.second.ExtensionsMember))
- {
- mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
- }
- }
- mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
-}
-
-const GLubyte *Context::getString(GLenum name) const
-{
- switch (name)
- {
- case GL_VENDOR:
- return reinterpret_cast<const GLubyte *>("Google Inc.");
-
- case GL_RENDERER:
- return reinterpret_cast<const GLubyte *>(mRendererString);
-
- case GL_VERSION:
- return reinterpret_cast<const GLubyte *>(mVersionString);
-
- case GL_SHADING_LANGUAGE_VERSION:
- return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
-
- case GL_EXTENSIONS:
- return reinterpret_cast<const GLubyte *>(mExtensionString);
-
- case GL_REQUESTABLE_EXTENSIONS_ANGLE:
- return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
-
- default:
- UNREACHABLE();
- return nullptr;
- }
-}
-
-const GLubyte *Context::getStringi(GLenum name, GLuint index) const
-{
- switch (name)
- {
- case GL_EXTENSIONS:
- return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
-
- case GL_REQUESTABLE_EXTENSIONS_ANGLE:
- return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
-
- default:
- UNREACHABLE();
- return nullptr;
- }
-}
-
-size_t Context::getExtensionStringCount() const
-{
- return mExtensionStrings.size();
-}
-
-bool Context::isExtensionRequestable(const char *name)
-{
- const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
- auto extension = extensionInfos.find(name);
-
- const Extensions &nativeExtensions = mImplementation->getNativeExtensions();
- return extension != extensionInfos.end() && extension->second.Requestable &&
- nativeExtensions.*(extension->second.ExtensionsMember);
-}
-
-void Context::requestExtension(const char *name)
-{
- const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
- ASSERT(extensionInfos.find(name) != extensionInfos.end());
- const auto &extension = extensionInfos.at(name);
- ASSERT(extension.Requestable);
- ASSERT(mImplementation->getNativeExtensions().*(extension.ExtensionsMember));
-
- if (mExtensions.*(extension.ExtensionsMember))
- {
- // Extension already enabled
- return;
- }
-
- mExtensions.*(extension.ExtensionsMember) = true;
- updateCaps();
- initExtensionStrings();
-
- // Release the shader compiler so it will be re-created with the requested extensions enabled.
- releaseShaderCompiler();
-
- // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
- // sampleable.
- mState.mTextures->signalAllTexturesDirty();
- for (auto &zeroTexture : mZeroTextures)
- {
- zeroTexture.second->signalDirty(InitState::Initialized);
- }
-
- mState.mFramebuffers->invalidateFramebufferComplenessCache();
-}
-
-size_t Context::getRequestableExtensionStringCount() const
-{
- return mRequestableExtensionStrings.size();
-}
-
-void Context::beginTransformFeedback(GLenum primitiveMode)
-{
- TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
- ASSERT(transformFeedback != nullptr);
- ASSERT(!transformFeedback->isPaused());
-
- transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
-}
-
-bool Context::hasActiveTransformFeedback(GLuint program) const
-{
- for (auto pair : mTransformFeedbackMap)
- {
- if (pair.second != nullptr && pair.second->hasBoundProgram(program))
- {
- return true;
- }
- }
- return false;
-}
-
-void Context::initCaps(const egl::DisplayExtensions &displayExtensions, bool robustResourceInit)
-{
- mCaps = mImplementation->getNativeCaps();
-
- mExtensions = mImplementation->getNativeExtensions();
-
- mLimitations = mImplementation->getNativeLimitations();
-
- if (getClientVersion() < Version(3, 0))
- {
- // Disable ES3+ extensions
- mExtensions.colorBufferFloat = false;
- mExtensions.eglImageExternalEssl3 = false;
- mExtensions.textureNorm16 = false;
- mExtensions.multiview = false;
- mExtensions.maxViews = 1u;
- }
-
- if (getClientVersion() < ES_3_1)
- {
- // Disable ES3.1+ extensions
- mExtensions.geometryShader = false;
- }
-
- if (getClientVersion() > Version(2, 0))
- {
- // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
- // mExtensions.sRGB = false;
- }
-
- // Some extensions are always available because they are implemented in the GL layer.
- mExtensions.bindUniformLocation = true;
- mExtensions.vertexArrayObject = true;
- mExtensions.bindGeneratesResource = true;
- mExtensions.clientArrays = true;
- mExtensions.requestExtension = true;
-
- // Enable the no error extension if the context was created with the flag.
- mExtensions.noError = mSkipValidation;
-
- // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
- mExtensions.surfacelessContext = displayExtensions.surfacelessContext;
-
- // Explicitly enable GL_KHR_debug
- mExtensions.debug = true;
- mExtensions.maxDebugMessageLength = 1024;
- mExtensions.maxDebugLoggedMessages = 1024;
- mExtensions.maxDebugGroupStackDepth = 1024;
- mExtensions.maxLabelLength = 1024;
-
- // Explicitly enable GL_ANGLE_robust_client_memory
- mExtensions.robustClientMemory = true;
-
- // Determine robust resource init availability from EGL.
- mExtensions.robustResourceInitialization = robustResourceInit;
-
- // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
- // supports it.
- mExtensions.robustBufferAccessBehavior =
- mRobustAccess && mExtensions.robustBufferAccessBehavior;
-
- // Enable the cache control query unconditionally.
- mExtensions.programCacheControl = true;
-
- // Apply implementation limits
- LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
-
- if (getClientVersion() < ES_3_1)
- {
- mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
- }
- else
- {
- LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
- }
-
- LimitCap(&mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
- LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
- LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
-
- // Limit textures as well, so we can use fast bitsets with texture bindings.
- LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
- LimitCap(&mCaps.maxVertexTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
- LimitCap(&mCaps.maxTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
-
- mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
-
- // WebGL compatibility
- mExtensions.webglCompatibility = mWebGLContext;
- for (const auto &extensionInfo : GetExtensionInfoMap())
- {
- // If this context is for WebGL, disable all enableable extensions
- if (mWebGLContext && extensionInfo.second.Requestable)
- {
- mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
- }
- }
-
- // Generate texture caps
- updateCaps();
-}
-
-void Context::updateCaps()
-{
- mCaps.compressedTextureFormats.clear();
- mTextureCaps.clear();
-
- for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
- {
- TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
- const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
-
- // Update the format caps based on the client version and extensions.
- // Caps are AND'd with the renderer caps because some core formats are still unsupported in
- // ES3.
- formatCaps.texturable =
- formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
- formatCaps.renderable =
- formatCaps.renderable && formatInfo.renderSupport(getClientVersion(), mExtensions);
- formatCaps.filterable =
- formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
-
- // OpenGL ES does not support multisampling with non-rendererable formats
- // OpenGL ES 3.0 or prior does not support multisampling with integer formats
- if (!formatCaps.renderable ||
- (getClientVersion() < ES_3_1 &&
- (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
- {
- formatCaps.sampleCounts.clear();
- }
- else
- {
- // We may have limited the max samples for some required renderbuffer formats due to
- // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
- GLuint formatMaxSamples = formatCaps.getMaxSamples();
-
- // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
- // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
- // exception of signed and unsigned integer formats."
- if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
- formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
- {
- ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
- mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
- }
-
- // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
- if (getClientVersion() >= ES_3_1)
- {
- // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
- // in these required formats with up to the value of MAX_SAMPLES multisamples, with
- // the exception that the signed and unsigned integer formats are required only to
- // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
- // multisamples, which must be at least one."
- if (formatInfo.componentType == GL_INT ||
- formatInfo.componentType == GL_UNSIGNED_INT)
- {
- mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
- }
-
- // GLES 3.1 section 19.3.1.
- if (formatCaps.texturable)
- {
- if (formatInfo.depthBits > 0)
- {
- mCaps.maxDepthTextureSamples =
- std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
- }
- else if (formatInfo.redBits > 0)
- {
- mCaps.maxColorTextureSamples =
- std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
- }
- }
- }
- }
-
- if (formatCaps.texturable && formatInfo.compressed)
- {
- mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
- }
-
- mTextureCaps.insert(sizedInternalFormat, formatCaps);
- }
-
- // If program binary is disabled, blank out the memory cache pointer.
- if (!mImplementation->getNativeExtensions().getProgramBinary)
- {
- mMemoryProgramCache = nullptr;
- }
-}
-
-void Context::initWorkarounds()
-{
- // Apply back-end workarounds.
- mImplementation->applyNativeWorkarounds(&mWorkarounds);
-
- // Lose the context upon out of memory error if the application is
- // expecting to watch for those events.
- mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
-}
-
-Error Context::prepareForDraw()
-{
- syncRendererState();
-
- if (isRobustResourceInitEnabled())
- {
- ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
- ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
- }
-
- return NoError();
-}
-
-void Context::syncRendererState()
-{
- mGLState.syncDirtyObjects(this);
- const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
- mImplementation->syncState(this, dirtyBits);
- mGLState.clearDirtyBits();
-}
-
-void Context::syncRendererState(const State::DirtyBits &bitMask,
- const State::DirtyObjects &objectMask)
-{
- mGLState.syncDirtyObjects(this, objectMask);
- const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
- mImplementation->syncState(this, dirtyBits);
- mGLState.clearDirtyBits(dirtyBits);
-}
-
-void Context::blitFramebuffer(GLint srcX0,
- GLint srcY0,
- GLint srcX1,
- GLint srcY1,
- GLint dstX0,
- GLint dstY0,
- GLint dstX1,
- GLint dstY1,
- GLbitfield mask,
- GLenum filter)
-{
- Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
- ASSERT(drawFramebuffer);
-
- Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
- Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
-
- syncStateForBlit();
-
- handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
-}
-
-void Context::clear(GLbitfield mask)
-{
- syncStateForClear();
- handleError(mGLState.getDrawFramebuffer()->clear(this, mask));
-}
-
-void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
-{
- syncStateForClear();
- handleError(mGLState.getDrawFramebuffer()->clearBufferfv(this, buffer, drawbuffer, values));
-}
-
-void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
-{
- syncStateForClear();
- handleError(mGLState.getDrawFramebuffer()->clearBufferuiv(this, buffer, drawbuffer, values));
-}
-
-void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
-{
- syncStateForClear();
- handleError(mGLState.getDrawFramebuffer()->clearBufferiv(this, buffer, drawbuffer, values));
-}
-
-void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
- Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
- ASSERT(framebufferObject);
-
- // If a buffer is not present, the clear has no effect
- if (framebufferObject->getDepthbuffer() == nullptr &&
- framebufferObject->getStencilbuffer() == nullptr)
- {
- return;
- }
-
- syncStateForClear();
- handleError(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
-}
-
-void Context::readPixels(GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLenum type,
- void *pixels)
-{
- if (width == 0 || height == 0)
- {
- return;
- }
-
- syncStateForReadPixels();
-
- Framebuffer *readFBO = mGLState.getReadFramebuffer();
- ASSERT(readFBO);
-
- Rectangle area(x, y, width, height);
- handleError(readFBO->readPixels(this, area, format, type, pixels));
-}
-
-void Context::copyTexImage2D(GLenum target,
- GLint level,
- GLenum internalformat,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLint border)
-{
- // Only sync the read FBO
- mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER);
-
- Rectangle sourceArea(x, y, width, height);
-
- Framebuffer *framebuffer = mGLState.getReadFramebuffer();
- Texture *texture =
- getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
- handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
-}
-
-void Context::copyTexSubImage2D(GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height)
-{
- if (width == 0 || height == 0)
- {
- return;
- }
-
- // Only sync the read FBO
- mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER);
-
- Offset destOffset(xoffset, yoffset, 0);
- Rectangle sourceArea(x, y, width, height);
-
- Framebuffer *framebuffer = mGLState.getReadFramebuffer();
- Texture *texture =
- getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
- handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
-}
-
-void Context::copyTexSubImage3D(GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height)
-{
- if (width == 0 || height == 0)
- {
- return;
- }
-
- // Only sync the read FBO
- mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER);
-
- Offset destOffset(xoffset, yoffset, zoffset);
- Rectangle sourceArea(x, y, width, height);
-
- Framebuffer *framebuffer = mGLState.getReadFramebuffer();
- Texture *texture = getTargetTexture(target);
- handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
-}
-
-void Context::framebufferTexture2D(GLenum target,
- GLenum attachment,
- GLenum textarget,
- GLuint texture,
- GLint level)
-{
- Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
- ASSERT(framebuffer);
-
- if (texture != 0)
- {
- Texture *textureObj = getTexture(texture);
-
- ImageIndex index = ImageIndex::MakeInvalid();
-
- if (textarget == GL_TEXTURE_2D)
- {
- index = ImageIndex::Make2D(level);
- }
- else if (textarget == GL_TEXTURE_RECTANGLE_ANGLE)
- {
- index = ImageIndex::MakeRectangle(level);
- }
- else if (textarget == GL_TEXTURE_2D_MULTISAMPLE)
- {
- ASSERT(level == 0);
- index = ImageIndex::Make2DMultisample();
- }
- else
- {
- ASSERT(IsCubeMapTextureTarget(textarget));
- index = ImageIndex::MakeCube(textarget, level);
- }
-
- framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
- }
- else
- {
- framebuffer->resetAttachment(this, attachment);
- }
-
- mGLState.setObjectDirty(target);
-}
-
-void Context::framebufferRenderbuffer(GLenum target,
- GLenum attachment,
- GLenum renderbuffertarget,
- GLuint renderbuffer)
-{
- Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
- ASSERT(framebuffer);
-
- if (renderbuffer != 0)
- {
- Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
-
- framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex::MakeInvalid(),
- renderbufferObject);
- }
- else
- {
- framebuffer->resetAttachment(this, attachment);
- }
-
- mGLState.setObjectDirty(target);
-}
-
-void Context::framebufferTextureLayer(GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLint layer)
-{
- Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
- ASSERT(framebuffer);
-
- if (texture != 0)
- {
- Texture *textureObject = getTexture(texture);
-
- ImageIndex index = ImageIndex::MakeInvalid();
-
- if (textureObject->getTarget() == GL_TEXTURE_3D)
- {
- index = ImageIndex::Make3D(level, layer);
- }
- else
- {
- ASSERT(textureObject->getTarget() == GL_TEXTURE_2D_ARRAY);
- index = ImageIndex::Make2DArray(level, layer);
- }
-
- framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
- }
- else
- {
- framebuffer->resetAttachment(this, attachment);
- }
-
- mGLState.setObjectDirty(target);
-}
-
-void Context::framebufferTextureMultiviewLayeredANGLE(GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLint baseViewIndex,
- GLsizei numViews)
-{
- Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
- ASSERT(framebuffer);
-
- if (texture != 0)
- {
- Texture *textureObj = getTexture(texture);
-
- ImageIndex index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
- framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
- numViews, baseViewIndex);
- }
- else
- {
- framebuffer->resetAttachment(this, attachment);
- }
-
- mGLState.setObjectDirty(target);
-}
-
-void Context::framebufferTextureMultiviewSideBySideANGLE(GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLsizei numViews,
- const GLint *viewportOffsets)
-{
- Framebuffer *framebuffer = mGLState.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);
- }
- else
- {
- framebuffer->resetAttachment(this, attachment);
- }
-
- mGLState.setObjectDirty(target);
-}
-
-void Context::drawBuffers(GLsizei n, const GLenum *bufs)
-{
- Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
- ASSERT(framebuffer);
- framebuffer->setDrawBuffers(n, bufs);
- mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
-}
-
-void Context::readBuffer(GLenum mode)
-{
- Framebuffer *readFBO = mGLState.getReadFramebuffer();
- readFBO->setReadBuffer(mode);
- mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
-}
-
-void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
-{
- // Only sync the FBO
- mGLState.syncDirtyObject(this, target);
-
- Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
- ASSERT(framebuffer);
-
- // The specification isn't clear what should be done when the framebuffer isn't complete.
- // We leave it up to the framebuffer implementation to decide what to do.
- handleError(framebuffer->discard(this, numAttachments, attachments));
-}
-
-void Context::invalidateFramebuffer(GLenum target,
- GLsizei numAttachments,
- const GLenum *attachments)
-{
- // Only sync the FBO
- mGLState.syncDirtyObject(this, target);
-
- Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
- ASSERT(framebuffer);
-
- if (framebuffer->checkStatus(this) != GL_FRAMEBUFFER_COMPLETE)
- {
- return;
- }
-
- handleError(framebuffer->invalidate(this, numAttachments, attachments));
-}
-
-void Context::invalidateSubFramebuffer(GLenum target,
- GLsizei numAttachments,
- const GLenum *attachments,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height)
-{
- // Only sync the FBO
- mGLState.syncDirtyObject(this, target);
-
- Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
- ASSERT(framebuffer);
-
- if (framebuffer->checkStatus(this) != GL_FRAMEBUFFER_COMPLETE)
- {
- return;
- }
-
- Rectangle area(x, y, width, height);
- handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
-}
-
-void Context::texImage2D(GLenum target,
- GLint level,
- GLint internalformat,
- GLsizei width,
- GLsizei height,
- GLint border,
- GLenum format,
- GLenum type,
- const void *pixels)
-{
- syncStateForTexImage();
-
- Extents size(width, height, 1);
- Texture *texture =
- getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
- handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
- size, format, type, reinterpret_cast<const uint8_t *>(pixels)));
-}
-
-void Context::texImage3D(GLenum target,
- GLint level,
- GLint internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLint border,
- GLenum format,
- GLenum type,
- const void *pixels)
-{
- syncStateForTexImage();
-
- Extents size(width, height, depth);
- Texture *texture = getTargetTexture(target);
- handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
- size, format, type, reinterpret_cast<const uint8_t *>(pixels)));
-}
-
-void Context::texSubImage2D(GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLenum type,
- const void *pixels)
-{
- // Zero sized uploads are valid but no-ops
- if (width == 0 || height == 0)
- {
- return;
- }
-
- syncStateForTexImage();
-
- Box area(xoffset, yoffset, 0, width, height, 1);
- Texture *texture =
- getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
- handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
- type, reinterpret_cast<const uint8_t *>(pixels)));
-}
-
-void Context::texSubImage3D(GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLenum format,
- GLenum type,
- const void *pixels)
-{
- // Zero sized uploads are valid but no-ops
- if (width == 0 || height == 0 || depth == 0)
- {
- return;
- }
-
- syncStateForTexImage();
-
- Box area(xoffset, yoffset, zoffset, width, height, depth);
- Texture *texture = getTargetTexture(target);
- handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
- type, reinterpret_cast<const uint8_t *>(pixels)));
-}
-
-void Context::compressedTexImage2D(GLenum target,
- GLint level,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLint border,
- GLsizei imageSize,
- const void *data)
-{
- syncStateForTexImage();
-
- Extents size(width, height, 1);
- Texture *texture =
- getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
- handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
- internalformat, size, imageSize,
- reinterpret_cast<const uint8_t *>(data)));
-}
-
-void Context::compressedTexImage3D(GLenum target,
- GLint level,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLint border,
- GLsizei imageSize,
- const void *data)
-{
- syncStateForTexImage();
-
- Extents size(width, height, depth);
- Texture *texture = getTargetTexture(target);
- handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
- internalformat, size, imageSize,
- reinterpret_cast<const uint8_t *>(data)));
-}
-
-void Context::compressedTexSubImage2D(GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLsizei imageSize,
- const void *data)
-{
- syncStateForTexImage();
-
- Box area(xoffset, yoffset, 0, width, height, 1);
- Texture *texture =
- getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
- handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
- format, imageSize,
- reinterpret_cast<const uint8_t *>(data)));
-}
-
-void Context::compressedTexSubImage3D(GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLenum format,
- GLsizei imageSize,
- const void *data)
-{
- // Zero sized uploads are valid but no-ops
- if (width == 0 || height == 0)
- {
- return;
- }
-
- syncStateForTexImage();
-
- Box area(xoffset, yoffset, zoffset, width, height, depth);
- Texture *texture = getTargetTexture(target);
- handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
- format, imageSize,
- reinterpret_cast<const uint8_t *>(data)));
-}
-
-void Context::generateMipmap(GLenum target)
-{
- Texture *texture = getTargetTexture(target);
- handleError(texture->generateMipmap(this));
-}
-
-void Context::copyTextureCHROMIUM(GLuint sourceId,
- GLint sourceLevel,
- GLenum destTarget,
- GLuint destId,
- GLint destLevel,
- GLint internalFormat,
- GLenum destType,
- GLboolean unpackFlipY,
- GLboolean unpackPremultiplyAlpha,
- GLboolean unpackUnmultiplyAlpha)
-{
- syncStateForTexImage();
-
- gl::Texture *sourceTexture = getTexture(sourceId);
- gl::Texture *destTexture = getTexture(destId);
- handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
- sourceLevel, ConvertToBool(unpackFlipY),
- ConvertToBool(unpackPremultiplyAlpha),
- ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
-}
-
-void Context::copySubTextureCHROMIUM(GLuint sourceId,
- GLint sourceLevel,
- GLenum destTarget,
- GLuint destId,
- GLint destLevel,
- GLint xoffset,
- GLint yoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLboolean unpackFlipY,
- GLboolean unpackPremultiplyAlpha,
- GLboolean unpackUnmultiplyAlpha)
-{
- // Zero sized copies are valid but no-ops
- if (width == 0 || height == 0)
- {
- return;
- }
-
- syncStateForTexImage();
-
- gl::Texture *sourceTexture = getTexture(sourceId);
- gl::Texture *destTexture = getTexture(destId);
- Offset offset(xoffset, yoffset, 0);
- Rectangle area(x, y, width, height);
- handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, area,
- ConvertToBool(unpackFlipY),
- ConvertToBool(unpackPremultiplyAlpha),
- ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
-}
-
-void Context::compressedCopyTextureCHROMIUM(GLuint sourceId, GLuint destId)
-{
- syncStateForTexImage();
-
- gl::Texture *sourceTexture = getTexture(sourceId);
- gl::Texture *destTexture = getTexture(destId);
- handleError(destTexture->copyCompressedTexture(this, sourceTexture));
-}
-
-void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
-{
- Buffer *buffer = mGLState.getTargetBuffer(target);
- ASSERT(buffer);
-
- QueryBufferPointerv(buffer, pname, params);
-}
-
-void *Context::mapBuffer(BufferBinding target, GLenum access)
-{
- Buffer *buffer = mGLState.getTargetBuffer(target);
- ASSERT(buffer);
-
- Error error = buffer->map(this, access);
- if (error.isError())
- {
- handleError(error);
- return nullptr;
- }
-
- return buffer->getMapPointer();
-}
-
-GLboolean Context::unmapBuffer(BufferBinding target)
-{
- Buffer *buffer = mGLState.getTargetBuffer(target);
- ASSERT(buffer);
-
- GLboolean result;
- Error error = buffer->unmap(this, &result);
- if (error.isError())
- {
- handleError(error);
- return GL_FALSE;
- }
-
- return result;
-}
-
-void *Context::mapBufferRange(BufferBinding target,
- GLintptr offset,
- GLsizeiptr length,
- GLbitfield access)
-{
- Buffer *buffer = mGLState.getTargetBuffer(target);
- ASSERT(buffer);
-
- Error error = buffer->mapRange(this, offset, length, access);
- if (error.isError())
- {
- handleError(error);
- return nullptr;
- }
-
- return buffer->getMapPointer();
-}
-
-void Context::flushMappedBufferRange(BufferBinding /*target*/,
- GLintptr /*offset*/,
- GLsizeiptr /*length*/)
-{
- // We do not currently support a non-trivial implementation of FlushMappedBufferRange
-}
-
-void Context::syncStateForReadPixels()
-{
- syncRendererState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
-}
-
-void Context::syncStateForTexImage()
-{
- syncRendererState(mTexImageDirtyBits, mTexImageDirtyObjects);
-}
-
-void Context::syncStateForClear()
-{
- syncRendererState(mClearDirtyBits, mClearDirtyObjects);
-}
-
-void Context::syncStateForBlit()
-{
- syncRendererState(mBlitDirtyBits, mBlitDirtyObjects);
-}
-
-void Context::activeShaderProgram(GLuint pipeline, GLuint program)
-{
- UNIMPLEMENTED();
-}
-
-void Context::activeTexture(GLenum texture)
-{
- mGLState.setActiveSampler(texture - GL_TEXTURE0);
-}
-
-void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
-}
-
-void Context::blendEquation(GLenum mode)
-{
- mGLState.setBlendEquation(mode, mode);
-}
-
-void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
-{
- mGLState.setBlendEquation(modeRGB, modeAlpha);
-}
-
-void Context::blendFunc(GLenum sfactor, GLenum dfactor)
-{
- mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
-}
-
-void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
- mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
-}
-
-void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
- mGLState.setColorClearValue(red, green, blue, alpha);
-}
-
-void Context::clearDepthf(GLfloat depth)
-{
- mGLState.setDepthClearValue(depth);
-}
-
-void Context::clearStencil(GLint s)
-{
- mGLState.setStencilClearValue(s);
-}
-
-void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
- mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
- ConvertToBool(alpha));
-}
-
-void Context::cullFace(CullFaceMode mode)
-{
- mGLState.setCullMode(mode);
-}
-
-void Context::depthFunc(GLenum func)
-{
- mGLState.setDepthFunc(func);
-}
-
-void Context::depthMask(GLboolean flag)
-{
- mGLState.setDepthMask(ConvertToBool(flag));
-}
-
-void Context::depthRangef(GLfloat zNear, GLfloat zFar)
-{
- mGLState.setDepthRange(zNear, zFar);
-}
-
-void Context::disable(GLenum cap)
-{
- mGLState.setEnableFeature(cap, false);
-}
-
-void Context::disableVertexAttribArray(GLuint index)
-{
- mGLState.setEnableVertexAttribArray(index, false);
-}
-
-void Context::enable(GLenum cap)
-{
- mGLState.setEnableFeature(cap, true);
-}
-
-void Context::enableVertexAttribArray(GLuint index)
-{
- mGLState.setEnableVertexAttribArray(index, true);
-}
-
-void Context::frontFace(GLenum mode)
-{
- mGLState.setFrontFace(mode);
-}
-
-void Context::hint(GLenum target, GLenum mode)
-{
- switch (target)
- {
- case GL_GENERATE_MIPMAP_HINT:
- mGLState.setGenerateMipmapHint(mode);
- break;
-
- case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
- mGLState.setFragmentShaderDerivativeHint(mode);
- break;
-
- default:
- UNREACHABLE();
- return;
- }
-}
-
-void Context::lineWidth(GLfloat width)
-{
- mGLState.setLineWidth(width);
-}
-
-void Context::pixelStorei(GLenum pname, GLint param)
-{
- switch (pname)
- {
- case GL_UNPACK_ALIGNMENT:
- mGLState.setUnpackAlignment(param);
- break;
-
- case GL_PACK_ALIGNMENT:
- mGLState.setPackAlignment(param);
- break;
-
- case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
- mGLState.setPackReverseRowOrder(param != 0);
- break;
-
- case GL_UNPACK_ROW_LENGTH:
- ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
- mGLState.setUnpackRowLength(param);
- break;
-
- case GL_UNPACK_IMAGE_HEIGHT:
- ASSERT(getClientMajorVersion() >= 3);
- mGLState.setUnpackImageHeight(param);
- break;
-
- case GL_UNPACK_SKIP_IMAGES:
- ASSERT(getClientMajorVersion() >= 3);
- mGLState.setUnpackSkipImages(param);
- break;
-
- case GL_UNPACK_SKIP_ROWS:
- ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
- mGLState.setUnpackSkipRows(param);
- break;
-
- case GL_UNPACK_SKIP_PIXELS:
- ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
- mGLState.setUnpackSkipPixels(param);
- break;
-
- case GL_PACK_ROW_LENGTH:
- ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
- mGLState.setPackRowLength(param);
- break;
-
- case GL_PACK_SKIP_ROWS:
- ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
- mGLState.setPackSkipRows(param);
- break;
-
- case GL_PACK_SKIP_PIXELS:
- ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
- mGLState.setPackSkipPixels(param);
- break;
-
- default:
- UNREACHABLE();
- return;
- }
-}
-
-void Context::polygonOffset(GLfloat factor, GLfloat units)
-{
- mGLState.setPolygonOffsetParams(factor, units);
-}
-
-void Context::sampleCoverage(GLfloat value, GLboolean invert)
-{
- mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
-}
-
-void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
-{
- mGLState.setSampleMaskParams(maskNumber, mask);
-}
-
-void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- mGLState.setScissorParams(x, y, width, height);
-}
-
-void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
- if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
- {
- mGLState.setStencilParams(func, ref, mask);
- }
-
- if (face == GL_BACK || face == GL_FRONT_AND_BACK)
- {
- mGLState.setStencilBackParams(func, ref, mask);
- }
-}
-
-void Context::stencilMaskSeparate(GLenum face, GLuint mask)
-{
- if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
- {
- mGLState.setStencilWritemask(mask);
- }
-
- if (face == GL_BACK || face == GL_FRONT_AND_BACK)
- {
- mGLState.setStencilBackWritemask(mask);
- }
-}
-
-void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
-{
- if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
- {
- mGLState.setStencilOperations(fail, zfail, zpass);
- }
-
- if (face == GL_BACK || face == GL_FRONT_AND_BACK)
- {
- mGLState.setStencilBackOperations(fail, zfail, zpass);
- }
-}
-
-void Context::vertexAttrib1f(GLuint index, GLfloat x)
-{
- GLfloat vals[4] = {x, 0, 0, 1};
- mGLState.setVertexAttribf(index, vals);
-}
-
-void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
-{
- GLfloat vals[4] = {values[0], 0, 0, 1};
- mGLState.setVertexAttribf(index, vals);
-}
-
-void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
-{
- GLfloat vals[4] = {x, y, 0, 1};
- mGLState.setVertexAttribf(index, vals);
-}
-
-void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
-{
- GLfloat vals[4] = {values[0], values[1], 0, 1};
- mGLState.setVertexAttribf(index, vals);
-}
-
-void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
-{
- GLfloat vals[4] = {x, y, z, 1};
- mGLState.setVertexAttribf(index, vals);
-}
-
-void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
-{
- GLfloat vals[4] = {values[0], values[1], values[2], 1};
- mGLState.setVertexAttribf(index, vals);
-}
-
-void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- GLfloat vals[4] = {x, y, z, w};
- mGLState.setVertexAttribf(index, vals);
-}
-
-void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
-{
- mGLState.setVertexAttribf(index, values);
-}
-
-void Context::vertexAttribPointer(GLuint index,
- GLint size,
- GLenum type,
- GLboolean normalized,
- GLsizei stride,
- const void *ptr)
-{
- mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
- size, type, ConvertToBool(normalized), false, stride, ptr);
-}
-
-void Context::vertexAttribFormat(GLuint attribIndex,
- GLint size,
- GLenum type,
- GLboolean normalized,
- GLuint relativeOffset)
-{
- mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
- relativeOffset);
-}
-
-void Context::vertexAttribIFormat(GLuint attribIndex,
- GLint size,
- GLenum type,
- GLuint relativeOffset)
-{
- mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
-}
-
-void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
-{
- mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
-}
-
-void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
-{
- mGLState.setVertexBindingDivisor(bindingIndex, divisor);
-}
-
-void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- mGLState.setViewportParams(x, y, width, height);
-}
-
-void Context::vertexAttribIPointer(GLuint index,
- GLint size,
- GLenum type,
- GLsizei stride,
- const void *pointer)
-{
- mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
- size, type, false, true, stride, pointer);
-}
-
-void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
-{
- GLint vals[4] = {x, y, z, w};
- mGLState.setVertexAttribi(index, vals);
-}
-
-void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
-{
- GLuint vals[4] = {x, y, z, w};
- mGLState.setVertexAttribu(index, vals);
-}
-
-void Context::vertexAttribI4iv(GLuint index, const GLint *v)
-{
- mGLState.setVertexAttribi(index, v);
-}
-
-void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
-{
- mGLState.setVertexAttribu(index, v);
-}
-
-void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
-{
- const VertexAttribCurrentValueData &currentValues =
- getGLState().getVertexAttribCurrentValue(index);
- const VertexArray *vao = getGLState().getVertexArray();
- QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
- currentValues, pname, params);
-}
-
-void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
-{
- const VertexAttribCurrentValueData &currentValues =
- getGLState().getVertexAttribCurrentValue(index);
- const VertexArray *vao = getGLState().getVertexArray();
- QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
- currentValues, pname, params);
-}
-
-void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
-{
- const VertexAttribCurrentValueData &currentValues =
- getGLState().getVertexAttribCurrentValue(index);
- const VertexArray *vao = getGLState().getVertexArray();
- QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
- currentValues, pname, params);
-}
-
-void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
-{
- const VertexAttribCurrentValueData &currentValues =
- getGLState().getVertexAttribCurrentValue(index);
- const VertexArray *vao = getGLState().getVertexArray();
- QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
- currentValues, pname, params);
-}
-
-void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
-{
- const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
- QueryVertexAttribPointerv(attrib, pname, pointer);
-}
-
-void Context::debugMessageControl(GLenum source,
- GLenum type,
- GLenum severity,
- GLsizei count,
- const GLuint *ids,
- GLboolean enabled)
-{
- std::vector<GLuint> idVector(ids, ids + count);
- mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
- ConvertToBool(enabled));
-}
-
-void Context::debugMessageInsert(GLenum source,
- GLenum type,
- GLuint id,
- GLenum severity,
- GLsizei length,
- const GLchar *buf)
-{
- std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
- mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
-}
-
-void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
-{
- mGLState.getDebug().setCallback(callback, userParam);
-}
-
-GLuint Context::getDebugMessageLog(GLuint count,
- GLsizei bufSize,
- GLenum *sources,
- GLenum *types,
- GLuint *ids,
- GLenum *severities,
- GLsizei *lengths,
- GLchar *messageLog)
-{
- return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
- severities, lengths, messageLog));
-}
-
-void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
-{
- std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
- mGLState.getDebug().pushGroup(source, id, std::move(msg));
- mImplementation->pushDebugGroup(source, id, length, message);
-}
-
-void Context::popDebugGroup()
-{
- mGLState.getDebug().popGroup();
- mImplementation->popDebugGroup();
-}
-
-void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
-{
- Buffer *buffer = mGLState.getTargetBuffer(target);
- ASSERT(buffer);
- handleError(buffer->bufferData(this, target, data, size, usage));
-}
-
-void Context::bufferSubData(BufferBinding target,
- GLintptr offset,
- GLsizeiptr size,
- const void *data)
-{
- if (data == nullptr)
- {
- return;
- }
-
- Buffer *buffer = mGLState.getTargetBuffer(target);
- ASSERT(buffer);
- handleError(buffer->bufferSubData(this, target, data, size, offset));
-}
-
-void Context::attachShader(GLuint program, GLuint shader)
-{
- Program *programObject = mState.mShaderPrograms->getProgram(program);
- Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
- ASSERT(programObject && shaderObject);
- programObject->attachShader(shaderObject);
-}
-
-const Workarounds &Context::getWorkarounds() const
-{
- return mWorkarounds;
-}
-
-void Context::copyBufferSubData(BufferBinding readTarget,
- BufferBinding writeTarget,
- GLintptr readOffset,
- GLintptr writeOffset,
- GLsizeiptr size)
-{
- // if size is zero, the copy is a successful no-op
- if (size == 0)
- {
- return;
- }
-
- // TODO(jmadill): cache these.
- Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
- Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
-
- handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
-}
-
-void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
-{
- Program *programObject = getProgram(program);
- // TODO(jmadill): Re-use this from the validation if possible.
- ASSERT(programObject);
- programObject->bindAttributeLocation(index, name);
-}
-
-void Context::bindBuffer(BufferBinding target, GLuint buffer)
-{
- Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
- mGLState.setBufferBinding(this, target, bufferObject);
-}
-
-void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
-{
- bindBufferRange(target, index, buffer, 0, 0);
-}
-
-void Context::bindBufferRange(BufferBinding target,
- GLuint index,
- GLuint buffer,
- GLintptr offset,
- GLsizeiptr size)
-{
- Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
- mGLState.setIndexedBufferBinding(this, target, index, bufferObject, offset, size);
-}
-
-void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
-{
- if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
- {
- bindReadFramebuffer(framebuffer);
- }
-
- if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
- {
- bindDrawFramebuffer(framebuffer);
- }
-}
-
-void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
- ASSERT(target == GL_RENDERBUFFER);
- Renderbuffer *object =
- mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
- mGLState.setRenderbufferBinding(this, object);
-}
-
-void Context::texStorage2DMultisample(GLenum target,
- GLsizei samples,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLboolean fixedsamplelocations)
-{
- Extents size(width, height, 1);
- Texture *texture = getTargetTexture(target);
- handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
- ConvertToBool(fixedsamplelocations)));
-}
-
-void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
-{
- // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
- // the sample position should be queried by DRAW_FRAMEBUFFER.
- mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER);
- const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
-
- switch (pname)
- {
- case GL_SAMPLE_POSITION:
- handleError(framebuffer->getSamplePosition(index, val));
- break;
- default:
- UNREACHABLE();
- }
-}
-
-void Context::renderbufferStorage(GLenum target,
- GLenum internalformat,
- GLsizei width,
- GLsizei height)
-{
- // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
- GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
-
- Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
- handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
-}
-
-void Context::renderbufferStorageMultisample(GLenum target,
- GLsizei samples,
- GLenum internalformat,
- GLsizei width,
- GLsizei height)
-{
- // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
- GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
-
- Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
- handleError(
- renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
-}
-
-void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
- const Sync *syncObject = getSync(sync);
- handleError(QuerySynciv(syncObject, pname, bufSize, length, values));
-}
-
-void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
- Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
- QueryFramebufferParameteriv(framebuffer, pname, params);
-}
-
-void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
-{
- Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
- SetFramebufferParameteri(framebuffer, pname, param);
-}
-
-Error Context::getScratchBuffer(size_t requstedSizeBytes,
- angle::MemoryBuffer **scratchBufferOut) const
-{
- if (!mScratchBuffer.get(requstedSizeBytes, scratchBufferOut))
- {
- return OutOfMemory() << "Failed to allocate internal buffer.";
- }
- return NoError();
-}
-
-Error Context::getZeroFilledBuffer(size_t requstedSizeBytes,
- angle::MemoryBuffer **zeroBufferOut) const
-{
- if (!mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0))
- {
- return OutOfMemory() << "Failed to allocate internal buffer.";
- }
- return NoError();
-}
-
-void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
-{
- if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
- {
- return;
- }
-
- // TODO(jmadill): Dirty bits for compute.
- if (isRobustResourceInitEnabled())
- {
- ANGLE_CONTEXT_TRY(mGLState.clearUnclearedActiveTextures(this));
- }
-
- handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
-}
-
-void Context::dispatchComputeIndirect(GLintptr indirect)
-{
- UNIMPLEMENTED();
-}
-
-void Context::texStorage2D(GLenum target,
- GLsizei levels,
- GLenum internalFormat,
- GLsizei width,
- GLsizei height)
-{
- Extents size(width, height, 1);
- Texture *texture = getTargetTexture(target);
- handleError(texture->setStorage(this, target, levels, internalFormat, size));
-}
-
-void Context::texStorage3D(GLenum target,
- GLsizei levels,
- GLenum internalFormat,
- GLsizei width,
- GLsizei height,
- GLsizei depth)
-{
- Extents size(width, height, depth);
- Texture *texture = getTargetTexture(target);
- handleError(texture->setStorage(this, target, levels, internalFormat, size));
-}
-
-void Context::memoryBarrier(GLbitfield barriers)
-{
- UNIMPLEMENTED();
-}
-
-void Context::memoryBarrierByRegion(GLbitfield barriers)
-{
- UNIMPLEMENTED();
-}
-
-GLenum Context::checkFramebufferStatus(GLenum target)
-{
- Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
- ASSERT(framebuffer);
-
- return framebuffer->checkStatus(this);
-}
-
-void Context::compileShader(GLuint shader)
-{
- Shader *shaderObject = GetValidShader(this, shader);
- if (!shaderObject)
- {
- return;
- }
- shaderObject->compile(this);
-}
-
-void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
-{
- for (int i = 0; i < n; i++)
- {
- deleteBuffer(buffers[i]);
- }
-}
-
-void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
- for (int i = 0; i < n; i++)
- {
- if (framebuffers[i] != 0)
- {
- deleteFramebuffer(framebuffers[i]);
- }
- }
-}
-
-void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
- for (int i = 0; i < n; i++)
- {
- deleteRenderbuffer(renderbuffers[i]);
- }
-}
-
-void Context::deleteTextures(GLsizei n, const GLuint *textures)
-{
- for (int i = 0; i < n; i++)
- {
- if (textures[i] != 0)
- {
- deleteTexture(textures[i]);
- }
- }
-}
-
-void Context::detachShader(GLuint program, GLuint shader)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
-
- Shader *shaderObject = getShader(shader);
- ASSERT(shaderObject);
-
- programObject->detachShader(this, shaderObject);
-}
-
-void Context::genBuffers(GLsizei n, GLuint *buffers)
-{
- for (int i = 0; i < n; i++)
- {
- buffers[i] = createBuffer();
- }
-}
-
-void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
-{
- for (int i = 0; i < n; i++)
- {
- framebuffers[i] = createFramebuffer();
- }
-}
-
-void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
- for (int i = 0; i < n; i++)
- {
- renderbuffers[i] = createRenderbuffer();
- }
-}
-
-void Context::genTextures(GLsizei n, GLuint *textures)
-{
- for (int i = 0; i < n; i++)
- {
- textures[i] = createTexture();
- }
-}
-
-void Context::getActiveAttrib(GLuint program,
- GLuint index,
- GLsizei bufsize,
- GLsizei *length,
- GLint *size,
- GLenum *type,
- GLchar *name)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->getActiveAttribute(index, bufsize, length, size, type, name);
-}
-
-void Context::getActiveUniform(GLuint program,
- GLuint index,
- GLsizei bufsize,
- GLsizei *length,
- GLint *size,
- GLenum *type,
- GLchar *name)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->getActiveUniform(index, bufsize, length, size, type, name);
-}
-
-void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->getAttachedShaders(maxcount, count, shaders);
-}
-
-GLint Context::getAttribLocation(GLuint program, const GLchar *name)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- return programObject->getAttributeLocation(name);
-}
-
-void Context::getBooleanv(GLenum pname, GLboolean *params)
-{
- GLenum nativeType;
- unsigned int numParams = 0;
- getQueryParameterInfo(pname, &nativeType, &numParams);
-
- if (nativeType == GL_BOOL)
- {
- getBooleanvImpl(pname, params);
- }
- else
- {
- CastStateValues(this, nativeType, pname, numParams, params);
- }
-}
-
-void Context::getFloatv(GLenum pname, GLfloat *params)
-{
- GLenum nativeType;
- unsigned int numParams = 0;
- getQueryParameterInfo(pname, &nativeType, &numParams);
-
- if (nativeType == GL_FLOAT)
- {
- getFloatvImpl(pname, params);
- }
- else
- {
- CastStateValues(this, nativeType, pname, numParams, params);
- }
-}
-
-void Context::getIntegerv(GLenum pname, GLint *params)
-{
- GLenum nativeType;
- unsigned int numParams = 0;
- getQueryParameterInfo(pname, &nativeType, &numParams);
-
- if (nativeType == GL_INT)
- {
- getIntegervImpl(pname, params);
- }
- else
- {
- CastStateValues(this, nativeType, pname, numParams, params);
- }
-}
-
-void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- QueryProgramiv(this, programObject, pname, params);
-}
-
-void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
-{
- UNIMPLEMENTED();
-}
-
-void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->getInfoLog(bufsize, length, infolog);
-}
-
-void Context::getProgramPipelineInfoLog(GLuint pipeline,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *infoLog)
-{
- UNIMPLEMENTED();
-}
-
-void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
-{
- Shader *shaderObject = getShader(shader);
- ASSERT(shaderObject);
- QueryShaderiv(this, shaderObject, pname, params);
-}
-
-void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
-{
- Shader *shaderObject = getShader(shader);
- ASSERT(shaderObject);
- shaderObject->getInfoLog(this, bufsize, length, infolog);
-}
-
-void Context::getShaderPrecisionFormat(GLenum shadertype,
- GLenum precisiontype,
- GLint *range,
- GLint *precision)
-{
- // TODO(jmadill): Compute shaders.
-
- switch (shadertype)
- {
- case GL_VERTEX_SHADER:
- switch (precisiontype)
- {
- case GL_LOW_FLOAT:
- mCaps.vertexLowpFloat.get(range, precision);
- break;
- case GL_MEDIUM_FLOAT:
- mCaps.vertexMediumpFloat.get(range, precision);
- break;
- case GL_HIGH_FLOAT:
- mCaps.vertexHighpFloat.get(range, precision);
- break;
-
- case GL_LOW_INT:
- mCaps.vertexLowpInt.get(range, precision);
- break;
- case GL_MEDIUM_INT:
- mCaps.vertexMediumpInt.get(range, precision);
- break;
- case GL_HIGH_INT:
- mCaps.vertexHighpInt.get(range, precision);
- break;
-
- default:
- UNREACHABLE();
- return;
- }
- break;
-
- case GL_FRAGMENT_SHADER:
- switch (precisiontype)
- {
- case GL_LOW_FLOAT:
- mCaps.fragmentLowpFloat.get(range, precision);
- break;
- case GL_MEDIUM_FLOAT:
- mCaps.fragmentMediumpFloat.get(range, precision);
- break;
- case GL_HIGH_FLOAT:
- mCaps.fragmentHighpFloat.get(range, precision);
- break;
-
- case GL_LOW_INT:
- mCaps.fragmentLowpInt.get(range, precision);
- break;
- case GL_MEDIUM_INT:
- mCaps.fragmentMediumpInt.get(range, precision);
- break;
- case GL_HIGH_INT:
- mCaps.fragmentHighpInt.get(range, precision);
- break;
-
- default:
- UNREACHABLE();
- return;
- }
- break;
-
- default:
- UNREACHABLE();
- return;
- }
-}
-
-void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
-{
- Shader *shaderObject = getShader(shader);
- ASSERT(shaderObject);
- shaderObject->getSource(bufsize, length, source);
-}
-
-void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->getUniformfv(this, location, params);
-}
-
-void Context::getUniformiv(GLuint program, GLint location, GLint *params)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->getUniformiv(this, location, params);
-}
-
-GLint Context::getUniformLocation(GLuint program, const GLchar *name)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- return programObject->getUniformLocation(name);
-}
-
-GLboolean Context::isBuffer(GLuint buffer)
-{
- if (buffer == 0)
- {
- return GL_FALSE;
- }
-
- return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
-}
-
-GLboolean Context::isEnabled(GLenum cap)
-{
- return mGLState.getEnableFeature(cap);
-}
-
-GLboolean Context::isFramebuffer(GLuint framebuffer)
-{
- if (framebuffer == 0)
- {
- return GL_FALSE;
- }
-
- return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
-}
-
-GLboolean Context::isProgram(GLuint program)
-{
- if (program == 0)
- {
- return GL_FALSE;
- }
-
- return (getProgram(program) ? GL_TRUE : GL_FALSE);
-}
-
-GLboolean Context::isRenderbuffer(GLuint renderbuffer)
-{
- if (renderbuffer == 0)
- {
- return GL_FALSE;
- }
-
- return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
-}
-
-GLboolean Context::isShader(GLuint shader)
-{
- if (shader == 0)
- {
- return GL_FALSE;
- }
-
- return (getShader(shader) ? GL_TRUE : GL_FALSE);
-}
-
-GLboolean Context::isTexture(GLuint texture)
-{
- if (texture == 0)
- {
- return GL_FALSE;
- }
-
- return (getTexture(texture) ? GL_TRUE : GL_FALSE);
-}
-
-void Context::linkProgram(GLuint program)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- handleError(programObject->link(this));
- mGLState.onProgramExecutableChange(programObject);
-}
-
-void Context::releaseShaderCompiler()
-{
- mCompiler.set(this, nullptr);
-}
-
-void Context::shaderBinary(GLsizei n,
- const GLuint *shaders,
- GLenum binaryformat,
- const void *binary,
- GLsizei length)
-{
- // No binary shader formats are supported.
- UNIMPLEMENTED();
-}
-
-void Context::shaderSource(GLuint shader,
- GLsizei count,
- const GLchar *const *string,
- const GLint *length)
-{
- Shader *shaderObject = getShader(shader);
- ASSERT(shaderObject);
- shaderObject->setSource(count, string, length);
-}
-
-void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
-}
-
-void Context::stencilMask(GLuint mask)
-{
- stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
-}
-
-void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
- stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
-}
-
-void Context::uniform1f(GLint location, GLfloat x)
-{
- Program *program = mGLState.getProgram();
- program->setUniform1fv(location, 1, &x);
-}
-
-void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
-{
- Program *program = mGLState.getProgram();
- program->setUniform1fv(location, count, v);
-}
-
-void Context::uniform1i(GLint location, GLint x)
-{
- Program *program = mGLState.getProgram();
- if (program->setUniform1iv(location, 1, &x) == Program::SetUniformResult::SamplerChanged)
- {
- mGLState.setObjectDirty(GL_PROGRAM);
- }
-}
-
-void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
-{
- Program *program = mGLState.getProgram();
- if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
- {
- mGLState.setObjectDirty(GL_PROGRAM);
- }
-}
-
-void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
-{
- GLfloat xy[2] = {x, y};
- Program *program = mGLState.getProgram();
- program->setUniform2fv(location, 1, xy);
-}
-
-void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
-{
- Program *program = mGLState.getProgram();
- program->setUniform2fv(location, count, v);
-}
-
-void Context::uniform2i(GLint location, GLint x, GLint y)
-{
- GLint xy[2] = {x, y};
- Program *program = mGLState.getProgram();
- program->setUniform2iv(location, 1, xy);
-}
-
-void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
-{
- Program *program = mGLState.getProgram();
- program->setUniform2iv(location, count, v);
-}
-
-void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
-{
- GLfloat xyz[3] = {x, y, z};
- Program *program = mGLState.getProgram();
- program->setUniform3fv(location, 1, xyz);
-}
-
-void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
-{
- Program *program = mGLState.getProgram();
- program->setUniform3fv(location, count, v);
-}
-
-void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
-{
- GLint xyz[3] = {x, y, z};
- Program *program = mGLState.getProgram();
- program->setUniform3iv(location, 1, xyz);
-}
-
-void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
-{
- Program *program = mGLState.getProgram();
- program->setUniform3iv(location, count, v);
-}
-
-void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
- GLfloat xyzw[4] = {x, y, z, w};
- Program *program = mGLState.getProgram();
- program->setUniform4fv(location, 1, xyzw);
-}
-
-void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
-{
- Program *program = mGLState.getProgram();
- program->setUniform4fv(location, count, v);
-}
-
-void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
-{
- GLint xyzw[4] = {x, y, z, w};
- Program *program = mGLState.getProgram();
- program->setUniform4iv(location, 1, xyzw);
-}
-
-void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
-{
- Program *program = mGLState.getProgram();
- program->setUniform4iv(location, count, v);
-}
-
-void Context::uniformMatrix2fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- Program *program = mGLState.getProgram();
- program->setUniformMatrix2fv(location, count, transpose, value);
-}
-
-void Context::uniformMatrix3fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- Program *program = mGLState.getProgram();
- program->setUniformMatrix3fv(location, count, transpose, value);
-}
-
-void Context::uniformMatrix4fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- Program *program = mGLState.getProgram();
- program->setUniformMatrix4fv(location, count, transpose, value);
-}
-
-void Context::validateProgram(GLuint program)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->validate(mCaps);
-}
-
-void Context::validateProgramPipeline(GLuint pipeline)
-{
- UNIMPLEMENTED();
-}
-
-void Context::getProgramBinary(GLuint program,
- GLsizei bufSize,
- GLsizei *length,
- GLenum *binaryFormat,
- void *binary)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject != nullptr);
-
- handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
-}
-
-void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject != nullptr);
-
- handleError(programObject->loadBinary(this, binaryFormat, binary, length));
-}
-
-void Context::uniform1ui(GLint location, GLuint v0)
-{
- Program *program = mGLState.getProgram();
- program->setUniform1uiv(location, 1, &v0);
-}
-
-void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
-{
- Program *program = mGLState.getProgram();
- const GLuint xy[] = {v0, v1};
- program->setUniform2uiv(location, 1, xy);
-}
-
-void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- Program *program = mGLState.getProgram();
- const GLuint xyz[] = {v0, v1, v2};
- program->setUniform3uiv(location, 1, xyz);
-}
-
-void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
- Program *program = mGLState.getProgram();
- const GLuint xyzw[] = {v0, v1, v2, v3};
- program->setUniform4uiv(location, 1, xyzw);
-}
-
-void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
- Program *program = mGLState.getProgram();
- program->setUniform1uiv(location, count, value);
-}
-void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
- Program *program = mGLState.getProgram();
- program->setUniform2uiv(location, count, value);
-}
-
-void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
- Program *program = mGLState.getProgram();
- program->setUniform3uiv(location, count, value);
-}
-
-void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
- Program *program = mGLState.getProgram();
- program->setUniform4uiv(location, count, value);
-}
-
-void Context::genQueries(GLsizei n, GLuint *ids)
-{
- for (GLsizei i = 0; i < n; i++)
- {
- GLuint handle = mQueryHandleAllocator.allocate();
- mQueryMap.assign(handle, nullptr);
- ids[i] = handle;
- }
-}
-
-void Context::deleteQueries(GLsizei n, const GLuint *ids)
-{
- for (int i = 0; i < n; i++)
- {
- GLuint query = ids[i];
-
- Query *queryObject = nullptr;
- if (mQueryMap.erase(query, &queryObject))
- {
- mQueryHandleAllocator.release(query);
- if (queryObject)
- {
- queryObject->release(this);
- }
- }
- }
-}
-
-GLboolean Context::isQuery(GLuint id)
-{
- return (getQuery(id, false, GL_NONE) != nullptr) ? GL_TRUE : GL_FALSE;
-}
-
-void Context::uniformMatrix2x3fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- Program *program = mGLState.getProgram();
- program->setUniformMatrix2x3fv(location, count, transpose, value);
-}
-
-void Context::uniformMatrix3x2fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- Program *program = mGLState.getProgram();
- program->setUniformMatrix3x2fv(location, count, transpose, value);
-}
-
-void Context::uniformMatrix2x4fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- Program *program = mGLState.getProgram();
- program->setUniformMatrix2x4fv(location, count, transpose, value);
-}
-
-void Context::uniformMatrix4x2fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- Program *program = mGLState.getProgram();
- program->setUniformMatrix4x2fv(location, count, transpose, value);
-}
-
-void Context::uniformMatrix3x4fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- Program *program = mGLState.getProgram();
- program->setUniformMatrix3x4fv(location, count, transpose, value);
-}
-
-void Context::uniformMatrix4x3fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- Program *program = mGLState.getProgram();
- program->setUniformMatrix4x3fv(location, count, transpose, value);
-}
-
-void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
-{
- for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
- {
- GLuint vertexArray = arrays[arrayIndex];
-
- if (arrays[arrayIndex] != 0)
- {
- VertexArray *vertexArrayObject = nullptr;
- if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
- {
- if (vertexArrayObject != nullptr)
- {
- detachVertexArray(vertexArray);
- vertexArrayObject->onDestroy(this);
- }
-
- mVertexArrayHandleAllocator.release(vertexArray);
- }
- }
- }
-}
-
-void Context::genVertexArrays(GLsizei n, GLuint *arrays)
-{
- for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
- {
- GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
- mVertexArrayMap.assign(vertexArray, nullptr);
- arrays[arrayIndex] = vertexArray;
- }
-}
-
-bool Context::isVertexArray(GLuint array)
-{
- if (array == 0)
- {
- return GL_FALSE;
- }
-
- VertexArray *vao = getVertexArray(array);
- return (vao != nullptr ? GL_TRUE : GL_FALSE);
-}
-
-void Context::endTransformFeedback()
-{
- TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
- transformFeedback->end(this);
-}
-
-void Context::transformFeedbackVaryings(GLuint program,
- GLsizei count,
- const GLchar *const *varyings,
- GLenum bufferMode)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
-}
-
-void Context::getTransformFeedbackVarying(GLuint program,
- GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLsizei *size,
- GLenum *type,
- GLchar *name)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
-}
-
-void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
-{
- for (int i = 0; i < n; i++)
- {
- GLuint transformFeedback = ids[i];
- if (transformFeedback == 0)
- {
- continue;
- }
-
- TransformFeedback *transformFeedbackObject = nullptr;
- if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
- {
- if (transformFeedbackObject != nullptr)
- {
- detachTransformFeedback(transformFeedback);
- transformFeedbackObject->release(this);
- }
-
- mTransformFeedbackHandleAllocator.release(transformFeedback);
- }
- }
-}
-
-void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
-{
- for (int i = 0; i < n; i++)
- {
- GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
- mTransformFeedbackMap.assign(transformFeedback, nullptr);
- ids[i] = transformFeedback;
- }
-}
-
-bool Context::isTransformFeedback(GLuint id)
-{
- if (id == 0)
- {
- // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
- // returns FALSE
- return GL_FALSE;
- }
-
- const TransformFeedback *transformFeedback = getTransformFeedback(id);
- return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
-}
-
-void Context::pauseTransformFeedback()
-{
- TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
- transformFeedback->pause();
-}
-
-void Context::resumeTransformFeedback()
-{
- TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
- transformFeedback->resume();
-}
-
-void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
-{
- const Program *programObject = getProgram(program);
- programObject->getUniformuiv(this, location, params);
-}
-
-GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
-{
- const Program *programObject = getProgram(program);
- return programObject->getFragDataLocation(name);
-}
-
-void Context::getUniformIndices(GLuint program,
- GLsizei uniformCount,
- const GLchar *const *uniformNames,
- GLuint *uniformIndices)
-{
- const Program *programObject = getProgram(program);
- if (!programObject->isLinked())
- {
- for (int uniformId = 0; uniformId < uniformCount; uniformId++)
- {
- uniformIndices[uniformId] = GL_INVALID_INDEX;
- }
- }
- else
- {
- for (int uniformId = 0; uniformId < uniformCount; uniformId++)
- {
- uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
- }
- }
-}
-
-void Context::getActiveUniformsiv(GLuint program,
- GLsizei uniformCount,
- const GLuint *uniformIndices,
- GLenum pname,
- GLint *params)
-{
- const Program *programObject = getProgram(program);
- for (int uniformId = 0; uniformId < uniformCount; uniformId++)
- {
- const GLuint index = uniformIndices[uniformId];
- params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
- }
-}
-
-GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
-{
- const Program *programObject = getProgram(program);
- return programObject->getUniformBlockIndex(uniformBlockName);
-}
-
-void Context::getActiveUniformBlockiv(GLuint program,
- GLuint uniformBlockIndex,
- GLenum pname,
- GLint *params)
-{
- const Program *programObject = getProgram(program);
- QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
-}
-
-void Context::getActiveUniformBlockName(GLuint program,
- GLuint uniformBlockIndex,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *uniformBlockName)
-{
- const Program *programObject = getProgram(program);
- programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
-}
-
-void Context::uniformBlockBinding(GLuint program,
- GLuint uniformBlockIndex,
- GLuint uniformBlockBinding)
-{
- Program *programObject = getProgram(program);
- programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
-}
-
-GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
-{
- GLuint handle = mState.mSyncs->createSync(mImplementation.get());
- GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
-
- Sync *syncObject = getSync(syncHandle);
- Error error = syncObject->set(condition, flags);
- if (error.isError())
- {
- deleteSync(syncHandle);
- handleError(error);
- return nullptr;
- }
-
- return syncHandle;
-}
-
-GLboolean Context::isSync(GLsync sync)
-{
- return (getSync(sync) != nullptr);
-}
-
-GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- Sync *syncObject = getSync(sync);
-
- GLenum result = GL_WAIT_FAILED;
- handleError(syncObject->clientWait(flags, timeout, &result));
- return result;
-}
-
-void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- Sync *syncObject = getSync(sync);
- handleError(syncObject->serverWait(flags, timeout));
-}
-
-void Context::getInteger64v(GLenum pname, GLint64 *params)
-{
- GLenum nativeType = GL_NONE;
- unsigned int numParams = 0;
- getQueryParameterInfo(pname, &nativeType, &numParams);
-
- if (nativeType == GL_INT_64_ANGLEX)
- {
- getInteger64vImpl(pname, params);
- }
- else
- {
- CastStateValues(this, nativeType, pname, numParams, params);
- }
-}
-
-void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
-{
- Buffer *buffer = mGLState.getTargetBuffer(target);
- QueryBufferParameteri64v(buffer, pname, params);
-}
-
-void Context::genSamplers(GLsizei count, GLuint *samplers)
-{
- for (int i = 0; i < count; i++)
- {
- samplers[i] = mState.mSamplers->createSampler();
- }
-}
-
-void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
-{
- for (int i = 0; i < count; i++)
- {
- GLuint sampler = samplers[i];
-
- if (mState.mSamplers->getSampler(sampler))
- {
- detachSampler(sampler);
- }
-
- mState.mSamplers->deleteObject(this, sampler);
- }
-}
-
-void Context::getInternalformativ(GLenum target,
- GLenum internalformat,
- GLenum pname,
- GLsizei bufSize,
- GLint *params)
-{
- const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
- QueryInternalFormativ(formatCaps, pname, bufSize, params);
-}
-
-void Context::programUniform1i(GLuint program, GLint location, GLint v0)
-{
- programUniform1iv(program, location, 1, &v0);
-}
-
-void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
-{
- GLint xy[2] = {v0, v1};
- programUniform2iv(program, location, 1, xy);
-}
-
-void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
-{
- GLint xyz[3] = {v0, v1, v2};
- programUniform3iv(program, location, 1, xyz);
-}
-
-void Context::programUniform4i(GLuint program,
- GLint location,
- GLint v0,
- GLint v1,
- GLint v2,
- GLint v3)
-{
- GLint xyzw[4] = {v0, v1, v2, v3};
- programUniform4iv(program, location, 1, xyzw);
-}
-
-void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
-{
- programUniform1uiv(program, location, 1, &v0);
-}
-
-void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
-{
- GLuint xy[2] = {v0, v1};
- programUniform2uiv(program, location, 1, xy);
-}
-
-void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- GLuint xyz[3] = {v0, v1, v2};
- programUniform3uiv(program, location, 1, xyz);
-}
-
-void Context::programUniform4ui(GLuint program,
- GLint location,
- GLuint v0,
- GLuint v1,
- GLuint v2,
- GLuint v3)
-{
- GLuint xyzw[4] = {v0, v1, v2, v3};
- programUniform4uiv(program, location, 1, xyzw);
-}
-
-void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
-{
- programUniform1fv(program, location, 1, &v0);
-}
-
-void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
-{
- GLfloat xy[2] = {v0, v1};
- programUniform2fv(program, location, 1, xy);
-}
-
-void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
- GLfloat xyz[3] = {v0, v1, v2};
- programUniform3fv(program, location, 1, xyz);
-}
-
-void Context::programUniform4f(GLuint program,
- GLint location,
- GLfloat v0,
- GLfloat v1,
- GLfloat v2,
- GLfloat v3)
-{
- GLfloat xyzw[4] = {v0, v1, v2, v3};
- programUniform4fv(program, location, 1, xyzw);
-}
-
-void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- if (programObject->setUniform1iv(location, count, value) ==
- Program::SetUniformResult::SamplerChanged)
- {
- mGLState.setObjectDirty(GL_PROGRAM);
- }
-}
-
-void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniform2iv(location, count, value);
-}
-
-void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniform3iv(location, count, value);
-}
-
-void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniform4iv(location, count, value);
-}
-
-void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniform1uiv(location, count, value);
-}
-
-void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniform2uiv(location, count, value);
-}
-
-void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniform3uiv(location, count, value);
-}
-
-void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniform4uiv(location, count, value);
-}
-
-void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniform1fv(location, count, value);
-}
-
-void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniform2fv(location, count, value);
-}
-
-void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniform3fv(location, count, value);
-}
-
-void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniform4fv(location, count, value);
-}
-
-void Context::programUniformMatrix2fv(GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniformMatrix2fv(location, count, transpose, value);
-}
-
-void Context::programUniformMatrix3fv(GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniformMatrix3fv(location, count, transpose, value);
-}
-
-void Context::programUniformMatrix4fv(GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniformMatrix4fv(location, count, transpose, value);
-}
-
-void Context::programUniformMatrix2x3fv(GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniformMatrix2x3fv(location, count, transpose, value);
-}
-
-void Context::programUniformMatrix3x2fv(GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniformMatrix3x2fv(location, count, transpose, value);
-}
-
-void Context::programUniformMatrix2x4fv(GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniformMatrix2x4fv(location, count, transpose, value);
-}
-
-void Context::programUniformMatrix4x2fv(GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniformMatrix4x2fv(location, count, transpose, value);
-}
-
-void Context::programUniformMatrix3x4fv(GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniformMatrix3x4fv(location, count, transpose, value);
-}
-
-void Context::programUniformMatrix4x3fv(GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- Program *programObject = getProgram(program);
- ASSERT(programObject);
- programObject->setUniformMatrix4x3fv(location, count, transpose, value);
-}
-
-void Context::onTextureChange(const Texture *texture)
-{
- // Conservatively assume all textures are dirty.
- // TODO(jmadill): More fine-grained update.
- mGLState.setObjectDirty(GL_TEXTURE);
-}
-
-void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
-{
- for (int i = 0; i < count; i++)
- {
- pipelines[i] = createProgramPipeline();
- }
-}
-
-void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
-{
- for (int i = 0; i < count; i++)
- {
- if (pipelines[i] != 0)
- {
- deleteProgramPipeline(pipelines[i]);
- }
- }
-}
-
-GLboolean Context::isProgramPipeline(GLuint pipeline)
-{
- if (pipeline == 0)
- {
- return GL_FALSE;
- }
-
- return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/Context.h b/src/3rdparty/angle/src/libANGLE/Context.h
deleted file mode 100644
index 38c4e7b4d1..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Context.h
+++ /dev/null
@@ -1,1154 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Context.h: Defines the gl::Context class, managing all GL state and performing
-// rendering operations. It is the GLES2 specific implementation of EGLContext.
-
-#ifndef LIBANGLE_CONTEXT_H_
-#define LIBANGLE_CONTEXT_H_
-
-#include <set>
-#include <string>
-
-#include "angle_gl.h"
-#include "common/MemoryBuffer.h"
-#include "common/angleutils.h"
-#include "libANGLE/Caps.h"
-#include "libANGLE/Constants.h"
-#include "libANGLE/ContextState.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/HandleAllocator.h"
-#include "libANGLE/PackedGLEnums.h"
-#include "libANGLE/RefCountObject.h"
-#include "libANGLE/ResourceMap.h"
-#include "libANGLE/VertexAttribute.h"
-#include "libANGLE/Workarounds.h"
-#include "libANGLE/angletypes.h"
-
-namespace rx
-{
-class ContextImpl;
-class EGLImplFactory;
-}
-
-namespace egl
-{
-class AttributeMap;
-class Surface;
-struct Config;
-class Thread;
-}
-
-namespace gl
-{
-class Buffer;
-class Compiler;
-class FenceNV;
-class Sync;
-class Framebuffer;
-class MemoryProgramCache;
-class Program;
-class Query;
-class Renderbuffer;
-class Sampler;
-class Shader;
-class Texture;
-class TransformFeedback;
-class VertexArray;
-struct VertexAttribute;
-class ProgramPipeline;
-
-class Context final : public ValidationContext
-{
- public:
- Context(rx::EGLImplFactory *implFactory,
- const egl::Config *config,
- const Context *shareContext,
- TextureManager *shareTextures,
- MemoryProgramCache *memoryProgramCache,
- const egl::AttributeMap &attribs,
- const egl::DisplayExtensions &displayExtensions);
-
- egl::Error onDestroy(const egl::Display *display);
- ~Context() override;
-
- egl::Error makeCurrent(egl::Display *display, egl::Surface *surface);
- egl::Error releaseSurface(const egl::Display *display);
-
- // These create and destroy methods are merely pass-throughs to
- // ResourceManager, which owns these object types
- GLuint createBuffer();
- GLuint createShader(GLenum type);
- GLuint createProgram();
- GLuint createTexture();
- GLuint createRenderbuffer();
- GLuint createPaths(GLsizei range);
- GLuint createProgramPipeline();
- GLuint createShaderProgramv(GLenum type, GLsizei count, const GLchar *const *strings);
-
- void deleteBuffer(GLuint buffer);
- void deleteShader(GLuint shader);
- void deleteProgram(GLuint program);
- void deleteTexture(GLuint texture);
- void deleteRenderbuffer(GLuint renderbuffer);
- void deletePaths(GLuint first, GLsizei range);
- void deleteProgramPipeline(GLuint pipeline);
-
- // CHROMIUM_path_rendering
- bool hasPathData(GLuint path) const;
- bool hasPath(GLuint path) const;
- void setPathCommands(GLuint path,
- GLsizei numCommands,
- const GLubyte *commands,
- GLsizei numCoords,
- GLenum coordType,
- const void *coords);
- void setPathParameterf(GLuint path, GLenum pname, GLfloat value);
- void getPathParameterfv(GLuint path, GLenum pname, GLfloat *value) const;
- void setPathStencilFunc(GLenum func, GLint ref, GLuint mask);
-
- // Framebuffers are owned by the Context, so these methods do not pass through
- GLuint createFramebuffer();
- void deleteFramebuffer(GLuint framebuffer);
-
- // NV Fences are owned by the Context.
- GLuint createFenceNV();
- void deleteFenceNV(GLuint fence);
-
- void bindTexture(GLenum target, GLuint handle);
- void bindReadFramebuffer(GLuint framebufferHandle);
- void bindDrawFramebuffer(GLuint framebufferHandle);
- void bindVertexArray(GLuint vertexArrayHandle);
- void bindVertexBuffer(GLuint bindingIndex,
- GLuint bufferHandle,
- GLintptr offset,
- GLsizei stride);
- void bindSampler(GLuint textureUnit, GLuint samplerHandle);
- void bindImageTexture(GLuint unit,
- GLuint texture,
- GLint level,
- GLboolean layered,
- GLint layer,
- GLenum access,
- GLenum format);
- void useProgram(GLuint program);
- void useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
- void bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle);
- void bindProgramPipeline(GLuint pipelineHandle);
-
- void beginQuery(GLenum target, GLuint query);
- void endQuery(GLenum target);
- void queryCounter(GLuint id, GLenum target);
- void getQueryiv(GLenum target, GLenum pname, GLint *params);
- void getQueryObjectiv(GLuint id, GLenum pname, GLint *params);
- void getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
- void getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
- void getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
-
- void vertexAttribDivisor(GLuint index, GLuint divisor);
- void vertexBindingDivisor(GLuint bindingIndex, GLuint divisor);
-
- void getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params);
- void getFramebufferAttachmentParameteriv(GLenum target,
- GLenum attachment,
- GLenum pname,
- GLint *params);
- void getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
-
- void getTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
- void getTexParameteriv(GLenum target, GLenum pname, GLint *params);
- void getTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- void getTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- void texParameterf(GLenum target, GLenum pname, GLfloat param);
- void texParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- void texParameteri(GLenum target, GLenum pname, GLint param);
- void texParameteriv(GLenum target, GLenum pname, const GLint *params);
-
- void samplerParameteri(GLuint sampler, GLenum pname, GLint param);
- void samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param);
- void samplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
- void samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param);
-
- void getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params);
- void getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params);
-
- void programParameteri(GLuint program, GLenum pname, GLint value);
-
- GLuint getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name);
- void getProgramResourceName(GLuint program,
- GLenum programInterface,
- GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *name);
- GLint getProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name);
- void getProgramResourceiv(GLuint program,
- GLenum programInterface,
- GLuint index,
- GLsizei propCount,
- const GLenum *props,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params);
-
- void getProgramInterfaceiv(GLuint program,
- GLenum programInterface,
- GLenum pname,
- GLint *params);
-
- Buffer *getBuffer(GLuint handle) const;
- FenceNV *getFenceNV(GLuint handle);
- Sync *getSync(GLsync handle) const;
- Texture *getTexture(GLuint handle) const;
- Framebuffer *getFramebuffer(GLuint handle) const;
- Renderbuffer *getRenderbuffer(GLuint handle) const;
- VertexArray *getVertexArray(GLuint handle) const;
- Sampler *getSampler(GLuint handle) const;
- Query *getQuery(GLuint handle, bool create, GLenum type);
- Query *getQuery(GLuint handle) const;
- TransformFeedback *getTransformFeedback(GLuint handle) const;
- ProgramPipeline *getProgramPipeline(GLuint handle) const;
-
- void objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
- void objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label);
- void getObjectLabel(GLenum identifier,
- GLuint name,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *label) const;
- void getObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label) const;
-
- Texture *getTargetTexture(GLenum target) const;
- Texture *getSamplerTexture(unsigned int sampler, GLenum type) const;
-
- Compiler *getCompiler() const;
-
- bool isSampler(GLuint samplerName) const;
-
- bool isVertexArrayGenerated(GLuint vertexArray);
- bool isTransformFeedbackGenerated(GLuint vertexArray);
-
- void getBooleanv(GLenum pname, GLboolean *params);
- void getBooleanvImpl(GLenum pname, GLboolean *params);
- void getFloatv(GLenum pname, GLfloat *params);
- void getFloatvImpl(GLenum pname, GLfloat *params);
- void getIntegerv(GLenum pname, GLint *params);
- void getIntegervImpl(GLenum pname, GLint *params);
- void getInteger64vImpl(GLenum pname, GLint64 *params);
- void getPointerv(GLenum pname, void **params) const;
- void getBooleani_v(GLenum target, GLuint index, GLboolean *data);
- void getIntegeri_v(GLenum target, GLuint index, GLint *data);
- void getInteger64i_v(GLenum target, GLuint index, GLint64 *data);
-
- void activeShaderProgram(GLuint pipeline, GLuint program);
- void activeTexture(GLenum texture);
- void blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void blendEquation(GLenum mode);
- void blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
- void blendFunc(GLenum sfactor, GLenum dfactor);
- void blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
- void clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- void clearDepthf(GLfloat depth);
- void clearStencil(GLint s);
- void colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- void cullFace(CullFaceMode mode);
- void depthFunc(GLenum func);
- void depthMask(GLboolean flag);
- void depthRangef(GLfloat zNear, GLfloat zFar);
- void disable(GLenum cap);
- void disableVertexAttribArray(GLuint index);
- void enable(GLenum cap);
- void enableVertexAttribArray(GLuint index);
- void frontFace(GLenum mode);
- void hint(GLenum target, GLenum mode);
- void lineWidth(GLfloat width);
- void pixelStorei(GLenum pname, GLint param);
- void polygonOffset(GLfloat factor, GLfloat units);
- void sampleCoverage(GLfloat value, GLboolean invert);
- void sampleMaski(GLuint maskNumber, GLbitfield mask);
- void scissor(GLint x, GLint y, GLsizei width, GLsizei height);
- void stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- void stencilMaskSeparate(GLenum face, GLuint mask);
- void stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
- void vertexAttrib1f(GLuint index, GLfloat x);
- void vertexAttrib1fv(GLuint index, const GLfloat *values);
- void vertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
- void vertexAttrib2fv(GLuint index, const GLfloat *values);
- void vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
- void vertexAttrib3fv(GLuint index, const GLfloat *values);
- void vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void vertexAttrib4fv(GLuint index, const GLfloat *values);
- void vertexAttribFormat(GLuint attribIndex,
- GLint size,
- GLenum type,
- GLboolean normalized,
- GLuint relativeOffset);
- void vertexAttribIFormat(GLuint attribIndex, GLint size, GLenum type, GLuint relativeOffset);
- void vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex);
- void vertexAttribPointer(GLuint index,
- GLint size,
- GLenum type,
- GLboolean normalized,
- GLsizei stride,
- const void *ptr);
- void vertexAttribIPointer(GLuint index,
- GLint size,
- GLenum type,
- GLsizei stride,
- const void *pointer);
- void viewport(GLint x, GLint y, GLsizei width, GLsizei height);
-
- void vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
- void vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
- void vertexAttribI4iv(GLuint index, const GLint *v);
- void vertexAttribI4uiv(GLuint index, const GLuint *v);
- void getVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- void getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- void getVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- void getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- void getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer);
-
- void debugMessageControl(GLenum source,
- GLenum type,
- GLenum severity,
- GLsizei count,
- const GLuint *ids,
- GLboolean enabled);
- void debugMessageInsert(GLenum source,
- GLenum type,
- GLuint id,
- GLenum severity,
- GLsizei length,
- const GLchar *buf);
- void debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam);
- GLuint getDebugMessageLog(GLuint count,
- GLsizei bufSize,
- GLenum *sources,
- GLenum *types,
- GLuint *ids,
- GLenum *severities,
- GLsizei *lengths,
- GLchar *messageLog);
- void pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message);
- void popDebugGroup();
-
- void clear(GLbitfield mask);
- void clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values);
- void clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values);
- void clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values);
- void clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
-
- void drawArrays(GLenum mode, GLint first, GLsizei count);
- void drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount);
-
- void drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices);
- void drawElementsInstanced(GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei instances);
- void drawRangeElements(GLenum mode,
- GLuint start,
- GLuint end,
- GLsizei count,
- GLenum type,
- const void *indices);
- void drawArraysIndirect(GLenum mode, const void *indirect);
- void drawElementsIndirect(GLenum mode, GLenum type, const void *indirect);
-
- void blitFramebuffer(GLint srcX0,
- GLint srcY0,
- GLint srcX1,
- GLint srcY1,
- GLint dstX0,
- GLint dstY0,
- GLint dstX1,
- GLint dstY1,
- GLbitfield mask,
- GLenum filter);
-
- void readPixels(GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLenum type,
- void *pixels);
-
- void copyTexImage2D(GLenum target,
- GLint level,
- GLenum internalformat,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLint border);
-
- void copyTexSubImage2D(GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height);
-
- void copyTexSubImage3D(GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height);
-
- void framebufferTexture2D(GLenum target,
- GLenum attachment,
- GLenum textarget,
- GLuint texture,
- GLint level);
-
- void framebufferRenderbuffer(GLenum target,
- GLenum attachment,
- GLenum renderbuffertarget,
- GLuint renderbuffer);
-
- void framebufferTextureLayer(GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLint layer);
- void framebufferTextureMultiviewLayeredANGLE(GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLint baseViewIndex,
- GLsizei numViews);
- void framebufferTextureMultiviewSideBySideANGLE(GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLsizei numViews,
- const GLint *viewportOffsets);
-
- void drawBuffers(GLsizei n, const GLenum *bufs);
- void readBuffer(GLenum mode);
-
- void discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);
- void invalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);
- void invalidateSubFramebuffer(GLenum target,
- GLsizei numAttachments,
- const GLenum *attachments,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height);
-
- void texImage2D(GLenum target,
- GLint level,
- GLint internalformat,
- GLsizei width,
- GLsizei height,
- GLint border,
- GLenum format,
- GLenum type,
- const void *pixels);
- void texImage3D(GLenum target,
- GLint level,
- GLint internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLint border,
- GLenum format,
- GLenum type,
- const void *pixels);
- void texSubImage2D(GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLenum type,
- const void *pixels);
- void texSubImage3D(GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLenum format,
- GLenum type,
- const void *pixels);
- void compressedTexImage2D(GLenum target,
- GLint level,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLint border,
- GLsizei imageSize,
- const void *data);
- void compressedTexImage3D(GLenum target,
- GLint level,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLint border,
- GLsizei imageSize,
- const void *data);
- void compressedTexSubImage2D(GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLsizei imageSize,
- const void *data);
- void compressedTexSubImage3D(GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLenum format,
- GLsizei imageSize,
- const void *data);
- void copyTextureCHROMIUM(GLuint sourceId,
- GLint sourceLevel,
- GLenum destTarget,
- GLuint destId,
- GLint destLevel,
- GLint internalFormat,
- GLenum destType,
- GLboolean unpackFlipY,
- GLboolean unpackPremultiplyAlpha,
- GLboolean unpackUnmultiplyAlpha);
- void copySubTextureCHROMIUM(GLuint sourceId,
- GLint sourceLevel,
- GLenum destTarget,
- GLuint destId,
- GLint destLevel,
- GLint xoffset,
- GLint yoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLboolean unpackFlipY,
- GLboolean unpackPremultiplyAlpha,
- GLboolean unpackUnmultiplyAlpha);
- void compressedCopyTextureCHROMIUM(GLuint sourceId, GLuint destId);
-
- void generateMipmap(GLenum target);
-
- void flush();
- void finish();
-
- void getBufferPointerv(BufferBinding target, GLenum pname, void **params);
- void *mapBuffer(BufferBinding target, GLenum access);
- GLboolean unmapBuffer(BufferBinding target);
- void *mapBufferRange(BufferBinding target,
- GLintptr offset,
- GLsizeiptr length,
- GLbitfield access);
- void flushMappedBufferRange(BufferBinding target, GLintptr offset, GLsizeiptr length);
-
- void beginTransformFeedback(GLenum primitiveMode);
-
- bool hasActiveTransformFeedback(GLuint program) const;
-
- void insertEventMarker(GLsizei length, const char *marker);
- void pushGroupMarker(GLsizei length, const char *marker);
- void popGroupMarker();
-
- void bindUniformLocation(GLuint program, GLint location, const GLchar *name);
- void renderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void renderbufferStorageMultisample(GLenum target,
- GLsizei samples,
- GLenum internalformat,
- GLsizei width,
- GLsizei height);
-
- void getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
-
- // CHROMIUM_framebuffer_mixed_samples
- void setCoverageModulation(GLenum components);
-
- // CHROMIUM_path_rendering
- void loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix);
- void loadPathRenderingIdentityMatrix(GLenum matrixMode);
- void stencilFillPath(GLuint path, GLenum fillMode, GLuint mask);
- void stencilStrokePath(GLuint path, GLint reference, GLuint mask);
- void coverFillPath(GLuint path, GLenum coverMode);
- void coverStrokePath(GLuint path, GLenum coverMode);
- void stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode);
- void stencilThenCoverStrokePath(GLuint path, GLint reference, GLuint mask, GLenum coverMode);
- void coverFillPathInstanced(GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues);
- void coverStrokePathInstanced(GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues);
- void stencilFillPathInstanced(GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBAse,
- GLenum fillMode,
- GLuint mask,
- GLenum transformType,
- const GLfloat *transformValues);
- void stencilStrokePathInstanced(GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLint reference,
- GLuint mask,
- GLenum transformType,
- const GLfloat *transformValues);
- void stencilThenCoverFillPathInstanced(GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLenum fillMode,
- GLuint mask,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues);
- void stencilThenCoverStrokePathInstanced(GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLint reference,
- GLuint mask,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues);
- void bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name);
- void programPathFragmentInputGen(GLuint program,
- GLint location,
- GLenum genMode,
- GLint components,
- const GLfloat *coeffs);
-
- void bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage);
- void bufferSubData(BufferBinding target, GLintptr offset, GLsizeiptr size, const void *data);
- void attachShader(GLuint program, GLuint shader);
- void bindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- void bindBuffer(BufferBinding target, GLuint buffer);
- void bindBufferBase(BufferBinding target, GLuint index, GLuint buffer);
- void bindBufferRange(BufferBinding target,
- GLuint index,
- GLuint buffer,
- GLintptr offset,
- GLsizeiptr size);
- void bindFramebuffer(GLenum target, GLuint framebuffer);
- void bindRenderbuffer(GLenum target, GLuint renderbuffer);
-
- void texStorage2DMultisample(GLenum target,
- GLsizei samples,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLboolean fixedsamplelocations);
-
- void getMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
-
- void copyBufferSubData(BufferBinding readTarget,
- BufferBinding writeTarget,
- GLintptr readOffset,
- GLintptr writeOffset,
- GLsizeiptr size);
-
- GLenum checkFramebufferStatus(GLenum target);
- void compileShader(GLuint shader);
- void deleteBuffers(GLsizei n, const GLuint *buffers);
- void deleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- void deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- void deleteTextures(GLsizei n, const GLuint *textures);
- void detachShader(GLuint program, GLuint shader);
- void genBuffers(GLsizei n, GLuint *buffers);
- void genFramebuffers(GLsizei n, GLuint *framebuffers);
- void genRenderbuffers(GLsizei n, GLuint *renderbuffers);
- void genTextures(GLsizei n, GLuint *textures);
- void getActiveAttrib(GLuint program,
- GLuint index,
- GLsizei bufsize,
- GLsizei *length,
- GLint *size,
- GLenum *type,
- GLchar *name);
- void getActiveUniform(GLuint program,
- GLuint index,
- GLsizei bufsize,
- GLsizei *length,
- GLint *size,
- GLenum *type,
- GLchar *name);
- void getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders);
- GLint getAttribLocation(GLuint program, const GLchar *name);
- void getProgramiv(GLuint program, GLenum pname, GLint *params);
- void getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
- void getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog);
- void getProgramPipelineInfoLog(GLuint pipeline,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *infoLog);
- void getShaderiv(GLuint shader, GLenum pname, GLint *params);
- void getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog);
- void getShaderPrecisionFormat(GLenum shadertype,
- GLenum precisiontype,
- GLint *range,
- GLint *precision);
- void getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source);
- void getUniformfv(GLuint program, GLint location, GLfloat *params);
- void getUniformiv(GLuint program, GLint location, GLint *params);
- GLint getUniformLocation(GLuint program, const GLchar *name);
- GLboolean isBuffer(GLuint buffer);
- GLboolean isEnabled(GLenum cap);
- GLboolean isFramebuffer(GLuint framebuffer);
- GLboolean isProgram(GLuint program);
- GLboolean isRenderbuffer(GLuint renderbuffer);
- GLboolean isShader(GLuint shader);
- GLboolean isTexture(GLuint texture);
- void linkProgram(GLuint program);
- void releaseShaderCompiler();
- void shaderBinary(GLsizei n,
- const GLuint *shaders,
- GLenum binaryformat,
- const void *binary,
- GLsizei length);
- void shaderSource(GLuint shader,
- GLsizei count,
- const GLchar *const *string,
- const GLint *length);
- void stencilFunc(GLenum func, GLint ref, GLuint mask);
- void stencilMask(GLuint mask);
- void stencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- void uniform1f(GLint location, GLfloat x);
- void uniform1fv(GLint location, GLsizei count, const GLfloat *v);
- void uniform1i(GLint location, GLint x);
- void uniform1iv(GLint location, GLsizei count, const GLint *v);
- void uniform2f(GLint location, GLfloat x, GLfloat y);
- void uniform2fv(GLint location, GLsizei count, const GLfloat *v);
- void uniform2i(GLint location, GLint x, GLint y);
- void uniform2iv(GLint location, GLsizei count, const GLint *v);
- void uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z);
- void uniform3fv(GLint location, GLsizei count, const GLfloat *v);
- void uniform3i(GLint location, GLint x, GLint y, GLint z);
- void uniform3iv(GLint location, GLsizei count, const GLint *v);
- void uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- void uniform4fv(GLint location, GLsizei count, const GLfloat *v);
- void uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w);
- void uniform4iv(GLint location, GLsizei count, const GLint *v);
- void uniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void uniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void uniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void validateProgram(GLuint program);
- void validateProgramPipeline(GLuint pipeline);
-
- void genQueries(GLsizei n, GLuint *ids);
- void deleteQueries(GLsizei n, const GLuint *ids);
- GLboolean isQuery(GLuint id);
-
- void uniform1ui(GLint location, GLuint v0);
- void uniform2ui(GLint location, GLuint v0, GLuint v1);
- void uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- void uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- void uniform1uiv(GLint location, GLsizei count, const GLuint *value);
- void uniform2uiv(GLint location, GLsizei count, const GLuint *value);
- void uniform3uiv(GLint location, GLsizei count, const GLuint *value);
- void uniform4uiv(GLint location, GLsizei count, const GLuint *value);
-
- void uniformMatrix2x3fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
- void uniformMatrix3x2fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
- void uniformMatrix2x4fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
- void uniformMatrix4x2fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
- void uniformMatrix3x4fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
- void uniformMatrix4x3fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-
- void deleteVertexArrays(GLsizei n, const GLuint *arrays);
- void genVertexArrays(GLsizei n, GLuint *arrays);
- bool isVertexArray(GLuint array);
-
- void endTransformFeedback();
- void transformFeedbackVaryings(GLuint program,
- GLsizei count,
- const GLchar *const *varyings,
- GLenum bufferMode);
- void getTransformFeedbackVarying(GLuint program,
- GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLsizei *size,
- GLenum *type,
- GLchar *name);
-
- void deleteTransformFeedbacks(GLsizei n, const GLuint *ids);
- void genTransformFeedbacks(GLsizei n, GLuint *ids);
- bool isTransformFeedback(GLuint id);
- void pauseTransformFeedback();
- void resumeTransformFeedback();
-
- void getProgramBinary(GLuint program,
- GLsizei bufSize,
- GLsizei *length,
- GLenum *binaryFormat,
- void *binary);
- void programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
-
- void getUniformuiv(GLuint program, GLint location, GLuint *params);
- GLint getFragDataLocation(GLuint program, const GLchar *name);
- void getUniformIndices(GLuint program,
- GLsizei uniformCount,
- const GLchar *const *uniformNames,
- GLuint *uniformIndices);
- void getActiveUniformsiv(GLuint program,
- GLsizei uniformCount,
- const GLuint *uniformIndices,
- GLenum pname,
- GLint *params);
- GLuint getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- void getActiveUniformBlockiv(GLuint program,
- GLuint uniformBlockIndex,
- GLenum pname,
- GLint *params);
- void getActiveUniformBlockName(GLuint program,
- GLuint uniformBlockIndex,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *uniformBlockName);
- void uniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
-
- GLsync fenceSync(GLenum condition, GLbitfield flags);
- GLboolean isSync(GLsync sync);
- void deleteSync(GLsync sync);
- GLenum clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- void waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
- void getInteger64v(GLenum pname, GLint64 *params);
-
- void getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params);
- void genSamplers(GLsizei count, GLuint *samplers);
- void deleteSamplers(GLsizei count, const GLuint *samplers);
- void getInternalformativ(GLenum target,
- GLenum internalformat,
- GLenum pname,
- GLsizei bufSize,
- GLint *params);
-
- void programUniform1i(GLuint program, GLint location, GLint v0);
- void programUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
- void programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
- void programUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- void programUniform1ui(GLuint program, GLint location, GLuint v0);
- void programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
- void programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
- void programUniform4ui(GLuint program,
- GLint location,
- GLuint v0,
- GLuint v1,
- GLuint v2,
- GLuint v3);
- void programUniform1f(GLuint program, GLint location, GLfloat v0);
- void programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
- void programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- void programUniform4f(GLuint program,
- GLint location,
- GLfloat v0,
- GLfloat v1,
- GLfloat v2,
- GLfloat v3);
- void programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- void programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- void programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- void programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
-
- void programUniformMatrix2fv(GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-
- void programUniformMatrix3fv(GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-
- void programUniformMatrix4fv(GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-
- void programUniformMatrix2x3fv(GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-
- void programUniformMatrix3x2fv(GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-
- void programUniformMatrix2x4fv(GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-
- void programUniformMatrix4x2fv(GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-
- void programUniformMatrix3x4fv(GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-
- void programUniformMatrix4x3fv(GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-
- void deleteProgramPipelines(GLsizei n, const GLuint *pipelines);
- void genProgramPipelines(GLsizei n, GLuint *pipelines);
- GLboolean isProgramPipeline(GLuint pipeline);
-
- // Consumes the error.
- void handleError(const Error &error) override;
-
- GLenum getError();
- void markContextLost();
- bool isContextLost();
- GLenum getResetStatus();
- bool isResetNotificationEnabled();
-
- const egl::Config *getConfig() const;
- EGLenum getClientType() const;
- EGLenum getRenderBuffer() const;
-
- const GLubyte *getString(GLenum name) const;
- const GLubyte *getStringi(GLenum name, GLuint index) const;
-
- size_t getExtensionStringCount() const;
-
- bool isExtensionRequestable(const char *name);
- void requestExtension(const char *name);
- size_t getRequestableExtensionStringCount() const;
-
- rx::ContextImpl *getImplementation() const { return mImplementation.get(); }
- const Workarounds &getWorkarounds() const;
-
- void getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
- void framebufferParameteri(GLenum target, GLenum pname, GLint param);
-
- Error getScratchBuffer(size_t requestedSizeBytes, angle::MemoryBuffer **scratchBufferOut) const;
- Error getZeroFilledBuffer(size_t requstedSizeBytes, angle::MemoryBuffer **zeroBufferOut) const;
-
- void dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ);
- void dispatchComputeIndirect(GLintptr indirect);
-
- MemoryProgramCache *getMemoryProgramCache() const { return mMemoryProgramCache; }
-
- template <EntryPoint EP, typename... ParamsT>
- void gatherParams(ParamsT &&... params);
-
- void texStorage2D(GLenum target,
- GLsizei levels,
- GLenum internalFormat,
- GLsizei width,
- GLsizei height);
- void texStorage3D(GLenum target,
- GLsizei levels,
- GLenum internalFormat,
- GLsizei width,
- GLsizei height,
- GLsizei depth);
-
- void memoryBarrier(GLbitfield barriers);
- void memoryBarrierByRegion(GLbitfield barriers);
-
- // Notification for a state change in a Texture.
- void onTextureChange(const Texture *texture);
-
- egl::Display *getCurrentDisplay() const { return mCurrentDisplay; }
- egl::Surface *getCurrentDrawSurface() const { return mCurrentSurface; }
- egl::Surface *getCurrentReadSurface() const { return mCurrentSurface; }
-
- bool isRobustResourceInitEnabled() const { return mGLState.isRobustResourceInitEnabled(); }
-
- private:
- Error prepareForDraw();
- void syncRendererState();
- void syncRendererState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask);
- void syncStateForReadPixels();
- void syncStateForTexImage();
- void syncStateForClear();
- void syncStateForBlit();
- VertexArray *checkVertexArrayAllocation(GLuint vertexArrayHandle);
- TransformFeedback *checkTransformFeedbackAllocation(GLuint transformFeedback);
-
- void detachBuffer(GLuint buffer);
- void detachTexture(GLuint texture);
- void detachFramebuffer(GLuint framebuffer);
- void detachRenderbuffer(GLuint renderbuffer);
- void detachVertexArray(GLuint vertexArray);
- void detachTransformFeedback(GLuint transformFeedback);
- void detachSampler(GLuint sampler);
- void detachProgramPipeline(GLuint pipeline);
-
- void initRendererString();
- void initVersionStrings();
- void initExtensionStrings();
-
- void initCaps(const egl::DisplayExtensions &displayExtensions, bool robustResourceInit);
- void updateCaps();
- void initWorkarounds();
-
- LabeledObject *getLabeledObject(GLenum identifier, GLuint name) const;
- LabeledObject *getLabeledObjectFromPtr(const void *ptr) const;
-
- std::unique_ptr<rx::ContextImpl> mImplementation;
-
- // Caps to use for validation
- Caps mCaps;
- TextureCapsMap mTextureCaps;
- Extensions mExtensions;
- Limitations mLimitations;
-
- // Shader compiler. Lazily initialized hence the mutable value.
- mutable BindingPointer<Compiler> mCompiler;
-
- State mGLState;
-
- const egl::Config *mConfig;
- EGLenum mClientType;
-
- TextureMap mZeroTextures;
-
- ResourceMap<FenceNV> mFenceNVMap;
- HandleAllocator mFenceNVHandleAllocator;
-
- ResourceMap<Query> mQueryMap;
- HandleAllocator mQueryHandleAllocator;
-
- ResourceMap<VertexArray> mVertexArrayMap;
- HandleAllocator mVertexArrayHandleAllocator;
-
- ResourceMap<TransformFeedback> mTransformFeedbackMap;
- HandleAllocator mTransformFeedbackHandleAllocator;
-
- const char *mVersionString;
- const char *mShadingLanguageString;
- const char *mRendererString;
- const char *mExtensionString;
- std::vector<const char *> mExtensionStrings;
- const char *mRequestableExtensionString;
- std::vector<const char *> mRequestableExtensionStrings;
-
- // Recorded errors
- typedef std::set<GLenum> ErrorSet;
- ErrorSet mErrors;
-
- // Current/lost context flags
- bool mHasBeenCurrent;
- bool mContextLost;
- GLenum mResetStatus;
- bool mContextLostForced;
- GLenum mResetStrategy;
- bool mRobustAccess;
- egl::Surface *mCurrentSurface;
- egl::Display *mCurrentDisplay;
- Framebuffer *mSurfacelessFramebuffer;
- bool mWebGLContext;
- MemoryProgramCache *mMemoryProgramCache;
-
- State::DirtyBits mTexImageDirtyBits;
- State::DirtyObjects mTexImageDirtyObjects;
- State::DirtyBits mReadPixelsDirtyBits;
- State::DirtyObjects mReadPixelsDirtyObjects;
- State::DirtyBits mClearDirtyBits;
- State::DirtyObjects mClearDirtyObjects;
- State::DirtyBits mBlitDirtyBits;
- State::DirtyObjects mBlitDirtyObjects;
-
- Workarounds mWorkarounds;
-
- // Not really a property of context state. The size and contexts change per-api-call.
- mutable angle::ScratchBuffer mScratchBuffer;
- mutable angle::ScratchBuffer mZeroFilledBuffer;
-};
-
-template <EntryPoint EP, typename... ArgsT>
-ANGLE_INLINE void Context::gatherParams(ArgsT &&... args)
-{
- static_assert(sizeof(EntryPointParamType<EP>) <= kParamsBufferSize,
- "Params struct too large, please increase kParamsBufferSize.");
-
- mSavedArgsType = &EntryPointParamType<EP>::TypeInfo;
-
- // Skip doing any work for ParamsBase/Invalid type.
- if (!EntryPointParamType<EP>::TypeInfo.isValid())
- {
- return;
- }
-
- EntryPointParamType<EP> *objBuffer =
- reinterpret_cast<EntryPointParamType<EP> *>(mParamsBuffer.data());
- EntryPointParamType<EP>::template Factory<EP>(objBuffer, this, std::forward<ArgsT>(args)...);
-}
-
-} // namespace gl
-
-#endif // LIBANGLE_CONTEXT_H_
diff --git a/src/3rdparty/angle/src/libANGLE/ContextState.cpp b/src/3rdparty/angle/src/libANGLE/ContextState.cpp
deleted file mode 100644
index d109cca76d..0000000000
--- a/src/3rdparty/angle/src/libANGLE/ContextState.cpp
+++ /dev/null
@@ -1,839 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Data.cpp: Container class for all GL relevant state, caps and objects
-
-#include "libANGLE/ContextState.h"
-
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/ResourceManager.h"
-
-namespace gl
-{
-
-namespace
-{
-
-template <typename T>
-using ContextStateMember = T *(ContextState::*);
-
-template <typename T>
-T *AllocateOrGetSharedResourceManager(const ContextState *shareContextState,
- ContextStateMember<T> member)
-{
- if (shareContextState)
- {
- T *resourceManager = (*shareContextState).*member;
- resourceManager->addRef();
- return resourceManager;
- }
- else
- {
- return new T();
- }
-}
-
-TextureManager *AllocateOrGetSharedTextureManager(const ContextState *shareContextState,
- TextureManager *shareTextures,
- ContextStateMember<TextureManager> member)
-{
- if (shareContextState)
- {
- TextureManager *textureManager = (*shareContextState).*member;
- ASSERT(shareTextures == nullptr || textureManager == shareTextures);
- textureManager->addRef();
- return textureManager;
- }
- else if (shareTextures)
- {
- TextureManager *textureManager = shareTextures;
- textureManager->addRef();
- return textureManager;
- }
- else
- {
- return new TextureManager();
- }
-}
-
-} // anonymous namespace
-
-ContextState::ContextState(ContextID contextIn,
- const ContextState *shareContextState,
- TextureManager *shareTextures,
- const Version &clientVersion,
- State *stateIn,
- const Caps &capsIn,
- const TextureCapsMap &textureCapsIn,
- const Extensions &extensionsIn,
- const Limitations &limitationsIn)
- : mClientVersion(clientVersion),
- mContext(contextIn),
- mState(stateIn),
- mCaps(capsIn),
- mTextureCaps(textureCapsIn),
- mExtensions(extensionsIn),
- mLimitations(limitationsIn),
- mBuffers(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mBuffers)),
- mShaderPrograms(
- AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mShaderPrograms)),
- mTextures(AllocateOrGetSharedTextureManager(shareContextState,
- shareTextures,
- &ContextState::mTextures)),
- mRenderbuffers(
- AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mRenderbuffers)),
- mSamplers(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mSamplers)),
- mSyncs(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mSyncs)),
- mPaths(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mPaths)),
- mFramebuffers(new FramebufferManager()),
- mPipelines(new ProgramPipelineManager())
-{
-}
-
-ContextState::~ContextState()
-{
- // Handles are released by the Context.
-}
-
-bool ContextState::isWebGL() const
-{
- return mExtensions.webglCompatibility;
-}
-
-bool ContextState::isWebGL1() const
-{
- return (isWebGL() && mClientVersion.major == 2);
-}
-
-const TextureCaps &ContextState::getTextureCap(GLenum internalFormat) const
-{
- return mTextureCaps.get(internalFormat);
-}
-
-ValidationContext::ValidationContext(const ValidationContext *shareContext,
- TextureManager *shareTextures,
- const Version &clientVersion,
- State *state,
- const Caps &caps,
- const TextureCapsMap &textureCaps,
- const Extensions &extensions,
- const Limitations &limitations,
- bool skipValidation)
- : mState(reinterpret_cast<ContextID>(this),
- shareContext ? &shareContext->mState : nullptr,
- shareTextures,
- clientVersion,
- state,
- caps,
- textureCaps,
- extensions,
- limitations),
- mSkipValidation(skipValidation),
- mDisplayTextureShareGroup(shareTextures != nullptr)
-{
-}
-
-ValidationContext::~ValidationContext()
-{
-}
-
-bool ValidationContext::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
-{
- // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
- // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
- // to the fact that it is stored internally as a float, and so would require conversion
- // if returned from Context::getIntegerv. Since this conversion is already implemented
- // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
- // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
- // application.
- switch (pname)
- {
- case GL_COMPRESSED_TEXTURE_FORMATS:
- {
- *type = GL_INT;
- *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
- return true;
- }
- case GL_SHADER_BINARY_FORMATS:
- {
- *type = GL_INT;
- *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
- return true;
- }
-
- case GL_MAX_VERTEX_ATTRIBS:
- case GL_MAX_VERTEX_UNIFORM_VECTORS:
- case GL_MAX_VARYING_VECTORS:
- case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
- case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
- case GL_MAX_TEXTURE_IMAGE_UNITS:
- case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
- case GL_MAX_RENDERBUFFER_SIZE:
- case GL_NUM_SHADER_BINARY_FORMATS:
- case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
- case GL_ARRAY_BUFFER_BINDING:
- case GL_FRAMEBUFFER_BINDING:
- case GL_RENDERBUFFER_BINDING:
- case GL_CURRENT_PROGRAM:
- case GL_PACK_ALIGNMENT:
- case GL_UNPACK_ALIGNMENT:
- case GL_GENERATE_MIPMAP_HINT:
- case GL_RED_BITS:
- case GL_GREEN_BITS:
- case GL_BLUE_BITS:
- case GL_ALPHA_BITS:
- case GL_DEPTH_BITS:
- case GL_STENCIL_BITS:
- case GL_ELEMENT_ARRAY_BUFFER_BINDING:
- case GL_CULL_FACE_MODE:
- case GL_FRONT_FACE:
- case GL_ACTIVE_TEXTURE:
- case GL_STENCIL_FUNC:
- case GL_STENCIL_VALUE_MASK:
- case GL_STENCIL_REF:
- case GL_STENCIL_FAIL:
- case GL_STENCIL_PASS_DEPTH_FAIL:
- case GL_STENCIL_PASS_DEPTH_PASS:
- case GL_STENCIL_BACK_FUNC:
- case GL_STENCIL_BACK_VALUE_MASK:
- case GL_STENCIL_BACK_REF:
- case GL_STENCIL_BACK_FAIL:
- case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
- case GL_STENCIL_BACK_PASS_DEPTH_PASS:
- case GL_DEPTH_FUNC:
- case GL_BLEND_SRC_RGB:
- case GL_BLEND_SRC_ALPHA:
- case GL_BLEND_DST_RGB:
- case GL_BLEND_DST_ALPHA:
- case GL_BLEND_EQUATION_RGB:
- case GL_BLEND_EQUATION_ALPHA:
- case GL_STENCIL_WRITEMASK:
- case GL_STENCIL_BACK_WRITEMASK:
- case GL_STENCIL_CLEAR_VALUE:
- case GL_SUBPIXEL_BITS:
- case GL_MAX_TEXTURE_SIZE:
- case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
- case GL_SAMPLE_BUFFERS:
- case GL_SAMPLES:
- case GL_IMPLEMENTATION_COLOR_READ_TYPE:
- case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
- case GL_TEXTURE_BINDING_2D:
- case GL_TEXTURE_BINDING_CUBE_MAP:
- case GL_RESET_NOTIFICATION_STRATEGY_EXT:
- {
- *type = GL_INT;
- *numParams = 1;
- return true;
- }
- case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
- {
- if (!getExtensions().packReverseRowOrder)
- {
- return false;
- }
- *type = GL_INT;
- *numParams = 1;
- return true;
- }
- case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
- case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
- {
- if (!getExtensions().textureRectangle)
- {
- return false;
- }
- *type = GL_INT;
- *numParams = 1;
- return true;
- }
- case GL_MAX_DRAW_BUFFERS_EXT:
- case GL_MAX_COLOR_ATTACHMENTS_EXT:
- {
- if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
- {
- return false;
- }
- *type = GL_INT;
- *numParams = 1;
- return true;
- }
- case GL_MAX_VIEWPORT_DIMS:
- {
- *type = GL_INT;
- *numParams = 2;
- return true;
- }
- case GL_VIEWPORT:
- case GL_SCISSOR_BOX:
- {
- *type = GL_INT;
- *numParams = 4;
- return true;
- }
- case GL_SHADER_COMPILER:
- case GL_SAMPLE_COVERAGE_INVERT:
- case GL_DEPTH_WRITEMASK:
- case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
- case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
- case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
- // bool-natural
- case GL_SAMPLE_COVERAGE:
- case GL_SCISSOR_TEST:
- case GL_STENCIL_TEST:
- case GL_DEPTH_TEST:
- case GL_BLEND:
- case GL_DITHER:
- case GL_CONTEXT_ROBUST_ACCESS_EXT:
- {
- *type = GL_BOOL;
- *numParams = 1;
- return true;
- }
- case GL_COLOR_WRITEMASK:
- {
- *type = GL_BOOL;
- *numParams = 4;
- return true;
- }
- case GL_POLYGON_OFFSET_FACTOR:
- case GL_POLYGON_OFFSET_UNITS:
- case GL_SAMPLE_COVERAGE_VALUE:
- case GL_DEPTH_CLEAR_VALUE:
- case GL_LINE_WIDTH:
- {
- *type = GL_FLOAT;
- *numParams = 1;
- return true;
- }
- case GL_ALIASED_LINE_WIDTH_RANGE:
- case GL_ALIASED_POINT_SIZE_RANGE:
- case GL_DEPTH_RANGE:
- {
- *type = GL_FLOAT;
- *numParams = 2;
- return true;
- }
- case GL_COLOR_CLEAR_VALUE:
- case GL_BLEND_COLOR:
- {
- *type = GL_FLOAT;
- *numParams = 4;
- return true;
- }
- case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
- if (!getExtensions().textureFilterAnisotropic)
- {
- return false;
- }
- *type = GL_FLOAT;
- *numParams = 1;
- return true;
- case GL_TIMESTAMP_EXT:
- if (!getExtensions().disjointTimerQuery)
- {
- return false;
- }
- *type = GL_INT_64_ANGLEX;
- *numParams = 1;
- return true;
- case GL_GPU_DISJOINT_EXT:
- if (!getExtensions().disjointTimerQuery)
- {
- return false;
- }
- *type = GL_INT;
- *numParams = 1;
- return true;
- case GL_COVERAGE_MODULATION_CHROMIUM:
- if (!getExtensions().framebufferMixedSamples)
- {
- return false;
- }
- *type = GL_INT;
- *numParams = 1;
- return true;
- case GL_TEXTURE_BINDING_EXTERNAL_OES:
- if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
- {
- return false;
- }
- *type = GL_INT;
- *numParams = 1;
- return true;
- }
-
- if (getExtensions().debug)
- {
- switch (pname)
- {
- case GL_DEBUG_LOGGED_MESSAGES:
- case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
- case GL_DEBUG_GROUP_STACK_DEPTH:
- case GL_MAX_DEBUG_MESSAGE_LENGTH:
- case GL_MAX_DEBUG_LOGGED_MESSAGES:
- case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
- case GL_MAX_LABEL_LENGTH:
- *type = GL_INT;
- *numParams = 1;
- return true;
-
- case GL_DEBUG_OUTPUT_SYNCHRONOUS:
- case GL_DEBUG_OUTPUT:
- *type = GL_BOOL;
- *numParams = 1;
- return true;
- }
- }
-
- if (getExtensions().multisampleCompatibility)
- {
- switch (pname)
- {
- case GL_MULTISAMPLE_EXT:
- case GL_SAMPLE_ALPHA_TO_ONE_EXT:
- *type = GL_BOOL;
- *numParams = 1;
- return true;
- }
- }
-
- if (getExtensions().pathRendering)
- {
- switch (pname)
- {
- case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
- case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
- *type = GL_FLOAT;
- *numParams = 16;
- return true;
- }
- }
-
- if (getExtensions().bindGeneratesResource)
- {
- switch (pname)
- {
- case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
- *type = GL_BOOL;
- *numParams = 1;
- return true;
- }
- }
-
- if (getExtensions().clientArrays)
- {
- switch (pname)
- {
- case GL_CLIENT_ARRAYS_ANGLE:
- *type = GL_BOOL;
- *numParams = 1;
- return true;
- }
- }
-
- if (getExtensions().sRGBWriteControl)
- {
- switch (pname)
- {
- case GL_FRAMEBUFFER_SRGB_EXT:
- *type = GL_BOOL;
- *numParams = 1;
- return true;
- }
- }
-
- if (getExtensions().robustResourceInitialization &&
- pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
- {
- *type = GL_BOOL;
- *numParams = 1;
- return true;
- }
-
- if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
- {
- *type = GL_BOOL;
- *numParams = 1;
- return true;
- }
-
- // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
- switch (pname)
- {
- // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
- case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
- if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
- {
- return false;
- }
- *type = GL_INT;
- *numParams = 1;
- return true;
-
- case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
- if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
- {
- return false;
- }
- *type = GL_INT;
- *numParams = 1;
- return true;
-
- case GL_PROGRAM_BINARY_FORMATS_OES:
- if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
- {
- return false;
- }
- *type = GL_INT;
- *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
- return true;
-
- case GL_PACK_ROW_LENGTH:
- case GL_PACK_SKIP_ROWS:
- case GL_PACK_SKIP_PIXELS:
- if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
- {
- return false;
- }
- *type = GL_INT;
- *numParams = 1;
- return true;
- case GL_UNPACK_ROW_LENGTH:
- case GL_UNPACK_SKIP_ROWS:
- case GL_UNPACK_SKIP_PIXELS:
- if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
- {
- return false;
- }
- *type = GL_INT;
- *numParams = 1;
- return true;
- case GL_VERTEX_ARRAY_BINDING:
- if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
- {
- return false;
- }
- *type = GL_INT;
- *numParams = 1;
- return true;
- case GL_PIXEL_PACK_BUFFER_BINDING:
- case GL_PIXEL_UNPACK_BUFFER_BINDING:
- if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
- {
- return false;
- }
- *type = GL_INT;
- *numParams = 1;
- return true;
- case GL_MAX_SAMPLES:
- {
- static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
- "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
- if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
- {
- return false;
- }
- *type = GL_INT;
- *numParams = 1;
- return true;
-
- case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
- if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
- {
- return false;
- }
- *type = GL_INT;
- *numParams = 1;
- return true;
- }
- }
-
- if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
- {
- if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
- {
- return false;
- }
- *type = GL_INT;
- *numParams = 1;
- return true;
- }
-
- if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
- {
- *type = GL_INT;
- *numParams = 1;
- return true;
- }
-
- if (getClientVersion() < Version(3, 0))
- {
- return false;
- }
-
- // Check for ES3.0+ parameter names
- switch (pname)
- {
- case GL_MAX_UNIFORM_BUFFER_BINDINGS:
- case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
- case GL_UNIFORM_BUFFER_BINDING:
- case GL_TRANSFORM_FEEDBACK_BINDING:
- case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
- case GL_COPY_READ_BUFFER_BINDING:
- case GL_COPY_WRITE_BUFFER_BINDING:
- case GL_SAMPLER_BINDING:
- case GL_READ_BUFFER:
- case GL_TEXTURE_BINDING_3D:
- case GL_TEXTURE_BINDING_2D_ARRAY:
- case GL_MAX_3D_TEXTURE_SIZE:
- case GL_MAX_ARRAY_TEXTURE_LAYERS:
- case GL_MAX_VERTEX_UNIFORM_BLOCKS:
- case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
- case GL_MAX_COMBINED_UNIFORM_BLOCKS:
- case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
- case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
- case GL_MAX_VARYING_COMPONENTS:
- case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
- case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
- case GL_MIN_PROGRAM_TEXEL_OFFSET:
- case GL_MAX_PROGRAM_TEXEL_OFFSET:
- case GL_NUM_EXTENSIONS:
- case GL_MAJOR_VERSION:
- case GL_MINOR_VERSION:
- case GL_MAX_ELEMENTS_INDICES:
- case GL_MAX_ELEMENTS_VERTICES:
- case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
- case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
- case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
- case GL_UNPACK_IMAGE_HEIGHT:
- case GL_UNPACK_SKIP_IMAGES:
- {
- *type = GL_INT;
- *numParams = 1;
- return true;
- }
-
- case GL_MAX_ELEMENT_INDEX:
- case GL_MAX_UNIFORM_BLOCK_SIZE:
- case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
- case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
- case GL_MAX_SERVER_WAIT_TIMEOUT:
- {
- *type = GL_INT_64_ANGLEX;
- *numParams = 1;
- return true;
- }
-
- case GL_TRANSFORM_FEEDBACK_ACTIVE:
- case GL_TRANSFORM_FEEDBACK_PAUSED:
- case GL_PRIMITIVE_RESTART_FIXED_INDEX:
- case GL_RASTERIZER_DISCARD:
- {
- *type = GL_BOOL;
- *numParams = 1;
- return true;
- }
-
- case GL_MAX_TEXTURE_LOD_BIAS:
- {
- *type = GL_FLOAT;
- *numParams = 1;
- return true;
- }
- }
-
- if (getExtensions().requestExtension)
- {
- switch (pname)
- {
- case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
- *type = GL_INT;
- *numParams = 1;
- return true;
- }
- }
-
- if (getClientVersion() < Version(3, 1))
- {
- return false;
- }
-
- switch (pname)
- {
- case GL_ATOMIC_COUNTER_BUFFER_BINDING:
- case GL_DRAW_INDIRECT_BUFFER_BINDING:
- case GL_MAX_FRAMEBUFFER_WIDTH:
- case GL_MAX_FRAMEBUFFER_HEIGHT:
- case GL_MAX_FRAMEBUFFER_SAMPLES:
- case GL_MAX_SAMPLE_MASK_WORDS:
- case GL_MAX_COLOR_TEXTURE_SAMPLES:
- case GL_MAX_DEPTH_TEXTURE_SAMPLES:
- case GL_MAX_INTEGER_SAMPLES:
- case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
- case GL_MAX_VERTEX_ATTRIB_BINDINGS:
- case GL_MAX_VERTEX_ATTRIB_STRIDE:
- case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
- case GL_MAX_VERTEX_ATOMIC_COUNTERS:
- case GL_MAX_VERTEX_IMAGE_UNIFORMS:
- case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
- case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
- case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
- case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
- case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
- case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
- case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
- case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
- case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
- case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
- case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
- case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
- case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
- case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
- case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
- case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
- case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
- case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
- case GL_MAX_UNIFORM_LOCATIONS:
- case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
- case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
- case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
- case GL_MAX_COMBINED_ATOMIC_COUNTERS:
- case GL_MAX_IMAGE_UNITS:
- case GL_MAX_COMBINED_IMAGE_UNIFORMS:
- case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
- case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
- case GL_SHADER_STORAGE_BUFFER_BINDING:
- case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
- case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
- *type = GL_INT;
- *numParams = 1;
- return true;
- case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
- *type = GL_INT_64_ANGLEX;
- *numParams = 1;
- return true;
- case GL_SAMPLE_MASK:
- *type = GL_BOOL;
- *numParams = 1;
- return true;
- }
-
- return false;
-}
-
-bool ValidationContext::getIndexedQueryParameterInfo(GLenum target,
- GLenum *type,
- unsigned int *numParams)
-{
- if (getClientVersion() < Version(3, 0))
- {
- return false;
- }
-
- switch (target)
- {
- case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
- case GL_UNIFORM_BUFFER_BINDING:
- {
- *type = GL_INT;
- *numParams = 1;
- return true;
- }
- case GL_TRANSFORM_FEEDBACK_BUFFER_START:
- case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
- case GL_UNIFORM_BUFFER_START:
- case GL_UNIFORM_BUFFER_SIZE:
- {
- *type = GL_INT_64_ANGLEX;
- *numParams = 1;
- return true;
- }
- }
-
- if (getClientVersion() < Version(3, 1))
- {
- return false;
- }
-
- switch (target)
- {
- case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
- case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
- case GL_ATOMIC_COUNTER_BUFFER_BINDING:
- case GL_SHADER_STORAGE_BUFFER_BINDING:
- case GL_VERTEX_BINDING_BUFFER:
- case GL_VERTEX_BINDING_DIVISOR:
- case GL_VERTEX_BINDING_OFFSET:
- case GL_VERTEX_BINDING_STRIDE:
- case GL_SAMPLE_MASK_VALUE:
- {
- *type = GL_INT;
- *numParams = 1;
- return true;
- }
- case GL_ATOMIC_COUNTER_BUFFER_START:
- case GL_ATOMIC_COUNTER_BUFFER_SIZE:
- case GL_SHADER_STORAGE_BUFFER_START:
- case GL_SHADER_STORAGE_BUFFER_SIZE:
- {
- *type = GL_INT_64_ANGLEX;
- *numParams = 1;
- return true;
- }
- }
-
- return false;
-}
-
-Program *ValidationContext::getProgram(GLuint handle) const
-{
- return mState.mShaderPrograms->getProgram(handle);
-}
-
-Shader *ValidationContext::getShader(GLuint handle) const
-{
- return mState.mShaderPrograms->getShader(handle);
-}
-
-bool ValidationContext::isTextureGenerated(GLuint texture) const
-{
- return mState.mTextures->isHandleGenerated(texture);
-}
-
-bool ValidationContext::isBufferGenerated(GLuint buffer) const
-{
- return mState.mBuffers->isHandleGenerated(buffer);
-}
-
-bool ValidationContext::isRenderbufferGenerated(GLuint renderbuffer) const
-{
- return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
-}
-
-bool ValidationContext::isFramebufferGenerated(GLuint framebuffer) const
-{
- return mState.mFramebuffers->isHandleGenerated(framebuffer);
-}
-
-bool ValidationContext::isProgramPipelineGenerated(GLuint pipeline) const
-{
- return mState.mPipelines->isHandleGenerated(pipeline);
-}
-
-bool ValidationContext::usingDisplayTextureShareGroup() const
-{
- return mDisplayTextureShareGroup;
-}
-
-GLenum ValidationContext::getConvertedRenderbufferFormat(GLenum internalformat) const
-{
- return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
- internalformat == GL_DEPTH_STENCIL
- ? GL_DEPTH24_STENCIL8
- : internalformat;
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/ContextState.h b/src/3rdparty/angle/src/libANGLE/ContextState.h
deleted file mode 100644
index e6e9f4c6b0..0000000000
--- a/src/3rdparty/angle/src/libANGLE/ContextState.h
+++ /dev/null
@@ -1,164 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ContextState: Container class for all GL context state, caps and objects.
-
-#ifndef LIBANGLE_CONTEXTSTATE_H_
-#define LIBANGLE_CONTEXTSTATE_H_
-
-#include "common/MemoryBuffer.h"
-#include "common/angleutils.h"
-#include "libANGLE/State.h"
-#include "libANGLE/Version.h"
-#include "libANGLE/params.h"
-
-namespace gl
-{
-class BufferManager;
-class ContextState;
-class FramebufferManager;
-class PathManager;
-class ProgramPipelineManager;
-class RenderbufferManager;
-class SamplerManager;
-class ShaderProgramManager;
-class SyncManager;
-class TextureManager;
-class ValidationContext;
-
-static constexpr Version ES_2_0 = Version(2, 0);
-static constexpr Version ES_3_0 = Version(3, 0);
-static constexpr Version ES_3_1 = Version(3, 1);
-
-using ContextID = uintptr_t;
-
-class ContextState final : angle::NonCopyable
-{
- public:
- ContextState(ContextID context,
- const ContextState *shareContextState,
- TextureManager *shareTextures,
- const Version &clientVersion,
- State *state,
- const Caps &caps,
- const TextureCapsMap &textureCaps,
- const Extensions &extensions,
- const Limitations &limitations);
- ~ContextState();
-
- ContextID getContextID() const { return mContext; }
- GLint getClientMajorVersion() const { return mClientVersion.major; }
- GLint getClientMinorVersion() const { return mClientVersion.minor; }
- const Version &getClientVersion() const { return mClientVersion; }
- const State &getState() const { return *mState; }
- const Caps &getCaps() const { return mCaps; }
- const TextureCapsMap &getTextureCaps() const { return mTextureCaps; }
- const Extensions &getExtensions() const { return mExtensions; }
- const Limitations &getLimitations() const { return mLimitations; }
-
- const TextureCaps &getTextureCap(GLenum internalFormat) const;
-
- bool usingDisplayTextureShareGroup() const;
-
- bool isWebGL() const;
- bool isWebGL1() const;
-
- private:
- friend class Context;
- friend class ValidationContext;
-
- Version mClientVersion;
- ContextID mContext;
- State *mState;
- const Caps &mCaps;
- const TextureCapsMap &mTextureCaps;
- const Extensions &mExtensions;
- const Limitations &mLimitations;
-
- BufferManager *mBuffers;
- ShaderProgramManager *mShaderPrograms;
- TextureManager *mTextures;
- RenderbufferManager *mRenderbuffers;
- SamplerManager *mSamplers;
- SyncManager *mSyncs;
- PathManager *mPaths;
- FramebufferManager *mFramebuffers;
- ProgramPipelineManager *mPipelines;
-};
-
-class ValidationContext : angle::NonCopyable
-{
- public:
- ValidationContext(const ValidationContext *shareContext,
- TextureManager *shareTextures,
- const Version &clientVersion,
- State *state,
- const Caps &caps,
- const TextureCapsMap &textureCaps,
- const Extensions &extensions,
- const Limitations &limitations,
- bool skipValidation);
- virtual ~ValidationContext();
-
- virtual void handleError(const Error &error) = 0;
-
- const ContextState &getContextState() const { return mState; }
- GLint getClientMajorVersion() const { return mState.getClientMajorVersion(); }
- GLint getClientMinorVersion() const { return mState.getClientMinorVersion(); }
- const Version &getClientVersion() const { return mState.getClientVersion(); }
- const State &getGLState() const { return mState.getState(); }
- const Caps &getCaps() const { return mState.getCaps(); }
- const TextureCapsMap &getTextureCaps() const { return mState.getTextureCaps(); }
- const Extensions &getExtensions() const { return mState.getExtensions(); }
- const Limitations &getLimitations() const { return mState.getLimitations(); }
- bool skipValidation() const { return mSkipValidation; }
-
- // Specific methods needed for validation.
- bool getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams);
- bool getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams);
-
- Program *getProgram(GLuint handle) const;
- Shader *getShader(GLuint handle) const;
-
- bool isTextureGenerated(GLuint texture) const;
- bool isBufferGenerated(GLuint buffer) const;
- bool isRenderbufferGenerated(GLuint renderbuffer) const;
- bool isFramebufferGenerated(GLuint framebuffer) const;
- bool isProgramPipelineGenerated(GLuint pipeline) const;
-
- bool usingDisplayTextureShareGroup() const;
-
- // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
- GLenum getConvertedRenderbufferFormat(GLenum internalformat) const;
-
- bool isWebGL() const { return mState.isWebGL(); }
- bool isWebGL1() const { return mState.isWebGL1(); }
-
- template <typename T>
- const T &getParams() const;
-
- protected:
- ContextState mState;
- bool mSkipValidation;
- bool mDisplayTextureShareGroup;
-
- // Caches entry point parameters and values re-used between layers.
- mutable const ParamTypeInfo *mSavedArgsType;
- static constexpr size_t kParamsBufferSize = 64u;
- mutable std::array<uint8_t, kParamsBufferSize> mParamsBuffer;
-};
-
-template <typename T>
-const T &ValidationContext::getParams() const
-{
- const T *params = reinterpret_cast<T *>(mParamsBuffer.data());
- ASSERT(mSavedArgsType->hasDynamicType(T::TypeInfo));
- return *params;
-}
-
-} // namespace gl
-
-#endif // LIBANGLE_CONTEXTSTATE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Debug.cpp b/src/3rdparty/angle/src/libANGLE/Debug.cpp
deleted file mode 100644
index 96f30df98c..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Debug.cpp
+++ /dev/null
@@ -1,327 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Debug.cpp: Defines debug state used for GL_KHR_debug
-
-#include "libANGLE/Debug.h"
-
-#include "common/debug.h"
-
-#include <algorithm>
-#include <tuple>
-
-namespace gl
-{
-
-Debug::Control::Control()
-{
-}
-
-Debug::Control::~Control()
-{
-}
-
-Debug::Control::Control(const Control &other) = default;
-
-Debug::Group::Group()
-{
-}
-
-Debug::Group::~Group()
-{
-}
-
-Debug::Group::Group(const Group &other) = default;
-
-Debug::Debug()
- : mOutputEnabled(false),
- mCallbackFunction(nullptr),
- mCallbackUserParam(nullptr),
- mMessages(),
- mMaxLoggedMessages(0),
- mOutputSynchronous(false),
- mGroups()
-{
- pushDefaultGroup();
-}
-
-Debug::~Debug()
-{
-}
-
-void Debug::setMaxLoggedMessages(GLuint maxLoggedMessages)
-{
- mMaxLoggedMessages = maxLoggedMessages;
-}
-
-void Debug::setOutputEnabled(bool enabled)
-{
- mOutputEnabled = enabled;
-}
-
-bool Debug::isOutputEnabled() const
-{
- return mOutputEnabled;
-}
-
-void Debug::setOutputSynchronous(bool synchronous)
-{
- mOutputSynchronous = synchronous;
-}
-
-bool Debug::isOutputSynchronous() const
-{
- return mOutputSynchronous;
-}
-
-void Debug::setCallback(GLDEBUGPROCKHR callback, const void *userParam)
-{
- mCallbackFunction = callback;
- mCallbackUserParam = userParam;
-}
-
-GLDEBUGPROCKHR Debug::getCallback() const
-{
- return mCallbackFunction;
-}
-
-const void *Debug::getUserParam() const
-{
- return mCallbackUserParam;
-}
-
-void Debug::insertMessage(GLenum source,
- GLenum type,
- GLuint id,
- GLenum severity,
- const std::string &message)
-{
- std::string messageCopy(message);
- insertMessage(source, type, id, severity, std::move(messageCopy));
-}
-
-void Debug::insertMessage(GLenum source,
- GLenum type,
- GLuint id,
- GLenum severity,
- std::string &&message)
-{
- if (!isMessageEnabled(source, type, id, severity))
- {
- return;
- }
-
- if (mCallbackFunction != nullptr)
- {
- // TODO(geofflang) Check the synchronous flag and potentially flush messages from another
- // thread.
- mCallbackFunction(source, type, id, severity, static_cast<GLsizei>(message.length()),
- message.c_str(), mCallbackUserParam);
- }
- else
- {
- if (mMessages.size() >= mMaxLoggedMessages)
- {
- // Drop messages over the limit
- return;
- }
-
- Message m;
- m.source = source;
- m.type = type;
- m.id = id;
- m.severity = severity;
- m.message = std::move(message);
-
- mMessages.push_back(std::move(m));
- }
-}
-
-size_t Debug::getMessages(GLuint count,
- GLsizei bufSize,
- GLenum *sources,
- GLenum *types,
- GLuint *ids,
- GLenum *severities,
- GLsizei *lengths,
- GLchar *messageLog)
-{
- size_t messageCount = 0;
- size_t messageStringIndex = 0;
- while (messageCount <= count && !mMessages.empty())
- {
- const Message &m = mMessages.front();
-
- if (messageLog != nullptr)
- {
- // Check that this message can fit in the message buffer
- if (messageStringIndex + m.message.length() + 1 > static_cast<size_t>(bufSize))
- {
- break;
- }
-
- std::copy(m.message.begin(), m.message.end(), messageLog + messageStringIndex);
- messageStringIndex += m.message.length();
-
- messageLog[messageStringIndex] = '\0';
- messageStringIndex += 1;
- }
-
- if (sources != nullptr)
- {
- sources[messageCount] = m.source;
- }
-
- if (types != nullptr)
- {
- types[messageCount] = m.type;
- }
-
- if (ids != nullptr)
- {
- ids[messageCount] = m.id;
- }
-
- if (severities != nullptr)
- {
- severities[messageCount] = m.severity;
- }
-
- if (lengths != nullptr)
- {
- lengths[messageCount] = static_cast<GLsizei>(m.message.length());
- }
-
- mMessages.pop_front();
-
- messageCount++;
- }
-
- return messageCount;
-}
-
-size_t Debug::getNextMessageLength() const
-{
- return mMessages.empty() ? 0 : mMessages.front().message.length();
-}
-
-size_t Debug::getMessageCount() const
-{
- return mMessages.size();
-}
-
-void Debug::setMessageControl(GLenum source,
- GLenum type,
- GLenum severity,
- std::vector<GLuint> &&ids,
- bool enabled)
-{
- Control c;
- c.source = source;
- c.type = type;
- c.severity = severity;
- c.ids = std::move(ids);
- c.enabled = enabled;
-
- auto &controls = mGroups.back().controls;
- controls.push_back(std::move(c));
-}
-
-void Debug::pushGroup(GLenum source, GLuint id, std::string &&message)
-{
- insertMessage(source, GL_DEBUG_TYPE_PUSH_GROUP, id, GL_DEBUG_SEVERITY_NOTIFICATION,
- std::string(message));
-
- Group g;
- g.source = source;
- g.id = id;
- g.message = std::move(message);
- mGroups.push_back(std::move(g));
-}
-
-void Debug::popGroup()
-{
- // Make sure the default group is not about to be popped
- ASSERT(mGroups.size() > 1);
-
- Group g = mGroups.back();
- mGroups.pop_back();
-
- insertMessage(g.source, GL_DEBUG_TYPE_POP_GROUP, g.id, GL_DEBUG_SEVERITY_NOTIFICATION,
- g.message);
-}
-
-size_t Debug::getGroupStackDepth() const
-{
- return mGroups.size();
-}
-
-bool Debug::isMessageEnabled(GLenum source, GLenum type, GLuint id, GLenum severity) const
-{
- if (!mOutputEnabled)
- {
- return false;
- }
-
- for (auto groupIter = mGroups.rbegin(); groupIter != mGroups.rend(); groupIter++)
- {
- const auto &controls = groupIter->controls;
- for (auto controlIter = controls.rbegin(); controlIter != controls.rend(); controlIter++)
- {
- const auto &control = *controlIter;
-
- if (control.source != GL_DONT_CARE && control.source != source)
- {
- continue;
- }
-
- if (control.type != GL_DONT_CARE && control.type != type)
- {
- continue;
- }
-
- if (control.severity != GL_DONT_CARE && control.severity != severity)
- {
- continue;
- }
-
- if (!control.ids.empty() &&
- std::find(control.ids.begin(), control.ids.end(), id) == control.ids.end())
- {
- continue;
- }
-
- return control.enabled;
- }
- }
-
- return true;
-}
-
-void Debug::pushDefaultGroup()
-{
- Group g;
- g.source = GL_NONE;
- g.id = 0;
- g.message = "";
-
- Control c0;
- c0.source = GL_DONT_CARE;
- c0.type = GL_DONT_CARE;
- c0.severity = GL_DONT_CARE;
- c0.enabled = true;
- g.controls.push_back(std::move(c0));
-
- Control c1;
- c1.source = GL_DONT_CARE;
- c1.type = GL_DONT_CARE;
- c1.severity = GL_DEBUG_SEVERITY_LOW;
- c1.enabled = false;
- g.controls.push_back(std::move(c1));
-
- mGroups.push_back(std::move(g));
-}
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/Debug.h b/src/3rdparty/angle/src/libANGLE/Debug.h
deleted file mode 100644
index 2c15c25e9a..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Debug.h
+++ /dev/null
@@ -1,129 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Debug.h: Defines debug state used for GL_KHR_debug
-
-#ifndef LIBANGLE_DEBUG_H_
-#define LIBANGLE_DEBUG_H_
-
-#include "angle_gl.h"
-#include "common/angleutils.h"
-
-#include <deque>
-#include <string>
-#include <vector>
-
-namespace gl
-{
-
-class LabeledObject
-{
- public:
- virtual ~LabeledObject() {}
- virtual void setLabel(const std::string &label) = 0;
- virtual const std::string &getLabel() const = 0;
-};
-
-class Debug : angle::NonCopyable
-{
- public:
- Debug();
- ~Debug();
-
- void setMaxLoggedMessages(GLuint maxLoggedMessages);
-
- void setOutputEnabled(bool enabled);
- bool isOutputEnabled() const;
-
- void setOutputSynchronous(bool synchronous);
- bool isOutputSynchronous() const;
-
- void setCallback(GLDEBUGPROCKHR callback, const void *userParam);
- GLDEBUGPROCKHR getCallback() const;
- const void *getUserParam() const;
-
- void insertMessage(GLenum source,
- GLenum type,
- GLuint id,
- GLenum severity,
- const std::string &message);
- void insertMessage(GLenum source,
- GLenum type,
- GLuint id,
- GLenum severity,
- std::string &&message);
-
- void setMessageControl(GLenum source,
- GLenum type,
- GLenum severity,
- std::vector<GLuint> &&ids,
- bool enabled);
- size_t getMessages(GLuint count,
- GLsizei bufSize,
- GLenum *sources,
- GLenum *types,
- GLuint *ids,
- GLenum *severities,
- GLsizei *lengths,
- GLchar *messageLog);
- size_t getNextMessageLength() const;
- size_t getMessageCount() const;
-
- void pushGroup(GLenum source, GLuint id, std::string &&message);
- void popGroup();
- size_t getGroupStackDepth() const;
-
- private:
- bool isMessageEnabled(GLenum source, GLenum type, GLuint id, GLenum severity) const;
-
- void pushDefaultGroup();
-
- struct Message
- {
- GLenum source;
- GLenum type;
- GLuint id;
- GLenum severity;
- std::string message;
- };
-
- struct Control
- {
- Control();
- ~Control();
- Control(const Control &other);
-
- GLenum source;
- GLenum type;
- GLenum severity;
- std::vector<GLuint> ids;
- bool enabled;
- };
-
- struct Group
- {
- Group();
- ~Group();
- Group(const Group &other);
-
- GLenum source;
- GLuint id;
- std::string message;
-
- std::vector<Control> controls;
- };
-
- bool mOutputEnabled;
- GLDEBUGPROCKHR mCallbackFunction;
- const void *mCallbackUserParam;
- std::deque<Message> mMessages;
- GLuint mMaxLoggedMessages;
- bool mOutputSynchronous;
- std::vector<Group> mGroups;
-};
-} // namespace gl
-
-#endif // LIBANGLE_DEBUG_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Device.cpp b/src/3rdparty/angle/src/libANGLE/Device.cpp
deleted file mode 100644
index 3ebf48b919..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Device.cpp
+++ /dev/null
@@ -1,125 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Device.cpp: Implements the egl::Device class, representing the abstract
-// device. Implements EGLDevice.
-
-#include "libANGLE/Device.h"
-
-#include <iterator>
-
-#include <platform/Platform.h>
-#include <EGL/eglext.h>
-
-#include "common/debug.h"
-#include "common/platform.h"
-#include "libANGLE/renderer/DeviceImpl.h"
-
-#if defined(ANGLE_ENABLE_D3D11)
-#include "libANGLE/renderer/d3d/DeviceD3D.h"
-#endif
-
-namespace egl
-{
-
-template <typename T>
-static std::string GenerateExtensionsString(const T &extensions)
-{
- std::vector<std::string> extensionsVector = extensions.getStrings();
-
- std::ostringstream stream;
- std::copy(extensionsVector.begin(), extensionsVector.end(), std::ostream_iterator<std::string>(stream, " "));
- return stream.str();
-}
-
-typedef std::set<egl::Device *> DeviceSet;
-static DeviceSet *GetDeviceSet()
-{
- static DeviceSet devices;
- return &devices;
-}
-
-// Static factory methods
-egl::Error Device::CreateDevice(void *devicePointer, EGLint deviceType, Device **outDevice)
-{
- *outDevice = nullptr;
-
-#if defined(ANGLE_ENABLE_D3D11)
- if (deviceType == EGL_D3D11_DEVICE_ANGLE)
- {
- std::unique_ptr<rx::DeviceD3D> deviceD3D(new rx::DeviceD3D());
- ANGLE_TRY(deviceD3D->initialize(devicePointer, deviceType, EGL_TRUE));
- *outDevice = new Device(nullptr, deviceD3D.release());
- GetDeviceSet()->insert(*outDevice);
- return NoError();
- }
-#endif
-
- // Note that creating an EGL device from inputted D3D9 parameters isn't currently supported
- return EglBadAttribute();
-}
-
-egl::Error Device::CreateDevice(Display *owningDisplay, rx::DeviceImpl *impl, Device **outDevice)
-{
- *outDevice = new Device(owningDisplay, impl);
- GetDeviceSet()->insert(*outDevice);
- return NoError();
-}
-
-bool Device::IsValidDevice(Device *device)
-{
- const DeviceSet *deviceSet = GetDeviceSet();
- return deviceSet->find(device) != deviceSet->end();
-}
-
-Device::Device(Display *owningDisplay, rx::DeviceImpl *impl)
- : mOwningDisplay(owningDisplay), mImplementation(impl)
-{
- initDeviceExtensions();
-}
-
-Device::~Device()
-{
- ASSERT(GetDeviceSet()->find(this) != GetDeviceSet()->end());
- GetDeviceSet()->erase(this);
-
- if (mImplementation->deviceExternallySourced())
- {
- // If the device isn't externally sourced then it is up to the renderer to delete the impl
- SafeDelete(mImplementation);
- }
-}
-
-Error Device::getDevice(EGLAttrib *value)
-{
- void *nativeDevice = nullptr;
- egl::Error error = getImplementation()->getDevice(&nativeDevice);
- *value = reinterpret_cast<EGLAttrib>(nativeDevice);
- return error;
-}
-
-EGLint Device::getType()
-{
- return getImplementation()->getType();
-}
-
-void Device::initDeviceExtensions()
-{
- mImplementation->generateExtensions(&mDeviceExtensions);
- mDeviceExtensionString = GenerateExtensionsString(mDeviceExtensions);
-}
-
-const DeviceExtensions &Device::getExtensions() const
-{
- return mDeviceExtensions;
-}
-
-const std::string &Device::getExtensionString() const
-{
- return mDeviceExtensionString;
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/Device.h b/src/3rdparty/angle/src/libANGLE/Device.h
deleted file mode 100644
index 4bc58ff043..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Device.h
+++ /dev/null
@@ -1,58 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Device.h: Implements the egl::Device class, representing the abstract
-// device. Implements EGLDevice.
-
-#ifndef LIBANGLE_DEVICE_H_
-#define LIBANGLE_DEVICE_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/Display.h"
-
-namespace rx
-{
-class DeviceImpl;
-}
-
-namespace egl
-{
-class Device final : angle::NonCopyable
-{
- public:
- virtual ~Device();
-
- Error getDevice(EGLAttrib *value);
- Display *getOwningDisplay() { return mOwningDisplay; };
- EGLint getType();
-
- const DeviceExtensions &getExtensions() const;
- const std::string &getExtensionString() const;
-
- rx::DeviceImpl *getImplementation() { return mImplementation; }
-
- static egl::Error CreateDevice(void *devicePointer, EGLint deviceType, Device **outDevice);
- static egl::Error CreateDevice(Display *owningDisplay,
- rx::DeviceImpl *impl,
- Device **outDevice);
-
- static bool IsValidDevice(Device *device);
-
- private:
- Device(Display *owningDisplay, rx::DeviceImpl *impl);
- void initDeviceExtensions();
-
- Display *mOwningDisplay;
- rx::DeviceImpl *mImplementation;
-
- DeviceExtensions mDeviceExtensions;
- std::string mDeviceExtensionString;
-};
-
-}
-
-#endif // LIBANGLE_DEVICE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Display.cpp b/src/3rdparty/angle/src/libANGLE/Display.cpp
deleted file mode 100644
index 0bb0bb05b1..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Display.cpp
+++ /dev/null
@@ -1,1240 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Display.cpp: Implements the egl::Display class, representing the abstract
-// display on which graphics are drawn. Implements EGLDisplay.
-// [EGL 1.4] section 2.1.2 page 3.
-
-#include "libANGLE/Display.h"
-
-#include <algorithm>
-#include <iterator>
-#include <map>
-#include <sstream>
-#include <vector>
-
-#include <platform/Platform.h>
-#include <EGL/eglext.h>
-
-#include "common/debug.h"
-#include "common/mathutil.h"
-#include "common/platform.h"
-#include "common/utilities.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Device.h"
-#include "libANGLE/histogram_macros.h"
-#include "libANGLE/Image.h"
-#include "libANGLE/Surface.h"
-#include "libANGLE/Stream.h"
-#include "libANGLE/ResourceManager.h"
-#include "libANGLE/renderer/DisplayImpl.h"
-#include "libANGLE/renderer/ImageImpl.h"
-#include "third_party/trace_event/trace_event.h"
-
-#if defined(ANGLE_ENABLE_D3D9) || defined(ANGLE_ENABLE_D3D11)
-# include "libANGLE/renderer/d3d/DisplayD3D.h"
-#endif
-
-#if defined(ANGLE_ENABLE_OPENGL)
-# if defined(ANGLE_PLATFORM_WINDOWS)
-# include "libANGLE/renderer/gl/wgl/DisplayWGL.h"
-# elif defined(ANGLE_USE_X11)
-# include "libANGLE/renderer/gl/glx/DisplayGLX.h"
-# elif defined(ANGLE_PLATFORM_APPLE)
-# include "libANGLE/renderer/gl/cgl/DisplayCGL.h"
-# elif defined(ANGLE_USE_OZONE)
-# include "libANGLE/renderer/gl/egl/ozone/DisplayOzone.h"
-# elif defined(ANGLE_PLATFORM_ANDROID)
-# include "libANGLE/renderer/gl/egl/android/DisplayAndroid.h"
-# else
-# error Unsupported OpenGL platform.
-# endif
-#endif
-
-#if defined(ANGLE_ENABLE_NULL)
-#include "libANGLE/renderer/null/DisplayNULL.h"
-#endif // defined(ANGLE_ENABLE_NULL)
-
-#if defined(ANGLE_ENABLE_VULKAN)
-#if defined(ANGLE_PLATFORM_WINDOWS)
-#include "libANGLE/renderer/vulkan/win32/DisplayVkWin32.h"
-#elif defined(ANGLE_PLATFORM_LINUX)
-#include "libANGLE/renderer/vulkan/xcb/DisplayVkXcb.h"
-#else
-#error Unsupported Vulkan platform.
-#endif
-#endif // defined(ANGLE_ENABLE_VULKAN)
-
-namespace egl
-{
-
-namespace
-{
-
-typedef std::map<EGLNativeWindowType, Surface*> WindowSurfaceMap;
-// Get a map of all EGL window surfaces to validate that no window has more than one EGL surface
-// associated with it.
-static WindowSurfaceMap *GetWindowSurfaces()
-{
- static WindowSurfaceMap windowSurfaces;
- return &windowSurfaces;
-}
-
-typedef std::map<EGLNativeDisplayType, Display *> ANGLEPlatformDisplayMap;
-static ANGLEPlatformDisplayMap *GetANGLEPlatformDisplayMap()
-{
- static ANGLEPlatformDisplayMap displays;
- return &displays;
-}
-
-typedef std::map<Device *, Display *> DevicePlatformDisplayMap;
-static DevicePlatformDisplayMap *GetDevicePlatformDisplayMap()
-{
- static DevicePlatformDisplayMap displays;
- return &displays;
-}
-
-rx::DisplayImpl *CreateDisplayFromDevice(Device *eglDevice, const DisplayState &state)
-{
- rx::DisplayImpl *impl = nullptr;
-
- switch (eglDevice->getType())
- {
-#if defined(ANGLE_ENABLE_D3D11)
- case EGL_D3D11_DEVICE_ANGLE:
- impl = new rx::DisplayD3D(state);
- break;
-#endif
-#if defined(ANGLE_ENABLE_D3D9)
- case EGL_D3D9_DEVICE_ANGLE:
- // Currently the only way to get EGLDeviceEXT representing a D3D9 device
- // is to retrieve one from an already-existing EGLDisplay.
- // When eglGetPlatformDisplayEXT is called with a D3D9 EGLDeviceEXT,
- // the already-existing display should be returned.
- // Therefore this codepath to create a new display from the device
- // should never be hit.
- UNREACHABLE();
- break;
-#endif
- default:
- UNREACHABLE();
- break;
- }
-
- ASSERT(impl != nullptr);
- return impl;
-}
-
-rx::DisplayImpl *CreateDisplayFromAttribs(const AttributeMap &attribMap, const DisplayState &state)
-{
- rx::DisplayImpl *impl = nullptr;
- EGLAttrib displayType =
- attribMap.get(EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE);
- switch (displayType)
- {
- case EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE:
-#if defined(ANGLE_ENABLE_D3D9) || defined(ANGLE_ENABLE_D3D11)
- // Default to D3D displays
- impl = new rx::DisplayD3D(state);
-#elif defined(ANGLE_USE_X11)
- impl = new rx::DisplayGLX(state);
-#elif defined(ANGLE_PLATFORM_APPLE)
- impl = new rx::DisplayCGL(state);
-#elif defined(ANGLE_USE_OZONE)
- impl = new rx::DisplayOzone(state);
-#elif defined(ANGLE_PLATFORM_ANDROID)
- impl = new rx::DisplayAndroid(state);
-#else
- // No display available
- UNREACHABLE();
-#endif
- break;
-
- case EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE:
- case EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE:
-#if defined(ANGLE_ENABLE_D3D9) || defined(ANGLE_ENABLE_D3D11)
- impl = new rx::DisplayD3D(state);
-#else
- // A D3D display was requested on a platform that doesn't support it
- UNREACHABLE();
-#endif
- break;
-
- case EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE:
-#if defined(ANGLE_ENABLE_OPENGL)
-#if defined(ANGLE_PLATFORM_WINDOWS)
- impl = new rx::DisplayWGL(state);
-#elif defined(ANGLE_USE_X11)
- impl = new rx::DisplayGLX(state);
-#elif defined(ANGLE_PLATFORM_APPLE)
- impl = new rx::DisplayCGL(state);
-#elif defined(ANGLE_USE_OZONE)
- // This might work but has never been tried, so disallow for now.
- impl = nullptr;
-#elif defined(ANGLE_PLATFORM_ANDROID)
- // No GL support on this platform, fail display creation.
- impl = nullptr;
-#else
-#error Unsupported OpenGL platform.
-#endif
-#else
- // No display available
- UNREACHABLE();
-#endif // defined(ANGLE_ENABLE_OPENGL)
- break;
-
- case EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE:
-#if defined(ANGLE_ENABLE_OPENGL)
-#if defined(ANGLE_PLATFORM_WINDOWS)
- impl = new rx::DisplayWGL(state);
-#elif defined(ANGLE_USE_X11)
- impl = new rx::DisplayGLX(state);
-#elif defined(ANGLE_USE_OZONE)
- impl = new rx::DisplayOzone(state);
-#elif defined(ANGLE_PLATFORM_ANDROID)
- impl = new rx::DisplayAndroid(state);
-#else
- // No GLES support on this platform, fail display creation.
- impl = nullptr;
-#endif
-#endif // defined(ANGLE_ENABLE_OPENGL)
- break;
-
- case EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE:
-#if defined(ANGLE_ENABLE_VULKAN)
-#if defined(ANGLE_PLATFORM_WINDOWS)
- impl = new rx::DisplayVkWin32(state);
-#elif defined(ANGLE_PLATFORM_LINUX)
- impl = new rx::DisplayVkXcb(state);
-#else
-#error Unsupported Vulkan platform.
-#endif
-#else
- // No display available
- UNREACHABLE();
-#endif // defined(ANGLE_ENABLE_VULKAN)
- break;
-
- case EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE:
-#if defined(ANGLE_ENABLE_NULL)
- impl = new rx::DisplayNULL(state);
-#else
- // No display available
- UNREACHABLE();
-#endif // defined(ANGLE_ENABLE_NULL)
- break;
-
- default:
- UNREACHABLE();
- break;
- }
-
- return impl;
-}
-
-void Display_logError(angle::PlatformMethods *platform, const char *errorMessage)
-{
- gl::Trace(gl::LOG_ERR, errorMessage);
-}
-
-void Display_logWarning(angle::PlatformMethods *platform, const char *warningMessage)
-{
- gl::Trace(gl::LOG_WARN, warningMessage);
-}
-
-void Display_logInfo(angle::PlatformMethods *platform, const char *infoMessage)
-{
- // Uncomment to get info spam
- // gl::Trace(gl::LOG_WARN, infoMessage);
-}
-
-void ANGLESetDefaultDisplayPlatform(angle::EGLDisplayType display)
-{
- angle::PlatformMethods *platformMethods = ANGLEPlatformCurrent();
- if (platformMethods->logError != angle::DefaultLogError)
- {
- // Don't reset pre-set Platform to Default
- return;
- }
-
- ANGLEResetDisplayPlatform(display);
- platformMethods->logError = Display_logError;
- platformMethods->logWarning = Display_logWarning;
- platformMethods->logInfo = Display_logInfo;
-}
-
-} // anonymous namespace
-
-DisplayState::DisplayState()
-{
-}
-
-DisplayState::~DisplayState()
-{
-}
-
-// static
-Display *Display::GetDisplayFromNativeDisplay(EGLNativeDisplayType nativeDisplay,
- const AttributeMap &attribMap)
-{
- Display *display = nullptr;
-
- ANGLEPlatformDisplayMap *displays = GetANGLEPlatformDisplayMap();
- const auto &iter = displays->find(nativeDisplay);
- if (iter != displays->end())
- {
- display = iter->second;
- }
-
- if (display == nullptr)
- {
- // Validate the native display
- if (!Display::isValidNativeDisplay(nativeDisplay))
- {
- return nullptr;
- }
-
- display = new Display(EGL_PLATFORM_ANGLE_ANGLE, nativeDisplay, nullptr);
- displays->insert(std::make_pair(nativeDisplay, display));
- }
-
- // Apply new attributes if the display is not initialized yet.
- if (!display->isInitialized())
- {
- rx::DisplayImpl *impl = CreateDisplayFromAttribs(attribMap, display->getState());
- if (impl == nullptr)
- {
- // No valid display implementation for these attributes
- return nullptr;
- }
-
- display->setAttributes(impl, attribMap);
- }
-
- return display;
-}
-
-// static
-Display *Display::GetDisplayFromDevice(Device *device, const AttributeMap &attribMap)
-{
- Display *display = nullptr;
-
- ASSERT(Device::IsValidDevice(device));
-
- ANGLEPlatformDisplayMap *anglePlatformDisplays = GetANGLEPlatformDisplayMap();
- DevicePlatformDisplayMap *devicePlatformDisplays = GetDevicePlatformDisplayMap();
-
- // First see if this eglDevice is in use by a Display created using ANGLE platform
- for (auto &displayMapEntry : *anglePlatformDisplays)
- {
- egl::Display *iterDisplay = displayMapEntry.second;
- if (iterDisplay->getDevice() == device)
- {
- display = iterDisplay;
- }
- }
-
- if (display == nullptr)
- {
- // See if the eglDevice is in use by a Display created using the DEVICE platform
- const auto &iter = devicePlatformDisplays->find(device);
- if (iter != devicePlatformDisplays->end())
- {
- display = iter->second;
- }
- }
-
- if (display == nullptr)
- {
- // Otherwise create a new Display
- display = new Display(EGL_PLATFORM_DEVICE_EXT, 0, device);
- devicePlatformDisplays->insert(std::make_pair(device, display));
- }
-
- // Apply new attributes if the display is not initialized yet.
- if (!display->isInitialized())
- {
- rx::DisplayImpl *impl = CreateDisplayFromDevice(device, display->getState());
- display->setAttributes(impl, attribMap);
- }
-
- return display;
-}
-
-//static
-void Display::CleanupDisplays()
-{
- // ~Display takes care of removing the entry from the according map
- {
- ANGLEPlatformDisplayMap *displays = GetANGLEPlatformDisplayMap();
- while (!displays->empty())
- delete displays->begin()->second;
- }
-
- {
- DevicePlatformDisplayMap *displays = GetDevicePlatformDisplayMap();
- while (!displays->empty())
- delete displays->begin()->second;
- }
-}
-
-Display::Display(EGLenum platform, EGLNativeDisplayType displayId, Device *eglDevice)
- : mImplementation(nullptr),
- mDisplayId(displayId),
- mAttributeMap(),
- mConfigSet(),
- mContextSet(),
- mStreamSet(),
- mInitialized(false),
- mDeviceLost(false),
- mCaps(),
- mDisplayExtensions(),
- mDisplayExtensionString(),
- mVendorString(),
- mDevice(eglDevice),
- mPlatform(platform),
- mTextureManager(nullptr),
- mMemoryProgramCache(gl::kDefaultMaxProgramCacheMemoryBytes),
- mGlobalTextureShareGroupUsers(0),
- mProxyContext(this)
-{
-}
-
-Display::~Display()
-{
- // TODO(jmadill): When is this called?
- // terminate();
-
- if (mPlatform == EGL_PLATFORM_ANGLE_ANGLE)
- {
- ANGLEPlatformDisplayMap *displays = GetANGLEPlatformDisplayMap();
- ANGLEPlatformDisplayMap::iterator iter = displays->find(mDisplayId);
- if (iter != displays->end())
- {
- displays->erase(iter);
- }
- }
- else if (mPlatform == EGL_PLATFORM_DEVICE_EXT)
- {
- DevicePlatformDisplayMap *displays = GetDevicePlatformDisplayMap();
- DevicePlatformDisplayMap::iterator iter = displays->find(mDevice);
- if (iter != displays->end())
- {
- displays->erase(iter);
- }
- }
- else
- {
- UNREACHABLE();
- }
-
- mProxyContext.reset(nullptr);
-
- SafeDelete(mDevice);
- SafeDelete(mImplementation);
-}
-
-void Display::setAttributes(rx::DisplayImpl *impl, const AttributeMap &attribMap)
-{
- ASSERT(!mInitialized);
-
- ASSERT(impl != nullptr);
- SafeDelete(mImplementation);
- mImplementation = impl;
-
- mAttributeMap = attribMap;
-}
-
-Error Display::initialize()
-{
- // TODO(jmadill): Store Platform in Display and init here.
- const angle::PlatformMethods *platformMethods =
- reinterpret_cast<const angle::PlatformMethods *>(
- mAttributeMap.get(EGL_PLATFORM_ANGLE_PLATFORM_METHODS_ANGLEX, 0));
- if (platformMethods != nullptr)
- {
- *ANGLEPlatformCurrent() = *platformMethods;
- }
- else
- {
- ANGLESetDefaultDisplayPlatform(this);
- }
-
- gl::InitializeDebugAnnotations(&mAnnotator);
-
- SCOPED_ANGLE_HISTOGRAM_TIMER("GPU.ANGLE.DisplayInitializeMS");
- TRACE_EVENT0("gpu.angle", "egl::Display::initialize");
-
- ASSERT(mImplementation != nullptr);
-
- if (isInitialized())
- {
- return NoError();
- }
-
- Error error = mImplementation->initialize(this);
- if (error.isError())
- {
- // Log extended error message here
- ERR() << "ANGLE Display::initialize error " << error.getID() << ": " << error.getMessage();
- return error;
- }
-
- mCaps = mImplementation->getCaps();
-
- mConfigSet = mImplementation->generateConfigs();
- if (mConfigSet.size() == 0)
- {
- mImplementation->terminate();
- return EglNotInitialized();
- }
-
- initDisplayExtensions();
- initVendorString();
-
- // Populate the Display's EGLDeviceEXT if the Display wasn't created using one
- if (mPlatform != EGL_PLATFORM_DEVICE_EXT)
- {
- if (mDisplayExtensions.deviceQuery)
- {
- rx::DeviceImpl *impl = nullptr;
- ANGLE_TRY(mImplementation->getDevice(&impl));
- ANGLE_TRY(Device::CreateDevice(this, impl, &mDevice));
- }
- else
- {
- mDevice = nullptr;
- }
- }
- else
- {
- // For EGL_PLATFORM_DEVICE_EXT, mDevice should always be populated using
- // an external device
- ASSERT(mDevice != nullptr);
- }
-
- mProxyContext.reset(nullptr);
- gl::Context *proxyContext = new gl::Context(mImplementation, nullptr, nullptr, nullptr, nullptr,
- egl::AttributeMap(), mDisplayExtensions);
- mProxyContext.reset(proxyContext);
-
- mInitialized = true;
-
- return NoError();
-}
-
-Error Display::terminate()
-{
- ANGLE_TRY(makeCurrent(nullptr, nullptr, nullptr));
-
- mMemoryProgramCache.clear();
-
- mProxyContext.reset(nullptr);
-
- while (!mContextSet.empty())
- {
- ANGLE_TRY(destroyContext(*mContextSet.begin()));
- }
-
- // The global texture manager should be deleted with the last context that uses it.
- ASSERT(mGlobalTextureShareGroupUsers == 0 && mTextureManager == nullptr);
-
- while (!mImageSet.empty())
- {
- destroyImage(*mImageSet.begin());
- }
-
- while (!mStreamSet.empty())
- {
- destroyStream(*mStreamSet.begin());
- }
-
- while (!mState.surfaceSet.empty())
- {
- ANGLE_TRY(destroySurface(*mState.surfaceSet.begin()));
- }
-
- mConfigSet.clear();
-
- if (mDevice != nullptr && mDevice->getOwningDisplay() != nullptr)
- {
- // Don't delete the device if it was created externally using eglCreateDeviceANGLE
- // We also shouldn't set it to null in case eglInitialize() is called again later
- SafeDelete(mDevice);
- }
-
- mImplementation->terminate();
-
- mDeviceLost = false;
-
- mInitialized = false;
-
- gl::UninitializeDebugAnnotations();
-
- // TODO(jmadill): Store Platform in Display and deinit here.
- ANGLEResetDisplayPlatform(this);
-
- return NoError();
-}
-
-std::vector<const Config*> Display::getConfigs(const egl::AttributeMap &attribs) const
-{
- return mConfigSet.filter(attribs);
-}
-
-Error Display::createWindowSurface(const Config *configuration,
- EGLNativeWindowType window,
- const AttributeMap &attribs,
- Surface **outSurface)
-{
- if (mImplementation->testDeviceLost())
- {
- ANGLE_TRY(restoreLostDevice());
- }
-
- SurfacePointer surface(new WindowSurface(mImplementation, configuration, window, attribs),
- this);
- ANGLE_TRY(surface->initialize(this));
-
- ASSERT(outSurface != nullptr);
- *outSurface = surface.release();
- mState.surfaceSet.insert(*outSurface);
-
- WindowSurfaceMap *windowSurfaces = GetWindowSurfaces();
- ASSERT(windowSurfaces && windowSurfaces->find(window) == windowSurfaces->end());
- windowSurfaces->insert(std::make_pair(window, *outSurface));
-
- return NoError();
-}
-
-Error Display::createPbufferSurface(const Config *configuration,
- const AttributeMap &attribs,
- Surface **outSurface)
-{
- ASSERT(isInitialized());
-
- if (mImplementation->testDeviceLost())
- {
- ANGLE_TRY(restoreLostDevice());
- }
-
- SurfacePointer surface(new PbufferSurface(mImplementation, configuration, attribs), this);
- ANGLE_TRY(surface->initialize(this));
-
- ASSERT(outSurface != nullptr);
- *outSurface = surface.release();
- mState.surfaceSet.insert(*outSurface);
-
- return NoError();
-}
-
-Error Display::createPbufferFromClientBuffer(const Config *configuration,
- EGLenum buftype,
- EGLClientBuffer clientBuffer,
- const AttributeMap &attribs,
- Surface **outSurface)
-{
- ASSERT(isInitialized());
-
- if (mImplementation->testDeviceLost())
- {
- ANGLE_TRY(restoreLostDevice());
- }
-
- SurfacePointer surface(
- new PbufferSurface(mImplementation, configuration, buftype, clientBuffer, attribs), this);
- ANGLE_TRY(surface->initialize(this));
-
- ASSERT(outSurface != nullptr);
- *outSurface = surface.release();
- mState.surfaceSet.insert(*outSurface);
-
- return NoError();
-}
-
-Error Display::createPixmapSurface(const Config *configuration,
- NativePixmapType nativePixmap,
- const AttributeMap &attribs,
- Surface **outSurface)
-{
- ASSERT(isInitialized());
-
- if (mImplementation->testDeviceLost())
- {
- ANGLE_TRY(restoreLostDevice());
- }
-
- SurfacePointer surface(new PixmapSurface(mImplementation, configuration, nativePixmap, attribs),
- this);
- ANGLE_TRY(surface->initialize(this));
-
- ASSERT(outSurface != nullptr);
- *outSurface = surface.release();
- mState.surfaceSet.insert(*outSurface);
-
- return NoError();
-}
-
-Error Display::createImage(const gl::Context *context,
- EGLenum target,
- EGLClientBuffer buffer,
- const AttributeMap &attribs,
- Image **outImage)
-{
- ASSERT(isInitialized());
-
- if (mImplementation->testDeviceLost())
- {
- ANGLE_TRY(restoreLostDevice());
- }
-
- egl::ImageSibling *sibling = nullptr;
- if (IsTextureTarget(target))
- {
- sibling = context->getTexture(egl_gl::EGLClientBufferToGLObjectHandle(buffer));
- }
- else if (IsRenderbufferTarget(target))
- {
- sibling = context->getRenderbuffer(egl_gl::EGLClientBufferToGLObjectHandle(buffer));
- }
- else
- {
- UNREACHABLE();
- }
- ASSERT(sibling != nullptr);
-
- angle::UniqueObjectPointer<Image, gl::Context> imagePtr(
- new Image(mImplementation, target, sibling, attribs), context);
- ANGLE_TRY(imagePtr->initialize());
-
- Image *image = imagePtr.release();
-
- ASSERT(outImage != nullptr);
- *outImage = image;
-
- // Add this image to the list of all images and hold a ref to it.
- image->addRef();
- mImageSet.insert(image);
-
- return NoError();
-}
-
-Error Display::createStream(const AttributeMap &attribs, Stream **outStream)
-{
- ASSERT(isInitialized());
-
- Stream *stream = new Stream(this, attribs);
-
- ASSERT(stream != nullptr);
- mStreamSet.insert(stream);
-
- ASSERT(outStream != nullptr);
- *outStream = stream;
-
- return NoError();
-}
-
-Error Display::createContext(const Config *configuration,
- gl::Context *shareContext,
- const AttributeMap &attribs,
- gl::Context **outContext)
-{
- ASSERT(isInitialized());
-
- if (mImplementation->testDeviceLost())
- {
- ANGLE_TRY(restoreLostDevice());
- }
-
- // This display texture sharing will allow the first context to create the texture share group.
- bool usingDisplayTextureShareGroup =
- attribs.get(EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE, EGL_FALSE) == EGL_TRUE;
- gl::TextureManager *shareTextures = nullptr;
-
- if (usingDisplayTextureShareGroup)
- {
- ASSERT((mTextureManager == nullptr) == (mGlobalTextureShareGroupUsers == 0));
- if (mTextureManager == nullptr)
- {
- mTextureManager = new gl::TextureManager();
- }
-
- mGlobalTextureShareGroupUsers++;
- shareTextures = mTextureManager;
- }
-
- gl::MemoryProgramCache *cachePointer = &mMemoryProgramCache;
-
- // Check context creation attributes to see if we should enable the cache.
- if (mAttributeMap.get(EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE, EGL_TRUE) == EGL_FALSE)
- {
- cachePointer = nullptr;
- }
-
- // A program cache size of zero indicates it should be disabled.
- if (mMemoryProgramCache.maxSize() == 0)
- {
- cachePointer = nullptr;
- }
-
- gl::Context *context =
- new gl::Context(mImplementation, configuration, shareContext, shareTextures, cachePointer,
- attribs, mDisplayExtensions);
-
- ASSERT(context != nullptr);
- mContextSet.insert(context);
-
- ASSERT(outContext != nullptr);
- *outContext = context;
- return NoError();
-}
-
-Error Display::makeCurrent(egl::Surface *drawSurface,
- egl::Surface *readSurface,
- gl::Context *context)
-{
- ANGLE_TRY(mImplementation->makeCurrent(drawSurface, readSurface, context));
-
- if (context != nullptr)
- {
- ASSERT(readSurface == drawSurface);
- ANGLE_TRY(context->makeCurrent(this, drawSurface));
- }
-
- return NoError();
-}
-
-Error Display::restoreLostDevice()
-{
- for (ContextSet::iterator ctx = mContextSet.begin(); ctx != mContextSet.end(); ctx++)
- {
- if ((*ctx)->isResetNotificationEnabled())
- {
- // If reset notifications have been requested, application must delete all contexts first
- return EglContextLost();
- }
- }
-
- return mImplementation->restoreLostDevice(this);
-}
-
-Error Display::destroySurface(Surface *surface)
-{
- if (surface->getType() == EGL_WINDOW_BIT)
- {
- WindowSurfaceMap *windowSurfaces = GetWindowSurfaces();
- ASSERT(windowSurfaces);
-
- bool surfaceRemoved = false;
- for (WindowSurfaceMap::iterator iter = windowSurfaces->begin(); iter != windowSurfaces->end(); iter++)
- {
- if (iter->second == surface)
- {
- windowSurfaces->erase(iter);
- surfaceRemoved = true;
- break;
- }
- }
-
- ASSERT(surfaceRemoved);
- }
-
- mState.surfaceSet.erase(surface);
- ANGLE_TRY(surface->onDestroy(this));
- return NoError();
-}
-
-void Display::destroyImage(egl::Image *image)
-{
- auto iter = mImageSet.find(image);
- ASSERT(iter != mImageSet.end());
- (*iter)->release(mProxyContext.get());
- mImageSet.erase(iter);
-}
-
-void Display::destroyStream(egl::Stream *stream)
-{
- mStreamSet.erase(stream);
- SafeDelete(stream);
-}
-
-Error Display::destroyContext(gl::Context *context)
-{
- if (context->usingDisplayTextureShareGroup())
- {
- ASSERT(mGlobalTextureShareGroupUsers >= 1 && mTextureManager != nullptr);
- if (mGlobalTextureShareGroupUsers == 1)
- {
- // If this is the last context using the global share group, destroy the global texture
- // manager so that the textures can be destroyed while a context still exists
- mTextureManager->release(context);
- mTextureManager = nullptr;
- }
- mGlobalTextureShareGroupUsers--;
- }
-
- ANGLE_TRY(context->onDestroy(this));
- mContextSet.erase(context);
- SafeDelete(context);
- return NoError();
-}
-
-bool Display::isDeviceLost() const
-{
- ASSERT(isInitialized());
- return mDeviceLost;
-}
-
-bool Display::testDeviceLost()
-{
- ASSERT(isInitialized());
-
- if (!mDeviceLost && mImplementation->testDeviceLost())
- {
- notifyDeviceLost();
- }
-
- return mDeviceLost;
-}
-
-void Display::notifyDeviceLost()
-{
- if (mDeviceLost)
- {
- return;
- }
-
- for (ContextSet::iterator context = mContextSet.begin(); context != mContextSet.end(); context++)
- {
- (*context)->markContextLost();
- }
-
- mDeviceLost = true;
-}
-
-Error Display::waitClient(const gl::Context *context) const
-{
- return mImplementation->waitClient(context);
-}
-
-Error Display::waitNative(const gl::Context *context, EGLint engine) const
-{
- return mImplementation->waitNative(context, engine);
-}
-
-const Caps &Display::getCaps() const
-{
- return mCaps;
-}
-
-bool Display::isInitialized() const
-{
- return mInitialized;
-}
-
-bool Display::isValidConfig(const Config *config) const
-{
- return mConfigSet.contains(config);
-}
-
-bool Display::isValidContext(const gl::Context *context) const
-{
- return mContextSet.find(const_cast<gl::Context *>(context)) != mContextSet.end();
-}
-
-bool Display::isValidSurface(const Surface *surface) const
-{
- return mState.surfaceSet.find(const_cast<Surface *>(surface)) != mState.surfaceSet.end();
-}
-
-bool Display::isValidImage(const Image *image) const
-{
- return mImageSet.find(const_cast<Image *>(image)) != mImageSet.end();
-}
-
-bool Display::isValidStream(const Stream *stream) const
-{
- return mStreamSet.find(const_cast<Stream *>(stream)) != mStreamSet.end();
-}
-
-bool Display::hasExistingWindowSurface(EGLNativeWindowType window)
-{
- WindowSurfaceMap *windowSurfaces = GetWindowSurfaces();
- ASSERT(windowSurfaces);
-
- return windowSurfaces->find(window) != windowSurfaces->end();
-}
-
-static ClientExtensions GenerateClientExtensions()
-{
- ClientExtensions extensions;
-
- extensions.clientExtensions = true;
- extensions.platformBase = true;
- extensions.platformANGLE = true;
-
-#if defined(ANGLE_ENABLE_D3D9) || defined(ANGLE_ENABLE_D3D11)
- extensions.platformANGLED3D = true;
- extensions.platformDevice = true;
-#endif
-
-#if defined(ANGLE_ENABLE_OPENGL)
- extensions.platformANGLEOpenGL = true;
-#endif
-
-#if defined(ANGLE_ENABLE_NULL)
- extensions.platformANGLENULL = true;
-#endif
-
-#if defined(ANGLE_ENABLE_D3D11)
- extensions.deviceCreation = true;
- extensions.deviceCreationD3D11 = true;
- extensions.experimentalPresentPath = true;
-#endif
-
-#if defined(ANGLE_ENABLE_VULKAN)
- extensions.platformANGLEVulkan = true;
-#endif
-
-#if defined(ANGLE_USE_X11)
- extensions.x11Visual = true;
-#endif
-
- extensions.clientGetAllProcAddresses = true;
-
- return extensions;
-}
-
-template <typename T>
-static std::string GenerateExtensionsString(const T &extensions)
-{
- std::vector<std::string> extensionsVector = extensions.getStrings();
-
- std::ostringstream stream;
- std::copy(extensionsVector.begin(), extensionsVector.end(), std::ostream_iterator<std::string>(stream, " "));
- return stream.str();
-}
-
-// static
-const ClientExtensions &Display::GetClientExtensions()
-{
- static const ClientExtensions clientExtensions = GenerateClientExtensions();
- return clientExtensions;
-}
-
-// static
-const std::string &Display::GetClientExtensionString()
-{
- static const std::string clientExtensionsString =
- GenerateExtensionsString(GetClientExtensions());
- return clientExtensionsString;
-}
-
-void Display::initDisplayExtensions()
-{
- mDisplayExtensions = mImplementation->getExtensions();
-
- // Some extensions are always available because they are implemented in the EGL layer.
- mDisplayExtensions.createContext = true;
- mDisplayExtensions.createContextNoError = true;
- mDisplayExtensions.createContextWebGLCompatibility = true;
- mDisplayExtensions.createContextBindGeneratesResource = true;
- mDisplayExtensions.createContextClientArrays = true;
- mDisplayExtensions.pixelFormatFloat = true;
-
- // Force EGL_KHR_get_all_proc_addresses on.
- mDisplayExtensions.getAllProcAddresses = true;
-
- // Enable program cache control since it is not back-end dependent.
- mDisplayExtensions.programCacheControl = true;
-
- mDisplayExtensionString = GenerateExtensionsString(mDisplayExtensions);
-}
-
-bool Display::isValidNativeWindow(EGLNativeWindowType window) const
-{
- return mImplementation->isValidNativeWindow(window);
-}
-
-Error Display::validateClientBuffer(const Config *configuration,
- EGLenum buftype,
- EGLClientBuffer clientBuffer,
- const AttributeMap &attribs)
-{
- return mImplementation->validateClientBuffer(configuration, buftype, clientBuffer, attribs);
-}
-
-bool Display::isValidDisplay(const egl::Display *display)
-{
- const ANGLEPlatformDisplayMap *anglePlatformDisplayMap = GetANGLEPlatformDisplayMap();
- for (const auto &displayPair : *anglePlatformDisplayMap)
- {
- if (displayPair.second == display)
- {
- return true;
- }
- }
-
- const DevicePlatformDisplayMap *devicePlatformDisplayMap = GetDevicePlatformDisplayMap();
- for (const auto &displayPair : *devicePlatformDisplayMap)
- {
- if (displayPair.second == display)
- {
- return true;
- }
- }
-
- return false;
-}
-
-bool Display::isValidNativeDisplay(EGLNativeDisplayType display)
-{
- // TODO(jmadill): handle this properly
- if (display == EGL_DEFAULT_DISPLAY)
- {
- return true;
- }
-
-#if defined(ANGLE_PLATFORM_WINDOWS) && !defined(ANGLE_ENABLE_WINDOWS_STORE)
- if (display == EGL_SOFTWARE_DISPLAY_ANGLE ||
- display == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
- display == EGL_D3D11_ONLY_DISPLAY_ANGLE)
- {
- return true;
- }
- return (WindowFromDC(display) != nullptr);
-#else
- return true;
-#endif
-}
-
-void Display::initVendorString()
-{
- mVendorString = mImplementation->getVendorString();
-}
-
-const DisplayExtensions &Display::getExtensions() const
-{
- return mDisplayExtensions;
-}
-
-const std::string &Display::getExtensionString() const
-{
- return mDisplayExtensionString;
-}
-
-const std::string &Display::getVendorString() const
-{
- return mVendorString;
-}
-
-Device *Display::getDevice() const
-{
- return mDevice;
-}
-
-gl::Version Display::getMaxSupportedESVersion() const
-{
- return mImplementation->getMaxSupportedESVersion();
-}
-
-EGLint Display::programCacheGetAttrib(EGLenum attrib) const
-{
- switch (attrib)
- {
- case EGL_PROGRAM_CACHE_KEY_LENGTH_ANGLE:
- return static_cast<EGLint>(gl::kProgramHashLength);
-
- case EGL_PROGRAM_CACHE_SIZE_ANGLE:
- return static_cast<EGLint>(mMemoryProgramCache.entryCount());
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-Error Display::programCacheQuery(EGLint index,
- void *key,
- EGLint *keysize,
- void *binary,
- EGLint *binarysize)
-{
- ASSERT(index >= 0 && index < static_cast<EGLint>(mMemoryProgramCache.entryCount()));
-
- const angle::MemoryBuffer *programBinary = nullptr;
- gl::ProgramHash programHash;
- // TODO(jmadill): Make this thread-safe.
- bool result =
- mMemoryProgramCache.getAt(static_cast<size_t>(index), &programHash, &programBinary);
- if (!result)
- {
- return EglBadAccess() << "Program binary not accessible.";
- }
-
- ASSERT(keysize && binarysize);
-
- if (key)
- {
- ASSERT(*keysize == static_cast<EGLint>(gl::kProgramHashLength));
- memcpy(key, programHash.data(), gl::kProgramHashLength);
- }
-
- if (binary)
- {
- // Note: we check the size here instead of in the validation code, since we need to
- // access the cache as atomically as possible. It's possible that the cache contents
- // could change between the validation size check and the retrieval.
- if (programBinary->size() > static_cast<size_t>(*binarysize))
- {
- return EglBadAccess() << "Program binary too large or changed during access.";
- }
-
- memcpy(binary, programBinary->data(), programBinary->size());
- }
-
- *binarysize = static_cast<EGLint>(programBinary->size());
- *keysize = static_cast<EGLint>(gl::kProgramHashLength);
-
- return NoError();
-}
-
-Error Display::programCachePopulate(const void *key,
- EGLint keysize,
- const void *binary,
- EGLint binarysize)
-{
- ASSERT(keysize == static_cast<EGLint>(gl::kProgramHashLength));
-
- gl::ProgramHash programHash;
- memcpy(programHash.data(), key, gl::kProgramHashLength);
-
- mMemoryProgramCache.putBinary(programHash, reinterpret_cast<const uint8_t *>(binary),
- static_cast<size_t>(binarysize));
- return NoError();
-}
-
-EGLint Display::programCacheResize(EGLint limit, EGLenum mode)
-{
- switch (mode)
- {
- case EGL_PROGRAM_CACHE_RESIZE_ANGLE:
- {
- size_t initialSize = mMemoryProgramCache.size();
- mMemoryProgramCache.resize(static_cast<size_t>(limit));
- return static_cast<EGLint>(initialSize);
- }
-
- case EGL_PROGRAM_CACHE_TRIM_ANGLE:
- return static_cast<EGLint>(mMemoryProgramCache.trim(static_cast<size_t>(limit)));
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-} // namespace egl
diff --git a/src/3rdparty/angle/src/libANGLE/Display.h b/src/3rdparty/angle/src/libANGLE/Display.h
deleted file mode 100644
index 2a1c386d75..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Display.h
+++ /dev/null
@@ -1,219 +0,0 @@
-//
-// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Display.h: Defines the egl::Display class, representing the abstract
-// display on which graphics are drawn. Implements EGLDisplay.
-// [EGL 1.4] section 2.1.2 page 3.
-
-#ifndef LIBANGLE_DISPLAY_H_
-#define LIBANGLE_DISPLAY_H_
-
-#include <set>
-#include <vector>
-
-#include "libANGLE/AttributeMap.h"
-#include "libANGLE/Caps.h"
-#include "libANGLE/Config.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/LoggingAnnotator.h"
-#include "libANGLE/MemoryProgramCache.h"
-#include "libANGLE/Version.h"
-
-namespace gl
-{
-class Context;
-class TextureManager;
-}
-
-namespace rx
-{
-class DisplayImpl;
-}
-
-namespace egl
-{
-class Device;
-class Image;
-class Surface;
-class Stream;
-class Thread;
-
-using SurfaceSet = std::set<Surface *>;
-
-struct DisplayState final : private angle::NonCopyable
-{
- DisplayState();
- ~DisplayState();
-
- SurfaceSet surfaceSet;
-};
-
-// Constant coded here as a sanity limit.
-constexpr EGLAttrib kProgramCacheSizeAbsoluteMax = 0x4000000;
-
-class Display final : angle::NonCopyable
-{
- public:
- ~Display();
-
- Error initialize();
- Error terminate();
-
- static Display *GetDisplayFromDevice(Device *device, const AttributeMap &attribMap);
- static Display *GetDisplayFromNativeDisplay(EGLNativeDisplayType nativeDisplay,
- const AttributeMap &attribMap);
- static void CleanupDisplays();
-
- static const ClientExtensions &GetClientExtensions();
- static const std::string &GetClientExtensionString();
-
- std::vector<const Config *> getConfigs(const AttributeMap &attribs) const;
-
- Error createWindowSurface(const Config *configuration,
- EGLNativeWindowType window,
- const AttributeMap &attribs,
- Surface **outSurface);
- Error createPbufferSurface(const Config *configuration,
- const AttributeMap &attribs,
- Surface **outSurface);
- Error createPbufferFromClientBuffer(const Config *configuration,
- EGLenum buftype,
- EGLClientBuffer clientBuffer,
- const AttributeMap &attribs,
- Surface **outSurface);
- Error createPixmapSurface(const Config *configuration,
- NativePixmapType nativePixmap,
- const AttributeMap &attribs,
- Surface **outSurface);
-
- Error createImage(const gl::Context *context,
- EGLenum target,
- EGLClientBuffer buffer,
- const AttributeMap &attribs,
- Image **outImage);
-
- Error createStream(const AttributeMap &attribs, Stream **outStream);
-
- Error createContext(const Config *configuration,
- gl::Context *shareContext,
- const AttributeMap &attribs,
- gl::Context **outContext);
-
- Error makeCurrent(Surface *drawSurface, Surface *readSurface, gl::Context *context);
-
- Error destroySurface(Surface *surface);
- void destroyImage(Image *image);
- void destroyStream(Stream *stream);
- Error destroyContext(gl::Context *context);
-
- bool isInitialized() const;
- bool isValidConfig(const Config *config) const;
- bool isValidContext(const gl::Context *context) const;
- bool isValidSurface(const Surface *surface) const;
- bool isValidImage(const Image *image) const;
- bool isValidStream(const Stream *stream) const;
- bool isValidNativeWindow(EGLNativeWindowType window) const;
-
- Error validateClientBuffer(const Config *configuration,
- EGLenum buftype,
- EGLClientBuffer clientBuffer,
- const AttributeMap &attribs);
-
- static bool isValidDisplay(const Display *display);
- static bool isValidNativeDisplay(EGLNativeDisplayType display);
- static bool hasExistingWindowSurface(EGLNativeWindowType window);
-
- bool isDeviceLost() const;
- bool testDeviceLost();
- void notifyDeviceLost();
-
- Error waitClient(const gl::Context *context) const;
- Error waitNative(const gl::Context *context, EGLint engine) const;
-
- const Caps &getCaps() const;
-
- const DisplayExtensions &getExtensions() const;
- const std::string &getExtensionString() const;
- const std::string &getVendorString() const;
-
- EGLint programCacheGetAttrib(EGLenum attrib) const;
- Error programCacheQuery(EGLint index,
- void *key,
- EGLint *keysize,
- void *binary,
- EGLint *binarysize);
- Error programCachePopulate(const void *key,
- EGLint keysize,
- const void *binary,
- EGLint binarysize);
- EGLint programCacheResize(EGLint limit, EGLenum mode);
-
- const AttributeMap &getAttributeMap() const { return mAttributeMap; }
- EGLNativeDisplayType getNativeDisplayId() const { return mDisplayId; }
-
- rx::DisplayImpl *getImplementation() const { return mImplementation; }
- Device *getDevice() const;
- EGLenum getPlatform() const { return mPlatform; }
-
- gl::Version getMaxSupportedESVersion() const;
-
- const DisplayState &getState() const { return mState; }
-
- gl::Context *getProxyContext() const { return mProxyContext.get(); }
-
- private:
- Display(EGLenum platform, EGLNativeDisplayType displayId, Device *eglDevice);
-
- void setAttributes(rx::DisplayImpl *impl, const AttributeMap &attribMap);
-
- Error restoreLostDevice();
-
- void initDisplayExtensions();
- void initVendorString();
-
- DisplayState mState;
- rx::DisplayImpl *mImplementation;
-
- EGLNativeDisplayType mDisplayId;
- AttributeMap mAttributeMap;
-
- ConfigSet mConfigSet;
-
- typedef std::set<gl::Context*> ContextSet;
- ContextSet mContextSet;
-
- typedef std::set<Image *> ImageSet;
- ImageSet mImageSet;
-
- typedef std::set<Stream *> StreamSet;
- StreamSet mStreamSet;
-
- bool mInitialized;
- bool mDeviceLost;
-
- Caps mCaps;
-
- DisplayExtensions mDisplayExtensions;
- std::string mDisplayExtensionString;
-
- std::string mVendorString;
-
- Device *mDevice;
- EGLenum mPlatform;
- angle::LoggingAnnotator mAnnotator;
-
- gl::TextureManager *mTextureManager;
- gl::MemoryProgramCache mMemoryProgramCache;
- size_t mGlobalTextureShareGroupUsers;
-
- // This gl::Context is a simple proxy to the Display for the GL back-end entry points
- // that need access to implementation-specific data, like a Renderer object.
- angle::UniqueObjectPointer<gl::Context, Display> mProxyContext;
-};
-
-} // namespace egl
-
-#endif // LIBANGLE_DISPLAY_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Error.cpp b/src/3rdparty/angle/src/libANGLE/Error.cpp
deleted file mode 100644
index 388f0259fa..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Error.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Error.cpp: Implements the egl::Error and gl::Error classes which encapsulate API errors
-// and optional error messages.
-
-#include "libANGLE/Error.h"
-
-#include "common/angleutils.h"
-#include "common/debug.h"
-#include "common/utilities.h"
-
-#include <cstdarg>
-
-namespace
-{
-std::unique_ptr<std::string> EmplaceErrorString(std::string &&message)
-{
- return message.empty() ? std::unique_ptr<std::string>()
- : std::unique_ptr<std::string>(new std::string(std::move(message)));
-}
-} // anonymous namespace
-
-namespace gl
-{
-
-Error::Error(GLenum errorCode, std::string &&message)
- : mCode(errorCode), mID(errorCode), mMessage(EmplaceErrorString(std::move(message)))
-{
-}
-
-Error::Error(GLenum errorCode, GLuint id, std::string &&message)
- : mCode(errorCode), mID(id), mMessage(EmplaceErrorString(std::move(message)))
-{
-}
-
-void Error::createMessageString() const
-{
- if (!mMessage)
- {
- mMessage.reset(new std::string(GetGenericErrorMessage(mCode)));
- }
-}
-
-const std::string &Error::getMessage() const
-{
- createMessageString();
- return *mMessage;
-}
-
-bool Error::operator==(const Error &other) const
-{
- if (mCode != other.mCode)
- return false;
-
- // TODO(jmadill): Compare extended error codes instead of strings.
- if ((!mMessage || !other.mMessage) && (!mMessage != !other.mMessage))
- return false;
-
- return (*mMessage == *other.mMessage);
-}
-
-bool Error::operator!=(const Error &other) const
-{
- return !(*this == other);
-}
-
-std::ostream &operator<<(std::ostream &os, const Error &err)
-{
- return gl::FmtHexShort(os, err.getCode());
-}
-
-} // namespace gl
-
-namespace egl
-{
-
-Error::Error(EGLint errorCode, std::string &&message)
- : mCode(errorCode), mID(errorCode), mMessage(EmplaceErrorString(std::move(message)))
-{
-}
-
-Error::Error(EGLint errorCode, EGLint id, std::string &&message)
- : mCode(errorCode), mID(id), mMessage(EmplaceErrorString(std::move(message)))
-{
-}
-
-void Error::createMessageString() const
-{
- if (!mMessage)
- {
- mMessage.reset(new std::string(GetGenericErrorMessage(mCode)));
- }
-}
-
-const std::string &Error::getMessage() const
-{
- createMessageString();
- return *mMessage;
-}
-
-std::ostream &operator<<(std::ostream &os, const Error &err)
-{
- return gl::FmtHexShort(os, err.getCode());
-}
-
-} // namespace egl
diff --git a/src/3rdparty/angle/src/libANGLE/Error.h b/src/3rdparty/angle/src/libANGLE/Error.h
deleted file mode 100644
index 1d57bb8707..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Error.h
+++ /dev/null
@@ -1,267 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Error.h: Defines the egl::Error and gl::Error classes which encapsulate API errors
-// and optional error messages.
-
-#ifndef LIBANGLE_ERROR_H_
-#define LIBANGLE_ERROR_H_
-
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-#include "angle_gl.h"
-#include "common/angleutils.h"
-#include "common/debug.h"
-
-#include <memory>
-#include <ostream>
-#include <string>
-
-namespace angle
-{
-template <typename ErrorT, typename ResultT, typename ErrorBaseT, ErrorBaseT NoErrorVal>
-class ANGLE_NO_DISCARD ErrorOrResultBase
-{
- public:
- ErrorOrResultBase(const ErrorT &error) : mError(error) {}
- ErrorOrResultBase(ErrorT &&error) : mError(std::move(error)) {}
-
- ErrorOrResultBase(ResultT &&result) : mError(NoErrorVal), mResult(std::forward<ResultT>(result))
- {
- }
-
- ErrorOrResultBase(const ResultT &result) : mError(NoErrorVal), mResult(result) {}
-
- bool isError() const { return mError.isError(); }
- const ErrorT &getError() const { return mError; }
- ResultT &&getResult() { return std::move(mResult); }
-
- private:
- ErrorT mError;
- ResultT mResult;
-};
-
-template <typename ErrorT, typename ErrorBaseT, ErrorBaseT NoErrorVal, typename CodeT, CodeT EnumT>
-class ErrorStreamBase : angle::NonCopyable
-{
- public:
- ErrorStreamBase() : mID(EnumT) {}
- ErrorStreamBase(GLuint id) : mID(id) {}
-
- template <typename T>
- ErrorStreamBase &operator<<(T value)
- {
- mErrorStream << value;
- return *this;
- }
-
- operator ErrorT() { return ErrorT(EnumT, mID, mErrorStream.str()); }
-
- template <typename ResultT>
- operator ErrorOrResultBase<ErrorT, ResultT, ErrorBaseT, NoErrorVal>()
- {
- return static_cast<ErrorT>(*this);
- }
-
- private:
- GLuint mID;
- std::ostringstream mErrorStream;
-};
-} // namespace angle
-
-namespace egl
-{
-class Error;
-} // namespace egl
-
-namespace gl
-{
-
-class ANGLE_NO_DISCARD Error final
-{
- public:
- explicit inline Error(GLenum errorCode);
- Error(GLenum errorCode, std::string &&message);
- Error(GLenum errorCode, GLuint id, std::string &&message);
- inline Error(const Error &other);
- inline Error(Error &&other);
- inline ~Error() = default;
-
- // automatic error type conversion
- inline Error(egl::Error &&eglErr);
- inline Error(egl::Error eglErr);
-
- inline Error &operator=(const Error &other);
- inline Error &operator=(Error &&other);
-
- inline GLenum getCode() const;
- inline GLuint getID() const;
- inline bool isError() const;
-
- const std::string &getMessage() const;
-
- // Useful for mocking and testing
- bool operator==(const Error &other) const;
- bool operator!=(const Error &other) const;
-
- private:
- void createMessageString() const;
-
- friend std::ostream &operator<<(std::ostream &os, const Error &err);
- friend class egl::Error;
-
- GLenum mCode;
- GLuint mID;
- mutable std::unique_ptr<std::string> mMessage;
-};
-
-template <typename ResultT>
-using ErrorOrResult = angle::ErrorOrResultBase<Error, ResultT, GLenum, GL_NO_ERROR>;
-
-namespace priv
-{
-
-template <GLenum EnumT>
-using ErrorStream = angle::ErrorStreamBase<Error, GLenum, GL_NO_ERROR, GLenum, EnumT>;
-
-} // namespace priv
-
-using InternalError = priv::ErrorStream<GL_INVALID_OPERATION>;
-
-using InvalidEnum = priv::ErrorStream<GL_INVALID_ENUM>;
-using InvalidValue = priv::ErrorStream<GL_INVALID_VALUE>;
-using InvalidOperation = priv::ErrorStream<GL_INVALID_OPERATION>;
-using StackOverflow = priv::ErrorStream<GL_STACK_OVERFLOW>;
-using StackUnderflow = priv::ErrorStream<GL_STACK_UNDERFLOW>;
-using OutOfMemory = priv::ErrorStream<GL_OUT_OF_MEMORY>;
-using InvalidFramebufferOperation = priv::ErrorStream<GL_INVALID_FRAMEBUFFER_OPERATION>;
-
-inline Error NoError()
-{
- return Error(GL_NO_ERROR);
-}
-
-using LinkResult = ErrorOrResult<bool>;
-
-} // namespace gl
-
-namespace egl
-{
-
-class ANGLE_NO_DISCARD Error final
-{
- public:
- explicit inline Error(EGLint errorCode);
- Error(EGLint errorCode, std::string &&message);
- Error(EGLint errorCode, EGLint id, std::string &&message);
- inline Error(const Error &other);
- inline Error(Error &&other);
- inline ~Error() = default;
-
- // automatic error type conversion
- inline Error(gl::Error &&glErr);
- inline Error(gl::Error glErr);
-
- inline Error &operator=(const Error &other);
- inline Error &operator=(Error &&other);
-
- inline EGLint getCode() const;
- inline EGLint getID() const;
- inline bool isError() const;
-
- const std::string &getMessage() const;
-
- private:
- void createMessageString() const;
-
- friend std::ostream &operator<<(std::ostream &os, const Error &err);
- friend class gl::Error;
-
- EGLint mCode;
- EGLint mID;
- mutable std::unique_ptr<std::string> mMessage;
-};
-
-template <typename ResultT>
-using ErrorOrResult = angle::ErrorOrResultBase<Error, ResultT, EGLint, EGL_SUCCESS>;
-
-namespace priv
-{
-
-template <EGLint EnumT>
-using ErrorStream = angle::ErrorStreamBase<Error, EGLint, EGL_SUCCESS, EGLint, EnumT>;
-
-} // namespace priv
-
-using EglNotInitialized = priv::ErrorStream<EGL_NOT_INITIALIZED>;
-using EglBadAccess = priv::ErrorStream<EGL_BAD_ACCESS>;
-using EglBadAlloc = priv::ErrorStream<EGL_BAD_ALLOC>;
-using EglBadAttribute = priv::ErrorStream<EGL_BAD_ATTRIBUTE>;
-using EglBadConfig = priv::ErrorStream<EGL_BAD_CONFIG>;
-using EglBadContext = priv::ErrorStream<EGL_BAD_CONTEXT>;
-using EglBadCurrentSurface = priv::ErrorStream<EGL_BAD_CURRENT_SURFACE>;
-using EglBadDisplay = priv::ErrorStream<EGL_BAD_DISPLAY>;
-using EglBadMatch = priv::ErrorStream<EGL_BAD_MATCH>;
-using EglBadNativeWindow = priv::ErrorStream<EGL_BAD_NATIVE_WINDOW>;
-using EglBadParameter = priv::ErrorStream<EGL_BAD_PARAMETER>;
-using EglBadSurface = priv::ErrorStream<EGL_BAD_SURFACE>;
-using EglContextLost = priv::ErrorStream<EGL_CONTEXT_LOST>;
-using EglBadStream = priv::ErrorStream<EGL_BAD_STREAM_KHR>;
-using EglBadState = priv::ErrorStream<EGL_BAD_STATE_KHR>;
-using EglBadDevice = priv::ErrorStream<EGL_BAD_DEVICE_EXT>;
-
-inline Error NoError()
-{
- return Error(EGL_SUCCESS);
-}
-
-} // namespace egl
-
-#define ANGLE_CONCAT1(x, y) x##y
-#define ANGLE_CONCAT2(x, y) ANGLE_CONCAT1(x, y)
-#define ANGLE_LOCAL_VAR ANGLE_CONCAT2(_localVar, __LINE__)
-
-#define ANGLE_TRY_TEMPLATE(EXPR, FUNC) \
- { \
- auto ANGLE_LOCAL_VAR = EXPR; \
- if (ANGLE_LOCAL_VAR.isError()) \
- { \
- FUNC(ANGLE_LOCAL_VAR); \
- } \
- } \
- ANGLE_EMPTY_STATEMENT
-
-#define ANGLE_RETURN(X) return X;
-#define ANGLE_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_RETURN);
-
-#define ANGLE_TRY_RESULT(EXPR, RESULT) \
- { \
- auto ANGLE_LOCAL_VAR = EXPR; \
- if (ANGLE_LOCAL_VAR.isError()) \
- { \
- return ANGLE_LOCAL_VAR.getError(); \
- } \
- RESULT = ANGLE_LOCAL_VAR.getResult(); \
- } \
- ANGLE_EMPTY_STATEMENT
-
-// TODO(jmadill): Introduce way to store errors to a const Context.
-#define ANGLE_SWALLOW_ERR(EXPR) \
- { \
- auto ANGLE_LOCAL_VAR = EXPR; \
- if (ANGLE_LOCAL_VAR.isError()) \
- { \
- ERR() << "Unhandled internal error: " << ANGLE_LOCAL_VAR; \
- } \
- } \
- ANGLE_EMPTY_STATEMENT
-
-#undef ANGLE_LOCAL_VAR
-#undef ANGLE_CONCAT2
-#undef ANGLE_CONCAT1
-
-#include "Error.inl"
-
-#endif // LIBANGLE_ERROR_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Error.inl b/src/3rdparty/angle/src/libANGLE/Error.inl
deleted file mode 100644
index 4632830ce0..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Error.inl
+++ /dev/null
@@ -1,189 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Error.inl: Inline definitions of egl::Error and gl::Error classes which encapsulate API errors
-// and optional error messages.
-
-#include "common/angleutils.h"
-
-#include <cstdarg>
-
-namespace gl
-{
-
-Error::Error(GLenum errorCode)
- : mCode(errorCode),
- mID(errorCode)
-{
-}
-
-Error::Error(const Error &other)
- : mCode(other.mCode),
- mID(other.mID)
-{
- if (other.mMessage)
- {
- createMessageString();
- *mMessage = *(other.mMessage);
- }
-}
-
-Error::Error(Error &&other)
- : mCode(other.mCode),
- mID(other.mID),
- mMessage(std::move(other.mMessage))
-{
-}
-
-// automatic error type conversion
-Error::Error(egl::Error &&eglErr)
- : mCode(GL_INVALID_OPERATION),
- mID(0),
- mMessage(std::move(eglErr.mMessage))
-{
-}
-
-Error::Error(egl::Error eglErr)
- : mCode(GL_INVALID_OPERATION),
- mID(0),
- mMessage(std::move(eglErr.mMessage))
-{
-}
-
-Error &Error::operator=(const Error &other)
-{
- mCode = other.mCode;
- mID = other.mID;
-
- if (other.mMessage)
- {
- createMessageString();
- *mMessage = *(other.mMessage);
- }
- else
- {
- mMessage.release();
- }
-
- return *this;
-}
-
-Error &Error::operator=(Error &&other)
-{
- if (this != &other)
- {
- mCode = other.mCode;
- mID = other.mID;
- mMessage = std::move(other.mMessage);
- }
-
- return *this;
-}
-
-GLenum Error::getCode() const
-{
- return mCode;
-}
-
-GLuint Error::getID() const
-{
- return mID;
-}
-
-bool Error::isError() const
-{
- return (mCode != GL_NO_ERROR);
-}
-
-} // namespace gl
-
-namespace egl
-{
-
-Error::Error(EGLint errorCode)
- : mCode(errorCode),
- mID(0)
-{
-}
-
-Error::Error(const Error &other)
- : mCode(other.mCode),
- mID(other.mID)
-{
- if (other.mMessage)
- {
- createMessageString();
- *mMessage = *(other.mMessage);
- }
-}
-
-Error::Error(Error &&other)
- : mCode(other.mCode),
- mID(other.mID),
- mMessage(std::move(other.mMessage))
-{
-}
-
-// automatic error type conversion
-Error::Error(gl::Error &&glErr)
- : mCode(EGL_BAD_ACCESS),
- mID(0),
- mMessage(std::move(glErr.mMessage))
-{
-}
-
-Error::Error(gl::Error glErr)
- : mCode(EGL_BAD_ACCESS),
- mID(0),
- mMessage(std::move(glErr.mMessage))
-{
-}
-
-Error &Error::operator=(const Error &other)
-{
- mCode = other.mCode;
- mID = other.mID;
-
- if (other.mMessage)
- {
- createMessageString();
- *mMessage = *(other.mMessage);
- }
- else
- {
- mMessage.release();
- }
-
- return *this;
-}
-
-Error &Error::operator=(Error &&other)
-{
- if (this != &other)
- {
- mCode = other.mCode;
- mID = other.mID;
- mMessage = std::move(other.mMessage);
- }
-
- return *this;
-}
-
-EGLint Error::getCode() const
-{
- return mCode;
-}
-
-EGLint Error::getID() const
-{
- return mID;
-}
-
-bool Error::isError() const
-{
- return (mCode != EGL_SUCCESS);
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/ErrorStrings.h b/src/3rdparty/angle/src/libANGLE/ErrorStrings.h
deleted file mode 100644
index 93d64482d9..0000000000
--- a/src/3rdparty/angle/src/libANGLE/ErrorStrings.h
+++ /dev/null
@@ -1,173 +0,0 @@
-//
-// Copyright (c) 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ErrorStrings.h: Contains mapping of commonly used error messages
-
-#ifndef LIBANGLE_ERRORSTRINGS_H_
-#define LIBANGLE_ERRORSTRINGS_H_
-
-#define ERRMSG(name, message) \
- static const constexpr char *kError##name = static_cast<const char *>(message);
-#define ANGLE_VALIDATION_ERR(context, error, errorName) \
- context->handleError(error << kError##errorName)
-
-namespace gl
-{
-ERRMSG(BufferNotBound, "A buffer must be bound.");
-ERRMSG(CompressedTextureDimensionsMustMatchData,
- "Compressed texture dimensions must exactly match the dimensions of the data passed in.");
-ERRMSG(CompressedTexturesNotAttachable, "Compressed textures cannot be attached to a framebuffer.");
-ERRMSG(CubemapFacesEqualDimensions, "Each cubemap face must have equal width and height.");
-ERRMSG(CubemapIncomplete,
- "Texture is not cubemap complete. All cubemaps faces must be defined and be the same size.");
-ERRMSG(DefaultFramebufferInvalidAttachment,
- "Invalid attachment when the default framebuffer is bound.");
-ERRMSG(DefaultFramebufferTarget, "It is invalid to change default FBO's attachments");
-ERRMSG(EnumNotSupported, "Enum is not currently supported.");
-ERRMSG(EnumRequiresGLES31, "Enum requires GLES 3.1");
-ERRMSG(ES31Required, "OpenGL ES 3.1 Required");
-ERRMSG(ES3Required, "OpenGL ES 3.0 Required.");
-ERRMSG(ExceedsMaxElement, "Element value exceeds maximum element index.");
-ERRMSG(ExpectedProgramName, "Expected a program name, but found a shader name.");
-ERRMSG(ExpectedShaderName, "Expected a shader name, but found a program name.");
-ERRMSG(ExtensionNotEnabled, "Extension is not enabled.");
-ERRMSG(FeedbackLoop, "Feedback loop formed between Framebuffer and active Texture.");
-ERRMSG(FramebufferIncompleteAttachment,
- "Attachment type must be compatible with attachment object.");
-ERRMSG(GenerateMipmapNotAllowed, "Texture format does not support mipmap generation.");
-ERRMSG(IndexExceedsMaxActiveUniform, "Index exceeds program active uniform count.");
-ERRMSG(IndexExceedsMaxDrawBuffer, "Index exceeds MAX_DRAW_BUFFERS.");
-ERRMSG(IndexExceedsMaxVertexAttribute, "Index exceeds MAX_VERTEX_ATTRIBS.");
-ERRMSG(InsufficientBufferSize, "Insufficient buffer size.");
-ERRMSG(InsufficientVertexBufferSize, "Vertex buffer is not big enough for the draw call");
-ERRMSG(IntegerOverflow, "Integer overflow.");
-ERRMSG(InvalidAttachment, "Invalid Attachment Type.");
-ERRMSG(InvalidBlendEquation, "Invalid blend equation.");
-ERRMSG(InvalidBlendFunction, "Invalid blend function.");
-ERRMSG(InvalidBorder, "Border must be 0.");
-ERRMSG(InvalidBufferTypes, "Invalid buffer target enum.");
-ERRMSG(InvalidBufferUsage, "Invalid buffer usage enum.");
-ERRMSG(InvalidClearMask, "Invalid mask bits.");
-ERRMSG(InvalidConstantColor,
- "CONSTANT_COLOR (or ONE_MINUS_CONSTANT_COLOR) and CONSTANT_ALPHA (or "
- "ONE_MINUS_CONSTANT_ALPHA) cannot be used together as source and destination factors in the "
- "blend function.");
-ERRMSG(InvalidCoverMode, "Invalid cover mode.");
-ERRMSG(InvalidCullMode, "Cull mode not recognized.");
-ERRMSG(InvalidDebugSeverity, "Invalid debug severity.");
-ERRMSG(InvalidDebugSource, "Invalid debug source.");
-ERRMSG(InvalidDebugType, "Invalid debug type.");
-ERRMSG(InvalidDepthRange, "Near value cannot be greater than far.");
-ERRMSG(InvalidDrawMode, "Invalid draw mode.");
-ERRMSG(InvalidDrawModeTransformFeedback,
- "Draw mode must match current transform feedback object's draw mode.");
-ERRMSG(InvalidFillMode, "Invalid fill mode.");
-ERRMSG(InvalidFilterTexture, "Texture only supports NEAREST and LINEAR filtering.");
-ERRMSG(InvalidFormat, "Invalid format.");
-ERRMSG(InvalidFramebufferTarget, "Invalid framebuffer target.");
-ERRMSG(InvalidFramebufferTextureLevel, "Mipmap level must be 0 when attaching a texture.");
-ERRMSG(InvalidFramebufferAttachmentParameter, "Invalid parameter name for framebuffer attachment.");
-ERRMSG(InvalidInternalFormat, "Invalid internal format.");
-ERRMSG(InvalidMatrixMode, "Invalid matrix mode.");
-ERRMSG(InvalidMipLevel, "Level of detail outside of range.");
-ERRMSG(InvalidName, "Invalid name.");
-ERRMSG(InvalidNameCharacters, "Name contains invalid characters.");
-ERRMSG(InvalidPname, "Invalid pname.");
-ERRMSG(InvalidPrecision, "Invalid or unsupported precision type.");
-ERRMSG(InvalidProgramName, "Program object expected.");
-ERRMSG(InvalidQueryId, "Invalid query Id.");
-ERRMSG(InvalidQueryTarget, "Invalid query target.");
-ERRMSG(InvalidQueryType, "Invalid query type.");
-ERRMSG(InvalidRange, "Invalid range.");
-ERRMSG(InvalidRenderbufferInternalFormat, "Invalid renderbuffer internalformat.");
-ERRMSG(InvalidRenderbufferTarget, "Invalid renderbuffer target.");
-ERRMSG(InvalidRenderbufferTextureParameter, "Invalid parameter name for renderbuffer attachment.");
-ERRMSG(InvalidRenderbufferWidthHeight,
- "Renderbuffer width and height cannot be negative and cannot exceed maximum texture size.");
-ERRMSG(InvalidSampleMaskNumber,
- "MaskNumber cannot be greater than or equal to the value of MAX_SAMPLE_MASK_WORDS.");
-ERRMSG(InvalidSampler, "Sampler is not valid");
-ERRMSG(InvalidShaderName, "Shader object expected.");
-ERRMSG(InvalidShaderType, "Invalid shader type.");
-ERRMSG(InvalidStencil, "Invalid stencil.");
-ERRMSG(InvalidStencilBitMask, "Invalid stencil bit mask.");
-ERRMSG(InvalidTarget, "Invalid target.");
-ERRMSG(InvalidTextureFilterParam, "Texture filter not recognized.");
-ERRMSG(InvalidTextureRange, "Cannot be less than 0 or greater than maximum number of textures.");
-ERRMSG(InvalidTextureTarget, "Invalid or unsupported texture target.");
-ERRMSG(InvalidTextureWrap, "Texture wrap mode not recognized.");
-ERRMSG(InvalidType, "Invalid type.");
-ERRMSG(InvalidTypePureInt, "Invalid type, should be integer");
-ERRMSG(InvalidUnpackAlignment, "Unpack alignment must be 1, 2, 4, or 8.");
-ERRMSG(InvalidVertexAttrSize, "Vertex attribute size must be 1, 2, 3, or 4.");
-ERRMSG(InvalidWidth, "Invalid width.");
-ERRMSG(InvalidWrapModeTexture, "Invalid wrap mode for texture type.");
-ERRMSG(LevelNotZero, "Texture level must be zero.");
-ERRMSG(MismatchedByteCountType, "Buffer size does not align with data type.");
-ERRMSG(MismatchedFormat, "Format must match internal format.");
-ERRMSG(MismatchedTargetAndFormat, "Invalid texture target and format combination.");
-ERRMSG(MismatchedTypeAndFormat, "Invalid format and type combination.");
-ERRMSG(MismatchedVariableProgram, "Variable is not part of the current program.");
-ERRMSG(MissingReadAttachment, "Missing read attachment.");
-ERRMSG(MustHaveElementArrayBinding, "Must have element array buffer binding.");
-ERRMSG(NameBeginsWithGL, "Attributes that begin with 'gl_' are not allowed.");
-ERRMSG(NegativeAttachments, "Negative number of attachments.");
-ERRMSG(NegativeBufferSize, "Negative buffer size.");
-ERRMSG(NegativeCount, "Negative count.");
-ERRMSG(NegativeLength, "Negative length.");
-ERRMSG(NegativeMaxCount, "Negative maxcount.");
-ERRMSG(NegativeOffset, "Negative offset.");
-ERRMSG(NegativePrimcount, "Primcount must be greater than or equal to zero.");
-ERRMSG(NegativeSize, "Cannot have negative height or width.");
-ERRMSG(NegativeStart, "Cannot have negative start.");
-ERRMSG(NegativeStride, "Cannot have negative stride.");
-ERRMSG(NoSuchPath, "No such path object.");
-ERRMSG(NoTransformFeedbackOutputVariables,
- "The active program has specified no output variables to record.");
-ERRMSG(NoZeroDivisor, "At least one enabled attribute must have a divisor of zero.");
-ERRMSG(ObjectNotGenerated, "Object cannot be used because it has not been generated.");
-ERRMSG(OffsetMustBeMultipleOfType, "Offset must be a multiple of the passed in datatype.");
-ERRMSG(OutsideOfBounds, "Parameter outside of bounds.");
-ERRMSG(ParamOverflow, "The provided parameters overflow with the provided buffer.");
-ERRMSG(PixelDataNotNull, "Pixel data must be null.");
-ERRMSG(PixelDataNull, "Pixel data cannot be null.");
-ERRMSG(ProgramDoesNotExist, "Program doesn't exist.");
-ERRMSG(ProgramNotBound, "A program must be bound.");
-ERRMSG(ProgramNotLinked, "Program not linked.");
-ERRMSG(QueryActive, "Query is active.");
-ERRMSG(QueryExtensionNotEnabled, "Query extension not enabled.");
-ERRMSG(ReadBufferNone, "Read buffer is GL_NONE.");
-ERRMSG(RenderbufferNotBound, "A renderbuffer must be bound.");
-ERRMSG(ResourceMaxTextureSize, "Desired resource size is greater than max texture size.");
-ERRMSG(ShaderAttachmentHasShader, "Shader attachment already has a shader.");
-ERRMSG(ShaderSourceInvalidCharacters, "Shader source contains invalid characters.");
-ERRMSG(ShaderToDetachMustBeAttached,
- "Shader to be detached must be currently attached to the program.");
-ERRMSG(SourceTextureTooSmall, "The specified dimensions are outside of the bounds of the texture.");
-ERRMSG(StencilReferenceMaskOrMismatch,
- "Stencil reference and mask values must be the same for front facing and back facing "
- "triangles.");
-ERRMSG(StrideMustBeMultipleOfType, "Stride must be a multiple of the passed in datatype.");
-ERRMSG(TextureNotBound, "A texture must be bound.");
-ERRMSG(TextureNotPow2, "The texture is a non-power-of-two texture.");
-ERRMSG(TransformFeedbackDoesNotExist, "Transform feedback object that does not exist.");
-ERRMSG(TypeMismatch,
- "Passed in texture target and format must match the one originally used to define the "
- "texture.");
-ERRMSG(TypeNotUnsignedShortByte, "Only UNSIGNED_SHORT and UNSIGNED_BYTE types are supported.");
-ERRMSG(UniformSizeMismatch, "Uniform size does not match uniform method.");
-ERRMSG(UnknownParameter, "Unknown parameter value.");
-ERRMSG(VertexArrayNoBuffer, "An enabled vertex array has no buffer.");
-ERRMSG(VertexArrayNoBufferPointer, "An enabled vertex array has no buffer and no pointer.");
-ERRMSG(ViewportNegativeSize, "Viewport size cannot be negative.");
-ERRMSG(Webgl2NameLengthLimitExceeded, "Location lengths must not be greater than 1024 characters.");
-ERRMSG(WebglBindAttribLocationReservedPrefix,
- "Attributes that begin with 'webgl_', or '_webgl_' are not allowed.");
-ERRMSG(WebglNameLengthLimitExceeded,
- "Location name lengths must not be greater than 256 characters.");
-}
-#undef ERRMSG
-#endif // LIBANGLE_ERRORSTRINGS_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Fence.cpp b/src/3rdparty/angle/src/libANGLE/Fence.cpp
deleted file mode 100644
index 9c4d381673..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Fence.cpp
+++ /dev/null
@@ -1,135 +0,0 @@
-//
-// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Fence.cpp: Implements the gl::FenceNV and gl::Sync classes, which support the GL_NV_fence
-// extension and GLES3 sync objects.
-
-#include "libANGLE/Fence.h"
-
-#include "angle_gl.h"
-
-#include "common/utilities.h"
-#include "libANGLE/renderer/FenceNVImpl.h"
-#include "libANGLE/renderer/SyncImpl.h"
-
-namespace gl
-{
-
-FenceNV::FenceNV(rx::FenceNVImpl *impl)
- : mFence(impl),
- mIsSet(false),
- mStatus(GL_FALSE),
- mCondition(GL_NONE)
-{
-}
-
-FenceNV::~FenceNV()
-{
- SafeDelete(mFence);
-}
-
-Error FenceNV::set(GLenum condition)
-{
- Error error = mFence->set(condition);
- if (error.isError())
- {
- return error;
- }
-
- mCondition = condition;
- mStatus = GL_FALSE;
- mIsSet = true;
-
- return NoError();
-}
-
-Error FenceNV::test(GLboolean *outResult)
-{
- // Flush the command buffer by default
- Error error = mFence->test(&mStatus);
- if (error.isError())
- {
- return error;
- }
-
- *outResult = mStatus;
- return NoError();
-}
-
-Error FenceNV::finish()
-{
- ASSERT(mIsSet);
-
- gl::Error error = mFence->finish();
- if (error.isError())
- {
- return error;
- }
-
- mStatus = GL_TRUE;
-
- return NoError();
-}
-
-Sync::Sync(rx::SyncImpl *impl, GLuint id)
- : RefCountObject(id),
- mFence(impl),
- mLabel(),
- mCondition(GL_SYNC_GPU_COMMANDS_COMPLETE),
- mFlags(0)
-{
-}
-
-Error Sync::onDestroy(const Context *context)
-{
- return NoError();
-}
-
-Sync::~Sync()
-{
- SafeDelete(mFence);
-}
-
-void Sync::setLabel(const std::string &label)
-{
- mLabel = label;
-}
-
-const std::string &Sync::getLabel() const
-{
- return mLabel;
-}
-
-Error Sync::set(GLenum condition, GLbitfield flags)
-{
- Error error = mFence->set(condition, flags);
- if (error.isError())
- {
- return error;
- }
-
- mCondition = condition;
- mFlags = flags;
- return NoError();
-}
-
-Error Sync::clientWait(GLbitfield flags, GLuint64 timeout, GLenum *outResult)
-{
- ASSERT(mCondition != GL_NONE);
- return mFence->clientWait(flags, timeout, outResult);
-}
-
-Error Sync::serverWait(GLbitfield flags, GLuint64 timeout)
-{
- return mFence->serverWait(flags, timeout);
-}
-
-Error Sync::getStatus(GLint *outResult) const
-{
- return mFence->getStatus(outResult);
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/Fence.h b/src/3rdparty/angle/src/libANGLE/Fence.h
deleted file mode 100644
index 24bc689ca3..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Fence.h
+++ /dev/null
@@ -1,81 +0,0 @@
-//
-// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Fence.h: Defines the gl::FenceNV and gl::Sync classes, which support the GL_NV_fence
-// extension and GLES3 sync objects.
-
-#ifndef LIBANGLE_FENCE_H_
-#define LIBANGLE_FENCE_H_
-
-#include "libANGLE/Debug.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/RefCountObject.h"
-
-#include "common/angleutils.h"
-
-namespace rx
-{
-class FenceNVImpl;
-class SyncImpl;
-}
-
-namespace gl
-{
-
-class FenceNV final : angle::NonCopyable
-{
- public:
- explicit FenceNV(rx::FenceNVImpl *impl);
- virtual ~FenceNV();
-
- Error set(GLenum condition);
- Error test(GLboolean *outResult);
- Error finish();
-
- bool isSet() const { return mIsSet; }
- GLboolean getStatus() const { return mStatus; }
- GLenum getCondition() const { return mCondition; }
-
- private:
- rx::FenceNVImpl *mFence;
-
- bool mIsSet;
-
- GLboolean mStatus;
- GLenum mCondition;
-};
-
-class Sync final : public RefCountObject, public LabeledObject
-{
- public:
- Sync(rx::SyncImpl *impl, GLuint id);
- ~Sync() override;
-
- Error onDestroy(const Context *context) override;
-
- void setLabel(const std::string &label) override;
- const std::string &getLabel() const override;
-
- Error set(GLenum condition, GLbitfield flags);
- Error clientWait(GLbitfield flags, GLuint64 timeout, GLenum *outResult);
- Error serverWait(GLbitfield flags, GLuint64 timeout);
- Error getStatus(GLint *outResult) const;
-
- GLenum getCondition() const { return mCondition; }
- GLbitfield getFlags() const { return mFlags; }
-
- private:
- rx::SyncImpl *mFence;
-
- std::string mLabel;
-
- GLenum mCondition;
- GLbitfield mFlags;
-};
-
-} // namespace gl
-
-#endif // LIBANGLE_FENCE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Framebuffer.cpp b/src/3rdparty/angle/src/libANGLE/Framebuffer.cpp
deleted file mode 100644
index 48e71685b3..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Framebuffer.cpp
+++ /dev/null
@@ -1,2182 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Framebuffer.cpp: Implements the gl::Framebuffer class. Implements GL framebuffer
-// objects and related functionality. [OpenGL ES 2.0.24] section 4.4 page 105.
-
-#include "libANGLE/Framebuffer.h"
-
-#include "common/Optional.h"
-#include "common/bitset_utils.h"
-#include "common/utilities.h"
-#include "libANGLE/Config.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Display.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/Renderbuffer.h"
-#include "libANGLE/Surface.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/ContextImpl.h"
-#include "libANGLE/renderer/FramebufferImpl.h"
-#include "libANGLE/renderer/GLImplFactory.h"
-#include "libANGLE/renderer/RenderbufferImpl.h"
-#include "libANGLE/renderer/SurfaceImpl.h"
-
-using namespace angle;
-
-namespace gl
-{
-
-namespace
-{
-
-void BindResourceChannel(OnAttachmentDirtyBinding *binding, FramebufferAttachmentObject *resource)
-{
- binding->bind(resource ? resource->getDirtyChannel() : nullptr);
-}
-
-bool CheckMultiviewStateMatchesForCompleteness(const FramebufferAttachment *firstAttachment,
- const FramebufferAttachment *secondAttachment)
-{
- ASSERT(firstAttachment && secondAttachment);
- ASSERT(firstAttachment->isAttached() && secondAttachment->isAttached());
-
- if (firstAttachment->getNumViews() != secondAttachment->getNumViews())
- {
- return false;
- }
- if (firstAttachment->getBaseViewIndex() != secondAttachment->getBaseViewIndex())
- {
- return false;
- }
- if (firstAttachment->getMultiviewLayout() != secondAttachment->getMultiviewLayout())
- {
- return false;
- }
- if (firstAttachment->getMultiviewViewportOffsets() !=
- secondAttachment->getMultiviewViewportOffsets())
- {
- return false;
- }
- return true;
-}
-
-bool CheckAttachmentCompleteness(const Context *context, const FramebufferAttachment &attachment)
-{
- ASSERT(attachment.isAttached());
-
- const Extents &size = attachment.getSize();
- if (size.width == 0 || size.height == 0)
- {
- return false;
- }
-
- const InternalFormat &format = *attachment.getFormat().info;
- if (!format.renderSupport(context->getClientVersion(), context->getExtensions()))
- {
- return false;
- }
-
- if (attachment.type() == GL_TEXTURE)
- {
- if (attachment.layer() >= size.depth)
- {
- return false;
- }
-
- // ES3 specifies that cube map texture attachments must be cube complete.
- // This language is missing from the ES2 spec, but we enforce it here because some
- // desktop OpenGL drivers also enforce this validation.
- // TODO(jmadill): Check if OpenGL ES2 drivers enforce cube completeness.
- const Texture *texture = attachment.getTexture();
- ASSERT(texture);
- if (texture->getTarget() == GL_TEXTURE_CUBE_MAP &&
- !texture->getTextureState().isCubeComplete())
- {
- return false;
- }
-
- if (!texture->getImmutableFormat())
- {
- GLuint attachmentMipLevel = static_cast<GLuint>(attachment.mipLevel());
-
- // From the ES 3.0 spec, pg 213:
- // If the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is TEXTURE and the value of
- // FRAMEBUFFER_ATTACHMENT_OBJECT_NAME does not name an immutable-format texture,
- // then the value of FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL must be in the
- // range[levelbase, q], where levelbase is the value of TEXTURE_BASE_LEVEL and q is
- // the effective maximum texture level defined in the Mipmapping discussion of
- // section 3.8.10.4.
- if (attachmentMipLevel < texture->getBaseLevel() ||
- attachmentMipLevel > texture->getMipmapMaxLevel())
- {
- return false;
- }
-
- // Form the ES 3.0 spec, pg 213/214:
- // If the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is TEXTURE and the value of
- // FRAMEBUFFER_ATTACHMENT_OBJECT_NAME does not name an immutable-format texture and
- // the value of FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL is not levelbase, then the
- // texture must be mipmap complete, and if FRAMEBUFFER_ATTACHMENT_OBJECT_NAME names
- // a cubemap texture, the texture must also be cube complete.
- if (attachmentMipLevel != texture->getBaseLevel() && !texture->isMipmapComplete())
- {
- return false;
- }
- }
- }
-
- return true;
-};
-
-bool CheckAttachmentSampleCompleteness(const Context *context,
- const FramebufferAttachment &attachment,
- bool colorAttachment,
- Optional<int> *samples,
- Optional<bool> *fixedSampleLocations)
-{
- ASSERT(attachment.isAttached());
-
- if (attachment.type() == GL_TEXTURE)
- {
- const Texture *texture = attachment.getTexture();
- ASSERT(texture);
-
- const ImageIndex &attachmentImageIndex = attachment.getTextureImageIndex();
-
- // ES3.1 (section 9.4) requires that the value of TEXTURE_FIXED_SAMPLE_LOCATIONS should be
- // the same for all attached textures.
- bool fixedSampleloc = texture->getFixedSampleLocations(attachmentImageIndex.type,
- attachmentImageIndex.mipIndex);
- if (fixedSampleLocations->valid() && fixedSampleloc != fixedSampleLocations->value())
- {
- return false;
- }
- else
- {
- *fixedSampleLocations = fixedSampleloc;
- }
- }
-
- if (samples->valid())
- {
- if (attachment.getSamples() != samples->value())
- {
- if (colorAttachment)
- {
- // APPLE_framebuffer_multisample, which EXT_draw_buffers refers to, requires that
- // all color attachments have the same number of samples for the FBO to be complete.
- return false;
- }
- else
- {
- // CHROMIUM_framebuffer_mixed_samples allows a framebuffer to be considered complete
- // when its depth or stencil samples are a multiple of the number of color samples.
- if (!context->getExtensions().framebufferMixedSamples)
- {
- return false;
- }
-
- if ((attachment.getSamples() % std::max(samples->value(), 1)) != 0)
- {
- return false;
- }
- }
- }
- }
- else
- {
- *samples = attachment.getSamples();
- }
-
- return true;
-}
-
-// Needed to index into the attachment arrays/bitsets.
-static_assert(static_cast<size_t>(IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS) ==
- gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_MAX,
- "Framebuffer Dirty bit mismatch");
-static_assert(static_cast<size_t>(IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS) ==
- gl::Framebuffer::DIRTY_BIT_DEPTH_ATTACHMENT,
- "Framebuffer Dirty bit mismatch");
-static_assert(static_cast<size_t>(IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS + 1) ==
- gl::Framebuffer::DIRTY_BIT_STENCIL_ATTACHMENT,
- "Framebuffer Dirty bit mismatch");
-
-Error InitAttachment(const Context *context, FramebufferAttachment *attachment)
-{
- ASSERT(attachment->isAttached());
- if (attachment->initState() == InitState::MayNeedInit)
- {
- ANGLE_TRY(attachment->initializeContents(context));
- }
- return NoError();
-}
-
-bool IsColorMaskedOut(const BlendState &blend)
-{
- return (!blend.colorMaskRed && !blend.colorMaskGreen && !blend.colorMaskBlue &&
- !blend.colorMaskAlpha);
-}
-
-bool IsDepthMaskedOut(const DepthStencilState &depthStencil)
-{
- return !depthStencil.depthMask;
-}
-
-bool IsStencilMaskedOut(const DepthStencilState &depthStencil)
-{
- return ((depthStencil.stencilMask & depthStencil.stencilWritemask) == 0);
-}
-
-bool IsClearBufferMaskedOut(const Context *context, GLenum buffer)
-{
- switch (buffer)
- {
- case GL_COLOR:
- return IsColorMaskedOut(context->getGLState().getBlendState());
- case GL_DEPTH:
- return IsDepthMaskedOut(context->getGLState().getDepthStencilState());
- case GL_STENCIL:
- return IsStencilMaskedOut(context->getGLState().getDepthStencilState());
- case GL_DEPTH_STENCIL:
- return IsDepthMaskedOut(context->getGLState().getDepthStencilState()) &&
- IsStencilMaskedOut(context->getGLState().getDepthStencilState());
- default:
- UNREACHABLE();
- return true;
- }
-}
-
-} // anonymous namespace
-
-// This constructor is only used for default framebuffers.
-FramebufferState::FramebufferState()
- : mLabel(),
- mColorAttachments(1),
- mDrawBufferStates(1, GL_BACK),
- mReadBufferState(GL_BACK),
- mDefaultWidth(0),
- mDefaultHeight(0),
- mDefaultSamples(0),
- mDefaultFixedSampleLocations(GL_FALSE),
- mWebGLDepthStencilConsistent(true)
-{
- ASSERT(mDrawBufferStates.size() > 0);
- mEnabledDrawBuffers.set(0);
-}
-
-FramebufferState::FramebufferState(const Caps &caps)
- : mLabel(),
- mColorAttachments(caps.maxColorAttachments),
- mDrawBufferStates(caps.maxDrawBuffers, GL_NONE),
- mReadBufferState(GL_COLOR_ATTACHMENT0_EXT),
- mDefaultWidth(0),
- mDefaultHeight(0),
- mDefaultSamples(0),
- mDefaultFixedSampleLocations(GL_FALSE),
- mWebGLDepthStencilConsistent(true)
-{
- ASSERT(mDrawBufferStates.size() > 0);
- mDrawBufferStates[0] = GL_COLOR_ATTACHMENT0_EXT;
-}
-
-FramebufferState::~FramebufferState()
-{
-}
-
-const std::string &FramebufferState::getLabel()
-{
- return mLabel;
-}
-
-const FramebufferAttachment *FramebufferState::getAttachment(GLenum attachment) const
-{
- if (attachment >= GL_COLOR_ATTACHMENT0 && attachment <= GL_COLOR_ATTACHMENT15)
- {
- return getColorAttachment(attachment - GL_COLOR_ATTACHMENT0);
- }
-
- switch (attachment)
- {
- case GL_COLOR:
- case GL_BACK:
- return getColorAttachment(0);
- case GL_DEPTH:
- case GL_DEPTH_ATTACHMENT:
- return getDepthAttachment();
- case GL_STENCIL:
- case GL_STENCIL_ATTACHMENT:
- return getStencilAttachment();
- case GL_DEPTH_STENCIL:
- case GL_DEPTH_STENCIL_ATTACHMENT:
- return getDepthStencilAttachment();
- default:
- UNREACHABLE();
- return nullptr;
- }
-}
-
-size_t FramebufferState::getReadIndex() const
-{
- ASSERT(mReadBufferState == GL_BACK ||
- (mReadBufferState >= GL_COLOR_ATTACHMENT0 && mReadBufferState <= GL_COLOR_ATTACHMENT15));
- size_t readIndex = (mReadBufferState == GL_BACK
- ? 0
- : static_cast<size_t>(mReadBufferState - GL_COLOR_ATTACHMENT0));
- ASSERT(readIndex < mColorAttachments.size());
- return readIndex;
-}
-
-const FramebufferAttachment *FramebufferState::getReadAttachment() const
-{
- if (mReadBufferState == GL_NONE)
- {
- return nullptr;
- }
- size_t readIndex = getReadIndex();
- return mColorAttachments[readIndex].isAttached() ? &mColorAttachments[readIndex] : nullptr;
-}
-
-const FramebufferAttachment *FramebufferState::getFirstNonNullAttachment() const
-{
- auto *colorAttachment = getFirstColorAttachment();
- if (colorAttachment)
- {
- return colorAttachment;
- }
- return getDepthOrStencilAttachment();
-}
-
-const FramebufferAttachment *FramebufferState::getFirstColorAttachment() const
-{
- for (const FramebufferAttachment &colorAttachment : mColorAttachments)
- {
- if (colorAttachment.isAttached())
- {
- return &colorAttachment;
- }
- }
-
- return nullptr;
-}
-
-const FramebufferAttachment *FramebufferState::getDepthOrStencilAttachment() const
-{
- if (mDepthAttachment.isAttached())
- {
- return &mDepthAttachment;
- }
- if (mStencilAttachment.isAttached())
- {
- return &mStencilAttachment;
- }
- return nullptr;
-}
-
-const FramebufferAttachment *FramebufferState::getStencilOrDepthStencilAttachment() const
-{
- if (mStencilAttachment.isAttached())
- {
- return &mStencilAttachment;
- }
- return getDepthStencilAttachment();
-}
-
-const FramebufferAttachment *FramebufferState::getColorAttachment(size_t colorAttachment) const
-{
- ASSERT(colorAttachment < mColorAttachments.size());
- return mColorAttachments[colorAttachment].isAttached() ? &mColorAttachments[colorAttachment]
- : nullptr;
-}
-
-const FramebufferAttachment *FramebufferState::getDepthAttachment() const
-{
- return mDepthAttachment.isAttached() ? &mDepthAttachment : nullptr;
-}
-
-const FramebufferAttachment *FramebufferState::getStencilAttachment() const
-{
- return mStencilAttachment.isAttached() ? &mStencilAttachment : nullptr;
-}
-
-const FramebufferAttachment *FramebufferState::getDepthStencilAttachment() const
-{
- // A valid depth-stencil attachment has the same resource bound to both the
- // depth and stencil attachment points.
- if (mDepthAttachment.isAttached() && mStencilAttachment.isAttached() &&
- mDepthAttachment == mStencilAttachment)
- {
- return &mDepthAttachment;
- }
-
- return nullptr;
-}
-
-bool FramebufferState::attachmentsHaveSameDimensions() const
-{
- Optional<Extents> attachmentSize;
-
- auto hasMismatchedSize = [&attachmentSize](const FramebufferAttachment &attachment) {
- if (!attachment.isAttached())
- {
- return false;
- }
-
- if (!attachmentSize.valid())
- {
- attachmentSize = attachment.getSize();
- return false;
- }
-
- const auto &prevSize = attachmentSize.value();
- const auto &curSize = attachment.getSize();
- return (curSize.width != prevSize.width || curSize.height != prevSize.height);
- };
-
- for (const auto &attachment : mColorAttachments)
- {
- if (hasMismatchedSize(attachment))
- {
- return false;
- }
- }
-
- if (hasMismatchedSize(mDepthAttachment))
- {
- return false;
- }
-
- return !hasMismatchedSize(mStencilAttachment);
-}
-
-const gl::FramebufferAttachment *FramebufferState::getDrawBuffer(size_t drawBufferIdx) const
-{
- ASSERT(drawBufferIdx < mDrawBufferStates.size());
- if (mDrawBufferStates[drawBufferIdx] != GL_NONE)
- {
- // ES3 spec: "If the GL is bound to a draw framebuffer object, the ith buffer listed in bufs
- // must be COLOR_ATTACHMENTi or NONE"
- ASSERT(mDrawBufferStates[drawBufferIdx] == GL_COLOR_ATTACHMENT0 + drawBufferIdx ||
- (drawBufferIdx == 0 && mDrawBufferStates[drawBufferIdx] == GL_BACK));
- return getAttachment(mDrawBufferStates[drawBufferIdx]);
- }
- else
- {
- return nullptr;
- }
-}
-
-size_t FramebufferState::getDrawBufferCount() const
-{
- return mDrawBufferStates.size();
-}
-
-bool FramebufferState::colorAttachmentsAreUniqueImages() const
-{
- for (size_t firstAttachmentIdx = 0; firstAttachmentIdx < mColorAttachments.size();
- firstAttachmentIdx++)
- {
- const gl::FramebufferAttachment &firstAttachment = mColorAttachments[firstAttachmentIdx];
- if (!firstAttachment.isAttached())
- {
- continue;
- }
-
- for (size_t secondAttachmentIdx = firstAttachmentIdx + 1;
- secondAttachmentIdx < mColorAttachments.size(); secondAttachmentIdx++)
- {
- const gl::FramebufferAttachment &secondAttachment =
- mColorAttachments[secondAttachmentIdx];
- if (!secondAttachment.isAttached())
- {
- continue;
- }
-
- if (firstAttachment == secondAttachment)
- {
- return false;
- }
- }
- }
-
- return true;
-}
-
-bool FramebufferState::hasDepth() const
-{
- return (mDepthAttachment.isAttached() && mDepthAttachment.getDepthSize() > 0);
-}
-
-bool FramebufferState::hasStencil() const
-{
- return (mStencilAttachment.isAttached() && mStencilAttachment.getStencilSize() > 0);
-}
-
-GLsizei FramebufferState::getNumViews() const
-{
- const FramebufferAttachment *attachment = getFirstNonNullAttachment();
- if (attachment == nullptr)
- {
- return FramebufferAttachment::kDefaultNumViews;
- }
- return attachment->getNumViews();
-}
-
-const std::vector<Offset> *FramebufferState::getViewportOffsets() const
-{
- const FramebufferAttachment *attachment = getFirstNonNullAttachment();
- if (attachment == nullptr)
- {
- return nullptr;
- }
- return &attachment->getMultiviewViewportOffsets();
-}
-
-GLenum FramebufferState::getMultiviewLayout() const
-{
- const FramebufferAttachment *attachment = getFirstNonNullAttachment();
- if (attachment == nullptr)
- {
- return GL_NONE;
- }
- return attachment->getMultiviewLayout();
-}
-
-int FramebufferState::getBaseViewIndex() const
-{
- const FramebufferAttachment *attachment = getFirstNonNullAttachment();
- if (attachment == nullptr)
- {
- return GL_NONE;
- }
- return attachment->getBaseViewIndex();
-}
-
-Box FramebufferState::getDimensions() const
-{
- ASSERT(attachmentsHaveSameDimensions());
- ASSERT(getFirstNonNullAttachment() != nullptr);
- Extents extents = getFirstNonNullAttachment()->getSize();
- return Box(0, 0, 0, extents.width, extents.height, extents.depth);
-}
-
-Framebuffer::Framebuffer(const Caps &caps, rx::GLImplFactory *factory, GLuint id)
- : mState(caps),
- mImpl(factory->createFramebuffer(mState)),
- mId(id),
- mCachedStatus(),
- mDirtyDepthAttachmentBinding(this, DIRTY_BIT_DEPTH_ATTACHMENT),
- mDirtyStencilAttachmentBinding(this, DIRTY_BIT_STENCIL_ATTACHMENT)
-{
- ASSERT(mId != 0);
- ASSERT(mImpl != nullptr);
- ASSERT(mState.mColorAttachments.size() == static_cast<size_t>(caps.maxColorAttachments));
-
- for (uint32_t colorIndex = 0;
- colorIndex < static_cast<uint32_t>(mState.mColorAttachments.size()); ++colorIndex)
- {
- mDirtyColorAttachmentBindings.emplace_back(this, DIRTY_BIT_COLOR_ATTACHMENT_0 + colorIndex);
- }
-}
-
-Framebuffer::Framebuffer(const egl::Display *display, egl::Surface *surface)
- : mState(),
- mImpl(surface->getImplementation()->createDefaultFramebuffer(mState)),
- mId(0),
- mCachedStatus(GL_FRAMEBUFFER_COMPLETE),
- mDirtyDepthAttachmentBinding(this, DIRTY_BIT_DEPTH_ATTACHMENT),
- mDirtyStencilAttachmentBinding(this, DIRTY_BIT_STENCIL_ATTACHMENT)
-{
- ASSERT(mImpl != nullptr);
- mDirtyColorAttachmentBindings.emplace_back(this, DIRTY_BIT_COLOR_ATTACHMENT_0);
-
- const Context *proxyContext = display->getProxyContext();
-
- setAttachmentImpl(proxyContext, GL_FRAMEBUFFER_DEFAULT, GL_BACK, gl::ImageIndex::MakeInvalid(),
- surface, FramebufferAttachment::kDefaultNumViews,
- FramebufferAttachment::kDefaultBaseViewIndex,
- FramebufferAttachment::kDefaultMultiviewLayout,
- FramebufferAttachment::kDefaultViewportOffsets);
-
- if (surface->getConfig()->depthSize > 0)
- {
- setAttachmentImpl(
- proxyContext, GL_FRAMEBUFFER_DEFAULT, GL_DEPTH, gl::ImageIndex::MakeInvalid(), surface,
- FramebufferAttachment::kDefaultNumViews, FramebufferAttachment::kDefaultBaseViewIndex,
- FramebufferAttachment::kDefaultMultiviewLayout,
- FramebufferAttachment::kDefaultViewportOffsets);
- }
-
- if (surface->getConfig()->stencilSize > 0)
- {
- setAttachmentImpl(proxyContext, GL_FRAMEBUFFER_DEFAULT, GL_STENCIL,
- gl::ImageIndex::MakeInvalid(), surface,
- FramebufferAttachment::kDefaultNumViews,
- FramebufferAttachment::kDefaultBaseViewIndex,
- FramebufferAttachment::kDefaultMultiviewLayout,
- FramebufferAttachment::kDefaultViewportOffsets);
- }
-}
-
-Framebuffer::Framebuffer(rx::GLImplFactory *factory)
- : mState(),
- mImpl(factory->createFramebuffer(mState)),
- mId(0),
- mCachedStatus(GL_FRAMEBUFFER_UNDEFINED_OES),
- mDirtyDepthAttachmentBinding(this, DIRTY_BIT_DEPTH_ATTACHMENT),
- mDirtyStencilAttachmentBinding(this, DIRTY_BIT_STENCIL_ATTACHMENT)
-{
- mDirtyColorAttachmentBindings.emplace_back(this, DIRTY_BIT_COLOR_ATTACHMENT_0);
-}
-
-Framebuffer::~Framebuffer()
-{
- SafeDelete(mImpl);
-}
-
-void Framebuffer::onDestroy(const Context *context)
-{
- for (auto &attachment : mState.mColorAttachments)
- {
- attachment.detach(context);
- }
- mState.mDepthAttachment.detach(context);
- mState.mStencilAttachment.detach(context);
- mState.mWebGLDepthAttachment.detach(context);
- mState.mWebGLStencilAttachment.detach(context);
- mState.mWebGLDepthStencilAttachment.detach(context);
-
- mImpl->destroy(context);
-}
-
-void Framebuffer::destroyDefault(const egl::Display *display)
-{
- mImpl->destroyDefault(display);
-}
-
-void Framebuffer::setLabel(const std::string &label)
-{
- mState.mLabel = label;
-}
-
-const std::string &Framebuffer::getLabel() const
-{
- return mState.mLabel;
-}
-
-bool Framebuffer::detachTexture(const Context *context, GLuint textureId)
-{
- return detachResourceById(context, GL_TEXTURE, textureId);
-}
-
-bool Framebuffer::detachRenderbuffer(const Context *context, GLuint renderbufferId)
-{
- return detachResourceById(context, GL_RENDERBUFFER, renderbufferId);
-}
-
-bool Framebuffer::detachResourceById(const Context *context, GLenum resourceType, GLuint resourceId)
-{
- bool found = false;
-
- for (size_t colorIndex = 0; colorIndex < mState.mColorAttachments.size(); ++colorIndex)
- {
- if (detachMatchingAttachment(context, &mState.mColorAttachments[colorIndex], resourceType,
- resourceId, DIRTY_BIT_COLOR_ATTACHMENT_0 + colorIndex))
- {
- found = true;
- }
- }
-
- if (context->isWebGL1())
- {
- const std::array<FramebufferAttachment *, 3> attachments = {
- {&mState.mWebGLDepthStencilAttachment, &mState.mWebGLDepthAttachment,
- &mState.mWebGLStencilAttachment}};
- for (FramebufferAttachment *attachment : attachments)
- {
- if (attachment->isAttached() && attachment->type() == resourceType &&
- attachment->id() == resourceId)
- {
- resetAttachment(context, attachment->getBinding());
- found = true;
- }
- }
- }
- else
- {
- if (detachMatchingAttachment(context, &mState.mDepthAttachment, resourceType, resourceId,
- DIRTY_BIT_DEPTH_ATTACHMENT))
- {
- found = true;
- }
- if (detachMatchingAttachment(context, &mState.mStencilAttachment, resourceType, resourceId,
- DIRTY_BIT_STENCIL_ATTACHMENT))
- {
- found = true;
- }
- }
-
- return found;
-}
-
-bool Framebuffer::detachMatchingAttachment(const Context *context,
- FramebufferAttachment *attachment,
- GLenum matchType,
- GLuint matchId,
- size_t dirtyBit)
-{
- if (attachment->isAttached() && attachment->type() == matchType && attachment->id() == matchId)
- {
- attachment->detach(context);
- mDirtyBits.set(dirtyBit);
- mState.mResourceNeedsInit.set(dirtyBit, false);
- return true;
- }
-
- return false;
-}
-
-const FramebufferAttachment *Framebuffer::getColorbuffer(size_t colorAttachment) const
-{
- return mState.getColorAttachment(colorAttachment);
-}
-
-const FramebufferAttachment *Framebuffer::getDepthbuffer() const
-{
- return mState.getDepthAttachment();
-}
-
-const FramebufferAttachment *Framebuffer::getStencilbuffer() const
-{
- return mState.getStencilAttachment();
-}
-
-const FramebufferAttachment *Framebuffer::getDepthStencilBuffer() const
-{
- return mState.getDepthStencilAttachment();
-}
-
-const FramebufferAttachment *Framebuffer::getDepthOrStencilbuffer() const
-{
- return mState.getDepthOrStencilAttachment();
-}
-
-const FramebufferAttachment *Framebuffer::getStencilOrDepthStencilAttachment() const
-{
- return mState.getStencilOrDepthStencilAttachment();
-}
-
-const FramebufferAttachment *Framebuffer::getReadColorbuffer() const
-{
- return mState.getReadAttachment();
-}
-
-GLenum Framebuffer::getReadColorbufferType() const
-{
- const FramebufferAttachment *readAttachment = mState.getReadAttachment();
- return (readAttachment != nullptr ? readAttachment->type() : GL_NONE);
-}
-
-const FramebufferAttachment *Framebuffer::getFirstColorbuffer() const
-{
- return mState.getFirstColorAttachment();
-}
-
-const FramebufferAttachment *Framebuffer::getFirstNonNullAttachment() const
-{
- return mState.getFirstNonNullAttachment();
-}
-
-const FramebufferAttachment *Framebuffer::getAttachment(GLenum attachment) const
-{
- return mState.getAttachment(attachment);
-}
-
-size_t Framebuffer::getDrawbufferStateCount() const
-{
- return mState.mDrawBufferStates.size();
-}
-
-GLenum Framebuffer::getDrawBufferState(size_t drawBuffer) const
-{
- ASSERT(drawBuffer < mState.mDrawBufferStates.size());
- return mState.mDrawBufferStates[drawBuffer];
-}
-
-const std::vector<GLenum> &Framebuffer::getDrawBufferStates() const
-{
- return mState.getDrawBufferStates();
-}
-
-void Framebuffer::setDrawBuffers(size_t count, const GLenum *buffers)
-{
- auto &drawStates = mState.mDrawBufferStates;
-
- ASSERT(count <= drawStates.size());
- std::copy(buffers, buffers + count, drawStates.begin());
- std::fill(drawStates.begin() + count, drawStates.end(), GL_NONE);
- mDirtyBits.set(DIRTY_BIT_DRAW_BUFFERS);
-
- mState.mEnabledDrawBuffers.reset();
- for (size_t index = 0; index < count; ++index)
- {
- if (drawStates[index] != GL_NONE && mState.mColorAttachments[index].isAttached())
- {
- mState.mEnabledDrawBuffers.set(index);
- }
- }
-}
-
-const FramebufferAttachment *Framebuffer::getDrawBuffer(size_t drawBuffer) const
-{
- return mState.getDrawBuffer(drawBuffer);
-}
-
-GLenum Framebuffer::getDrawbufferWriteType(size_t drawBuffer) const
-{
- const FramebufferAttachment *attachment = mState.getDrawBuffer(drawBuffer);
- if (attachment == nullptr)
- {
- return GL_NONE;
- }
-
- GLenum componentType = attachment->getFormat().info->componentType;
- switch (componentType)
- {
- case GL_INT:
- case GL_UNSIGNED_INT:
- return componentType;
-
- default:
- return GL_FLOAT;
- }
-}
-
-bool Framebuffer::hasEnabledDrawBuffer() const
-{
- for (size_t drawbufferIdx = 0; drawbufferIdx < mState.mDrawBufferStates.size(); ++drawbufferIdx)
- {
- if (getDrawBuffer(drawbufferIdx) != nullptr)
- {
- return true;
- }
- }
-
- return false;
-}
-
-GLenum Framebuffer::getReadBufferState() const
-{
- return mState.mReadBufferState;
-}
-
-void Framebuffer::setReadBuffer(GLenum buffer)
-{
- ASSERT(buffer == GL_BACK || buffer == GL_NONE ||
- (buffer >= GL_COLOR_ATTACHMENT0 &&
- (buffer - GL_COLOR_ATTACHMENT0) < mState.mColorAttachments.size()));
- mState.mReadBufferState = buffer;
- mDirtyBits.set(DIRTY_BIT_READ_BUFFER);
-}
-
-size_t Framebuffer::getNumColorBuffers() const
-{
- return mState.mColorAttachments.size();
-}
-
-bool Framebuffer::hasDepth() const
-{
- return mState.hasDepth();
-}
-
-bool Framebuffer::hasStencil() const
-{
- return mState.hasStencil();
-}
-
-bool Framebuffer::usingExtendedDrawBuffers() const
-{
- for (size_t drawbufferIdx = 1; drawbufferIdx < mState.mDrawBufferStates.size(); ++drawbufferIdx)
- {
- if (getDrawBuffer(drawbufferIdx) != nullptr)
- {
- return true;
- }
- }
-
- return false;
-}
-
-void Framebuffer::invalidateCompletenessCache()
-{
- if (mId != 0)
- {
- mCachedStatus.reset();
- }
-}
-
-GLenum Framebuffer::checkStatus(const Context *context)
-{
- // The default framebuffer is always complete except when it is surfaceless in which
- // case it is always unsupported. We return early because the default framebuffer may
- // not be subject to the same rules as application FBOs. ie, it could have 0x0 size.
- if (mId == 0)
- {
- ASSERT(mCachedStatus.valid());
- ASSERT(mCachedStatus.value() == GL_FRAMEBUFFER_COMPLETE ||
- mCachedStatus.value() == GL_FRAMEBUFFER_UNDEFINED_OES);
- return mCachedStatus.value();
- }
-
- if (hasAnyDirtyBit() || !mCachedStatus.valid())
- {
- mCachedStatus = checkStatusImpl(context);
- }
-
- return mCachedStatus.value();
-}
-
-GLenum Framebuffer::checkStatusImpl(const Context *context)
-{
- const ContextState &state = context->getContextState();
-
- ASSERT(mId != 0);
-
- bool hasAttachments = false;
- Optional<unsigned int> colorbufferSize;
- Optional<int> samples;
- Optional<bool> fixedSampleLocations;
- bool hasRenderbuffer = false;
-
- const FramebufferAttachment *firstAttachment = getFirstNonNullAttachment();
-
- for (const FramebufferAttachment &colorAttachment : mState.mColorAttachments)
- {
- if (colorAttachment.isAttached())
- {
- if (!CheckAttachmentCompleteness(context, colorAttachment))
- {
- return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
- }
-
- const InternalFormat &format = *colorAttachment.getFormat().info;
- if (format.depthBits > 0 || format.stencilBits > 0)
- {
- return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
- }
-
- if (!CheckAttachmentSampleCompleteness(context, colorAttachment, true, &samples,
- &fixedSampleLocations))
- {
- return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
- }
-
- // in GLES 2.0, all color attachments attachments must have the same number of bitplanes
- // in GLES 3.0, there is no such restriction
- if (state.getClientMajorVersion() < 3)
- {
- if (colorbufferSize.valid())
- {
- if (format.pixelBytes != colorbufferSize.value())
- {
- return GL_FRAMEBUFFER_UNSUPPORTED;
- }
- }
- else
- {
- colorbufferSize = format.pixelBytes;
- }
- }
-
- if (!CheckMultiviewStateMatchesForCompleteness(firstAttachment, &colorAttachment))
- {
- return GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_ANGLE;
- }
-
- hasRenderbuffer = hasRenderbuffer || (colorAttachment.type() == GL_RENDERBUFFER);
- hasAttachments = true;
- }
- }
-
- const FramebufferAttachment &depthAttachment = mState.mDepthAttachment;
- if (depthAttachment.isAttached())
- {
- if (!CheckAttachmentCompleteness(context, depthAttachment))
- {
- return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
- }
-
- const InternalFormat &format = *depthAttachment.getFormat().info;
- if (format.depthBits == 0)
- {
- return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
- }
-
- if (!CheckAttachmentSampleCompleteness(context, depthAttachment, false, &samples,
- &fixedSampleLocations))
- {
- return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
- }
-
- if (!CheckMultiviewStateMatchesForCompleteness(firstAttachment, &depthAttachment))
- {
- return GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_ANGLE;
- }
-
- hasRenderbuffer = hasRenderbuffer || (depthAttachment.type() == GL_RENDERBUFFER);
- hasAttachments = true;
- }
-
- const FramebufferAttachment &stencilAttachment = mState.mStencilAttachment;
- if (stencilAttachment.isAttached())
- {
- if (!CheckAttachmentCompleteness(context, stencilAttachment))
- {
- return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
- }
-
- const InternalFormat &format = *stencilAttachment.getFormat().info;
- if (format.stencilBits == 0)
- {
- return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
- }
-
- if (!CheckAttachmentSampleCompleteness(context, stencilAttachment, false, &samples,
- &fixedSampleLocations))
- {
- return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
- }
-
- if (!CheckMultiviewStateMatchesForCompleteness(firstAttachment, &stencilAttachment))
- {
- return GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_ANGLE;
- }
-
- hasRenderbuffer = hasRenderbuffer || (stencilAttachment.type() == GL_RENDERBUFFER);
- hasAttachments = true;
- }
-
- // Starting from ES 3.0 stencil and depth, if present, should be the same image
- if (state.getClientMajorVersion() >= 3 && depthAttachment.isAttached() &&
- stencilAttachment.isAttached() && stencilAttachment != depthAttachment)
- {
- return GL_FRAMEBUFFER_UNSUPPORTED;
- }
-
- // Special additional validation for WebGL 1 DEPTH/STENCIL/DEPTH_STENCIL.
- if (state.isWebGL1())
- {
- if (!mState.mWebGLDepthStencilConsistent)
- {
- return GL_FRAMEBUFFER_UNSUPPORTED;
- }
-
- if (mState.mWebGLDepthStencilAttachment.isAttached())
- {
- if (mState.mWebGLDepthStencilAttachment.getDepthSize() == 0 ||
- mState.mWebGLDepthStencilAttachment.getStencilSize() == 0)
- {
- return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
- }
-
- if (!CheckMultiviewStateMatchesForCompleteness(firstAttachment,
- &mState.mWebGLDepthStencilAttachment))
- {
- return GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_ANGLE;
- }
- }
- else if (mState.mStencilAttachment.isAttached() &&
- mState.mStencilAttachment.getDepthSize() > 0)
- {
- return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
- }
- else if (mState.mDepthAttachment.isAttached() &&
- mState.mDepthAttachment.getStencilSize() > 0)
- {
- return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
- }
- }
-
- // ES3.1(section 9.4) requires that if no image is attached to the framebuffer, and either the
- // value of the framebuffer's FRAMEBUFFER_DEFAULT_WIDTH or FRAMEBUFFER_DEFAULT_HEIGHT parameters
- // is zero, the framebuffer is considered incomplete.
- GLint defaultWidth = mState.getDefaultWidth();
- GLint defaultHeight = mState.getDefaultHeight();
- if (!hasAttachments && (defaultWidth == 0 || defaultHeight == 0))
- {
- return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
- }
-
- // In ES 2.0 and WebGL, all color attachments must have the same width and height.
- // In ES 3.0, there is no such restriction.
- if ((state.getClientMajorVersion() < 3 || state.getExtensions().webglCompatibility) &&
- !mState.attachmentsHaveSameDimensions())
- {
- return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
- }
-
- // ES3.1(section 9.4) requires that if the attached images are a mix of renderbuffers and
- // textures, the value of TEXTURE_FIXED_SAMPLE_LOCATIONS must be TRUE for all attached textures.
- if (fixedSampleLocations.valid() && hasRenderbuffer && !fixedSampleLocations.value())
- {
- return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
- }
-
- // The WebGL conformance tests implicitly define that all framebuffer
- // attachments must be unique. For example, the same level of a texture can
- // not be attached to two different color attachments.
- if (state.getExtensions().webglCompatibility)
- {
- if (!mState.colorAttachmentsAreUniqueImages())
- {
- return GL_FRAMEBUFFER_UNSUPPORTED;
- }
- }
-
- syncState(context);
- if (!mImpl->checkStatus(context))
- {
- return GL_FRAMEBUFFER_UNSUPPORTED;
- }
-
- return GL_FRAMEBUFFER_COMPLETE;
-}
-
-Error Framebuffer::discard(const Context *context, size_t count, const GLenum *attachments)
-{
- // Back-ends might make the contents of the FBO undefined. In WebGL 2.0, invalidate operations
- // can be no-ops, so we should probably do that to ensure consistency.
- // TODO(jmadill): WebGL behaviour, and robust resource init behaviour without WebGL.
-
- return mImpl->discard(context, count, attachments);
-}
-
-Error Framebuffer::invalidate(const Context *context, size_t count, const GLenum *attachments)
-{
- // Back-ends might make the contents of the FBO undefined. In WebGL 2.0, invalidate operations
- // can be no-ops, so we should probably do that to ensure consistency.
- // TODO(jmadill): WebGL behaviour, and robust resource init behaviour without WebGL.
-
- return mImpl->invalidate(context, count, attachments);
-}
-
-bool Framebuffer::partialClearNeedsInit(const Context *context,
- bool color,
- bool depth,
- bool stencil)
-{
- const auto &glState = context->getGLState();
-
- if (!glState.isRobustResourceInitEnabled())
- {
- return false;
- }
-
- // Scissors can affect clearing.
- // TODO(jmadill): Check for complete scissor overlap.
- if (glState.isScissorTestEnabled())
- {
- return true;
- }
-
- // If colors masked, we must clear before we clear. Do a simple check.
- // TODO(jmadill): Filter out unused color channels from the test.
- if (color)
- {
- const auto &blend = glState.getBlendState();
- if (!(blend.colorMaskRed && blend.colorMaskGreen && blend.colorMaskBlue &&
- blend.colorMaskAlpha))
- {
- return true;
- }
- }
-
- const auto &depthStencil = glState.getDepthStencilState();
- ASSERT(depthStencil.stencilBackMask == depthStencil.stencilMask);
- if (stencil && depthStencil.stencilMask != depthStencil.stencilWritemask)
- {
- return true;
- }
-
- return false;
-}
-
-Error Framebuffer::invalidateSub(const Context *context,
- size_t count,
- const GLenum *attachments,
- const gl::Rectangle &area)
-{
- // Back-ends might make the contents of the FBO undefined. In WebGL 2.0, invalidate operations
- // can be no-ops, so we should probably do that to ensure consistency.
- // TODO(jmadill): Make a invalidate no-op in WebGL 2.0.
-
- return mImpl->invalidateSub(context, count, attachments, area);
-}
-
-Error Framebuffer::clear(const gl::Context *context, GLbitfield mask)
-{
- const auto &glState = context->getGLState();
- if (glState.isRasterizerDiscardEnabled())
- {
- return NoError();
- }
-
- const auto &blend = glState.getBlendState();
- const auto &depthStencil = glState.getDepthStencilState();
-
- bool color = (mask & GL_COLOR_BUFFER_BIT) != 0 && !IsColorMaskedOut(blend);
- bool depth = (mask & GL_DEPTH_BUFFER_BIT) != 0 && !IsDepthMaskedOut(depthStencil);
- bool stencil = (mask & GL_STENCIL_BUFFER_BIT) != 0 && !IsStencilMaskedOut(depthStencil);
-
- if (partialClearNeedsInit(context, color, depth, stencil))
- {
- ANGLE_TRY(ensureDrawAttachmentsInitialized(context));
- }
-
- ANGLE_TRY(mImpl->clear(context, mask));
-
- if (glState.isRobustResourceInitEnabled())
- {
- markDrawAttachmentsInitialized(color, depth, stencil);
- }
-
- return NoError();
-}
-
-Error Framebuffer::clearBufferfv(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLfloat *values)
-{
- if (context->getGLState().isRasterizerDiscardEnabled() ||
- IsClearBufferMaskedOut(context, buffer))
- {
- return NoError();
- }
-
- if (partialBufferClearNeedsInit(context, buffer))
- {
- ANGLE_TRY(ensureBufferInitialized(context, buffer, drawbuffer));
- }
-
- ANGLE_TRY(mImpl->clearBufferfv(context, buffer, drawbuffer, values));
-
- if (context->isRobustResourceInitEnabled())
- {
- markBufferInitialized(buffer, drawbuffer);
- }
- return NoError();
-}
-
-Error Framebuffer::clearBufferuiv(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLuint *values)
-{
- if (context->getGLState().isRasterizerDiscardEnabled() ||
- IsClearBufferMaskedOut(context, buffer))
- {
- return NoError();
- }
-
- if (partialBufferClearNeedsInit(context, buffer))
- {
- ANGLE_TRY(ensureBufferInitialized(context, buffer, drawbuffer));
- }
-
- ANGLE_TRY(mImpl->clearBufferuiv(context, buffer, drawbuffer, values));
-
- if (context->isRobustResourceInitEnabled())
- {
- markBufferInitialized(buffer, drawbuffer);
- }
- return NoError();
-}
-
-Error Framebuffer::clearBufferiv(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLint *values)
-{
- if (context->getGLState().isRasterizerDiscardEnabled() ||
- IsClearBufferMaskedOut(context, buffer))
- {
- return NoError();
- }
-
- if (partialBufferClearNeedsInit(context, buffer))
- {
- ANGLE_TRY(ensureBufferInitialized(context, buffer, drawbuffer));
- }
-
- ANGLE_TRY(mImpl->clearBufferiv(context, buffer, drawbuffer, values));
-
- if (context->isRobustResourceInitEnabled())
- {
- markBufferInitialized(buffer, drawbuffer);
- }
- return NoError();
-}
-
-Error Framebuffer::clearBufferfi(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- GLfloat depth,
- GLint stencil)
-{
- if (context->getGLState().isRasterizerDiscardEnabled() ||
- IsClearBufferMaskedOut(context, buffer))
- {
- return NoError();
- }
-
- if (partialBufferClearNeedsInit(context, buffer))
- {
- ANGLE_TRY(ensureBufferInitialized(context, buffer, drawbuffer));
- }
-
- ANGLE_TRY(mImpl->clearBufferfi(context, buffer, drawbuffer, depth, stencil));
-
- if (context->isRobustResourceInitEnabled())
- {
- markBufferInitialized(buffer, drawbuffer);
- }
- return NoError();
-}
-
-GLenum Framebuffer::getImplementationColorReadFormat(const Context *context) const
-{
- return mImpl->getImplementationColorReadFormat(context);
-}
-
-GLenum Framebuffer::getImplementationColorReadType(const Context *context) const
-{
- return mImpl->getImplementationColorReadType(context);
-}
-
-Error Framebuffer::readPixels(const gl::Context *context,
- const Rectangle &area,
- GLenum format,
- GLenum type,
- void *pixels)
-{
- ANGLE_TRY(ensureReadAttachmentInitialized(context, GL_COLOR_BUFFER_BIT));
- ANGLE_TRY(mImpl->readPixels(context, area, format, type, pixels));
-
- Buffer *unpackBuffer = context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack);
- if (unpackBuffer)
- {
- unpackBuffer->onPixelUnpack();
- }
-
- return NoError();
-}
-
-Error Framebuffer::blit(const gl::Context *context,
- const Rectangle &sourceArea,
- const Rectangle &destArea,
- GLbitfield mask,
- GLenum filter)
-{
- GLbitfield blitMask = mask;
-
- // Note that blitting is called against draw framebuffer.
- // See the code in gl::Context::blitFramebuffer.
- if ((mask & GL_COLOR_BUFFER_BIT) && !hasEnabledDrawBuffer())
- {
- blitMask &= ~GL_COLOR_BUFFER_BIT;
- }
-
- if ((mask & GL_STENCIL_BUFFER_BIT) && mState.getStencilAttachment() == nullptr)
- {
- blitMask &= ~GL_STENCIL_BUFFER_BIT;
- }
-
- if ((mask & GL_DEPTH_BUFFER_BIT) && mState.getDepthAttachment() == nullptr)
- {
- blitMask &= ~GL_DEPTH_BUFFER_BIT;
- }
-
- if (!blitMask)
- {
- return NoError();
- }
-
- auto *sourceFBO = context->getGLState().getReadFramebuffer();
- ANGLE_TRY(sourceFBO->ensureReadAttachmentInitialized(context, blitMask));
-
- // TODO(jmadill): Only clear if not the full FBO dimensions, and only specified bitmask.
- ANGLE_TRY(ensureDrawAttachmentsInitialized(context));
-
- return mImpl->blit(context, sourceArea, destArea, blitMask, filter);
-}
-
-int Framebuffer::getSamples(const Context *context)
-{
- if (complete(context))
- {
- return getCachedSamples(context);
- }
-
- return 0;
-}
-
-int Framebuffer::getCachedSamples(const Context *context)
-{
- // For a complete framebuffer, all attachments must have the same sample count.
- // In this case return the first nonzero sample size.
- const auto *firstNonNullAttachment = mState.getFirstNonNullAttachment();
- if (firstNonNullAttachment)
- {
- ASSERT(firstNonNullAttachment->isAttached());
- return firstNonNullAttachment->getSamples();
- }
-
- // No attachments found.
- return 0;
-}
-
-Error Framebuffer::getSamplePosition(size_t index, GLfloat *xy) const
-{
- ANGLE_TRY(mImpl->getSamplePosition(index, xy));
- return NoError();
-}
-
-bool Framebuffer::hasValidDepthStencil() const
-{
- return mState.getDepthStencilAttachment() != nullptr;
-}
-
-void Framebuffer::setAttachment(const Context *context,
- GLenum type,
- GLenum binding,
- const ImageIndex &textureIndex,
- FramebufferAttachmentObject *resource)
-{
- setAttachment(context, type, binding, textureIndex, resource,
- FramebufferAttachment::kDefaultNumViews,
- FramebufferAttachment::kDefaultBaseViewIndex,
- FramebufferAttachment::kDefaultMultiviewLayout,
- FramebufferAttachment::kDefaultViewportOffsets);
-}
-
-void Framebuffer::setAttachment(const Context *context,
- GLenum type,
- GLenum binding,
- const ImageIndex &textureIndex,
- FramebufferAttachmentObject *resource,
- GLsizei numViews,
- GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets)
-{
- // Context may be null in unit tests.
- if (!context || !context->isWebGL1())
- {
- setAttachmentImpl(context, type, binding, textureIndex, resource, numViews, baseViewIndex,
- multiviewLayout, viewportOffsets);
- return;
- }
-
- switch (binding)
- {
- case GL_DEPTH_STENCIL:
- case GL_DEPTH_STENCIL_ATTACHMENT:
- mState.mWebGLDepthStencilAttachment.attach(context, type, binding, textureIndex,
- resource, numViews, baseViewIndex,
- multiviewLayout, viewportOffsets);
- break;
- case GL_DEPTH:
- case GL_DEPTH_ATTACHMENT:
- mState.mWebGLDepthAttachment.attach(context, type, binding, textureIndex, resource,
- numViews, baseViewIndex, multiviewLayout,
- viewportOffsets);
- break;
- case GL_STENCIL:
- case GL_STENCIL_ATTACHMENT:
- mState.mWebGLStencilAttachment.attach(context, type, binding, textureIndex, resource,
- numViews, baseViewIndex, multiviewLayout,
- viewportOffsets);
- break;
- default:
- setAttachmentImpl(context, type, binding, textureIndex, resource, numViews,
- baseViewIndex, multiviewLayout, viewportOffsets);
- 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);
-}
-
-void Framebuffer::setAttachmentMultiviewSideBySide(const Context *context,
- GLenum type,
- GLenum binding,
- const ImageIndex &textureIndex,
- FramebufferAttachmentObject *resource,
- GLsizei numViews,
- const GLint *viewportOffsets)
-{
- setAttachment(context, type, binding, textureIndex, resource, numViews,
- FramebufferAttachment::kDefaultBaseViewIndex,
- GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE, viewportOffsets);
-}
-
-void Framebuffer::commitWebGL1DepthStencilIfConsistent(const Context *context,
- GLsizei numViews,
- GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets)
-{
- int count = 0;
-
- std::array<FramebufferAttachment *, 3> attachments = {{&mState.mWebGLDepthStencilAttachment,
- &mState.mWebGLDepthAttachment,
- &mState.mWebGLStencilAttachment}};
- for (FramebufferAttachment *attachment : attachments)
- {
- if (attachment->isAttached())
- {
- count++;
- }
- }
-
- mState.mWebGLDepthStencilConsistent = (count <= 1);
- if (!mState.mWebGLDepthStencilConsistent)
- {
- // Inconsistent.
- return;
- }
-
- auto getImageIndexIfTextureAttachment = [](const FramebufferAttachment &attachment) {
- if (attachment.type() == GL_TEXTURE)
- {
- return attachment.getTextureImageIndex();
- }
- else
- {
- return ImageIndex::MakeInvalid();
- }
- };
-
- if (mState.mWebGLDepthAttachment.isAttached())
- {
- const auto &depth = mState.mWebGLDepthAttachment;
- setAttachmentImpl(context, depth.type(), GL_DEPTH_ATTACHMENT,
- getImageIndexIfTextureAttachment(depth), depth.getResource(), numViews,
- baseViewIndex, multiviewLayout, viewportOffsets);
- setAttachmentImpl(context, GL_NONE, GL_STENCIL_ATTACHMENT, ImageIndex::MakeInvalid(),
- nullptr, numViews, baseViewIndex, multiviewLayout, viewportOffsets);
- }
- else if (mState.mWebGLStencilAttachment.isAttached())
- {
- const auto &stencil = mState.mWebGLStencilAttachment;
- setAttachmentImpl(context, GL_NONE, GL_DEPTH_ATTACHMENT, ImageIndex::MakeInvalid(), nullptr,
- numViews, baseViewIndex, multiviewLayout, viewportOffsets);
- setAttachmentImpl(context, stencil.type(), GL_STENCIL_ATTACHMENT,
- getImageIndexIfTextureAttachment(stencil), stencil.getResource(),
- numViews, baseViewIndex, multiviewLayout, viewportOffsets);
- }
- 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);
- setAttachmentImpl(context, depthStencil.type(), GL_STENCIL_ATTACHMENT,
- getImageIndexIfTextureAttachment(depthStencil),
- depthStencil.getResource(), numViews, baseViewIndex, multiviewLayout,
- viewportOffsets);
- }
- else
- {
- setAttachmentImpl(context, GL_NONE, GL_DEPTH_ATTACHMENT, ImageIndex::MakeInvalid(), nullptr,
- numViews, baseViewIndex, multiviewLayout, viewportOffsets);
- setAttachmentImpl(context, GL_NONE, GL_STENCIL_ATTACHMENT, ImageIndex::MakeInvalid(),
- nullptr, numViews, baseViewIndex, multiviewLayout, viewportOffsets);
- }
-}
-
-void Framebuffer::setAttachmentImpl(const Context *context,
- GLenum type,
- GLenum binding,
- const ImageIndex &textureIndex,
- FramebufferAttachmentObject *resource,
- GLsizei numViews,
- GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets)
-{
- switch (binding)
- {
- case GL_DEPTH_STENCIL:
- case GL_DEPTH_STENCIL_ATTACHMENT:
- {
- // ensure this is a legitimate depth+stencil format
- FramebufferAttachmentObject *attachmentObj = resource;
- if (resource)
- {
- const Format &format = resource->getAttachmentFormat(binding, textureIndex);
- if (format.info->depthBits == 0 || format.info->stencilBits == 0)
- {
- // Attaching nullptr detaches the current attachment.
- attachmentObj = nullptr;
- }
- }
-
- updateAttachment(context, &mState.mDepthAttachment, DIRTY_BIT_DEPTH_ATTACHMENT,
- &mDirtyDepthAttachmentBinding, type, binding, textureIndex,
- attachmentObj, numViews, baseViewIndex, multiviewLayout,
- viewportOffsets);
- updateAttachment(context, &mState.mStencilAttachment, DIRTY_BIT_STENCIL_ATTACHMENT,
- &mDirtyStencilAttachmentBinding, type, binding, textureIndex,
- attachmentObj, numViews, baseViewIndex, multiviewLayout,
- viewportOffsets);
- break;
- }
-
- case GL_DEPTH:
- case GL_DEPTH_ATTACHMENT:
- updateAttachment(context, &mState.mDepthAttachment, DIRTY_BIT_DEPTH_ATTACHMENT,
- &mDirtyDepthAttachmentBinding, type, binding, textureIndex, resource,
- numViews, baseViewIndex, multiviewLayout, viewportOffsets);
- 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);
- break;
-
- case GL_BACK:
- mState.mColorAttachments[0].attach(context, type, binding, textureIndex, resource,
- numViews, baseViewIndex, multiviewLayout,
- viewportOffsets);
- mDirtyBits.set(DIRTY_BIT_COLOR_ATTACHMENT_0);
- // No need for a resource binding for the default FBO, it's always complete.
- break;
-
- default:
- {
- size_t colorIndex = binding - GL_COLOR_ATTACHMENT0;
- ASSERT(colorIndex < mState.mColorAttachments.size());
- 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);
-
- // TODO(jmadill): ASSERT instead of checking the attachment exists in
- // formsRenderingFeedbackLoopWith
- bool enabled = (type != GL_NONE && getDrawBufferState(colorIndex) != GL_NONE);
- mState.mEnabledDrawBuffers.set(colorIndex, enabled);
- }
- break;
- }
-
- mAttachedTextures.reset();
-}
-
-void Framebuffer::updateAttachment(const Context *context,
- FramebufferAttachment *attachment,
- size_t dirtyBit,
- OnAttachmentDirtyBinding *onDirtyBinding,
- GLenum type,
- GLenum binding,
- const ImageIndex &textureIndex,
- FramebufferAttachmentObject *resource,
- GLsizei numViews,
- GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets)
-{
- attachment->attach(context, type, binding, textureIndex, resource, numViews, baseViewIndex,
- multiviewLayout, viewportOffsets);
- mDirtyBits.set(dirtyBit);
- mState.mResourceNeedsInit.set(dirtyBit, attachment->initState() == InitState::MayNeedInit);
- BindResourceChannel(onDirtyBinding, resource);
-}
-
-void Framebuffer::resetAttachment(const Context *context, GLenum binding)
-{
- setAttachment(context, GL_NONE, binding, ImageIndex::MakeInvalid(), nullptr);
-}
-
-void Framebuffer::syncState(const Context *context)
-{
- if (mDirtyBits.any())
- {
- mImpl->syncState(context, mDirtyBits);
- mDirtyBits.reset();
- if (mId != 0)
- {
- mCachedStatus.reset();
- }
- }
-}
-
-void Framebuffer::signal(size_t dirtyBit, InitState state)
-{
- // TOOD(jmadill): Make this only update individual attachments to do less work.
- mCachedStatus.reset();
-
- // Mark the appropriate init flag.
- mState.mResourceNeedsInit.set(dirtyBit, state == InitState::MayNeedInit);
-}
-
-bool Framebuffer::complete(const Context *context)
-{
- return (checkStatus(context) == GL_FRAMEBUFFER_COMPLETE);
-}
-
-bool Framebuffer::cachedComplete() const
-{
- return (mCachedStatus.valid() && mCachedStatus == GL_FRAMEBUFFER_COMPLETE);
-}
-
-bool Framebuffer::formsRenderingFeedbackLoopWith(const State &state) const
-{
- const Program *program = state.getProgram();
-
- // TODO(jmadill): Default framebuffer feedback loops.
- if (mId == 0)
- {
- return false;
- }
-
- // The bitset will skip inactive draw buffers.
- for (size_t drawIndex : mState.mEnabledDrawBuffers)
- {
- const FramebufferAttachment &attachment = mState.mColorAttachments[drawIndex];
- ASSERT(attachment.isAttached());
- if (attachment.type() == GL_TEXTURE)
- {
- // Validate the feedback loop.
- if (program->samplesFromTexture(state, attachment.id()))
- {
- return true;
- }
- }
- }
-
- // Validate depth-stencil feedback loop.
- const auto &dsState = state.getDepthStencilState();
-
- // We can skip the feedback loop checks if depth/stencil is masked out or disabled.
- const FramebufferAttachment *depth = getDepthbuffer();
- if (depth && depth->type() == GL_TEXTURE && dsState.depthTest && dsState.depthMask)
- {
- if (program->samplesFromTexture(state, depth->id()))
- {
- return true;
- }
- }
-
- // Note: we assume the front and back masks are the same for WebGL.
- const FramebufferAttachment *stencil = getStencilbuffer();
- ASSERT(dsState.stencilBackWritemask == dsState.stencilWritemask);
- if (stencil && stencil->type() == GL_TEXTURE && dsState.stencilTest &&
- dsState.stencilWritemask != 0)
- {
- // Skip the feedback loop check if depth/stencil point to the same resource.
- if (!depth || *stencil != *depth)
- {
- if (program->samplesFromTexture(state, stencil->id()))
- {
- return true;
- }
- }
- }
-
- return false;
-}
-
-bool Framebuffer::formsCopyingFeedbackLoopWith(GLuint copyTextureID,
- GLint copyTextureLevel,
- GLint copyTextureLayer) const
-{
- if (mId == 0)
- {
- // It seems impossible to form a texture copying feedback loop with the default FBO.
- return false;
- }
-
- const FramebufferAttachment *readAttachment = getReadColorbuffer();
- ASSERT(readAttachment);
-
- if (readAttachment->isTextureWithId(copyTextureID))
- {
- const auto &imageIndex = readAttachment->getTextureImageIndex();
- if (imageIndex.mipIndex == copyTextureLevel)
- {
- // Check 3D/Array texture layers.
- return imageIndex.layerIndex == ImageIndex::ENTIRE_LEVEL ||
- copyTextureLayer == ImageIndex::ENTIRE_LEVEL ||
- imageIndex.layerIndex == copyTextureLayer;
- }
- }
- return false;
-}
-
-GLint Framebuffer::getDefaultWidth() const
-{
- return mState.getDefaultWidth();
-}
-
-GLint Framebuffer::getDefaultHeight() const
-{
- return mState.getDefaultHeight();
-}
-
-GLint Framebuffer::getDefaultSamples() const
-{
- return mState.getDefaultSamples();
-}
-
-bool Framebuffer::getDefaultFixedSampleLocations() const
-{
- return mState.getDefaultFixedSampleLocations();
-}
-
-void Framebuffer::setDefaultWidth(GLint defaultWidth)
-{
- mState.mDefaultWidth = defaultWidth;
- mDirtyBits.set(DIRTY_BIT_DEFAULT_WIDTH);
-}
-
-void Framebuffer::setDefaultHeight(GLint defaultHeight)
-{
- mState.mDefaultHeight = defaultHeight;
- mDirtyBits.set(DIRTY_BIT_DEFAULT_HEIGHT);
-}
-
-void Framebuffer::setDefaultSamples(GLint defaultSamples)
-{
- mState.mDefaultSamples = defaultSamples;
- mDirtyBits.set(DIRTY_BIT_DEFAULT_SAMPLES);
-}
-
-void Framebuffer::setDefaultFixedSampleLocations(bool defaultFixedSampleLocations)
-{
- mState.mDefaultFixedSampleLocations = defaultFixedSampleLocations;
- mDirtyBits.set(DIRTY_BIT_DEFAULT_FIXED_SAMPLE_LOCATIONS);
-}
-
-// TODO(jmadill): Remove this kludge.
-GLenum Framebuffer::checkStatus(const ValidationContext *context)
-{
- return checkStatus(static_cast<const Context *>(context));
-}
-
-int Framebuffer::getSamples(const ValidationContext *context)
-{
- return getSamples(static_cast<const Context *>(context));
-}
-
-GLsizei Framebuffer::getNumViews() const
-{
- return mState.getNumViews();
-}
-
-GLint Framebuffer::getBaseViewIndex() const
-{
- return mState.getBaseViewIndex();
-}
-
-const std::vector<Offset> *Framebuffer::getViewportOffsets() const
-{
- return mState.getViewportOffsets();
-}
-
-GLenum Framebuffer::getMultiviewLayout() const
-{
- return mState.getMultiviewLayout();
-}
-
-Error Framebuffer::ensureDrawAttachmentsInitialized(const Context *context)
-{
- if (!context->isRobustResourceInitEnabled())
- {
- return NoError();
- }
-
- // Note: we don't actually filter by the draw attachment enum. Just init everything.
- for (size_t bit : mState.mResourceNeedsInit)
- {
- switch (bit)
- {
- case DIRTY_BIT_DEPTH_ATTACHMENT:
- ANGLE_TRY(InitAttachment(context, &mState.mDepthAttachment));
- break;
- case DIRTY_BIT_STENCIL_ATTACHMENT:
- ANGLE_TRY(InitAttachment(context, &mState.mStencilAttachment));
- break;
- default:
- ANGLE_TRY(InitAttachment(context, &mState.mColorAttachments[bit]));
- break;
- }
- }
-
- mState.mResourceNeedsInit.reset();
- return NoError();
-}
-
-Error Framebuffer::ensureReadAttachmentInitialized(const Context *context, GLbitfield blitMask)
-{
- if (!context->isRobustResourceInitEnabled() || mState.mResourceNeedsInit.none())
- {
- return NoError();
- }
-
- if ((blitMask & GL_COLOR_BUFFER_BIT) != 0 && mState.mReadBufferState != GL_NONE)
- {
- size_t readIndex = mState.getReadIndex();
- if (mState.mResourceNeedsInit[readIndex])
- {
- ANGLE_TRY(InitAttachment(context, &mState.mColorAttachments[readIndex]));
- mState.mResourceNeedsInit.reset(readIndex);
- }
- }
-
- if ((blitMask & GL_DEPTH_BUFFER_BIT) != 0 && hasDepth())
- {
- if (mState.mResourceNeedsInit[DIRTY_BIT_DEPTH_ATTACHMENT])
- {
- ANGLE_TRY(InitAttachment(context, &mState.mDepthAttachment));
- mState.mResourceNeedsInit.reset(DIRTY_BIT_DEPTH_ATTACHMENT);
- }
- }
-
- if ((blitMask & GL_STENCIL_BUFFER_BIT) != 0 && hasStencil())
- {
- if (mState.mResourceNeedsInit[DIRTY_BIT_STENCIL_ATTACHMENT])
- {
- ANGLE_TRY(InitAttachment(context, &mState.mStencilAttachment));
- mState.mResourceNeedsInit.reset(DIRTY_BIT_STENCIL_ATTACHMENT);
- }
- }
-
- return NoError();
-}
-
-void Framebuffer::markDrawAttachmentsInitialized(bool color, bool depth, bool stencil)
-{
- // Mark attachments as initialized.
- if (color)
- {
- for (auto colorIndex : mState.mEnabledDrawBuffers)
- {
- auto &colorAttachment = mState.mColorAttachments[colorIndex];
- ASSERT(colorAttachment.isAttached());
- colorAttachment.setInitState(InitState::Initialized);
- mState.mResourceNeedsInit.reset(colorIndex);
- }
- }
-
- if (depth && mState.mDepthAttachment.isAttached())
- {
- mState.mDepthAttachment.setInitState(InitState::Initialized);
- mState.mResourceNeedsInit.reset(DIRTY_BIT_DEPTH_ATTACHMENT);
- }
-
- if (stencil && mState.mStencilAttachment.isAttached())
- {
- mState.mStencilAttachment.setInitState(InitState::Initialized);
- mState.mResourceNeedsInit.reset(DIRTY_BIT_STENCIL_ATTACHMENT);
- }
-}
-
-void Framebuffer::markBufferInitialized(GLenum bufferType, GLint bufferIndex)
-{
- switch (bufferType)
- {
- case GL_COLOR:
- {
- ASSERT(bufferIndex < static_cast<GLint>(mState.mColorAttachments.size()));
- if (mState.mColorAttachments[bufferIndex].isAttached())
- {
- mState.mColorAttachments[bufferIndex].setInitState(InitState::Initialized);
- mState.mResourceNeedsInit.reset(bufferIndex);
- }
- break;
- }
- case GL_DEPTH:
- {
- if (mState.mDepthAttachment.isAttached())
- {
- mState.mDepthAttachment.setInitState(InitState::Initialized);
- mState.mResourceNeedsInit.reset(DIRTY_BIT_DEPTH_ATTACHMENT);
- }
- break;
- }
- case GL_STENCIL:
- {
- if (mState.mStencilAttachment.isAttached())
- {
- mState.mStencilAttachment.setInitState(InitState::Initialized);
- mState.mResourceNeedsInit.reset(DIRTY_BIT_STENCIL_ATTACHMENT);
- }
- break;
- }
- case GL_DEPTH_STENCIL:
- {
- if (mState.mDepthAttachment.isAttached())
- {
- mState.mDepthAttachment.setInitState(InitState::Initialized);
- mState.mResourceNeedsInit.reset(DIRTY_BIT_DEPTH_ATTACHMENT);
- }
- if (mState.mStencilAttachment.isAttached())
- {
- mState.mStencilAttachment.setInitState(InitState::Initialized);
- mState.mResourceNeedsInit.reset(DIRTY_BIT_STENCIL_ATTACHMENT);
- }
- break;
- }
- default:
- UNREACHABLE();
- break;
- }
-}
-
-Box Framebuffer::getDimensions() const
-{
- return mState.getDimensions();
-}
-
-Error Framebuffer::ensureBufferInitialized(const Context *context,
- GLenum bufferType,
- GLint bufferIndex)
-{
- ASSERT(context->isRobustResourceInitEnabled());
-
- if (mState.mResourceNeedsInit.none())
- {
- return NoError();
- }
-
- switch (bufferType)
- {
- case GL_COLOR:
- {
- ASSERT(bufferIndex < static_cast<GLint>(mState.mColorAttachments.size()));
- if (mState.mResourceNeedsInit[bufferIndex])
- {
- ANGLE_TRY(InitAttachment(context, &mState.mColorAttachments[bufferIndex]));
- mState.mResourceNeedsInit.reset(bufferIndex);
- }
- break;
- }
- case GL_DEPTH:
- {
- if (mState.mResourceNeedsInit[DIRTY_BIT_DEPTH_ATTACHMENT])
- {
- ANGLE_TRY(InitAttachment(context, &mState.mDepthAttachment));
- mState.mResourceNeedsInit.reset(DIRTY_BIT_DEPTH_ATTACHMENT);
- }
- break;
- }
- case GL_STENCIL:
- {
- if (mState.mResourceNeedsInit[DIRTY_BIT_STENCIL_ATTACHMENT])
- {
- ANGLE_TRY(InitAttachment(context, &mState.mStencilAttachment));
- mState.mResourceNeedsInit.reset(DIRTY_BIT_STENCIL_ATTACHMENT);
- }
- break;
- }
- case GL_DEPTH_STENCIL:
- {
- if (mState.mResourceNeedsInit[DIRTY_BIT_DEPTH_ATTACHMENT])
- {
- ANGLE_TRY(InitAttachment(context, &mState.mDepthAttachment));
- mState.mResourceNeedsInit.reset(DIRTY_BIT_DEPTH_ATTACHMENT);
- }
- if (mState.mResourceNeedsInit[DIRTY_BIT_STENCIL_ATTACHMENT])
- {
- ANGLE_TRY(InitAttachment(context, &mState.mStencilAttachment));
- mState.mResourceNeedsInit.reset(DIRTY_BIT_STENCIL_ATTACHMENT);
- }
- break;
- }
- default:
- UNREACHABLE();
- break;
- }
-
- return NoError();
-}
-
-bool Framebuffer::partialBufferClearNeedsInit(const Context *context, GLenum bufferType)
-{
- if (!context->isRobustResourceInitEnabled() || mState.mResourceNeedsInit.none())
- {
- return false;
- }
-
- switch (bufferType)
- {
- case GL_COLOR:
- return partialClearNeedsInit(context, true, false, false);
- case GL_DEPTH:
- return partialClearNeedsInit(context, false, true, false);
- case GL_STENCIL:
- return partialClearNeedsInit(context, false, false, true);
- case GL_DEPTH_STENCIL:
- return partialClearNeedsInit(context, false, true, true);
- default:
- UNREACHABLE();
- return false;
- }
-}
-
-bool Framebuffer::hasTextureAttachment(const Texture *texture) const
-{
- if (!mAttachedTextures.valid())
- {
- std::set<const FramebufferAttachmentObject *> attachedTextures;
-
- for (const auto &colorAttachment : mState.mColorAttachments)
- {
- if (colorAttachment.isAttached() && colorAttachment.type() == GL_TEXTURE)
- {
- attachedTextures.insert(colorAttachment.getResource());
- }
- }
-
- if (mState.mDepthAttachment.isAttached() && mState.mDepthAttachment.type() == GL_TEXTURE)
- {
- attachedTextures.insert(mState.mDepthAttachment.getResource());
- }
-
- if (mState.mStencilAttachment.isAttached() &&
- mState.mStencilAttachment.type() == GL_TEXTURE)
- {
- attachedTextures.insert(mState.mStencilAttachment.getResource());
- }
-
- mAttachedTextures = std::move(attachedTextures);
- }
-
- return (mAttachedTextures.value().count(texture) > 0);
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/Framebuffer.h b/src/3rdparty/angle/src/libANGLE/Framebuffer.h
deleted file mode 100644
index 70223f0bc7..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Framebuffer.h
+++ /dev/null
@@ -1,389 +0,0 @@
-//
-// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Framebuffer.h: Defines the gl::Framebuffer class. Implements GL framebuffer
-// objects and related functionality. [OpenGL ES 2.0.24] section 4.4 page 105.
-
-#ifndef LIBANGLE_FRAMEBUFFER_H_
-#define LIBANGLE_FRAMEBUFFER_H_
-
-#include <vector>
-
-#include "common/Optional.h"
-#include "common/angleutils.h"
-#include "libANGLE/Constants.h"
-#include "libANGLE/Debug.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/RefCountObject.h"
-#include "libANGLE/signal_utils.h"
-
-namespace rx
-{
-class GLImplFactory;
-class FramebufferImpl;
-class RenderbufferImpl;
-class SurfaceImpl;
-}
-
-namespace egl
-{
-class Display;
-class Surface;
-}
-
-namespace gl
-{
-class Context;
-class ContextState;
-class Framebuffer;
-class Renderbuffer;
-class State;
-class Texture;
-class TextureCapsMap;
-class ValidationContext;
-struct Caps;
-struct Extensions;
-struct ImageIndex;
-struct Rectangle;
-
-class FramebufferState final : angle::NonCopyable
-{
- public:
- FramebufferState();
- explicit FramebufferState(const Caps &caps);
- ~FramebufferState();
-
- const std::string &getLabel();
- size_t getReadIndex() const;
-
- const FramebufferAttachment *getAttachment(GLenum attachment) const;
- const FramebufferAttachment *getReadAttachment() const;
- const FramebufferAttachment *getFirstNonNullAttachment() const;
- const FramebufferAttachment *getFirstColorAttachment() const;
- const FramebufferAttachment *getDepthOrStencilAttachment() const;
- const FramebufferAttachment *getStencilOrDepthStencilAttachment() const;
- const FramebufferAttachment *getColorAttachment(size_t colorAttachment) const;
- const FramebufferAttachment *getDepthAttachment() const;
- const FramebufferAttachment *getStencilAttachment() const;
- const FramebufferAttachment *getDepthStencilAttachment() const;
-
- const std::vector<GLenum> &getDrawBufferStates() const { return mDrawBufferStates; }
- DrawBufferMask getEnabledDrawBuffers() const { return mEnabledDrawBuffers; }
- GLenum getReadBufferState() const { return mReadBufferState; }
- const std::vector<FramebufferAttachment> &getColorAttachments() const
- {
- return mColorAttachments;
- }
-
- bool attachmentsHaveSameDimensions() const;
- bool colorAttachmentsAreUniqueImages() const;
- Box getDimensions() const;
-
- const FramebufferAttachment *getDrawBuffer(size_t drawBufferIdx) const;
- size_t getDrawBufferCount() const;
-
- GLint getDefaultWidth() const { return mDefaultWidth; };
- GLint getDefaultHeight() const { return mDefaultHeight; };
- GLint getDefaultSamples() const { return mDefaultSamples; };
- bool getDefaultFixedSampleLocations() const { return mDefaultFixedSampleLocations; };
-
- bool hasDepth() const;
- bool hasStencil() const;
-
- GLenum getMultiviewLayout() const;
- GLsizei getNumViews() const;
- const std::vector<Offset> *getViewportOffsets() const;
- GLint getBaseViewIndex() const;
-
- private:
- friend class Framebuffer;
-
- std::string mLabel;
-
- std::vector<FramebufferAttachment> mColorAttachments;
- FramebufferAttachment mDepthAttachment;
- FramebufferAttachment mStencilAttachment;
-
- std::vector<GLenum> mDrawBufferStates;
- GLenum mReadBufferState;
- DrawBufferMask mEnabledDrawBuffers;
-
- GLint mDefaultWidth;
- GLint mDefaultHeight;
- GLint mDefaultSamples;
- bool mDefaultFixedSampleLocations;
-
- // It's necessary to store all this extra state so we can restore attachments
- // when DEPTH_STENCIL/DEPTH/STENCIL is unbound in WebGL 1.
- FramebufferAttachment mWebGLDepthStencilAttachment;
- FramebufferAttachment mWebGLDepthAttachment;
- FramebufferAttachment mWebGLStencilAttachment;
- bool mWebGLDepthStencilConsistent;
-
- // Tracks if we need to initialize the resources for each attachment.
- angle::BitSet<IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS + 2> mResourceNeedsInit;
-};
-
-class Framebuffer final : public LabeledObject, public OnAttachmentDirtyReceiver
-{
- public:
- // Constructor to build application-defined framebuffers
- Framebuffer(const Caps &caps, rx::GLImplFactory *factory, GLuint id);
- // Constructor to build default framebuffers for a surface
- Framebuffer(const egl::Display *display, egl::Surface *surface);
- // Constructor to build a fake default framebuffer when surfaceless
- Framebuffer(rx::GLImplFactory *factory);
-
- ~Framebuffer() override;
- void onDestroy(const Context *context);
- void destroyDefault(const egl::Display *display);
-
- void setLabel(const std::string &label) override;
- const std::string &getLabel() const override;
-
- rx::FramebufferImpl *getImplementation() const { return mImpl; }
-
- GLuint id() const { return mId; }
-
- void setAttachment(const Context *context,
- GLenum type,
- 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 resetAttachment(const Context *context, GLenum binding);
-
- bool detachTexture(const Context *context, GLuint texture);
- bool detachRenderbuffer(const Context *context, GLuint renderbuffer);
-
- const FramebufferAttachment *getColorbuffer(size_t colorAttachment) const;
- const FramebufferAttachment *getDepthbuffer() const;
- const FramebufferAttachment *getStencilbuffer() const;
- const FramebufferAttachment *getDepthStencilBuffer() const;
- const FramebufferAttachment *getDepthOrStencilbuffer() const;
- const FramebufferAttachment *getStencilOrDepthStencilAttachment() const;
- const FramebufferAttachment *getReadColorbuffer() const;
- GLenum getReadColorbufferType() const;
- const FramebufferAttachment *getFirstColorbuffer() const;
- const FramebufferAttachment *getFirstNonNullAttachment() const;
-
- const FramebufferAttachment *getAttachment(GLenum attachment) const;
- GLenum getMultiviewLayout() const;
- GLsizei getNumViews() const;
- GLint getBaseViewIndex() const;
- const std::vector<Offset> *getViewportOffsets() const;
-
- size_t getDrawbufferStateCount() const;
- GLenum getDrawBufferState(size_t drawBuffer) const;
- const std::vector<GLenum> &getDrawBufferStates() const;
- void setDrawBuffers(size_t count, const GLenum *buffers);
- const FramebufferAttachment *getDrawBuffer(size_t drawBuffer) const;
- GLenum getDrawbufferWriteType(size_t drawBuffer) const;
- bool hasEnabledDrawBuffer() const;
-
- GLenum getReadBufferState() const;
- void setReadBuffer(GLenum buffer);
-
- size_t getNumColorBuffers() const;
- bool hasDepth() const;
- bool hasStencil() const;
-
- bool usingExtendedDrawBuffers() const;
-
- // This method calls checkStatus.
- int getSamples(const Context *context);
-
- Error getSamplePosition(size_t index, GLfloat *xy) const;
-
- GLint getDefaultWidth() const;
- GLint getDefaultHeight() const;
- GLint getDefaultSamples() const;
- bool getDefaultFixedSampleLocations() const;
- void setDefaultWidth(GLint defaultWidth);
- void setDefaultHeight(GLint defaultHeight);
- void setDefaultSamples(GLint defaultSamples);
- void setDefaultFixedSampleLocations(bool defaultFixedSampleLocations);
-
- void invalidateCompletenessCache();
-
- GLenum checkStatus(const Context *context);
-
- // TODO(jmadill): Remove this kludge.
- GLenum checkStatus(const ValidationContext *context);
- int getSamples(const ValidationContext *context);
-
- // For when we don't want to check completeness in getSamples().
- int getCachedSamples(const Context *context);
-
- // Helper for checkStatus == GL_FRAMEBUFFER_COMPLETE.
- bool complete(const Context *context);
- bool cachedComplete() const;
-
- bool hasValidDepthStencil() const;
-
- Error discard(const Context *context, size_t count, const GLenum *attachments);
- Error invalidate(const Context *context, size_t count, const GLenum *attachments);
- Error invalidateSub(const Context *context,
- size_t count,
- const GLenum *attachments,
- const gl::Rectangle &area);
-
- Error clear(const gl::Context *context, GLbitfield mask);
- Error clearBufferfv(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLfloat *values);
- Error clearBufferuiv(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLuint *values);
- Error clearBufferiv(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLint *values);
- Error clearBufferfi(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- GLfloat depth,
- GLint stencil);
-
- GLenum getImplementationColorReadFormat(const Context *context) const;
- GLenum getImplementationColorReadType(const Context *context) const;
- Error readPixels(const gl::Context *context,
- const gl::Rectangle &area,
- GLenum format,
- GLenum type,
- void *pixels);
-
- Error blit(const gl::Context *context,
- const Rectangle &sourceArea,
- const Rectangle &destArea,
- GLbitfield mask,
- GLenum filter);
-
- enum DirtyBitType : size_t
- {
- DIRTY_BIT_COLOR_ATTACHMENT_0,
- DIRTY_BIT_COLOR_ATTACHMENT_MAX =
- DIRTY_BIT_COLOR_ATTACHMENT_0 + gl::IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS,
- DIRTY_BIT_DEPTH_ATTACHMENT = DIRTY_BIT_COLOR_ATTACHMENT_MAX,
- DIRTY_BIT_STENCIL_ATTACHMENT,
- DIRTY_BIT_DRAW_BUFFERS,
- DIRTY_BIT_READ_BUFFER,
- DIRTY_BIT_DEFAULT_WIDTH,
- DIRTY_BIT_DEFAULT_HEIGHT,
- DIRTY_BIT_DEFAULT_SAMPLES,
- DIRTY_BIT_DEFAULT_FIXED_SAMPLE_LOCATIONS,
- DIRTY_BIT_UNKNOWN,
- DIRTY_BIT_MAX = DIRTY_BIT_UNKNOWN
- };
-
- typedef angle::BitSet<DIRTY_BIT_MAX> DirtyBits;
- bool hasAnyDirtyBit() const { return mDirtyBits.any(); }
-
- void syncState(const Context *context);
-
- // OnAttachmentChangedReceiver implementation
- void signal(size_t dirtyBit, InitState state) override;
-
- bool formsRenderingFeedbackLoopWith(const State &state) const;
- bool formsCopyingFeedbackLoopWith(GLuint copyTextureID,
- GLint copyTextureLevel,
- GLint copyTextureLayer) const;
-
- Error ensureDrawAttachmentsInitialized(const Context *context);
- Error ensureReadAttachmentInitialized(const Context *context, GLbitfield blitMask);
- Box getDimensions() const;
-
- bool hasTextureAttachment(const Texture *texture) const;
-
- private:
- bool detachResourceById(const Context *context, GLenum resourceType, GLuint resourceId);
- bool detachMatchingAttachment(const Context *context,
- FramebufferAttachment *attachment,
- GLenum matchType,
- GLuint matchId,
- size_t dirtyBit);
- GLenum checkStatusImpl(const Context *context);
- void setAttachment(const Context *context,
- GLenum type,
- GLenum binding,
- const ImageIndex &textureIndex,
- FramebufferAttachmentObject *resource,
- GLsizei numViews,
- GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets);
- void commitWebGL1DepthStencilIfConsistent(const Context *context,
- GLsizei numViews,
- GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets);
- void setAttachmentImpl(const Context *context,
- GLenum type,
- GLenum binding,
- const ImageIndex &textureIndex,
- FramebufferAttachmentObject *resource,
- GLsizei numViews,
- GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets);
- void updateAttachment(const Context *context,
- FramebufferAttachment *attachment,
- size_t dirtyBit,
- OnAttachmentDirtyBinding *onDirtyBinding,
- GLenum type,
- GLenum binding,
- const ImageIndex &textureIndex,
- FramebufferAttachmentObject *resource,
- GLsizei numViews,
- GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets);
-
- void markDrawAttachmentsInitialized(bool color, bool depth, bool stencil);
- void markBufferInitialized(GLenum bufferType, GLint bufferIndex);
- Error ensureBufferInitialized(const Context *context, GLenum bufferType, GLint bufferIndex);
-
- // Checks that we have a partially masked clear:
- // * some color channels are masked out
- // * some stencil values are masked out
- // * scissor test partially overlaps the framebuffer
- bool partialClearNeedsInit(const Context *context, bool color, bool depth, bool stencil);
- bool partialBufferClearNeedsInit(const Context *context, GLenum bufferType);
-
- FramebufferState mState;
- rx::FramebufferImpl *mImpl;
- GLuint mId;
-
- Optional<GLenum> mCachedStatus;
- std::vector<OnAttachmentDirtyBinding> mDirtyColorAttachmentBindings;
- OnAttachmentDirtyBinding mDirtyDepthAttachmentBinding;
- OnAttachmentDirtyBinding mDirtyStencilAttachmentBinding;
-
- DirtyBits mDirtyBits;
-
- // A cache of attached textures for quick validation of feedback loops.
- mutable Optional<std::set<const FramebufferAttachmentObject *>> mAttachedTextures;
-};
-
-} // namespace gl
-
-#endif // LIBANGLE_FRAMEBUFFER_H_
diff --git a/src/3rdparty/angle/src/libANGLE/FramebufferAttachment.cpp b/src/3rdparty/angle/src/libANGLE/FramebufferAttachment.cpp
deleted file mode 100644
index cf6bd9c264..0000000000
--- a/src/3rdparty/angle/src/libANGLE/FramebufferAttachment.cpp
+++ /dev/null
@@ -1,385 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// FramebufferAttachment.cpp: the gl::FramebufferAttachment class and its derived classes
-// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108.
-
-#include "libANGLE/FramebufferAttachment.h"
-
-#include "common/utilities.h"
-#include "libANGLE/Config.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Renderbuffer.h"
-#include "libANGLE/Surface.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/FramebufferAttachmentObjectImpl.h"
-#include "libANGLE/renderer/FramebufferImpl.h"
-
-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);
-}
-
-FramebufferAttachment::Target::Target()
- : mBinding(GL_NONE),
- mTextureIndex(ImageIndex::MakeInvalid())
-{
-}
-
-FramebufferAttachment::Target::Target(GLenum binding, const ImageIndex &imageIndex)
- : mBinding(binding),
- mTextureIndex(imageIndex)
-{
-}
-
-FramebufferAttachment::Target::Target(const Target &other)
- : mBinding(other.mBinding),
- mTextureIndex(other.mTextureIndex)
-{
-}
-
-FramebufferAttachment::Target &FramebufferAttachment::Target::operator=(const Target &other)
-{
- this->mBinding = other.mBinding;
- this->mTextureIndex = other.mTextureIndex;
- return *this;
-}
-
-////// FramebufferAttachment Implementation //////
-
-FramebufferAttachment::FramebufferAttachment()
- : mType(GL_NONE),
- mResource(nullptr),
- mNumViews(kDefaultNumViews),
- mMultiviewLayout(kDefaultMultiviewLayout),
- mBaseViewIndex(kDefaultBaseViewIndex),
- mViewportOffsets(GetDefaultViewportOffsetVector())
-{
-}
-
-FramebufferAttachment::FramebufferAttachment(const Context *context,
- GLenum type,
- GLenum binding,
- const ImageIndex &textureIndex,
- FramebufferAttachmentObject *resource)
- : mResource(nullptr)
-{
- attach(context, type, binding, textureIndex, resource, kDefaultNumViews, kDefaultBaseViewIndex,
- kDefaultMultiviewLayout, kDefaultViewportOffsets);
-}
-
-FramebufferAttachment::FramebufferAttachment(FramebufferAttachment &&other)
- : FramebufferAttachment()
-{
- *this = std::move(other);
-}
-
-FramebufferAttachment &FramebufferAttachment::operator=(FramebufferAttachment &&other)
-{
- std::swap(mType, other.mType);
- std::swap(mTarget, other.mTarget);
- std::swap(mResource, other.mResource);
- std::swap(mNumViews, other.mNumViews);
- std::swap(mMultiviewLayout, other.mMultiviewLayout);
- std::swap(mBaseViewIndex, other.mBaseViewIndex);
- std::swap(mViewportOffsets, other.mViewportOffsets);
- return *this;
-}
-
-FramebufferAttachment::~FramebufferAttachment()
-{
- ASSERT(!isAttached());
-}
-
-void FramebufferAttachment::detach(const Context *context)
-{
- mType = GL_NONE;
- if (mResource != nullptr)
- {
- mResource->onDetach(context);
- mResource = nullptr;
- }
- mNumViews = kDefaultNumViews;
- mMultiviewLayout = kDefaultMultiviewLayout;
- mBaseViewIndex = kDefaultBaseViewIndex;
- mViewportOffsets = GetDefaultViewportOffsetVector();
-
- // not technically necessary, could omit for performance
- mTarget = Target();
-}
-
-void FramebufferAttachment::attach(const Context *context,
- GLenum type,
- GLenum binding,
- const ImageIndex &textureIndex,
- FramebufferAttachmentObject *resource,
- GLsizei numViews,
- GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets)
-{
- if (resource == nullptr)
- {
- detach(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();
- }
- resource->onAttach(context);
-
- if (mResource != nullptr)
- {
- mResource->onDetach(context);
- }
-
- mResource = resource;
-}
-
-GLuint FramebufferAttachment::getRedSize() const
-{
- return getFormat().info->redBits;
-}
-
-GLuint FramebufferAttachment::getGreenSize() const
-{
- return getFormat().info->greenBits;
-}
-
-GLuint FramebufferAttachment::getBlueSize() const
-{
- return getFormat().info->blueBits;
-}
-
-GLuint FramebufferAttachment::getAlphaSize() const
-{
- return getFormat().info->alphaBits;
-}
-
-GLuint FramebufferAttachment::getDepthSize() const
-{
- return getFormat().info->depthBits;
-}
-
-GLuint FramebufferAttachment::getStencilSize() const
-{
- return getFormat().info->stencilBits;
-}
-
-GLenum FramebufferAttachment::getComponentType() const
-{
- return getFormat().info->componentType;
-}
-
-GLenum FramebufferAttachment::getColorEncoding() const
-{
- return getFormat().info->colorEncoding;
-}
-
-GLuint FramebufferAttachment::id() const
-{
- return mResource->getId();
-}
-
-const ImageIndex &FramebufferAttachment::getTextureImageIndex() const
-{
- ASSERT(type() == GL_TEXTURE);
- return mTarget.textureIndex();
-}
-
-GLenum FramebufferAttachment::cubeMapFace() const
-{
- ASSERT(mType == GL_TEXTURE);
-
- const auto &index = mTarget.textureIndex();
- return IsCubeMapTextureTarget(index.type) ? index.type : GL_NONE;
-}
-
-GLint FramebufferAttachment::mipLevel() const
-{
- ASSERT(type() == GL_TEXTURE);
- return mTarget.textureIndex().mipIndex;
-}
-
-GLint FramebufferAttachment::layer() const
-{
- ASSERT(mType == GL_TEXTURE);
-
- const auto &index = mTarget.textureIndex();
-
- if (index.type == GL_TEXTURE_2D_ARRAY || index.type == GL_TEXTURE_3D)
- {
- return index.layerIndex;
- }
- return 0;
-}
-
-GLsizei FramebufferAttachment::getNumViews() const
-{
- return mNumViews;
-}
-
-GLenum FramebufferAttachment::getMultiviewLayout() const
-{
- return mMultiviewLayout;
-}
-
-GLint FramebufferAttachment::getBaseViewIndex() const
-{
- return mBaseViewIndex;
-}
-
-const std::vector<Offset> &FramebufferAttachment::getMultiviewViewportOffsets() const
-{
- return mViewportOffsets;
-}
-
-Texture *FramebufferAttachment::getTexture() const
-{
- return rx::GetAs<Texture>(mResource);
-}
-
-Renderbuffer *FramebufferAttachment::getRenderbuffer() const
-{
- return rx::GetAs<Renderbuffer>(mResource);
-}
-
-const egl::Surface *FramebufferAttachment::getSurface() const
-{
- return rx::GetAs<egl::Surface>(mResource);
-}
-
-FramebufferAttachmentObject *FramebufferAttachment::getResource() const
-{
- return mResource;
-}
-
-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)
- {
- return false;
- }
-
- if (mType == GL_TEXTURE && getTextureImageIndex() != other.getTextureImageIndex())
- {
- return false;
- }
-
- return true;
-}
-
-bool FramebufferAttachment::operator!=(const FramebufferAttachment &other) const
-{
- return !(*this == other);
-}
-
-InitState FramebufferAttachment::initState() const
-{
- return mResource ? mResource->initState(mTarget.textureIndex()) : InitState::Initialized;
-}
-
-Error FramebufferAttachment::initializeContents(const Context *context)
-{
- ASSERT(mResource);
- ANGLE_TRY(mResource->initializeContents(context, mTarget.textureIndex()));
- setInitState(InitState::Initialized);
- return NoError();
-}
-
-void FramebufferAttachment::setInitState(InitState initState) const
-{
- ASSERT(mResource);
- mResource->setInitState(mTarget.textureIndex(), initState);
-}
-
-////// FramebufferAttachmentObject Implementation //////
-
-FramebufferAttachmentObject::FramebufferAttachmentObject()
-{
-}
-
-FramebufferAttachmentObject::~FramebufferAttachmentObject()
-{
-}
-
-Error FramebufferAttachmentObject::getAttachmentRenderTarget(
- const Context *context,
- GLenum binding,
- const ImageIndex &imageIndex,
- rx::FramebufferAttachmentRenderTarget **rtOut) const
-{
- return getAttachmentImpl()->getAttachmentRenderTarget(context, binding, imageIndex, rtOut);
-}
-
-OnAttachmentDirtyChannel *FramebufferAttachmentObject::getDirtyChannel()
-{
- return &mDirtyChannel;
-}
-
-Error FramebufferAttachmentObject::initializeContents(const Context *context,
- const ImageIndex &imageIndex)
-{
- ASSERT(context->isRobustResourceInitEnabled());
-
- // Because gl::Texture cannot support tracking individual layer dirtiness, we only handle
- // initializing entire mip levels for 2D array textures.
- if (imageIndex.type == GL_TEXTURE_2D_ARRAY && imageIndex.hasLayer())
- {
- ImageIndex fullMipIndex = imageIndex;
- fullMipIndex.layerIndex = ImageIndex::ENTIRE_LEVEL;
- return getAttachmentImpl()->initializeContents(context, fullMipIndex);
- }
- else
- {
- return getAttachmentImpl()->initializeContents(context, imageIndex);
- }
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/FramebufferAttachment.h b/src/3rdparty/angle/src/libANGLE/FramebufferAttachment.h
deleted file mode 100644
index 5c0553a1d4..0000000000
--- a/src/3rdparty/angle/src/libANGLE/FramebufferAttachment.h
+++ /dev/null
@@ -1,250 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// FramebufferAttachment.h: Defines the wrapper class gl::FramebufferAttachment, as well as the
-// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108.
-
-#ifndef LIBANGLE_FRAMEBUFFERATTACHMENT_H_
-#define LIBANGLE_FRAMEBUFFERATTACHMENT_H_
-
-#include "angle_gl.h"
-#include "common/angleutils.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/ImageIndex.h"
-#include "libANGLE/signal_utils.h"
-
-namespace egl
-{
-class Surface;
-}
-
-namespace rx
-{
-// An implementation-specific object associated with an attachment.
-
-class FramebufferAttachmentRenderTarget : angle::NonCopyable
-{
- public:
- FramebufferAttachmentRenderTarget() {}
- virtual ~FramebufferAttachmentRenderTarget() {}
-};
-
-class FramebufferAttachmentObjectImpl;
-}
-
-namespace gl
-{
-class FramebufferAttachmentObject;
-struct Format;
-class Renderbuffer;
-class Texture;
-
-enum class InitState
-{
- MayNeedInit,
- Initialized,
-};
-
-using OnAttachmentDirtyBinding = angle::ChannelBinding<size_t, InitState>;
-using OnAttachmentDirtyChannel = angle::BroadcastChannel<size_t, InitState>;
-using OnAttachmentDirtyReceiver = angle::SignalReceiver<size_t, InitState>;
-
-// FramebufferAttachment implements a GL framebuffer attachment.
-// Attachments are "light" containers, which store pointers to ref-counted GL objects.
-// We support GL texture (2D/3D/Cube/2D array) and renderbuffer object attachments.
-// Note: Our old naming scheme used the term "Renderbuffer" for both GL renderbuffers and for
-// framebuffer attachments, which confused their usage.
-
-class FramebufferAttachment final
-{
- public:
- FramebufferAttachment();
-
- FramebufferAttachment(const Context *context,
- GLenum type,
- GLenum binding,
- const ImageIndex &textureIndex,
- FramebufferAttachmentObject *resource);
-
- FramebufferAttachment(FramebufferAttachment &&other);
- FramebufferAttachment &operator=(FramebufferAttachment &&other);
-
- ~FramebufferAttachment();
-
- void detach(const Context *context);
- void attach(const Context *context,
- GLenum type,
- GLenum binding,
- const ImageIndex &textureIndex,
- FramebufferAttachmentObject *resource,
- GLsizei numViews,
- GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets);
-
- // Helper methods
- GLuint getRedSize() const;
- GLuint getGreenSize() const;
- GLuint getBlueSize() const;
- GLuint getAlphaSize() const;
- GLuint getDepthSize() const;
- GLuint getStencilSize() const;
- GLenum getComponentType() const;
- GLenum getColorEncoding() const;
-
- bool isTextureWithId(GLuint textureId) const { return mType == GL_TEXTURE && id() == textureId; }
- bool isRenderbufferWithId(GLuint renderbufferId) const { return mType == GL_RENDERBUFFER && id() == renderbufferId; }
-
- GLenum getBinding() const { return mTarget.binding(); }
- GLuint id() const;
-
- // These methods are only legal to call on Texture attachments
- const ImageIndex &getTextureImageIndex() const;
- GLenum cubeMapFace() const;
- GLint mipLevel() const;
- GLint layer() const;
- GLsizei getNumViews() const;
- GLenum getMultiviewLayout() 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
- // Renderbuffers, it will always be 1.
- Extents getSize() const;
- const Format &getFormat() const;
- GLsizei getSamples() const;
- GLenum type() const { return mType; }
- bool isAttached() const { return mType != GL_NONE; }
-
- Renderbuffer *getRenderbuffer() const;
- Texture *getTexture() const;
- const egl::Surface *getSurface() const;
- FramebufferAttachmentObject *getResource() const;
- InitState initState() const;
- Error initializeContents(const Context *context);
- void setInitState(InitState initState) const;
-
- // "T" must be static_castable from FramebufferAttachmentRenderTarget
- template <typename T>
- gl::Error getRenderTarget(const Context *context, T **rtOut) const
- {
- static_assert(std::is_base_of<rx::FramebufferAttachmentRenderTarget, T>(),
- "Invalid RenderTarget class.");
- return getRenderTargetImpl(
- context, reinterpret_cast<rx::FramebufferAttachmentRenderTarget **>(rtOut));
- }
-
- 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:
- gl::Error getRenderTargetImpl(const Context *context,
- rx::FramebufferAttachmentRenderTarget **rtOut) const;
-
- // A framebuffer attachment points to one of three types of resources: Renderbuffers,
- // Textures and egl::Surface. The "Target" struct indicates which part of the
- // object an attachment references. For the three types:
- // - a Renderbuffer has a unique renderable target, and needs no target index
- // - a Texture has targets for every image and uses an ImageIndex
- // - a Surface has targets for Color and Depth/Stencil, and uses the attachment binding
- class Target
- {
- public:
- Target();
- Target(GLenum binding, const ImageIndex &imageIndex);
- Target(const Target &other);
- Target &operator=(const Target &other);
-
- GLenum binding() const { return mBinding; }
- const ImageIndex &textureIndex() const { return mTextureIndex; }
-
- private:
- GLenum mBinding;
- ImageIndex mTextureIndex;
- };
-
- GLenum mType;
- Target mTarget;
- FramebufferAttachmentObject *mResource;
- GLsizei mNumViews;
- GLenum mMultiviewLayout;
- GLint mBaseViewIndex;
- std::vector<Offset> mViewportOffsets;
-};
-
-// A base class for objects that FBO Attachments may point to.
-class FramebufferAttachmentObject
-{
- public:
- FramebufferAttachmentObject();
- virtual ~FramebufferAttachmentObject();
-
- virtual Extents getAttachmentSize(const ImageIndex &imageIndex) const = 0;
- virtual const Format &getAttachmentFormat(GLenum binding,
- const ImageIndex &imageIndex) const = 0;
- virtual GLsizei getAttachmentSamples(const ImageIndex &imageIndex) const = 0;
-
- virtual void onAttach(const Context *context) = 0;
- virtual void onDetach(const Context *context) = 0;
- virtual GLuint getId() const = 0;
-
- // These are used for robust resource initialization.
- virtual InitState initState(const ImageIndex &imageIndex) const = 0;
- virtual void setInitState(const ImageIndex &imageIndex, InitState initState) = 0;
-
- Error getAttachmentRenderTarget(const Context *context,
- GLenum binding,
- const ImageIndex &imageIndex,
- rx::FramebufferAttachmentRenderTarget **rtOut) const;
-
- Error initializeContents(const Context *context, const ImageIndex &imageIndex);
-
- OnAttachmentDirtyChannel *getDirtyChannel();
-
- protected:
- virtual rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const = 0;
-
- OnAttachmentDirtyChannel mDirtyChannel;
-};
-
-inline Extents FramebufferAttachment::getSize() const
-{
- ASSERT(mResource);
- return mResource->getAttachmentSize(mTarget.textureIndex());
-}
-
-inline const Format &FramebufferAttachment::getFormat() const
-{
- ASSERT(mResource);
- return mResource->getAttachmentFormat(mTarget.binding(), mTarget.textureIndex());
-}
-
-inline GLsizei FramebufferAttachment::getSamples() const
-{
- ASSERT(mResource);
- return mResource->getAttachmentSamples(mTarget.textureIndex());
-}
-
-inline gl::Error FramebufferAttachment::getRenderTargetImpl(
- const Context *context,
- rx::FramebufferAttachmentRenderTarget **rtOut) const
-{
- ASSERT(mResource);
- return mResource->getAttachmentRenderTarget(context, mTarget.binding(), mTarget.textureIndex(),
- rtOut);
-}
-
-} // namespace gl
-
-#endif // LIBANGLE_FRAMEBUFFERATTACHMENT_H_
diff --git a/src/3rdparty/angle/src/libANGLE/HandleAllocator.cpp b/src/3rdparty/angle/src/libANGLE/HandleAllocator.cpp
deleted file mode 100644
index c3c184258f..0000000000
--- a/src/3rdparty/angle/src/libANGLE/HandleAllocator.cpp
+++ /dev/null
@@ -1,142 +0,0 @@
-//
-// Copyright (c) 2002-2011 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// HandleAllocator.cpp: Implements the gl::HandleAllocator class, which is used
-// to allocate GL handles.
-
-#include "libANGLE/HandleAllocator.h"
-
-#include <algorithm>
-
-#include "common/debug.h"
-
-namespace gl
-{
-
-struct HandleAllocator::HandleRangeComparator
-{
- bool operator()(const HandleRange &range, GLuint handle) const
- {
- return (range.end < handle);
- }
-};
-
-HandleAllocator::HandleAllocator() : mBaseValue(1), mNextValue(1)
-{
- mUnallocatedList.push_back(HandleRange(1, std::numeric_limits<GLuint>::max()));
-}
-
-HandleAllocator::HandleAllocator(GLuint maximumHandleValue) : mBaseValue(1), mNextValue(1)
-{
- mUnallocatedList.push_back(HandleRange(1, maximumHandleValue));
-}
-
-HandleAllocator::~HandleAllocator()
-{
-}
-
-void HandleAllocator::setBaseHandle(GLuint value)
-{
- ASSERT(mBaseValue == mNextValue);
- mBaseValue = value;
- mNextValue = value;
-}
-
-GLuint HandleAllocator::allocate()
-{
- ASSERT(!mUnallocatedList.empty() || !mReleasedList.empty());
-
- // Allocate from released list, logarithmic time for pop_heap.
- if (!mReleasedList.empty())
- {
- std::pop_heap(mReleasedList.begin(), mReleasedList.end());
- GLuint reusedHandle = mReleasedList.back();
- mReleasedList.pop_back();
- return reusedHandle;
- }
-
- // Allocate from unallocated list, constant time.
- auto listIt = mUnallocatedList.begin();
-
- GLuint freeListHandle = listIt->begin;
- ASSERT(freeListHandle > 0);
-
- if (listIt->begin == listIt->end)
- {
- mUnallocatedList.erase(listIt);
- }
- else
- {
- listIt->begin++;
- }
-
- return freeListHandle;
-}
-
-void HandleAllocator::release(GLuint handle)
-{
- // Add to released list, logarithmic time for push_heap.
- mReleasedList.push_back(handle);
- std::push_heap(mReleasedList.begin(), mReleasedList.end());
-}
-
-void HandleAllocator::reserve(GLuint handle)
-{
- // Clear from released list -- might be a slow operation.
- if (!mReleasedList.empty())
- {
- auto releasedIt = std::find(mReleasedList.begin(), mReleasedList.end(), handle);
- if (releasedIt != mReleasedList.end())
- {
- mReleasedList.erase(releasedIt);
- return;
- }
- }
-
- // Not in released list, reserve in the unallocated list.
- auto boundIt = std::lower_bound(mUnallocatedList.begin(), mUnallocatedList.end(), handle, HandleRangeComparator());
-
- ASSERT(boundIt != mUnallocatedList.end());
-
- GLuint begin = boundIt->begin;
- GLuint end = boundIt->end;
-
- if (handle == begin || handle == end)
- {
- if (begin == end)
- {
- mUnallocatedList.erase(boundIt);
- }
- else if (handle == begin)
- {
- boundIt->begin++;
- }
- else
- {
- ASSERT(handle == end);
- boundIt->end--;
- }
- return;
- }
-
- ASSERT(begin < handle && handle < end);
-
- // need to split the range
- auto placementIt = mUnallocatedList.erase(boundIt);
- placementIt = mUnallocatedList.insert(placementIt, HandleRange(handle + 1, end));
- mUnallocatedList.insert(placementIt, HandleRange(begin, handle - 1));
-}
-
-void HandleAllocator::reset()
-{
- mUnallocatedList.clear();
- mUnallocatedList.push_back(HandleRange(1, std::numeric_limits<GLuint>::max()));
- mReleasedList.clear();
- mBaseValue = 1;
- mNextValue = 1;
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/HandleAllocator.h b/src/3rdparty/angle/src/libANGLE/HandleAllocator.h
deleted file mode 100644
index cd21d687f4..0000000000
--- a/src/3rdparty/angle/src/libANGLE/HandleAllocator.h
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-// Copyright (c) 2002-2011 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// HandleAllocator.h: Defines the gl::HandleAllocator class, which is used to
-// allocate GL handles.
-
-#ifndef LIBANGLE_HANDLEALLOCATOR_H_
-#define LIBANGLE_HANDLEALLOCATOR_H_
-
-#include "common/angleutils.h"
-
-#include "angle_gl.h"
-
-namespace gl
-{
-
-class HandleAllocator final : angle::NonCopyable
-{
- public:
- // Maximum handle = MAX_UINT-1
- HandleAllocator();
- // Specify maximum handle value. Used for testing.
- HandleAllocator(GLuint maximumHandleValue);
-
- ~HandleAllocator();
-
- void setBaseHandle(GLuint value);
-
- GLuint allocate();
- void release(GLuint handle);
- void reserve(GLuint handle);
- void reset();
-
- private:
- GLuint mBaseValue;
- GLuint mNextValue;
- typedef std::vector<GLuint> HandleList;
- HandleList mFreeValues;
-
- // Represents an inclusive range [begin, end]
- struct HandleRange
- {
- HandleRange(GLuint beginIn, GLuint endIn) : begin(beginIn), end(endIn) {}
-
- GLuint begin;
- GLuint end;
- };
-
- struct HandleRangeComparator;
-
- // The freelist consists of never-allocated handles, stored
- // as ranges, and handles that were previously allocated and
- // released, stored in a heap.
- std::vector<HandleRange> mUnallocatedList;
- std::vector<GLuint> mReleasedList;
-};
-
-} // namespace gl
-
-#endif // LIBANGLE_HANDLEALLOCATOR_H_
diff --git a/src/3rdparty/angle/src/libANGLE/HandleRangeAllocator.cpp b/src/3rdparty/angle/src/libANGLE/HandleRangeAllocator.cpp
deleted file mode 100644
index 2a97ce939f..0000000000
--- a/src/3rdparty/angle/src/libANGLE/HandleRangeAllocator.cpp
+++ /dev/null
@@ -1,229 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// HandleRangeAllocator.cpp : Implementation for HandleRangeAllocator.h
-
-#include "libANGLE/HandleRangeAllocator.h"
-
-#include <algorithm>
-#include <limits>
-#include <utility>
-
-#include "common/angleutils.h"
-#include "common/debug.h"
-
-namespace gl
-{
-
-const GLuint HandleRangeAllocator::kInvalidHandle = 0;
-
-HandleRangeAllocator::HandleRangeAllocator()
-{
- // Simplify the code by making sure that lower_bound(id) never
- // returns the beginning of the map, if id is valid (eg != kInvalidHandle).
- mUsed.insert(std::make_pair(0u, 0u));
-}
-
-HandleRangeAllocator::~HandleRangeAllocator()
-{
-}
-
-GLuint HandleRangeAllocator::allocate()
-{
- return allocateRange(1u);
-}
-
-GLuint HandleRangeAllocator::allocateAtOrAbove(GLuint wanted)
-{
- if (wanted == 0u || wanted == 1u)
- return allocateRange(1u);
-
- auto current = mUsed.lower_bound(wanted);
- auto next = current;
- if (current == mUsed.end() || current->first > wanted)
- {
- current--;
- }
- else
- {
- next++;
- }
-
- GLuint firstId = current->first;
- GLuint lastId = current->second;
- ASSERT(wanted >= firstId);
-
- if (wanted - 1u <= lastId)
- {
- // Append to current range.
- lastId++;
- if (lastId == 0)
- {
- // The increment overflowed.
- return allocateRange(1u);
- }
-
- current->second = lastId;
-
- if (next != mUsed.end() && next->first - 1u == lastId)
- {
- // Merge with next range.
- current->second = next->second;
- mUsed.erase(next);
- }
- return lastId;
- }
- else if (next != mUsed.end() && next->first - 1u == wanted)
- {
- // Prepend to next range.
- GLuint lastExisting = next->second;
- mUsed.erase(next);
- mUsed.insert(std::make_pair(wanted, lastExisting));
- return wanted;
- }
- mUsed.insert(std::make_pair(wanted, wanted));
- return wanted;
-}
-
-GLuint HandleRangeAllocator::allocateRange(GLuint range)
-{
- ASSERT(range != 0);
-
- auto current = mUsed.begin();
- auto next = current;
-
- while (++next != mUsed.end())
- {
- if (next->first - current->second > range)
- break;
- current = next;
- }
- const GLuint firstId = current->second + 1u;
- const GLuint lastId = firstId + range - 1u;
-
- // deal with wraparound
- if (firstId == 0u || lastId < firstId)
- return kInvalidHandle;
-
- current->second = lastId;
-
- if (next != mUsed.end() && next->first - 1u == lastId)
- {
- // merge with next range
- current->second = next->second;
- mUsed.erase(next);
- }
- return firstId;
-}
-
-bool HandleRangeAllocator::markAsUsed(GLuint handle)
-{
- ASSERT(handle);
- auto current = mUsed.lower_bound(handle);
- if (current != mUsed.end() && current->first == handle)
- return false;
-
- auto next = current;
- --current;
-
- if (current->second >= handle)
- return false;
-
- ASSERT(current->first < handle && current->second < handle);
-
- if (current->second + 1u == handle)
- {
- // Append to current range.
- current->second = handle;
- if (next != mUsed.end() && next->first - 1u == handle)
- {
- // Merge with next range.
- current->second = next->second;
- mUsed.erase(next);
- }
- return true;
- }
- else if (next != mUsed.end() && next->first - 1u == handle)
- {
- // Prepend to next range.
- GLuint lastExisting = next->second;
- mUsed.erase(next);
- mUsed.insert(std::make_pair(handle, lastExisting));
- return true;
- }
-
- mUsed.insert(std::make_pair(handle, handle));
- return true;
-}
-
-void HandleRangeAllocator::release(GLuint handle)
-{
- releaseRange(handle, 1u);
-}
-
-void HandleRangeAllocator::releaseRange(GLuint first, GLuint range)
-{
- if (range == 0u || (first == 0u && range == 1u))
- return;
-
- if (first == 0u)
- {
- first++;
- range--;
- }
-
- GLuint last = first + range - 1u;
- if (last < first)
- last = std::numeric_limits<GLuint>::max();
-
- while (true)
- {
- auto current = mUsed.lower_bound(last);
- if (current == mUsed.end() || current->first > last)
- --current;
-
- if (current->second < first)
- return;
-
- if (current->first >= first)
- {
- const GLuint lastExisting = current->second;
- mUsed.erase(current);
- if (last < lastExisting)
- {
- mUsed.insert(std::make_pair(last + 1u, lastExisting));
- }
- }
- else if (current->second <= last)
- {
- current->second = first - 1u;
- }
- else
- {
- ASSERT(current->first < first && current->second > last);
- const GLuint lastExisting = current->second;
- current->second = first - 1u;
- mUsed.insert(std::make_pair(last + 1u, lastExisting));
- }
- }
-}
-
-bool HandleRangeAllocator::isUsed(GLuint handle) const
-{
- if (handle == kInvalidHandle)
- return false;
-
- auto current = mUsed.lower_bound(handle);
- if (current != mUsed.end())
- {
- if (current->first == handle)
- return true;
- }
- --current;
- return current->second >= handle;
-}
-
-} // namespace gl \ No newline at end of file
diff --git a/src/3rdparty/angle/src/libANGLE/HandleRangeAllocator.h b/src/3rdparty/angle/src/libANGLE/HandleRangeAllocator.h
deleted file mode 100644
index 4d4b6f4f69..0000000000
--- a/src/3rdparty/angle/src/libANGLE/HandleRangeAllocator.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-// Copyright (c) 2002-2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// HandleRangeAllocator.h: Defines the gl::HandleRangeAllocator class, which is used to
-// allocate contiguous ranges of GL path handles.
-
-#ifndef LIBANGLE_HANDLERANGEALLOCATOR_H_
-#define LIBANGLE_HANDLERANGEALLOCATOR_H_
-
-#include <map>
-
-#include "angle_gl.h"
-#include "common/angleutils.h"
-
-namespace gl
-{
-
-// Allocates contiguous ranges of path object handles.
-class HandleRangeAllocator final : angle::NonCopyable
-{
- public:
- static const GLuint kInvalidHandle;
-
- HandleRangeAllocator();
- ~HandleRangeAllocator();
-
- // Allocates a new path handle.
- GLuint allocate();
-
- // Allocates a handle starting at or above the value of |wanted|.
- // Note: may wrap if it starts near limit.
- GLuint allocateAtOrAbove(GLuint wanted);
-
- // Allocates |range| amount of contiguous paths.
- // Returns the first id to |first_id| or |kInvalidHandle| if
- // allocation failed.
- GLuint allocateRange(GLuint range);
-
- // Marks an id as used. Returns false if handle was already used.
- bool markAsUsed(GLuint handle);
-
- // Release handle.
- void release(GLuint handle);
-
- // Release a |range| amount of contiguous handles, starting from |first|
- void releaseRange(GLuint first, GLuint range);
-
- // Checks whether or not a resource ID is in use.
- bool isUsed(GLuint handle) const;
-
- private:
- std::map<GLuint, GLuint> mUsed;
-};
-
-} // namespace gl
-
-#endif // LIBANGLE_HANDLERANGEALLOCATOR_H_ \ No newline at end of file
diff --git a/src/3rdparty/angle/src/libANGLE/Image.cpp b/src/3rdparty/angle/src/libANGLE/Image.cpp
deleted file mode 100644
index 04c757c2c4..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Image.cpp
+++ /dev/null
@@ -1,245 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Image.cpp: Implements the egl::Image class representing the EGLimage object.
-
-#include "libANGLE/Image.h"
-
-#include "common/debug.h"
-#include "common/utilities.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/Renderbuffer.h"
-#include "libANGLE/renderer/EGLImplFactory.h"
-#include "libANGLE/renderer/ImageImpl.h"
-
-namespace egl
-{
-
-namespace
-{
-gl::ImageIndex GetImageIndex(EGLenum eglTarget, const egl::AttributeMap &attribs)
-{
- if (eglTarget == EGL_GL_RENDERBUFFER)
- {
- return gl::ImageIndex::MakeInvalid();
- }
-
- GLenum target = egl_gl::EGLImageTargetToGLTextureTarget(eglTarget);
- GLint mip = static_cast<GLint>(attribs.get(EGL_GL_TEXTURE_LEVEL_KHR, 0));
- GLint layer = static_cast<GLint>(attribs.get(EGL_GL_TEXTURE_ZOFFSET_KHR, 0));
-
- if (target == GL_TEXTURE_3D)
- {
- return gl::ImageIndex::Make3D(mip, layer);
- }
- else
- {
- ASSERT(layer == 0);
- return gl::ImageIndex::MakeGeneric(target, mip);
- }
-}
-} // anonymous namespace
-
-ImageSibling::ImageSibling(GLuint id)
- : RefCountObject(id), FramebufferAttachmentObject(), mSourcesOf(), mTargetOf()
-{
-}
-
-ImageSibling::~ImageSibling()
-{
- // EGL images should hold a ref to their targets and siblings, a Texture should not be deletable
- // while it is attached to an EGL image.
- // Child class should orphan images before destruction.
- ASSERT(mSourcesOf.empty());
- ASSERT(mTargetOf.get() == nullptr);
-}
-
-void ImageSibling::setTargetImage(const gl::Context *context, egl::Image *imageTarget)
-{
- ASSERT(imageTarget != nullptr);
- mTargetOf.set(context, imageTarget);
- imageTarget->addTargetSibling(this);
-}
-
-gl::Error ImageSibling::orphanImages(const gl::Context *context)
-{
- if (mTargetOf.get() != nullptr)
- {
- // Can't be a target and have sources.
- ASSERT(mSourcesOf.empty());
-
- ANGLE_TRY(mTargetOf->orphanSibling(context, this));
- mTargetOf.set(context, nullptr);
- }
- else
- {
- for (egl::Image *sourceImage : mSourcesOf)
- {
- ANGLE_TRY(sourceImage->orphanSibling(context, this));
- }
- mSourcesOf.clear();
- }
-
- return gl::NoError();
-}
-
-void ImageSibling::addImageSource(egl::Image *imageSource)
-{
- ASSERT(imageSource != nullptr);
- mSourcesOf.insert(imageSource);
-}
-
-void ImageSibling::removeImageSource(egl::Image *imageSource)
-{
- ASSERT(mSourcesOf.find(imageSource) != mSourcesOf.end());
- mSourcesOf.erase(imageSource);
-}
-
-bool ImageSibling::isEGLImageTarget() const
-{
- return (mTargetOf.get() != nullptr);
-}
-
-gl::InitState ImageSibling::sourceEGLImageInitState() const
-{
- ASSERT(isEGLImageTarget());
- return mTargetOf->sourceInitState();
-}
-
-void ImageSibling::setSourceEGLImageInitState(gl::InitState initState) const
-{
- ASSERT(isEGLImageTarget());
- mTargetOf->setInitState(initState);
-}
-
-ImageState::ImageState(EGLenum target, ImageSibling *buffer, const AttributeMap &attribs)
- : imageIndex(GetImageIndex(target, attribs)), source(buffer), targets()
-{
-}
-
-ImageState::~ImageState()
-{
-}
-
-Image::Image(rx::EGLImplFactory *factory,
- EGLenum target,
- ImageSibling *buffer,
- const AttributeMap &attribs)
- : RefCountObject(0),
- mState(target, buffer, attribs),
- mImplementation(factory->createImage(mState, target, attribs)),
- mOrphanedAndNeedsInit(false)
-{
- ASSERT(mImplementation != nullptr);
- ASSERT(buffer != nullptr);
-
- mState.source->addImageSource(this);
-}
-
-gl::Error Image::onDestroy(const gl::Context *context)
-{
- // All targets should hold a ref to the egl image and it should not be deleted until there are
- // no siblings left.
- ASSERT(mState.targets.empty());
-
- // Tell the source that it is no longer used by this image
- if (mState.source.get() != nullptr)
- {
- mState.source->removeImageSource(this);
- mState.source.set(context, nullptr);
- }
- return gl::NoError();
-}
-
-Image::~Image()
-{
- SafeDelete(mImplementation);
-}
-
-void Image::addTargetSibling(ImageSibling *sibling)
-{
- mState.targets.insert(sibling);
-}
-
-gl::Error Image::orphanSibling(const gl::Context *context, ImageSibling *sibling)
-{
- // notify impl
- ANGLE_TRY(mImplementation->orphan(context, sibling));
-
- if (mState.source.get() == sibling)
- {
- // If the sibling is the source, it cannot be a target.
- ASSERT(mState.targets.find(sibling) == mState.targets.end());
- mState.source.set(context, nullptr);
- mOrphanedAndNeedsInit =
- (sibling->initState(mState.imageIndex) == gl::InitState::MayNeedInit);
- }
- else
- {
- mState.targets.erase(sibling);
- }
-
- return gl::NoError();
-}
-
-const gl::Format &Image::getFormat() const
-{
- return mState.source->getAttachmentFormat(GL_NONE, mState.imageIndex);
-}
-
-size_t Image::getWidth() const
-{
- return mState.source->getAttachmentSize(mState.imageIndex).width;
-}
-
-size_t Image::getHeight() const
-{
- return mState.source->getAttachmentSize(mState.imageIndex).height;
-}
-
-size_t Image::getSamples() const
-{
- return mState.source->getAttachmentSamples(mState.imageIndex);
-}
-
-rx::ImageImpl *Image::getImplementation() const
-{
- return mImplementation;
-}
-
-Error Image::initialize()
-{
- return mImplementation->initialize();
-}
-
-bool Image::orphaned() const
-{
- return (mState.source.get() == nullptr);
-}
-
-gl::InitState Image::sourceInitState() const
-{
- if (orphaned())
- {
- return mOrphanedAndNeedsInit ? gl::InitState::MayNeedInit : gl::InitState::Initialized;
- }
-
- return mState.source->initState(mState.imageIndex);
-}
-
-void Image::setInitState(gl::InitState initState)
-{
- if (orphaned())
- {
- mOrphanedAndNeedsInit = false;
- }
-
- return mState.source->setInitState(mState.imageIndex, initState);
-}
-
-} // namespace egl
diff --git a/src/3rdparty/angle/src/libANGLE/Image.h b/src/3rdparty/angle/src/libANGLE/Image.h
deleted file mode 100644
index d2f1b875c6..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Image.h
+++ /dev/null
@@ -1,115 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Image.h: Defines the egl::Image class representing the EGLimage object.
-
-#ifndef LIBANGLE_IMAGE_H_
-#define LIBANGLE_IMAGE_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/AttributeMap.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/RefCountObject.h"
-#include "libANGLE/formatutils.h"
-
-#include <set>
-
-namespace rx
-{
-class EGLImplFactory;
-class ImageImpl;
-}
-
-namespace egl
-{
-class Image;
-
-// Only currently Renderbuffers and Textures can be bound with images. This makes the relationship
-// explicit, and also ensures that an image sibling can determine if it's been initialized or not,
-// which is important for the robust resource init extension with Textures and EGLImages.
-class ImageSibling : public gl::RefCountObject, public gl::FramebufferAttachmentObject
-{
- public:
- ImageSibling(GLuint id);
- ~ImageSibling() override;
-
- bool isEGLImageTarget() const;
- gl::InitState sourceEGLImageInitState() const;
- void setSourceEGLImageInitState(gl::InitState initState) const;
-
- protected:
- // Set the image target of this sibling
- void setTargetImage(const gl::Context *context, egl::Image *imageTarget);
-
- // Orphan all EGL image sources and targets
- gl::Error orphanImages(const gl::Context *context);
-
- private:
- friend class Image;
-
- // Called from Image only to add a new source image
- void addImageSource(egl::Image *imageSource);
-
- // Called from Image only to remove a source image when the Image is being deleted
- void removeImageSource(egl::Image *imageSource);
-
- std::set<Image *> mSourcesOf;
- gl::BindingPointer<Image> mTargetOf;
-};
-
-struct ImageState : private angle::NonCopyable
-{
- ImageState(EGLenum target, ImageSibling *buffer, const AttributeMap &attribs);
- ~ImageState();
-
- gl::ImageIndex imageIndex;
- gl::BindingPointer<ImageSibling> source;
- std::set<ImageSibling *> targets;
-};
-
-class Image final : public gl::RefCountObject
-{
- public:
- Image(rx::EGLImplFactory *factory,
- EGLenum target,
- ImageSibling *buffer,
- const AttributeMap &attribs);
-
- gl::Error onDestroy(const gl::Context *context) override;
- ~Image() override;
-
- const gl::Format &getFormat() const;
- size_t getWidth() const;
- size_t getHeight() const;
- size_t getSamples() const;
-
- Error initialize();
-
- rx::ImageImpl *getImplementation() const;
-
- bool orphaned() const;
- gl::InitState sourceInitState() const;
- void setInitState(gl::InitState initState);
-
- private:
- friend class ImageSibling;
-
- // Called from ImageSibling only notify the image that a new target sibling exists for state
- // tracking.
- void addTargetSibling(ImageSibling *sibling);
-
- // Called from ImageSibling only to notify the image that a sibling (source or target) has
- // been respecified and state tracking should be updated.
- gl::Error orphanSibling(const gl::Context *context, ImageSibling *sibling);
-
- ImageState mState;
- rx::ImageImpl *mImplementation;
- bool mOrphanedAndNeedsInit;
-};
-} // namespace egl
-
-#endif // LIBANGLE_IMAGE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/ImageIndex.cpp b/src/3rdparty/angle/src/libANGLE/ImageIndex.cpp
deleted file mode 100644
index 6f99f8ab54..0000000000
--- a/src/3rdparty/angle/src/libANGLE/ImageIndex.cpp
+++ /dev/null
@@ -1,249 +0,0 @@
-#include "ImageIndex.h"
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ImageIndex.cpp: Implementation for ImageIndex methods.
-
-#include "libANGLE/ImageIndex.h"
-#include "libANGLE/Constants.h"
-#include "common/utilities.h"
-
-namespace gl
-{
-
-ImageIndex::ImageIndex(const ImageIndex &other)
- : type(other.type),
- mipIndex(other.mipIndex),
- layerIndex(other.layerIndex),
- numLayers(other.numLayers)
-{}
-
-ImageIndex &ImageIndex::operator=(const ImageIndex &other)
-{
- type = other.type;
- mipIndex = other.mipIndex;
- layerIndex = other.layerIndex;
- numLayers = other.numLayers;
- return *this;
-}
-
-bool ImageIndex::is3D() const
-{
- return type == GL_TEXTURE_3D || type == GL_TEXTURE_2D_ARRAY;
-}
-
-ImageIndex ImageIndex::Make2D(GLint mipIndex)
-{
- return ImageIndex(GL_TEXTURE_2D, mipIndex, ENTIRE_LEVEL, 1);
-}
-
-ImageIndex ImageIndex::MakeRectangle(GLint mipIndex)
-{
- return ImageIndex(GL_TEXTURE_RECTANGLE_ANGLE, mipIndex, ENTIRE_LEVEL, 1);
-}
-
-ImageIndex ImageIndex::MakeCube(GLenum target, GLint mipIndex)
-{
- ASSERT(gl::IsCubeMapTextureTarget(target));
- return ImageIndex(target, mipIndex,
- static_cast<GLint>(CubeMapTextureTargetToLayerIndex(target)), 1);
-}
-
-ImageIndex ImageIndex::Make2DArray(GLint mipIndex, GLint layerIndex)
-{
- return ImageIndex(GL_TEXTURE_2D_ARRAY, mipIndex, layerIndex, 1);
-}
-
-ImageIndex ImageIndex::Make2DArrayRange(GLint mipIndex, GLint layerIndex, GLint numLayers)
-{
- return ImageIndex(GL_TEXTURE_2D_ARRAY, mipIndex, layerIndex, numLayers);
-}
-
-ImageIndex ImageIndex::Make3D(GLint mipIndex, GLint layerIndex)
-{
- return ImageIndex(GL_TEXTURE_3D, mipIndex, layerIndex, 1);
-}
-
-ImageIndex ImageIndex::MakeGeneric(GLenum target, GLint mipIndex)
-{
- GLint layerIndex = IsCubeMapTextureTarget(target)
- ? static_cast<GLint>(CubeMapTextureTargetToLayerIndex(target))
- : ENTIRE_LEVEL;
- return ImageIndex(target, mipIndex, layerIndex, 1);
-}
-
-ImageIndex ImageIndex::Make2DMultisample()
-{
- return ImageIndex(GL_TEXTURE_2D_MULTISAMPLE, 0, ENTIRE_LEVEL, 1);
-}
-
-ImageIndex ImageIndex::MakeInvalid()
-{
- return ImageIndex(GL_NONE, -1, -1, -1);
-}
-
-bool ImageIndex::operator<(const ImageIndex &other) const
-{
- if (type != other.type)
- {
- return type < other.type;
- }
- else if (mipIndex != other.mipIndex)
- {
- return mipIndex < other.mipIndex;
- }
- else if (layerIndex != other.layerIndex)
- {
- return layerIndex < other.layerIndex;
- }
- else
- {
- return numLayers < other.numLayers;
- }
-}
-
-bool ImageIndex::operator==(const ImageIndex &other) const
-{
- return (type == other.type) && (mipIndex == other.mipIndex) &&
- (layerIndex == other.layerIndex) && (numLayers == other.numLayers);
-}
-
-bool ImageIndex::operator!=(const ImageIndex &other) const
-{
- return !(*this == other);
-}
-
-ImageIndex::ImageIndex(GLenum typeIn, GLint mipIndexIn, GLint layerIndexIn, GLint numLayersIn)
- : type(typeIn), mipIndex(mipIndexIn), layerIndex(layerIndexIn), numLayers(numLayersIn)
-{}
-
-ImageIndexIterator::ImageIndexIterator(const ImageIndexIterator &other) = default;
-
-ImageIndexIterator ImageIndexIterator::Make2D(GLint minMip, GLint maxMip)
-{
- return ImageIndexIterator(GL_TEXTURE_2D, Range<GLint>(minMip, maxMip),
- Range<GLint>(ImageIndex::ENTIRE_LEVEL, ImageIndex::ENTIRE_LEVEL),
- nullptr);
-}
-
-ImageIndexIterator ImageIndexIterator::MakeRectangle(GLint minMip, GLint maxMip)
-{
- return ImageIndexIterator(GL_TEXTURE_RECTANGLE_ANGLE, Range<GLint>(minMip, maxMip),
- Range<GLint>(ImageIndex::ENTIRE_LEVEL, ImageIndex::ENTIRE_LEVEL),
- nullptr);
-}
-
-ImageIndexIterator ImageIndexIterator::MakeCube(GLint minMip, GLint maxMip)
-{
- return ImageIndexIterator(GL_TEXTURE_CUBE_MAP, Range<GLint>(minMip, maxMip), Range<GLint>(0, 6),
- nullptr);
-}
-
-ImageIndexIterator ImageIndexIterator::Make3D(GLint minMip, GLint maxMip,
- GLint minLayer, GLint maxLayer)
-{
- return ImageIndexIterator(GL_TEXTURE_3D, Range<GLint>(minMip, maxMip),
- Range<GLint>(minLayer, maxLayer), nullptr);
-}
-
-ImageIndexIterator ImageIndexIterator::Make2DArray(GLint minMip, GLint maxMip,
- const GLsizei *layerCounts)
-{
- return ImageIndexIterator(GL_TEXTURE_2D_ARRAY, Range<GLint>(minMip, maxMip),
- Range<GLint>(0, IMPLEMENTATION_MAX_2D_ARRAY_TEXTURE_LAYERS), layerCounts);
-}
-
-ImageIndexIterator ImageIndexIterator::Make2DMultisample()
-{
- return ImageIndexIterator(GL_TEXTURE_2D_MULTISAMPLE, Range<GLint>(0, 0),
- Range<GLint>(ImageIndex::ENTIRE_LEVEL, ImageIndex::ENTIRE_LEVEL),
- nullptr);
-}
-
-ImageIndexIterator::ImageIndexIterator(GLenum type,
- const Range<GLint> &mipRange,
- const Range<GLint> &layerRange,
- const GLsizei *layerCounts)
- : mType(type),
- mMipRange(mipRange),
- mLayerRange(layerRange),
- mLayerCounts(layerCounts),
- mCurrentMip(mipRange.low()),
- mCurrentLayer(layerRange.low())
-{}
-
-GLint ImageIndexIterator::maxLayer() const
-{
- if (mLayerCounts)
- {
- ASSERT(mCurrentMip >= 0);
- return (mCurrentMip < mMipRange.high()) ? mLayerCounts[mCurrentMip] : 0;
- }
- return mLayerRange.high();
-}
-
-ImageIndex ImageIndexIterator::next()
-{
- ASSERT(hasNext());
-
- ImageIndex value = current();
-
- // Iterate layers in the inner loop for now. We can add switchable
- // layer or mip iteration if we need it.
-
- if (mCurrentLayer != ImageIndex::ENTIRE_LEVEL)
- {
- if (mCurrentLayer < maxLayer() - 1)
- {
- mCurrentLayer++;
- }
- else if (mCurrentMip < mMipRange.high() - 1)
- {
- mCurrentMip++;
- mCurrentLayer = mLayerRange.low();
- }
- else
- {
- done();
- }
- }
- else if (mCurrentMip < mMipRange.high() - 1)
- {
- mCurrentMip++;
- mCurrentLayer = mLayerRange.low();
- }
- else
- {
- done();
- }
-
- return value;
-}
-
-ImageIndex ImageIndexIterator::current() const
-{
- ImageIndex value(mType, mCurrentMip, mCurrentLayer, 1);
-
- if (mType == GL_TEXTURE_CUBE_MAP)
- {
- value.type = LayerIndexToCubeMapTextureTarget(mCurrentLayer);
- }
-
- return value;
-}
-
-bool ImageIndexIterator::hasNext() const
-{
- return (mCurrentMip < mMipRange.high() || mCurrentLayer < maxLayer());
-}
-
-void ImageIndexIterator::done()
-{
- mCurrentMip = mMipRange.high();
- mCurrentLayer = maxLayer();
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/ImageIndex.h b/src/3rdparty/angle/src/libANGLE/ImageIndex.h
deleted file mode 100644
index 8e1b010325..0000000000
--- a/src/3rdparty/angle/src/libANGLE/ImageIndex.h
+++ /dev/null
@@ -1,91 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ImageIndex.h: A helper struct for indexing into an Image array
-
-#ifndef LIBANGLE_IMAGE_INDEX_H_
-#define LIBANGLE_IMAGE_INDEX_H_
-
-#include "common/mathutil.h"
-
-#include "angle_gl.h"
-
-namespace gl
-{
-
-class ImageIndexIterator;
-
-struct ImageIndex
-{
- GLenum type;
- GLint mipIndex;
- GLint layerIndex;
- GLint numLayers;
-
- ImageIndex(const ImageIndex &other);
- ImageIndex &operator=(const ImageIndex &other);
-
- bool hasLayer() const { return layerIndex != ENTIRE_LEVEL; }
- bool is3D() const;
-
- static ImageIndex Make2D(GLint mipIndex);
- static ImageIndex MakeRectangle(GLint mipIndex);
- static ImageIndex MakeCube(GLenum target, GLint mipIndex);
- static ImageIndex Make2DArray(GLint mipIndex, GLint layerIndex);
- static ImageIndex Make2DArrayRange(GLint mipIndex, GLint layerIndex, GLint numLayers);
- static ImageIndex Make3D(GLint mipIndex, GLint layerIndex = ENTIRE_LEVEL);
- static ImageIndex MakeGeneric(GLenum target, GLint mipIndex);
- static ImageIndex Make2DMultisample();
-
- static ImageIndex MakeInvalid();
-
- static const GLint ENTIRE_LEVEL = static_cast<GLint>(-1);
-
- bool operator<(const ImageIndex &other) const;
- bool operator==(const ImageIndex &other) const;
- bool operator!=(const ImageIndex &other) const;
-
- private:
- friend class ImageIndexIterator;
-
- ImageIndex(GLenum typeIn, GLint mipIndexIn, GLint layerIndexIn, GLint numLayersIn);
-};
-
-class ImageIndexIterator
-{
- public:
- ImageIndexIterator(const ImageIndexIterator &other);
-
- static ImageIndexIterator Make2D(GLint minMip, GLint maxMip);
- static ImageIndexIterator MakeRectangle(GLint minMip, GLint maxMip);
- static ImageIndexIterator MakeCube(GLint minMip, GLint maxMip);
- static ImageIndexIterator Make3D(GLint minMip, GLint maxMip, GLint minLayer, GLint maxLayer);
- static ImageIndexIterator Make2DArray(GLint minMip, GLint maxMip, const GLsizei *layerCounts);
- static ImageIndexIterator Make2DMultisample();
-
- ImageIndex next();
- ImageIndex current() const;
- bool hasNext() const;
-
- private:
-
- ImageIndexIterator(GLenum type, const Range<GLint> &mipRange,
- const Range<GLint> &layerRange, const GLsizei *layerCounts);
-
- GLint maxLayer() const;
- void done();
-
- GLenum mType;
- Range<GLint> mMipRange;
- Range<GLint> mLayerRange;
- const GLsizei *mLayerCounts;
- GLint mCurrentMip;
- GLint mCurrentLayer;
-};
-
-}
-
-#endif // LIBANGLE_IMAGE_INDEX_H_
diff --git a/src/3rdparty/angle/src/libANGLE/IndexRangeCache.cpp b/src/3rdparty/angle/src/libANGLE/IndexRangeCache.cpp
deleted file mode 100644
index 71a1392b1b..0000000000
--- a/src/3rdparty/angle/src/libANGLE/IndexRangeCache.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// IndexRangeCache.cpp: Defines the gl::IndexRangeCache class which stores information about
-// ranges of indices.
-
-#include "libANGLE/IndexRangeCache.h"
-
-#include "common/debug.h"
-#include "libANGLE/formatutils.h"
-
-namespace gl
-{
-
-IndexRangeCache::IndexRangeCache()
-{
-}
-
-IndexRangeCache::~IndexRangeCache()
-{
-}
-
-void IndexRangeCache::addRange(GLenum type,
- size_t offset,
- size_t count,
- bool primitiveRestartEnabled,
- const IndexRange &range)
-{
- mIndexRangeCache[IndexRangeKey(type, offset, count, primitiveRestartEnabled)] = range;
-}
-
-bool IndexRangeCache::findRange(GLenum type,
- size_t offset,
- size_t count,
- bool primitiveRestartEnabled,
- IndexRange *outRange) const
-{
- auto i = mIndexRangeCache.find(IndexRangeKey(type, offset, count, primitiveRestartEnabled));
- if (i != mIndexRangeCache.end())
- {
- if (outRange)
- {
- *outRange = i->second;
- }
- return true;
- }
- else
- {
- if (outRange)
- {
- *outRange = IndexRange();
- }
- return false;
- }
-}
-
-void IndexRangeCache::invalidateRange(size_t offset, size_t size)
-{
- size_t invalidateStart = offset;
- size_t invalidateEnd = offset + size;
-
- auto i = mIndexRangeCache.begin();
- while (i != mIndexRangeCache.end())
- {
- size_t rangeStart = i->first.offset;
- size_t rangeEnd = i->first.offset + (GetTypeInfo(i->first.type).bytes * i->first.count);
-
- if (invalidateEnd < rangeStart || invalidateStart > rangeEnd)
- {
- ++i;
- }
- else
- {
- mIndexRangeCache.erase(i++);
- }
- }
-}
-
-void IndexRangeCache::clear()
-{
- mIndexRangeCache.clear();
-}
-
-IndexRangeCache::IndexRangeKey::IndexRangeKey()
- : IndexRangeCache::IndexRangeKey(GL_NONE, 0, 0, false)
-{
-}
-
-IndexRangeCache::IndexRangeKey::IndexRangeKey(GLenum type_,
- size_t offset_,
- size_t count_,
- bool primitiveRestartEnabled_)
- : type(type_), offset(offset_), count(count_), primitiveRestartEnabled(primitiveRestartEnabled_)
-{
-}
-
-bool IndexRangeCache::IndexRangeKey::operator<(const IndexRangeKey &rhs) const
-{
- if (type != rhs.type)
- {
- return type < rhs.type;
- }
- if (offset != rhs.offset)
- {
- return offset < rhs.offset;
- }
- if (count != rhs.count)
- {
- return count < rhs.count;
- }
- if (primitiveRestartEnabled != rhs.primitiveRestartEnabled)
- {
- return primitiveRestartEnabled;
- }
- return false;
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/IndexRangeCache.h b/src/3rdparty/angle/src/libANGLE/IndexRangeCache.h
deleted file mode 100644
index 3b183448e6..0000000000
--- a/src/3rdparty/angle/src/libANGLE/IndexRangeCache.h
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// IndexRangeCache.h: Defines the gl::IndexRangeCache class which stores information about
-// ranges of indices.
-
-#ifndef LIBANGLE_INDEXRANGECACHE_H_
-#define LIBANGLE_INDEXRANGECACHE_H_
-
-#include "common/angleutils.h"
-#include "common/mathutil.h"
-
-#include "angle_gl.h"
-
-#include <map>
-
-namespace gl
-{
-
-class IndexRangeCache
-{
- public:
- IndexRangeCache();
- ~IndexRangeCache();
-
- void addRange(GLenum type,
- size_t offset,
- size_t count,
- bool primitiveRestartEnabled,
- const IndexRange &range);
- bool findRange(GLenum type,
- size_t offset,
- size_t count,
- bool primitiveRestartEnabled,
- IndexRange *outRange) const;
-
- void invalidateRange(size_t offset, size_t size);
- void clear();
-
- private:
- struct IndexRangeKey
- {
- IndexRangeKey();
- IndexRangeKey(GLenum type, size_t offset, size_t count, bool primitiveRestart);
-
- bool operator<(const IndexRangeKey &rhs) const;
-
- GLenum type;
- size_t offset;
- size_t count;
- bool primitiveRestartEnabled;
- };
-
- typedef std::map<IndexRangeKey, IndexRange> IndexRangeMap;
- IndexRangeMap mIndexRangeCache;
-};
-
-}
-
-#endif // LIBANGLE_INDEXRANGECACHE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/LoggingAnnotator.cpp b/src/3rdparty/angle/src/libANGLE/LoggingAnnotator.cpp
deleted file mode 100644
index 799399e453..0000000000
--- a/src/3rdparty/angle/src/libANGLE/LoggingAnnotator.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// LoggingAnnotator.cpp: DebugAnnotator implementing logging
-//
-
-#include "libANGLE/LoggingAnnotator.h"
-
-#include <platform/Platform.h>
-
-namespace angle
-{
-
-bool LoggingAnnotator::getStatus()
-{
- return false;
-}
-
-void LoggingAnnotator::logMessage(const gl::LogMessage &msg) const
-{
- auto *plat = ANGLEPlatformCurrent();
- if (plat != nullptr)
- {
- switch (msg.getSeverity())
- {
- case gl::LOG_ERR:
- plat->logError(plat, msg.getMessage().c_str());
- break;
- case gl::LOG_WARN:
- plat->logWarning(plat, msg.getMessage().c_str());
- break;
- default:
- UNREACHABLE();
- }
- }
- else
- {
- gl::Trace(msg.getSeverity(), msg.getMessage().c_str());
- }
-}
-
-} // namespace angle
diff --git a/src/3rdparty/angle/src/libANGLE/LoggingAnnotator.h b/src/3rdparty/angle/src/libANGLE/LoggingAnnotator.h
deleted file mode 100644
index 5bec68e189..0000000000
--- a/src/3rdparty/angle/src/libANGLE/LoggingAnnotator.h
+++ /dev/null
@@ -1,31 +0,0 @@
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// LoggingAnnotator.h: DebugAnnotator implementing logging
-//
-
-#ifndef LIBANGLE_LOGGINGANNOTATOR_H_
-#define LIBANGLE_LOGGINGANNOTATOR_H_
-
-#include "common/debug.h"
-
-namespace angle
-{
-
-class LoggingAnnotator : public gl::DebugAnnotator
-{
- public:
- LoggingAnnotator(){};
- ~LoggingAnnotator() override{};
- void beginEvent(const wchar_t *eventName) override {}
- void endEvent() override {}
- void setMarker(const wchar_t *markerName) override {}
- bool getStatus() override;
- void logMessage(const gl::LogMessage &msg) const override;
-};
-
-} // namespace angle
-
-#endif // LIBANGLE_LOGGINGANNOTATOR_H_
diff --git a/src/3rdparty/angle/src/libANGLE/MemoryProgramCache.cpp b/src/3rdparty/angle/src/libANGLE/MemoryProgramCache.cpp
deleted file mode 100644
index 9eec12e3ea..0000000000
--- a/src/3rdparty/angle/src/libANGLE/MemoryProgramCache.cpp
+++ /dev/null
@@ -1,772 +0,0 @@
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// MemoryProgramCache: Stores compiled and linked programs in memory so they don't
-// always have to be re-compiled. Can be used in conjunction with the platform
-// layer to warm up the cache from disk.
-
-#include "libANGLE/MemoryProgramCache.h"
-
-#include <GLSLANG/ShaderVars.h>
-#include <anglebase/sha1.h>
-
-#include "common/utilities.h"
-#include "common/version.h"
-#include "libANGLE/BinaryStream.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Uniform.h"
-#include "libANGLE/histogram_macros.h"
-#include "libANGLE/renderer/ProgramImpl.h"
-#include "platform/Platform.h"
-
-namespace gl
-{
-
-namespace
-{
-enum CacheResult
-{
- kCacheMiss,
- kCacheHitMemory,
- kCacheHitDisk,
- kCacheResultMax,
-};
-
-constexpr unsigned int kWarningLimit = 3;
-
-void WriteShaderVar(BinaryOutputStream *stream, const sh::ShaderVariable &var)
-{
- stream->writeInt(var.type);
- stream->writeInt(var.precision);
- stream->writeString(var.name);
- stream->writeString(var.mappedName);
- stream->writeIntVector(var.arraySizes);
- stream->writeInt(var.staticUse);
- stream->writeString(var.structName);
- ASSERT(var.fields.empty());
-}
-
-void LoadShaderVar(BinaryInputStream *stream, sh::ShaderVariable *var)
-{
- var->type = stream->readInt<GLenum>();
- var->precision = stream->readInt<GLenum>();
- var->name = stream->readString();
- var->mappedName = stream->readString();
- stream->readIntVector<unsigned int>(&var->arraySizes);
- var->staticUse = stream->readBool();
- var->structName = stream->readString();
-}
-
-void WriteShaderVariableBuffer(BinaryOutputStream *stream, const ShaderVariableBuffer &var)
-{
- stream->writeInt(var.binding);
- stream->writeInt(var.dataSize);
-
- stream->writeInt(var.vertexStaticUse);
- stream->writeInt(var.fragmentStaticUse);
- stream->writeInt(var.computeStaticUse);
-
- stream->writeInt(var.memberIndexes.size());
- for (unsigned int memberCounterIndex : var.memberIndexes)
- {
- stream->writeInt(memberCounterIndex);
- }
-}
-
-void LoadShaderVariableBuffer(BinaryInputStream *stream, ShaderVariableBuffer *var)
-{
- var->binding = stream->readInt<int>();
- var->dataSize = stream->readInt<unsigned int>();
- var->vertexStaticUse = stream->readBool();
- var->fragmentStaticUse = stream->readBool();
- var->computeStaticUse = stream->readBool();
-
- unsigned int numMembers = stream->readInt<unsigned int>();
- for (unsigned int blockMemberIndex = 0; blockMemberIndex < numMembers; blockMemberIndex++)
- {
- var->memberIndexes.push_back(stream->readInt<unsigned int>());
- }
-}
-
-void WriteBufferVariable(BinaryOutputStream *stream, const BufferVariable &var)
-{
- WriteShaderVar(stream, var);
-
- stream->writeInt(var.bufferIndex);
- stream->writeInt(var.blockInfo.offset);
- stream->writeInt(var.blockInfo.arrayStride);
- stream->writeInt(var.blockInfo.matrixStride);
- stream->writeInt(var.blockInfo.isRowMajorMatrix);
- stream->writeInt(var.blockInfo.topLevelArrayStride);
- stream->writeInt(var.topLevelArraySize);
- stream->writeInt(var.vertexStaticUse);
- stream->writeInt(var.fragmentStaticUse);
- stream->writeInt(var.computeStaticUse);
-}
-
-void LoadBufferVariable(BinaryInputStream *stream, BufferVariable *var)
-{
- LoadShaderVar(stream, var);
-
- var->bufferIndex = stream->readInt<int>();
- var->blockInfo.offset = stream->readInt<int>();
- var->blockInfo.arrayStride = stream->readInt<int>();
- var->blockInfo.matrixStride = stream->readInt<int>();
- var->blockInfo.isRowMajorMatrix = stream->readBool();
- var->blockInfo.topLevelArrayStride = stream->readInt<int>();
- var->topLevelArraySize = stream->readInt<int>();
- var->vertexStaticUse = stream->readBool();
- var->fragmentStaticUse = stream->readBool();
- var->computeStaticUse = stream->readBool();
-}
-
-void WriteInterfaceBlock(BinaryOutputStream *stream, const InterfaceBlock &block)
-{
- stream->writeString(block.name);
- stream->writeString(block.mappedName);
- stream->writeInt(block.isArray);
- stream->writeInt(block.arrayElement);
-
- WriteShaderVariableBuffer(stream, block);
-}
-
-void LoadInterfaceBlock(BinaryInputStream *stream, InterfaceBlock *block)
-{
- block->name = stream->readString();
- block->mappedName = stream->readString();
- block->isArray = stream->readBool();
- block->arrayElement = stream->readInt<unsigned int>();
-
- LoadShaderVariableBuffer(stream, block);
-}
-
-class HashStream final : angle::NonCopyable
-{
- public:
- std::string str() { return mStringStream.str(); }
-
- template <typename T>
- HashStream &operator<<(T value)
- {
- mStringStream << value << kSeparator;
- return *this;
- }
-
- private:
- static constexpr char kSeparator = ':';
- std::ostringstream mStringStream;
-};
-
-HashStream &operator<<(HashStream &stream, const Shader *shader)
-{
- if (shader)
- {
- stream << shader->getSourceString().c_str() << shader->getSourceString().length()
- << shader->getCompilerResourcesString().c_str();
- }
- return stream;
-}
-
-HashStream &operator<<(HashStream &stream, const Program::Bindings &bindings)
-{
- for (const auto &binding : bindings)
- {
- stream << binding.first << binding.second;
- }
- return stream;
-}
-
-HashStream &operator<<(HashStream &stream, const std::vector<std::string> &strings)
-{
- for (const auto &str : strings)
- {
- stream << str;
- }
- return stream;
-}
-
-} // anonymous namespace
-
-MemoryProgramCache::MemoryProgramCache(size_t maxCacheSizeBytes)
- : mProgramBinaryCache(maxCacheSizeBytes), mIssuedWarnings(0)
-{
-}
-
-MemoryProgramCache::~MemoryProgramCache()
-{
-}
-
-// static
-LinkResult MemoryProgramCache::Deserialize(const Context *context,
- const Program *program,
- ProgramState *state,
- const uint8_t *binary,
- size_t length,
- InfoLog &infoLog)
-{
- BinaryInputStream stream(binary, length);
-
- unsigned char commitString[ANGLE_COMMIT_HASH_SIZE];
- stream.readBytes(commitString, ANGLE_COMMIT_HASH_SIZE);
- if (memcmp(commitString, ANGLE_COMMIT_HASH, sizeof(unsigned char) * ANGLE_COMMIT_HASH_SIZE) !=
- 0)
- {
- infoLog << "Invalid program binary version.";
- return false;
- }
-
- int majorVersion = stream.readInt<int>();
- int minorVersion = stream.readInt<int>();
- if (majorVersion != context->getClientMajorVersion() ||
- minorVersion != context->getClientMinorVersion())
- {
- infoLog << "Cannot load program binaries across different ES context versions.";
- return false;
- }
-
- state->mComputeShaderLocalSize[0] = stream.readInt<int>();
- state->mComputeShaderLocalSize[1] = stream.readInt<int>();
- state->mComputeShaderLocalSize[2] = stream.readInt<int>();
-
- state->mNumViews = stream.readInt<int>();
-
- static_assert(MAX_VERTEX_ATTRIBS <= sizeof(unsigned long) * 8,
- "Too many vertex attribs for mask");
- state->mActiveAttribLocationsMask = stream.readInt<unsigned long>();
-
- unsigned int attribCount = stream.readInt<unsigned int>();
- ASSERT(state->mAttributes.empty());
- for (unsigned int attribIndex = 0; attribIndex < attribCount; ++attribIndex)
- {
- sh::Attribute attrib;
- LoadShaderVar(&stream, &attrib);
- attrib.location = stream.readInt<int>();
- state->mAttributes.push_back(attrib);
- }
-
- unsigned int uniformCount = stream.readInt<unsigned int>();
- ASSERT(state->mUniforms.empty());
- for (unsigned int uniformIndex = 0; uniformIndex < uniformCount; ++uniformIndex)
- {
- LinkedUniform uniform;
- LoadShaderVar(&stream, &uniform);
-
- uniform.bufferIndex = stream.readInt<int>();
- uniform.blockInfo.offset = stream.readInt<int>();
- uniform.blockInfo.arrayStride = stream.readInt<int>();
- uniform.blockInfo.matrixStride = stream.readInt<int>();
- uniform.blockInfo.isRowMajorMatrix = stream.readBool();
-
- uniform.typeInfo = &GetUniformTypeInfo(uniform.type);
-
- state->mUniforms.push_back(uniform);
- }
-
- const unsigned int uniformIndexCount = stream.readInt<unsigned int>();
- ASSERT(state->mUniformLocations.empty());
- for (unsigned int uniformIndexIndex = 0; uniformIndexIndex < uniformIndexCount;
- uniformIndexIndex++)
- {
- VariableLocation variable;
- stream.readInt(&variable.arrayIndex);
- stream.readInt(&variable.index);
- stream.readBool(&variable.ignored);
-
- state->mUniformLocations.push_back(variable);
- }
-
- unsigned int uniformBlockCount = stream.readInt<unsigned int>();
- ASSERT(state->mUniformBlocks.empty());
- for (unsigned int uniformBlockIndex = 0; uniformBlockIndex < uniformBlockCount;
- ++uniformBlockIndex)
- {
- InterfaceBlock uniformBlock;
- LoadInterfaceBlock(&stream, &uniformBlock);
- state->mUniformBlocks.push_back(uniformBlock);
-
- state->mActiveUniformBlockBindings.set(uniformBlockIndex, uniformBlock.binding != 0);
- }
-
- unsigned int bufferVariableCount = stream.readInt<unsigned int>();
- ASSERT(state->mBufferVariables.empty());
- for (unsigned int index = 0; index < bufferVariableCount; ++index)
- {
- BufferVariable bufferVariable;
- LoadBufferVariable(&stream, &bufferVariable);
- state->mBufferVariables.push_back(bufferVariable);
- }
-
- unsigned int shaderStorageBlockCount = stream.readInt<unsigned int>();
- ASSERT(state->mShaderStorageBlocks.empty());
- for (unsigned int shaderStorageBlockIndex = 0;
- shaderStorageBlockIndex < shaderStorageBlockCount; ++shaderStorageBlockIndex)
- {
- InterfaceBlock shaderStorageBlock;
- LoadInterfaceBlock(&stream, &shaderStorageBlock);
- state->mShaderStorageBlocks.push_back(shaderStorageBlock);
- }
-
- unsigned int atomicCounterBufferCount = stream.readInt<unsigned int>();
- ASSERT(state->mAtomicCounterBuffers.empty());
- for (unsigned int bufferIndex = 0; bufferIndex < atomicCounterBufferCount; ++bufferIndex)
- {
- AtomicCounterBuffer atomicCounterBuffer;
- LoadShaderVariableBuffer(&stream, &atomicCounterBuffer);
-
- state->mAtomicCounterBuffers.push_back(atomicCounterBuffer);
- }
-
- unsigned int transformFeedbackVaryingCount = stream.readInt<unsigned int>();
-
- // Reject programs that use transform feedback varyings if the hardware cannot support them.
- if (transformFeedbackVaryingCount > 0 &&
- context->getWorkarounds().disableProgramCachingForTransformFeedback)
- {
- infoLog << "Current driver does not support transform feedback in binary programs.";
- return false;
- }
-
- ASSERT(state->mLinkedTransformFeedbackVaryings.empty());
- for (unsigned int transformFeedbackVaryingIndex = 0;
- transformFeedbackVaryingIndex < transformFeedbackVaryingCount;
- ++transformFeedbackVaryingIndex)
- {
- sh::Varying varying;
- stream.readIntVector<unsigned int>(&varying.arraySizes);
- stream.readInt(&varying.type);
- stream.readString(&varying.name);
-
- GLuint arrayIndex = stream.readInt<GLuint>();
-
- state->mLinkedTransformFeedbackVaryings.emplace_back(varying, arrayIndex);
- }
-
- stream.readInt(&state->mTransformFeedbackBufferMode);
-
- unsigned int outputCount = stream.readInt<unsigned int>();
- ASSERT(state->mOutputVariables.empty());
- for (unsigned int outputIndex = 0; outputIndex < outputCount; ++outputIndex)
- {
- sh::OutputVariable output;
- LoadShaderVar(&stream, &output);
- output.location = stream.readInt<int>();
- state->mOutputVariables.push_back(output);
- }
-
- unsigned int outputVarCount = stream.readInt<unsigned int>();
- ASSERT(state->mOutputLocations.empty());
- for (unsigned int outputIndex = 0; outputIndex < outputVarCount; ++outputIndex)
- {
- VariableLocation locationData;
- stream.readInt(&locationData.arrayIndex);
- stream.readInt(&locationData.index);
- stream.readBool(&locationData.ignored);
- state->mOutputLocations.push_back(locationData);
- }
-
- unsigned int outputTypeCount = stream.readInt<unsigned int>();
- for (unsigned int outputIndex = 0; outputIndex < outputTypeCount; ++outputIndex)
- {
- state->mOutputVariableTypes.push_back(stream.readInt<GLenum>());
- }
- static_assert(IMPLEMENTATION_MAX_DRAW_BUFFERS < 8 * sizeof(uint32_t),
- "All bits of DrawBufferMask can be contained in an uint32_t");
- state->mActiveOutputVariables = stream.readInt<uint32_t>();
-
- unsigned int samplerRangeLow = stream.readInt<unsigned int>();
- unsigned int samplerRangeHigh = stream.readInt<unsigned int>();
- state->mSamplerUniformRange = RangeUI(samplerRangeLow, samplerRangeHigh);
- unsigned int samplerCount = stream.readInt<unsigned int>();
- for (unsigned int samplerIndex = 0; samplerIndex < samplerCount; ++samplerIndex)
- {
- GLenum textureType = stream.readInt<GLenum>();
- size_t bindingCount = stream.readInt<size_t>();
- bool unreferenced = stream.readBool();
- state->mSamplerBindings.emplace_back(
- SamplerBinding(textureType, bindingCount, unreferenced));
- }
-
- unsigned int imageRangeLow = stream.readInt<unsigned int>();
- unsigned int imageRangeHigh = stream.readInt<unsigned int>();
- state->mImageUniformRange = RangeUI(imageRangeLow, imageRangeHigh);
- unsigned int imageBindingCount = stream.readInt<unsigned int>();
- for (unsigned int imageIndex = 0; imageIndex < imageBindingCount; ++imageIndex)
- {
- unsigned int elementCount = stream.readInt<unsigned int>();
- ImageBinding imageBinding(elementCount);
- for (unsigned int i = 0; i < elementCount; ++i)
- {
- imageBinding.boundImageUnits[i] = stream.readInt<unsigned int>();
- }
- state->mImageBindings.emplace_back(imageBinding);
- }
-
- unsigned int atomicCounterRangeLow = stream.readInt<unsigned int>();
- unsigned int atomicCounterRangeHigh = stream.readInt<unsigned int>();
- state->mAtomicCounterUniformRange = RangeUI(atomicCounterRangeLow, atomicCounterRangeHigh);
-
- static_assert(SHADER_TYPE_MAX <= sizeof(unsigned long) * 8, "Too many shader types");
- state->mLinkedShaderStages = stream.readInt<unsigned long>();
-
- return program->getImplementation()->load(context, infoLog, &stream);
-}
-
-// static
-void MemoryProgramCache::Serialize(const Context *context,
- const gl::Program *program,
- angle::MemoryBuffer *binaryOut)
-{
- BinaryOutputStream stream;
-
- stream.writeBytes(reinterpret_cast<const unsigned char *>(ANGLE_COMMIT_HASH),
- ANGLE_COMMIT_HASH_SIZE);
-
- // nullptr context is supported when computing binary length.
- if (context)
- {
- stream.writeInt(context->getClientVersion().major);
- stream.writeInt(context->getClientVersion().minor);
- }
- else
- {
- stream.writeInt(2);
- stream.writeInt(0);
- }
-
- const auto &state = program->getState();
-
- const auto &computeLocalSize = state.getComputeShaderLocalSize();
-
- stream.writeInt(computeLocalSize[0]);
- stream.writeInt(computeLocalSize[1]);
- stream.writeInt(computeLocalSize[2]);
-
- stream.writeInt(state.mNumViews);
-
- stream.writeInt(state.getActiveAttribLocationsMask().to_ulong());
-
- stream.writeInt(state.getAttributes().size());
- for (const sh::Attribute &attrib : state.getAttributes())
- {
- WriteShaderVar(&stream, attrib);
- stream.writeInt(attrib.location);
- }
-
- stream.writeInt(state.getUniforms().size());
- for (const LinkedUniform &uniform : state.getUniforms())
- {
- WriteShaderVar(&stream, uniform);
-
- // FIXME: referenced
-
- stream.writeInt(uniform.bufferIndex);
- stream.writeInt(uniform.blockInfo.offset);
- stream.writeInt(uniform.blockInfo.arrayStride);
- stream.writeInt(uniform.blockInfo.matrixStride);
- stream.writeInt(uniform.blockInfo.isRowMajorMatrix);
- }
-
- stream.writeInt(state.getUniformLocations().size());
- for (const auto &variable : state.getUniformLocations())
- {
- stream.writeInt(variable.arrayIndex);
- stream.writeIntOrNegOne(variable.index);
- stream.writeInt(variable.ignored);
- }
-
- stream.writeInt(state.getUniformBlocks().size());
- for (const InterfaceBlock &uniformBlock : state.getUniformBlocks())
- {
- WriteInterfaceBlock(&stream, uniformBlock);
- }
-
- stream.writeInt(state.getBufferVariables().size());
- for (const BufferVariable &bufferVariable : state.getBufferVariables())
- {
- WriteBufferVariable(&stream, bufferVariable);
- }
-
- stream.writeInt(state.getShaderStorageBlocks().size());
- for (const InterfaceBlock &shaderStorageBlock : state.getShaderStorageBlocks())
- {
- WriteInterfaceBlock(&stream, shaderStorageBlock);
- }
-
- stream.writeInt(state.mAtomicCounterBuffers.size());
- for (const auto &atomicCounterBuffer : state.mAtomicCounterBuffers)
- {
- WriteShaderVariableBuffer(&stream, atomicCounterBuffer);
- }
-
- // Warn the app layer if saving a binary with unsupported transform feedback.
- if (!state.getLinkedTransformFeedbackVaryings().empty() &&
- context->getWorkarounds().disableProgramCachingForTransformFeedback)
- {
- WARN() << "Saving program binary with transform feedback, which is not supported on this "
- "driver.";
- }
-
- stream.writeInt(state.getLinkedTransformFeedbackVaryings().size());
- for (const auto &var : state.getLinkedTransformFeedbackVaryings())
- {
- stream.writeIntVector(var.arraySizes);
- stream.writeInt(var.type);
- stream.writeString(var.name);
-
- stream.writeIntOrNegOne(var.arrayIndex);
- }
-
- stream.writeInt(state.getTransformFeedbackBufferMode());
-
- stream.writeInt(state.getOutputVariables().size());
- for (const sh::OutputVariable &output : state.getOutputVariables())
- {
- WriteShaderVar(&stream, output);
- stream.writeInt(output.location);
- }
-
- stream.writeInt(state.getOutputLocations().size());
- for (const auto &outputVar : state.getOutputLocations())
- {
- stream.writeInt(outputVar.arrayIndex);
- stream.writeIntOrNegOne(outputVar.index);
- stream.writeInt(outputVar.ignored);
- }
-
- stream.writeInt(state.mOutputVariableTypes.size());
- for (const auto &outputVariableType : state.mOutputVariableTypes)
- {
- stream.writeInt(outputVariableType);
- }
-
- static_assert(IMPLEMENTATION_MAX_DRAW_BUFFERS < 8 * sizeof(uint32_t),
- "All bits of DrawBufferMask can be contained in an uint32_t");
- stream.writeInt(static_cast<uint32_t>(state.mActiveOutputVariables.to_ulong()));
-
- stream.writeInt(state.getSamplerUniformRange().low());
- stream.writeInt(state.getSamplerUniformRange().high());
-
- stream.writeInt(state.getSamplerBindings().size());
- for (const auto &samplerBinding : state.getSamplerBindings())
- {
- stream.writeInt(samplerBinding.textureType);
- stream.writeInt(samplerBinding.boundTextureUnits.size());
- stream.writeInt(samplerBinding.unreferenced);
- }
-
- stream.writeInt(state.getImageUniformRange().low());
- stream.writeInt(state.getImageUniformRange().high());
-
- stream.writeInt(state.getImageBindings().size());
- for (const auto &imageBinding : state.getImageBindings())
- {
- stream.writeInt(imageBinding.boundImageUnits.size());
- for (size_t i = 0; i < imageBinding.boundImageUnits.size(); ++i)
- {
- stream.writeInt(imageBinding.boundImageUnits[i]);
- }
- }
-
- stream.writeInt(state.getAtomicCounterUniformRange().low());
- stream.writeInt(state.getAtomicCounterUniformRange().high());
-
- stream.writeInt(state.getLinkedShaderStages().to_ulong());
-
- program->getImplementation()->save(context, &stream);
-
- ASSERT(binaryOut);
- binaryOut->resize(stream.length());
- memcpy(binaryOut->data(), stream.data(), stream.length());
-}
-
-// static
-void MemoryProgramCache::ComputeHash(const Context *context,
- const Program *program,
- ProgramHash *hashOut)
-{
- const Shader *vertexShader = program->getAttachedVertexShader();
- const Shader *fragmentShader = program->getAttachedFragmentShader();
- const Shader *computeShader = program->getAttachedComputeShader();
-
- // Compute the program hash. Start with the shader hashes and resource strings.
- HashStream hashStream;
- hashStream << vertexShader << fragmentShader << computeShader;
-
- // Add some ANGLE metadata and Context properties, such as version and back-end.
- hashStream << ANGLE_COMMIT_HASH << context->getClientMajorVersion()
- << context->getClientMinorVersion() << context->getString(GL_RENDERER);
-
- // Hash pre-link program properties.
- hashStream << program->getAttributeBindings() << program->getUniformLocationBindings()
- << program->getFragmentInputBindings()
- << program->getState().getTransformFeedbackVaryingNames()
- << program->getState().getTransformFeedbackBufferMode();
-
- // Call the secure SHA hashing function.
- const std::string &programKey = hashStream.str();
- angle::base::SHA1HashBytes(reinterpret_cast<const unsigned char *>(programKey.c_str()),
- programKey.length(), hashOut->data());
-}
-
-LinkResult MemoryProgramCache::getProgram(const Context *context,
- const Program *program,
- ProgramState *state,
- ProgramHash *hashOut)
-{
- ComputeHash(context, program, hashOut);
- const angle::MemoryBuffer *binaryProgram = nullptr;
- LinkResult result(false);
- if (get(*hashOut, &binaryProgram))
- {
- InfoLog infoLog;
- ANGLE_TRY_RESULT(Deserialize(context, program, state, binaryProgram->data(),
- binaryProgram->size(), infoLog),
- result);
- ANGLE_HISTOGRAM_BOOLEAN("GPU.ANGLE.ProgramCache.LoadBinarySuccess", result.getResult());
- if (!result.getResult())
- {
- // Cache load failed, evict.
- if (mIssuedWarnings++ < kWarningLimit)
- {
- WARN() << "Failed to load binary from cache: " << infoLog.str();
-
- if (mIssuedWarnings == kWarningLimit)
- {
- WARN() << "Reaching warning limit for cache load failures, silencing "
- "subsequent warnings.";
- }
- }
- remove(*hashOut);
- }
- }
- return result;
-}
-
-bool MemoryProgramCache::get(const ProgramHash &programHash, const angle::MemoryBuffer **programOut)
-{
- const CacheEntry *entry = nullptr;
- if (!mProgramBinaryCache.get(programHash, &entry))
- {
- ANGLE_HISTOGRAM_ENUMERATION("GPU.ANGLE.ProgramCache.CacheResult", kCacheMiss,
- kCacheResultMax);
- return false;
- }
-
- if (entry->second == CacheSource::PutProgram)
- {
- ANGLE_HISTOGRAM_ENUMERATION("GPU.ANGLE.ProgramCache.CacheResult", kCacheHitMemory,
- kCacheResultMax);
- }
- else
- {
- ANGLE_HISTOGRAM_ENUMERATION("GPU.ANGLE.ProgramCache.CacheResult", kCacheHitDisk,
- kCacheResultMax);
- }
-
- *programOut = &entry->first;
- return true;
-}
-
-bool MemoryProgramCache::getAt(size_t index,
- ProgramHash *hashOut,
- const angle::MemoryBuffer **programOut)
-{
- const CacheEntry *entry = nullptr;
- if (!mProgramBinaryCache.getAt(index, hashOut, &entry))
- {
- return false;
- }
-
- *programOut = &entry->first;
- return true;
-}
-
-void MemoryProgramCache::remove(const ProgramHash &programHash)
-{
- bool result = mProgramBinaryCache.eraseByKey(programHash);
- ASSERT(result);
-}
-
-void MemoryProgramCache::putProgram(const ProgramHash &programHash,
- const Context *context,
- const Program *program)
-{
- CacheEntry newEntry;
- Serialize(context, program, &newEntry.first);
- newEntry.second = CacheSource::PutProgram;
-
- ANGLE_HISTOGRAM_COUNTS("GPU.ANGLE.ProgramCache.ProgramBinarySizeBytes",
- static_cast<int>(newEntry.first.size()));
-
- const CacheEntry *result =
- mProgramBinaryCache.put(programHash, std::move(newEntry), newEntry.first.size());
- if (!result)
- {
- ERR() << "Failed to store binary program in memory cache, program is too large.";
- }
- else
- {
- auto *platform = ANGLEPlatformCurrent();
- platform->cacheProgram(platform, programHash, result->first.size(), result->first.data());
- }
-}
-
-void MemoryProgramCache::updateProgram(const Context *context, const Program *program)
-{
- gl::ProgramHash programHash;
- ComputeHash(context, program, &programHash);
- putProgram(programHash, context, program);
-}
-
-void MemoryProgramCache::putBinary(const ProgramHash &programHash,
- const uint8_t *binary,
- size_t length)
-{
- // Copy the binary.
- CacheEntry newEntry;
- newEntry.first.resize(length);
- memcpy(newEntry.first.data(), binary, length);
- newEntry.second = CacheSource::PutBinary;
-
- // Store the binary.
- const CacheEntry *result = mProgramBinaryCache.put(programHash, std::move(newEntry), length);
- if (!result)
- {
- ERR() << "Failed to store binary program in memory cache, program is too large.";
- }
-}
-
-void MemoryProgramCache::clear()
-{
- mProgramBinaryCache.clear();
- mIssuedWarnings = 0;
-}
-
-void MemoryProgramCache::resize(size_t maxCacheSizeBytes)
-{
- mProgramBinaryCache.resize(maxCacheSizeBytes);
-}
-
-size_t MemoryProgramCache::entryCount() const
-{
- return mProgramBinaryCache.entryCount();
-}
-
-size_t MemoryProgramCache::trim(size_t limit)
-{
- return mProgramBinaryCache.shrinkToSize(limit);
-}
-
-size_t MemoryProgramCache::size() const
-{
- return mProgramBinaryCache.size();
-}
-
-size_t MemoryProgramCache::maxSize() const
-{
- return mProgramBinaryCache.maxSize();
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/MemoryProgramCache.h b/src/3rdparty/angle/src/libANGLE/MemoryProgramCache.h
deleted file mode 100644
index 044bd48ecc..0000000000
--- a/src/3rdparty/angle/src/libANGLE/MemoryProgramCache.h
+++ /dev/null
@@ -1,130 +0,0 @@
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// MemoryProgramCache: Stores compiled and linked programs in memory so they don't
-// always have to be re-compiled. Can be used in conjunction with the platform
-// layer to warm up the cache from disk.
-
-#ifndef LIBANGLE_MEMORY_PROGRAM_CACHE_H_
-#define LIBANGLE_MEMORY_PROGRAM_CACHE_H_
-
-#include <array>
-
-#include "common/MemoryBuffer.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/SizedMRUCache.h"
-
-namespace gl
-{
-// 160-bit SHA-1 hash key.
-constexpr size_t kProgramHashLength = 20;
-using ProgramHash = std::array<uint8_t, kProgramHashLength>;
-} // namespace gl
-
-namespace std
-{
-template <>
-struct hash<gl::ProgramHash>
-{
- // Simple routine to hash four ints.
- size_t operator()(const gl::ProgramHash &programHash) const
- {
- unsigned int hash = 0;
- for (uint32_t num : programHash)
- {
- hash *= 37;
- hash += num;
- }
- return hash;
- }
-};
-} // namespace std
-
-namespace gl
-{
-class Context;
-class InfoLog;
-class Program;
-class ProgramState;
-
-class MemoryProgramCache final : angle::NonCopyable
-{
- public:
- MemoryProgramCache(size_t maxCacheSizeBytes);
- ~MemoryProgramCache();
-
- // Writes a program's binary to the output memory buffer.
- static void Serialize(const Context *context,
- const Program *program,
- angle::MemoryBuffer *binaryOut);
-
- // Loads program state according to the specified binary blob.
- static LinkResult Deserialize(const Context *context,
- const Program *program,
- ProgramState *state,
- const uint8_t *binary,
- size_t length,
- InfoLog &infoLog);
-
- static void ComputeHash(const Context *context, const Program *program, ProgramHash *hashOut);
-
- // Check if the cache contains a binary matching the specified program.
- bool get(const ProgramHash &programHash, const angle::MemoryBuffer **programOut);
-
- // For querying the contents of the cache.
- bool getAt(size_t index, ProgramHash *hashOut, const angle::MemoryBuffer **programOut);
-
- // Evict a program from the binary cache.
- void remove(const ProgramHash &programHash);
-
- // Helper method that serializes a program.
- void putProgram(const ProgramHash &programHash, const Context *context, const Program *program);
-
- // Same as putProgram but computes the hash.
- void updateProgram(const Context *context, const Program *program);
-
- // Store a binary directly.
- void putBinary(const ProgramHash &programHash, const uint8_t *binary, size_t length);
-
- // Check the cache, and deserialize and load the program if found. Evict existing hash if load
- // fails.
- LinkResult getProgram(const Context *context,
- const Program *program,
- ProgramState *state,
- ProgramHash *hashOut);
-
- // Empty the cache.
- void clear();
-
- // Resize the cache. Discards current contents.
- void resize(size_t maxCacheSizeBytes);
-
- // Returns the number of entries in the cache.
- size_t entryCount() const;
-
- // Reduces the current cache size and returns the number of bytes freed.
- size_t trim(size_t limit);
-
- // Returns the current cache size in bytes.
- size_t size() const;
-
- // Returns the maximum cache size in bytes.
- size_t maxSize() const;
-
- private:
- enum class CacheSource
- {
- PutProgram,
- PutBinary,
- };
-
- using CacheEntry = std::pair<angle::MemoryBuffer, CacheSource>;
- angle::SizedMRUCache<ProgramHash, CacheEntry> mProgramBinaryCache;
- unsigned int mIssuedWarnings;
-};
-
-} // namespace gl
-
-#endif // LIBANGLE_MEMORY_PROGRAM_CACHE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/PackedGLEnums.h b/src/3rdparty/angle/src/libANGLE/PackedGLEnums.h
deleted file mode 100644
index 70e32910fc..0000000000
--- a/src/3rdparty/angle/src/libANGLE/PackedGLEnums.h
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// PackedGLEnums_autogen.h:
-// Declares ANGLE-specific enums classes for GLEnum and functions operating
-// on them.
-
-#ifndef LIBANGLE_PACKEDGLENUMS_H_
-#define LIBANGLE_PACKEDGLENUMS_H_
-
-#include "libANGLE/PackedGLEnums_autogen.h"
-
-#include <array>
-#include <cstddef>
-
-namespace angle
-{
-
-template <typename E>
-class EnumIterator final
-{
- private:
- using UnderlyingType = typename std::underlying_type<E>::type;
-
- public:
- EnumIterator(E value) : mValue(static_cast<UnderlyingType>(value)) {}
- EnumIterator &operator++()
- {
- mValue++;
- return *this;
- }
- bool operator==(const EnumIterator &other) const { return mValue == other.mValue; }
- bool operator!=(const EnumIterator &other) const { return mValue != other.mValue; }
- E operator*() const { return static_cast<E>(mValue); }
-
- private:
- UnderlyingType mValue;
-};
-
-template <typename E>
-struct AllEnums
-{
- EnumIterator<E> begin() const { return {static_cast<E>(0)}; }
- EnumIterator<E> end() const { return {E::InvalidEnum}; }
-};
-
-template <typename E, typename T>
-class PackedEnumMap
-{
- private:
- using UnderlyingType = typename std::underlying_type<E>::type;
- static constexpr size_t kSize = static_cast<UnderlyingType>(E::EnumCount);
- using Storage = std::array<T, kSize>;
-
- Storage mData;
-
- public:
- // types:
- using value_type = T;
- using pointer = T *;
- using const_pointer = const T *;
- using reference = T &;
- using const_reference = const T &;
-
- using size_type = size_t;
- using difference_type = ptrdiff_t;
-
- using iterator = typename Storage::iterator;
- using const_iterator = typename Storage::const_iterator;
- using reverse_iterator = std::reverse_iterator<iterator>;
- using const_reverse_iterator = std::reverse_iterator<const_iterator>;
-
- // No explicit construct/copy/destroy for aggregate type
- void fill(const T &u) { mData.fill(u); }
- void swap(PackedEnumMap<E, T> &a) noexcept { mData.swap(a.mData); }
-
- // iterators:
- iterator begin() noexcept { return mData.begin(); }
- const_iterator begin() const noexcept { return mData.begin(); }
- iterator end() noexcept { return mData.end(); }
- const_iterator end() const noexcept { return mData.end(); }
-
- reverse_iterator rbegin() noexcept { return mData.rbegin(); }
- const_reverse_iterator rbegin() const noexcept { return mData.rbegin(); }
- reverse_iterator rend() noexcept { return mData.rend(); }
- const_reverse_iterator rend() const noexcept { return mData.rend(); }
-
- // capacity:
- constexpr size_type size() const noexcept { return mData.size(); }
- constexpr size_type max_size() const noexcept { return mData.max_size(); }
- constexpr bool empty() const noexcept { return mData.empty(); }
-
- // element access:
- reference operator[](E n) { return mData[static_cast<UnderlyingType>(n)]; }
- const_reference operator[](E n) const { return mData[static_cast<UnderlyingType>(n)]; }
- const_reference at(E n) const { return mData.at(static_cast<UnderlyingType>(n)); }
- reference at(E n) { return mData.at(static_cast<UnderlyingType>(n)); }
-
- reference front() { return mData.front(); }
- const_reference front() const { return mData.front(); }
- reference back() { return mData.back(); }
- const_reference back() const { return mData.back(); }
-
- T *data() noexcept { return mData.data(); }
- const T *data() const noexcept { return mData.data(); }
-};
-
-} // namespace angle
-
-#endif // LIBANGLE_PACKEDGLENUMS_H_
diff --git a/src/3rdparty/angle/src/libANGLE/PackedGLEnums_autogen.cpp b/src/3rdparty/angle/src/libANGLE/PackedGLEnums_autogen.cpp
deleted file mode 100644
index 4959a8ff14..0000000000
--- a/src/3rdparty/angle/src/libANGLE/PackedGLEnums_autogen.cpp
+++ /dev/null
@@ -1,174 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by gen_packed_gl_enums.py using data from packed_gl_enums.json.
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// PackedGLEnums_autogen.cpp:
-// Implements ANGLE-specific enums classes for GLEnum and functions operating
-// on them.
-
-#include "libANGLE/PackedGLEnums_autogen.h"
-#include "common/debug.h"
-
-namespace gl
-{
-
-template <>
-BufferBinding FromGLenum<BufferBinding>(GLenum from)
-{
- switch (from)
- {
- case GL_ARRAY_BUFFER:
- return BufferBinding::Array;
- case GL_ATOMIC_COUNTER_BUFFER:
- return BufferBinding::AtomicCounter;
- case GL_COPY_READ_BUFFER:
- return BufferBinding::CopyRead;
- case GL_COPY_WRITE_BUFFER:
- return BufferBinding::CopyWrite;
- case GL_DISPATCH_INDIRECT_BUFFER:
- return BufferBinding::DispatchIndirect;
- case GL_DRAW_INDIRECT_BUFFER:
- return BufferBinding::DrawIndirect;
- case GL_ELEMENT_ARRAY_BUFFER:
- return BufferBinding::ElementArray;
- case GL_PIXEL_PACK_BUFFER:
- return BufferBinding::PixelPack;
- case GL_PIXEL_UNPACK_BUFFER:
- return BufferBinding::PixelUnpack;
- case GL_SHADER_STORAGE_BUFFER:
- return BufferBinding::ShaderStorage;
- case GL_TRANSFORM_FEEDBACK_BUFFER:
- return BufferBinding::TransformFeedback;
- case GL_UNIFORM_BUFFER:
- return BufferBinding::Uniform;
- default:
- return BufferBinding::InvalidEnum;
- }
-}
-
-GLenum ToGLenum(BufferBinding from)
-{
- switch (from)
- {
- case BufferBinding::Array:
- return GL_ARRAY_BUFFER;
- case BufferBinding::AtomicCounter:
- return GL_ATOMIC_COUNTER_BUFFER;
- case BufferBinding::CopyRead:
- return GL_COPY_READ_BUFFER;
- case BufferBinding::CopyWrite:
- return GL_COPY_WRITE_BUFFER;
- case BufferBinding::DispatchIndirect:
- return GL_DISPATCH_INDIRECT_BUFFER;
- case BufferBinding::DrawIndirect:
- return GL_DRAW_INDIRECT_BUFFER;
- case BufferBinding::ElementArray:
- return GL_ELEMENT_ARRAY_BUFFER;
- case BufferBinding::PixelPack:
- return GL_PIXEL_PACK_BUFFER;
- case BufferBinding::PixelUnpack:
- return GL_PIXEL_UNPACK_BUFFER;
- case BufferBinding::ShaderStorage:
- return GL_SHADER_STORAGE_BUFFER;
- case BufferBinding::TransformFeedback:
- return GL_TRANSFORM_FEEDBACK_BUFFER;
- case BufferBinding::Uniform:
- return GL_UNIFORM_BUFFER;
- default:
- UNREACHABLE();
- return GL_NONE;
- }
-}
-
-template <>
-BufferUsage FromGLenum<BufferUsage>(GLenum from)
-{
- switch (from)
- {
- case GL_DYNAMIC_COPY:
- return BufferUsage::DynamicCopy;
- case GL_DYNAMIC_DRAW:
- return BufferUsage::DynamicDraw;
- case GL_DYNAMIC_READ:
- return BufferUsage::DynamicRead;
- case GL_STATIC_COPY:
- return BufferUsage::StaticCopy;
- case GL_STATIC_DRAW:
- return BufferUsage::StaticDraw;
- case GL_STATIC_READ:
- return BufferUsage::StaticRead;
- case GL_STREAM_COPY:
- return BufferUsage::StreamCopy;
- case GL_STREAM_DRAW:
- return BufferUsage::StreamDraw;
- case GL_STREAM_READ:
- return BufferUsage::StreamRead;
- default:
- return BufferUsage::InvalidEnum;
- }
-}
-
-GLenum ToGLenum(BufferUsage from)
-{
- switch (from)
- {
- case BufferUsage::DynamicCopy:
- return GL_DYNAMIC_COPY;
- case BufferUsage::DynamicDraw:
- return GL_DYNAMIC_DRAW;
- case BufferUsage::DynamicRead:
- return GL_DYNAMIC_READ;
- case BufferUsage::StaticCopy:
- return GL_STATIC_COPY;
- case BufferUsage::StaticDraw:
- return GL_STATIC_DRAW;
- case BufferUsage::StaticRead:
- return GL_STATIC_READ;
- case BufferUsage::StreamCopy:
- return GL_STREAM_COPY;
- case BufferUsage::StreamDraw:
- return GL_STREAM_DRAW;
- case BufferUsage::StreamRead:
- return GL_STREAM_READ;
- default:
- UNREACHABLE();
- return GL_NONE;
- }
-}
-
-template <>
-CullFaceMode FromGLenum<CullFaceMode>(GLenum from)
-{
- switch (from)
- {
- case GL_BACK:
- return CullFaceMode::Back;
- case GL_FRONT:
- return CullFaceMode::Front;
- case GL_FRONT_AND_BACK:
- return CullFaceMode::FrontAndBack;
- default:
- return CullFaceMode::InvalidEnum;
- }
-}
-
-GLenum ToGLenum(CullFaceMode from)
-{
- switch (from)
- {
- case CullFaceMode::Back:
- return GL_BACK;
- case CullFaceMode::Front:
- return GL_FRONT;
- case CullFaceMode::FrontAndBack:
- return GL_FRONT_AND_BACK;
- default:
- UNREACHABLE();
- return GL_NONE;
- }
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/PackedGLEnums_autogen.h b/src/3rdparty/angle/src/libANGLE/PackedGLEnums_autogen.h
deleted file mode 100644
index f3f349ab68..0000000000
--- a/src/3rdparty/angle/src/libANGLE/PackedGLEnums_autogen.h
+++ /dev/null
@@ -1,84 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by gen_packed_gl_enums.py using data from packed_gl_enums.json.
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// PackedGLEnums_autogen.h:
-// Declares ANGLE-specific enums classes for GLEnum and functions operating
-// on them.
-
-#ifndef LIBANGLE_PACKEDGLENUMS_AUTOGEN_H_
-#define LIBANGLE_PACKEDGLENUMS_AUTOGEN_H_
-
-#include <angle_gl.h>
-
-#include <cstdint>
-
-namespace gl
-{
-
-template <typename Enum>
-Enum FromGLenum(GLenum from);
-
-enum class BufferBinding : uint8_t
-{
- Array = 0,
- AtomicCounter = 1,
- CopyRead = 2,
- CopyWrite = 3,
- DispatchIndirect = 4,
- DrawIndirect = 5,
- ElementArray = 6,
- PixelPack = 7,
- PixelUnpack = 8,
- ShaderStorage = 9,
- TransformFeedback = 10,
- Uniform = 11,
-
- InvalidEnum = 12,
- EnumCount = 12,
-};
-
-template <>
-BufferBinding FromGLenum<BufferBinding>(GLenum from);
-GLenum ToGLenum(BufferBinding from);
-
-enum class BufferUsage : uint8_t
-{
- DynamicCopy = 0,
- DynamicDraw = 1,
- DynamicRead = 2,
- StaticCopy = 3,
- StaticDraw = 4,
- StaticRead = 5,
- StreamCopy = 6,
- StreamDraw = 7,
- StreamRead = 8,
-
- InvalidEnum = 9,
- EnumCount = 9,
-};
-
-template <>
-BufferUsage FromGLenum<BufferUsage>(GLenum from);
-GLenum ToGLenum(BufferUsage from);
-
-enum class CullFaceMode : uint8_t
-{
- Back = 0,
- Front = 1,
- FrontAndBack = 2,
-
- InvalidEnum = 3,
- EnumCount = 3,
-};
-
-template <>
-CullFaceMode FromGLenum<CullFaceMode>(GLenum from);
-GLenum ToGLenum(CullFaceMode from);
-
-} // namespace gl
-
-#endif // LIBANGLE_PACKEDGLENUMS_AUTOGEN_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Path.cpp b/src/3rdparty/angle/src/libANGLE/Path.cpp
deleted file mode 100644
index 8f2ce9ef92..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Path.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-//
-// Copyright (c) 2002-2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Path.h: Defines the gl::Path class, representing CHROMIUM_path_rendering
-// path object.
-
-#include "libANGLE/Path.h"
-#include "libANGLE/renderer/PathImpl.h"
-
-#include "common/mathutil.h"
-#include "common/debug.h"
-
-namespace gl
-{
-
-Path::Path(rx::PathImpl *impl)
- : mPath(impl),
- mHasData(false),
- mEndCaps(GL_FLAT_CHROMIUM),
- mJoinStyle(GL_MITER_REVERT_CHROMIUM),
- mStrokeWidth(1.0f),
- mStrokeBound(0.2f),
- mMiterLimit(4.0f)
-{
-}
-
-Path::~Path()
-{
- delete mPath;
-}
-
-Error Path::setCommands(GLsizei numCommands,
- const GLubyte *commands,
- GLsizei numCoords,
- GLenum coordType,
- const void *coords)
-{
- ANGLE_TRY(mPath->setCommands(numCommands, commands, numCoords, coordType, coords));
-
- mHasData = true;
-
- return NoError();
-}
-
-void Path::setStrokeWidth(GLfloat width)
-{
- mStrokeWidth = width;
- mPath->setPathParameter(GL_PATH_STROKE_WIDTH_CHROMIUM, mStrokeWidth);
-}
-
-void Path::setStrokeBound(GLfloat bound)
-{
- mStrokeBound = clamp(bound, 0.0f, 1.0f);
- mPath->setPathParameter(GL_PATH_STROKE_BOUND_CHROMIUM, mStrokeBound);
-}
-
-void Path::setEndCaps(GLenum type)
-{
- mEndCaps = type;
- mPath->setPathParameter(GL_PATH_END_CAPS_CHROMIUM, static_cast<GLfloat>(type));
-}
-
-void Path::setJoinStyle(GLenum type)
-{
- mJoinStyle = type;
- mPath->setPathParameter(GL_PATH_JOIN_STYLE_CHROMIUM, static_cast<GLfloat>(type));
-}
-
-void Path::setMiterLimit(GLfloat value)
-{
- mMiterLimit = value;
- mPath->setPathParameter(GL_PATH_MITER_LIMIT_CHROMIUM, value);
-}
-
-} // gl
diff --git a/src/3rdparty/angle/src/libANGLE/Path.h b/src/3rdparty/angle/src/libANGLE/Path.h
deleted file mode 100644
index b103c84607..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Path.h
+++ /dev/null
@@ -1,71 +0,0 @@
-//
-// Copyright (c) 2002-2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Path.h: Defines the gl::Path class, representing CHROMIUM_path_rendering
-// path object.
-
-#ifndef LIBANGLE_PATH_H_
-#define LIBANGLE_PATH_H_
-
-#include "angle_gl.h"
-#include "common/angleutils.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/RefCountObject.h"
-
-namespace rx
-{
-class PathImpl;
-}
-
-namespace gl
-{
-class Path final : angle::NonCopyable
-{
- public:
- Path(rx::PathImpl *impl);
-
- ~Path();
-
- Error setCommands(GLsizei numCommands,
- const GLubyte *commands,
- GLsizei numCoords,
- GLenum coordType,
- const void *coords);
-
- void setStrokeWidth(GLfloat width);
- void setStrokeBound(GLfloat bound);
- void setEndCaps(GLenum type);
- void setJoinStyle(GLenum type);
- void setMiterLimit(GLfloat value);
-
- GLfloat getStrokeWidth() const { return mStrokeWidth; }
- GLfloat getStrokeBound() const { return mStrokeBound; }
- GLfloat getMiterLimit() const { return mMiterLimit; }
- GLenum getEndCaps() const { return mEndCaps; }
- GLenum getJoinStyle() const { return mJoinStyle; }
-
- bool hasPathData() const { return mHasData; }
-
- rx::PathImpl *getImplementation() const { return mPath; }
-
- private:
- rx::PathImpl *mPath;
-
- // a Path object is not actually considered "a path"
- // untill it has been specified with data. So we'll
- // keep this flag to support this semantics.
- bool mHasData;
-
- GLenum mEndCaps;
- GLenum mJoinStyle;
- GLfloat mStrokeWidth;
- GLfloat mStrokeBound;
- GLfloat mMiterLimit;
-};
-
-} // namespace gl
-
-#endif // LIBANGLE_PATH_H_ \ No newline at end of file
diff --git a/src/3rdparty/angle/src/libANGLE/Platform.cpp b/src/3rdparty/angle/src/libANGLE/Platform.cpp
deleted file mode 100644
index 702091624f..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Platform.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-//
-// Copyright 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Platform.cpp: Implementation methods for angle::Platform.
-
-#include <platform/Platform.h>
-
-#include <cstring>
-
-#include "common/debug.h"
-
-namespace
-{
-// TODO(jmadill): Make methods owned by egl::Display.
-angle::PlatformMethods g_platformMethods;
-} // anonymous namespace
-
-angle::PlatformMethods::PlatformMethods()
-{
-}
-
-angle::PlatformMethods *ANGLEPlatformCurrent()
-{
- return &g_platformMethods;
-}
-
-bool ANGLE_APIENTRY ANGLEGetDisplayPlatform(angle::EGLDisplayType display,
- const char *const methodNames[],
- unsigned int methodNameCount,
- void *context,
- void *platformMethods)
-{
- angle::PlatformMethods **platformMethodsOut =
- reinterpret_cast<angle::PlatformMethods **>(platformMethods);
-
- // We allow for a lower input count of impl platform methods if the subset is correct.
- if (methodNameCount > angle::g_NumPlatformMethods)
- {
- ERR() << "Invalid platform method count: " << methodNameCount << ", expected "
- << angle::g_NumPlatformMethods << ".";
- return false;
- }
-
- for (unsigned int nameIndex = 0; nameIndex < methodNameCount; ++nameIndex)
- {
- const char *expectedName = angle::g_PlatformMethodNames[nameIndex];
- const char *actualName = methodNames[nameIndex];
- if (strcmp(expectedName, actualName) != 0)
- {
- ERR() << "Invalid platform method name: " << actualName << ", expected " << expectedName
- << ".";
- return false;
- }
- }
-
- // TODO(jmadill): Store platform methods in display.
- g_platformMethods.context = context;
- *platformMethodsOut = &g_platformMethods;
- return true;
-}
-
-void ANGLE_APIENTRY ANGLEResetDisplayPlatform(angle::EGLDisplayType display)
-{
- // TODO(jmadill): Store platform methods in display.
- g_platformMethods = angle::PlatformMethods();
-}
diff --git a/src/3rdparty/angle/src/libANGLE/Program.cpp b/src/3rdparty/angle/src/libANGLE/Program.cpp
deleted file mode 100644
index 795d326041..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Program.cpp
+++ /dev/null
@@ -1,3066 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Program.cpp: Implements the gl::Program class. Implements GL program objects
-// and related functionality. [OpenGL ES 2.0.24] section 2.10.3 page 28.
-
-#include "libANGLE/Program.h"
-
-#include <algorithm>
-
-#include "common/bitset_utils.h"
-#include "common/debug.h"
-#include "common/platform.h"
-#include "common/string_utils.h"
-#include "common/utilities.h"
-#include "compiler/translator/blocklayout.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/MemoryProgramCache.h"
-#include "libANGLE/ProgramLinkedResources.h"
-#include "libANGLE/ResourceManager.h"
-#include "libANGLE/Uniform.h"
-#include "libANGLE/VaryingPacking.h"
-#include "libANGLE/features.h"
-#include "libANGLE/histogram_macros.h"
-#include "libANGLE/queryconversions.h"
-#include "libANGLE/renderer/GLImplFactory.h"
-#include "libANGLE/renderer/ProgramImpl.h"
-#include "platform/Platform.h"
-
-namespace gl
-{
-
-namespace
-{
-
-// This simplified cast function doesn't need to worry about advanced concepts like
-// depth range values, or casting to bool.
-template <typename DestT, typename SrcT>
-DestT UniformStateQueryCast(SrcT value);
-
-// From-Float-To-Integer Casts
-template <>
-GLint UniformStateQueryCast(GLfloat value)
-{
- return clampCast<GLint>(roundf(value));
-}
-
-template <>
-GLuint UniformStateQueryCast(GLfloat value)
-{
- return clampCast<GLuint>(roundf(value));
-}
-
-// From-Integer-to-Integer Casts
-template <>
-GLint UniformStateQueryCast(GLuint value)
-{
- return clampCast<GLint>(value);
-}
-
-template <>
-GLuint UniformStateQueryCast(GLint value)
-{
- return clampCast<GLuint>(value);
-}
-
-// From-Boolean-to-Anything Casts
-template <>
-GLfloat UniformStateQueryCast(GLboolean value)
-{
- return (ConvertToBool(value) ? 1.0f : 0.0f);
-}
-
-template <>
-GLint UniformStateQueryCast(GLboolean value)
-{
- return (ConvertToBool(value) ? 1 : 0);
-}
-
-template <>
-GLuint UniformStateQueryCast(GLboolean value)
-{
- return (ConvertToBool(value) ? 1u : 0u);
-}
-
-// Default to static_cast
-template <typename DestT, typename SrcT>
-DestT UniformStateQueryCast(SrcT value)
-{
- return static_cast<DestT>(value);
-}
-
-template <typename SrcT, typename DestT>
-void UniformStateQueryCastLoop(DestT *dataOut, const uint8_t *srcPointer, int components)
-{
- for (int comp = 0; comp < components; ++comp)
- {
- // We only work with strides of 4 bytes for uniform components. (GLfloat/GLint)
- // Don't use SrcT stride directly since GLboolean has a stride of 1 byte.
- size_t offset = comp * 4;
- const SrcT *typedSrcPointer = reinterpret_cast<const SrcT *>(&srcPointer[offset]);
- dataOut[comp] = UniformStateQueryCast<DestT>(*typedSrcPointer);
- }
-}
-
-template <typename VarT>
-GLuint GetResourceIndexFromName(const std::vector<VarT> &list, const std::string &name)
-{
- std::string nameAsArrayName = name + "[0]";
- for (size_t index = 0; index < list.size(); index++)
- {
- const VarT &resource = list[index];
- if (resource.name == name || (resource.isArray() && resource.name == nameAsArrayName))
- {
- return static_cast<GLuint>(index);
- }
- }
-
- return GL_INVALID_INDEX;
-}
-
-template <typename VarT>
-GLint GetVariableLocation(const std::vector<VarT> &list,
- const std::vector<VariableLocation> &locationList,
- const std::string &name)
-{
- size_t nameLengthWithoutArrayIndex;
- unsigned int arrayIndex = ParseArrayIndex(name, &nameLengthWithoutArrayIndex);
-
- for (size_t location = 0u; location < locationList.size(); ++location)
- {
- const VariableLocation &variableLocation = locationList[location];
- if (!variableLocation.used())
- {
- continue;
- }
-
- const VarT &variable = list[variableLocation.index];
-
- if (angle::BeginsWith(variable.name, name))
- {
- if (name.length() == variable.name.length())
- {
- ASSERT(name == variable.name);
- // GLES 3.1 November 2016 page 87.
- // The string exactly matches the name of the active variable.
- return static_cast<GLint>(location);
- }
- if (name.length() + 3u == variable.name.length() && variable.isArray())
- {
- ASSERT(name + "[0]" == variable.name);
- // The string identifies the base name of an active array, where the string would
- // exactly match the name of the variable if the suffix "[0]" were appended to the
- // string.
- return static_cast<GLint>(location);
- }
- }
- if (variable.isArray() && variableLocation.arrayIndex == arrayIndex &&
- nameLengthWithoutArrayIndex + 3u == variable.name.length() &&
- angle::BeginsWith(variable.name, name, nameLengthWithoutArrayIndex))
- {
- ASSERT(name.substr(0u, nameLengthWithoutArrayIndex) + "[0]" == variable.name);
- // The string identifies an active element of the array, where the string ends with the
- // concatenation of the "[" character, an integer (with no "+" sign, extra leading
- // zeroes, or whitespace) identifying an array element, and the "]" character, the
- // integer is less than the number of active elements of the array variable, and where
- // the string would exactly match the enumerated name of the array if the decimal
- // integer were replaced with zero.
- return static_cast<GLint>(location);
- }
- }
-
- return -1;
-}
-
-void CopyStringToBuffer(GLchar *buffer, const std::string &string, GLsizei bufSize, GLsizei *length)
-{
- ASSERT(bufSize > 0);
- strncpy(buffer, string.c_str(), bufSize);
- buffer[bufSize - 1] = '\0';
-
- if (length)
- {
- *length = static_cast<GLsizei>(strlen(buffer));
- }
-}
-
-bool IncludeSameArrayElement(const std::set<std::string> &nameSet, const std::string &name)
-{
- std::vector<unsigned int> subscripts;
- std::string baseName = ParseResourceName(name, &subscripts);
- for (auto nameInSet : nameSet)
- {
- std::vector<unsigned int> arrayIndices;
- std::string arrayName = ParseResourceName(nameInSet, &arrayIndices);
- if (baseName == arrayName &&
- (subscripts.empty() || arrayIndices.empty() || subscripts == arrayIndices))
- {
- return true;
- }
- }
- return false;
-}
-
-bool validateInterfaceBlocksCount(GLuint maxInterfaceBlocks,
- const std::vector<sh::InterfaceBlock> &interfaceBlocks,
- const std::string &errorMessage,
- InfoLog &infoLog)
-{
- GLuint blockCount = 0;
- for (const sh::InterfaceBlock &block : interfaceBlocks)
- {
- if (block.staticUse || block.layout != sh::BLOCKLAYOUT_PACKED)
- {
- blockCount += (block.arraySize ? block.arraySize : 1);
- if (blockCount > maxInterfaceBlocks)
- {
- infoLog << errorMessage << maxInterfaceBlocks << ")";
- return false;
- }
- }
- }
- return true;
-}
-
-GLuint GetInterfaceBlockIndex(const std::vector<InterfaceBlock> &list, const std::string &name)
-{
- std::vector<unsigned int> subscripts;
- std::string baseName = ParseResourceName(name, &subscripts);
-
- unsigned int numBlocks = static_cast<unsigned int>(list.size());
- for (unsigned int blockIndex = 0; blockIndex < numBlocks; blockIndex++)
- {
- const auto &block = list[blockIndex];
- if (block.name == baseName)
- {
- const bool arrayElementZero =
- (subscripts.empty() && (!block.isArray || block.arrayElement == 0));
- const bool arrayElementMatches =
- (subscripts.size() == 1 && subscripts[0] == block.arrayElement);
- if (arrayElementMatches || arrayElementZero)
- {
- return blockIndex;
- }
- }
- }
-
- return GL_INVALID_INDEX;
-}
-
-void GetInterfaceBlockName(const GLuint index,
- const std::vector<InterfaceBlock> &list,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *name)
-{
- ASSERT(index < list.size());
-
- const auto &block = list[index];
-
- if (bufSize > 0)
- {
- std::string blockName = block.name;
-
- if (block.isArray)
- {
- blockName += ArrayString(block.arrayElement);
- }
- CopyStringToBuffer(name, blockName, bufSize, length);
- }
-}
-
-void InitUniformBlockLinker(const gl::Context *context,
- const ProgramState &state,
- UniformBlockLinker *blockLinker)
-{
- if (state.getAttachedVertexShader())
- {
- blockLinker->addShaderBlocks(GL_VERTEX_SHADER,
- &state.getAttachedVertexShader()->getUniformBlocks(context));
- }
-
- if (state.getAttachedFragmentShader())
- {
- blockLinker->addShaderBlocks(GL_FRAGMENT_SHADER,
- &state.getAttachedFragmentShader()->getUniformBlocks(context));
- }
-
- if (state.getAttachedComputeShader())
- {
- blockLinker->addShaderBlocks(GL_COMPUTE_SHADER,
- &state.getAttachedComputeShader()->getUniformBlocks(context));
- }
-}
-
-void InitShaderStorageBlockLinker(const gl::Context *context,
- const ProgramState &state,
- ShaderStorageBlockLinker *blockLinker)
-{
- if (state.getAttachedVertexShader())
- {
- blockLinker->addShaderBlocks(
- GL_VERTEX_SHADER, &state.getAttachedVertexShader()->getShaderStorageBlocks(context));
- }
-
- if (state.getAttachedFragmentShader())
- {
- blockLinker->addShaderBlocks(
- GL_FRAGMENT_SHADER,
- &state.getAttachedFragmentShader()->getShaderStorageBlocks(context));
- }
-
- if (state.getAttachedComputeShader())
- {
- blockLinker->addShaderBlocks(
- GL_COMPUTE_SHADER, &state.getAttachedComputeShader()->getShaderStorageBlocks(context));
- }
-}
-
-} // anonymous namespace
-
-const char *const g_fakepath = "C:\\fakepath";
-
-InfoLog::InfoLog()
-{
-}
-
-InfoLog::~InfoLog()
-{
-}
-
-size_t InfoLog::getLength() const
-{
- if (!mLazyStream)
- {
- return 0;
- }
-
- const std::string &logString = mLazyStream->str();
- return logString.empty() ? 0 : logString.length() + 1;
-}
-
-void InfoLog::getLog(GLsizei bufSize, GLsizei *length, char *infoLog) const
-{
- size_t index = 0;
-
- if (bufSize > 0)
- {
- const std::string logString(str());
-
- if (!logString.empty())
- {
- index = std::min(static_cast<size_t>(bufSize) - 1, logString.length());
- memcpy(infoLog, logString.c_str(), index);
- }
-
- infoLog[index] = '\0';
- }
-
- if (length)
- {
- *length = static_cast<GLsizei>(index);
- }
-}
-
-// append a santized message to the program info log.
-// The D3D compiler includes a fake file path in some of the warning or error
-// messages, so lets remove all occurrences of this fake file path from the log.
-void InfoLog::appendSanitized(const char *message)
-{
- ensureInitialized();
-
- std::string msg(message);
-
- size_t found;
- do
- {
- found = msg.find(g_fakepath);
- if (found != std::string::npos)
- {
- msg.erase(found, strlen(g_fakepath));
- }
- }
- while (found != std::string::npos);
-
- *mLazyStream << message << std::endl;
-}
-
-void InfoLog::reset()
-{
-}
-
-VariableLocation::VariableLocation() : arrayIndex(0), index(kUnused), ignored(false)
-{
-}
-
-VariableLocation::VariableLocation(unsigned int arrayIndex, unsigned int index)
- : arrayIndex(arrayIndex), index(index), ignored(false)
-{
- ASSERT(arrayIndex != GL_INVALID_INDEX);
-}
-
-SamplerBinding::SamplerBinding(GLenum textureTypeIn, size_t elementCount, bool unreferenced)
- : textureType(textureTypeIn), boundTextureUnits(elementCount, 0), unreferenced(unreferenced)
-{
-}
-
-SamplerBinding::SamplerBinding(const SamplerBinding &other) = default;
-
-SamplerBinding::~SamplerBinding() = default;
-
-Program::Bindings::Bindings()
-{
-}
-
-Program::Bindings::~Bindings()
-{
-}
-
-void Program::Bindings::bindLocation(GLuint index, const std::string &name)
-{
- mBindings[name] = index;
-}
-
-int Program::Bindings::getBinding(const std::string &name) const
-{
- auto iter = mBindings.find(name);
- return (iter != mBindings.end()) ? iter->second : -1;
-}
-
-Program::Bindings::const_iterator Program::Bindings::begin() const
-{
- return mBindings.begin();
-}
-
-Program::Bindings::const_iterator Program::Bindings::end() const
-{
- return mBindings.end();
-}
-
-ImageBinding::ImageBinding(size_t count) : boundImageUnits(count, 0)
-{
-}
-ImageBinding::ImageBinding(GLuint imageUnit, size_t count)
-{
- for (size_t index = 0; index < count; ++index)
- {
- boundImageUnits.push_back(imageUnit + static_cast<GLuint>(index));
- }
-}
-
-ImageBinding::ImageBinding(const ImageBinding &other) = default;
-
-ImageBinding::~ImageBinding() = default;
-
-ProgramState::ProgramState()
- : mLabel(),
- mAttachedFragmentShader(nullptr),
- mAttachedVertexShader(nullptr),
- mAttachedComputeShader(nullptr),
- mAttachedGeometryShader(nullptr),
- mTransformFeedbackBufferMode(GL_INTERLEAVED_ATTRIBS),
- mMaxActiveAttribLocation(0),
- mSamplerUniformRange(0, 0),
- mImageUniformRange(0, 0),
- mAtomicCounterUniformRange(0, 0),
- mBinaryRetrieveableHint(false),
- mNumViews(-1)
-{
- mComputeShaderLocalSize.fill(1);
-}
-
-ProgramState::~ProgramState()
-{
- ASSERT(!mAttachedVertexShader && !mAttachedFragmentShader && !mAttachedComputeShader &&
- !mAttachedGeometryShader);
-}
-
-const std::string &ProgramState::getLabel()
-{
- return mLabel;
-}
-
-GLuint ProgramState::getUniformIndexFromName(const std::string &name) const
-{
- return GetResourceIndexFromName(mUniforms, name);
-}
-
-GLuint ProgramState::getBufferVariableIndexFromName(const std::string &name) const
-{
- return GetResourceIndexFromName(mBufferVariables, name);
-}
-
-GLuint ProgramState::getUniformIndexFromLocation(GLint location) const
-{
- ASSERT(location >= 0 && static_cast<size_t>(location) < mUniformLocations.size());
- return mUniformLocations[location].index;
-}
-
-Optional<GLuint> ProgramState::getSamplerIndex(GLint location) const
-{
- GLuint index = getUniformIndexFromLocation(location);
- if (!isSamplerUniformIndex(index))
- {
- return Optional<GLuint>::Invalid();
- }
-
- return getSamplerIndexFromUniformIndex(index);
-}
-
-bool ProgramState::isSamplerUniformIndex(GLuint index) const
-{
- return mSamplerUniformRange.contains(index);
-}
-
-GLuint ProgramState::getSamplerIndexFromUniformIndex(GLuint uniformIndex) const
-{
- ASSERT(isSamplerUniformIndex(uniformIndex));
- return uniformIndex - mSamplerUniformRange.low();
-}
-
-GLuint ProgramState::getAttributeLocation(const std::string &name) const
-{
- for (const sh::Attribute &attribute : mAttributes)
- {
- if (attribute.name == name)
- {
- return attribute.location;
- }
- }
-
- return static_cast<GLuint>(-1);
-}
-
-Program::Program(rx::GLImplFactory *factory, ShaderProgramManager *manager, GLuint handle)
- : mProgram(factory->createProgram(mState)),
- mValidated(false),
- mLinked(false),
- mDeleteStatus(false),
- mRefCount(0),
- mResourceManager(manager),
- mHandle(handle)
-{
- ASSERT(mProgram);
-
- unlink();
-}
-
-Program::~Program()
-{
- ASSERT(!mProgram);
-}
-
-void Program::onDestroy(const Context *context)
-{
- if (mState.mAttachedVertexShader != nullptr)
- {
- mState.mAttachedVertexShader->release(context);
- mState.mAttachedVertexShader = nullptr;
- }
-
- if (mState.mAttachedFragmentShader != nullptr)
- {
- mState.mAttachedFragmentShader->release(context);
- mState.mAttachedFragmentShader = nullptr;
- }
-
- if (mState.mAttachedComputeShader != nullptr)
- {
- mState.mAttachedComputeShader->release(context);
- mState.mAttachedComputeShader = nullptr;
- }
-
- if (mState.mAttachedGeometryShader != nullptr)
- {
- mState.mAttachedGeometryShader->release(context);
- mState.mAttachedGeometryShader = nullptr;
- }
-
- mProgram->destroy(context);
-
- ASSERT(!mState.mAttachedVertexShader && !mState.mAttachedFragmentShader &&
- !mState.mAttachedComputeShader && !mState.mAttachedGeometryShader);
- SafeDelete(mProgram);
-
- delete this;
-}
-
-void Program::setLabel(const std::string &label)
-{
- mState.mLabel = label;
-}
-
-const std::string &Program::getLabel() const
-{
- return mState.mLabel;
-}
-
-void Program::attachShader(Shader *shader)
-{
- switch (shader->getType())
- {
- case GL_VERTEX_SHADER:
- {
- ASSERT(!mState.mAttachedVertexShader);
- mState.mAttachedVertexShader = shader;
- mState.mAttachedVertexShader->addRef();
- break;
- }
- case GL_FRAGMENT_SHADER:
- {
- ASSERT(!mState.mAttachedFragmentShader);
- mState.mAttachedFragmentShader = shader;
- mState.mAttachedFragmentShader->addRef();
- break;
- }
- case GL_COMPUTE_SHADER:
- {
- ASSERT(!mState.mAttachedComputeShader);
- mState.mAttachedComputeShader = shader;
- mState.mAttachedComputeShader->addRef();
- break;
- }
- case GL_GEOMETRY_SHADER_EXT:
- {
- ASSERT(!mState.mAttachedGeometryShader);
- mState.mAttachedGeometryShader = shader;
- mState.mAttachedGeometryShader->addRef();
- break;
- }
- default:
- UNREACHABLE();
- }
-}
-
-void Program::detachShader(const Context *context, Shader *shader)
-{
- switch (shader->getType())
- {
- case GL_VERTEX_SHADER:
- {
- ASSERT(mState.mAttachedVertexShader == shader);
- shader->release(context);
- mState.mAttachedVertexShader = nullptr;
- break;
- }
- case GL_FRAGMENT_SHADER:
- {
- ASSERT(mState.mAttachedFragmentShader == shader);
- shader->release(context);
- mState.mAttachedFragmentShader = nullptr;
- break;
- }
- case GL_COMPUTE_SHADER:
- {
- ASSERT(mState.mAttachedComputeShader == shader);
- shader->release(context);
- mState.mAttachedComputeShader = nullptr;
- break;
- }
- case GL_GEOMETRY_SHADER_EXT:
- {
- ASSERT(mState.mAttachedGeometryShader == shader);
- shader->release(context);
- mState.mAttachedGeometryShader = nullptr;
- break;
- }
- default:
- UNREACHABLE();
- }
-}
-
-int Program::getAttachedShadersCount() const
-{
- return (mState.mAttachedVertexShader ? 1 : 0) + (mState.mAttachedFragmentShader ? 1 : 0) +
- (mState.mAttachedComputeShader ? 1 : 0) + (mState.mAttachedGeometryShader ? 1 : 0);
-}
-
-void Program::bindAttributeLocation(GLuint index, const char *name)
-{
- mAttributeBindings.bindLocation(index, name);
-}
-
-void Program::bindUniformLocation(GLuint index, const char *name)
-{
- mUniformLocationBindings.bindLocation(index, name);
-}
-
-void Program::bindFragmentInputLocation(GLint index, const char *name)
-{
- mFragmentInputBindings.bindLocation(index, name);
-}
-
-BindingInfo Program::getFragmentInputBindingInfo(const Context *context, GLint index) const
-{
- BindingInfo ret;
- ret.type = GL_NONE;
- ret.valid = false;
-
- Shader *fragmentShader = mState.getAttachedFragmentShader();
- ASSERT(fragmentShader);
-
- // Find the actual fragment shader varying we're interested in
- const std::vector<sh::Varying> &inputs = fragmentShader->getInputVaryings(context);
-
- for (const auto &binding : mFragmentInputBindings)
- {
- if (binding.second != static_cast<GLuint>(index))
- continue;
-
- ret.valid = true;
-
- size_t nameLengthWithoutArrayIndex;
- unsigned int arrayIndex = ParseArrayIndex(binding.first, &nameLengthWithoutArrayIndex);
-
- for (const auto &in : inputs)
- {
- if (in.name.length() == nameLengthWithoutArrayIndex &&
- angle::BeginsWith(in.name, binding.first, nameLengthWithoutArrayIndex))
- {
- if (in.isArray())
- {
- // The client wants to bind either "name" or "name[0]".
- // GL ES 3.1 spec refers to active array names with language such as:
- // "if the string identifies the base name of an active array, where the
- // string would exactly match the name of the variable if the suffix "[0]"
- // were appended to the string".
- if (arrayIndex == GL_INVALID_INDEX)
- arrayIndex = 0;
-
- ret.name = in.mappedName + "[" + ToString(arrayIndex) + "]";
- }
- else
- {
- ret.name = in.mappedName;
- }
- ret.type = in.type;
- return ret;
- }
- }
- }
-
- return ret;
-}
-
-void Program::pathFragmentInputGen(const Context *context,
- GLint index,
- GLenum genMode,
- GLint components,
- const GLfloat *coeffs)
-{
- // If the location is -1 then the command is silently ignored
- if (index == -1)
- return;
-
- const auto &binding = getFragmentInputBindingInfo(context, index);
-
- // If the input doesn't exist then then the command is silently ignored
- // This could happen through optimization for example, the shader translator
- // decides that a variable is not actually being used and optimizes it away.
- if (binding.name.empty())
- return;
-
- mProgram->setPathFragmentInputGen(binding.name, genMode, components, coeffs);
-}
-
-// The attached shaders are checked for linking errors by matching up their variables.
-// Uniform, input and output variables get collected.
-// The code gets compiled into binaries.
-Error Program::link(const gl::Context *context)
-{
- const auto &data = context->getContextState();
-
- auto *platform = ANGLEPlatformCurrent();
- double startTime = platform->currentTime(platform);
-
- unlink();
-
- ProgramHash programHash;
- auto *cache = context->getMemoryProgramCache();
- if (cache)
- {
- ANGLE_TRY_RESULT(cache->getProgram(context, this, &mState, &programHash), mLinked);
- ANGLE_HISTOGRAM_BOOLEAN("GPU.ANGLE.ProgramCache.LoadBinarySuccess", mLinked);
- }
-
- if (mLinked)
- {
- double delta = platform->currentTime(platform) - startTime;
- int us = static_cast<int>(delta * 1000000.0);
- ANGLE_HISTOGRAM_COUNTS("GPU.ANGLE.ProgramCache.ProgramCacheHitTimeUS", us);
- return NoError();
- }
-
- // Cache load failed, fall through to normal linking.
- unlink();
- mInfoLog.reset();
-
- const Caps &caps = data.getCaps();
-
- Shader *vertexShader = mState.mAttachedVertexShader;
- Shader *fragmentShader = mState.mAttachedFragmentShader;
- Shader *computeShader = mState.mAttachedComputeShader;
-
- bool isComputeShaderAttached = (computeShader != nullptr);
- bool nonComputeShadersAttached = (vertexShader != nullptr || fragmentShader != nullptr);
- // Check whether we both have a compute and non-compute shaders attached.
- // If there are of both types attached, then linking should fail.
- // OpenGL ES 3.10, 7.3 Program Objects, under LinkProgram
- if (isComputeShaderAttached == true && nonComputeShadersAttached == true)
- {
- mInfoLog << "Both a compute and non-compute shaders are attached to the same program.";
- return NoError();
- }
-
- if (computeShader)
- {
- if (!computeShader->isCompiled(context))
- {
- mInfoLog << "Attached compute shader is not compiled.";
- return NoError();
- }
- ASSERT(computeShader->getType() == GL_COMPUTE_SHADER);
-
- mState.mComputeShaderLocalSize = computeShader->getWorkGroupSize(context);
-
- // GLSL ES 3.10, 4.4.1.1 Compute Shader Inputs
- // If the work group size is not specified, a link time error should occur.
- if (!mState.mComputeShaderLocalSize.isDeclared())
- {
- mInfoLog << "Work group size is not specified.";
- return NoError();
- }
-
- if (!linkUniforms(context, mInfoLog, mUniformLocationBindings))
- {
- return NoError();
- }
-
- if (!linkInterfaceBlocks(context, mInfoLog))
- {
- return NoError();
- }
-
- ProgramLinkedResources resources = {
- {0, PackMode::ANGLE_RELAXED},
- {&mState.mUniformBlocks, &mState.mUniforms},
- {&mState.mShaderStorageBlocks, &mState.mBufferVariables}};
-
- InitUniformBlockLinker(context, mState, &resources.uniformBlockLinker);
- InitShaderStorageBlockLinker(context, mState, &resources.shaderStorageBlockLinker);
-
- ANGLE_TRY_RESULT(mProgram->link(context, resources, mInfoLog), mLinked);
- if (!mLinked)
- {
- return NoError();
- }
- }
- else
- {
- if (!fragmentShader || !fragmentShader->isCompiled(context))
- {
- return NoError();
- }
- ASSERT(fragmentShader->getType() == GL_FRAGMENT_SHADER);
-
- if (!vertexShader || !vertexShader->isCompiled(context))
- {
- return NoError();
- }
- ASSERT(vertexShader->getType() == GL_VERTEX_SHADER);
-
- if (fragmentShader->getShaderVersion(context) != vertexShader->getShaderVersion(context))
- {
- mInfoLog << "Fragment shader version does not match vertex shader version.";
- return NoError();
- }
-
- if (!linkAttributes(context, mInfoLog))
- {
- return NoError();
- }
-
- if (!linkVaryings(context, mInfoLog))
- {
- return NoError();
- }
-
- if (!linkUniforms(context, mInfoLog, mUniformLocationBindings))
- {
- return NoError();
- }
-
- if (!linkInterfaceBlocks(context, mInfoLog))
- {
- return NoError();
- }
-
- if (!linkValidateGlobalNames(context, mInfoLog))
- {
- return NoError();
- }
-
- const auto &mergedVaryings = getMergedVaryings(context);
-
- mState.mNumViews = vertexShader->getNumViews(context);
-
- linkOutputVariables(context);
-
- // Map the varyings to the register file
- // In WebGL, we use a slightly different handling for packing variables.
- auto packMode = data.getExtensions().webglCompatibility ? PackMode::WEBGL_STRICT
- : PackMode::ANGLE_RELAXED;
-
- ProgramLinkedResources resources = {
- {data.getCaps().maxVaryingVectors, packMode},
- {&mState.mUniformBlocks, &mState.mUniforms},
- {&mState.mShaderStorageBlocks, &mState.mBufferVariables}};
-
- InitUniformBlockLinker(context, mState, &resources.uniformBlockLinker);
- InitShaderStorageBlockLinker(context, mState, &resources.shaderStorageBlockLinker);
-
- if (!linkValidateTransformFeedback(context, mInfoLog, mergedVaryings, caps))
- {
- return NoError();
- }
-
- if (!resources.varyingPacking.collectAndPackUserVaryings(
- mInfoLog, mergedVaryings, mState.getTransformFeedbackVaryingNames()))
- {
- return NoError();
- }
-
- ANGLE_TRY_RESULT(mProgram->link(context, resources, mInfoLog), mLinked);
- if (!mLinked)
- {
- return NoError();
- }
-
- gatherTransformFeedbackVaryings(mergedVaryings);
- }
-
- gatherAtomicCounterBuffers();
- initInterfaceBlockBindings();
-
- setUniformValuesFromBindingQualifiers();
-
- ASSERT(mLinked);
- updateLinkedShaderStages();
-
- // Mark implementation-specific unreferenced uniforms as ignored.
- mProgram->markUnusedUniformLocations(&mState.mUniformLocations, &mState.mSamplerBindings);
-
- // Save to the program cache.
- if (cache && (mState.mLinkedTransformFeedbackVaryings.empty() ||
- !context->getWorkarounds().disableProgramCachingForTransformFeedback))
- {
- cache->putProgram(programHash, context, this);
- }
-
- double delta = platform->currentTime(platform) - startTime;
- int us = static_cast<int>(delta * 1000000.0);
- ANGLE_HISTOGRAM_COUNTS("GPU.ANGLE.ProgramCache.ProgramCacheMissTimeUS", us);
-
- return NoError();
-}
-
-void Program::updateLinkedShaderStages()
-{
- if (mState.mAttachedVertexShader)
- {
- mState.mLinkedShaderStages.set(SHADER_VERTEX);
- }
-
- if (mState.mAttachedFragmentShader)
- {
- mState.mLinkedShaderStages.set(SHADER_FRAGMENT);
- }
-
- if (mState.mAttachedComputeShader)
- {
- mState.mLinkedShaderStages.set(SHADER_COMPUTE);
- }
-}
-
-// Returns the program object to an unlinked state, before re-linking, or at destruction
-void Program::unlink()
-{
- mState.mAttributes.clear();
- mState.mActiveAttribLocationsMask.reset();
- mState.mMaxActiveAttribLocation = 0;
- mState.mLinkedTransformFeedbackVaryings.clear();
- mState.mUniforms.clear();
- mState.mUniformLocations.clear();
- mState.mUniformBlocks.clear();
- mState.mActiveUniformBlockBindings.reset();
- mState.mAtomicCounterBuffers.clear();
- mState.mOutputVariables.clear();
- mState.mOutputLocations.clear();
- mState.mOutputVariableTypes.clear();
- mState.mActiveOutputVariables.reset();
- mState.mComputeShaderLocalSize.fill(1);
- mState.mSamplerBindings.clear();
- mState.mImageBindings.clear();
- mState.mNumViews = -1;
- mState.mLinkedShaderStages.reset();
-
- mValidated = false;
-
- mLinked = false;
-}
-
-bool Program::isLinked() const
-{
- return mLinked;
-}
-
-Error Program::loadBinary(const Context *context,
- GLenum binaryFormat,
- const void *binary,
- GLsizei length)
-{
- unlink();
-
-#if ANGLE_PROGRAM_BINARY_LOAD != ANGLE_ENABLED
- return NoError();
-#else
- ASSERT(binaryFormat == GL_PROGRAM_BINARY_ANGLE);
- if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
- {
- mInfoLog << "Invalid program binary format.";
- return NoError();
- }
-
- const uint8_t *bytes = reinterpret_cast<const uint8_t *>(binary);
- ANGLE_TRY_RESULT(
- MemoryProgramCache::Deserialize(context, this, &mState, bytes, length, mInfoLog), mLinked);
-
- // Currently we require the full shader text to compute the program hash.
- // TODO(jmadill): Store the binary in the internal program cache.
-
- return NoError();
-#endif // #if ANGLE_PROGRAM_BINARY_LOAD == ANGLE_ENABLED
-}
-
-Error Program::saveBinary(const Context *context,
- GLenum *binaryFormat,
- void *binary,
- GLsizei bufSize,
- GLsizei *length) const
-{
- if (binaryFormat)
- {
- *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
- }
-
- angle::MemoryBuffer memoryBuf;
- MemoryProgramCache::Serialize(context, this, &memoryBuf);
-
- GLsizei streamLength = static_cast<GLsizei>(memoryBuf.size());
- const uint8_t *streamState = memoryBuf.data();
-
- if (streamLength > bufSize)
- {
- if (length)
- {
- *length = 0;
- }
-
- // TODO: This should be moved to the validation layer but computing the size of the binary before saving
- // it causes the save to happen twice. It may be possible to write the binary to a separate buffer, validate
- // sizes and then copy it.
- return InternalError();
- }
-
- if (binary)
- {
- char *ptr = reinterpret_cast<char*>(binary);
-
- memcpy(ptr, streamState, streamLength);
- ptr += streamLength;
-
- ASSERT(ptr - streamLength == binary);
- }
-
- if (length)
- {
- *length = streamLength;
- }
-
- return NoError();
-}
-
-GLint Program::getBinaryLength(const Context *context) const
-{
- GLint length;
- Error error = saveBinary(context, nullptr, nullptr, std::numeric_limits<GLint>::max(), &length);
- if (error.isError())
- {
- return 0;
- }
-
- return length;
-}
-
-void Program::setBinaryRetrievableHint(bool retrievable)
-{
- // TODO(jmadill) : replace with dirty bits
- mProgram->setBinaryRetrievableHint(retrievable);
- mState.mBinaryRetrieveableHint = retrievable;
-}
-
-bool Program::getBinaryRetrievableHint() const
-{
- return mState.mBinaryRetrieveableHint;
-}
-
-void Program::setSeparable(bool separable)
-{
- // TODO(yunchao) : replace with dirty bits
- if (mState.mSeparable != separable)
- {
- mProgram->setSeparable(separable);
- mState.mSeparable = separable;
- }
-}
-
-bool Program::isSeparable() const
-{
- return mState.mSeparable;
-}
-
-void Program::release(const Context *context)
-{
- mRefCount--;
-
- if (mRefCount == 0 && mDeleteStatus)
- {
- mResourceManager->deleteProgram(context, mHandle);
- }
-}
-
-void Program::addRef()
-{
- mRefCount++;
-}
-
-unsigned int Program::getRefCount() const
-{
- return mRefCount;
-}
-
-int Program::getInfoLogLength() const
-{
- return static_cast<int>(mInfoLog.getLength());
-}
-
-void Program::getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const
-{
- return mInfoLog.getLog(bufSize, length, infoLog);
-}
-
-void Program::getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders) const
-{
- int total = 0;
-
- if (mState.mAttachedComputeShader)
- {
- if (total < maxCount)
- {
- shaders[total] = mState.mAttachedComputeShader->getHandle();
- total++;
- }
- }
-
- if (mState.mAttachedVertexShader)
- {
- if (total < maxCount)
- {
- shaders[total] = mState.mAttachedVertexShader->getHandle();
- total++;
- }
- }
-
- if (mState.mAttachedFragmentShader)
- {
- if (total < maxCount)
- {
- shaders[total] = mState.mAttachedFragmentShader->getHandle();
- total++;
- }
- }
-
- if (mState.mAttachedGeometryShader)
- {
- if (total < maxCount)
- {
- shaders[total] = mState.mAttachedGeometryShader->getHandle();
- total++;
- }
- }
-
- if (count)
- {
- *count = total;
- }
-}
-
-GLuint Program::getAttributeLocation(const std::string &name) const
-{
- return mState.getAttributeLocation(name);
-}
-
-bool Program::isAttribLocationActive(size_t attribLocation) const
-{
- ASSERT(attribLocation < mState.mActiveAttribLocationsMask.size());
- return mState.mActiveAttribLocationsMask[attribLocation];
-}
-
-void Program::getActiveAttribute(GLuint index,
- GLsizei bufsize,
- GLsizei *length,
- GLint *size,
- GLenum *type,
- GLchar *name) const
-{
- if (!mLinked)
- {
- if (bufsize > 0)
- {
- name[0] = '\0';
- }
-
- if (length)
- {
- *length = 0;
- }
-
- *type = GL_NONE;
- *size = 1;
- return;
- }
-
- ASSERT(index < mState.mAttributes.size());
- const sh::Attribute &attrib = mState.mAttributes[index];
-
- if (bufsize > 0)
- {
- CopyStringToBuffer(name, attrib.name, bufsize, length);
- }
-
- // Always a single 'type' instance
- *size = 1;
- *type = attrib.type;
-}
-
-GLint Program::getActiveAttributeCount() const
-{
- if (!mLinked)
- {
- return 0;
- }
-
- return static_cast<GLint>(mState.mAttributes.size());
-}
-
-GLint Program::getActiveAttributeMaxLength() const
-{
- if (!mLinked)
- {
- return 0;
- }
-
- size_t maxLength = 0;
-
- for (const sh::Attribute &attrib : mState.mAttributes)
- {
- maxLength = std::max(attrib.name.length() + 1, maxLength);
- }
-
- return static_cast<GLint>(maxLength);
-}
-
-GLuint Program::getInputResourceIndex(const GLchar *name) const
-{
- return GetResourceIndexFromName(mState.mAttributes, std::string(name));
-}
-
-GLuint Program::getOutputResourceIndex(const GLchar *name) const
-{
- return GetResourceIndexFromName(mState.mOutputVariables, std::string(name));
-}
-
-size_t Program::getOutputResourceCount() const
-{
- return (mLinked ? mState.mOutputVariables.size() : 0);
-}
-
-template <typename T>
-void Program::getResourceName(GLuint index,
- const std::vector<T> &resources,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *name) const
-{
- if (length)
- {
- *length = 0;
- }
-
- if (!mLinked)
- {
- if (bufSize > 0)
- {
- name[0] = '\0';
- }
- return;
- }
- ASSERT(index < resources.size());
- const auto &resource = resources[index];
-
- if (bufSize > 0)
- {
- CopyStringToBuffer(name, resource.name, bufSize, length);
- }
-}
-
-void Program::getInputResourceName(GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *name) const
-{
- getResourceName(index, mState.mAttributes, bufSize, length, name);
-}
-
-void Program::getOutputResourceName(GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *name) const
-{
- getResourceName(index, mState.mOutputVariables, bufSize, length, name);
-}
-
-void Program::getUniformResourceName(GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *name) const
-{
- getResourceName(index, mState.mUniforms, bufSize, length, name);
-}
-
-void Program::getBufferVariableResourceName(GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *name) const
-{
- getResourceName(index, mState.mBufferVariables, bufSize, length, name);
-}
-
-const sh::Attribute &Program::getInputResource(GLuint index) const
-{
- ASSERT(index < mState.mAttributes.size());
- return mState.mAttributes[index];
-}
-
-const sh::OutputVariable &Program::getOutputResource(GLuint index) const
-{
- ASSERT(index < mState.mOutputVariables.size());
- return mState.mOutputVariables[index];
-}
-
-GLint Program::getFragDataLocation(const std::string &name) const
-{
- return GetVariableLocation(mState.mOutputVariables, mState.mOutputLocations, name);
-}
-
-void Program::getActiveUniform(GLuint index,
- GLsizei bufsize,
- GLsizei *length,
- GLint *size,
- GLenum *type,
- GLchar *name) const
-{
- if (mLinked)
- {
- // index must be smaller than getActiveUniformCount()
- ASSERT(index < mState.mUniforms.size());
- const LinkedUniform &uniform = mState.mUniforms[index];
-
- if (bufsize > 0)
- {
- std::string string = uniform.name;
- CopyStringToBuffer(name, string, bufsize, length);
- }
-
- *size = clampCast<GLint>(uniform.getBasicTypeElementCount());
- *type = uniform.type;
- }
- else
- {
- if (bufsize > 0)
- {
- name[0] = '\0';
- }
-
- if (length)
- {
- *length = 0;
- }
-
- *size = 0;
- *type = GL_NONE;
- }
-}
-
-GLint Program::getActiveUniformCount() const
-{
- if (mLinked)
- {
- return static_cast<GLint>(mState.mUniforms.size());
- }
- else
- {
- return 0;
- }
-}
-
-size_t Program::getActiveBufferVariableCount() const
-{
- return mLinked ? mState.mBufferVariables.size() : 0;
-}
-
-GLint Program::getActiveUniformMaxLength() const
-{
- size_t maxLength = 0;
-
- if (mLinked)
- {
- for (const LinkedUniform &uniform : mState.mUniforms)
- {
- if (!uniform.name.empty())
- {
- size_t length = uniform.name.length() + 1u;
- if (uniform.isArray())
- {
- length += 3; // Counting in "[0]".
- }
- maxLength = std::max(length, maxLength);
- }
- }
- }
-
- return static_cast<GLint>(maxLength);
-}
-
-bool Program::isValidUniformLocation(GLint location) const
-{
- ASSERT(angle::IsValueInRangeForNumericType<GLint>(mState.mUniformLocations.size()));
- return (location >= 0 && static_cast<size_t>(location) < mState.mUniformLocations.size() &&
- mState.mUniformLocations[static_cast<size_t>(location)].used());
-}
-
-const LinkedUniform &Program::getUniformByLocation(GLint location) const
-{
- ASSERT(location >= 0 && static_cast<size_t>(location) < mState.mUniformLocations.size());
- return mState.mUniforms[mState.getUniformIndexFromLocation(location)];
-}
-
-const VariableLocation &Program::getUniformLocation(GLint location) const
-{
- ASSERT(location >= 0 && static_cast<size_t>(location) < mState.mUniformLocations.size());
- return mState.mUniformLocations[location];
-}
-
-const std::vector<VariableLocation> &Program::getUniformLocations() const
-{
- return mState.mUniformLocations;
-}
-
-const LinkedUniform &Program::getUniformByIndex(GLuint index) const
-{
- ASSERT(index < static_cast<size_t>(mState.mUniforms.size()));
- return mState.mUniforms[index];
-}
-
-const BufferVariable &Program::getBufferVariableByIndex(GLuint index) const
-{
- ASSERT(index < static_cast<size_t>(mState.mBufferVariables.size()));
- return mState.mBufferVariables[index];
-}
-
-GLint Program::getUniformLocation(const std::string &name) const
-{
- return GetVariableLocation(mState.mUniforms, mState.mUniformLocations, name);
-}
-
-GLuint Program::getUniformIndex(const std::string &name) const
-{
- return mState.getUniformIndexFromName(name);
-}
-
-void Program::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
-{
- const VariableLocation &locationInfo = mState.mUniformLocations[location];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 1, v);
- mProgram->setUniform1fv(location, clampedCount, v);
-}
-
-void Program::setUniform2fv(GLint location, GLsizei count, const GLfloat *v)
-{
- const VariableLocation &locationInfo = mState.mUniformLocations[location];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 2, v);
- mProgram->setUniform2fv(location, clampedCount, v);
-}
-
-void Program::setUniform3fv(GLint location, GLsizei count, const GLfloat *v)
-{
- const VariableLocation &locationInfo = mState.mUniformLocations[location];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 3, v);
- mProgram->setUniform3fv(location, clampedCount, v);
-}
-
-void Program::setUniform4fv(GLint location, GLsizei count, const GLfloat *v)
-{
- const VariableLocation &locationInfo = mState.mUniformLocations[location];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 4, v);
- mProgram->setUniform4fv(location, clampedCount, v);
-}
-
-Program::SetUniformResult Program::setUniform1iv(GLint location, GLsizei count, const GLint *v)
-{
- const VariableLocation &locationInfo = mState.mUniformLocations[location];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 1, v);
-
- mProgram->setUniform1iv(location, clampedCount, v);
-
- if (mState.isSamplerUniformIndex(locationInfo.index))
- {
- updateSamplerUniform(locationInfo, clampedCount, v);
- return SetUniformResult::SamplerChanged;
- }
-
- return SetUniformResult::NoSamplerChange;
-}
-
-void Program::setUniform2iv(GLint location, GLsizei count, const GLint *v)
-{
- const VariableLocation &locationInfo = mState.mUniformLocations[location];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 2, v);
- mProgram->setUniform2iv(location, clampedCount, v);
-}
-
-void Program::setUniform3iv(GLint location, GLsizei count, const GLint *v)
-{
- const VariableLocation &locationInfo = mState.mUniformLocations[location];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 3, v);
- mProgram->setUniform3iv(location, clampedCount, v);
-}
-
-void Program::setUniform4iv(GLint location, GLsizei count, const GLint *v)
-{
- const VariableLocation &locationInfo = mState.mUniformLocations[location];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 4, v);
- mProgram->setUniform4iv(location, clampedCount, v);
-}
-
-void Program::setUniform1uiv(GLint location, GLsizei count, const GLuint *v)
-{
- const VariableLocation &locationInfo = mState.mUniformLocations[location];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 1, v);
- mProgram->setUniform1uiv(location, clampedCount, v);
-}
-
-void Program::setUniform2uiv(GLint location, GLsizei count, const GLuint *v)
-{
- const VariableLocation &locationInfo = mState.mUniformLocations[location];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 2, v);
- mProgram->setUniform2uiv(location, clampedCount, v);
-}
-
-void Program::setUniform3uiv(GLint location, GLsizei count, const GLuint *v)
-{
- const VariableLocation &locationInfo = mState.mUniformLocations[location];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 3, v);
- mProgram->setUniform3uiv(location, clampedCount, v);
-}
-
-void Program::setUniform4uiv(GLint location, GLsizei count, const GLuint *v)
-{
- const VariableLocation &locationInfo = mState.mUniformLocations[location];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 4, v);
- mProgram->setUniform4uiv(location, clampedCount, v);
-}
-
-void Program::setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *v)
-{
- GLsizei clampedCount = clampMatrixUniformCount<2, 2>(location, count, transpose, v);
- mProgram->setUniformMatrix2fv(location, clampedCount, transpose, v);
-}
-
-void Program::setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *v)
-{
- GLsizei clampedCount = clampMatrixUniformCount<3, 3>(location, count, transpose, v);
- mProgram->setUniformMatrix3fv(location, clampedCount, transpose, v);
-}
-
-void Program::setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *v)
-{
- GLsizei clampedCount = clampMatrixUniformCount<4, 4>(location, count, transpose, v);
- mProgram->setUniformMatrix4fv(location, clampedCount, transpose, v);
-}
-
-void Program::setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *v)
-{
- GLsizei clampedCount = clampMatrixUniformCount<2, 3>(location, count, transpose, v);
- mProgram->setUniformMatrix2x3fv(location, clampedCount, transpose, v);
-}
-
-void Program::setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *v)
-{
- GLsizei clampedCount = clampMatrixUniformCount<2, 4>(location, count, transpose, v);
- mProgram->setUniformMatrix2x4fv(location, clampedCount, transpose, v);
-}
-
-void Program::setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *v)
-{
- GLsizei clampedCount = clampMatrixUniformCount<3, 2>(location, count, transpose, v);
- mProgram->setUniformMatrix3x2fv(location, clampedCount, transpose, v);
-}
-
-void Program::setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *v)
-{
- GLsizei clampedCount = clampMatrixUniformCount<3, 4>(location, count, transpose, v);
- mProgram->setUniformMatrix3x4fv(location, clampedCount, transpose, v);
-}
-
-void Program::setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *v)
-{
- GLsizei clampedCount = clampMatrixUniformCount<4, 2>(location, count, transpose, v);
- mProgram->setUniformMatrix4x2fv(location, clampedCount, transpose, v);
-}
-
-void Program::setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *v)
-{
- GLsizei clampedCount = clampMatrixUniformCount<4, 3>(location, count, transpose, v);
- mProgram->setUniformMatrix4x3fv(location, clampedCount, transpose, v);
-}
-
-void Program::getUniformfv(const Context *context, GLint location, GLfloat *v) const
-{
- const auto &uniformLocation = mState.getUniformLocations()[location];
- const auto &uniform = mState.getUniforms()[uniformLocation.index];
-
- GLenum nativeType = gl::VariableComponentType(uniform.type);
- if (nativeType == GL_FLOAT)
- {
- mProgram->getUniformfv(context, location, v);
- }
- else
- {
- getUniformInternal(context, v, location, nativeType,
- gl::VariableComponentCount(uniform.type));
- }
-}
-
-void Program::getUniformiv(const Context *context, GLint location, GLint *v) const
-{
- const auto &uniformLocation = mState.getUniformLocations()[location];
- const auto &uniform = mState.getUniforms()[uniformLocation.index];
-
- GLenum nativeType = gl::VariableComponentType(uniform.type);
- if (nativeType == GL_INT || nativeType == GL_BOOL)
- {
- mProgram->getUniformiv(context, location, v);
- }
- else
- {
- getUniformInternal(context, v, location, nativeType,
- gl::VariableComponentCount(uniform.type));
- }
-}
-
-void Program::getUniformuiv(const Context *context, GLint location, GLuint *v) const
-{
- const auto &uniformLocation = mState.getUniformLocations()[location];
- const auto &uniform = mState.getUniforms()[uniformLocation.index];
-
- GLenum nativeType = gl::VariableComponentType(uniform.type);
- if (nativeType == GL_UNSIGNED_INT)
- {
- mProgram->getUniformuiv(context, location, v);
- }
- else
- {
- getUniformInternal(context, v, location, nativeType,
- gl::VariableComponentCount(uniform.type));
- }
-}
-
-void Program::flagForDeletion()
-{
- mDeleteStatus = true;
-}
-
-bool Program::isFlaggedForDeletion() const
-{
- return mDeleteStatus;
-}
-
-void Program::validate(const Caps &caps)
-{
- mInfoLog.reset();
-
- if (mLinked)
- {
- mValidated = ConvertToBool(mProgram->validate(caps, &mInfoLog));
- }
- else
- {
- mInfoLog << "Program has not been successfully linked.";
- }
-}
-
-bool Program::validateSamplers(InfoLog *infoLog, const Caps &caps)
-{
- // Skip cache if we're using an infolog, so we get the full error.
- // Also skip the cache if the sample mapping has changed, or if we haven't ever validated.
- if (infoLog == nullptr && mCachedValidateSamplersResult.valid())
- {
- return mCachedValidateSamplersResult.value();
- }
-
- if (mTextureUnitTypesCache.empty())
- {
- mTextureUnitTypesCache.resize(caps.maxCombinedTextureImageUnits, GL_NONE);
- }
- else
- {
- std::fill(mTextureUnitTypesCache.begin(), mTextureUnitTypesCache.end(), GL_NONE);
- }
-
- // if any two active samplers in a program are of different types, but refer to the same
- // texture image unit, and this is the current program, then ValidateProgram will fail, and
- // DrawArrays and DrawElements will issue the INVALID_OPERATION error.
- for (const auto &samplerBinding : mState.mSamplerBindings)
- {
- if (samplerBinding.unreferenced)
- continue;
-
- GLenum textureType = samplerBinding.textureType;
-
- for (GLuint textureUnit : samplerBinding.boundTextureUnits)
- {
- if (textureUnit >= caps.maxCombinedTextureImageUnits)
- {
- if (infoLog)
- {
- (*infoLog) << "Sampler uniform (" << textureUnit
- << ") exceeds GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS ("
- << caps.maxCombinedTextureImageUnits << ")";
- }
-
- mCachedValidateSamplersResult = false;
- return false;
- }
-
- if (mTextureUnitTypesCache[textureUnit] != GL_NONE)
- {
- if (textureType != mTextureUnitTypesCache[textureUnit])
- {
- if (infoLog)
- {
- (*infoLog) << "Samplers of conflicting types refer to the same texture "
- "image unit ("
- << textureUnit << ").";
- }
-
- mCachedValidateSamplersResult = false;
- return false;
- }
- }
- else
- {
- mTextureUnitTypesCache[textureUnit] = textureType;
- }
- }
- }
-
- mCachedValidateSamplersResult = true;
- return true;
-}
-
-bool Program::isValidated() const
-{
- return mValidated;
-}
-
-GLuint Program::getActiveUniformBlockCount() const
-{
- return static_cast<GLuint>(mState.mUniformBlocks.size());
-}
-
-GLuint Program::getActiveAtomicCounterBufferCount() const
-{
- return static_cast<GLuint>(mState.mAtomicCounterBuffers.size());
-}
-
-GLuint Program::getActiveShaderStorageBlockCount() const
-{
- return static_cast<GLuint>(mState.mShaderStorageBlocks.size());
-}
-
-void Program::getActiveUniformBlockName(const GLuint blockIndex,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *blockName) const
-{
- GetInterfaceBlockName(blockIndex, mState.mUniformBlocks, bufSize, length, blockName);
-}
-
-void Program::getActiveShaderStorageBlockName(const GLuint blockIndex,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *blockName) const
-{
-
- GetInterfaceBlockName(blockIndex, mState.mShaderStorageBlocks, bufSize, length, blockName);
-}
-
-GLint Program::getActiveUniformBlockMaxLength() const
-{
- int maxLength = 0;
-
- if (mLinked)
- {
- unsigned int numUniformBlocks = static_cast<unsigned int>(mState.mUniformBlocks.size());
- for (unsigned int uniformBlockIndex = 0; uniformBlockIndex < numUniformBlocks; uniformBlockIndex++)
- {
- const InterfaceBlock &uniformBlock = mState.mUniformBlocks[uniformBlockIndex];
- if (!uniformBlock.name.empty())
- {
- int length = static_cast<int>(uniformBlock.nameWithArrayIndex().length());
- maxLength = std::max(length + 1, maxLength);
- }
- }
- }
-
- return maxLength;
-}
-
-GLuint Program::getUniformBlockIndex(const std::string &name) const
-{
- return GetInterfaceBlockIndex(mState.mUniformBlocks, name);
-}
-
-GLuint Program::getShaderStorageBlockIndex(const std::string &name) const
-{
- return GetInterfaceBlockIndex(mState.mShaderStorageBlocks, name);
-}
-
-const InterfaceBlock &Program::getUniformBlockByIndex(GLuint index) const
-{
- ASSERT(index < static_cast<GLuint>(mState.mUniformBlocks.size()));
- return mState.mUniformBlocks[index];
-}
-
-const InterfaceBlock &Program::getShaderStorageBlockByIndex(GLuint index) const
-{
- ASSERT(index < static_cast<GLuint>(mState.mShaderStorageBlocks.size()));
- return mState.mShaderStorageBlocks[index];
-}
-
-void Program::bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
- mState.mUniformBlocks[uniformBlockIndex].binding = uniformBlockBinding;
- mState.mActiveUniformBlockBindings.set(uniformBlockIndex, uniformBlockBinding != 0);
- mProgram->setUniformBlockBinding(uniformBlockIndex, uniformBlockBinding);
-}
-
-GLuint Program::getUniformBlockBinding(GLuint uniformBlockIndex) const
-{
- return mState.getUniformBlockBinding(uniformBlockIndex);
-}
-
-GLuint Program::getShaderStorageBlockBinding(GLuint shaderStorageBlockIndex) const
-{
- return mState.getShaderStorageBlockBinding(shaderStorageBlockIndex);
-}
-
-void Program::setTransformFeedbackVaryings(GLsizei count, const GLchar *const *varyings, GLenum bufferMode)
-{
- mState.mTransformFeedbackVaryingNames.resize(count);
- for (GLsizei i = 0; i < count; i++)
- {
- mState.mTransformFeedbackVaryingNames[i] = varyings[i];
- }
-
- mState.mTransformFeedbackBufferMode = bufferMode;
-}
-
-void Program::getTransformFeedbackVarying(GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name) const
-{
- if (mLinked)
- {
- ASSERT(index < mState.mLinkedTransformFeedbackVaryings.size());
- const auto &var = mState.mLinkedTransformFeedbackVaryings[index];
- std::string varName = var.nameWithArrayIndex();
- GLsizei lastNameIdx = std::min(bufSize - 1, static_cast<GLsizei>(varName.length()));
- if (length)
- {
- *length = lastNameIdx;
- }
- if (size)
- {
- *size = var.size();
- }
- if (type)
- {
- *type = var.type;
- }
- if (name)
- {
- memcpy(name, varName.c_str(), lastNameIdx);
- name[lastNameIdx] = '\0';
- }
- }
-}
-
-GLsizei Program::getTransformFeedbackVaryingCount() const
-{
- if (mLinked)
- {
- return static_cast<GLsizei>(mState.mLinkedTransformFeedbackVaryings.size());
- }
- else
- {
- return 0;
- }
-}
-
-GLsizei Program::getTransformFeedbackVaryingMaxLength() const
-{
- if (mLinked)
- {
- GLsizei maxSize = 0;
- for (const auto &var : mState.mLinkedTransformFeedbackVaryings)
- {
- maxSize =
- std::max(maxSize, static_cast<GLsizei>(var.nameWithArrayIndex().length() + 1));
- }
-
- return maxSize;
- }
- else
- {
- return 0;
- }
-}
-
-GLenum Program::getTransformFeedbackBufferMode() const
-{
- return mState.mTransformFeedbackBufferMode;
-}
-
-bool Program::linkVaryings(const Context *context, InfoLog &infoLog) const
-{
- Shader *vertexShader = mState.mAttachedVertexShader;
- Shader *fragmentShader = mState.mAttachedFragmentShader;
-
- ASSERT(vertexShader->getShaderVersion(context) == fragmentShader->getShaderVersion(context));
-
- const std::vector<sh::Varying> &vertexVaryings = vertexShader->getOutputVaryings(context);
- const std::vector<sh::Varying> &fragmentVaryings = fragmentShader->getInputVaryings(context);
-
- std::map<GLuint, std::string> staticFragmentInputLocations;
-
- for (const sh::Varying &output : fragmentVaryings)
- {
- bool matched = false;
-
- // Built-in varyings obey special rules
- if (output.isBuiltIn())
- {
- continue;
- }
-
- for (const sh::Varying &input : vertexVaryings)
- {
- if (output.name == input.name)
- {
- ASSERT(!input.isBuiltIn());
- if (!linkValidateVaryings(infoLog, output.name, input, output,
- vertexShader->getShaderVersion(context)))
- {
- return false;
- }
-
- matched = true;
- break;
- }
- }
-
- // We permit unmatched, unreferenced varyings
- if (!matched && output.staticUse)
- {
- infoLog << "Fragment varying " << output.name << " does not match any vertex varying";
- return false;
- }
-
- // Check for aliased path rendering input bindings (if any).
- // If more than one binding refer statically to the same
- // location the link must fail.
-
- if (!output.staticUse)
- continue;
-
- const auto inputBinding = mFragmentInputBindings.getBinding(output.name);
- if (inputBinding == -1)
- continue;
-
- const auto it = staticFragmentInputLocations.find(inputBinding);
- if (it == std::end(staticFragmentInputLocations))
- {
- staticFragmentInputLocations.insert(std::make_pair(inputBinding, output.name));
- }
- else
- {
- infoLog << "Binding for fragment input " << output.name << " conflicts with "
- << it->second;
- return false;
- }
- }
-
- if (!linkValidateBuiltInVaryings(context, infoLog))
- {
- return false;
- }
-
- // TODO(jmadill): verify no unmatched vertex varyings?
-
- return true;
-}
-
-bool Program::linkUniforms(const Context *context,
- InfoLog &infoLog,
- const Bindings &uniformLocationBindings)
-{
- UniformLinker linker(mState);
- if (!linker.link(context, infoLog, uniformLocationBindings))
- {
- return false;
- }
-
- linker.getResults(&mState.mUniforms, &mState.mUniformLocations);
-
- linkSamplerAndImageBindings();
-
- if (!linkAtomicCounterBuffers())
- {
- return false;
- }
-
- return true;
-}
-
-void Program::linkSamplerAndImageBindings()
-{
- unsigned int high = static_cast<unsigned int>(mState.mUniforms.size());
- unsigned int low = high;
-
- for (auto counterIter = mState.mUniforms.rbegin();
- counterIter != mState.mUniforms.rend() && counterIter->isAtomicCounter(); ++counterIter)
- {
- --low;
- }
-
- mState.mAtomicCounterUniformRange = RangeUI(low, high);
-
- high = low;
-
- for (auto imageIter = mState.mUniforms.rbegin();
- imageIter != mState.mUniforms.rend() && imageIter->isImage(); ++imageIter)
- {
- --low;
- }
-
- mState.mImageUniformRange = RangeUI(low, high);
-
- // If uniform is a image type, insert it into the mImageBindings array.
- for (unsigned int imageIndex : mState.mImageUniformRange)
- {
- // ES3.1 (section 7.6.1) and GLSL ES3.1 (section 4.4.5), Uniform*i{v} commands
- // cannot load values into a uniform defined as an image. if declare without a
- // binding qualifier, any uniform image variable (include all elements of
- // unbound image array) shoud be bound to unit zero.
- auto &imageUniform = mState.mUniforms[imageIndex];
- if (imageUniform.binding == -1)
- {
- mState.mImageBindings.emplace_back(
- ImageBinding(imageUniform.getBasicTypeElementCount()));
- }
- else
- {
- mState.mImageBindings.emplace_back(
- ImageBinding(imageUniform.binding, imageUniform.getBasicTypeElementCount()));
- }
- }
-
- high = low;
-
- for (auto samplerIter = mState.mUniforms.rbegin() + mState.mImageUniformRange.length();
- samplerIter != mState.mUniforms.rend() && samplerIter->isSampler(); ++samplerIter)
- {
- --low;
- }
-
- mState.mSamplerUniformRange = RangeUI(low, high);
-
- // If uniform is a sampler type, insert it into the mSamplerBindings array.
- for (unsigned int samplerIndex : mState.mSamplerUniformRange)
- {
- const auto &samplerUniform = mState.mUniforms[samplerIndex];
- GLenum textureType = SamplerTypeToTextureType(samplerUniform.type);
- mState.mSamplerBindings.emplace_back(
- SamplerBinding(textureType, samplerUniform.getBasicTypeElementCount(), false));
- }
-}
-
-bool Program::linkAtomicCounterBuffers()
-{
- for (unsigned int index : mState.mAtomicCounterUniformRange)
- {
- auto &uniform = mState.mUniforms[index];
- bool found = false;
- for (unsigned int bufferIndex = 0; bufferIndex < mState.mAtomicCounterBuffers.size();
- ++bufferIndex)
- {
- auto &buffer = mState.mAtomicCounterBuffers[bufferIndex];
- if (buffer.binding == uniform.binding)
- {
- buffer.memberIndexes.push_back(index);
- uniform.bufferIndex = bufferIndex;
- found = true;
- buffer.unionReferencesWith(uniform);
- break;
- }
- }
- if (!found)
- {
- AtomicCounterBuffer atomicCounterBuffer;
- atomicCounterBuffer.binding = uniform.binding;
- atomicCounterBuffer.memberIndexes.push_back(index);
- atomicCounterBuffer.unionReferencesWith(uniform);
- mState.mAtomicCounterBuffers.push_back(atomicCounterBuffer);
- uniform.bufferIndex = static_cast<int>(mState.mAtomicCounterBuffers.size() - 1);
- }
- }
- // TODO(jie.a.chen@intel.com): Count each atomic counter buffer to validate against
- // gl_Max[Vertex|Fragment|Compute|Combined]AtomicCounterBuffers.
-
- return true;
-}
-
-bool Program::linkValidateInterfaceBlockFields(InfoLog &infoLog,
- const std::string &uniformName,
- const sh::InterfaceBlockField &vertexUniform,
- const sh::InterfaceBlockField &fragmentUniform,
- bool webglCompatibility)
-{
- // If webgl, validate precision of UBO fields, otherwise don't. See Khronos bug 10287.
- if (!linkValidateVariablesBase(infoLog, uniformName, vertexUniform, fragmentUniform,
- webglCompatibility))
- {
- return false;
- }
-
- if (vertexUniform.isRowMajorLayout != fragmentUniform.isRowMajorLayout)
- {
- infoLog << "Matrix packings for " << uniformName << " differ between vertex and fragment shaders";
- return false;
- }
-
- return true;
-}
-
-// Assigns locations to all attributes from the bindings and program locations.
-bool Program::linkAttributes(const Context *context, InfoLog &infoLog)
-{
- const ContextState &data = context->getContextState();
- auto *vertexShader = mState.getAttachedVertexShader();
-
- unsigned int usedLocations = 0;
- mState.mAttributes = vertexShader->getActiveAttributes(context);
- GLuint maxAttribs = data.getCaps().maxVertexAttributes;
-
- // TODO(jmadill): handle aliasing robustly
- if (mState.mAttributes.size() > maxAttribs)
- {
- infoLog << "Too many vertex attributes.";
- return false;
- }
-
- std::vector<sh::Attribute *> usedAttribMap(maxAttribs, nullptr);
-
- // Link attributes that have a binding location
- for (sh::Attribute &attribute : mState.mAttributes)
- {
- // GLSL ES 3.10 January 2016 section 4.3.4: Vertex shader inputs can't be arrays or
- // structures, so we don't need to worry about adjusting their names or generating entries
- // for each member/element (unlike uniforms for example).
- ASSERT(!attribute.isArray() && !attribute.isStruct());
-
- int bindingLocation = mAttributeBindings.getBinding(attribute.name);
- if (attribute.location == -1 && bindingLocation != -1)
- {
- attribute.location = bindingLocation;
- }
-
- if (attribute.location != -1)
- {
- // Location is set by glBindAttribLocation or by location layout qualifier
- const int regs = VariableRegisterCount(attribute.type);
-
- if (static_cast<GLuint>(regs + attribute.location) > maxAttribs)
- {
- infoLog << "Active attribute (" << attribute.name << ") at location "
- << attribute.location << " is too big to fit";
-
- return false;
- }
-
- for (int reg = 0; reg < regs; reg++)
- {
- const int regLocation = attribute.location + reg;
- sh::ShaderVariable *linkedAttribute = usedAttribMap[regLocation];
-
- // In GLSL 3.00, attribute aliasing produces a link error
- // In GLSL 1.00, attribute aliasing is allowed, but ANGLE currently has a bug
- if (linkedAttribute)
- {
- // TODO(jmadill): fix aliasing on ES2
- // if (mProgram->getShaderVersion() >= 300)
- {
- infoLog << "Attribute '" << attribute.name << "' aliases attribute '"
- << linkedAttribute->name << "' at location " << regLocation;
- return false;
- }
- }
- else
- {
- usedAttribMap[regLocation] = &attribute;
- }
-
- usedLocations |= 1 << regLocation;
- }
- }
- }
-
- // Link attributes that don't have a binding location
- for (sh::Attribute &attribute : mState.mAttributes)
- {
- // Not set by glBindAttribLocation or by location layout qualifier
- if (attribute.location == -1)
- {
- int regs = VariableRegisterCount(attribute.type);
- int availableIndex = AllocateFirstFreeBits(&usedLocations, regs, maxAttribs);
-
- if (availableIndex == -1 || static_cast<GLuint>(availableIndex + regs) > maxAttribs)
- {
- infoLog << "Too many active attributes (" << attribute.name << ")";
- return false;
- }
-
- attribute.location = availableIndex;
- }
- }
-
- for (const sh::Attribute &attribute : mState.mAttributes)
- {
- ASSERT(attribute.location != -1);
- unsigned int regs = static_cast<unsigned int>(VariableRegisterCount(attribute.type));
-
- for (unsigned int r = 0; r < regs; r++)
- {
- unsigned int location = static_cast<unsigned int>(attribute.location) + r;
- mState.mActiveAttribLocationsMask.set(location);
- mState.mMaxActiveAttribLocation =
- std::max(mState.mMaxActiveAttribLocation, location + 1);
- }
- }
-
- return true;
-}
-
-bool Program::validateVertexAndFragmentInterfaceBlocks(
- const std::vector<sh::InterfaceBlock> &vertexInterfaceBlocks,
- const std::vector<sh::InterfaceBlock> &fragmentInterfaceBlocks,
- InfoLog &infoLog,
- bool webglCompatibility) const
-{
- // Check that interface blocks defined in the vertex and fragment shaders are identical
- typedef std::map<std::string, const sh::InterfaceBlock *> InterfaceBlockMap;
- InterfaceBlockMap linkedInterfaceBlocks;
-
- for (const sh::InterfaceBlock &vertexInterfaceBlock : vertexInterfaceBlocks)
- {
- linkedInterfaceBlocks[vertexInterfaceBlock.name] = &vertexInterfaceBlock;
- }
-
- for (const sh::InterfaceBlock &fragmentInterfaceBlock : fragmentInterfaceBlocks)
- {
- auto entry = linkedInterfaceBlocks.find(fragmentInterfaceBlock.name);
- if (entry != linkedInterfaceBlocks.end())
- {
- const sh::InterfaceBlock &vertexInterfaceBlock = *entry->second;
- if (!areMatchingInterfaceBlocks(infoLog, vertexInterfaceBlock, fragmentInterfaceBlock,
- webglCompatibility))
- {
- return false;
- }
- }
- // TODO(jiajia.qin@intel.com): Add
- // MAX_COMBINED_UNIFORM_BLOCKS/MAX_COMBINED_SHADER_STORAGE_BLOCKS validation.
- }
- return true;
-}
-
-bool Program::linkInterfaceBlocks(const Context *context, InfoLog &infoLog)
-{
- const auto &caps = context->getCaps();
-
- if (mState.mAttachedComputeShader)
- {
- Shader &computeShader = *mState.mAttachedComputeShader;
- const auto &computeUniformBlocks = computeShader.getUniformBlocks(context);
-
- if (!validateInterfaceBlocksCount(
- caps.maxComputeUniformBlocks, computeUniformBlocks,
- "Compute shader uniform block count exceeds GL_MAX_COMPUTE_UNIFORM_BLOCKS (",
- infoLog))
- {
- return false;
- }
-
- const auto &computeShaderStorageBlocks = computeShader.getShaderStorageBlocks(context);
- if (!validateInterfaceBlocksCount(caps.maxComputeShaderStorageBlocks,
- computeShaderStorageBlocks,
- "Compute shader shader storage block count exceeds "
- "GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS (",
- infoLog))
- {
- return false;
- }
- return true;
- }
-
- Shader &vertexShader = *mState.mAttachedVertexShader;
- Shader &fragmentShader = *mState.mAttachedFragmentShader;
-
- const auto &vertexUniformBlocks = vertexShader.getUniformBlocks(context);
- const auto &fragmentUniformBlocks = fragmentShader.getUniformBlocks(context);
-
- if (!validateInterfaceBlocksCount(
- caps.maxVertexUniformBlocks, vertexUniformBlocks,
- "Vertex shader uniform block count exceeds GL_MAX_VERTEX_UNIFORM_BLOCKS (", infoLog))
- {
- return false;
- }
- if (!validateInterfaceBlocksCount(
- caps.maxFragmentUniformBlocks, fragmentUniformBlocks,
- "Fragment shader uniform block count exceeds GL_MAX_FRAGMENT_UNIFORM_BLOCKS (",
- infoLog))
- {
-
- return false;
- }
-
- bool webglCompatibility = context->getExtensions().webglCompatibility;
- if (!validateVertexAndFragmentInterfaceBlocks(vertexUniformBlocks, fragmentUniformBlocks,
- infoLog, webglCompatibility))
- {
- return false;
- }
-
- if (context->getClientVersion() >= Version(3, 1))
- {
- const auto &vertexShaderStorageBlocks = vertexShader.getShaderStorageBlocks(context);
- const auto &fragmentShaderStorageBlocks = fragmentShader.getShaderStorageBlocks(context);
-
- if (!validateInterfaceBlocksCount(caps.maxVertexShaderStorageBlocks,
- vertexShaderStorageBlocks,
- "Vertex shader shader storage block count exceeds "
- "GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS (",
- infoLog))
- {
- return false;
- }
- if (!validateInterfaceBlocksCount(caps.maxFragmentShaderStorageBlocks,
- fragmentShaderStorageBlocks,
- "Fragment shader shader storage block count exceeds "
- "GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS (",
- infoLog))
- {
-
- return false;
- }
-
- if (!validateVertexAndFragmentInterfaceBlocks(vertexShaderStorageBlocks,
- fragmentShaderStorageBlocks, infoLog,
- webglCompatibility))
- {
- return false;
- }
- }
- return true;
-}
-
-bool Program::areMatchingInterfaceBlocks(InfoLog &infoLog,
- const sh::InterfaceBlock &vertexInterfaceBlock,
- const sh::InterfaceBlock &fragmentInterfaceBlock,
- bool webglCompatibility) const
-{
- const char* blockName = vertexInterfaceBlock.name.c_str();
- // validate blocks for the same member types
- if (vertexInterfaceBlock.fields.size() != fragmentInterfaceBlock.fields.size())
- {
- infoLog << "Types for interface block '" << blockName
- << "' differ between vertex and fragment shaders";
- return false;
- }
- if (vertexInterfaceBlock.arraySize != fragmentInterfaceBlock.arraySize)
- {
- infoLog << "Array sizes differ for interface block '" << blockName
- << "' between vertex and fragment shaders";
- return false;
- }
- if (vertexInterfaceBlock.layout != fragmentInterfaceBlock.layout ||
- vertexInterfaceBlock.isRowMajorLayout != fragmentInterfaceBlock.isRowMajorLayout ||
- vertexInterfaceBlock.binding != fragmentInterfaceBlock.binding)
- {
- infoLog << "Layout qualifiers differ for interface block '" << blockName
- << "' between vertex and fragment shaders";
- return false;
- }
- const unsigned int numBlockMembers =
- static_cast<unsigned int>(vertexInterfaceBlock.fields.size());
- for (unsigned int blockMemberIndex = 0; blockMemberIndex < numBlockMembers; blockMemberIndex++)
- {
- const sh::InterfaceBlockField &vertexMember = vertexInterfaceBlock.fields[blockMemberIndex];
- const sh::InterfaceBlockField &fragmentMember = fragmentInterfaceBlock.fields[blockMemberIndex];
- if (vertexMember.name != fragmentMember.name)
- {
- infoLog << "Name mismatch for field " << blockMemberIndex
- << " of interface block '" << blockName
- << "': (in vertex: '" << vertexMember.name
- << "', in fragment: '" << fragmentMember.name << "')";
- return false;
- }
- std::string memberName = "interface block '" + vertexInterfaceBlock.name + "' member '" + vertexMember.name + "'";
- if (!linkValidateInterfaceBlockFields(infoLog, memberName, vertexMember, fragmentMember,
- webglCompatibility))
- {
- return false;
- }
- }
- return true;
-}
-
-bool Program::linkValidateVariablesBase(InfoLog &infoLog, const std::string &variableName, const sh::ShaderVariable &vertexVariable,
- const sh::ShaderVariable &fragmentVariable, bool validatePrecision)
-{
- if (vertexVariable.type != fragmentVariable.type)
- {
- infoLog << "Types for " << variableName << " differ between vertex and fragment shaders";
- return false;
- }
- if (vertexVariable.arraySizes != fragmentVariable.arraySizes)
- {
- infoLog << "Array sizes for " << variableName << " differ between vertex and fragment shaders";
- return false;
- }
- if (validatePrecision && vertexVariable.precision != fragmentVariable.precision)
- {
- infoLog << "Precisions for " << variableName << " differ between vertex and fragment shaders";
- return false;
- }
- if (vertexVariable.structName != fragmentVariable.structName)
- {
- infoLog << "Structure names for " << variableName
- << " differ between vertex and fragment shaders";
- return false;
- }
-
- if (vertexVariable.fields.size() != fragmentVariable.fields.size())
- {
- infoLog << "Structure lengths for " << variableName << " differ between vertex and fragment shaders";
- return false;
- }
- const unsigned int numMembers = static_cast<unsigned int>(vertexVariable.fields.size());
- for (unsigned int memberIndex = 0; memberIndex < numMembers; memberIndex++)
- {
- const sh::ShaderVariable &vertexMember = vertexVariable.fields[memberIndex];
- const sh::ShaderVariable &fragmentMember = fragmentVariable.fields[memberIndex];
-
- if (vertexMember.name != fragmentMember.name)
- {
- infoLog << "Name mismatch for field '" << memberIndex
- << "' of " << variableName
- << ": (in vertex: '" << vertexMember.name
- << "', in fragment: '" << fragmentMember.name << "')";
- return false;
- }
-
- const std::string memberName = variableName.substr(0, variableName.length() - 1) + "." +
- vertexMember.name + "'";
-
- if (!linkValidateVariablesBase(infoLog, vertexMember.name, vertexMember, fragmentMember, validatePrecision))
- {
- return false;
- }
- }
-
- return true;
-}
-
-bool Program::linkValidateVaryings(InfoLog &infoLog,
- const std::string &varyingName,
- const sh::Varying &vertexVarying,
- const sh::Varying &fragmentVarying,
- int shaderVersion)
-{
- if (!linkValidateVariablesBase(infoLog, varyingName, vertexVarying, fragmentVarying, false))
- {
- return false;
- }
-
- if (!sh::InterpolationTypesMatch(vertexVarying.interpolation, fragmentVarying.interpolation))
- {
- infoLog << "Interpolation types for " << varyingName
- << " differ between vertex and fragment shaders.";
- return false;
- }
-
- if (shaderVersion == 100 && vertexVarying.isInvariant != fragmentVarying.isInvariant)
- {
- infoLog << "Invariance for " << varyingName
- << " differs between vertex and fragment shaders.";
- return false;
- }
-
- return true;
-}
-
-bool Program::linkValidateBuiltInVaryings(const Context *context, InfoLog &infoLog) const
-{
- Shader *vertexShader = mState.mAttachedVertexShader;
- Shader *fragmentShader = mState.mAttachedFragmentShader;
- const auto &vertexVaryings = vertexShader->getOutputVaryings(context);
- const auto &fragmentVaryings = fragmentShader->getInputVaryings(context);
- int shaderVersion = vertexShader->getShaderVersion(context);
-
- if (shaderVersion != 100)
- {
- // Only ESSL 1.0 has restrictions on matching input and output invariance
- return true;
- }
-
- bool glPositionIsInvariant = false;
- bool glPointSizeIsInvariant = false;
- bool glFragCoordIsInvariant = false;
- bool glPointCoordIsInvariant = false;
-
- for (const sh::Varying &varying : vertexVaryings)
- {
- if (!varying.isBuiltIn())
- {
- continue;
- }
- if (varying.name.compare("gl_Position") == 0)
- {
- glPositionIsInvariant = varying.isInvariant;
- }
- else if (varying.name.compare("gl_PointSize") == 0)
- {
- glPointSizeIsInvariant = varying.isInvariant;
- }
- }
-
- for (const sh::Varying &varying : fragmentVaryings)
- {
- if (!varying.isBuiltIn())
- {
- continue;
- }
- if (varying.name.compare("gl_FragCoord") == 0)
- {
- glFragCoordIsInvariant = varying.isInvariant;
- }
- else if (varying.name.compare("gl_PointCoord") == 0)
- {
- glPointCoordIsInvariant = varying.isInvariant;
- }
- }
-
- // There is some ambiguity in ESSL 1.00.17 paragraph 4.6.4 interpretation,
- // for example, https://cvs.khronos.org/bugzilla/show_bug.cgi?id=13842.
- // Not requiring invariance to match is supported by:
- // dEQP, WebGL CTS, Nexus 5X GLES
- if (glFragCoordIsInvariant && !glPositionIsInvariant)
- {
- infoLog << "gl_FragCoord can only be declared invariant if and only if gl_Position is "
- "declared invariant.";
- return false;
- }
- if (glPointCoordIsInvariant && !glPointSizeIsInvariant)
- {
- infoLog << "gl_PointCoord can only be declared invariant if and only if gl_PointSize is "
- "declared invariant.";
- return false;
- }
-
- return true;
-}
-
-bool Program::linkValidateTransformFeedback(const gl::Context *context,
- InfoLog &infoLog,
- const Program::MergedVaryings &varyings,
- const Caps &caps) const
-{
- size_t totalComponents = 0;
-
- std::set<std::string> uniqueNames;
-
- for (const std::string &tfVaryingName : mState.mTransformFeedbackVaryingNames)
- {
- bool found = false;
- std::vector<unsigned int> subscripts;
- std::string baseName = ParseResourceName(tfVaryingName, &subscripts);
-
- for (const auto &ref : varyings)
- {
- const sh::Varying *varying = ref.second.get();
-
- if (baseName == varying->name)
- {
- if (uniqueNames.count(tfVaryingName) > 0)
- {
- infoLog << "Two transform feedback varyings specify the same output variable ("
- << tfVaryingName << ").";
- return false;
- }
- if (context->getClientVersion() >= Version(3, 1))
- {
- if (IncludeSameArrayElement(uniqueNames, tfVaryingName))
- {
- infoLog
- << "Two transform feedback varyings include the same array element ("
- << tfVaryingName << ").";
- return false;
- }
- }
- else if (varying->isArray())
- {
- infoLog << "Capture of arrays is undefined and not supported.";
- return false;
- }
-
- uniqueNames.insert(tfVaryingName);
-
- // TODO(jmadill): Investigate implementation limits on D3D11
-
- // GLSL ES 3.10 section 4.3.6: A vertex output can't be an array of arrays.
- ASSERT(!varying->isArrayOfArrays());
- size_t elementCount =
- ((varying->isArray() && subscripts.empty()) ? varying->getOutermostArraySize()
- : 1);
- size_t componentCount = VariableComponentCount(varying->type) * elementCount;
- if (mState.mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS &&
- componentCount > caps.maxTransformFeedbackSeparateComponents)
- {
- infoLog << "Transform feedback varying's " << varying->name << " components ("
- << componentCount << ") exceed the maximum separate components ("
- << caps.maxTransformFeedbackSeparateComponents << ").";
- return false;
- }
-
- totalComponents += componentCount;
- found = true;
- break;
- }
- }
- if (context->getClientVersion() < Version(3, 1) &&
- tfVaryingName.find('[') != std::string::npos)
- {
- infoLog << "Capture of array elements is undefined and not supported.";
- return false;
- }
- if (!found)
- {
- infoLog << "Transform feedback varying " << tfVaryingName
- << " does not exist in the vertex shader.";
- return false;
- }
- }
-
- if (mState.mTransformFeedbackBufferMode == GL_INTERLEAVED_ATTRIBS &&
- totalComponents > caps.maxTransformFeedbackInterleavedComponents)
- {
- infoLog << "Transform feedback varying total components (" << totalComponents
- << ") exceed the maximum interleaved components ("
- << caps.maxTransformFeedbackInterleavedComponents << ").";
- return false;
- }
-
- return true;
-}
-
-bool Program::linkValidateGlobalNames(const Context *context, InfoLog &infoLog) const
-{
- const std::vector<sh::Uniform> &vertexUniforms =
- mState.mAttachedVertexShader->getUniforms(context);
- const std::vector<sh::Uniform> &fragmentUniforms =
- mState.mAttachedFragmentShader->getUniforms(context);
- const std::vector<sh::Attribute> &attributes =
- mState.mAttachedVertexShader->getActiveAttributes(context);
- for (const auto &attrib : attributes)
- {
- for (const auto &uniform : vertexUniforms)
- {
- if (uniform.name == attrib.name)
- {
- infoLog << "Name conflicts between a uniform and an attribute: " << attrib.name;
- return false;
- }
- }
- for (const auto &uniform : fragmentUniforms)
- {
- if (uniform.name == attrib.name)
- {
- infoLog << "Name conflicts between a uniform and an attribute: " << attrib.name;
- return false;
- }
- }
- }
- return true;
-}
-
-void Program::gatherTransformFeedbackVaryings(const Program::MergedVaryings &varyings)
-{
- // Gather the linked varyings that are used for transform feedback, they should all exist.
- mState.mLinkedTransformFeedbackVaryings.clear();
- for (const std::string &tfVaryingName : mState.mTransformFeedbackVaryingNames)
- {
- std::vector<unsigned int> subscripts;
- std::string baseName = ParseResourceName(tfVaryingName, &subscripts);
- size_t subscript = GL_INVALID_INDEX;
- if (!subscripts.empty())
- {
- subscript = subscripts.back();
- }
- for (const auto &ref : varyings)
- {
- const sh::Varying *varying = ref.second.get();
- if (baseName == varying->name)
- {
- mState.mLinkedTransformFeedbackVaryings.emplace_back(
- *varying, static_cast<GLuint>(subscript));
- break;
- }
- }
- }
-}
-
-Program::MergedVaryings Program::getMergedVaryings(const Context *context) const
-{
- MergedVaryings merged;
-
- for (const sh::Varying &varying : mState.mAttachedVertexShader->getOutputVaryings(context))
- {
- merged[varying.name].vertex = &varying;
- }
-
- for (const sh::Varying &varying : mState.mAttachedFragmentShader->getInputVaryings(context))
- {
- merged[varying.name].fragment = &varying;
- }
-
- return merged;
-}
-
-
-void Program::linkOutputVariables(const Context *context)
-{
- Shader *fragmentShader = mState.mAttachedFragmentShader;
- ASSERT(fragmentShader != nullptr);
-
- ASSERT(mState.mOutputVariableTypes.empty());
- ASSERT(mState.mActiveOutputVariables.none());
-
- // Gather output variable types
- for (const auto &outputVariable : fragmentShader->getActiveOutputVariables(context))
- {
- if (outputVariable.isBuiltIn() && outputVariable.name != "gl_FragColor" &&
- outputVariable.name != "gl_FragData")
- {
- continue;
- }
-
- unsigned int baseLocation =
- (outputVariable.location == -1 ? 0u
- : static_cast<unsigned int>(outputVariable.location));
-
- // GLSL ES 3.10 section 4.3.6: Output variables cannot be arrays of arrays or arrays of
- // structures, so we may use getBasicTypeElementCount().
- unsigned int elementCount = outputVariable.getBasicTypeElementCount();
- for (unsigned int elementIndex = 0; elementIndex < elementCount; elementIndex++)
- {
- const unsigned int location = baseLocation + elementIndex;
- if (location >= mState.mOutputVariableTypes.size())
- {
- mState.mOutputVariableTypes.resize(location + 1, GL_NONE);
- }
- ASSERT(location < mState.mActiveOutputVariables.size());
- mState.mActiveOutputVariables.set(location);
- mState.mOutputVariableTypes[location] = VariableComponentType(outputVariable.type);
- }
- }
-
- // Skip this step for GLES2 shaders.
- if (fragmentShader->getShaderVersion(context) == 100)
- return;
-
- mState.mOutputVariables = fragmentShader->getActiveOutputVariables(context);
- // TODO(jmadill): any caps validation here?
-
- for (unsigned int outputVariableIndex = 0; outputVariableIndex < mState.mOutputVariables.size();
- outputVariableIndex++)
- {
- const sh::OutputVariable &outputVariable = mState.mOutputVariables[outputVariableIndex];
-
- if (outputVariable.isArray())
- {
- // We're following the GLES 3.1 November 2016 spec section 7.3.1.1 Naming Active
- // Resources and including [0] at the end of array variable names.
- mState.mOutputVariables[outputVariableIndex].name += "[0]";
- mState.mOutputVariables[outputVariableIndex].mappedName += "[0]";
- }
-
- // Don't store outputs for gl_FragDepth, gl_FragColor, etc.
- if (outputVariable.isBuiltIn())
- continue;
-
- // Since multiple output locations must be specified, use 0 for non-specified locations.
- unsigned int baseLocation =
- (outputVariable.location == -1 ? 0u
- : static_cast<unsigned int>(outputVariable.location));
-
- // GLSL ES 3.10 section 4.3.6: Output variables cannot be arrays of arrays or arrays of
- // structures, so we may use getBasicTypeElementCount().
- unsigned int elementCount = outputVariable.getBasicTypeElementCount();
- for (unsigned int elementIndex = 0; elementIndex < elementCount; elementIndex++)
- {
- const unsigned int location = baseLocation + elementIndex;
- if (location >= mState.mOutputLocations.size())
- {
- mState.mOutputLocations.resize(location + 1);
- }
- ASSERT(!mState.mOutputLocations.at(location).used());
- if (outputVariable.isArray())
- {
- mState.mOutputLocations[location] =
- VariableLocation(elementIndex, outputVariableIndex);
- }
- else
- {
- VariableLocation locationInfo;
- locationInfo.index = outputVariableIndex;
- mState.mOutputLocations[location] = locationInfo;
- }
- }
- }
-}
-
-void Program::setUniformValuesFromBindingQualifiers()
-{
- for (unsigned int samplerIndex : mState.mSamplerUniformRange)
- {
- const auto &samplerUniform = mState.mUniforms[samplerIndex];
- if (samplerUniform.binding != -1)
- {
- GLint location = getUniformLocation(samplerUniform.name);
- ASSERT(location != -1);
- std::vector<GLint> boundTextureUnits;
- for (unsigned int elementIndex = 0;
- elementIndex < samplerUniform.getBasicTypeElementCount(); ++elementIndex)
- {
- boundTextureUnits.push_back(samplerUniform.binding + elementIndex);
- }
- setUniform1iv(location, static_cast<GLsizei>(boundTextureUnits.size()),
- boundTextureUnits.data());
- }
- }
-}
-
-void Program::gatherAtomicCounterBuffers()
-{
- for (unsigned int index : mState.mAtomicCounterUniformRange)
- {
- auto &uniform = mState.mUniforms[index];
- uniform.blockInfo.offset = uniform.offset;
- uniform.blockInfo.arrayStride = (uniform.isArray() ? 4 : 0);
- uniform.blockInfo.matrixStride = 0;
- uniform.blockInfo.isRowMajorMatrix = false;
- }
-
- // TODO(jie.a.chen@intel.com): Get the actual BUFFER_DATA_SIZE from backend for each buffer.
-}
-
-void Program::initInterfaceBlockBindings()
-{
- // Set initial bindings from shader.
- for (unsigned int blockIndex = 0; blockIndex < mState.mUniformBlocks.size(); blockIndex++)
- {
- InterfaceBlock &uniformBlock = mState.mUniformBlocks[blockIndex];
- bindUniformBlock(blockIndex, uniformBlock.binding);
- }
-}
-
-void Program::updateSamplerUniform(const VariableLocation &locationInfo,
- GLsizei clampedCount,
- const GLint *v)
-{
- ASSERT(mState.isSamplerUniformIndex(locationInfo.index));
- GLuint samplerIndex = mState.getSamplerIndexFromUniformIndex(locationInfo.index);
- std::vector<GLuint> *boundTextureUnits =
- &mState.mSamplerBindings[samplerIndex].boundTextureUnits;
-
- std::copy(v, v + clampedCount, boundTextureUnits->begin() + locationInfo.arrayIndex);
-
- // Invalidate the validation cache.
- mCachedValidateSamplersResult.reset();
-}
-
-template <typename T>
-GLsizei Program::clampUniformCount(const VariableLocation &locationInfo,
- GLsizei count,
- int vectorSize,
- const T *v)
-{
- if (count == 1)
- return 1;
-
- const LinkedUniform &linkedUniform = mState.mUniforms[locationInfo.index];
-
- // OpenGL ES 3.0.4 spec pg 67: "Values for any array element that exceeds the highest array
- // element index used, as reported by GetActiveUniform, will be ignored by the GL."
- unsigned int remainingElements =
- linkedUniform.getBasicTypeElementCount() - locationInfo.arrayIndex;
- GLsizei maxElementCount =
- static_cast<GLsizei>(remainingElements * linkedUniform.getElementComponents());
-
- if (count * vectorSize > maxElementCount)
- {
- return maxElementCount / vectorSize;
- }
-
- return count;
-}
-
-template <size_t cols, size_t rows, typename T>
-GLsizei Program::clampMatrixUniformCount(GLint location,
- GLsizei count,
- GLboolean transpose,
- const T *v)
-{
- const VariableLocation &locationInfo = mState.mUniformLocations[location];
-
- if (!transpose)
- {
- return clampUniformCount(locationInfo, count, cols * rows, v);
- }
-
- const LinkedUniform &linkedUniform = mState.mUniforms[locationInfo.index];
-
- // OpenGL ES 3.0.4 spec pg 67: "Values for any array element that exceeds the highest array
- // element index used, as reported by GetActiveUniform, will be ignored by the GL."
- unsigned int remainingElements =
- linkedUniform.getBasicTypeElementCount() - locationInfo.arrayIndex;
- return std::min(count, static_cast<GLsizei>(remainingElements));
-}
-
-// Driver differences mean that doing the uniform value cast ourselves gives consistent results.
-// EG: on NVIDIA drivers, it was observed that getUniformi for MAX_INT+1 returned MIN_INT.
-template <typename DestT>
-void Program::getUniformInternal(const Context *context,
- DestT *dataOut,
- GLint location,
- GLenum nativeType,
- int components) const
-{
- switch (nativeType)
- {
- case GL_BOOL:
- {
- GLint tempValue[16] = {0};
- mProgram->getUniformiv(context, location, tempValue);
- UniformStateQueryCastLoop<GLboolean>(
- dataOut, reinterpret_cast<const uint8_t *>(tempValue), components);
- break;
- }
- case GL_INT:
- {
- GLint tempValue[16] = {0};
- mProgram->getUniformiv(context, location, tempValue);
- UniformStateQueryCastLoop<GLint>(dataOut, reinterpret_cast<const uint8_t *>(tempValue),
- components);
- break;
- }
- case GL_UNSIGNED_INT:
- {
- GLuint tempValue[16] = {0};
- mProgram->getUniformuiv(context, location, tempValue);
- UniformStateQueryCastLoop<GLuint>(dataOut, reinterpret_cast<const uint8_t *>(tempValue),
- components);
- break;
- }
- case GL_FLOAT:
- {
- GLfloat tempValue[16] = {0};
- mProgram->getUniformfv(context, location, tempValue);
- UniformStateQueryCastLoop<GLfloat>(
- dataOut, reinterpret_cast<const uint8_t *>(tempValue), components);
- break;
- }
- default:
- UNREACHABLE();
- break;
- }
-}
-
-bool Program::samplesFromTexture(const gl::State &state, GLuint textureID) const
-{
- // Must be called after samplers are validated.
- ASSERT(mCachedValidateSamplersResult.valid() && mCachedValidateSamplersResult.value());
-
- for (const auto &binding : mState.mSamplerBindings)
- {
- GLenum 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;
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/Program.h b/src/3rdparty/angle/src/libANGLE/Program.h
deleted file mode 100644
index c242d84671..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Program.h
+++ /dev/null
@@ -1,735 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Program.h: Defines the gl::Program class. Implements GL program objects
-// and related functionality. [OpenGL ES 2.0.24] section 2.10.3 page 28.
-
-#ifndef LIBANGLE_PROGRAM_H_
-#define LIBANGLE_PROGRAM_H_
-
-#include <GLES2/gl2.h>
-#include <GLSLANG/ShaderVars.h>
-
-#include <array>
-#include <map>
-#include <set>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "common/angleutils.h"
-#include "common/mathutil.h"
-#include "common/Optional.h"
-
-#include "libANGLE/Constants.h"
-#include "libANGLE/Debug.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/RefCountObject.h"
-#include "libANGLE/Uniform.h"
-#include "libANGLE/angletypes.h"
-
-namespace rx
-{
-class GLImplFactory;
-class ProgramImpl;
-struct TranslatedAttribute;
-}
-
-namespace gl
-{
-struct Caps;
-class Context;
-class ContextState;
-class Shader;
-class ShaderProgramManager;
-class State;
-class InfoLog;
-class Buffer;
-class Framebuffer;
-
-extern const char * const g_fakepath;
-
-class InfoLog : angle::NonCopyable
-{
- public:
- InfoLog();
- ~InfoLog();
-
- size_t getLength() const;
- void getLog(GLsizei bufSize, GLsizei *length, char *infoLog) const;
-
- void appendSanitized(const char *message);
- void reset();
-
- // This helper class ensures we append a newline after writing a line.
- class StreamHelper : angle::NonCopyable
- {
- public:
- StreamHelper(StreamHelper &&rhs)
- : mStream(rhs.mStream)
- {
- rhs.mStream = nullptr;
- }
-
- StreamHelper &operator=(StreamHelper &&rhs)
- {
- std::swap(mStream, rhs.mStream);
- return *this;
- }
-
- ~StreamHelper()
- {
- // Write newline when destroyed on the stack
- if (mStream)
- {
- (*mStream) << std::endl;
- }
- }
-
- template <typename T>
- StreamHelper &operator<<(const T &value)
- {
- (*mStream) << value;
- return *this;
- }
-
- private:
- friend class InfoLog;
-
- StreamHelper(std::stringstream *stream)
- : mStream(stream)
- {
- ASSERT(stream);
- }
-
- std::stringstream *mStream;
- };
-
- template <typename T>
- StreamHelper operator<<(const T &value)
- {
- ensureInitialized();
- StreamHelper helper(mLazyStream.get());
- helper << value;
- return helper;
- }
-
- std::string str() const { return mLazyStream ? mLazyStream->str() : ""; }
-
- private:
- void ensureInitialized()
- {
- if (!mLazyStream)
- {
- mLazyStream.reset(new std::stringstream());
- }
- }
-
- std::unique_ptr<std::stringstream> mLazyStream;
-};
-
-// Struct used for correlating uniforms/elements of uniform arrays to handles
-struct VariableLocation
-{
- static constexpr unsigned int kUnused = GL_INVALID_INDEX;
-
- VariableLocation();
- VariableLocation(unsigned int arrayIndex, unsigned int index);
-
- // If used is false, it means this location is only used to fill an empty space in an array,
- // and there is no corresponding uniform variable for this location. It can also mean the
- // uniform was optimized out by the implementation.
- bool used() const { return (index != kUnused); }
- void markUnused() { index = kUnused; }
- void markIgnored() { ignored = true; }
-
- // "arrayIndex" stores the index of the innermost GLSL array. It's zero for non-arrays.
- unsigned int arrayIndex;
- // "index" is an index of the variable. The variable contains the indices for other than the
- // innermost GLSL arrays.
- unsigned int index;
-
- // If this location was bound to an unreferenced uniform. Setting data on this uniform is a
- // no-op.
- bool ignored;
-};
-
-// Information about a variable binding.
-// Currently used by CHROMIUM_path_rendering
-struct BindingInfo
-{
- // The type of binding, for example GL_FLOAT_VEC3.
- // This can be GL_NONE if the variable is optimized away.
- GLenum type;
-
- // This is the name of the variable in
- // the translated shader program. Note that
- // this can be empty in the case where the
- // variable has been optimized away.
- std::string name;
-
- // True if the binding is valid, otherwise false.
- bool valid;
-};
-
-// This small structure encapsulates binding sampler uniforms to active GL textures.
-struct SamplerBinding
-{
- SamplerBinding(GLenum textureTypeIn, size_t elementCount, bool unreferenced);
- SamplerBinding(const SamplerBinding &other);
- ~SamplerBinding();
-
- // Necessary for retrieving active textures from the GL state.
- GLenum textureType;
-
- // List of all textures bound to this sampler, of type textureType.
- std::vector<GLuint> boundTextureUnits;
-
- // A note if this sampler is an unreferenced uniform.
- bool unreferenced;
-};
-
-// A varying with tranform feedback enabled. If it's an array, either the whole array or one of its
-// elements specified by 'arrayIndex' can set to be enabled.
-struct TransformFeedbackVarying : public sh::Varying
-{
- TransformFeedbackVarying(const sh::Varying &varyingIn, GLuint index)
- : sh::Varying(varyingIn), arrayIndex(index)
- {
- ASSERT(!isArrayOfArrays());
- }
- std::string nameWithArrayIndex() const
- {
- std::stringstream fullNameStr;
- fullNameStr << name;
- if (arrayIndex != GL_INVALID_INDEX)
- {
- fullNameStr << "[" << arrayIndex << "]";
- }
- return fullNameStr.str();
- }
- GLsizei size() const
- {
- return (isArray() && arrayIndex == GL_INVALID_INDEX ? getOutermostArraySize() : 1);
- }
-
- GLuint arrayIndex;
-};
-
-struct ImageBinding
-{
- ImageBinding(size_t count);
- ImageBinding(GLuint imageUnit, size_t count);
- ImageBinding(const ImageBinding &other);
- ~ImageBinding();
-
- std::vector<GLuint> boundImageUnits;
-};
-
-using ShaderStagesMask = angle::BitSet<SHADER_TYPE_MAX>;
-
-class ProgramState final : angle::NonCopyable
-{
- public:
- ProgramState();
- ~ProgramState();
-
- const std::string &getLabel();
-
- Shader *getAttachedVertexShader() const { return mAttachedVertexShader; }
- Shader *getAttachedFragmentShader() const { return mAttachedFragmentShader; }
- Shader *getAttachedComputeShader() const { return mAttachedComputeShader; }
- Shader *getAttachedGeometryShader() const { return mAttachedGeometryShader; }
- const std::vector<std::string> &getTransformFeedbackVaryingNames() const
- {
- return mTransformFeedbackVaryingNames;
- }
- GLint getTransformFeedbackBufferMode() const { return mTransformFeedbackBufferMode; }
- GLuint getUniformBlockBinding(GLuint uniformBlockIndex) const
- {
- ASSERT(uniformBlockIndex < mUniformBlocks.size());
- return mUniformBlocks[uniformBlockIndex].binding;
- }
- GLuint getShaderStorageBlockBinding(GLuint blockIndex) const
- {
- ASSERT(blockIndex < mShaderStorageBlocks.size());
- return mShaderStorageBlocks[blockIndex].binding;
- }
- const UniformBlockBindingMask &getActiveUniformBlockBindingsMask() const
- {
- return mActiveUniformBlockBindings;
- }
- const std::vector<sh::Attribute> &getAttributes() const { return mAttributes; }
- const AttributesMask &getActiveAttribLocationsMask() const
- {
- return mActiveAttribLocationsMask;
- }
- unsigned int getMaxActiveAttribLocation() const { return mMaxActiveAttribLocation; }
- DrawBufferMask getActiveOutputVariables() const { return mActiveOutputVariables; }
- const std::vector<sh::OutputVariable> &getOutputVariables() const { return mOutputVariables; }
- const std::vector<VariableLocation> &getOutputLocations() const { return mOutputLocations; }
- const std::vector<LinkedUniform> &getUniforms() const { return mUniforms; }
- const std::vector<VariableLocation> &getUniformLocations() const { return mUniformLocations; }
- const std::vector<InterfaceBlock> &getUniformBlocks() const { return mUniformBlocks; }
- const std::vector<InterfaceBlock> &getShaderStorageBlocks() const
- {
- return mShaderStorageBlocks;
- }
- const std::vector<BufferVariable> &getBufferVariables() const { return mBufferVariables; }
- const std::vector<SamplerBinding> &getSamplerBindings() const { return mSamplerBindings; }
- const std::vector<ImageBinding> &getImageBindings() const { return mImageBindings; }
- const sh::WorkGroupSize &getComputeShaderLocalSize() const { return mComputeShaderLocalSize; }
- const RangeUI &getSamplerUniformRange() const { return mSamplerUniformRange; }
- const RangeUI &getImageUniformRange() const { return mImageUniformRange; }
- const RangeUI &getAtomicCounterUniformRange() const { return mAtomicCounterUniformRange; }
-
- const std::vector<TransformFeedbackVarying> &getLinkedTransformFeedbackVaryings() const
- {
- return mLinkedTransformFeedbackVaryings;
- }
- const std::vector<AtomicCounterBuffer> &getAtomicCounterBuffers() const
- {
- return mAtomicCounterBuffers;
- }
-
- GLuint getUniformIndexFromName(const std::string &name) const;
- GLuint getUniformIndexFromLocation(GLint location) const;
- Optional<GLuint> getSamplerIndex(GLint location) const;
- bool isSamplerUniformIndex(GLuint index) const;
- GLuint getSamplerIndexFromUniformIndex(GLuint uniformIndex) const;
- GLuint getAttributeLocation(const std::string &name) const;
-
- GLuint getBufferVariableIndexFromName(const std::string &name) const;
-
- int getNumViews() const { return mNumViews; }
- bool usesMultiview() const { return mNumViews != -1; }
-
- const ShaderStagesMask &getLinkedShaderStages() const { return mLinkedShaderStages; }
-
- private:
- friend class MemoryProgramCache;
- friend class Program;
-
- std::string mLabel;
-
- sh::WorkGroupSize mComputeShaderLocalSize;
-
- Shader *mAttachedFragmentShader;
- Shader *mAttachedVertexShader;
- Shader *mAttachedComputeShader;
- Shader *mAttachedGeometryShader;
-
- std::vector<std::string> mTransformFeedbackVaryingNames;
- std::vector<TransformFeedbackVarying> mLinkedTransformFeedbackVaryings;
- GLenum mTransformFeedbackBufferMode;
-
- // For faster iteration on the blocks currently being bound.
- UniformBlockBindingMask mActiveUniformBlockBindings;
-
- std::vector<sh::Attribute> mAttributes;
- angle::BitSet<MAX_VERTEX_ATTRIBS> mActiveAttribLocationsMask;
- unsigned int mMaxActiveAttribLocation;
-
- // Uniforms are sorted in order:
- // 1. Non-opaque uniforms
- // 2. Sampler uniforms
- // 3. Image uniforms
- // 4. Atomic counter uniforms
- // 5. Uniform block uniforms
- // This makes opaque uniform validation easier, since we don't need a separate list.
- // For generating the entries and naming them we follow the spec: GLES 3.1 November 2016 section
- // 7.3.1.1 Naming Active Resources. There's a separate entry for each struct member and each
- // inner array of an array of arrays. Names and mapped names of uniforms that are arrays include
- // [0] in the end. This makes implementation of queries simpler.
- std::vector<LinkedUniform> mUniforms;
-
- std::vector<VariableLocation> mUniformLocations;
- std::vector<InterfaceBlock> mUniformBlocks;
- std::vector<BufferVariable> mBufferVariables;
- std::vector<InterfaceBlock> mShaderStorageBlocks;
- std::vector<AtomicCounterBuffer> mAtomicCounterBuffers;
- RangeUI mSamplerUniformRange;
- RangeUI mImageUniformRange;
- RangeUI mAtomicCounterUniformRange;
-
- // An array of the samplers that are used by the program
- std::vector<gl::SamplerBinding> mSamplerBindings;
-
- // An array of the images that are used by the program
- std::vector<gl::ImageBinding> mImageBindings;
-
- // Names and mapped names of output variables that are arrays include [0] in the end, similarly
- // to uniforms.
- std::vector<sh::OutputVariable> mOutputVariables;
- std::vector<VariableLocation> mOutputLocations;
- DrawBufferMask mActiveOutputVariables;
-
- // Fragment output variable base types: FLOAT, INT, or UINT. Ordered by location.
- std::vector<GLenum> mOutputVariableTypes;
-
- bool mBinaryRetrieveableHint;
- bool mSeparable;
- ShaderStagesMask mLinkedShaderStages;
-
- // ANGLE_multiview.
- int mNumViews;
-};
-
-class Program final : angle::NonCopyable, public LabeledObject
-{
- public:
- Program(rx::GLImplFactory *factory, ShaderProgramManager *manager, GLuint handle);
- void onDestroy(const Context *context);
-
- GLuint id() const { return mHandle; }
-
- void setLabel(const std::string &label) override;
- const std::string &getLabel() const override;
-
- rx::ProgramImpl *getImplementation() const { return mProgram; }
-
- void attachShader(Shader *shader);
- void detachShader(const Context *context, Shader *shader);
- int getAttachedShadersCount() const;
-
- const Shader *getAttachedVertexShader() const { return mState.mAttachedVertexShader; }
- const Shader *getAttachedFragmentShader() const { return mState.mAttachedFragmentShader; }
- const Shader *getAttachedComputeShader() const { return mState.mAttachedComputeShader; }
- const Shader *getAttachedGeometryShader() const { return mState.mAttachedGeometryShader; }
-
- void bindAttributeLocation(GLuint index, const char *name);
- void bindUniformLocation(GLuint index, const char *name);
-
- // CHROMIUM_path_rendering
- BindingInfo getFragmentInputBindingInfo(const Context *context, GLint index) const;
- void bindFragmentInputLocation(GLint index, const char *name);
- void pathFragmentInputGen(const Context *context,
- GLint index,
- GLenum genMode,
- GLint components,
- const GLfloat *coeffs);
-
- Error link(const gl::Context *context);
- bool isLinked() const;
-
- bool hasLinkedVertexShader() const { return mState.mLinkedShaderStages[SHADER_VERTEX]; }
- bool hasLinkedFragmentShader() const { return mState.mLinkedShaderStages[SHADER_FRAGMENT]; }
- bool hasLinkedComputeShader() const { return mState.mLinkedShaderStages[SHADER_COMPUTE]; }
-
- Error loadBinary(const Context *context,
- GLenum binaryFormat,
- const void *binary,
- GLsizei length);
- Error saveBinary(const Context *context,
- GLenum *binaryFormat,
- void *binary,
- GLsizei bufSize,
- GLsizei *length) const;
- GLint getBinaryLength(const Context *context) const;
- void setBinaryRetrievableHint(bool retrievable);
- bool getBinaryRetrievableHint() const;
-
- void setSeparable(bool separable);
- bool isSeparable() const;
-
- int getInfoLogLength() const;
- void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const;
- void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders) const;
-
- GLuint getAttributeLocation(const std::string &name) const;
- bool isAttribLocationActive(size_t attribLocation) const;
-
- void getActiveAttribute(GLuint index,
- GLsizei bufsize,
- GLsizei *length,
- GLint *size,
- GLenum *type,
- GLchar *name) const;
- GLint getActiveAttributeCount() const;
- GLint getActiveAttributeMaxLength() const;
- const std::vector<sh::Attribute> &getAttributes() const { return mState.mAttributes; }
-
- GLint getFragDataLocation(const std::string &name) const;
- size_t getOutputResourceCount() const;
- const std::vector<GLenum> &getOutputVariableTypes() const
- {
- return mState.mOutputVariableTypes;
- }
- DrawBufferMask getActiveOutputVariables() const { return mState.mActiveOutputVariables; }
-
- void getActiveUniform(GLuint index,
- GLsizei bufsize,
- GLsizei *length,
- GLint *size,
- GLenum *type,
- GLchar *name) const;
- GLint getActiveUniformCount() const;
- size_t getActiveBufferVariableCount() const;
- GLint getActiveUniformMaxLength() const;
- bool isValidUniformLocation(GLint location) const;
- const LinkedUniform &getUniformByLocation(GLint location) const;
- const VariableLocation &getUniformLocation(GLint location) const;
- const std::vector<VariableLocation> &getUniformLocations() const;
- const LinkedUniform &getUniformByIndex(GLuint index) const;
-
- const BufferVariable &getBufferVariableByIndex(GLuint index) const;
-
- enum SetUniformResult
- {
- SamplerChanged,
- NoSamplerChange,
- };
-
- GLint getUniformLocation(const std::string &name) const;
- GLuint getUniformIndex(const std::string &name) const;
- void setUniform1fv(GLint location, GLsizei count, const GLfloat *v);
- void setUniform2fv(GLint location, GLsizei count, const GLfloat *v);
- void setUniform3fv(GLint location, GLsizei count, const GLfloat *v);
- void setUniform4fv(GLint location, GLsizei count, const GLfloat *v);
- SetUniformResult setUniform1iv(GLint location, GLsizei count, const GLint *v);
- void setUniform2iv(GLint location, GLsizei count, const GLint *v);
- void setUniform3iv(GLint location, GLsizei count, const GLint *v);
- void setUniform4iv(GLint location, GLsizei count, const GLint *v);
- void setUniform1uiv(GLint location, GLsizei count, const GLuint *v);
- void setUniform2uiv(GLint location, GLsizei count, const GLuint *v);
- void setUniform3uiv(GLint location, GLsizei count, const GLuint *v);
- void setUniform4uiv(GLint location, GLsizei count, const GLuint *v);
- void setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- void setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
- void getUniformfv(const Context *context, GLint location, GLfloat *params) const;
- void getUniformiv(const Context *context, GLint location, GLint *params) const;
- void getUniformuiv(const Context *context, GLint location, GLuint *params) const;
-
- void getActiveUniformBlockName(const GLuint blockIndex,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *blockName) const;
- void getActiveShaderStorageBlockName(const GLuint blockIndex,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *blockName) const;
- GLuint getActiveUniformBlockCount() const;
- GLuint getActiveAtomicCounterBufferCount() const;
- GLuint getActiveShaderStorageBlockCount() const;
- GLint getActiveUniformBlockMaxLength() const;
-
- GLuint getUniformBlockIndex(const std::string &name) const;
- GLuint getShaderStorageBlockIndex(const std::string &name) const;
-
- void bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- GLuint getUniformBlockBinding(GLuint uniformBlockIndex) const;
- GLuint getShaderStorageBlockBinding(GLuint shaderStorageBlockIndex) const;
-
- const InterfaceBlock &getUniformBlockByIndex(GLuint index) const;
- const InterfaceBlock &getShaderStorageBlockByIndex(GLuint index) const;
-
- void setTransformFeedbackVaryings(GLsizei count, const GLchar *const *varyings, GLenum bufferMode);
- void getTransformFeedbackVarying(GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name) const;
- GLsizei getTransformFeedbackVaryingCount() const;
- GLsizei getTransformFeedbackVaryingMaxLength() const;
- GLenum getTransformFeedbackBufferMode() const;
-
- static bool linkValidateInterfaceBlockFields(InfoLog &infoLog,
- const std::string &uniformName,
- const sh::InterfaceBlockField &vertexUniform,
- const sh::InterfaceBlockField &fragmentUniform,
- bool webglCompatibility);
-
- void addRef();
- void release(const Context *context);
- unsigned int getRefCount() const;
- void flagForDeletion();
- bool isFlaggedForDeletion() const;
-
- void validate(const Caps &caps);
- bool validateSamplers(InfoLog *infoLog, const Caps &caps);
- bool isValidated() const;
- bool samplesFromTexture(const gl::State &state, GLuint textureID) const;
-
- const AttributesMask &getActiveAttribLocationsMask() const
- {
- return mState.mActiveAttribLocationsMask;
- }
-
- const std::vector<SamplerBinding> &getSamplerBindings() const
- {
- return mState.mSamplerBindings;
- }
-
- const std::vector<ImageBinding> &getImageBindings() const { return mState.mImageBindings; }
- const sh::WorkGroupSize &getComputeShaderLocalSize() const
- {
- return mState.mComputeShaderLocalSize;
- }
-
- const ProgramState &getState() const { return mState; }
-
- static bool linkValidateVariablesBase(InfoLog &infoLog,
- const std::string &variableName,
- const sh::ShaderVariable &vertexVariable,
- const sh::ShaderVariable &fragmentVariable,
- bool validatePrecision);
-
- GLuint getInputResourceIndex(const GLchar *name) const;
- GLuint getOutputResourceIndex(const GLchar *name) const;
- void getInputResourceName(GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name) const;
- void getOutputResourceName(GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name) const;
- void getUniformResourceName(GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name) const;
- void getBufferVariableResourceName(GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *name) const;
- const sh::Attribute &getInputResource(GLuint index) const;
- const sh::OutputVariable &getOutputResource(GLuint index) const;
-
- class Bindings final : angle::NonCopyable
- {
- public:
- Bindings();
- ~Bindings();
- void bindLocation(GLuint index, const std::string &name);
- int getBinding(const std::string &name) const;
-
- typedef std::unordered_map<std::string, GLuint>::const_iterator const_iterator;
- const_iterator begin() const;
- const_iterator end() const;
-
- private:
- std::unordered_map<std::string, GLuint> mBindings;
- };
-
- const Bindings &getAttributeBindings() const { return mAttributeBindings; }
- const Bindings &getUniformLocationBindings() const { return mUniformLocationBindings; }
- const Bindings &getFragmentInputBindings() const { return mFragmentInputBindings; }
-
- int getNumViews() const { return mState.getNumViews(); }
- bool usesMultiview() const { return mState.usesMultiview(); }
-
- struct VaryingRef
- {
- const sh::Varying *get() const { return vertex ? vertex : fragment; }
-
- const sh::Varying *vertex = nullptr;
- const sh::Varying *fragment = nullptr;
- };
- using MergedVaryings = std::map<std::string, VaryingRef>;
-
- private:
- ~Program() override;
-
- void unlink();
-
- bool linkAttributes(const Context *context, InfoLog &infoLog);
- bool validateVertexAndFragmentInterfaceBlocks(
- const std::vector<sh::InterfaceBlock> &vertexInterfaceBlocks,
- const std::vector<sh::InterfaceBlock> &fragmentInterfaceBlocks,
- InfoLog &infoLog,
- bool webglCompatibility) const;
- bool linkInterfaceBlocks(const Context *context, InfoLog &infoLog);
- bool linkVaryings(const Context *context, InfoLog &infoLog) const;
-
- bool linkUniforms(const Context *context,
- InfoLog &infoLog,
- const Bindings &uniformLocationBindings);
- void linkSamplerAndImageBindings();
- bool linkAtomicCounterBuffers();
-
- void updateLinkedShaderStages();
-
- bool areMatchingInterfaceBlocks(InfoLog &infoLog,
- const sh::InterfaceBlock &vertexInterfaceBlock,
- const sh::InterfaceBlock &fragmentInterfaceBlock,
- bool webglCompatibility) const;
-
- static bool linkValidateVaryings(InfoLog &infoLog,
- const std::string &varyingName,
- const sh::Varying &vertexVarying,
- const sh::Varying &fragmentVarying,
- int shaderVersion);
- bool linkValidateBuiltInVaryings(const Context *context, InfoLog &infoLog) const;
- bool linkValidateTransformFeedback(const gl::Context *context,
- InfoLog &infoLog,
- const MergedVaryings &linkedVaryings,
- const Caps &caps) const;
- bool linkValidateGlobalNames(const Context *context, InfoLog &infoLog) const;
-
- void gatherTransformFeedbackVaryings(const MergedVaryings &varyings);
-
- MergedVaryings getMergedVaryings(const Context *context) const;
- void linkOutputVariables(const Context *context);
-
- void setUniformValuesFromBindingQualifiers();
-
- void gatherAtomicCounterBuffers();
- void initInterfaceBlockBindings();
-
- // Both these function update the cached uniform values and return a modified "count"
- // so that the uniform update doesn't overflow the uniform.
- template <typename T>
- GLsizei clampUniformCount(const VariableLocation &locationInfo,
- GLsizei count,
- int vectorSize,
- const T *v);
- template <size_t cols, size_t rows, typename T>
- GLsizei clampMatrixUniformCount(GLint location, GLsizei count, GLboolean transpose, const T *v);
-
- void updateSamplerUniform(const VariableLocation &locationInfo,
- GLsizei clampedCount,
- const GLint *v);
-
- template <typename DestT>
- void getUniformInternal(const Context *context,
- DestT *dataOut,
- GLint location,
- GLenum nativeType,
- int components) const;
-
- template <typename T>
- void getResourceName(GLuint index,
- const std::vector<T> &resources,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *name) const;
-
- ProgramState mState;
- rx::ProgramImpl *mProgram;
-
- bool mValidated;
-
- Bindings mAttributeBindings;
-
- // Note that this has nothing to do with binding layout qualifiers that can be set for some
- // uniforms in GLES3.1+. It is used to pre-set the location of uniforms.
- Bindings mUniformLocationBindings;
-
- // CHROMIUM_path_rendering
- Bindings mFragmentInputBindings;
-
- bool mLinked;
- bool mDeleteStatus; // Flag to indicate that the program can be deleted when no longer in use
-
- unsigned int mRefCount;
-
- ShaderProgramManager *mResourceManager;
- const GLuint mHandle;
-
- InfoLog mInfoLog;
-
- // Cache for sampler validation
- Optional<bool> mCachedValidateSamplersResult;
- std::vector<GLenum> mTextureUnitTypesCache;
-};
-} // namespace gl
-
-#endif // LIBANGLE_PROGRAM_H_
diff --git a/src/3rdparty/angle/src/libANGLE/ProgramLinkedResources.cpp b/src/3rdparty/angle/src/libANGLE/ProgramLinkedResources.cpp
deleted file mode 100644
index a33f751525..0000000000
--- a/src/3rdparty/angle/src/libANGLE/ProgramLinkedResources.cpp
+++ /dev/null
@@ -1,1040 +0,0 @@
-//
-// Copyright (c) 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// UniformLinker.cpp: implements link-time checks for default block uniforms, and generates uniform
-// locations. Populates data structures related to uniforms so that they can be stored in program
-// state.
-
-#include "libANGLE/ProgramLinkedResources.h"
-
-#include "common/string_utils.h"
-#include "common/utilities.h"
-#include "libANGLE/Caps.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Shader.h"
-#include "libANGLE/features.h"
-
-namespace gl
-{
-
-namespace
-{
-
-LinkedUniform *FindUniform(std::vector<LinkedUniform> &list, const std::string &name)
-{
- for (LinkedUniform &uniform : list)
- {
- if (uniform.name == name)
- return &uniform;
- }
-
- return nullptr;
-}
-
-int GetUniformLocationBinding(const Program::Bindings &uniformLocationBindings,
- const sh::Uniform &uniform)
-{
- int binding = uniformLocationBindings.getBinding(uniform.name);
- if (uniform.isArray() && binding == -1)
- {
- // Bindings for array uniforms can be set either with or without [0] in the end.
- ASSERT(angle::EndsWith(uniform.name, "[0]"));
- std::string nameWithoutIndex = uniform.name.substr(0u, uniform.name.length() - 3u);
- return uniformLocationBindings.getBinding(nameWithoutIndex);
- }
- return binding;
-}
-
-} // anonymous namespace
-
-UniformLinker::UniformLinker(const ProgramState &state) : mState(state)
-{
-}
-
-UniformLinker::~UniformLinker() = default;
-
-void UniformLinker::getResults(std::vector<LinkedUniform> *uniforms,
- std::vector<VariableLocation> *uniformLocations)
-{
- uniforms->swap(mUniforms);
- uniformLocations->swap(mUniformLocations);
-}
-
-bool UniformLinker::link(const Context *context,
- InfoLog &infoLog,
- const Program::Bindings &uniformLocationBindings)
-{
- if (mState.getAttachedVertexShader() && mState.getAttachedFragmentShader())
- {
- ASSERT(mState.getAttachedComputeShader() == nullptr);
- if (!validateVertexAndFragmentUniforms(context, infoLog))
- {
- return false;
- }
- }
-
- // Flatten the uniforms list (nested fields) into a simple list (no nesting).
- // Also check the maximum uniform vector and sampler counts.
- if (!flattenUniformsAndCheckCaps(context, infoLog))
- {
- return false;
- }
-
- if (!checkMaxCombinedAtomicCounters(context->getCaps(), infoLog))
- {
- return false;
- }
-
- if (!indexUniforms(infoLog, uniformLocationBindings))
- {
- return false;
- }
-
- return true;
-}
-
-bool UniformLinker::validateVertexAndFragmentUniforms(const Context *context,
- InfoLog &infoLog) const
-{
- // Check that uniforms defined in the vertex and fragment shaders are identical
- std::map<std::string, sh::Uniform> linkedUniforms;
- const std::vector<sh::Uniform> &vertexUniforms =
- mState.getAttachedVertexShader()->getUniforms(context);
- const std::vector<sh::Uniform> &fragmentUniforms =
- mState.getAttachedFragmentShader()->getUniforms(context);
-
- for (const sh::Uniform &vertexUniform : vertexUniforms)
- {
- linkedUniforms[vertexUniform.name] = vertexUniform;
- }
-
- for (const sh::Uniform &fragmentUniform : fragmentUniforms)
- {
- auto entry = linkedUniforms.find(fragmentUniform.name);
- if (entry != linkedUniforms.end())
- {
- const sh::Uniform &linkedUniform = entry->second;
- const std::string &uniformName = "uniform '" + linkedUniform.name + "'";
- if (!linkValidateUniforms(infoLog, uniformName, linkedUniform, fragmentUniform))
- {
- return false;
- }
- }
- }
- return true;
-}
-
-// GLSL ES Spec 3.00.3, section 4.3.5.
-bool UniformLinker::linkValidateUniforms(InfoLog &infoLog,
- const std::string &uniformName,
- const sh::Uniform &vertexUniform,
- const sh::Uniform &fragmentUniform)
-{
-#if ANGLE_PROGRAM_LINK_VALIDATE_UNIFORM_PRECISION == ANGLE_ENABLED
- const bool validatePrecision = true;
-#else
- const bool validatePrecision = false;
-#endif
-
- if (!Program::linkValidateVariablesBase(infoLog, uniformName, vertexUniform, fragmentUniform,
- validatePrecision))
- {
- return false;
- }
-
- // GLSL ES Spec 3.10.4, section 4.4.5.
- if (vertexUniform.binding != -1 && fragmentUniform.binding != -1 &&
- vertexUniform.binding != fragmentUniform.binding)
- {
- infoLog << "Binding layout qualifiers for " << uniformName
- << " differ between vertex and fragment shaders.";
- return false;
- }
-
- // GLSL ES Spec 3.10.4, section 9.2.1.
- if (vertexUniform.location != -1 && fragmentUniform.location != -1 &&
- vertexUniform.location != fragmentUniform.location)
- {
- infoLog << "Location layout qualifiers for " << uniformName
- << " differ between vertex and fragment shaders.";
- return false;
- }
- if (vertexUniform.offset != fragmentUniform.offset)
- {
- infoLog << "Offset layout qualifiers for " << uniformName
- << " differ between vertex and fragment shaders.";
- return false;
- }
-
- return true;
-}
-
-bool UniformLinker::indexUniforms(InfoLog &infoLog,
- const Program::Bindings &uniformLocationBindings)
-{
- // All the locations where another uniform can't be located.
- std::set<GLuint> reservedLocations;
- // Locations which have been allocated for an unused uniform.
- std::set<GLuint> ignoredLocations;
-
- int maxUniformLocation = -1;
-
- // Gather uniform locations that have been set either using the bindUniformLocation API or by
- // using a location layout qualifier and check conflicts between them.
- if (!gatherUniformLocationsAndCheckConflicts(infoLog, uniformLocationBindings,
- &reservedLocations, &ignoredLocations,
- &maxUniformLocation))
- {
- return false;
- }
-
- // Conflicts have been checked, now we can prune non-statically used uniforms. Code further down
- // the line relies on only having statically used uniforms in mUniforms.
- pruneUnusedUniforms();
-
- // Gather uniforms that have their location pre-set and uniforms that don't yet have a location.
- std::vector<VariableLocation> unlocatedUniforms;
- std::map<GLuint, VariableLocation> preLocatedUniforms;
-
- for (size_t uniformIndex = 0; uniformIndex < mUniforms.size(); uniformIndex++)
- {
- const LinkedUniform &uniform = mUniforms[uniformIndex];
-
- if (uniform.isBuiltIn() || IsAtomicCounterType(uniform.type))
- {
- continue;
- }
-
- int preSetLocation = GetUniformLocationBinding(uniformLocationBindings, uniform);
- int shaderLocation = uniform.location;
-
- if (shaderLocation != -1)
- {
- preSetLocation = shaderLocation;
- }
-
- unsigned int elementCount = uniform.getBasicTypeElementCount();
- for (unsigned int arrayIndex = 0; arrayIndex < elementCount; arrayIndex++)
- {
- VariableLocation location(arrayIndex, static_cast<unsigned int>(uniformIndex));
-
- if ((arrayIndex == 0 && preSetLocation != -1) || shaderLocation != -1)
- {
- int elementLocation = preSetLocation + arrayIndex;
- preLocatedUniforms[elementLocation] = location;
- }
- else
- {
- unlocatedUniforms.push_back(location);
- }
- }
- }
-
- // Make enough space for all uniforms, with pre-set locations or not.
- mUniformLocations.resize(
- std::max(unlocatedUniforms.size() + preLocatedUniforms.size() + ignoredLocations.size(),
- static_cast<size_t>(maxUniformLocation + 1)));
-
- // Assign uniforms with pre-set locations
- for (const auto &uniform : preLocatedUniforms)
- {
- mUniformLocations[uniform.first] = uniform.second;
- }
-
- // Assign ignored uniforms
- for (const auto &ignoredLocation : ignoredLocations)
- {
- mUniformLocations[ignoredLocation].markIgnored();
- }
-
- // Automatically assign locations for the rest of the uniforms
- size_t nextUniformLocation = 0;
- for (const auto &unlocatedUniform : unlocatedUniforms)
- {
- while (mUniformLocations[nextUniformLocation].used() ||
- mUniformLocations[nextUniformLocation].ignored)
- {
- nextUniformLocation++;
- }
-
- ASSERT(nextUniformLocation < mUniformLocations.size());
- mUniformLocations[nextUniformLocation] = unlocatedUniform;
- nextUniformLocation++;
- }
-
- return true;
-}
-
-bool UniformLinker::gatherUniformLocationsAndCheckConflicts(
- InfoLog &infoLog,
- const Program::Bindings &uniformLocationBindings,
- std::set<GLuint> *reservedLocations,
- std::set<GLuint> *ignoredLocations,
- int *maxUniformLocation)
-{
- for (const LinkedUniform &uniform : mUniforms)
- {
- if (uniform.isBuiltIn())
- {
- continue;
- }
-
- int apiBoundLocation = GetUniformLocationBinding(uniformLocationBindings, uniform);
- int shaderLocation = uniform.location;
-
- if (shaderLocation != -1)
- {
- unsigned int elementCount = uniform.getBasicTypeElementCount();
-
- for (unsigned int arrayIndex = 0; arrayIndex < elementCount; arrayIndex++)
- {
- // GLSL ES 3.10 section 4.4.3
- int elementLocation = shaderLocation + arrayIndex;
- *maxUniformLocation = std::max(*maxUniformLocation, elementLocation);
- if (reservedLocations->find(elementLocation) != reservedLocations->end())
- {
- infoLog << "Multiple uniforms bound to location " << elementLocation << ".";
- return false;
- }
- reservedLocations->insert(elementLocation);
- if (!uniform.staticUse)
- {
- ignoredLocations->insert(elementLocation);
- }
- }
- }
- else if (apiBoundLocation != -1 && uniform.staticUse)
- {
- // Only the first location is reserved even if the uniform is an array.
- *maxUniformLocation = std::max(*maxUniformLocation, apiBoundLocation);
- if (reservedLocations->find(apiBoundLocation) != reservedLocations->end())
- {
- infoLog << "Multiple uniforms bound to location " << apiBoundLocation << ".";
- return false;
- }
- reservedLocations->insert(apiBoundLocation);
- }
- }
-
- // Record the uniform locations that were bound using the API for uniforms that were not found
- // from the shader. Other uniforms should not be assigned to those locations.
- for (const auto &locationBinding : uniformLocationBindings)
- {
- GLuint location = locationBinding.second;
- if (reservedLocations->find(location) == reservedLocations->end())
- {
- ignoredLocations->insert(location);
- *maxUniformLocation = std::max(*maxUniformLocation, static_cast<int>(location));
- }
- }
-
- return true;
-}
-
-void UniformLinker::pruneUnusedUniforms()
-{
- auto uniformIter = mUniforms.begin();
- while (uniformIter != mUniforms.end())
- {
- if (uniformIter->staticUse)
- {
- ++uniformIter;
- }
- else
- {
- uniformIter = mUniforms.erase(uniformIter);
- }
- }
-}
-
-bool UniformLinker::flattenUniformsAndCheckCapsForShader(
- const Context *context,
- Shader *shader,
- GLuint maxUniformComponents,
- GLuint maxTextureImageUnits,
- GLuint maxImageUnits,
- GLuint maxAtomicCounters,
- const std::string &componentsErrorMessage,
- const std::string &samplerErrorMessage,
- const std::string &imageErrorMessage,
- const std::string &atomicCounterErrorMessage,
- std::vector<LinkedUniform> &samplerUniforms,
- std::vector<LinkedUniform> &imageUniforms,
- std::vector<LinkedUniform> &atomicCounterUniforms,
- InfoLog &infoLog)
-{
- ShaderUniformCount shaderUniformCount;
- for (const sh::Uniform &uniform : shader->getUniforms(context))
- {
- shaderUniformCount += flattenUniform(uniform, &samplerUniforms, &imageUniforms,
- &atomicCounterUniforms, shader->getType());
- }
-
- if (shaderUniformCount.vectorCount > maxUniformComponents)
- {
- infoLog << componentsErrorMessage << maxUniformComponents << ").";
- return false;
- }
-
- if (shaderUniformCount.samplerCount > maxTextureImageUnits)
- {
- infoLog << samplerErrorMessage << maxTextureImageUnits << ").";
- return false;
- }
-
- if (shaderUniformCount.imageCount > maxImageUnits)
- {
- infoLog << imageErrorMessage << maxImageUnits << ").";
- return false;
- }
-
- if (shaderUniformCount.atomicCounterCount > maxAtomicCounters)
- {
- infoLog << atomicCounterErrorMessage << maxAtomicCounters << ").";
- return false;
- }
-
- return true;
-}
-
-bool UniformLinker::flattenUniformsAndCheckCaps(const Context *context, InfoLog &infoLog)
-{
- std::vector<LinkedUniform> samplerUniforms;
- std::vector<LinkedUniform> imageUniforms;
- std::vector<LinkedUniform> atomicCounterUniforms;
-
- const Caps &caps = context->getCaps();
-
- if (mState.getAttachedComputeShader())
- {
- Shader *computeShader = mState.getAttachedComputeShader();
-
- // TODO (mradev): check whether we need finer-grained component counting
- if (!flattenUniformsAndCheckCapsForShader(
- context, computeShader, caps.maxComputeUniformComponents / 4,
- caps.maxComputeTextureImageUnits, caps.maxComputeImageUniforms,
- caps.maxComputeAtomicCounters,
- "Compute shader active uniforms exceed MAX_COMPUTE_UNIFORM_COMPONENTS (",
- "Compute shader sampler count exceeds MAX_COMPUTE_TEXTURE_IMAGE_UNITS (",
- "Compute shader image count exceeds MAX_COMPUTE_IMAGE_UNIFORMS (",
- "Compute shader atomic counter count exceeds MAX_COMPUTE_ATOMIC_COUNTERS (",
- samplerUniforms, imageUniforms, atomicCounterUniforms, infoLog))
- {
- return false;
- }
- }
- else
- {
- Shader *vertexShader = mState.getAttachedVertexShader();
-
- if (!flattenUniformsAndCheckCapsForShader(
- context, vertexShader, caps.maxVertexUniformVectors,
- caps.maxVertexTextureImageUnits, caps.maxVertexImageUniforms,
- caps.maxVertexAtomicCounters,
- "Vertex shader active uniforms exceed MAX_VERTEX_UNIFORM_VECTORS (",
- "Vertex shader sampler count exceeds MAX_VERTEX_TEXTURE_IMAGE_UNITS (",
- "Vertex shader image count exceeds MAX_VERTEX_IMAGE_UNIFORMS (",
- "Vertex shader atomic counter count exceeds MAX_VERTEX_ATOMIC_COUNTERS (",
- samplerUniforms, imageUniforms, atomicCounterUniforms, infoLog))
- {
- return false;
- }
-
- Shader *fragmentShader = mState.getAttachedFragmentShader();
-
- if (!flattenUniformsAndCheckCapsForShader(
- context, fragmentShader, caps.maxFragmentUniformVectors, caps.maxTextureImageUnits,
- caps.maxFragmentImageUniforms, caps.maxFragmentAtomicCounters,
- "Fragment shader active uniforms exceed MAX_FRAGMENT_UNIFORM_VECTORS (",
- "Fragment shader sampler count exceeds MAX_TEXTURE_IMAGE_UNITS (",
- "Fragment shader image count exceeds MAX_FRAGMENT_IMAGE_UNIFORMS (",
- "Fragment shader atomic counter count exceeds MAX_FRAGMENT_ATOMIC_COUNTERS (",
- samplerUniforms, imageUniforms, atomicCounterUniforms, infoLog))
- {
- return false;
- }
- }
-
- mUniforms.insert(mUniforms.end(), samplerUniforms.begin(), samplerUniforms.end());
- mUniforms.insert(mUniforms.end(), imageUniforms.begin(), imageUniforms.end());
- mUniforms.insert(mUniforms.end(), atomicCounterUniforms.begin(), atomicCounterUniforms.end());
- return true;
-}
-
-UniformLinker::ShaderUniformCount UniformLinker::flattenUniform(
- const sh::Uniform &uniform,
- std::vector<LinkedUniform> *samplerUniforms,
- std::vector<LinkedUniform> *imageUniforms,
- std::vector<LinkedUniform> *atomicCounterUniforms,
- GLenum shaderType)
-{
- int location = uniform.location;
- ShaderUniformCount shaderUniformCount =
- flattenUniformImpl(uniform, uniform.name, uniform.mappedName, samplerUniforms,
- imageUniforms, atomicCounterUniforms, shaderType, uniform.staticUse,
- uniform.binding, uniform.offset, &location);
- if (uniform.staticUse)
- {
- return shaderUniformCount;
- }
- return ShaderUniformCount();
-}
-
-UniformLinker::ShaderUniformCount UniformLinker::flattenArrayOfStructsUniform(
- const sh::ShaderVariable &uniform,
- unsigned int arrayNestingIndex,
- const std::string &namePrefix,
- const std::string &mappedNamePrefix,
- std::vector<LinkedUniform> *samplerUniforms,
- std::vector<LinkedUniform> *imageUniforms,
- std::vector<LinkedUniform> *atomicCounterUniforms,
- GLenum shaderType,
- bool markStaticUse,
- int binding,
- int offset,
- int *location)
-{
- // Nested arrays are processed starting from outermost (arrayNestingIndex 0u) and ending at the
- // innermost.
- ShaderUniformCount shaderUniformCount;
- const unsigned int currentArraySize = uniform.getNestedArraySize(arrayNestingIndex);
- for (unsigned int arrayElement = 0u; arrayElement < currentArraySize; ++arrayElement)
- {
- const std::string elementName = namePrefix + ArrayString(arrayElement);
- const std::string elementMappedName = mappedNamePrefix + ArrayString(arrayElement);
- if (arrayNestingIndex + 1u < uniform.arraySizes.size())
- {
- shaderUniformCount += flattenArrayOfStructsUniform(
- uniform, arrayNestingIndex + 1u, elementName, elementMappedName, samplerUniforms,
- imageUniforms, atomicCounterUniforms, shaderType, markStaticUse, binding, offset,
- location);
- }
- else
- {
- shaderUniformCount += flattenStructUniform(
- uniform.fields, elementName, elementMappedName, samplerUniforms, imageUniforms,
- atomicCounterUniforms, shaderType, markStaticUse, binding, offset, location);
- }
- }
- return shaderUniformCount;
-}
-
-UniformLinker::ShaderUniformCount UniformLinker::flattenStructUniform(
- const std::vector<sh::ShaderVariable> &fields,
- const std::string &namePrefix,
- const std::string &mappedNamePrefix,
- std::vector<LinkedUniform> *samplerUniforms,
- std::vector<LinkedUniform> *imageUniforms,
- std::vector<LinkedUniform> *atomicCounterUniforms,
- GLenum shaderType,
- bool markStaticUse,
- int binding,
- int offset,
- int *location)
-{
- ShaderUniformCount shaderUniformCount;
- for (const sh::ShaderVariable &field : fields)
- {
- const std::string &fieldName = namePrefix + "." + field.name;
- const std::string &fieldMappedName = mappedNamePrefix + "." + field.mappedName;
-
- shaderUniformCount +=
- flattenUniformImpl(field, fieldName, fieldMappedName, samplerUniforms, imageUniforms,
- atomicCounterUniforms, shaderType, markStaticUse, -1, -1, location);
- }
- return shaderUniformCount;
-}
-
-UniformLinker::ShaderUniformCount UniformLinker::flattenArrayUniform(
- const sh::ShaderVariable &uniform,
- const std::string &namePrefix,
- const std::string &mappedNamePrefix,
- std::vector<LinkedUniform> *samplerUniforms,
- std::vector<LinkedUniform> *imageUniforms,
- std::vector<LinkedUniform> *atomicCounterUniforms,
- GLenum shaderType,
- bool markStaticUse,
- int binding,
- int offset,
- int *location)
-{
- ShaderUniformCount shaderUniformCount;
-
- ASSERT(uniform.isArray());
- for (unsigned int arrayElement = 0u; arrayElement < uniform.getOutermostArraySize();
- ++arrayElement)
- {
- sh::ShaderVariable uniformElement = uniform;
- uniformElement.indexIntoArray(arrayElement);
- const std::string elementName = namePrefix + ArrayString(arrayElement);
- const std::string elementMappedName = mappedNamePrefix + ArrayString(arrayElement);
-
- shaderUniformCount += flattenUniformImpl(
- uniformElement, elementName, elementMappedName, samplerUniforms, imageUniforms,
- atomicCounterUniforms, shaderType, markStaticUse, binding, offset, location);
- }
- return shaderUniformCount;
-}
-
-UniformLinker::ShaderUniformCount UniformLinker::flattenUniformImpl(
- const sh::ShaderVariable &uniform,
- const std::string &fullName,
- const std::string &fullMappedName,
- std::vector<LinkedUniform> *samplerUniforms,
- std::vector<LinkedUniform> *imageUniforms,
- std::vector<LinkedUniform> *atomicCounterUniforms,
- GLenum shaderType,
- bool markStaticUse,
- int binding,
- int offset,
- int *location)
-{
- ASSERT(location);
- ShaderUniformCount shaderUniformCount;
-
- if (uniform.isStruct())
- {
- if (uniform.isArray())
- {
- shaderUniformCount += flattenArrayOfStructsUniform(
- uniform, 0u, fullName, fullMappedName, samplerUniforms, imageUniforms,
- atomicCounterUniforms, shaderType, markStaticUse, binding, offset, location);
- }
- else
- {
- shaderUniformCount += flattenStructUniform(
- uniform.fields, fullName, fullMappedName, samplerUniforms, imageUniforms,
- atomicCounterUniforms, shaderType, markStaticUse, binding, offset, location);
- }
- return shaderUniformCount;
- }
- if (uniform.isArrayOfArrays())
- {
- // GLES 3.1 November 2016 section 7.3.1 page 77:
- // "For an active variable declared as an array of an aggregate data type (structures or
- // arrays), a separate entry will be generated for each active array element"
- return flattenArrayUniform(uniform, fullName, fullMappedName, samplerUniforms,
- imageUniforms, atomicCounterUniforms, shaderType, markStaticUse,
- binding, offset, location);
- }
-
- // Not a struct
- bool isSampler = IsSamplerType(uniform.type);
- bool isImage = IsImageType(uniform.type);
- bool isAtomicCounter = IsAtomicCounterType(uniform.type);
- std::vector<gl::LinkedUniform> *uniformList = &mUniforms;
- if (isSampler)
- {
- uniformList = samplerUniforms;
- }
- else if (isImage)
- {
- uniformList = imageUniforms;
- }
- else if (isAtomicCounter)
- {
- uniformList = atomicCounterUniforms;
- }
-
- std::string fullNameWithArrayIndex(fullName);
- std::string fullMappedNameWithArrayIndex(fullMappedName);
-
- if (uniform.isArray())
- {
- // We're following the GLES 3.1 November 2016 spec section 7.3.1.1 Naming Active Resources
- // and including [0] at the end of array variable names.
- fullNameWithArrayIndex += "[0]";
- fullMappedNameWithArrayIndex += "[0]";
- }
-
- LinkedUniform *existingUniform = FindUniform(*uniformList, fullNameWithArrayIndex);
- if (existingUniform)
- {
- if (binding != -1)
- {
- existingUniform->binding = binding;
- }
- if (offset != -1)
- {
- existingUniform->offset = offset;
- }
- if (*location != -1)
- {
- existingUniform->location = *location;
- }
- if (markStaticUse)
- {
- existingUniform->staticUse = true;
- existingUniform->setStaticUse(shaderType, true);
- }
- }
- else
- {
- ASSERT(uniform.arraySizes.size() <= 1u);
- LinkedUniform linkedUniform(uniform.type, uniform.precision, fullNameWithArrayIndex,
- uniform.arraySizes, binding, offset, *location, -1,
- sh::BlockMemberInfo::getDefaultBlockInfo());
- linkedUniform.mappedName = fullMappedNameWithArrayIndex;
- linkedUniform.staticUse = markStaticUse;
- linkedUniform.flattenedOffsetInParentArrays = uniform.flattenedOffsetInParentArrays;
- if (markStaticUse)
- {
- linkedUniform.setStaticUse(shaderType, true);
- }
-
- uniformList->push_back(linkedUniform);
- }
-
- // Struct and array of arrays uniforms get flattened so we can use getBasicTypeElementCount().
- unsigned int elementCount = uniform.getBasicTypeElementCount();
-
- // Samplers and images aren't "real" uniforms, so they don't count towards register usage.
- // Likewise, don't count "real" uniforms towards opaque count.
- shaderUniformCount.vectorCount =
- (IsOpaqueType(uniform.type) ? 0 : (VariableRegisterCount(uniform.type) * elementCount));
- shaderUniformCount.samplerCount = (isSampler ? elementCount : 0);
- shaderUniformCount.imageCount = (isImage ? elementCount : 0);
- shaderUniformCount.atomicCounterCount = (isAtomicCounter ? elementCount : 0);
-
- if (*location != -1)
- {
- *location += elementCount;
- }
-
- return shaderUniformCount;
-}
-
-bool UniformLinker::checkMaxCombinedAtomicCounters(const Caps &caps, InfoLog &infoLog)
-{
- unsigned int atomicCounterCount = 0;
- for (const auto &uniform : mUniforms)
- {
- if (IsAtomicCounterType(uniform.type) && uniform.staticUse)
- {
- atomicCounterCount += uniform.getBasicTypeElementCount();
- if (atomicCounterCount > caps.maxCombinedAtomicCounters)
- {
- infoLog << "atomic counter count exceeds MAX_COMBINED_ATOMIC_COUNTERS"
- << caps.maxCombinedAtomicCounters << ").";
- return false;
- }
- }
- }
- return true;
-}
-
-// InterfaceBlockLinker implementation.
-InterfaceBlockLinker::InterfaceBlockLinker(std::vector<InterfaceBlock> *blocksOut)
- : mBlocksOut(blocksOut)
-{
-}
-
-InterfaceBlockLinker::~InterfaceBlockLinker()
-{
-}
-
-void InterfaceBlockLinker::addShaderBlocks(GLenum shader,
- const std::vector<sh::InterfaceBlock> *blocks)
-{
- mShaderBlocks.push_back(std::make_pair(shader, blocks));
-}
-
-void InterfaceBlockLinker::linkBlocks(const GetBlockSize &getBlockSize,
- const GetBlockMemberInfo &getMemberInfo) const
-{
- ASSERT(mBlocksOut->empty());
-
- std::set<std::string> visitedList;
-
- for (const auto &shaderBlocks : mShaderBlocks)
- {
- const GLenum shaderType = shaderBlocks.first;
-
- for (const auto &block : *shaderBlocks.second)
- {
- // Only 'packed' blocks are allowed to be considered inactive.
- if (!block.staticUse && block.layout == sh::BLOCKLAYOUT_PACKED)
- continue;
-
- if (visitedList.count(block.name) > 0)
- {
- if (block.staticUse)
- {
- for (InterfaceBlock &priorBlock : *mBlocksOut)
- {
- if (block.name == priorBlock.name)
- {
- priorBlock.setStaticUse(shaderType, true);
- // TODO(jiajia.qin@intel.com): update the block members static use.
- }
- }
- }
- }
- else
- {
- defineInterfaceBlock(getBlockSize, getMemberInfo, block, shaderType);
- visitedList.insert(block.name);
- }
- }
- }
-}
-
-template <typename VarT>
-void InterfaceBlockLinker::defineArrayOfStructsBlockMembers(const GetBlockMemberInfo &getMemberInfo,
- const VarT &field,
- unsigned int arrayNestingIndex,
- const std::string &prefix,
- const std::string &mappedPrefix,
- int blockIndex,
- bool singleEntryForTopLevelArray,
- int topLevelArraySize) const
-{
- // Nested arrays are processed starting from outermost (arrayNestingIndex 0u) and ending at the
- // innermost.
- unsigned int entryGenerationArraySize = field.getNestedArraySize(arrayNestingIndex);
- if (singleEntryForTopLevelArray)
- {
- entryGenerationArraySize = 1;
- }
- for (unsigned int arrayElement = 0u; arrayElement < entryGenerationArraySize; ++arrayElement)
- {
- const std::string elementName = prefix + ArrayString(arrayElement);
- const std::string elementMappedName = mappedPrefix + ArrayString(arrayElement);
- if (arrayNestingIndex + 1u < field.arraySizes.size())
- {
- defineArrayOfStructsBlockMembers(getMemberInfo, field, arrayNestingIndex + 1u,
- elementName, elementMappedName, blockIndex, false,
- topLevelArraySize);
- }
- else
- {
- defineBlockMembers(getMemberInfo, field.fields, elementName, elementMappedName,
- blockIndex, false, topLevelArraySize);
- }
- }
-}
-
-template <typename VarT>
-void InterfaceBlockLinker::defineBlockMembers(const GetBlockMemberInfo &getMemberInfo,
- const std::vector<VarT> &fields,
- const std::string &prefix,
- const std::string &mappedPrefix,
- int blockIndex,
- bool singleEntryForTopLevelArray,
- int topLevelArraySize) const
-{
- for (const VarT &field : fields)
- {
- std::string fullName = (prefix.empty() ? field.name : prefix + "." + field.name);
- std::string fullMappedName =
- (mappedPrefix.empty() ? field.mappedName : mappedPrefix + "." + field.mappedName);
-
- defineBlockMember(getMemberInfo, field, fullName, fullMappedName, blockIndex,
- singleEntryForTopLevelArray, topLevelArraySize);
- }
-}
-
-template <typename VarT>
-void InterfaceBlockLinker::defineBlockMember(const GetBlockMemberInfo &getMemberInfo,
- const VarT &field,
- const std::string &fullName,
- const std::string &fullMappedName,
- int blockIndex,
- bool singleEntryForTopLevelArray,
- int topLevelArraySize) const
-{
- int nextArraySize = topLevelArraySize;
- if (((field.isArray() && field.isStruct()) || field.isArrayOfArrays()) &&
- singleEntryForTopLevelArray)
- {
- // In OpenGL ES 3.10 spec, session 7.3.1.1 'For an active shader storage block
- // member declared as an array of an aggregate type, an entry will be generated only
- // for the first array element, regardless of its type.'
- nextArraySize = field.getOutermostArraySize();
- }
-
- if (field.isStruct())
- {
- if (field.isArray())
- {
- defineArrayOfStructsBlockMembers(getMemberInfo, field, 0u, fullName, fullMappedName,
- blockIndex, singleEntryForTopLevelArray,
- nextArraySize);
- }
- else
- {
- ASSERT(nextArraySize == topLevelArraySize);
- defineBlockMembers(getMemberInfo, field.fields, fullName, fullMappedName, blockIndex,
- false, nextArraySize);
- }
- return;
- }
- if (field.isArrayOfArrays())
- {
- unsigned int entryGenerationArraySize = field.getOutermostArraySize();
- if (singleEntryForTopLevelArray)
- {
- entryGenerationArraySize = 1u;
- }
- for (unsigned int arrayElement = 0u; arrayElement < entryGenerationArraySize;
- ++arrayElement)
- {
- VarT fieldElement = field;
- fieldElement.indexIntoArray(arrayElement);
- const std::string elementName = fullName + ArrayString(arrayElement);
- const std::string elementMappedName = fullMappedName + ArrayString(arrayElement);
-
- defineBlockMember(getMemberInfo, fieldElement, elementName, elementMappedName,
- blockIndex, false, nextArraySize);
- }
- return;
- }
-
- // If getBlockMemberInfo returns false, the variable is optimized out.
- sh::BlockMemberInfo memberInfo;
- if (!getMemberInfo(fullName, fullMappedName, &memberInfo))
- {
- return;
- }
-
- std::string fullNameWithArrayIndex = fullName;
- std::string fullMappedNameWithArrayIndex = fullMappedName;
-
- if (field.isArray())
- {
- fullNameWithArrayIndex += "[0]";
- fullMappedNameWithArrayIndex += "[0]";
- }
-
- ASSERT(nextArraySize == topLevelArraySize);
- defineBlockMemberImpl(field, fullNameWithArrayIndex, fullMappedNameWithArrayIndex, blockIndex,
- memberInfo, nextArraySize);
-}
-
-void InterfaceBlockLinker::defineInterfaceBlock(const GetBlockSize &getBlockSize,
- const GetBlockMemberInfo &getMemberInfo,
- const sh::InterfaceBlock &interfaceBlock,
- GLenum shaderType) const
-{
- size_t blockSize = 0;
- std::vector<unsigned int> blockIndexes;
-
- int blockIndex = static_cast<int>(mBlocksOut->size());
- // Track the first and last block member index to determine the range of active block members in
- // the block.
- size_t firstBlockMemberIndex = getCurrentBlockMemberIndex();
- defineBlockMembers(getMemberInfo, interfaceBlock.fields, interfaceBlock.fieldPrefix(),
- interfaceBlock.fieldMappedPrefix(), blockIndex,
- interfaceBlock.blockType == sh::BlockType::BLOCK_BUFFER, 1);
- size_t lastBlockMemberIndex = getCurrentBlockMemberIndex();
-
- for (size_t blockMemberIndex = firstBlockMemberIndex; blockMemberIndex < lastBlockMemberIndex;
- ++blockMemberIndex)
- {
- blockIndexes.push_back(static_cast<unsigned int>(blockMemberIndex));
- }
-
- // ESSL 3.10 section 4.4.4 page 58:
- // Any uniform or shader storage block declared without a binding qualifier is initially
- // assigned to block binding point zero.
- int blockBinding = (interfaceBlock.binding == -1 ? 0 : interfaceBlock.binding);
- for (unsigned int arrayElement = 0; arrayElement < interfaceBlock.elementCount();
- ++arrayElement)
- {
- std::string blockArrayName = interfaceBlock.name;
- std::string blockMappedArrayName = interfaceBlock.mappedName;
- if (interfaceBlock.isArray())
- {
- blockArrayName += ArrayString(arrayElement);
- blockMappedArrayName += ArrayString(arrayElement);
- }
-
- // Don't define this block at all if it's not active in the implementation.
- if (!getBlockSize(blockArrayName, blockMappedArrayName, &blockSize))
- {
- continue;
- }
-
- InterfaceBlock block(interfaceBlock.name, interfaceBlock.mappedName,
- interfaceBlock.isArray(), arrayElement, blockBinding + arrayElement);
- block.memberIndexes = blockIndexes;
- block.setStaticUse(shaderType, interfaceBlock.staticUse);
-
- // Since all block elements in an array share the same active interface blocks, they
- // will all be active once any block member is used. So, since interfaceBlock.name[0]
- // was active, here we will add every block element in the array.
- block.dataSize = static_cast<unsigned int>(blockSize);
- mBlocksOut->push_back(block);
- }
-}
-
-// UniformBlockLinker implementation.
-UniformBlockLinker::UniformBlockLinker(std::vector<InterfaceBlock> *blocksOut,
- std::vector<LinkedUniform> *uniformsOut)
- : InterfaceBlockLinker(blocksOut), mUniformsOut(uniformsOut)
-{
-}
-
-UniformBlockLinker::~UniformBlockLinker()
-{
-}
-
-void UniformBlockLinker::defineBlockMemberImpl(const sh::ShaderVariable &field,
- const std::string &fullName,
- const std::string &fullMappedName,
- int blockIndex,
- const sh::BlockMemberInfo &memberInfo,
- int /*topLevelArraySize*/) const
-{
- LinkedUniform newUniform(field.type, field.precision, fullName, field.arraySizes, -1, -1, -1,
- blockIndex, memberInfo);
- newUniform.mappedName = fullMappedName;
- // TODO(jiajia.qin@intel.com): update the block memeber static use.
-
- // Since block uniforms have no location, we don't need to store them in the uniform locations
- // list.
- mUniformsOut->push_back(newUniform);
-}
-
-size_t UniformBlockLinker::getCurrentBlockMemberIndex() const
-{
- return mUniformsOut->size();
-}
-
-// ShaderStorageBlockLinker implementation.
-ShaderStorageBlockLinker::ShaderStorageBlockLinker(std::vector<InterfaceBlock> *blocksOut,
- std::vector<BufferVariable> *bufferVariablesOut)
- : InterfaceBlockLinker(blocksOut), mBufferVariablesOut(bufferVariablesOut)
-{
-}
-
-ShaderStorageBlockLinker::~ShaderStorageBlockLinker()
-{
-}
-
-void ShaderStorageBlockLinker::defineBlockMemberImpl(const sh::ShaderVariable &field,
- const std::string &fullName,
- const std::string &fullMappedName,
- int blockIndex,
- const sh::BlockMemberInfo &memberInfo,
- int topLevelArraySize) const
-{
- BufferVariable newBufferVariable(field.type, field.precision, fullName, field.arraySizes,
- blockIndex, memberInfo);
- newBufferVariable.mappedName = fullMappedName;
- // TODO(jiajia.qin@intel.com): update the block memeber static use.
-
- newBufferVariable.topLevelArraySize = topLevelArraySize;
-
- mBufferVariablesOut->push_back(newBufferVariable);
-}
-
-size_t ShaderStorageBlockLinker::getCurrentBlockMemberIndex() const
-{
- return mBufferVariablesOut->size();
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/ProgramLinkedResources.h b/src/3rdparty/angle/src/libANGLE/ProgramLinkedResources.h
deleted file mode 100644
index 1bf91b7f3b..0000000000
--- a/src/3rdparty/angle/src/libANGLE/ProgramLinkedResources.h
+++ /dev/null
@@ -1,274 +0,0 @@
-//
-// Copyright (c) 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// UniformLinker.h: implements link-time checks for default block uniforms, and generates uniform
-// locations. Populates data structures related to uniforms so that they can be stored in program
-// state.
-
-#ifndef LIBANGLE_UNIFORMLINKER_H_
-#define LIBANGLE_UNIFORMLINKER_H_
-
-#include "libANGLE/Program.h"
-#include "libANGLE/Uniform.h"
-#include "libANGLE/VaryingPacking.h"
-
-#include <functional>
-
-namespace gl
-{
-
-class UniformLinker
-{
- public:
- UniformLinker(const ProgramState &state);
- ~UniformLinker();
-
- bool link(const Context *context,
- InfoLog &infoLog,
- const Program::Bindings &uniformLocationBindings);
-
- void getResults(std::vector<LinkedUniform> *uniforms,
- std::vector<VariableLocation> *uniformLocations);
-
- private:
- struct ShaderUniformCount
- {
- ShaderUniformCount() : vectorCount(0), samplerCount(0), imageCount(0), atomicCounterCount(0)
- {
- }
- ShaderUniformCount(const ShaderUniformCount &other) = default;
- ShaderUniformCount &operator=(const ShaderUniformCount &other) = default;
-
- ShaderUniformCount &operator+=(const ShaderUniformCount &other)
- {
- vectorCount += other.vectorCount;
- samplerCount += other.samplerCount;
- imageCount += other.imageCount;
- atomicCounterCount += other.atomicCounterCount;
- return *this;
- }
-
- unsigned int vectorCount;
- unsigned int samplerCount;
- unsigned int imageCount;
- unsigned int atomicCounterCount;
- };
-
- bool validateVertexAndFragmentUniforms(const Context *context, InfoLog &infoLog) const;
-
- static bool linkValidateUniforms(InfoLog &infoLog,
- const std::string &uniformName,
- const sh::Uniform &vertexUniform,
- const sh::Uniform &fragmentUniform);
-
- bool flattenUniformsAndCheckCapsForShader(const Context *context,
- Shader *shader,
- GLuint maxUniformComponents,
- GLuint maxTextureImageUnits,
- GLuint maxImageUnits,
- GLuint maxAtomicCounters,
- const std::string &componentsErrorMessage,
- const std::string &samplerErrorMessage,
- const std::string &imageErrorMessage,
- const std::string &atomicCounterErrorMessage,
- std::vector<LinkedUniform> &samplerUniforms,
- std::vector<LinkedUniform> &imageUniforms,
- std::vector<LinkedUniform> &atomicCounterUniforms,
- InfoLog &infoLog);
-
- bool flattenUniformsAndCheckCaps(const Context *context, InfoLog &infoLog);
- bool checkMaxCombinedAtomicCounters(const Caps &caps, InfoLog &infoLog);
-
- ShaderUniformCount flattenUniform(const sh::Uniform &uniform,
- std::vector<LinkedUniform> *samplerUniforms,
- std::vector<LinkedUniform> *imageUniforms,
- std::vector<LinkedUniform> *atomicCounterUniforms,
- GLenum shaderType);
-
- ShaderUniformCount flattenArrayOfStructsUniform(
- const sh::ShaderVariable &uniform,
- unsigned int arrayNestingIndex,
- const std::string &namePrefix,
- const std::string &mappedNamePrefix,
- std::vector<LinkedUniform> *samplerUniforms,
- std::vector<LinkedUniform> *imageUniforms,
- std::vector<LinkedUniform> *atomicCounterUniforms,
- GLenum shaderType,
- bool markStaticUse,
- int binding,
- int offset,
- int *location);
-
- ShaderUniformCount flattenStructUniform(const std::vector<sh::ShaderVariable> &fields,
- const std::string &namePrefix,
- const std::string &mappedNamePrefix,
- std::vector<LinkedUniform> *samplerUniforms,
- std::vector<LinkedUniform> *imageUniforms,
- std::vector<LinkedUniform> *atomicCounterUniforms,
- GLenum shaderType,
- bool markStaticUse,
- int binding,
- int offset,
- int *location);
-
- ShaderUniformCount flattenArrayUniform(const sh::ShaderVariable &uniform,
- const std::string &fullName,
- const std::string &fullMappedName,
- std::vector<LinkedUniform> *samplerUniforms,
- std::vector<LinkedUniform> *imageUniforms,
- std::vector<LinkedUniform> *atomicCounterUniforms,
- GLenum shaderType,
- bool markStaticUse,
- int binding,
- int offset,
- int *location);
-
- // markStaticUse is given as a separate parameter because it is tracked here at struct
- // granularity.
- ShaderUniformCount flattenUniformImpl(const sh::ShaderVariable &uniform,
- const std::string &fullName,
- const std::string &fullMappedName,
- std::vector<LinkedUniform> *samplerUniforms,
- std::vector<LinkedUniform> *imageUniforms,
- std::vector<LinkedUniform> *atomicCounterUniforms,
- GLenum shaderType,
- bool markStaticUse,
- int binding,
- int offset,
- int *location);
-
- bool indexUniforms(InfoLog &infoLog, const Program::Bindings &uniformLocationBindings);
- bool gatherUniformLocationsAndCheckConflicts(InfoLog &infoLog,
- const Program::Bindings &uniformLocationBindings,
- std::set<GLuint> *reservedLocations,
- std::set<GLuint> *ignoredLocations,
- int *maxUniformLocation);
- void pruneUnusedUniforms();
-
- const ProgramState &mState;
- std::vector<LinkedUniform> mUniforms;
- std::vector<VariableLocation> mUniformLocations;
-};
-
-// This class is intended to be used during the link step to store interface block information.
-// It is called by the Impl class during ProgramImpl::link so that it has access to the
-// real block size and layout.
-class InterfaceBlockLinker : angle::NonCopyable
-{
- public:
- virtual ~InterfaceBlockLinker();
-
- using GetBlockSize = std::function<
- bool(const std::string &blockName, const std::string &blockMappedName, size_t *sizeOut)>;
- using GetBlockMemberInfo = std::function<
- bool(const std::string &name, const std::string &mappedName, sh::BlockMemberInfo *infoOut)>;
-
- // This is called once per shader stage. It stores a pointer to the block vector, so it's
- // important that this class does not persist longer than the duration of Program::link.
- void addShaderBlocks(GLenum shader, const std::vector<sh::InterfaceBlock> *blocks);
-
- // This is called once during a link operation, after all shader blocks are added.
- void linkBlocks(const GetBlockSize &getBlockSize,
- const GetBlockMemberInfo &getMemberInfo) const;
-
- protected:
- InterfaceBlockLinker(std::vector<InterfaceBlock> *blocksOut);
- void defineInterfaceBlock(const GetBlockSize &getBlockSize,
- const GetBlockMemberInfo &getMemberInfo,
- const sh::InterfaceBlock &interfaceBlock,
- GLenum shaderType) const;
-
- template <typename VarT>
- void defineBlockMembers(const GetBlockMemberInfo &getMemberInfo,
- const std::vector<VarT> &fields,
- const std::string &prefix,
- const std::string &mappedPrefix,
- int blockIndex,
- bool singleEntryForTopLevelArray,
- int topLevelArraySize) const;
- template <typename VarT>
- void defineBlockMember(const GetBlockMemberInfo &getMemberInfo,
- const VarT &field,
- const std::string &fullName,
- const std::string &fullMappedName,
- int blockIndex,
- bool singleEntryForTopLevelArray,
- int topLevelArraySize) const;
-
- virtual void defineBlockMemberImpl(const sh::ShaderVariable &field,
- const std::string &fullName,
- const std::string &fullMappedName,
- int blockIndex,
- const sh::BlockMemberInfo &memberInfo,
- int topLevelArraySize) const = 0;
- virtual size_t getCurrentBlockMemberIndex() const = 0;
-
- using ShaderBlocks = std::pair<GLenum, const std::vector<sh::InterfaceBlock> *>;
- std::vector<ShaderBlocks> mShaderBlocks;
-
- std::vector<InterfaceBlock> *mBlocksOut;
-
- private:
- template <typename VarT>
- void defineArrayOfStructsBlockMembers(const GetBlockMemberInfo &getMemberInfo,
- const VarT &field,
- unsigned int arrayNestingIndex,
- const std::string &prefix,
- const std::string &mappedPrefix,
- int blockIndex,
- bool singleEntryForTopLevelArray,
- int topLevelArraySize) const;
-};
-
-class UniformBlockLinker final : public InterfaceBlockLinker
-{
- public:
- UniformBlockLinker(std::vector<InterfaceBlock> *blocksOut,
- std::vector<LinkedUniform> *uniformsOut);
- ~UniformBlockLinker() override;
-
- private:
- void defineBlockMemberImpl(const sh::ShaderVariable &field,
- const std::string &fullName,
- const std::string &fullMappedName,
- int blockIndex,
- const sh::BlockMemberInfo &memberInfo,
- int topLevelArraySize) const override;
- size_t getCurrentBlockMemberIndex() const override;
- std::vector<LinkedUniform> *mUniformsOut;
-};
-
-class ShaderStorageBlockLinker final : public InterfaceBlockLinker
-{
- public:
- ShaderStorageBlockLinker(std::vector<InterfaceBlock> *blocksOut,
- std::vector<BufferVariable> *bufferVariablesOut);
- ~ShaderStorageBlockLinker() override;
-
- private:
- void defineBlockMemberImpl(const sh::ShaderVariable &field,
- const std::string &fullName,
- const std::string &fullMappedName,
- int blockIndex,
- const sh::BlockMemberInfo &memberInfo,
- int topLevelArraySize) const override;
- size_t getCurrentBlockMemberIndex() const override;
- std::vector<BufferVariable> *mBufferVariablesOut;
-};
-
-// The link operation is responsible for finishing the link of uniform and interface blocks.
-// This way it can filter out unreferenced resources and still have access to the info.
-// TODO(jmadill): Integrate uniform linking/filtering as well as interface blocks.
-struct ProgramLinkedResources
-{
- VaryingPacking varyingPacking;
- UniformBlockLinker uniformBlockLinker;
- ShaderStorageBlockLinker shaderStorageBlockLinker;
-};
-
-} // namespace gl
-
-#endif // LIBANGLE_UNIFORMLINKER_H_
diff --git a/src/3rdparty/angle/src/libANGLE/ProgramPipeline.cpp b/src/3rdparty/angle/src/libANGLE/ProgramPipeline.cpp
deleted file mode 100644
index 0445512090..0000000000
--- a/src/3rdparty/angle/src/libANGLE/ProgramPipeline.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-//
-// Copyright (c) 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ProgramPipeline.cpp: Implements the gl::ProgramPipeline class.
-// Implements GL program pipeline objects and related functionality.
-// [OpenGL ES 3.1] section 7.4 page 105.
-
-#include "libANGLE/ProgramPipeline.h"
-
-#include "libANGLE/angletypes.h"
-#include "libANGLE/renderer/GLImplFactory.h"
-#include "libANGLE/renderer/ProgramPipelineImpl.h"
-
-namespace gl
-{
-
-ProgramPipelineState::ProgramPipelineState() : mLabel()
-{
-}
-
-ProgramPipelineState::~ProgramPipelineState()
-{
-}
-
-const std::string &ProgramPipelineState::getLabel() const
-{
- return mLabel;
-}
-
-ProgramPipeline::ProgramPipeline(rx::GLImplFactory *factory, GLuint handle)
- : RefCountObject(handle),
- mProgramPipeline(factory->createProgramPipeline(mState))
-{
- ASSERT(mProgramPipeline);
-}
-
-ProgramPipeline::~ProgramPipeline()
-{
- mProgramPipeline.release();
-}
-
-Error ProgramPipeline::onDestroy(const Context *context)
-{
- return NoError();
-}
-
-void ProgramPipeline::setLabel(const std::string &label)
-{
- mState.mLabel = label;
-}
-
-const std::string &ProgramPipeline::getLabel() const
-{
- return mState.mLabel;
-}
-
-rx::ProgramPipelineImpl *ProgramPipeline::getImplementation() const
-{
- return mProgramPipeline.get();
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/ProgramPipeline.h b/src/3rdparty/angle/src/libANGLE/ProgramPipeline.h
deleted file mode 100644
index 2aac87c7b8..0000000000
--- a/src/3rdparty/angle/src/libANGLE/ProgramPipeline.h
+++ /dev/null
@@ -1,65 +0,0 @@
-//
-// Copyright (c) 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ProgramPipeline.h: Defines the gl::ProgramPipeline class.
-// Implements GL program pipeline objects and related functionality.
-// [OpenGL ES 3.1] section 7.4 page 105.
-
-#ifndef LIBANGLE_PROGRAMPIPELINE_H_
-#define LIBANGLE_PROGRAMPIPELINE_H_
-
-#include <memory>
-
-#include "common/angleutils.h"
-#include "libANGLE/Debug.h"
-#include "libANGLE/RefCountObject.h"
-
-namespace rx
-{
-class GLImplFactory;
-class ProgramPipelineImpl;
-};
-
-namespace gl
-{
-class Context;
-class ProgramPipeline;
-
-class ProgramPipelineState final : angle::NonCopyable
-{
- public:
- ProgramPipelineState();
- ~ProgramPipelineState();
-
- const std::string &getLabel() const;
-
- private:
- friend class ProgramPipeline;
-
- std::string mLabel;
-};
-
-class ProgramPipeline final : public RefCountObject, public LabeledObject
-{
- public:
- ProgramPipeline(rx::GLImplFactory *factory, GLuint handle);
- ~ProgramPipeline() override;
-
- Error onDestroy(const Context *context) override;
-
- void setLabel(const std::string &label) override;
- const std::string &getLabel() const override;
-
- rx::ProgramPipelineImpl *getImplementation() const;
-
- private:
- std::unique_ptr<rx::ProgramPipelineImpl> mProgramPipeline;
-
- ProgramPipelineState mState;
-};
-}
-
-#endif // LIBANGLE_PROGRAMPIPELINE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Query.cpp b/src/3rdparty/angle/src/libANGLE/Query.cpp
deleted file mode 100644
index cd1fb5f4bc..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Query.cpp
+++ /dev/null
@@ -1,87 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Query.cpp: Implements the gl::Query class
-
-#include "libANGLE/Query.h"
-#include "libANGLE/renderer/QueryImpl.h"
-
-namespace gl
-{
-Query::Query(rx::QueryImpl *impl, GLuint id) : RefCountObject(id), mQuery(impl), mLabel()
-{
-}
-
-Query::~Query()
-{
- SafeDelete(mQuery);
-}
-
-void Query::setLabel(const std::string &label)
-{
- mLabel = label;
-}
-
-const std::string &Query::getLabel() const
-{
- return mLabel;
-}
-
-Error Query::begin()
-{
- return mQuery->begin();
-}
-
-Error Query::end()
-{
- return mQuery->end();
-}
-
-Error Query::queryCounter()
-{
- return mQuery->queryCounter();
-}
-
-Error Query::getResult(GLint *params)
-{
- return mQuery->getResult(params);
-}
-
-Error Query::getResult(GLuint *params)
-{
- return mQuery->getResult(params);
-}
-
-Error Query::getResult(GLint64 *params)
-{
- return mQuery->getResult(params);
-}
-
-Error Query::getResult(GLuint64 *params)
-{
- return mQuery->getResult(params);
-}
-
-Error Query::isResultAvailable(bool *available)
-{
- return mQuery->isResultAvailable(available);
-}
-
-GLenum Query::getType() const
-{
- return mQuery->getType();
-}
-
-rx::QueryImpl *Query::getImplementation()
-{
- return mQuery;
-}
-
-const rx::QueryImpl *Query::getImplementation() const
-{
- return mQuery;
-}
-}
diff --git a/src/3rdparty/angle/src/libANGLE/Query.h b/src/3rdparty/angle/src/libANGLE/Query.h
deleted file mode 100644
index c307eaaf08..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Query.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Query.h: Defines the gl::Query class
-
-#ifndef LIBANGLE_QUERY_H_
-#define LIBANGLE_QUERY_H_
-
-#include "libANGLE/Debug.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/RefCountObject.h"
-
-#include "common/angleutils.h"
-
-#include "angle_gl.h"
-
-namespace rx
-{
-class QueryImpl;
-}
-
-namespace gl
-{
-
-class Query final : public RefCountObject, public LabeledObject
-{
- public:
- Query(rx::QueryImpl *impl, GLuint id);
- void destroy(const gl::Context *context) {}
- ~Query() override;
-
- void setLabel(const std::string &label) override;
- const std::string &getLabel() const override;
-
- Error begin();
- Error end();
- Error queryCounter();
- Error getResult(GLint *params);
- Error getResult(GLuint *params);
- Error getResult(GLint64 *params);
- Error getResult(GLuint64 *params);
- Error isResultAvailable(bool *available);
-
- GLenum getType() const;
-
- rx::QueryImpl *getImplementation();
- const rx::QueryImpl *getImplementation() const;
-
- private:
- rx::QueryImpl *mQuery;
-
- std::string mLabel;
-};
-
-}
-
-#endif // LIBANGLE_QUERY_H_
diff --git a/src/3rdparty/angle/src/libANGLE/RefCountObject.h b/src/3rdparty/angle/src/libANGLE/RefCountObject.h
deleted file mode 100644
index cb41cc27f4..0000000000
--- a/src/3rdparty/angle/src/libANGLE/RefCountObject.h
+++ /dev/null
@@ -1,187 +0,0 @@
-//
-// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// RefCountObject.h: Defines the gl::RefCountObject base class that provides
-// lifecycle support for GL objects using the traditional BindObject scheme, but
-// that need to be reference counted for correct cross-context deletion.
-// (Concretely, textures, buffers and renderbuffers.)
-
-#ifndef LIBANGLE_REFCOUNTOBJECT_H_
-#define LIBANGLE_REFCOUNTOBJECT_H_
-
-#include "angle_gl.h"
-#include "common/debug.h"
-#include "libANGLE/Error.h"
-
-#include <cstddef>
-
-namespace gl
-{
-class Context;
-
-class RefCountObjectNoID : angle::NonCopyable
-{
- public:
- RefCountObjectNoID() : mRefCount(0) {}
- virtual Error onDestroy(const Context *context);
-
- void addRef() const { ++mRefCount; }
-
- void release() const
- {
- ASSERT(mRefCount > 0);
-
- if (--mRefCount == 0)
- {
- delete this;
- }
- }
-
- size_t getRefCount() const { return mRefCount; }
-
- protected:
- virtual ~RefCountObjectNoID();
-
- // A specialized release method for objects which need a destroy context.
- void release(const gl::Context *context)
- {
- ASSERT(mRefCount > 0);
- if (--mRefCount == 0)
- {
- ANGLE_SWALLOW_ERR(onDestroy(context));
- delete this;
- }
- }
-
- template <class ObjectType>
- friend class BindingPointer;
- mutable std::size_t mRefCount;
-};
-
-inline RefCountObjectNoID::~RefCountObjectNoID()
-{
- ASSERT(mRefCount == 0);
-}
-
-inline Error RefCountObjectNoID::onDestroy(const Context *context)
-{
- return NoError();
-}
-
-template <class ObjectType>
-class BindingPointer;
-
-class RefCountObject : RefCountObjectNoID
-{
- public:
- explicit RefCountObject(GLuint id) : mId(id) {}
-
- GLuint id() const { return mId; }
-
- using RefCountObjectNoID::release;
- using RefCountObjectNoID::addRef;
- using RefCountObjectNoID::getRefCount;
-
- protected:
- ~RefCountObject() override {}
-
- private:
- GLuint mId;
-};
-
-template <class ObjectType>
-class BindingPointer
-{
- public:
- BindingPointer()
- : mObject(nullptr)
- {
- }
-
- BindingPointer(ObjectType *object) : mObject(object) { mObject->addRef(); }
-
- BindingPointer(const BindingPointer<ObjectType> &other) : mObject(other.mObject)
- {
- mObject->addRef();
- }
-
- BindingPointer &operator=(BindingPointer<ObjectType> &&other)
- {
- std::swap(mObject, other.mObject);
- return *this;
- }
-
- virtual ~BindingPointer()
- {
- // Objects have to be released before the resource manager is destroyed, so they must be explicitly cleaned up.
- ASSERT(mObject == nullptr);
- }
-
- virtual void set(const Context *context, ObjectType *newObject)
- {
- // addRef first in case newObject == mObject and this is the last reference to it.
- if (newObject != nullptr) reinterpret_cast<const RefCountObjectNoID*>(newObject)->addRef();
- if (mObject != nullptr)
- reinterpret_cast<RefCountObjectNoID *>(mObject)->release(context);
- mObject = newObject;
- }
-
- ObjectType *get() const { return mObject; }
- ObjectType *operator->() const { return mObject; }
-
- GLuint id() const { return (mObject != nullptr) ? mObject->id() : 0; }
-
- bool operator==(const BindingPointer<ObjectType> &other) const
- {
- return mObject == other.mObject;
- }
-
- bool operator!=(const BindingPointer<ObjectType> &other) const { return !(*this == other); }
-
- private:
- ObjectType *mObject;
-};
-
-template <class ObjectType>
-class OffsetBindingPointer : public BindingPointer<ObjectType>
-{
- public:
- OffsetBindingPointer() : mOffset(0), mSize(0) { }
-
- void set(const Context *context, ObjectType *newObject) override
- {
- BindingPointer<ObjectType>::set(context, newObject);
- mOffset = 0;
- mSize = 0;
- }
-
- void set(const Context *context, ObjectType *newObject, GLintptr offset, GLsizeiptr size)
- {
- BindingPointer<ObjectType>::set(context, newObject);
- mOffset = offset;
- mSize = size;
- }
-
- GLintptr getOffset() const { return mOffset; }
- GLsizeiptr getSize() const { return mSize; }
-
- bool operator==(const OffsetBindingPointer<ObjectType> &other) const
- {
- return this->get() == other.get() && mOffset == other.mOffset && mSize == other.mSize;
- }
-
- bool operator!=(const OffsetBindingPointer<ObjectType> &other) const
- {
- return !(*this == other);
- }
-
- private:
- GLintptr mOffset;
- GLsizeiptr mSize;
-};
-} // namespace gl
-
-#endif // LIBANGLE_REFCOUNTOBJECT_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Renderbuffer.cpp b/src/3rdparty/angle/src/libANGLE/Renderbuffer.cpp
deleted file mode 100644
index 8310f1abda..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Renderbuffer.cpp
+++ /dev/null
@@ -1,235 +0,0 @@
-//
-// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Renderbuffer.cpp: Implements the renderer-agnostic gl::Renderbuffer class,
-// GL renderbuffer objects and related functionality.
-// [OpenGL ES 2.0.24] section 4.4.3 page 108.
-
-#include "libANGLE/Renderbuffer.h"
-
-#include "common/utilities.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/Image.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/d3d/RenderTargetD3D.h"
-
-namespace gl
-{
-Renderbuffer::Renderbuffer(rx::RenderbufferImpl *impl, GLuint id)
- : egl::ImageSibling(id),
- mRenderbuffer(impl),
- mLabel(),
- mWidth(0),
- mHeight(0),
- mFormat(GL_RGBA4),
- mSamples(0),
- mInitState(InitState::MayNeedInit)
-{
-}
-
-Error Renderbuffer::onDestroy(const Context *context)
-{
- ANGLE_TRY(orphanImages(context));
-
- if (mRenderbuffer)
- {
- ANGLE_TRY(mRenderbuffer->onDestroy(context));
- }
-
- return NoError();
-}
-
-Renderbuffer::~Renderbuffer()
-{
- SafeDelete(mRenderbuffer);
-}
-
-void Renderbuffer::setLabel(const std::string &label)
-{
- mLabel = label;
-}
-
-const std::string &Renderbuffer::getLabel() const
-{
- return mLabel;
-}
-
-Error Renderbuffer::setStorage(const Context *context,
- GLenum internalformat,
- size_t width,
- size_t height)
-{
- ANGLE_TRY(orphanImages(context));
-
- ANGLE_TRY(mRenderbuffer->setStorage(context, internalformat, width, height));
-
- mWidth = static_cast<GLsizei>(width);
- mHeight = static_cast<GLsizei>(height);
- mFormat = Format(internalformat);
- mSamples = 0;
-
- mInitState = InitState::MayNeedInit;
- mDirtyChannel.signal(mInitState);
-
- return NoError();
-}
-
-Error Renderbuffer::setStorageMultisample(const Context *context,
- size_t samples,
- GLenum internalformat,
- size_t width,
- size_t height)
-{
- ANGLE_TRY(orphanImages(context));
-
- ANGLE_TRY(
- mRenderbuffer->setStorageMultisample(context, samples, internalformat, width, height));
-
- mWidth = static_cast<GLsizei>(width);
- mHeight = static_cast<GLsizei>(height);
- mFormat = Format(internalformat);
- mSamples = static_cast<GLsizei>(samples);
-
- mInitState = InitState::MayNeedInit;
- mDirtyChannel.signal(mInitState);
-
- return NoError();
-}
-
-Error Renderbuffer::setStorageEGLImageTarget(const Context *context, egl::Image *image)
-{
- ANGLE_TRY(orphanImages(context));
-
- ANGLE_TRY(mRenderbuffer->setStorageEGLImageTarget(context, image));
-
- setTargetImage(context, image);
-
- mWidth = static_cast<GLsizei>(image->getWidth());
- mHeight = static_cast<GLsizei>(image->getHeight());
- mFormat = Format(image->getFormat());
- mSamples = 0;
-
- mInitState = image->sourceInitState();
- mDirtyChannel.signal(mInitState);
-
- return NoError();
-}
-
-rx::RenderbufferImpl *Renderbuffer::getImplementation() const
-{
- ASSERT(mRenderbuffer);
- return mRenderbuffer;
-}
-
-GLsizei Renderbuffer::getWidth() const
-{
- return mWidth;
-}
-
-GLsizei Renderbuffer::getHeight() const
-{
- return mHeight;
-}
-
-const Format &Renderbuffer::getFormat() const
-{
- return mFormat;
-}
-
-GLsizei Renderbuffer::getSamples() const
-{
- return mSamples;
-}
-
-GLuint Renderbuffer::getRedSize() const
-{
- return mFormat.info->redBits;
-}
-
-GLuint Renderbuffer::getGreenSize() const
-{
- return mFormat.info->greenBits;
-}
-
-GLuint Renderbuffer::getBlueSize() const
-{
- return mFormat.info->blueBits;
-}
-
-GLuint Renderbuffer::getAlphaSize() const
-{
- return mFormat.info->alphaBits;
-}
-
-GLuint Renderbuffer::getDepthSize() const
-{
- return mFormat.info->depthBits;
-}
-
-GLuint Renderbuffer::getStencilSize() const
-{
- return mFormat.info->stencilBits;
-}
-
-void Renderbuffer::onAttach(const Context *context)
-{
- addRef();
-}
-
-void Renderbuffer::onDetach(const Context *context)
-{
- release(context);
-}
-
-GLuint Renderbuffer::getId() const
-{
- return id();
-}
-
-Extents Renderbuffer::getAttachmentSize(const gl::ImageIndex & /*imageIndex*/) const
-{
- return Extents(mWidth, mHeight, 1);
-}
-
-const Format &Renderbuffer::getAttachmentFormat(GLenum /*binding*/,
- const ImageIndex & /*imageIndex*/) const
-{
- return getFormat();
-}
-GLsizei Renderbuffer::getAttachmentSamples(const ImageIndex & /*imageIndex*/) const
-{
- return getSamples();
-}
-
-InitState Renderbuffer::initState(const gl::ImageIndex & /*imageIndex*/) const
-{
- if (isEGLImageTarget())
- {
- return sourceEGLImageInitState();
- }
-
- return mInitState;
-}
-
-void Renderbuffer::setInitState(const gl::ImageIndex & /*imageIndex*/, InitState initState)
-{
- if (isEGLImageTarget())
- {
- setSourceEGLImageInitState(initState);
- }
- else
- {
- mInitState = initState;
- }
-}
-
-rx::FramebufferAttachmentObjectImpl *Renderbuffer::getAttachmentImpl() const
-{
- return mRenderbuffer;
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/Renderbuffer.h b/src/3rdparty/angle/src/libANGLE/Renderbuffer.h
deleted file mode 100644
index def18e6ff7..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Renderbuffer.h
+++ /dev/null
@@ -1,93 +0,0 @@
-//
-// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Renderbuffer.h: Defines the renderer-agnostic container class gl::Renderbuffer.
-// Implements GL renderbuffer objects and related functionality.
-// [OpenGL ES 2.0.24] section 4.4.3 page 108.
-
-#ifndef LIBANGLE_RENDERBUFFER_H_
-#define LIBANGLE_RENDERBUFFER_H_
-
-#include "angle_gl.h"
-#include "common/angleutils.h"
-#include "libANGLE/Debug.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/Image.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/RenderbufferImpl.h"
-
-namespace gl
-{
-// A GL renderbuffer object is usually used as a depth or stencil buffer attachment
-// for a framebuffer object. The renderbuffer itself is a distinct GL object, see
-// FramebufferAttachment and Framebuffer for how they are applied to an FBO via an
-// attachment point.
-
-class Renderbuffer final : public egl::ImageSibling,
- public LabeledObject
-{
- public:
- Renderbuffer(rx::RenderbufferImpl *impl, GLuint id);
- ~Renderbuffer() override;
-
- Error onDestroy(const Context *context) override;
-
- void setLabel(const std::string &label) override;
- const std::string &getLabel() const override;
-
- Error setStorage(const Context *context, GLenum internalformat, size_t width, size_t height);
- Error setStorageMultisample(const Context *context,
- size_t samples,
- GLenum internalformat,
- size_t width,
- size_t height);
- Error setStorageEGLImageTarget(const Context *context, egl::Image *imageTarget);
-
- rx::RenderbufferImpl *getImplementation() const;
-
- GLsizei getWidth() const;
- GLsizei getHeight() const;
- const Format &getFormat() const;
- GLsizei getSamples() const;
- GLuint getRedSize() const;
- GLuint getGreenSize() const;
- GLuint getBlueSize() const;
- GLuint getAlphaSize() const;
- GLuint getDepthSize() const;
- GLuint getStencilSize() const;
-
- // FramebufferAttachmentObject Impl
- Extents getAttachmentSize(const ImageIndex &imageIndex) const override;
- const Format &getAttachmentFormat(GLenum binding, const ImageIndex &imageIndex) const override;
- GLsizei getAttachmentSamples(const ImageIndex &imageIndex) const override;
-
- void onAttach(const Context *context) override;
- void onDetach(const Context *context) override;
- GLuint getId() const override;
-
- InitState initState(const ImageIndex &imageIndex) const override;
- void setInitState(const ImageIndex &imageIndex, InitState initState) override;
-
- private:
- rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override;
-
- rx::RenderbufferImpl *mRenderbuffer;
-
- std::string mLabel;
-
- GLsizei mWidth;
- GLsizei mHeight;
- Format mFormat;
- GLsizei mSamples;
-
- // For robust resource init.
- InitState mInitState;
-};
-
-} // namespace gl
-
-#endif // LIBANGLE_RENDERBUFFER_H_
diff --git a/src/3rdparty/angle/src/libANGLE/ResourceManager.cpp b/src/3rdparty/angle/src/libANGLE/ResourceManager.cpp
deleted file mode 100644
index 79eb7e5f42..0000000000
--- a/src/3rdparty/angle/src/libANGLE/ResourceManager.cpp
+++ /dev/null
@@ -1,483 +0,0 @@
-//
-// Copyright (c) 2002-2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ResourceManager.cpp: Implements the the ResourceManager classes, which handle allocation and
-// lifetime of GL objects.
-
-#include "libANGLE/ResourceManager.h"
-
-#include "libANGLE/Buffer.h"
-#include "libANGLE/Fence.h"
-#include "libANGLE/Path.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/ProgramPipeline.h"
-#include "libANGLE/Renderbuffer.h"
-#include "libANGLE/Sampler.h"
-#include "libANGLE/Shader.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/renderer/GLImplFactory.h"
-
-namespace gl
-{
-
-namespace
-{
-
-template <typename ResourceType>
-GLuint AllocateEmptyObject(HandleAllocator *handleAllocator, ResourceMap<ResourceType> *objectMap)
-{
- GLuint handle = handleAllocator->allocate();
- objectMap->assign(handle, nullptr);
- return handle;
-}
-
-} // anonymous namespace
-
-template <typename HandleAllocatorType>
-ResourceManagerBase<HandleAllocatorType>::ResourceManagerBase() : mRefCount(1)
-{
-}
-
-template <typename HandleAllocatorType>
-void ResourceManagerBase<HandleAllocatorType>::addRef()
-{
- mRefCount++;
-}
-
-template <typename HandleAllocatorType>
-void ResourceManagerBase<HandleAllocatorType>::release(const Context *context)
-{
- if (--mRefCount == 0)
- {
- reset(context);
- delete this;
- }
-}
-
-template <typename ResourceType, typename HandleAllocatorType, typename ImplT>
-TypedResourceManager<ResourceType, HandleAllocatorType, ImplT>::~TypedResourceManager()
-{
- ASSERT(mObjectMap.empty());
-}
-
-template <typename ResourceType, typename HandleAllocatorType, typename ImplT>
-void TypedResourceManager<ResourceType, HandleAllocatorType, ImplT>::reset(const Context *context)
-{
- this->mHandleAllocator.reset();
- for (const auto &resource : mObjectMap)
- {
- if (resource.second)
- {
- ImplT::DeleteObject(context, resource.second);
- }
- }
- mObjectMap.clear();
-}
-
-template <typename ResourceType, typename HandleAllocatorType, typename ImplT>
-void TypedResourceManager<ResourceType, HandleAllocatorType, ImplT>::deleteObject(
- const Context *context,
- GLuint handle)
-{
- ResourceType *resource = nullptr;
- if (!mObjectMap.erase(handle, &resource))
- {
- return;
- }
-
- // Requires an explicit this-> because of C++ template rules.
- this->mHandleAllocator.release(handle);
-
- if (resource)
- {
- ImplT::DeleteObject(context, resource);
- }
-}
-
-template class ResourceManagerBase<HandleAllocator>;
-template class ResourceManagerBase<HandleRangeAllocator>;
-template class TypedResourceManager<Buffer, HandleAllocator, BufferManager>;
-template class TypedResourceManager<Texture, HandleAllocator, TextureManager>;
-template class TypedResourceManager<Renderbuffer, HandleAllocator, RenderbufferManager>;
-template class TypedResourceManager<Sampler, HandleAllocator, SamplerManager>;
-template class TypedResourceManager<Sync, HandleAllocator, SyncManager>;
-template class TypedResourceManager<Framebuffer, HandleAllocator, FramebufferManager>;
-template class TypedResourceManager<ProgramPipeline, HandleAllocator, ProgramPipelineManager>;
-
-// BufferManager Implementation.
-
-// static
-Buffer *BufferManager::AllocateNewObject(rx::GLImplFactory *factory, GLuint handle)
-{
- Buffer *buffer = new Buffer(factory, handle);
- buffer->addRef();
- return buffer;
-}
-
-// static
-void BufferManager::DeleteObject(const Context *context, Buffer *buffer)
-{
- buffer->release(context);
-}
-
-GLuint BufferManager::createBuffer()
-{
- return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
-}
-
-Buffer *BufferManager::getBuffer(GLuint handle) const
-{
- return mObjectMap.query(handle);
-}
-
-// ShaderProgramManager Implementation.
-
-ShaderProgramManager::ShaderProgramManager()
-{
-}
-
-ShaderProgramManager::~ShaderProgramManager()
-{
- ASSERT(mPrograms.empty());
- ASSERT(mShaders.empty());
-}
-
-void ShaderProgramManager::reset(const Context *context)
-{
- while (!mPrograms.empty())
- {
- deleteProgram(context, mPrograms.begin()->first);
- }
- mPrograms.clear();
- while (!mShaders.empty())
- {
- deleteShader(context, mShaders.begin()->first);
- }
- mShaders.clear();
-}
-
-GLuint ShaderProgramManager::createShader(rx::GLImplFactory *factory,
- const gl::Limitations &rendererLimitations,
- GLenum type)
-{
- ASSERT(type == GL_VERTEX_SHADER || type == GL_FRAGMENT_SHADER || type == GL_COMPUTE_SHADER ||
- type == GL_GEOMETRY_SHADER_EXT);
- GLuint handle = mHandleAllocator.allocate();
- mShaders.assign(handle, new Shader(this, factory, rendererLimitations, type, handle));
- return handle;
-}
-
-void ShaderProgramManager::deleteShader(const Context *context, GLuint shader)
-{
- deleteObject(context, &mShaders, shader);
-}
-
-Shader *ShaderProgramManager::getShader(GLuint handle) const
-{
- return mShaders.query(handle);
-}
-
-GLuint ShaderProgramManager::createProgram(rx::GLImplFactory *factory)
-{
- GLuint handle = mHandleAllocator.allocate();
- mPrograms.assign(handle, new Program(factory, this, handle));
- return handle;
-}
-
-void ShaderProgramManager::deleteProgram(const gl::Context *context, GLuint program)
-{
- deleteObject(context, &mPrograms, program);
-}
-
-Program *ShaderProgramManager::getProgram(GLuint handle) const
-{
- return mPrograms.query(handle);
-}
-
-template <typename ObjectType>
-void ShaderProgramManager::deleteObject(const Context *context,
- ResourceMap<ObjectType> *objectMap,
- GLuint id)
-{
- ObjectType *object = objectMap->query(id);
- if (!object)
- {
- return;
- }
-
- if (object->getRefCount() == 0)
- {
- mHandleAllocator.release(id);
- object->onDestroy(context);
- objectMap->erase(id, &object);
- }
- else
- {
- object->flagForDeletion();
- }
-}
-
-// TextureManager Implementation.
-
-// static
-Texture *TextureManager::AllocateNewObject(rx::GLImplFactory *factory, GLuint handle, GLenum target)
-{
- Texture *texture = new Texture(factory, handle, target);
- texture->addRef();
- return texture;
-}
-
-// static
-void TextureManager::DeleteObject(const Context *context, Texture *texture)
-{
- texture->release(context);
-}
-
-GLuint TextureManager::createTexture()
-{
- return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
-}
-
-Texture *TextureManager::getTexture(GLuint handle) const
-{
- ASSERT(mObjectMap.query(0) == nullptr);
- return mObjectMap.query(handle);
-}
-
-void TextureManager::signalAllTexturesDirty() const
-{
- for (const auto &texture : mObjectMap)
- {
- if (texture.second)
- {
- // We don't know if the Texture needs init, but that's ok, since it will only force
- // a re-check, and will not initialize the pixels if it's not needed.
- texture.second->signalDirty(InitState::MayNeedInit);
- }
- }
-}
-
-// RenderbufferManager Implementation.
-
-// static
-Renderbuffer *RenderbufferManager::AllocateNewObject(rx::GLImplFactory *factory, GLuint handle)
-{
- Renderbuffer *renderbuffer = new Renderbuffer(factory->createRenderbuffer(), handle);
- renderbuffer->addRef();
- return renderbuffer;
-}
-
-// static
-void RenderbufferManager::DeleteObject(const Context *context, Renderbuffer *renderbuffer)
-{
- renderbuffer->release(context);
-}
-
-GLuint RenderbufferManager::createRenderbuffer()
-{
- return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
-}
-
-Renderbuffer *RenderbufferManager::getRenderbuffer(GLuint handle) const
-{
- return mObjectMap.query(handle);
-}
-
-// SamplerManager Implementation.
-
-// static
-Sampler *SamplerManager::AllocateNewObject(rx::GLImplFactory *factory, GLuint handle)
-{
- Sampler *sampler = new Sampler(factory, handle);
- sampler->addRef();
- return sampler;
-}
-
-// static
-void SamplerManager::DeleteObject(const Context *context, Sampler *sampler)
-{
- sampler->release(context);
-}
-
-GLuint SamplerManager::createSampler()
-{
- return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
-}
-
-Sampler *SamplerManager::getSampler(GLuint handle) const
-{
- return mObjectMap.query(handle);
-}
-
-bool SamplerManager::isSampler(GLuint sampler) const
-{
- return mObjectMap.contains(sampler);
-}
-
-// SyncManager Implementation.
-
-// static
-void SyncManager::DeleteObject(const Context *context, Sync *sync)
-{
- sync->release(context);
-}
-
-GLuint SyncManager::createSync(rx::GLImplFactory *factory)
-{
- GLuint handle = mHandleAllocator.allocate();
- Sync *sync = new Sync(factory->createSync(), handle);
- sync->addRef();
- mObjectMap.assign(handle, sync);
- return handle;
-}
-
-Sync *SyncManager::getSync(GLuint handle) const
-{
- return mObjectMap.query(handle);
-}
-
-// PathManager Implementation.
-
-PathManager::PathManager()
-{
-}
-
-ErrorOrResult<GLuint> PathManager::createPaths(rx::GLImplFactory *factory, GLsizei range)
-{
- // Allocate client side handles.
- const GLuint client = mHandleAllocator.allocateRange(static_cast<GLuint>(range));
- if (client == HandleRangeAllocator::kInvalidHandle)
- return OutOfMemory() << "Failed to allocate path handle range.";
-
- const auto &paths = factory->createPaths(range);
- if (paths.empty())
- {
- mHandleAllocator.releaseRange(client, range);
- return OutOfMemory() << "Failed to allocate path objects.";
- }
-
- for (GLsizei i = 0; i < range; ++i)
- {
- rx::PathImpl *impl = paths[static_cast<unsigned>(i)];
- const auto id = client + i;
- mPaths.assign(id, new Path(impl));
- }
- return client;
-}
-
-void PathManager::deletePaths(GLuint first, GLsizei range)
-{
- for (GLsizei i = 0; i < range; ++i)
- {
- const auto id = first + i;
- Path *p = nullptr;
- if (!mPaths.erase(id, &p))
- continue;
- delete p;
- }
- mHandleAllocator.releaseRange(first, static_cast<GLuint>(range));
-}
-
-Path *PathManager::getPath(GLuint handle) const
-{
- return mPaths.query(handle);
-}
-
-bool PathManager::hasPath(GLuint handle) const
-{
- return mHandleAllocator.isUsed(handle);
-}
-
-PathManager::~PathManager()
-{
- ASSERT(mPaths.empty());
-}
-
-void PathManager::reset(const Context *context)
-{
- for (auto path : mPaths)
- {
- SafeDelete(path.second);
- }
- mPaths.clear();
-}
-
-// FramebufferManager Implementation.
-
-// static
-Framebuffer *FramebufferManager::AllocateNewObject(rx::GLImplFactory *factory,
- GLuint handle,
- const Caps &caps)
-{
- return new Framebuffer(caps, factory, handle);
-}
-
-// static
-void FramebufferManager::DeleteObject(const Context *context, Framebuffer *framebuffer)
-{
- // Default framebuffer are owned by their respective Surface
- if (framebuffer->id() != 0)
- {
- framebuffer->onDestroy(context);
- delete framebuffer;
- }
-}
-
-GLuint FramebufferManager::createFramebuffer()
-{
- return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
-}
-
-Framebuffer *FramebufferManager::getFramebuffer(GLuint handle) const
-{
- return mObjectMap.query(handle);
-}
-
-void FramebufferManager::setDefaultFramebuffer(Framebuffer *framebuffer)
-{
- ASSERT(framebuffer == nullptr || framebuffer->id() == 0);
- mObjectMap.assign(0, framebuffer);
-}
-
-void FramebufferManager::invalidateFramebufferComplenessCache() const
-{
- for (const auto &framebuffer : mObjectMap)
- {
- if (framebuffer.second)
- {
- framebuffer.second->invalidateCompletenessCache();
- }
- }
-}
-
-// ProgramPipelineManager Implementation.
-
-// static
-ProgramPipeline *ProgramPipelineManager::AllocateNewObject(rx::GLImplFactory *factory,
- GLuint handle)
-{
- ProgramPipeline *pipeline = new ProgramPipeline(factory, handle);
- pipeline->addRef();
- return pipeline;
-}
-
-// static
-void ProgramPipelineManager::DeleteObject(const Context *context, ProgramPipeline *pipeline)
-{
- pipeline->release(context);
-}
-
-GLuint ProgramPipelineManager::createProgramPipeline()
-{
- return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
-}
-
-ProgramPipeline *ProgramPipelineManager::getProgramPipeline(GLuint handle) const
-{
- return mObjectMap.query(handle);
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/ResourceManager.h b/src/3rdparty/angle/src/libANGLE/ResourceManager.h
deleted file mode 100644
index 2dfeff5234..0000000000
--- a/src/3rdparty/angle/src/libANGLE/ResourceManager.h
+++ /dev/null
@@ -1,289 +0,0 @@
-//
-// Copyright (c) 2002-2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ResourceManager.h : Defines the ResourceManager classes, which handle allocation and lifetime of
-// GL objects.
-
-#ifndef LIBANGLE_RESOURCEMANAGER_H_
-#define LIBANGLE_RESOURCEMANAGER_H_
-
-#include "angle_gl.h"
-#include "common/angleutils.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/HandleAllocator.h"
-#include "libANGLE/HandleRangeAllocator.h"
-#include "libANGLE/ResourceMap.h"
-
-namespace rx
-{
-class GLImplFactory;
-}
-
-namespace gl
-{
-class Buffer;
-struct Caps;
-class Context;
-class Sync;
-class Framebuffer;
-struct Limitations;
-class Path;
-class Program;
-class ProgramPipeline;
-class Renderbuffer;
-class Sampler;
-class Shader;
-class Texture;
-
-template <typename HandleAllocatorType>
-class ResourceManagerBase : angle::NonCopyable
-{
- public:
- ResourceManagerBase();
-
- void addRef();
- void release(const Context *context);
-
- protected:
- virtual void reset(const Context *context) = 0;
- virtual ~ResourceManagerBase() {}
-
- HandleAllocatorType mHandleAllocator;
-
- private:
- size_t mRefCount;
-};
-
-template <typename ResourceType, typename HandleAllocatorType, typename ImplT>
-class TypedResourceManager : public ResourceManagerBase<HandleAllocatorType>
-{
- public:
- TypedResourceManager() {}
-
- void deleteObject(const Context *context, GLuint handle);
- bool isHandleGenerated(GLuint handle) const
- {
- // Zero is always assumed to have been generated implicitly.
- return handle == 0 || mObjectMap.contains(handle);
- }
-
- protected:
- ~TypedResourceManager() override;
-
- // Inlined in the header for performance.
- template <typename... ArgTypes>
- ResourceType *checkObjectAllocation(rx::GLImplFactory *factory, GLuint handle, ArgTypes... args)
- {
- ResourceType *value = mObjectMap.query(handle);
- if (value)
- {
- return value;
- }
-
- if (handle == 0)
- {
- return nullptr;
- }
-
- ResourceType *object = ImplT::AllocateNewObject(factory, handle, args...);
-
- if (!mObjectMap.contains(handle))
- {
- this->mHandleAllocator.reserve(handle);
- }
- mObjectMap.assign(handle, object);
-
- return object;
- }
-
- void reset(const Context *context) override;
-
- ResourceMap<ResourceType> mObjectMap;
-};
-
-class BufferManager : public TypedResourceManager<Buffer, HandleAllocator, BufferManager>
-{
- public:
- GLuint createBuffer();
- Buffer *getBuffer(GLuint handle) const;
-
- Buffer *checkBufferAllocation(rx::GLImplFactory *factory, GLuint handle)
- {
- return checkObjectAllocation(factory, handle);
- }
-
- // TODO(jmadill): Investigate design which doesn't expose these methods publicly.
- static Buffer *AllocateNewObject(rx::GLImplFactory *factory, GLuint handle);
- static void DeleteObject(const Context *context, Buffer *buffer);
-
- protected:
- ~BufferManager() override {}
-};
-
-class ShaderProgramManager : public ResourceManagerBase<HandleAllocator>
-{
- public:
- ShaderProgramManager();
-
- GLuint createShader(rx::GLImplFactory *factory,
- const Limitations &rendererLimitations,
- GLenum type);
- void deleteShader(const Context *context, GLuint shader);
- Shader *getShader(GLuint handle) const;
-
- GLuint createProgram(rx::GLImplFactory *factory);
- void deleteProgram(const Context *context, GLuint program);
- Program *getProgram(GLuint handle) const;
-
- protected:
- ~ShaderProgramManager() override;
-
- private:
- template <typename ObjectType>
- void deleteObject(const Context *context, ResourceMap<ObjectType> *objectMap, GLuint id);
-
- void reset(const Context *context) override;
-
- ResourceMap<Shader> mShaders;
- ResourceMap<Program> mPrograms;
-};
-
-class TextureManager : public TypedResourceManager<Texture, HandleAllocator, TextureManager>
-{
- public:
- GLuint createTexture();
- Texture *getTexture(GLuint handle) const;
-
- void signalAllTexturesDirty() const;
-
- Texture *checkTextureAllocation(rx::GLImplFactory *factory, GLuint handle, GLenum target)
- {
- return checkObjectAllocation(factory, handle, target);
- }
-
- static Texture *AllocateNewObject(rx::GLImplFactory *factory, GLuint handle, GLenum target);
- static void DeleteObject(const Context *context, Texture *texture);
-
- protected:
- ~TextureManager() override {}
-};
-
-class RenderbufferManager
- : public TypedResourceManager<Renderbuffer, HandleAllocator, RenderbufferManager>
-{
- public:
- GLuint createRenderbuffer();
- Renderbuffer *getRenderbuffer(GLuint handle) const;
-
- Renderbuffer *checkRenderbufferAllocation(rx::GLImplFactory *factory, GLuint handle)
- {
- return checkObjectAllocation(factory, handle);
- }
-
- static Renderbuffer *AllocateNewObject(rx::GLImplFactory *factory, GLuint handle);
- static void DeleteObject(const Context *context, Renderbuffer *renderbuffer);
-
- protected:
- ~RenderbufferManager() override {}
-};
-
-class SamplerManager : public TypedResourceManager<Sampler, HandleAllocator, SamplerManager>
-{
- public:
- GLuint createSampler();
- Sampler *getSampler(GLuint handle) const;
- bool isSampler(GLuint sampler) const;
-
- Sampler *checkSamplerAllocation(rx::GLImplFactory *factory, GLuint handle)
- {
- return checkObjectAllocation(factory, handle);
- }
-
- static Sampler *AllocateNewObject(rx::GLImplFactory *factory, GLuint handle);
- static void DeleteObject(const Context *context, Sampler *sampler);
-
- protected:
- ~SamplerManager() override {}
-};
-
-class SyncManager : public TypedResourceManager<Sync, HandleAllocator, SyncManager>
-{
- public:
- GLuint createSync(rx::GLImplFactory *factory);
- Sync *getSync(GLuint handle) const;
-
- static void DeleteObject(const Context *context, Sync *sync);
-
- protected:
- ~SyncManager() override {}
-};
-
-class PathManager : public ResourceManagerBase<HandleRangeAllocator>
-{
- public:
- PathManager();
-
- ErrorOrResult<GLuint> createPaths(rx::GLImplFactory *factory, GLsizei range);
- void deletePaths(GLuint first, GLsizei range);
- Path *getPath(GLuint handle) const;
- bool hasPath(GLuint handle) const;
-
- protected:
- ~PathManager() override;
- void reset(const Context *context) override;
-
- private:
- ResourceMap<Path> mPaths;
-};
-
-class FramebufferManager
- : public TypedResourceManager<Framebuffer, HandleAllocator, FramebufferManager>
-{
- public:
- GLuint createFramebuffer();
- Framebuffer *getFramebuffer(GLuint handle) const;
- void setDefaultFramebuffer(Framebuffer *framebuffer);
-
- void invalidateFramebufferComplenessCache() const;
-
- Framebuffer *checkFramebufferAllocation(rx::GLImplFactory *factory,
- const Caps &caps,
- GLuint handle)
- {
- return checkObjectAllocation<const Caps &>(factory, handle, caps);
- }
-
- static Framebuffer *AllocateNewObject(rx::GLImplFactory *factory,
- GLuint handle,
- const Caps &caps);
- static void DeleteObject(const Context *context, Framebuffer *framebuffer);
-
- protected:
- ~FramebufferManager() override {}
-};
-
-class ProgramPipelineManager
- : public TypedResourceManager<ProgramPipeline, HandleAllocator, ProgramPipelineManager>
-{
- public:
- GLuint createProgramPipeline();
- ProgramPipeline *getProgramPipeline(GLuint handle) const;
-
- ProgramPipeline *checkProgramPipelineAllocation(rx::GLImplFactory *factory, GLuint handle)
- {
- return checkObjectAllocation(factory, handle);
- }
-
- static ProgramPipeline *AllocateNewObject(rx::GLImplFactory *factory, GLuint handle);
- static void DeleteObject(const Context *context, ProgramPipeline *pipeline);
-
- protected:
- ~ProgramPipelineManager() override {}
-};
-
-} // namespace gl
-
-#endif // LIBANGLE_RESOURCEMANAGER_H_
diff --git a/src/3rdparty/angle/src/libANGLE/ResourceMap.h b/src/3rdparty/angle/src/libANGLE/ResourceMap.h
deleted file mode 100644
index b00da68612..0000000000
--- a/src/3rdparty/angle/src/libANGLE/ResourceMap.h
+++ /dev/null
@@ -1,305 +0,0 @@
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// ResourceMap:
-// An optimized resource map which packs the first set of allocated objects into a
-// flat array, and then falls back to an unordered map for the higher handle values.
-//
-
-#ifndef LIBANGLE_RESOURCE_MAP_H_
-#define LIBANGLE_RESOURCE_MAP_H_
-
-#include "libANGLE/angletypes.h"
-
-namespace gl
-{
-
-template <typename ResourceType>
-class ResourceMap final : angle::NonCopyable
-{
- public:
- ResourceMap();
- ~ResourceMap();
-
- ResourceType *query(GLuint handle) const;
-
- // Returns true if the handle was reserved. Not necessarily if the resource is created.
- bool contains(GLuint handle) const;
-
- // Returns the element that was at this location.
- bool erase(GLuint handle, ResourceType **resourceOut);
-
- void assign(GLuint handle, ResourceType *resource);
-
- // Clears the map.
- void clear();
-
- using IndexAndResource = std::pair<GLuint, ResourceType *>;
- using HashMap = std::unordered_map<GLuint, ResourceType *>;
-
- class Iterator final
- {
- public:
- bool operator==(const Iterator &other) const;
- bool operator!=(const Iterator &other) const;
- Iterator &operator++();
- const IndexAndResource *operator->() const;
- const IndexAndResource &operator*() const;
-
- private:
- friend class ResourceMap;
- Iterator(const ResourceMap &origin,
- GLuint flatIndex,
- typename HashMap::const_iterator hashIndex);
- void updateValue();
-
- const ResourceMap &mOrigin;
- GLuint mFlatIndex;
- typename HashMap::const_iterator mHashIndex;
- IndexAndResource mValue;
- };
-
- // null values represent reserved handles.
- Iterator begin() const;
- Iterator end() const;
- Iterator find(GLuint handle) const;
-
- // Not a constant-time operation, should only be used for verification.
- bool empty() const;
-
- private:
- friend class Iterator;
-
- GLuint nextNonNullResource(size_t flatIndex) const;
-
- // constexpr methods cannot contain reinterpret_cast, so we need a static method.
- static ResourceType *InvalidPointer();
- static constexpr intptr_t kInvalidPointer = static_cast<intptr_t>(-1);
-
- // Start with 32 maximum elements in the map, which can grow.
- static constexpr size_t kInitialFlatResourcesSize = 0x20;
-
- // Experimental testing suggests that 16k is a reasonable upper limit.
- static constexpr size_t kFlatResourcesLimit = 0x4000;
-
- std::vector<ResourceType *> mFlatResources;
-
- // A map of GL objects indexed by object ID.
- HashMap mHashedResources;
-};
-
-template <typename ResourceType>
-ResourceMap<ResourceType>::ResourceMap()
- : mFlatResources(kInitialFlatResourcesSize, InvalidPointer()), mHashedResources()
-{
-}
-
-template <typename ResourceType>
-ResourceMap<ResourceType>::~ResourceMap()
-{
- ASSERT(empty());
-}
-
-template <typename ResourceType>
-ResourceType *ResourceMap<ResourceType>::query(GLuint handle) const
-{
- if (handle < mFlatResources.size())
- {
- auto value = mFlatResources[handle];
- return (value == InvalidPointer() ? nullptr : value);
- }
- auto it = mHashedResources.find(handle);
- return (it == mHashedResources.end() ? nullptr : it->second);
-}
-
-template <typename ResourceType>
-bool ResourceMap<ResourceType>::contains(GLuint handle) const
-{
- if (handle < mFlatResources.size())
- {
- return (mFlatResources[handle] != InvalidPointer());
- }
- return (mHashedResources.find(handle) != mHashedResources.end());
-}
-
-template <typename ResourceType>
-bool ResourceMap<ResourceType>::erase(GLuint handle, ResourceType **resourceOut)
-{
- if (handle < mFlatResources.size())
- {
- auto &value = mFlatResources[handle];
- if (value == InvalidPointer())
- {
- return false;
- }
- *resourceOut = value;
- value = InvalidPointer();
- }
- else
- {
- auto it = mHashedResources.find(handle);
- if (it == mHashedResources.end())
- {
- return false;
- }
- *resourceOut = it->second;
- mHashedResources.erase(it);
- }
- return true;
-}
-
-template <typename ResourceType>
-void ResourceMap<ResourceType>::assign(GLuint handle, ResourceType *resource)
-{
- if (handle < kFlatResourcesLimit)
- {
- if (handle >= mFlatResources.size())
- {
- // Use power-of-two.
- size_t newSize = mFlatResources.size();
- while (newSize <= handle)
- {
- newSize *= 2;
- }
- mFlatResources.resize(newSize, nullptr);
- }
- ASSERT(mFlatResources.size() > handle);
- mFlatResources[handle] = resource;
- }
- else
- {
- mHashedResources[handle] = resource;
- }
-}
-
-template <typename ResourceType>
-typename ResourceMap<ResourceType>::Iterator ResourceMap<ResourceType>::begin() const
-{
- return Iterator(*this, nextNonNullResource(0), mHashedResources.begin());
-}
-
-template <typename ResourceType>
-typename ResourceMap<ResourceType>::Iterator ResourceMap<ResourceType>::end() const
-{
- return Iterator(*this, static_cast<GLuint>(mFlatResources.size()), mHashedResources.end());
-}
-
-template <typename ResourceType>
-typename ResourceMap<ResourceType>::Iterator ResourceMap<ResourceType>::find(GLuint handle) const
-{
- if (handle < mFlatResources.size())
- {
- return (mFlatResources[handle] != InvalidPointer()
- ? Iterator(handle, mHashedResources.begin())
- : end());
- }
- else
- {
- return mHashedResources.find(handle);
- }
-}
-
-template <typename ResourceType>
-bool ResourceMap<ResourceType>::empty() const
-{
- return (begin() == end());
-}
-
-template <typename ResourceType>
-void ResourceMap<ResourceType>::clear()
-{
- mFlatResources.assign(kInitialFlatResourcesSize, InvalidPointer());
- mHashedResources.clear();
-}
-
-template <typename ResourceType>
-GLuint ResourceMap<ResourceType>::nextNonNullResource(size_t flatIndex) const
-{
- for (size_t index = flatIndex; index < mFlatResources.size(); index++)
- {
- if (mFlatResources[index] != nullptr && mFlatResources[index] != InvalidPointer())
- {
- return static_cast<GLuint>(index);
- }
- }
- return static_cast<GLuint>(mFlatResources.size());
-}
-
-template <typename ResourceType>
-// static
-ResourceType *ResourceMap<ResourceType>::InvalidPointer()
-{
- return reinterpret_cast<ResourceType *>(kInvalidPointer);
-}
-
-template <typename ResourceType>
-ResourceMap<ResourceType>::Iterator::Iterator(
- const ResourceMap &origin,
- GLuint flatIndex,
- typename ResourceMap<ResourceType>::HashMap::const_iterator hashIndex)
- : mOrigin(origin), mFlatIndex(flatIndex), mHashIndex(hashIndex), mValue()
-{
- updateValue();
-}
-
-template <typename ResourceType>
-bool ResourceMap<ResourceType>::Iterator::operator==(const Iterator &other) const
-{
- return (mFlatIndex == other.mFlatIndex && mHashIndex == other.mHashIndex);
-}
-
-template <typename ResourceType>
-bool ResourceMap<ResourceType>::Iterator::operator!=(const Iterator &other) const
-{
- return !(*this == other);
-}
-
-template <typename ResourceType>
-typename ResourceMap<ResourceType>::Iterator &ResourceMap<ResourceType>::Iterator::operator++()
-{
- if (mFlatIndex < static_cast<GLuint>(mOrigin.mFlatResources.size()))
- {
- mFlatIndex = mOrigin.nextNonNullResource(mFlatIndex + 1);
- }
- else
- {
- mHashIndex++;
- }
- updateValue();
- return *this;
-}
-
-template <typename ResourceType>
-const typename ResourceMap<ResourceType>::IndexAndResource
- *ResourceMap<ResourceType>::Iterator::operator->() const
-{
- return &mValue;
-}
-
-template <typename ResourceType>
-const typename ResourceMap<ResourceType>::IndexAndResource
- &ResourceMap<ResourceType>::Iterator::operator*() const
-{
- return mValue;
-}
-
-template <typename ResourceType>
-void ResourceMap<ResourceType>::Iterator::updateValue()
-{
- if (mFlatIndex < static_cast<GLuint>(mOrigin.mFlatResources.size()))
- {
- mValue.first = mFlatIndex;
- mValue.second = mOrigin.mFlatResources[mFlatIndex];
- }
- else if (mHashIndex != mOrigin.mHashedResources.end())
- {
- mValue.first = mHashIndex->first;
- mValue.second = mHashIndex->second;
- }
-}
-
-} // namespace gl
-
-#endif // LIBANGLE_RESOURCE_MAP_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Sampler.cpp b/src/3rdparty/angle/src/libANGLE/Sampler.cpp
deleted file mode 100644
index 0f05b697a2..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Sampler.cpp
+++ /dev/null
@@ -1,169 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Sampler.cpp : Implements the Sampler class, which represents a GLES 3
-// sampler object. Sampler objects store some state needed to sample textures.
-
-#include "libANGLE/Sampler.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/renderer/GLImplFactory.h"
-#include "libANGLE/renderer/SamplerImpl.h"
-
-namespace gl
-{
-
-Sampler::Sampler(rx::GLImplFactory *factory, GLuint id)
- : RefCountObject(id), mState(), mImpl(factory->createSampler(mState)), mLabel()
-{
-}
-
-Sampler::~Sampler()
-{
- SafeDelete(mImpl);
-}
-
-Error Sampler::onDestroy(const Context *context)
-{
- return NoError();
-}
-
-void Sampler::setLabel(const std::string &label)
-{
- mLabel = label;
-}
-
-const std::string &Sampler::getLabel() const
-{
- return mLabel;
-}
-
-void Sampler::setMinFilter(GLenum minFilter)
-{
- mState.minFilter = minFilter;
-}
-
-GLenum Sampler::getMinFilter() const
-{
- return mState.minFilter;
-}
-
-void Sampler::setMagFilter(GLenum magFilter)
-{
- mState.magFilter = magFilter;
-}
-
-GLenum Sampler::getMagFilter() const
-{
- return mState.magFilter;
-}
-
-void Sampler::setWrapS(GLenum wrapS)
-{
- mState.wrapS = wrapS;
-}
-
-GLenum Sampler::getWrapS() const
-{
- return mState.wrapS;
-}
-
-void Sampler::setWrapT(GLenum wrapT)
-{
- mState.wrapT = wrapT;
-}
-
-GLenum Sampler::getWrapT() const
-{
- return mState.wrapT;
-}
-
-void Sampler::setWrapR(GLenum wrapR)
-{
- mState.wrapR = wrapR;
-}
-
-GLenum Sampler::getWrapR() const
-{
- return mState.wrapR;
-}
-
-void Sampler::setMaxAnisotropy(float maxAnisotropy)
-{
- mState.maxAnisotropy = maxAnisotropy;
-}
-
-float Sampler::getMaxAnisotropy() const
-{
- return mState.maxAnisotropy;
-}
-
-void Sampler::setMinLod(GLfloat minLod)
-{
- mState.minLod = minLod;
-}
-
-GLfloat Sampler::getMinLod() const
-{
- return mState.minLod;
-}
-
-void Sampler::setMaxLod(GLfloat maxLod)
-{
- mState.maxLod = maxLod;
-}
-
-GLfloat Sampler::getMaxLod() const
-{
- return mState.maxLod;
-}
-
-void Sampler::setCompareMode(GLenum compareMode)
-{
- mState.compareMode = compareMode;
-}
-
-GLenum Sampler::getCompareMode() const
-{
- return mState.compareMode;
-}
-
-void Sampler::setCompareFunc(GLenum compareFunc)
-{
- mState.compareFunc = compareFunc;
-}
-
-GLenum Sampler::getCompareFunc() const
-{
- return mState.compareFunc;
-}
-
-void Sampler::setSRGBDecode(GLenum sRGBDecode)
-{
- mState.sRGBDecode = sRGBDecode;
-}
-
-GLenum Sampler::getSRGBDecode() const
-{
- return mState.sRGBDecode;
-}
-
-const SamplerState &Sampler::getSamplerState() const
-{
- return mState;
-}
-
-rx::SamplerImpl *Sampler::getImplementation() const
-{
- return mImpl;
-}
-
-void Sampler::syncState(const Context *context)
-{
- // TODO(jmadill): Use actual dirty bits for sampler.
- mImpl->syncState(context);
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/Sampler.h b/src/3rdparty/angle/src/libANGLE/Sampler.h
deleted file mode 100644
index cd34273b44..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Sampler.h
+++ /dev/null
@@ -1,85 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Sampler.h : Defines the Sampler class, which represents a GLES 3
-// sampler object. Sampler objects store some state needed to sample textures.
-
-#ifndef LIBANGLE_SAMPLER_H_
-#define LIBANGLE_SAMPLER_H_
-
-#include "libANGLE/angletypes.h"
-#include "libANGLE/Debug.h"
-#include "libANGLE/RefCountObject.h"
-
-namespace rx
-{
-class GLImplFactory;
-class SamplerImpl;
-}
-
-namespace gl
-{
-
-class Sampler final : public RefCountObject, public LabeledObject
-{
- public:
- Sampler(rx::GLImplFactory *factory, GLuint id);
- ~Sampler() override;
-
- Error onDestroy(const Context *context) override;
-
- void setLabel(const std::string &label) override;
- const std::string &getLabel() const override;
-
- void setMinFilter(GLenum minFilter);
- GLenum getMinFilter() const;
-
- void setMagFilter(GLenum magFilter);
- GLenum getMagFilter() const;
-
- void setWrapS(GLenum wrapS);
- GLenum getWrapS() const;
-
- void setWrapT(GLenum wrapT);
- GLenum getWrapT() const;
-
- void setWrapR(GLenum wrapR);
- GLenum getWrapR() const;
-
- void setMaxAnisotropy(float maxAnisotropy);
- float getMaxAnisotropy() const;
-
- void setMinLod(GLfloat minLod);
- GLfloat getMinLod() const;
-
- void setMaxLod(GLfloat maxLod);
- GLfloat getMaxLod() const;
-
- void setCompareMode(GLenum compareMode);
- GLenum getCompareMode() const;
-
- void setCompareFunc(GLenum compareFunc);
- GLenum getCompareFunc() const;
-
- void setSRGBDecode(GLenum sRGBDecode);
- GLenum getSRGBDecode() const;
-
- const SamplerState &getSamplerState() const;
-
- rx::SamplerImpl *getImplementation() const;
-
- void syncState(const Context *context);
-
- private:
- SamplerState mState;
- rx::SamplerImpl *mImpl;
-
- std::string mLabel;
-};
-
-} // namespace gl
-
-#endif // LIBANGLE_SAMPLER_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Shader.cpp b/src/3rdparty/angle/src/libANGLE/Shader.cpp
deleted file mode 100644
index 94c4f3c705..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Shader.cpp
+++ /dev/null
@@ -1,561 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Shader.cpp: Implements the gl::Shader class and its derived classes
-// VertexShader and FragmentShader. Implements GL shader objects and related
-// functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section 3.8 page 84.
-
-#include "libANGLE/Shader.h"
-
-#include <sstream>
-
-#include "common/utilities.h"
-#include "GLSLANG/ShaderLang.h"
-#include "libANGLE/Caps.h"
-#include "libANGLE/Compiler.h"
-#include "libANGLE/Constants.h"
-#include "libANGLE/renderer/GLImplFactory.h"
-#include "libANGLE/renderer/ShaderImpl.h"
-#include "libANGLE/ResourceManager.h"
-#include "libANGLE/Context.h"
-
-namespace gl
-{
-
-namespace
-{
-template <typename VarT>
-std::vector<VarT> GetActiveShaderVariables(const std::vector<VarT> *variableList)
-{
- ASSERT(variableList);
- std::vector<VarT> result;
- for (size_t varIndex = 0; varIndex < variableList->size(); varIndex++)
- {
- const VarT &var = variableList->at(varIndex);
- if (var.staticUse)
- {
- result.push_back(var);
- }
- }
- return result;
-}
-
-template <typename VarT>
-const std::vector<VarT> &GetShaderVariables(const std::vector<VarT> *variableList)
-{
- ASSERT(variableList);
- return *variableList;
-}
-
-} // anonymous namespace
-
-// true if varying x has a higher priority in packing than y
-bool CompareShaderVar(const sh::ShaderVariable &x, const sh::ShaderVariable &y)
-{
- if (x.type == y.type)
- {
- return x.getArraySizeProduct() > y.getArraySizeProduct();
- }
-
- // Special case for handling structs: we sort these to the end of the list
- if (x.type == GL_NONE)
- {
- return false;
- }
-
- if (y.type == GL_NONE)
- {
- return true;
- }
-
- return gl::VariableSortOrder(x.type) < gl::VariableSortOrder(y.type);
-}
-
-ShaderState::ShaderState(GLenum shaderType)
- : mLabel(),
- mShaderType(shaderType),
- mShaderVersion(100),
- mNumViews(-1),
- mGeometryShaderInputPrimitiveType(GL_INVALID_VALUE),
- mGeometryShaderOutputPrimitiveType(GL_INVALID_VALUE),
- mGeometryShaderInvocations(1),
- mGeometryShaderMaxVertices(-1),
- mCompileStatus(CompileStatus::NOT_COMPILED)
-{
- mLocalSize.fill(-1);
-}
-
-ShaderState::~ShaderState()
-{
-}
-
-Shader::Shader(ShaderProgramManager *manager,
- rx::GLImplFactory *implFactory,
- const gl::Limitations &rendererLimitations,
- GLenum type,
- GLuint handle)
- : mState(type),
- mImplementation(implFactory->createShader(mState)),
- mRendererLimitations(rendererLimitations),
- mHandle(handle),
- mType(type),
- mRefCount(0),
- mDeleteStatus(false),
- mResourceManager(manager)
-{
- ASSERT(mImplementation);
-}
-
-void Shader::onDestroy(const gl::Context *context)
-{
- mBoundCompiler.set(context, nullptr);
- mImplementation.reset(nullptr);
- delete this;
-}
-
-Shader::~Shader()
-{
- ASSERT(!mImplementation);
-}
-
-void Shader::setLabel(const std::string &label)
-{
- mState.mLabel = label;
-}
-
-const std::string &Shader::getLabel() const
-{
- return mState.mLabel;
-}
-
-GLuint Shader::getHandle() const
-{
- return mHandle;
-}
-
-void Shader::setSource(GLsizei count, const char *const *string, const GLint *length)
-{
- std::ostringstream stream;
-
- for (int i = 0; i < count; i++)
- {
- if (length == nullptr || length[i] < 0)
- {
- stream.write(string[i], strlen(string[i]));
- }
- else
- {
- stream.write(string[i], length[i]);
- }
- }
-
- mState.mSource = stream.str();
-}
-
-int Shader::getInfoLogLength(const Context *context)
-{
- resolveCompile(context);
- if (mInfoLog.empty())
- {
- return 0;
- }
-
- return (static_cast<int>(mInfoLog.length()) + 1);
-}
-
-void Shader::getInfoLog(const Context *context, GLsizei bufSize, GLsizei *length, char *infoLog)
-{
- resolveCompile(context);
-
- int index = 0;
-
- if (bufSize > 0)
- {
- index = std::min(bufSize - 1, static_cast<GLsizei>(mInfoLog.length()));
- memcpy(infoLog, mInfoLog.c_str(), index);
-
- infoLog[index] = '\0';
- }
-
- if (length)
- {
- *length = index;
- }
-}
-
-int Shader::getSourceLength() const
-{
- return mState.mSource.empty() ? 0 : (static_cast<int>(mState.mSource.length()) + 1);
-}
-
-int Shader::getTranslatedSourceLength(const Context *context)
-{
- resolveCompile(context);
-
- if (mState.mTranslatedSource.empty())
- {
- return 0;
- }
-
- return (static_cast<int>(mState.mTranslatedSource.length()) + 1);
-}
-
-int Shader::getTranslatedSourceWithDebugInfoLength(const Context *context)
-{
- resolveCompile(context);
-
- const std::string &debugInfo = mImplementation->getDebugInfo();
- if (debugInfo.empty())
- {
- return 0;
- }
-
- return (static_cast<int>(debugInfo.length()) + 1);
-}
-
-// static
-void Shader::GetSourceImpl(const std::string &source,
- GLsizei bufSize,
- GLsizei *length,
- char *buffer)
-{
- int index = 0;
-
- if (bufSize > 0)
- {
- index = std::min(bufSize - 1, static_cast<GLsizei>(source.length()));
- memcpy(buffer, source.c_str(), index);
-
- buffer[index] = '\0';
- }
-
- if (length)
- {
- *length = index;
- }
-}
-
-void Shader::getSource(GLsizei bufSize, GLsizei *length, char *buffer) const
-{
- GetSourceImpl(mState.mSource, bufSize, length, buffer);
-}
-
-void Shader::getTranslatedSource(const Context *context,
- GLsizei bufSize,
- GLsizei *length,
- char *buffer)
-{
- GetSourceImpl(getTranslatedSource(context), bufSize, length, buffer);
-}
-
-const std::string &Shader::getTranslatedSource(const Context *context)
-{
- resolveCompile(context);
- return mState.mTranslatedSource;
-}
-
-void Shader::getTranslatedSourceWithDebugInfo(const Context *context,
- GLsizei bufSize,
- GLsizei *length,
- char *buffer)
-{
- resolveCompile(context);
- const std::string &debugInfo = mImplementation->getDebugInfo();
- GetSourceImpl(debugInfo, bufSize, length, buffer);
-}
-
-void Shader::compile(const Context *context)
-{
- mState.mTranslatedSource.clear();
- mInfoLog.clear();
- mState.mShaderVersion = 100;
- mState.mInputVaryings.clear();
- mState.mOutputVaryings.clear();
- mState.mUniforms.clear();
- mState.mUniformBlocks.clear();
- mState.mShaderStorageBlocks.clear();
- mState.mActiveAttributes.clear();
- mState.mActiveOutputVariables.clear();
- mState.mNumViews = -1;
- mState.mGeometryShaderInputPrimitiveType = GL_INVALID_VALUE;
- mState.mGeometryShaderOutputPrimitiveType = GL_INVALID_VALUE;
- mState.mGeometryShaderInvocations = 1;
- mState.mGeometryShaderMaxVertices = -1;
-
- 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;
-
- mLastCompileOptions =
- mImplementation->prepareSourceAndReturnOptions(&sourceStream, &mLastCompiledSourcePath);
- mLastCompileOptions |= (SH_OBJECT_CODE | SH_VARIABLES);
- mLastCompiledSource = sourceStream.str();
-
- // Add default options to WebGL shaders to prevent unexpected behavior during compilation.
- if (context->getExtensions().webglCompatibility)
- {
- mLastCompileOptions |= SH_INIT_GL_POSITION;
- mLastCompileOptions |= SH_LIMIT_CALL_STACK_DEPTH;
- mLastCompileOptions |= SH_LIMIT_EXPRESSION_COMPLEXITY;
- mLastCompileOptions |= SH_ENFORCE_PACKING_RESTRICTIONS;
- }
-
- // 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)
- {
- mLastCompileOptions |= SH_VALIDATE_LOOP_INDEXING;
- }
-}
-
-void Shader::resolveCompile(const Context *context)
-{
- if (!mState.compilePending())
- {
- return;
- }
-
- ASSERT(mBoundCompiler.get());
- ShHandle compilerHandle = mBoundCompiler->getCompilerHandle(mState.mShaderType);
-
- std::vector<const char *> srcStrings;
-
- if (!mLastCompiledSourcePath.empty())
- {
- srcStrings.push_back(mLastCompiledSourcePath.c_str());
- }
-
- srcStrings.push_back(mLastCompiledSource.c_str());
-
- if (!sh::Compile(compilerHandle, &srcStrings[0], srcStrings.size(), mLastCompileOptions))
- {
- mInfoLog = sh::GetInfoLog(compilerHandle);
- WARN() << std::endl << mInfoLog;
- mState.mCompileStatus = CompileStatus::NOT_COMPILED;
- return;
- }
-
- mState.mTranslatedSource = sh::GetObjectCode(compilerHandle);
-
-#if !defined(NDEBUG)
- // Prefix translated shader with commented out un-translated shader.
- // Useful in diagnostics tools which capture the shader source.
- std::ostringstream shaderStream;
- shaderStream << "// GLSL\n";
- shaderStream << "//\n";
-
- std::istringstream inputSourceStream(mState.mSource);
- std::string line;
- while (std::getline(inputSourceStream, line))
- {
- // Remove null characters from the source line
- line.erase(std::remove(line.begin(), line.end(), '\0'), line.end());
-
- shaderStream << "// " << line << std::endl;
- }
- shaderStream << "\n\n";
- shaderStream << mState.mTranslatedSource;
- mState.mTranslatedSource = shaderStream.str();
-#endif // !defined(NDEBUG)
-
- // Gather the shader information
- mState.mShaderVersion = sh::GetShaderVersion(compilerHandle);
-
- mState.mUniforms = GetShaderVariables(sh::GetUniforms(compilerHandle));
- mState.mUniformBlocks = GetShaderVariables(sh::GetUniformBlocks(compilerHandle));
- mState.mShaderStorageBlocks = GetShaderVariables(sh::GetShaderStorageBlocks(compilerHandle));
-
- switch (mState.mShaderType)
- {
- case GL_COMPUTE_SHADER:
- {
- mState.mLocalSize = sh::GetComputeShaderLocalGroupSize(compilerHandle);
- break;
- }
- case GL_VERTEX_SHADER:
- {
- {
- mState.mOutputVaryings = GetShaderVariables(sh::GetOutputVaryings(compilerHandle));
- mState.mActiveAttributes =
- GetActiveShaderVariables(sh::GetAttributes(compilerHandle));
- mState.mNumViews = sh::GetVertexShaderNumViews(compilerHandle);
- }
- break;
- }
- case GL_FRAGMENT_SHADER:
- {
- mState.mInputVaryings = GetShaderVariables(sh::GetInputVaryings(compilerHandle));
- // TODO(jmadill): Figure out why we only sort in the FS, and if we need to.
- std::sort(mState.mInputVaryings.begin(), mState.mInputVaryings.end(), CompareShaderVar);
- mState.mActiveOutputVariables =
- GetActiveShaderVariables(sh::GetOutputVariables(compilerHandle));
- break;
- }
- case GL_GEOMETRY_SHADER_EXT:
- {
- mState.mInputVaryings = GetShaderVariables(sh::GetInputVaryings(compilerHandle));
- mState.mOutputVaryings = GetShaderVariables(sh::GetOutputVaryings(compilerHandle));
-
- mState.mGeometryShaderInputPrimitiveType =
- sh::GetGeometryShaderInputPrimitiveType(compilerHandle);
- mState.mGeometryShaderOutputPrimitiveType =
- sh::GetGeometryShaderOutputPrimitiveType(compilerHandle);
- mState.mGeometryShaderInvocations = sh::GetGeometryShaderInvocations(compilerHandle);
- mState.mGeometryShaderMaxVertices = sh::GetGeometryShaderMaxVertices(compilerHandle);
- break;
- }
- default:
- UNREACHABLE();
- }
-
- ASSERT(!mState.mTranslatedSource.empty());
-
- bool success = mImplementation->postTranslateCompile(mBoundCompiler.get(), &mInfoLog);
- mState.mCompileStatus = success ? CompileStatus::COMPILED : CompileStatus::NOT_COMPILED;
-}
-
-void Shader::addRef()
-{
- mRefCount++;
-}
-
-void Shader::release(const Context *context)
-{
- mRefCount--;
-
- if (mRefCount == 0 && mDeleteStatus)
- {
- mResourceManager->deleteShader(context, mHandle);
- }
-}
-
-unsigned int Shader::getRefCount() const
-{
- return mRefCount;
-}
-
-bool Shader::isFlaggedForDeletion() const
-{
- return mDeleteStatus;
-}
-
-void Shader::flagForDeletion()
-{
- mDeleteStatus = true;
-}
-
-bool Shader::isCompiled(const Context *context)
-{
- resolveCompile(context);
- return mState.mCompileStatus == CompileStatus::COMPILED;
-}
-
-int Shader::getShaderVersion(const Context *context)
-{
- resolveCompile(context);
- return mState.mShaderVersion;
-}
-
-const std::vector<sh::Varying> &Shader::getInputVaryings(const Context *context)
-{
- resolveCompile(context);
- return mState.getInputVaryings();
-}
-
-const std::vector<sh::Varying> &Shader::getOutputVaryings(const Context *context)
-{
- resolveCompile(context);
- return mState.getOutputVaryings();
-}
-
-const std::vector<sh::Uniform> &Shader::getUniforms(const Context *context)
-{
- resolveCompile(context);
- return mState.getUniforms();
-}
-
-const std::vector<sh::InterfaceBlock> &Shader::getUniformBlocks(const Context *context)
-{
- resolveCompile(context);
- return mState.getUniformBlocks();
-}
-
-const std::vector<sh::InterfaceBlock> &Shader::getShaderStorageBlocks(const Context *context)
-{
- resolveCompile(context);
- return mState.getShaderStorageBlocks();
-}
-
-const std::vector<sh::Attribute> &Shader::getActiveAttributes(const Context *context)
-{
- resolveCompile(context);
- return mState.getActiveAttributes();
-}
-
-const std::vector<sh::OutputVariable> &Shader::getActiveOutputVariables(const Context *context)
-{
- resolveCompile(context);
- return mState.getActiveOutputVariables();
-}
-
-std::string Shader::getTransformFeedbackVaryingMappedName(const std::string &tfVaryingName,
- const Context *context)
-{
- // TODO(jiawei.shao@intel.com): support transform feedback on geometry shader.
- ASSERT(mState.getShaderType() == GL_VERTEX_SHADER);
- const auto &varyings = getOutputVaryings(context);
- auto bracketPos = tfVaryingName.find("[");
- if (bracketPos != std::string::npos)
- {
- auto tfVaryingBaseName = tfVaryingName.substr(0, bracketPos);
- for (const auto &varying : varyings)
- {
- if (varying.name == tfVaryingBaseName)
- {
- std::string mappedNameWithArrayIndex =
- varying.mappedName + tfVaryingName.substr(bracketPos);
- return mappedNameWithArrayIndex;
- }
- }
- }
- else
- {
- for (const auto &varying : varyings)
- {
- if (varying.name == tfVaryingName)
- {
- return varying.mappedName;
- }
- }
- }
- UNREACHABLE();
- return std::string();
-}
-
-const sh::WorkGroupSize &Shader::getWorkGroupSize(const Context *context)
-{
- resolveCompile(context);
- return mState.mLocalSize;
-}
-
-int Shader::getNumViews(const Context *context)
-{
- resolveCompile(context);
- return mState.mNumViews;
-}
-
-const std::string &Shader::getCompilerResourcesString() const
-{
- ASSERT(mBoundCompiler.get());
- return mBoundCompiler->getBuiltinResourcesString(mState.mShaderType);
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/Shader.h b/src/3rdparty/angle/src/libANGLE/Shader.h
deleted file mode 100644
index 4b6be4696d..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Shader.h
+++ /dev/null
@@ -1,212 +0,0 @@
-//
-// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Shader.h: Defines the abstract gl::Shader class and its concrete derived
-// classes VertexShader and FragmentShader. Implements GL shader objects and
-// related functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section
-// 3.8 page 84.
-
-#ifndef LIBANGLE_SHADER_H_
-#define LIBANGLE_SHADER_H_
-
-#include <list>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "angle_gl.h"
-#include <GLSLANG/ShaderLang.h>
-
-#include "common/Optional.h"
-#include "common/angleutils.h"
-#include "libANGLE/Debug.h"
-#include "libANGLE/angletypes.h"
-
-namespace rx
-{
-class GLImplFactory;
-class ShaderImpl;
-class ShaderSh;
-}
-
-namespace gl
-{
-class Compiler;
-class ContextState;
-struct Limitations;
-class ShaderProgramManager;
-class Context;
-
-// We defer the compile until link time, or until properties are queried.
-enum class CompileStatus
-{
- NOT_COMPILED,
- COMPILE_REQUESTED,
- COMPILED,
-};
-
-class ShaderState final : angle::NonCopyable
-{
- public:
- ShaderState(GLenum shaderType);
- ~ShaderState();
-
- const std::string &getLabel() const { return mLabel; }
-
- const std::string &getSource() const { return mSource; }
- const std::string &getTranslatedSource() const { return mTranslatedSource; }
-
- GLenum getShaderType() const { return mShaderType; }
- int getShaderVersion() const { return mShaderVersion; }
-
- const std::vector<sh::Varying> &getInputVaryings() const { return mInputVaryings; }
- const std::vector<sh::Varying> &getOutputVaryings() const { return mOutputVaryings; }
- const std::vector<sh::Uniform> &getUniforms() const { return mUniforms; }
- const std::vector<sh::InterfaceBlock> &getUniformBlocks() const { return mUniformBlocks; }
- const std::vector<sh::InterfaceBlock> &getShaderStorageBlocks() const
- {
- return mShaderStorageBlocks;
- }
- const std::vector<sh::Attribute> &getActiveAttributes() const { return mActiveAttributes; }
- const std::vector<sh::OutputVariable> &getActiveOutputVariables() const
- {
- return mActiveOutputVariables;
- }
-
- bool compilePending() const { return mCompileStatus == CompileStatus::COMPILE_REQUESTED; }
-
- private:
- friend class Shader;
-
- std::string mLabel;
-
- GLenum mShaderType;
- int mShaderVersion;
- std::string mTranslatedSource;
- std::string mSource;
-
- sh::WorkGroupSize mLocalSize;
-
- std::vector<sh::Varying> mInputVaryings;
- std::vector<sh::Varying> mOutputVaryings;
- std::vector<sh::Uniform> mUniforms;
- std::vector<sh::InterfaceBlock> mUniformBlocks;
- std::vector<sh::InterfaceBlock> mShaderStorageBlocks;
- std::vector<sh::Attribute> mActiveAttributes;
- std::vector<sh::OutputVariable> mActiveOutputVariables;
-
- // ANGLE_multiview.
- int mNumViews;
-
- // Geometry Shader.
- GLenum mGeometryShaderInputPrimitiveType;
- GLenum mGeometryShaderOutputPrimitiveType;
- int mGeometryShaderInvocations;
- int mGeometryShaderMaxVertices;
-
- // Indicates if this shader has been successfully compiled
- CompileStatus mCompileStatus;
-};
-
-class Shader final : angle::NonCopyable, public LabeledObject
-{
- public:
- Shader(ShaderProgramManager *manager,
- rx::GLImplFactory *implFactory,
- const gl::Limitations &rendererLimitations,
- GLenum type,
- GLuint handle);
-
- void onDestroy(const Context *context);
-
- void setLabel(const std::string &label) override;
- const std::string &getLabel() const override;
-
- GLenum getType() const { return mType; }
- GLuint getHandle() const;
-
- rx::ShaderImpl *getImplementation() const { return mImplementation.get(); }
-
- void setSource(GLsizei count, const char *const *string, const GLint *length);
- int getInfoLogLength(const Context *context);
- void getInfoLog(const Context *context, GLsizei bufSize, GLsizei *length, char *infoLog);
- int getSourceLength() const;
- const std::string &getSourceString() const { return mState.getSource(); }
- void getSource(GLsizei bufSize, GLsizei *length, char *buffer) const;
- int getTranslatedSourceLength(const Context *context);
- int getTranslatedSourceWithDebugInfoLength(const Context *context);
- const std::string &getTranslatedSource(const Context *context);
- void getTranslatedSource(const Context *context,
- GLsizei bufSize,
- GLsizei *length,
- char *buffer);
- void getTranslatedSourceWithDebugInfo(const Context *context,
- GLsizei bufSize,
- GLsizei *length,
- char *buffer);
-
- void compile(const Context *context);
- bool isCompiled(const Context *context);
-
- void addRef();
- void release(const Context *context);
- unsigned int getRefCount() const;
- bool isFlaggedForDeletion() const;
- void flagForDeletion();
-
- int getShaderVersion(const Context *context);
-
- const std::vector<sh::Varying> &getInputVaryings(const Context *context);
- const std::vector<sh::Varying> &getOutputVaryings(const Context *context);
- const std::vector<sh::Uniform> &getUniforms(const Context *context);
- const std::vector<sh::InterfaceBlock> &getUniformBlocks(const Context *context);
- const std::vector<sh::InterfaceBlock> &getShaderStorageBlocks(const Context *context);
- const std::vector<sh::Attribute> &getActiveAttributes(const Context *context);
- const std::vector<sh::OutputVariable> &getActiveOutputVariables(const Context *context);
-
- // Returns mapped name of a transform feedback varying. The original name may contain array
- // brackets with an index inside, which will get copied to the mapped name. The varying must be
- // known to be declared in the shader.
- std::string getTransformFeedbackVaryingMappedName(const std::string &tfVaryingName,
- const Context *context);
-
- const sh::WorkGroupSize &getWorkGroupSize(const Context *context);
-
- int getNumViews(const Context *context);
-
- const std::string &getCompilerResourcesString() const;
-
- private:
- ~Shader() override;
- static void GetSourceImpl(const std::string &source,
- GLsizei bufSize,
- GLsizei *length,
- char *buffer);
-
- void resolveCompile(const Context *context);
-
- ShaderState mState;
- std::string mLastCompiledSource;
- std::string mLastCompiledSourcePath;
- ShCompileOptions mLastCompileOptions;
- std::unique_ptr<rx::ShaderImpl> mImplementation;
- const gl::Limitations &mRendererLimitations;
- const GLuint mHandle;
- const GLenum mType;
- unsigned int mRefCount; // Number of program objects this shader is attached to
- bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use
- std::string mInfoLog;
-
- // We keep a reference to the translator in order to defer compiles while preserving settings.
- BindingPointer<Compiler> mBoundCompiler;
-
- ShaderProgramManager *mResourceManager;
-};
-
-bool CompareShaderVar(const sh::ShaderVariable &x, const sh::ShaderVariable &y);
-} // namespace gl
-
-#endif // LIBANGLE_SHADER_H_
diff --git a/src/3rdparty/angle/src/libANGLE/SizedMRUCache.h b/src/3rdparty/angle/src/libANGLE/SizedMRUCache.h
deleted file mode 100644
index 6a608a697e..0000000000
--- a/src/3rdparty/angle/src/libANGLE/SizedMRUCache.h
+++ /dev/null
@@ -1,174 +0,0 @@
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// SizedMRUCache.h: A hashing map that stores blobs of sized, untyped data.
-
-#ifndef LIBANGLE_SIZED_MRU_CACHE_H_
-#define LIBANGLE_SIZED_MRU_CACHE_H_
-
-#include <anglebase/containers/mru_cache.h>
-#include "common/third_party/smhasher/src/PMurHash.h"
-
-namespace angle
-{
-
-template <typename Key, typename Value>
-class SizedMRUCache final : angle::NonCopyable
-{
- public:
- SizedMRUCache(size_t maximumTotalSize)
- : mMaximumTotalSize(maximumTotalSize),
- mCurrentSize(0),
- mStore(SizedMRUCacheStore::NO_AUTO_EVICT)
- {
- }
-
- // Returns nullptr on failure.
- const Value *put(const Key &key, Value &&value, size_t size)
- {
- if (size > mMaximumTotalSize)
- {
- return nullptr;
- }
-
- // Check for existing key.
- eraseByKey(key);
-
- auto retVal = mStore.Put(key, ValueAndSize(std::move(value), size));
- mCurrentSize += size;
-
- shrinkToSize(mMaximumTotalSize);
-
- return &retVal->second.value;
- }
-
- bool get(const Key &key, const Value **valueOut)
- {
- const auto &iter = mStore.Get(key);
- if (iter == mStore.end())
- {
- return false;
- }
- *valueOut = &iter->second.value;
- return true;
- }
-
- bool getAt(size_t index, Key *keyOut, const Value **valueOut)
- {
- if (index < mStore.size())
- {
- auto it = mStore.begin();
- std::advance(it, index);
- *keyOut = it->first;
- *valueOut = &it->second.value;
- return true;
- }
- *valueOut = nullptr;
- return false;
- }
-
- bool empty() const { return mStore.empty(); }
-
- void clear()
- {
- mStore.Clear();
- mCurrentSize = 0;
- }
-
- bool eraseByKey(const Key &key)
- {
- // Check for existing key.
- auto existing = mStore.Peek(key);
- if (existing != mStore.end())
- {
- mCurrentSize -= existing->second.size;
- mStore.Erase(existing);
- return true;
- }
-
- return false;
- }
-
- size_t entryCount() const { return mStore.size(); }
-
- size_t size() const { return mCurrentSize; }
-
- // Also discards the cache contents.
- void resize(size_t maximumTotalSize)
- {
- clear();
- mMaximumTotalSize = maximumTotalSize;
- }
-
- // Reduce current memory usage.
- size_t shrinkToSize(size_t limit)
- {
- size_t initialSize = mCurrentSize;
-
- while (mCurrentSize > limit)
- {
- ASSERT(!mStore.empty());
- auto iter = mStore.rbegin();
- mCurrentSize -= iter->second.size;
- mStore.Erase(iter);
- }
-
- return (initialSize - mCurrentSize);
- }
-
- size_t maxSize() const { return mMaximumTotalSize; }
-
- private:
- struct ValueAndSize
- {
- ValueAndSize() : value(), size(0) {}
- ValueAndSize(Value &&value, size_t size) : value(std::move(value)), size(size) {}
- ValueAndSize(ValueAndSize &&other) : ValueAndSize() { *this = std::move(other); }
- ValueAndSize &operator=(ValueAndSize &&other)
- {
- std::swap(value, other.value);
- std::swap(size, other.size);
- return *this;
- }
-
- Value value;
- size_t size;
- };
-
- using SizedMRUCacheStore = base::HashingMRUCache<Key, ValueAndSize>;
-
- size_t mMaximumTotalSize;
- size_t mCurrentSize;
- SizedMRUCacheStore mStore;
-};
-
-// Helper function used in a few places.
-template <typename T>
-void TrimCache(size_t maxStates, size_t gcLimit, const char *name, T *cache)
-{
- const size_t kGarbageCollectionLimit = maxStates / 2 + gcLimit;
-
- if (cache->size() >= kGarbageCollectionLimit)
- {
- WARN() << "Overflowed the " << name << " cache limit of " << (maxStates / 2)
- << " elements, removing the least recently used to make room.";
- cache->ShrinkToSize(maxStates / 2);
- }
-}
-
-// Computes a hash of struct "key". Any structs passed to this function must be multiples of
-// 4 bytes, since the PMurhHas32 method can only operate increments of 4-byte words.
-template <typename T>
-std::size_t ComputeGenericHash(const T &key)
-{
- static const unsigned int seed = 0xABCDEF98;
-
- // We can't support "odd" alignments.
- static_assert(sizeof(key) % 4 == 0, "ComputeGenericHash requires aligned types");
- return PMurHash32(seed, &key, sizeof(T));
-}
-
-} // namespace angle
-#endif // LIBANGLE_SIZED_MRU_CACHE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/State.cpp b/src/3rdparty/angle/src/libANGLE/State.cpp
deleted file mode 100644
index f87e963710..0000000000
--- a/src/3rdparty/angle/src/libANGLE/State.cpp
+++ /dev/null
@@ -1,2433 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// State.cpp: Implements the State class, encapsulating raw GL state.
-
-#include "libANGLE/State.h"
-
-#include <limits>
-#include <string.h>
-
-#include "common/bitset_utils.h"
-#include "common/mathutil.h"
-#include "common/matrix_utils.h"
-#include "libANGLE/Caps.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Debug.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/Query.h"
-#include "libANGLE/VertexArray.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/queryconversions.h"
-#include "libANGLE/renderer/ContextImpl.h"
-
-namespace
-{
-
-GLenum ActiveQueryType(const GLenum type)
-{
- return (type == GL_ANY_SAMPLES_PASSED_CONSERVATIVE) ? GL_ANY_SAMPLES_PASSED : type;
-}
-
-} // anonymous namepace
-
-namespace gl
-{
-
-State::State()
- : mMaxDrawBuffers(0),
- mMaxCombinedTextureImageUnits(0),
- mDepthClearValue(0),
- mStencilClearValue(0),
- mScissorTest(false),
- mSampleCoverage(false),
- mSampleCoverageValue(0),
- mSampleCoverageInvert(false),
- mSampleMask(false),
- mMaxSampleMaskWords(0),
- mStencilRef(0),
- mStencilBackRef(0),
- mLineWidth(0),
- mGenerateMipmapHint(GL_NONE),
- mFragmentShaderDerivativeHint(GL_NONE),
- mBindGeneratesResource(true),
- mClientArraysEnabled(true),
- mNearZ(0),
- mFarZ(0),
- mReadFramebuffer(nullptr),
- mDrawFramebuffer(nullptr),
- mProgram(nullptr),
- mVertexArray(nullptr),
- mActiveSampler(0),
- mPrimitiveRestart(false),
- mMultiSampling(false),
- mSampleAlphaToOne(false),
- mFramebufferSRGB(true),
- mRobustResourceInit(false),
- mProgramBinaryCacheEnabled(false)
-{
-}
-
-State::~State()
-{
-}
-
-void State::initialize(const Context *context,
- bool debug,
- bool bindGeneratesResource,
- bool clientArraysEnabled,
- bool robustResourceInit,
- bool programBinaryCacheEnabled)
-{
- const Caps &caps = context->getCaps();
- const Extensions &extensions = context->getExtensions();
- const Extensions &nativeExtensions = context->getImplementation()->getNativeExtensions();
- const Version &clientVersion = context->getClientVersion();
-
- mMaxDrawBuffers = caps.maxDrawBuffers;
- mMaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
-
- setColorClearValue(0.0f, 0.0f, 0.0f, 0.0f);
-
- mDepthClearValue = 1.0f;
- mStencilClearValue = 0;
-
- mScissorTest = false;
- mScissor.x = 0;
- mScissor.y = 0;
- mScissor.width = 0;
- mScissor.height = 0;
-
- mBlendColor.red = 0;
- mBlendColor.green = 0;
- mBlendColor.blue = 0;
- mBlendColor.alpha = 0;
-
- mStencilRef = 0;
- mStencilBackRef = 0;
-
- mSampleCoverage = false;
- mSampleCoverageValue = 1.0f;
- mSampleCoverageInvert = false;
-
- mMaxSampleMaskWords = caps.maxSampleMaskWords;
- mSampleMask = false;
- mSampleMaskValues.fill(~GLbitfield(0));
-
- mGenerateMipmapHint = GL_DONT_CARE;
- mFragmentShaderDerivativeHint = GL_DONT_CARE;
-
- mBindGeneratesResource = bindGeneratesResource;
- mClientArraysEnabled = clientArraysEnabled;
-
- mLineWidth = 1.0f;
-
- mViewport.x = 0;
- mViewport.y = 0;
- mViewport.width = 0;
- mViewport.height = 0;
- mNearZ = 0.0f;
- mFarZ = 1.0f;
-
- mBlend.colorMaskRed = true;
- mBlend.colorMaskGreen = true;
- mBlend.colorMaskBlue = true;
- mBlend.colorMaskAlpha = true;
-
- mActiveSampler = 0;
-
- mVertexAttribCurrentValues.resize(caps.maxVertexAttributes);
-
- mUniformBuffers.resize(caps.maxUniformBufferBindings);
-
- mSamplerTextures[GL_TEXTURE_2D].resize(caps.maxCombinedTextureImageUnits);
- mSamplerTextures[GL_TEXTURE_CUBE_MAP].resize(caps.maxCombinedTextureImageUnits);
- if (clientVersion >= Version(3, 0))
- {
- // TODO: These could also be enabled via extension
- mSamplerTextures[GL_TEXTURE_2D_ARRAY].resize(caps.maxCombinedTextureImageUnits);
- mSamplerTextures[GL_TEXTURE_3D].resize(caps.maxCombinedTextureImageUnits);
- }
- if (clientVersion >= Version(3, 1))
- {
- mSamplerTextures[GL_TEXTURE_2D_MULTISAMPLE].resize(caps.maxCombinedTextureImageUnits);
-
- mAtomicCounterBuffers.resize(caps.maxAtomicCounterBufferBindings);
- mShaderStorageBuffers.resize(caps.maxShaderStorageBufferBindings);
- mImageUnits.resize(caps.maxImageUnits);
- }
- if (nativeExtensions.textureRectangle)
- {
- mSamplerTextures[GL_TEXTURE_RECTANGLE_ANGLE].resize(caps.maxCombinedTextureImageUnits);
- }
- if (nativeExtensions.eglImageExternal || nativeExtensions.eglStreamConsumerExternal)
- {
- mSamplerTextures[GL_TEXTURE_EXTERNAL_OES].resize(caps.maxCombinedTextureImageUnits);
- }
- mCompleteTextureCache.resize(caps.maxCombinedTextureImageUnits, nullptr);
- mCompleteTextureBindings.reserve(caps.maxCombinedTextureImageUnits);
- mCachedTexturesInitState = InitState::MayNeedInit;
- for (uint32_t textureIndex = 0; textureIndex < caps.maxCombinedTextureImageUnits;
- ++textureIndex)
- {
- mCompleteTextureBindings.emplace_back(OnAttachmentDirtyBinding(this, textureIndex));
- }
-
- mSamplers.resize(caps.maxCombinedTextureImageUnits);
-
- mActiveQueries[GL_ANY_SAMPLES_PASSED].set(context, nullptr);
- mActiveQueries[GL_ANY_SAMPLES_PASSED_CONSERVATIVE].set(context, nullptr);
- mActiveQueries[GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN].set(context, nullptr);
- mActiveQueries[GL_TIME_ELAPSED_EXT].set(context, nullptr);
- mActiveQueries[GL_COMMANDS_COMPLETED_CHROMIUM].set(context, nullptr);
-
- mProgram = nullptr;
-
- mReadFramebuffer = nullptr;
- mDrawFramebuffer = nullptr;
-
- mPrimitiveRestart = false;
-
- mDebug.setOutputEnabled(debug);
- mDebug.setMaxLoggedMessages(extensions.maxDebugLoggedMessages);
-
- mMultiSampling = true;
- mSampleAlphaToOne = false;
-
- mCoverageModulation = GL_NONE;
-
- angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
- angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
- mPathStencilFunc = GL_ALWAYS;
- mPathStencilRef = 0;
- mPathStencilMask = std::numeric_limits<GLuint>::max();
-
- mRobustResourceInit = robustResourceInit;
- mProgramBinaryCacheEnabled = programBinaryCacheEnabled;
-}
-
-void State::reset(const Context *context)
-{
- for (auto &bindingVec : mSamplerTextures)
- {
- TextureBindingVector &textureVector = bindingVec.second;
- for (size_t textureIdx = 0; textureIdx < textureVector.size(); textureIdx++)
- {
- textureVector[textureIdx].set(context, nullptr);
- }
- }
- for (size_t samplerIdx = 0; samplerIdx < mSamplers.size(); samplerIdx++)
- {
- mSamplers[samplerIdx].set(context, nullptr);
- }
-
- for (auto &imageUnit : mImageUnits)
- {
- imageUnit.texture.set(context, nullptr);
- imageUnit.level = 0;
- imageUnit.layered = false;
- imageUnit.layer = 0;
- imageUnit.access = GL_READ_ONLY;
- imageUnit.format = GL_R32UI;
- }
-
- mRenderbuffer.set(context, nullptr);
-
- for (auto type : angle::AllEnums<BufferBinding>())
- {
- mBoundBuffers[type].set(context, nullptr);
- }
-
- if (mProgram)
- {
- mProgram->release(context);
- }
- mProgram = nullptr;
-
- mProgramPipeline.set(context, nullptr);
-
- mTransformFeedback.set(context, nullptr);
-
- for (State::ActiveQueryMap::iterator i = mActiveQueries.begin(); i != mActiveQueries.end(); i++)
- {
- i->second.set(context, nullptr);
- }
-
- for (auto &buf : mUniformBuffers)
- {
- buf.set(context, nullptr);
- }
-
- for (auto &buf : mAtomicCounterBuffers)
- {
- buf.set(context, nullptr);
- }
-
- for (auto &buf : mShaderStorageBuffers)
- {
- buf.set(context, nullptr);
- }
-
- angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
- angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
- mPathStencilFunc = GL_ALWAYS;
- mPathStencilRef = 0;
- mPathStencilMask = std::numeric_limits<GLuint>::max();
-
- // TODO(jmadill): Is this necessary?
- setAllDirtyBits();
-}
-
-const RasterizerState &State::getRasterizerState() const
-{
- return mRasterizer;
-}
-
-const BlendState &State::getBlendState() const
-{
- return mBlend;
-}
-
-const DepthStencilState &State::getDepthStencilState() const
-{
- return mDepthStencil;
-}
-
-void State::setColorClearValue(float red, float green, float blue, float alpha)
-{
- mColorClearValue.red = red;
- mColorClearValue.green = green;
- mColorClearValue.blue = blue;
- mColorClearValue.alpha = alpha;
- mDirtyBits.set(DIRTY_BIT_CLEAR_COLOR);
-}
-
-void State::setDepthClearValue(float depth)
-{
- mDepthClearValue = depth;
- mDirtyBits.set(DIRTY_BIT_CLEAR_DEPTH);
-}
-
-void State::setStencilClearValue(int stencil)
-{
- mStencilClearValue = stencil;
- mDirtyBits.set(DIRTY_BIT_CLEAR_STENCIL);
-}
-
-void State::setColorMask(bool red, bool green, bool blue, bool alpha)
-{
- mBlend.colorMaskRed = red;
- mBlend.colorMaskGreen = green;
- mBlend.colorMaskBlue = blue;
- mBlend.colorMaskAlpha = alpha;
- mDirtyBits.set(DIRTY_BIT_COLOR_MASK);
-}
-
-void State::setDepthMask(bool mask)
-{
- mDepthStencil.depthMask = mask;
- mDirtyBits.set(DIRTY_BIT_DEPTH_MASK);
-}
-
-bool State::isRasterizerDiscardEnabled() const
-{
- return mRasterizer.rasterizerDiscard;
-}
-
-void State::setRasterizerDiscard(bool enabled)
-{
- mRasterizer.rasterizerDiscard = enabled;
- mDirtyBits.set(DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
-}
-
-bool State::isCullFaceEnabled() const
-{
- return mRasterizer.cullFace;
-}
-
-void State::setCullFace(bool enabled)
-{
- mRasterizer.cullFace = enabled;
- mDirtyBits.set(DIRTY_BIT_CULL_FACE_ENABLED);
-}
-
-void State::setCullMode(CullFaceMode mode)
-{
- mRasterizer.cullMode = mode;
- mDirtyBits.set(DIRTY_BIT_CULL_FACE);
-}
-
-void State::setFrontFace(GLenum front)
-{
- mRasterizer.frontFace = front;
- mDirtyBits.set(DIRTY_BIT_FRONT_FACE);
-}
-
-bool State::isDepthTestEnabled() const
-{
- return mDepthStencil.depthTest;
-}
-
-void State::setDepthTest(bool enabled)
-{
- mDepthStencil.depthTest = enabled;
- mDirtyBits.set(DIRTY_BIT_DEPTH_TEST_ENABLED);
-}
-
-void State::setDepthFunc(GLenum depthFunc)
-{
- mDepthStencil.depthFunc = depthFunc;
- mDirtyBits.set(DIRTY_BIT_DEPTH_FUNC);
-}
-
-void State::setDepthRange(float zNear, float zFar)
-{
- mNearZ = zNear;
- mFarZ = zFar;
- mDirtyBits.set(DIRTY_BIT_DEPTH_RANGE);
-}
-
-float State::getNearPlane() const
-{
- return mNearZ;
-}
-
-float State::getFarPlane() const
-{
- return mFarZ;
-}
-
-bool State::isBlendEnabled() const
-{
- return mBlend.blend;
-}
-
-void State::setBlend(bool enabled)
-{
- mBlend.blend = enabled;
- mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
-}
-
-void State::setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha)
-{
- mBlend.sourceBlendRGB = sourceRGB;
- mBlend.destBlendRGB = destRGB;
- mBlend.sourceBlendAlpha = sourceAlpha;
- mBlend.destBlendAlpha = destAlpha;
- mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS);
-}
-
-void State::setBlendColor(float red, float green, float blue, float alpha)
-{
- mBlendColor.red = red;
- mBlendColor.green = green;
- mBlendColor.blue = blue;
- mBlendColor.alpha = alpha;
- mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
-}
-
-void State::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation)
-{
- mBlend.blendEquationRGB = rgbEquation;
- mBlend.blendEquationAlpha = alphaEquation;
- mDirtyBits.set(DIRTY_BIT_BLEND_EQUATIONS);
-}
-
-const ColorF &State::getBlendColor() const
-{
- return mBlendColor;
-}
-
-bool State::isStencilTestEnabled() const
-{
- return mDepthStencil.stencilTest;
-}
-
-void State::setStencilTest(bool enabled)
-{
- mDepthStencil.stencilTest = enabled;
- mDirtyBits.set(DIRTY_BIT_STENCIL_TEST_ENABLED);
-}
-
-void State::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask)
-{
- mDepthStencil.stencilFunc = stencilFunc;
- mStencilRef = (stencilRef > 0) ? stencilRef : 0;
- mDepthStencil.stencilMask = stencilMask;
- mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
-}
-
-void State::setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask)
-{
- mDepthStencil.stencilBackFunc = stencilBackFunc;
- mStencilBackRef = (stencilBackRef > 0) ? stencilBackRef : 0;
- mDepthStencil.stencilBackMask = stencilBackMask;
- mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK);
-}
-
-void State::setStencilWritemask(GLuint stencilWritemask)
-{
- mDepthStencil.stencilWritemask = stencilWritemask;
- mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
-}
-
-void State::setStencilBackWritemask(GLuint stencilBackWritemask)
-{
- mDepthStencil.stencilBackWritemask = stencilBackWritemask;
- mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
-}
-
-void State::setStencilOperations(GLenum stencilFail, GLenum stencilPassDepthFail, GLenum stencilPassDepthPass)
-{
- mDepthStencil.stencilFail = stencilFail;
- mDepthStencil.stencilPassDepthFail = stencilPassDepthFail;
- mDepthStencil.stencilPassDepthPass = stencilPassDepthPass;
- mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT);
-}
-
-void State::setStencilBackOperations(GLenum stencilBackFail, GLenum stencilBackPassDepthFail, GLenum stencilBackPassDepthPass)
-{
- mDepthStencil.stencilBackFail = stencilBackFail;
- mDepthStencil.stencilBackPassDepthFail = stencilBackPassDepthFail;
- mDepthStencil.stencilBackPassDepthPass = stencilBackPassDepthPass;
- mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK);
-}
-
-GLint State::getStencilRef() const
-{
- return mStencilRef;
-}
-
-GLint State::getStencilBackRef() const
-{
- return mStencilBackRef;
-}
-
-bool State::isPolygonOffsetFillEnabled() const
-{
- return mRasterizer.polygonOffsetFill;
-}
-
-void State::setPolygonOffsetFill(bool enabled)
-{
- mRasterizer.polygonOffsetFill = enabled;
- mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED);
-}
-
-void State::setPolygonOffsetParams(GLfloat factor, GLfloat units)
-{
- // An application can pass NaN values here, so handle this gracefully
- mRasterizer.polygonOffsetFactor = factor != factor ? 0.0f : factor;
- mRasterizer.polygonOffsetUnits = units != units ? 0.0f : units;
- mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET);
-}
-
-bool State::isSampleAlphaToCoverageEnabled() const
-{
- return mBlend.sampleAlphaToCoverage;
-}
-
-void State::setSampleAlphaToCoverage(bool enabled)
-{
- mBlend.sampleAlphaToCoverage = enabled;
- mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED);
-}
-
-bool State::isSampleCoverageEnabled() const
-{
- return mSampleCoverage;
-}
-
-void State::setSampleCoverage(bool enabled)
-{
- mSampleCoverage = enabled;
- mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE_ENABLED);
-}
-
-void State::setSampleCoverageParams(GLclampf value, bool invert)
-{
- mSampleCoverageValue = value;
- mSampleCoverageInvert = invert;
- mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE);
-}
-
-GLclampf State::getSampleCoverageValue() const
-{
- return mSampleCoverageValue;
-}
-
-bool State::getSampleCoverageInvert() const
-{
- return mSampleCoverageInvert;
-}
-
-bool State::isSampleMaskEnabled() const
-{
- return mSampleMask;
-}
-
-void State::setSampleMaskEnabled(bool enabled)
-{
- mSampleMask = enabled;
- mDirtyBits.set(DIRTY_BIT_SAMPLE_MASK_ENABLED);
-}
-
-void State::setSampleMaskParams(GLuint maskNumber, GLbitfield mask)
-{
- ASSERT(maskNumber < mMaxSampleMaskWords);
- mSampleMaskValues[maskNumber] = mask;
- // TODO(jmadill): Use a child dirty bit if we ever use more than two words.
- mDirtyBits.set(DIRTY_BIT_SAMPLE_MASK);
-}
-
-GLbitfield State::getSampleMaskWord(GLuint maskNumber) const
-{
- ASSERT(maskNumber < mMaxSampleMaskWords);
- return mSampleMaskValues[maskNumber];
-}
-
-GLuint State::getMaxSampleMaskWords() const
-{
- return mMaxSampleMaskWords;
-}
-
-void State::setSampleAlphaToOne(bool enabled)
-{
- mSampleAlphaToOne = enabled;
- mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_ONE);
-}
-
-bool State::isSampleAlphaToOneEnabled() const
-{
- return mSampleAlphaToOne;
-}
-
-void State::setMultisampling(bool enabled)
-{
- mMultiSampling = enabled;
- mDirtyBits.set(DIRTY_BIT_MULTISAMPLING);
-}
-
-bool State::isMultisamplingEnabled() const
-{
- return mMultiSampling;
-}
-
-bool State::isScissorTestEnabled() const
-{
- return mScissorTest;
-}
-
-void State::setScissorTest(bool enabled)
-{
- mScissorTest = enabled;
- mDirtyBits.set(DIRTY_BIT_SCISSOR_TEST_ENABLED);
-}
-
-void State::setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- mScissor.x = x;
- mScissor.y = y;
- mScissor.width = width;
- mScissor.height = height;
- mDirtyBits.set(DIRTY_BIT_SCISSOR);
-}
-
-const Rectangle &State::getScissor() const
-{
- return mScissor;
-}
-
-bool State::isDitherEnabled() const
-{
- return mBlend.dither;
-}
-
-void State::setDither(bool enabled)
-{
- mBlend.dither = enabled;
- mDirtyBits.set(DIRTY_BIT_DITHER_ENABLED);
-}
-
-bool State::isPrimitiveRestartEnabled() const
-{
- return mPrimitiveRestart;
-}
-
-void State::setPrimitiveRestart(bool enabled)
-{
- mPrimitiveRestart = enabled;
- mDirtyBits.set(DIRTY_BIT_PRIMITIVE_RESTART_ENABLED);
-}
-
-void State::setEnableFeature(GLenum feature, bool enabled)
-{
- switch (feature)
- {
- case GL_MULTISAMPLE_EXT: setMultisampling(enabled); break;
- case GL_SAMPLE_ALPHA_TO_ONE_EXT: setSampleAlphaToOne(enabled); break;
- case GL_CULL_FACE: setCullFace(enabled); break;
- case GL_POLYGON_OFFSET_FILL: setPolygonOffsetFill(enabled); break;
- case GL_SAMPLE_ALPHA_TO_COVERAGE: setSampleAlphaToCoverage(enabled); break;
- case GL_SAMPLE_COVERAGE: setSampleCoverage(enabled); break;
- case GL_SCISSOR_TEST: setScissorTest(enabled); break;
- case GL_STENCIL_TEST: setStencilTest(enabled); break;
- case GL_DEPTH_TEST: setDepthTest(enabled); break;
- case GL_BLEND: setBlend(enabled); break;
- case GL_DITHER: setDither(enabled); break;
- case GL_PRIMITIVE_RESTART_FIXED_INDEX: setPrimitiveRestart(enabled); break;
- case GL_RASTERIZER_DISCARD: setRasterizerDiscard(enabled); break;
- case GL_SAMPLE_MASK:
- setSampleMaskEnabled(enabled);
- break;
- case GL_DEBUG_OUTPUT_SYNCHRONOUS:
- mDebug.setOutputSynchronous(enabled);
- break;
- case GL_DEBUG_OUTPUT:
- mDebug.setOutputEnabled(enabled);
- break;
- case GL_FRAMEBUFFER_SRGB_EXT:
- setFramebufferSRGB(enabled);
- break;
- default: UNREACHABLE();
- }
-}
-
-bool State::getEnableFeature(GLenum feature) const
-{
- switch (feature)
- {
- case GL_MULTISAMPLE_EXT: return isMultisamplingEnabled();
- case GL_SAMPLE_ALPHA_TO_ONE_EXT: return isSampleAlphaToOneEnabled();
- case GL_CULL_FACE: return isCullFaceEnabled();
- case GL_POLYGON_OFFSET_FILL: return isPolygonOffsetFillEnabled();
- case GL_SAMPLE_ALPHA_TO_COVERAGE: return isSampleAlphaToCoverageEnabled();
- case GL_SAMPLE_COVERAGE: return isSampleCoverageEnabled();
- case GL_SCISSOR_TEST: return isScissorTestEnabled();
- case GL_STENCIL_TEST: return isStencilTestEnabled();
- case GL_DEPTH_TEST: return isDepthTestEnabled();
- case GL_BLEND: return isBlendEnabled();
- case GL_DITHER: return isDitherEnabled();
- case GL_PRIMITIVE_RESTART_FIXED_INDEX: return isPrimitiveRestartEnabled();
- case GL_RASTERIZER_DISCARD: return isRasterizerDiscardEnabled();
- case GL_SAMPLE_MASK:
- return isSampleMaskEnabled();
- case GL_DEBUG_OUTPUT_SYNCHRONOUS:
- return mDebug.isOutputSynchronous();
- case GL_DEBUG_OUTPUT:
- return mDebug.isOutputEnabled();
- case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
- return isBindGeneratesResourceEnabled();
- case GL_CLIENT_ARRAYS_ANGLE:
- return areClientArraysEnabled();
- case GL_FRAMEBUFFER_SRGB_EXT:
- return getFramebufferSRGB();
- case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
- return mRobustResourceInit;
- case GL_PROGRAM_CACHE_ENABLED_ANGLE:
- return mProgramBinaryCacheEnabled;
-
- default:
- UNREACHABLE();
- return false;
- }
-}
-
-void State::setLineWidth(GLfloat width)
-{
- mLineWidth = width;
- mDirtyBits.set(DIRTY_BIT_LINE_WIDTH);
-}
-
-float State::getLineWidth() const
-{
- return mLineWidth;
-}
-
-void State::setGenerateMipmapHint(GLenum hint)
-{
- mGenerateMipmapHint = hint;
- mDirtyBits.set(DIRTY_BIT_GENERATE_MIPMAP_HINT);
-}
-
-void State::setFragmentShaderDerivativeHint(GLenum hint)
-{
- mFragmentShaderDerivativeHint = hint;
- mDirtyBits.set(DIRTY_BIT_SHADER_DERIVATIVE_HINT);
- // TODO: Propagate the hint to shader translator so we can write
- // ddx, ddx_coarse, or ddx_fine depending on the hint.
- // Ignore for now. It is valid for implementations to ignore hint.
-}
-
-bool State::isBindGeneratesResourceEnabled() const
-{
- return mBindGeneratesResource;
-}
-
-bool State::areClientArraysEnabled() const
-{
- return mClientArraysEnabled;
-}
-
-void State::setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height)
-{
- mViewport.x = x;
- mViewport.y = y;
- mViewport.width = width;
- mViewport.height = height;
- mDirtyBits.set(DIRTY_BIT_VIEWPORT);
-}
-
-const Rectangle &State::getViewport() const
-{
- return mViewport;
-}
-
-void State::setActiveSampler(unsigned int active)
-{
- mActiveSampler = active;
-}
-
-unsigned int State::getActiveSampler() const
-{
- return static_cast<unsigned int>(mActiveSampler);
-}
-
-void State::setSamplerTexture(const Context *context, GLenum type, Texture *texture)
-{
- mSamplerTextures[type][mActiveSampler].set(context, texture);
- mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
- mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
-}
-
-Texture *State::getTargetTexture(GLenum target) const
-{
- return getSamplerTexture(static_cast<unsigned int>(mActiveSampler), target);
-}
-
-Texture *State::getSamplerTexture(unsigned int sampler, GLenum type) const
-{
- const auto it = mSamplerTextures.find(type);
- ASSERT(it != mSamplerTextures.end());
- ASSERT(sampler < it->second.size());
- return it->second[sampler].get();
-}
-
-GLuint State::getSamplerTextureId(unsigned int sampler, GLenum type) const
-{
- const auto it = mSamplerTextures.find(type);
- ASSERT(it != mSamplerTextures.end());
- ASSERT(sampler < it->second.size());
- return it->second[sampler].id();
-}
-
-void State::detachTexture(const Context *context, const TextureMap &zeroTextures, GLuint texture)
-{
- // Textures have a detach method on State rather than a simple
- // removeBinding, because the zero/null texture objects are managed
- // separately, and don't have to go through the Context's maps or
- // the ResourceManager.
-
- // [OpenGL ES 2.0.24] section 3.8 page 84:
- // If a texture object is deleted, it is as if all texture units which are bound to that texture object are
- // rebound to texture object zero
-
- for (auto &bindingVec : mSamplerTextures)
- {
- GLenum textureType = bindingVec.first;
- TextureBindingVector &textureVector = bindingVec.second;
- for (BindingPointer<Texture> &binding : textureVector)
- {
- if (binding.id() == texture)
- {
- auto it = zeroTextures.find(textureType);
- ASSERT(it != zeroTextures.end());
- // Zero textures are the "default" textures instead of NULL
- binding.set(context, it->second.get());
- mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
- }
- }
- }
-
- for (auto &bindingImageUnit : mImageUnits)
- {
- if (bindingImageUnit.texture.id() == texture)
- {
- bindingImageUnit.texture.set(context, nullptr);
- bindingImageUnit.level = 0;
- bindingImageUnit.layered = false;
- bindingImageUnit.layer = 0;
- bindingImageUnit.access = GL_READ_ONLY;
- bindingImageUnit.format = GL_R32UI;
- break;
- }
- }
-
- // [OpenGL ES 2.0.24] section 4.4 page 112:
- // If a texture object is deleted while its image is attached to the currently bound framebuffer, then it is
- // as if Texture2DAttachment had been called, with a texture of 0, for each attachment point to which this
- // image was attached in the currently bound framebuffer.
-
- if (mReadFramebuffer && mReadFramebuffer->detachTexture(context, texture))
- {
- mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
- }
-
- if (mDrawFramebuffer && mDrawFramebuffer->detachTexture(context, texture))
- {
- mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
- }
-}
-
-void State::initializeZeroTextures(const Context *context, const TextureMap &zeroTextures)
-{
- for (const auto &zeroTexture : zeroTextures)
- {
- auto &samplerTextureArray = mSamplerTextures[zeroTexture.first];
-
- for (size_t textureUnit = 0; textureUnit < samplerTextureArray.size(); ++textureUnit)
- {
- samplerTextureArray[textureUnit].set(context, zeroTexture.second.get());
- }
- }
-}
-
-void State::setSamplerBinding(const Context *context, GLuint textureUnit, Sampler *sampler)
-{
- mSamplers[textureUnit].set(context, sampler);
- mDirtyBits.set(DIRTY_BIT_SAMPLER_BINDINGS);
- mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
-}
-
-GLuint State::getSamplerId(GLuint textureUnit) const
-{
- ASSERT(textureUnit < mSamplers.size());
- return mSamplers[textureUnit].id();
-}
-
-Sampler *State::getSampler(GLuint textureUnit) const
-{
- return mSamplers[textureUnit].get();
-}
-
-void State::detachSampler(const Context *context, GLuint sampler)
-{
- // [OpenGL ES 3.0.2] section 3.8.2 pages 123-124:
- // 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)
- {
- if (samplerBinding.id() == sampler)
- {
- samplerBinding.set(context, nullptr);
- mDirtyBits.set(DIRTY_BIT_SAMPLER_BINDINGS);
- }
- }
-}
-
-void State::setRenderbufferBinding(const Context *context, Renderbuffer *renderbuffer)
-{
- mRenderbuffer.set(context, renderbuffer);
- mDirtyBits.set(DIRTY_BIT_RENDERBUFFER_BINDING);
-}
-
-GLuint State::getRenderbufferId() const
-{
- return mRenderbuffer.id();
-}
-
-Renderbuffer *State::getCurrentRenderbuffer() const
-{
- return mRenderbuffer.get();
-}
-
-void State::detachRenderbuffer(const Context *context, GLuint renderbuffer)
-{
- // [OpenGL ES 2.0.24] section 4.4 page 109:
- // If a renderbuffer that is currently bound to RENDERBUFFER is deleted, it is as though BindRenderbuffer
- // had been executed with the target RENDERBUFFER and name of zero.
-
- if (mRenderbuffer.id() == renderbuffer)
- {
- setRenderbufferBinding(context, nullptr);
- }
-
- // [OpenGL ES 2.0.24] section 4.4 page 111:
- // If a renderbuffer object is deleted while its image is attached to the currently bound framebuffer,
- // then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of 0, for each attachment
- // point to which this image was attached in the currently bound framebuffer.
-
- Framebuffer *readFramebuffer = mReadFramebuffer;
- Framebuffer *drawFramebuffer = mDrawFramebuffer;
-
- if (readFramebuffer && readFramebuffer->detachRenderbuffer(context, renderbuffer))
- {
- mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
- }
-
- if (drawFramebuffer && drawFramebuffer != readFramebuffer)
- {
- if (drawFramebuffer->detachRenderbuffer(context, renderbuffer))
- {
- mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
- }
- }
-
-}
-
-void State::setReadFramebufferBinding(Framebuffer *framebuffer)
-{
- if (mReadFramebuffer == framebuffer)
- return;
-
- mReadFramebuffer = framebuffer;
- mDirtyBits.set(DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
-
- if (mReadFramebuffer && mReadFramebuffer->hasAnyDirtyBit())
- {
- mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
- }
-}
-
-void State::setDrawFramebufferBinding(Framebuffer *framebuffer)
-{
- if (mDrawFramebuffer == framebuffer)
- return;
-
- mDrawFramebuffer = framebuffer;
- mDirtyBits.set(DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
-
- if (mDrawFramebuffer && mDrawFramebuffer->hasAnyDirtyBit())
- {
- mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
- }
-}
-
-Framebuffer *State::getTargetFramebuffer(GLenum target) const
-{
- switch (target)
- {
- case GL_READ_FRAMEBUFFER_ANGLE:
- return mReadFramebuffer;
- case GL_DRAW_FRAMEBUFFER_ANGLE:
- case GL_FRAMEBUFFER:
- return mDrawFramebuffer;
- default:
- UNREACHABLE();
- return nullptr;
- }
-}
-
-Framebuffer *State::getReadFramebuffer() const
-{
- return mReadFramebuffer;
-}
-
-Framebuffer *State::getDrawFramebuffer() const
-{
- return mDrawFramebuffer;
-}
-
-bool State::removeReadFramebufferBinding(GLuint framebuffer)
-{
- if (mReadFramebuffer != nullptr &&
- mReadFramebuffer->id() == framebuffer)
- {
- setReadFramebufferBinding(nullptr);
- return true;
- }
-
- return false;
-}
-
-bool State::removeDrawFramebufferBinding(GLuint framebuffer)
-{
- if (mReadFramebuffer != nullptr &&
- mDrawFramebuffer->id() == framebuffer)
- {
- setDrawFramebufferBinding(nullptr);
- return true;
- }
-
- return false;
-}
-
-void State::setVertexArrayBinding(VertexArray *vertexArray)
-{
- mVertexArray = vertexArray;
- mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
-
- if (mVertexArray && mVertexArray->hasAnyDirtyBit())
- {
- mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
- }
-}
-
-GLuint State::getVertexArrayId() const
-{
- ASSERT(mVertexArray != nullptr);
- return mVertexArray->id();
-}
-
-VertexArray *State::getVertexArray() const
-{
- ASSERT(mVertexArray != nullptr);
- return mVertexArray;
-}
-
-bool State::removeVertexArrayBinding(GLuint vertexArray)
-{
- if (mVertexArray->id() == vertexArray)
- {
- mVertexArray = nullptr;
- mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
- mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
- return true;
- }
-
- return false;
-}
-
-void State::bindVertexBuffer(const Context *context,
- GLuint bindingIndex,
- Buffer *boundBuffer,
- GLintptr offset,
- GLsizei stride)
-{
- getVertexArray()->bindVertexBuffer(context, bindingIndex, boundBuffer, offset, stride);
- mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
-}
-
-void State::setVertexAttribBinding(const Context *context, GLuint attribIndex, GLuint bindingIndex)
-{
- getVertexArray()->setVertexAttribBinding(context, attribIndex, bindingIndex);
- mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
-}
-
-void State::setVertexAttribFormat(GLuint attribIndex,
- GLint size,
- GLenum type,
- bool normalized,
- bool pureInteger,
- GLuint relativeOffset)
-{
- getVertexArray()->setVertexAttribFormat(attribIndex, size, type, normalized, pureInteger,
- relativeOffset);
- mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
-}
-
-void State::setVertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
-{
- getVertexArray()->setVertexBindingDivisor(bindingIndex, divisor);
- mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
-}
-
-void State::setProgram(const Context *context, Program *newProgram)
-{
- if (mProgram != newProgram)
- {
- if (mProgram)
- {
- mProgram->release(context);
- }
-
- mProgram = newProgram;
-
- if (mProgram)
- {
- newProgram->addRef();
- mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
- }
- mDirtyBits.set(DIRTY_BIT_PROGRAM_EXECUTABLE);
- mDirtyBits.set(DIRTY_BIT_PROGRAM_BINDING);
- }
-}
-
-Program *State::getProgram() const
-{
- return mProgram;
-}
-
-void State::setTransformFeedbackBinding(const Context *context,
- TransformFeedback *transformFeedback)
-{
- mTransformFeedback.set(context, transformFeedback);
-}
-
-TransformFeedback *State::getCurrentTransformFeedback() const
-{
- return mTransformFeedback.get();
-}
-
-bool State::isTransformFeedbackActiveUnpaused() const
-{
- TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
- return curTransformFeedback && curTransformFeedback->isActive() && !curTransformFeedback->isPaused();
-}
-
-bool State::removeTransformFeedbackBinding(const Context *context, GLuint transformFeedback)
-{
- if (mTransformFeedback.id() == transformFeedback)
- {
- mTransformFeedback.set(context, nullptr);
- return true;
- }
-
- return false;
-}
-
-void State::setProgramPipelineBinding(const Context *context, ProgramPipeline *pipeline)
-{
- mProgramPipeline.set(context, pipeline);
-}
-
-void State::detachProgramPipeline(const Context *context, GLuint pipeline)
-{
- mProgramPipeline.set(context, nullptr);
-}
-
-bool State::isQueryActive(const GLenum type) const
-{
- for (auto &iter : mActiveQueries)
- {
- const Query *query = iter.second.get();
- if (query != nullptr && ActiveQueryType(query->getType()) == ActiveQueryType(type))
- {
- return true;
- }
- }
-
- return false;
-}
-
-bool State::isQueryActive(Query *query) const
-{
- for (auto &iter : mActiveQueries)
- {
- if (iter.second.get() == query)
- {
- return true;
- }
- }
-
- return false;
-}
-
-void State::setActiveQuery(const Context *context, GLenum target, Query *query)
-{
- mActiveQueries[target].set(context, query);
-}
-
-GLuint State::getActiveQueryId(GLenum target) const
-{
- const Query *query = getActiveQuery(target);
- return (query ? query->id() : 0u);
-}
-
-Query *State::getActiveQuery(GLenum target) const
-{
- const auto it = mActiveQueries.find(target);
-
- // All query types should already exist in the activeQueries map
- ASSERT(it != mActiveQueries.end());
-
- return it->second.get();
-}
-
-void State::setBufferBinding(const Context *context, BufferBinding target, Buffer *buffer)
-{
- switch (target)
- {
- case BufferBinding::PixelPack:
- mBoundBuffers[target].set(context, buffer);
- mDirtyBits.set(DIRTY_BIT_PACK_BUFFER_BINDING);
- break;
- case BufferBinding::PixelUnpack:
- mBoundBuffers[target].set(context, buffer);
- mDirtyBits.set(DIRTY_BIT_UNPACK_BUFFER_BINDING);
- break;
- case BufferBinding::DrawIndirect:
- mBoundBuffers[target].set(context, buffer);
- mDirtyBits.set(DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING);
- break;
- case BufferBinding::TransformFeedback:
- if (mTransformFeedback.get() != nullptr)
- {
- mTransformFeedback->bindGenericBuffer(context, buffer);
- }
- break;
- case BufferBinding::ElementArray:
- getVertexArray()->setElementArrayBuffer(context, buffer);
- mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
- break;
- default:
- mBoundBuffers[target].set(context, buffer);
- break;
- }
-}
-void State::setIndexedBufferBinding(const Context *context,
- BufferBinding target,
- GLuint index,
- Buffer *buffer,
- GLintptr offset,
- GLsizeiptr size)
-{
- setBufferBinding(context, target, buffer);
-
- switch (target)
- {
- case BufferBinding::TransformFeedback:
- mTransformFeedback->bindIndexedBuffer(context, index, buffer, offset, size);
- break;
- case BufferBinding::Uniform:
- mUniformBuffers[index].set(context, buffer, offset, size);
- break;
- case BufferBinding::AtomicCounter:
- mAtomicCounterBuffers[index].set(context, buffer, offset, size);
- break;
- case BufferBinding::ShaderStorage:
- mShaderStorageBuffers[index].set(context, buffer, offset, size);
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-const OffsetBindingPointer<Buffer> &State::getIndexedUniformBuffer(size_t index) const
-{
- ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
- return mUniformBuffers[index];
-}
-
-const OffsetBindingPointer<Buffer> &State::getIndexedAtomicCounterBuffer(size_t index) const
-{
- ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
- return mAtomicCounterBuffers[index];
-}
-
-const OffsetBindingPointer<Buffer> &State::getIndexedShaderStorageBuffer(size_t index) const
-{
- ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
- return mShaderStorageBuffers[index];
-}
-
-Buffer *State::getTargetBuffer(BufferBinding target) const
-{
- switch (target)
- {
- case BufferBinding::ElementArray:
- return getVertexArray()->getElementArrayBuffer().get();
- case BufferBinding::TransformFeedback:
- return mTransformFeedback->getGenericBuffer().get();
- default:
- return mBoundBuffers[target].get();
- }
-}
-
-void State::detachBuffer(const Context *context, GLuint bufferName)
-{
- for (auto &buffer : mBoundBuffers)
- {
- if (buffer.id() == bufferName)
- {
- buffer.set(context, nullptr);
- }
- }
-
- TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
- if (curTransformFeedback)
- {
- curTransformFeedback->detachBuffer(context, bufferName);
- }
-
- getVertexArray()->detachBuffer(context, bufferName);
-}
-
-void State::setEnableVertexAttribArray(unsigned int attribNum, bool enabled)
-{
- getVertexArray()->enableAttribute(attribNum, enabled);
- mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
-}
-
-void State::setVertexAttribf(GLuint index, const GLfloat values[4])
-{
- ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
- mVertexAttribCurrentValues[index].setFloatValues(values);
- mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
- mDirtyCurrentValues.set(index);
-}
-
-void State::setVertexAttribu(GLuint index, const GLuint values[4])
-{
- ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
- mVertexAttribCurrentValues[index].setUnsignedIntValues(values);
- mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
- mDirtyCurrentValues.set(index);
-}
-
-void State::setVertexAttribi(GLuint index, const GLint values[4])
-{
- ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
- mVertexAttribCurrentValues[index].setIntValues(values);
- mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
- mDirtyCurrentValues.set(index);
-}
-
-void State::setVertexAttribPointer(const Context *context,
- unsigned int attribNum,
- Buffer *boundBuffer,
- GLint size,
- GLenum type,
- bool normalized,
- bool pureInteger,
- GLsizei stride,
- const void *pointer)
-{
- getVertexArray()->setVertexAttribPointer(context, attribNum, boundBuffer, size, type,
- normalized, pureInteger, stride, pointer);
- mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
-}
-
-void State::setVertexAttribDivisor(const Context *context, GLuint index, GLuint divisor)
-{
- getVertexArray()->setVertexAttribDivisor(context, index, divisor);
- mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
-}
-
-const VertexAttribCurrentValueData &State::getVertexAttribCurrentValue(size_t attribNum) const
-{
- ASSERT(attribNum < mVertexAttribCurrentValues.size());
- return mVertexAttribCurrentValues[attribNum];
-}
-
-const std::vector<VertexAttribCurrentValueData> &State::getVertexAttribCurrentValues() const
-{
- return mVertexAttribCurrentValues;
-}
-
-const void *State::getVertexAttribPointer(unsigned int attribNum) const
-{
- return getVertexArray()->getVertexAttribute(attribNum).pointer;
-}
-
-void State::setPackAlignment(GLint alignment)
-{
- mPack.alignment = alignment;
- mDirtyBits.set(DIRTY_BIT_PACK_STATE);
-}
-
-GLint State::getPackAlignment() const
-{
- return mPack.alignment;
-}
-
-void State::setPackReverseRowOrder(bool reverseRowOrder)
-{
- mPack.reverseRowOrder = reverseRowOrder;
- mDirtyBits.set(DIRTY_BIT_PACK_STATE);
-}
-
-bool State::getPackReverseRowOrder() const
-{
- return mPack.reverseRowOrder;
-}
-
-void State::setPackRowLength(GLint rowLength)
-{
- mPack.rowLength = rowLength;
- mDirtyBits.set(DIRTY_BIT_PACK_STATE);
-}
-
-GLint State::getPackRowLength() const
-{
- return mPack.rowLength;
-}
-
-void State::setPackSkipRows(GLint skipRows)
-{
- mPack.skipRows = skipRows;
- mDirtyBits.set(DIRTY_BIT_PACK_STATE);
-}
-
-GLint State::getPackSkipRows() const
-{
- return mPack.skipRows;
-}
-
-void State::setPackSkipPixels(GLint skipPixels)
-{
- mPack.skipPixels = skipPixels;
- mDirtyBits.set(DIRTY_BIT_PACK_STATE);
-}
-
-GLint State::getPackSkipPixels() const
-{
- return mPack.skipPixels;
-}
-
-const PixelPackState &State::getPackState() const
-{
- return mPack;
-}
-
-PixelPackState &State::getPackState()
-{
- return mPack;
-}
-
-void State::setUnpackAlignment(GLint alignment)
-{
- mUnpack.alignment = alignment;
- mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
-}
-
-GLint State::getUnpackAlignment() const
-{
- return mUnpack.alignment;
-}
-
-void State::setUnpackRowLength(GLint rowLength)
-{
- mUnpack.rowLength = rowLength;
- mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
-}
-
-GLint State::getUnpackRowLength() const
-{
- return mUnpack.rowLength;
-}
-
-void State::setUnpackImageHeight(GLint imageHeight)
-{
- mUnpack.imageHeight = imageHeight;
- mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
-}
-
-GLint State::getUnpackImageHeight() const
-{
- return mUnpack.imageHeight;
-}
-
-void State::setUnpackSkipImages(GLint skipImages)
-{
- mUnpack.skipImages = skipImages;
- mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
-}
-
-GLint State::getUnpackSkipImages() const
-{
- return mUnpack.skipImages;
-}
-
-void State::setUnpackSkipRows(GLint skipRows)
-{
- mUnpack.skipRows = skipRows;
- mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
-}
-
-GLint State::getUnpackSkipRows() const
-{
- return mUnpack.skipRows;
-}
-
-void State::setUnpackSkipPixels(GLint skipPixels)
-{
- mUnpack.skipPixels = skipPixels;
- mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
-}
-
-GLint State::getUnpackSkipPixels() const
-{
- return mUnpack.skipPixels;
-}
-
-const PixelUnpackState &State::getUnpackState() const
-{
- return mUnpack;
-}
-
-PixelUnpackState &State::getUnpackState()
-{
- return mUnpack;
-}
-
-const Debug &State::getDebug() const
-{
- return mDebug;
-}
-
-Debug &State::getDebug()
-{
- return mDebug;
-}
-
-void State::setCoverageModulation(GLenum components)
-{
- mCoverageModulation = components;
- mDirtyBits.set(DIRTY_BIT_COVERAGE_MODULATION);
-}
-
-GLenum State::getCoverageModulation() const
-{
- return mCoverageModulation;
-}
-
-void State::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
-{
- if (matrixMode == GL_PATH_MODELVIEW_CHROMIUM)
- {
- memcpy(mPathMatrixMV, matrix, 16 * sizeof(GLfloat));
- mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_MATRIX_MV);
- }
- else if (matrixMode == GL_PATH_PROJECTION_CHROMIUM)
- {
- memcpy(mPathMatrixProj, matrix, 16 * sizeof(GLfloat));
- mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_MATRIX_PROJ);
- }
- else
- {
- UNREACHABLE();
- }
-}
-
-const GLfloat *State::getPathRenderingMatrix(GLenum which) const
-{
- if (which == GL_PATH_MODELVIEW_MATRIX_CHROMIUM)
- {
- return mPathMatrixMV;
- }
- else if (which == GL_PATH_PROJECTION_MATRIX_CHROMIUM)
- {
- return mPathMatrixProj;
- }
-
- UNREACHABLE();
- return nullptr;
-}
-
-void State::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
- mPathStencilFunc = func;
- mPathStencilRef = ref;
- mPathStencilMask = mask;
- mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_STENCIL_STATE);
-}
-
-GLenum State::getPathStencilFunc() const
-{
- return mPathStencilFunc;
-}
-
-GLint State::getPathStencilRef() const
-{
- return mPathStencilRef;
-}
-
-GLuint State::getPathStencilMask() const
-{
- return mPathStencilMask;
-}
-
-void State::setFramebufferSRGB(bool sRGB)
-{
- mFramebufferSRGB = sRGB;
- mDirtyBits.set(DIRTY_BIT_FRAMEBUFFER_SRGB);
-}
-
-bool State::getFramebufferSRGB() const
-{
- return mFramebufferSRGB;
-}
-
-void State::getBooleanv(GLenum pname, GLboolean *params)
-{
- switch (pname)
- {
- case GL_SAMPLE_COVERAGE_INVERT: *params = mSampleCoverageInvert; break;
- case GL_DEPTH_WRITEMASK: *params = mDepthStencil.depthMask; break;
- case GL_COLOR_WRITEMASK:
- params[0] = mBlend.colorMaskRed;
- params[1] = mBlend.colorMaskGreen;
- params[2] = mBlend.colorMaskBlue;
- params[3] = mBlend.colorMaskAlpha;
- break;
- case GL_CULL_FACE:
- *params = mRasterizer.cullFace;
- break;
- case GL_POLYGON_OFFSET_FILL: *params = mRasterizer.polygonOffsetFill; break;
- case GL_SAMPLE_ALPHA_TO_COVERAGE: *params = mBlend.sampleAlphaToCoverage; break;
- case GL_SAMPLE_COVERAGE: *params = mSampleCoverage; break;
- case GL_SAMPLE_MASK:
- *params = mSampleMask;
- break;
- case GL_SCISSOR_TEST: *params = mScissorTest; break;
- case GL_STENCIL_TEST: *params = mDepthStencil.stencilTest; break;
- case GL_DEPTH_TEST: *params = mDepthStencil.depthTest; break;
- case GL_BLEND: *params = mBlend.blend; break;
- case GL_DITHER: *params = mBlend.dither; break;
- case GL_TRANSFORM_FEEDBACK_ACTIVE: *params = getCurrentTransformFeedback()->isActive() ? GL_TRUE : GL_FALSE; break;
- case GL_TRANSFORM_FEEDBACK_PAUSED: *params = getCurrentTransformFeedback()->isPaused() ? GL_TRUE : GL_FALSE; break;
- case GL_PRIMITIVE_RESTART_FIXED_INDEX:
- *params = mPrimitiveRestart;
- break;
- case GL_RASTERIZER_DISCARD:
- *params = isRasterizerDiscardEnabled() ? GL_TRUE : GL_FALSE;
- break;
- case GL_DEBUG_OUTPUT_SYNCHRONOUS:
- *params = mDebug.isOutputSynchronous() ? GL_TRUE : GL_FALSE;
- break;
- case GL_DEBUG_OUTPUT:
- *params = mDebug.isOutputEnabled() ? GL_TRUE : GL_FALSE;
- break;
- case GL_MULTISAMPLE_EXT:
- *params = mMultiSampling;
- break;
- case GL_SAMPLE_ALPHA_TO_ONE_EXT:
- *params = mSampleAlphaToOne;
- break;
- case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
- *params = isBindGeneratesResourceEnabled() ? GL_TRUE : GL_FALSE;
- break;
- case GL_CLIENT_ARRAYS_ANGLE:
- *params = areClientArraysEnabled() ? GL_TRUE : GL_FALSE;
- break;
- case GL_FRAMEBUFFER_SRGB_EXT:
- *params = getFramebufferSRGB() ? GL_TRUE : GL_FALSE;
- break;
- case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
- *params = mRobustResourceInit ? GL_TRUE : GL_FALSE;
- break;
- case GL_PROGRAM_CACHE_ENABLED_ANGLE:
- *params = mProgramBinaryCacheEnabled ? GL_TRUE : GL_FALSE;
- break;
-
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void State::getFloatv(GLenum pname, GLfloat *params)
-{
- // Please note: DEPTH_CLEAR_VALUE is included in our internal getFloatv implementation
- // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
- // GetIntegerv as its native query function. As it would require conversion in any
- // case, this should make no difference to the calling application.
- switch (pname)
- {
- case GL_LINE_WIDTH: *params = mLineWidth; break;
- case GL_SAMPLE_COVERAGE_VALUE: *params = mSampleCoverageValue; break;
- case GL_DEPTH_CLEAR_VALUE: *params = mDepthClearValue; break;
- case GL_POLYGON_OFFSET_FACTOR: *params = mRasterizer.polygonOffsetFactor; break;
- case GL_POLYGON_OFFSET_UNITS: *params = mRasterizer.polygonOffsetUnits; break;
- case GL_DEPTH_RANGE:
- params[0] = mNearZ;
- params[1] = mFarZ;
- break;
- case GL_COLOR_CLEAR_VALUE:
- params[0] = mColorClearValue.red;
- params[1] = mColorClearValue.green;
- params[2] = mColorClearValue.blue;
- params[3] = mColorClearValue.alpha;
- break;
- case GL_BLEND_COLOR:
- params[0] = mBlendColor.red;
- params[1] = mBlendColor.green;
- params[2] = mBlendColor.blue;
- params[3] = mBlendColor.alpha;
- break;
- case GL_MULTISAMPLE_EXT:
- *params = static_cast<GLfloat>(mMultiSampling);
- break;
- case GL_SAMPLE_ALPHA_TO_ONE_EXT:
- *params = static_cast<GLfloat>(mSampleAlphaToOne);
- case GL_COVERAGE_MODULATION_CHROMIUM:
- params[0] = static_cast<GLfloat>(mCoverageModulation);
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void State::getIntegerv(const Context *context, GLenum pname, GLint *params)
-{
- if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
- {
- unsigned int colorAttachment = (pname - GL_DRAW_BUFFER0_EXT);
- ASSERT(colorAttachment < mMaxDrawBuffers);
- Framebuffer *framebuffer = mDrawFramebuffer;
- *params = framebuffer->getDrawBufferState(colorAttachment);
- return;
- }
-
- // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation
- // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
- // GetIntegerv as its native query function. As it would require conversion in any
- // case, this should make no difference to the calling application. You may find it in
- // State::getFloatv.
- switch (pname)
- {
- case GL_ARRAY_BUFFER_BINDING:
- *params = mBoundBuffers[BufferBinding::Array].id();
- break;
- case GL_DRAW_INDIRECT_BUFFER_BINDING:
- *params = mBoundBuffers[BufferBinding::DrawIndirect].id();
- break;
- case GL_ELEMENT_ARRAY_BUFFER_BINDING:
- *params = getVertexArray()->getElementArrayBuffer().id();
- break;
- //case GL_FRAMEBUFFER_BINDING: // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
- case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE: *params = mDrawFramebuffer->id(); break;
- case GL_READ_FRAMEBUFFER_BINDING_ANGLE: *params = mReadFramebuffer->id(); break;
- case GL_RENDERBUFFER_BINDING: *params = mRenderbuffer.id(); break;
- case GL_VERTEX_ARRAY_BINDING: *params = mVertexArray->id(); break;
- case GL_CURRENT_PROGRAM: *params = mProgram ? mProgram->id() : 0; break;
- case GL_PACK_ALIGNMENT: *params = mPack.alignment; break;
- case GL_PACK_REVERSE_ROW_ORDER_ANGLE: *params = mPack.reverseRowOrder; break;
- case GL_PACK_ROW_LENGTH:
- *params = mPack.rowLength;
- break;
- case GL_PACK_SKIP_ROWS:
- *params = mPack.skipRows;
- break;
- case GL_PACK_SKIP_PIXELS:
- *params = mPack.skipPixels;
- break;
- case GL_UNPACK_ALIGNMENT: *params = mUnpack.alignment; break;
- case GL_UNPACK_ROW_LENGTH: *params = mUnpack.rowLength; break;
- case GL_UNPACK_IMAGE_HEIGHT:
- *params = mUnpack.imageHeight;
- break;
- case GL_UNPACK_SKIP_IMAGES:
- *params = mUnpack.skipImages;
- break;
- case GL_UNPACK_SKIP_ROWS:
- *params = mUnpack.skipRows;
- break;
- case GL_UNPACK_SKIP_PIXELS:
- *params = mUnpack.skipPixels;
- break;
- case GL_GENERATE_MIPMAP_HINT: *params = mGenerateMipmapHint; break;
- case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: *params = mFragmentShaderDerivativeHint; break;
- case GL_ACTIVE_TEXTURE:
- *params = (static_cast<GLint>(mActiveSampler) + GL_TEXTURE0);
- break;
- case GL_STENCIL_FUNC: *params = mDepthStencil.stencilFunc; break;
- case GL_STENCIL_REF: *params = mStencilRef; break;
- case GL_STENCIL_VALUE_MASK:
- *params = CastMaskValue(context, mDepthStencil.stencilMask);
- break;
- case GL_STENCIL_BACK_FUNC: *params = mDepthStencil.stencilBackFunc; break;
- case GL_STENCIL_BACK_REF: *params = mStencilBackRef; break;
- case GL_STENCIL_BACK_VALUE_MASK:
- *params = CastMaskValue(context, mDepthStencil.stencilBackMask);
- break;
- case GL_STENCIL_FAIL: *params = mDepthStencil.stencilFail; break;
- case GL_STENCIL_PASS_DEPTH_FAIL: *params = mDepthStencil.stencilPassDepthFail; break;
- case GL_STENCIL_PASS_DEPTH_PASS: *params = mDepthStencil.stencilPassDepthPass; break;
- case GL_STENCIL_BACK_FAIL: *params = mDepthStencil.stencilBackFail; break;
- case GL_STENCIL_BACK_PASS_DEPTH_FAIL: *params = mDepthStencil.stencilBackPassDepthFail; break;
- case GL_STENCIL_BACK_PASS_DEPTH_PASS: *params = mDepthStencil.stencilBackPassDepthPass; break;
- case GL_DEPTH_FUNC: *params = mDepthStencil.depthFunc; break;
- case GL_BLEND_SRC_RGB: *params = mBlend.sourceBlendRGB; break;
- case GL_BLEND_SRC_ALPHA: *params = mBlend.sourceBlendAlpha; break;
- case GL_BLEND_DST_RGB: *params = mBlend.destBlendRGB; break;
- case GL_BLEND_DST_ALPHA: *params = mBlend.destBlendAlpha; break;
- case GL_BLEND_EQUATION_RGB: *params = mBlend.blendEquationRGB; break;
- case GL_BLEND_EQUATION_ALPHA: *params = mBlend.blendEquationAlpha; break;
- case GL_STENCIL_WRITEMASK:
- *params = CastMaskValue(context, mDepthStencil.stencilWritemask);
- break;
- case GL_STENCIL_BACK_WRITEMASK:
- *params = CastMaskValue(context, mDepthStencil.stencilBackWritemask);
- break;
- case GL_STENCIL_CLEAR_VALUE: *params = mStencilClearValue; break;
- case GL_IMPLEMENTATION_COLOR_READ_TYPE:
- *params = mReadFramebuffer->getImplementationColorReadType(context);
- break;
- case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
- *params = mReadFramebuffer->getImplementationColorReadFormat(context);
- break;
- case GL_SAMPLE_BUFFERS:
- case GL_SAMPLES:
- {
- Framebuffer *framebuffer = mDrawFramebuffer;
- if (framebuffer->checkStatus(context) == GL_FRAMEBUFFER_COMPLETE)
- {
- switch (pname)
- {
- case GL_SAMPLE_BUFFERS:
- if (framebuffer->getSamples(context) != 0)
- {
- *params = 1;
- }
- else
- {
- *params = 0;
- }
- break;
- case GL_SAMPLES:
- *params = framebuffer->getSamples(context);
- break;
- }
- }
- else
- {
- *params = 0;
- }
- }
- break;
- case GL_VIEWPORT:
- params[0] = mViewport.x;
- params[1] = mViewport.y;
- params[2] = mViewport.width;
- params[3] = mViewport.height;
- break;
- case GL_SCISSOR_BOX:
- params[0] = mScissor.x;
- params[1] = mScissor.y;
- params[2] = mScissor.width;
- params[3] = mScissor.height;
- break;
- case GL_CULL_FACE_MODE:
- *params = ToGLenum(mRasterizer.cullMode);
- break;
- case GL_FRONT_FACE:
- *params = mRasterizer.frontFace;
- break;
- case GL_RED_BITS:
- case GL_GREEN_BITS:
- case GL_BLUE_BITS:
- case GL_ALPHA_BITS:
- {
- Framebuffer *framebuffer = getDrawFramebuffer();
- const FramebufferAttachment *colorbuffer = framebuffer->getFirstColorbuffer();
-
- if (colorbuffer)
- {
- switch (pname)
- {
- case GL_RED_BITS: *params = colorbuffer->getRedSize(); break;
- case GL_GREEN_BITS: *params = colorbuffer->getGreenSize(); break;
- case GL_BLUE_BITS: *params = colorbuffer->getBlueSize(); break;
- case GL_ALPHA_BITS: *params = colorbuffer->getAlphaSize(); break;
- }
- }
- else
- {
- *params = 0;
- }
- }
- break;
- case GL_DEPTH_BITS:
- {
- const Framebuffer *framebuffer = getDrawFramebuffer();
- const FramebufferAttachment *depthbuffer = framebuffer->getDepthbuffer();
-
- if (depthbuffer)
- {
- *params = depthbuffer->getDepthSize();
- }
- else
- {
- *params = 0;
- }
- }
- break;
- case GL_STENCIL_BITS:
- {
- const Framebuffer *framebuffer = getDrawFramebuffer();
- const FramebufferAttachment *stencilbuffer = framebuffer->getStencilbuffer();
-
- if (stencilbuffer)
- {
- *params = stencilbuffer->getStencilSize();
- }
- else
- {
- *params = 0;
- }
- }
- break;
- case GL_TEXTURE_BINDING_2D:
- ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
- *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_2D);
- break;
- case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
- ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
- *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
- GL_TEXTURE_RECTANGLE_ANGLE);
- break;
- case GL_TEXTURE_BINDING_CUBE_MAP:
- ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
- *params =
- getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_CUBE_MAP);
- break;
- case GL_TEXTURE_BINDING_3D:
- ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
- *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_3D);
- break;
- case GL_TEXTURE_BINDING_2D_ARRAY:
- ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
- *params =
- getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_2D_ARRAY);
- break;
- case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
- ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
- *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
- GL_TEXTURE_2D_MULTISAMPLE);
- break;
- case GL_TEXTURE_BINDING_EXTERNAL_OES:
- ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
- *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
- GL_TEXTURE_EXTERNAL_OES);
- break;
- case GL_UNIFORM_BUFFER_BINDING:
- *params = mBoundBuffers[BufferBinding::Uniform].id();
- break;
- case GL_TRANSFORM_FEEDBACK_BINDING:
- *params = mTransformFeedback.id();
- break;
- case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
- ASSERT(mTransformFeedback.get() != nullptr);
- *params = mTransformFeedback->getGenericBuffer().id();
- break;
- case GL_COPY_READ_BUFFER_BINDING:
- *params = mBoundBuffers[BufferBinding::CopyRead].id();
- break;
- case GL_COPY_WRITE_BUFFER_BINDING:
- *params = mBoundBuffers[BufferBinding::CopyWrite].id();
- break;
- case GL_PIXEL_PACK_BUFFER_BINDING:
- *params = mBoundBuffers[BufferBinding::PixelPack].id();
- break;
- case GL_PIXEL_UNPACK_BUFFER_BINDING:
- *params = mBoundBuffers[BufferBinding::PixelUnpack].id();
- break;
- case GL_READ_BUFFER:
- *params = mReadFramebuffer->getReadBufferState();
- break;
- case GL_SAMPLER_BINDING:
- ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
- *params = getSamplerId(static_cast<GLuint>(mActiveSampler));
- break;
- case GL_DEBUG_LOGGED_MESSAGES:
- *params = static_cast<GLint>(mDebug.getMessageCount());
- break;
- case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
- *params = static_cast<GLint>(mDebug.getNextMessageLength());
- break;
- case GL_DEBUG_GROUP_STACK_DEPTH:
- *params = static_cast<GLint>(mDebug.getGroupStackDepth());
- break;
- case GL_MULTISAMPLE_EXT:
- *params = static_cast<GLint>(mMultiSampling);
- break;
- case GL_SAMPLE_ALPHA_TO_ONE_EXT:
- *params = static_cast<GLint>(mSampleAlphaToOne);
- case GL_COVERAGE_MODULATION_CHROMIUM:
- *params = static_cast<GLint>(mCoverageModulation);
- break;
- case GL_ATOMIC_COUNTER_BUFFER_BINDING:
- *params = mBoundBuffers[BufferBinding::AtomicCounter].id();
- break;
- case GL_SHADER_STORAGE_BUFFER_BINDING:
- *params = mBoundBuffers[BufferBinding::ShaderStorage].id();
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void State::getPointerv(GLenum pname, void **params) const
-{
- switch (pname)
- {
- case GL_DEBUG_CALLBACK_FUNCTION:
- *params = reinterpret_cast<void *>(mDebug.getCallback());
- break;
- case GL_DEBUG_CALLBACK_USER_PARAM:
- *params = const_cast<void *>(mDebug.getUserParam());
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void State::getIntegeri_v(GLenum target, GLuint index, GLint *data)
-{
- switch (target)
- {
- case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
- ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
- *data = mTransformFeedback->getIndexedBuffer(index).id();
- break;
- case GL_UNIFORM_BUFFER_BINDING:
- ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
- *data = mUniformBuffers[index].id();
- break;
- case GL_ATOMIC_COUNTER_BUFFER_BINDING:
- ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
- *data = mAtomicCounterBuffers[index].id();
- break;
- case GL_SHADER_STORAGE_BUFFER_BINDING:
- ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
- *data = mShaderStorageBuffers[index].id();
- break;
- case GL_VERTEX_BINDING_BUFFER:
- ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
- *data = mVertexArray->getVertexBinding(index).getBuffer().id();
- break;
- case GL_VERTEX_BINDING_DIVISOR:
- ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
- *data = mVertexArray->getVertexBinding(index).getDivisor();
- break;
- case GL_VERTEX_BINDING_OFFSET:
- ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
- *data = static_cast<GLuint>(mVertexArray->getVertexBinding(index).getOffset());
- break;
- case GL_VERTEX_BINDING_STRIDE:
- ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
- *data = mVertexArray->getVertexBinding(index).getStride();
- break;
- case GL_SAMPLE_MASK_VALUE:
- ASSERT(static_cast<size_t>(index) < mSampleMaskValues.size());
- *data = mSampleMaskValues[index];
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void State::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
-{
- switch (target)
- {
- case GL_TRANSFORM_FEEDBACK_BUFFER_START:
- ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
- *data = mTransformFeedback->getIndexedBuffer(index).getOffset();
- break;
- case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
- ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
- *data = mTransformFeedback->getIndexedBuffer(index).getSize();
- break;
- case GL_UNIFORM_BUFFER_START:
- ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
- *data = mUniformBuffers[index].getOffset();
- break;
- case GL_UNIFORM_BUFFER_SIZE:
- ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
- *data = mUniformBuffers[index].getSize();
- break;
- case GL_ATOMIC_COUNTER_BUFFER_START:
- ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
- *data = mAtomicCounterBuffers[index].getOffset();
- break;
- case GL_ATOMIC_COUNTER_BUFFER_SIZE:
- ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
- *data = mAtomicCounterBuffers[index].getSize();
- break;
- case GL_SHADER_STORAGE_BUFFER_START:
- ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
- *data = mShaderStorageBuffers[index].getOffset();
- break;
- case GL_SHADER_STORAGE_BUFFER_SIZE:
- ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
- *data = mShaderStorageBuffers[index].getSize();
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void State::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
-{
- UNREACHABLE();
-}
-
-bool State::hasMappedBuffer(BufferBinding target) const
-{
- if (target == BufferBinding::Array)
- {
- const VertexArray *vao = getVertexArray();
- const auto &vertexAttribs = vao->getVertexAttributes();
- const auto &vertexBindings = vao->getVertexBindings();
- size_t maxEnabledAttrib = vao->getMaxEnabledAttribute();
- for (size_t attribIndex = 0; attribIndex < maxEnabledAttrib; attribIndex++)
- {
- const VertexAttribute &vertexAttrib = vertexAttribs[attribIndex];
- auto *boundBuffer = vertexBindings[vertexAttrib.bindingIndex].getBuffer().get();
- if (vertexAttrib.enabled && boundBuffer && boundBuffer->isMapped())
- {
- return true;
- }
- }
-
- return false;
- }
- else
- {
- Buffer *buffer = getTargetBuffer(target);
- return (buffer && buffer->isMapped());
- }
-}
-
-void State::syncDirtyObjects(const Context *context)
-{
- if (!mDirtyObjects.any())
- return;
-
- syncDirtyObjects(context, mDirtyObjects);
-}
-
-void State::syncDirtyObjects(const Context *context, const DirtyObjects &bitset)
-{
- for (auto dirtyObject : bitset)
- {
- switch (dirtyObject)
- {
- case DIRTY_OBJECT_READ_FRAMEBUFFER:
- ASSERT(mReadFramebuffer);
- mReadFramebuffer->syncState(context);
- break;
- case DIRTY_OBJECT_DRAW_FRAMEBUFFER:
- ASSERT(mDrawFramebuffer);
- mDrawFramebuffer->syncState(context);
- break;
- case DIRTY_OBJECT_VERTEX_ARRAY:
- ASSERT(mVertexArray);
- mVertexArray->syncState(context);
- break;
- case DIRTY_OBJECT_PROGRAM_TEXTURES:
- syncProgramTextures(context);
- break;
-
- default:
- UNREACHABLE();
- break;
- }
- }
-
- mDirtyObjects &= ~bitset;
-}
-
-void State::syncProgramTextures(const Context *context)
-{
- // TODO(jmadill): Fine-grained updates.
- if (!mProgram)
- {
- return;
- }
-
- ASSERT(mDirtyObjects[DIRTY_OBJECT_PROGRAM_TEXTURES]);
- mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
-
- ActiveTextureMask newActiveTextures;
-
- // Initialize to the 'Initialized' state and set to 'MayNeedInit' if any texture is not
- // initialized.
- mCachedTexturesInitState = InitState::Initialized;
-
- for (const SamplerBinding &samplerBinding : mProgram->getSamplerBindings())
- {
- if (samplerBinding.unreferenced)
- continue;
-
- GLenum textureType = samplerBinding.textureType;
- for (GLuint textureUnitIndex : samplerBinding.boundTextureUnits)
- {
- Texture *texture = getSamplerTexture(textureUnitIndex, textureType);
- Sampler *sampler = getSampler(textureUnitIndex);
- ASSERT(static_cast<size_t>(textureUnitIndex) < mCompleteTextureCache.size());
- ASSERT(static_cast<size_t>(textureUnitIndex) < newActiveTextures.size());
-
- ASSERT(texture);
-
- // Mark the texture binding bit as dirty if the texture completeness changes.
- // TODO(jmadill): Use specific dirty bit for completeness change.
- if (texture->isSamplerComplete(context, sampler) &&
- !mDrawFramebuffer->hasTextureAttachment(texture))
- {
- texture->syncState();
- mCompleteTextureCache[textureUnitIndex] = texture;
- }
- else
- {
- mCompleteTextureCache[textureUnitIndex] = nullptr;
- }
-
- // Bind the texture unconditionally, to recieve completeness change notifications.
- mCompleteTextureBindings[textureUnitIndex].bind(texture->getDirtyChannel());
- mActiveTexturesMask.set(textureUnitIndex);
- newActiveTextures.set(textureUnitIndex);
-
- if (sampler != nullptr)
- {
- sampler->syncState(context);
- }
-
- if (texture->initState() == InitState::MayNeedInit)
- {
- mCachedTexturesInitState = InitState::MayNeedInit;
- }
- }
- }
-
- // Unset now missing textures.
- ActiveTextureMask negativeMask = mActiveTexturesMask & ~newActiveTextures;
- if (negativeMask.any())
- {
- for (auto textureIndex : negativeMask)
- {
- mCompleteTextureBindings[textureIndex].reset();
- mCompleteTextureCache[textureIndex] = nullptr;
- mActiveTexturesMask.reset(textureIndex);
- }
- }
-}
-
-void State::syncDirtyObject(const Context *context, GLenum target)
-{
- DirtyObjects localSet;
-
- switch (target)
- {
- case GL_READ_FRAMEBUFFER:
- localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
- break;
- case GL_DRAW_FRAMEBUFFER:
- localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
- break;
- case GL_FRAMEBUFFER:
- localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
- localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
- break;
- case GL_VERTEX_ARRAY:
- localSet.set(DIRTY_OBJECT_VERTEX_ARRAY);
- break;
- case GL_TEXTURE:
- case GL_SAMPLER:
- case GL_PROGRAM:
- localSet.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
- break;
- }
-
- syncDirtyObjects(context, localSet);
-}
-
-void State::setObjectDirty(GLenum target)
-{
- switch (target)
- {
- case GL_READ_FRAMEBUFFER:
- mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
- break;
- case GL_DRAW_FRAMEBUFFER:
- mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
- break;
- case GL_FRAMEBUFFER:
- mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
- mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
- break;
- case GL_VERTEX_ARRAY:
- mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
- break;
- case GL_TEXTURE:
- case GL_SAMPLER:
- case GL_PROGRAM:
- mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
- mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
- break;
- }
-}
-
-void State::onProgramExecutableChange(Program *program)
-{
- // OpenGL Spec:
- // "If LinkProgram or ProgramBinary successfully re-links a program object
- // that was already in use as a result of a previous call to UseProgram, then the
- // generated executable code will be installed as part of the current rendering state."
- if (program->isLinked() && mProgram == program)
- {
- mDirtyBits.set(DIRTY_BIT_PROGRAM_EXECUTABLE);
- mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
- }
-}
-
-void State::setImageUnit(const Context *context,
- GLuint unit,
- Texture *texture,
- GLint level,
- GLboolean layered,
- GLint layer,
- GLenum access,
- GLenum format)
-{
- mImageUnits[unit].texture.set(context, texture);
- mImageUnits[unit].level = level;
- mImageUnits[unit].layered = layered;
- mImageUnits[unit].layer = layer;
- mImageUnits[unit].access = access;
- mImageUnits[unit].format = format;
-}
-
-const ImageUnit &State::getImageUnit(GLuint unit) const
-{
- return mImageUnits[unit];
-}
-
-// Handle a dirty texture event.
-void State::signal(size_t textureIndex, InitState initState)
-{
- // Conservatively assume all textures are dirty.
- // TODO(jmadill): More fine-grained update.
- mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
-
- if (initState == InitState::MayNeedInit)
- {
- mCachedTexturesInitState = InitState::MayNeedInit;
- }
-}
-
-Error State::clearUnclearedActiveTextures(const Context *context)
-{
- ASSERT(mRobustResourceInit);
-
- if (mCachedTexturesInitState == InitState::Initialized)
- {
- return NoError();
- }
-
- for (auto textureIndex : mActiveTexturesMask)
- {
- Texture *texture = mCompleteTextureCache[textureIndex];
- if (texture)
- {
- ANGLE_TRY(texture->ensureInitialized(context));
- }
- }
-
- mCachedTexturesInitState = InitState::Initialized;
-
- return NoError();
-}
-
-AttributesMask State::getAndResetDirtyCurrentValues() const
-{
- AttributesMask retVal = mDirtyCurrentValues;
- mDirtyCurrentValues.reset();
- return retVal;
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/State.h b/src/3rdparty/angle/src/libANGLE/State.h
deleted file mode 100644
index 52e1d78382..0000000000
--- a/src/3rdparty/angle/src/libANGLE/State.h
+++ /dev/null
@@ -1,602 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// State.h: Defines the State class, encapsulating raw GL state
-
-#ifndef LIBANGLE_STATE_H_
-#define LIBANGLE_STATE_H_
-
-#include <bitset>
-#include <memory>
-
-#include "common/Color.h"
-#include "common/angleutils.h"
-#include "common/bitset_utils.h"
-#include "libANGLE/Debug.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/ProgramPipeline.h"
-#include "libANGLE/RefCountObject.h"
-#include "libANGLE/Renderbuffer.h"
-#include "libANGLE/Sampler.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/TransformFeedback.h"
-#include "libANGLE/Version.h"
-#include "libANGLE/VertexAttribute.h"
-#include "libANGLE/angletypes.h"
-
-namespace gl
-{
-class Query;
-class VertexArray;
-class Context;
-struct Caps;
-
-class State : public OnAttachmentDirtyReceiver, angle::NonCopyable
-{
- public:
- State();
- ~State() override;
-
- void initialize(const Context *context,
- bool debug,
- bool bindGeneratesResource,
- bool clientArraysEnabled,
- bool robustResourceInit,
- bool programBinaryCacheEnabled);
- void reset(const Context *context);
-
- // State chunk getters
- const RasterizerState &getRasterizerState() const;
- const BlendState &getBlendState() const;
- const DepthStencilState &getDepthStencilState() const;
-
- // Clear behavior setters & state parameter block generation function
- void setColorClearValue(float red, float green, float blue, float alpha);
- void setDepthClearValue(float depth);
- void setStencilClearValue(int stencil);
-
- const ColorF &getColorClearValue() const { return mColorClearValue; }
- float getDepthClearValue() const { return mDepthClearValue; }
- int getStencilClearValue() const { return mStencilClearValue; }
-
- // Write mask manipulation
- void setColorMask(bool red, bool green, bool blue, bool alpha);
- void setDepthMask(bool mask);
-
- // Discard toggle & query
- bool isRasterizerDiscardEnabled() const;
- void setRasterizerDiscard(bool enabled);
-
- // Primitive restart
- bool isPrimitiveRestartEnabled() const;
- void setPrimitiveRestart(bool enabled);
-
- // Face culling state manipulation
- bool isCullFaceEnabled() const;
- void setCullFace(bool enabled);
- void setCullMode(CullFaceMode mode);
- void setFrontFace(GLenum front);
-
- // Depth test state manipulation
- bool isDepthTestEnabled() const;
- void setDepthTest(bool enabled);
- void setDepthFunc(GLenum depthFunc);
- void setDepthRange(float zNear, float zFar);
- float getNearPlane() const;
- float getFarPlane() const;
-
- // Blend state manipulation
- bool isBlendEnabled() const;
- void setBlend(bool enabled);
- void setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha);
- void setBlendColor(float red, float green, float blue, float alpha);
- void setBlendEquation(GLenum rgbEquation, GLenum alphaEquation);
- const ColorF &getBlendColor() const;
-
- // Stencil state maniupulation
- bool isStencilTestEnabled() const;
- void setStencilTest(bool enabled);
- void setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask);
- void setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask);
- void setStencilWritemask(GLuint stencilWritemask);
- void setStencilBackWritemask(GLuint stencilBackWritemask);
- void setStencilOperations(GLenum stencilFail,
- GLenum stencilPassDepthFail,
- GLenum stencilPassDepthPass);
- void setStencilBackOperations(GLenum stencilBackFail,
- GLenum stencilBackPassDepthFail,
- GLenum stencilBackPassDepthPass);
- GLint getStencilRef() const;
- GLint getStencilBackRef() const;
-
- // Depth bias/polygon offset state manipulation
- bool isPolygonOffsetFillEnabled() const;
- void setPolygonOffsetFill(bool enabled);
- void setPolygonOffsetParams(GLfloat factor, GLfloat units);
-
- // Multisample coverage state manipulation
- bool isSampleAlphaToCoverageEnabled() const;
- void setSampleAlphaToCoverage(bool enabled);
- bool isSampleCoverageEnabled() const;
- void setSampleCoverage(bool enabled);
- void setSampleCoverageParams(GLclampf value, bool invert);
- GLfloat getSampleCoverageValue() const;
- bool getSampleCoverageInvert() const;
-
- // Multisample mask state manipulation.
- bool isSampleMaskEnabled() const;
- void setSampleMaskEnabled(bool enabled);
- void setSampleMaskParams(GLuint maskNumber, GLbitfield mask);
- GLbitfield getSampleMaskWord(GLuint maskNumber) const;
- GLuint getMaxSampleMaskWords() const;
-
- // Multisampling/alpha to one manipulation.
- void setSampleAlphaToOne(bool enabled);
- bool isSampleAlphaToOneEnabled() const;
- void setMultisampling(bool enabled);
- bool isMultisamplingEnabled() const;
-
- // Scissor test state toggle & query
- bool isScissorTestEnabled() const;
- void setScissorTest(bool enabled);
- void setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height);
- const Rectangle &getScissor() const;
-
- // Dither state toggle & query
- bool isDitherEnabled() const;
- void setDither(bool enabled);
-
- // Generic state toggle & query
- void setEnableFeature(GLenum feature, bool enabled);
- bool getEnableFeature(GLenum feature) const;
-
- // Line width state setter
- void setLineWidth(GLfloat width);
- float getLineWidth() const;
-
- // Hint setters
- void setGenerateMipmapHint(GLenum hint);
- void setFragmentShaderDerivativeHint(GLenum hint);
-
- // GL_CHROMIUM_bind_generates_resource
- bool isBindGeneratesResourceEnabled() const;
-
- // GL_ANGLE_client_arrays
- bool areClientArraysEnabled() const;
-
- // Viewport state setter/getter
- void setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height);
- const Rectangle &getViewport() const;
-
- // Texture binding & active texture unit manipulation
- void setActiveSampler(unsigned int active);
- unsigned int getActiveSampler() const;
- void setSamplerTexture(const Context *context, GLenum type, Texture *texture);
- Texture *getTargetTexture(GLenum target) const;
- Texture *getSamplerTexture(unsigned int sampler, GLenum type) const;
- GLuint getSamplerTextureId(unsigned int sampler, GLenum type) const;
- void detachTexture(const Context *context, const TextureMap &zeroTextures, GLuint texture);
- void initializeZeroTextures(const Context *context, const TextureMap &zeroTextures);
-
- // Sampler object binding manipulation
- void setSamplerBinding(const Context *context, GLuint textureUnit, Sampler *sampler);
- GLuint getSamplerId(GLuint textureUnit) const;
- Sampler *getSampler(GLuint textureUnit) const;
- void detachSampler(const Context *context, GLuint sampler);
-
- // Renderbuffer binding manipulation
- void setRenderbufferBinding(const Context *context, Renderbuffer *renderbuffer);
- GLuint getRenderbufferId() const;
- Renderbuffer *getCurrentRenderbuffer() const;
- void detachRenderbuffer(const Context *context, GLuint renderbuffer);
-
- // Framebuffer binding manipulation
- void setReadFramebufferBinding(Framebuffer *framebuffer);
- void setDrawFramebufferBinding(Framebuffer *framebuffer);
- Framebuffer *getTargetFramebuffer(GLenum target) const;
- Framebuffer *getReadFramebuffer() const;
- Framebuffer *getDrawFramebuffer() const;
- bool removeReadFramebufferBinding(GLuint framebuffer);
- bool removeDrawFramebufferBinding(GLuint framebuffer);
-
- // Vertex array object binding manipulation
- void setVertexArrayBinding(VertexArray *vertexArray);
- GLuint getVertexArrayId() const;
- VertexArray *getVertexArray() const;
- bool removeVertexArrayBinding(GLuint vertexArray);
-
- // Program binding manipulation
- void setProgram(const Context *context, Program *newProgram);
- Program *getProgram() const;
-
- // Transform feedback object (not buffer) binding manipulation
- void setTransformFeedbackBinding(const Context *context, TransformFeedback *transformFeedback);
- TransformFeedback *getCurrentTransformFeedback() const;
- bool isTransformFeedbackActiveUnpaused() const;
- bool removeTransformFeedbackBinding(const Context *context, GLuint transformFeedback);
-
- // Query binding manipulation
- bool isQueryActive(const GLenum type) const;
- bool isQueryActive(Query *query) const;
- void setActiveQuery(const Context *context, GLenum target, Query *query);
- GLuint getActiveQueryId(GLenum target) const;
- Query *getActiveQuery(GLenum target) const;
-
- // Program Pipeline binding manipulation
- void setProgramPipelineBinding(const Context *context, ProgramPipeline *pipeline);
- void detachProgramPipeline(const Context *context, GLuint pipeline);
-
- //// Typed buffer binding point manipulation ////
- void setBufferBinding(const Context *context, BufferBinding target, Buffer *buffer);
- Buffer *getTargetBuffer(BufferBinding target) const;
- void setIndexedBufferBinding(const Context *context,
- BufferBinding target,
- GLuint index,
- Buffer *buffer,
- GLintptr offset,
- GLsizeiptr size);
-
- const OffsetBindingPointer<Buffer> &getIndexedUniformBuffer(size_t index) const;
- const OffsetBindingPointer<Buffer> &getIndexedAtomicCounterBuffer(size_t index) const;
- const OffsetBindingPointer<Buffer> &getIndexedShaderStorageBuffer(size_t index) const;
-
- // Detach a buffer from all bindings
- void detachBuffer(const Context *context, GLuint bufferName);
-
- // Vertex attrib manipulation
- void setEnableVertexAttribArray(unsigned int attribNum, bool enabled);
- void setElementArrayBuffer(const Context *context, Buffer *buffer);
- void setVertexAttribf(GLuint index, const GLfloat values[4]);
- void setVertexAttribu(GLuint index, const GLuint values[4]);
- void setVertexAttribi(GLuint index, const GLint values[4]);
- void setVertexAttribPointer(const Context *context,
- unsigned int attribNum,
- Buffer *boundBuffer,
- GLint size,
- GLenum type,
- bool normalized,
- bool pureInteger,
- GLsizei stride,
- const void *pointer);
- void setVertexAttribDivisor(const Context *context, GLuint index, GLuint divisor);
- const VertexAttribCurrentValueData &getVertexAttribCurrentValue(size_t attribNum) const;
- const std::vector<VertexAttribCurrentValueData> &getVertexAttribCurrentValues() const;
- const void *getVertexAttribPointer(unsigned int attribNum) const;
- void bindVertexBuffer(const Context *context,
- GLuint bindingIndex,
- Buffer *boundBuffer,
- GLintptr offset,
- GLsizei stride);
- void setVertexAttribFormat(GLuint attribIndex,
- GLint size,
- GLenum type,
- bool normalized,
- bool pureInteger,
- GLuint relativeOffset);
- void setVertexAttribBinding(const Context *context, GLuint attribIndex, GLuint bindingIndex);
- void setVertexBindingDivisor(GLuint bindingIndex, GLuint divisor);
-
- // Pixel pack state manipulation
- void setPackAlignment(GLint alignment);
- GLint getPackAlignment() const;
- void setPackReverseRowOrder(bool reverseRowOrder);
- bool getPackReverseRowOrder() const;
- void setPackRowLength(GLint rowLength);
- GLint getPackRowLength() const;
- void setPackSkipRows(GLint skipRows);
- GLint getPackSkipRows() const;
- void setPackSkipPixels(GLint skipPixels);
- GLint getPackSkipPixels() const;
- const PixelPackState &getPackState() const;
- PixelPackState &getPackState();
-
- // Pixel unpack state manipulation
- void setUnpackAlignment(GLint alignment);
- GLint getUnpackAlignment() const;
- void setUnpackRowLength(GLint rowLength);
- GLint getUnpackRowLength() const;
- void setUnpackImageHeight(GLint imageHeight);
- GLint getUnpackImageHeight() const;
- void setUnpackSkipImages(GLint skipImages);
- GLint getUnpackSkipImages() const;
- void setUnpackSkipRows(GLint skipRows);
- GLint getUnpackSkipRows() const;
- void setUnpackSkipPixels(GLint skipPixels);
- GLint getUnpackSkipPixels() const;
- const PixelUnpackState &getUnpackState() const;
- PixelUnpackState &getUnpackState();
-
- // Debug state
- const Debug &getDebug() const;
- Debug &getDebug();
-
- // CHROMIUM_framebuffer_mixed_samples coverage modulation
- void setCoverageModulation(GLenum components);
- GLenum getCoverageModulation() const;
-
- // CHROMIUM_path_rendering
- void loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix);
- const GLfloat *getPathRenderingMatrix(GLenum which) const;
- void setPathStencilFunc(GLenum func, GLint ref, GLuint mask);
-
- GLenum getPathStencilFunc() const;
- GLint getPathStencilRef() const;
- GLuint getPathStencilMask() const;
-
- // GL_EXT_sRGB_write_control
- void setFramebufferSRGB(bool sRGB);
- bool getFramebufferSRGB() const;
-
- // State query functions
- void getBooleanv(GLenum pname, GLboolean *params);
- void getFloatv(GLenum pname, GLfloat *params);
- void getIntegerv(const Context *context, GLenum pname, GLint *params);
- void getPointerv(GLenum pname, void **params) const;
- void getIntegeri_v(GLenum target, GLuint index, GLint *data);
- void getInteger64i_v(GLenum target, GLuint index, GLint64 *data);
- void getBooleani_v(GLenum target, GLuint index, GLboolean *data);
-
- bool hasMappedBuffer(BufferBinding target) const;
- bool isRobustResourceInitEnabled() const { return mRobustResourceInit; }
-
- // Sets the dirty bit for the program executable.
- void onProgramExecutableChange(Program *program);
-
- enum DirtyBitType
- {
- DIRTY_BIT_SCISSOR_TEST_ENABLED,
- DIRTY_BIT_SCISSOR,
- DIRTY_BIT_VIEWPORT,
- DIRTY_BIT_DEPTH_RANGE,
- DIRTY_BIT_BLEND_ENABLED,
- DIRTY_BIT_BLEND_COLOR,
- DIRTY_BIT_BLEND_FUNCS,
- DIRTY_BIT_BLEND_EQUATIONS,
- DIRTY_BIT_COLOR_MASK,
- DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED,
- DIRTY_BIT_SAMPLE_COVERAGE_ENABLED,
- DIRTY_BIT_SAMPLE_COVERAGE,
- DIRTY_BIT_SAMPLE_MASK_ENABLED,
- DIRTY_BIT_SAMPLE_MASK,
- DIRTY_BIT_DEPTH_TEST_ENABLED,
- DIRTY_BIT_DEPTH_FUNC,
- DIRTY_BIT_DEPTH_MASK,
- DIRTY_BIT_STENCIL_TEST_ENABLED,
- DIRTY_BIT_STENCIL_FUNCS_FRONT,
- DIRTY_BIT_STENCIL_FUNCS_BACK,
- DIRTY_BIT_STENCIL_OPS_FRONT,
- DIRTY_BIT_STENCIL_OPS_BACK,
- DIRTY_BIT_STENCIL_WRITEMASK_FRONT,
- DIRTY_BIT_STENCIL_WRITEMASK_BACK,
- DIRTY_BIT_CULL_FACE_ENABLED,
- DIRTY_BIT_CULL_FACE,
- DIRTY_BIT_FRONT_FACE,
- DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED,
- DIRTY_BIT_POLYGON_OFFSET,
- DIRTY_BIT_RASTERIZER_DISCARD_ENABLED,
- DIRTY_BIT_LINE_WIDTH,
- DIRTY_BIT_PRIMITIVE_RESTART_ENABLED,
- DIRTY_BIT_CLEAR_COLOR,
- DIRTY_BIT_CLEAR_DEPTH,
- DIRTY_BIT_CLEAR_STENCIL,
- DIRTY_BIT_UNPACK_STATE,
- DIRTY_BIT_UNPACK_BUFFER_BINDING,
- DIRTY_BIT_PACK_STATE,
- DIRTY_BIT_PACK_BUFFER_BINDING,
- DIRTY_BIT_DITHER_ENABLED,
- DIRTY_BIT_GENERATE_MIPMAP_HINT,
- DIRTY_BIT_SHADER_DERIVATIVE_HINT,
- DIRTY_BIT_READ_FRAMEBUFFER_BINDING,
- DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING,
- DIRTY_BIT_RENDERBUFFER_BINDING,
- DIRTY_BIT_VERTEX_ARRAY_BINDING,
- DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING,
- DIRTY_BIT_PROGRAM_BINDING,
- DIRTY_BIT_PROGRAM_EXECUTABLE,
- // TODO(jmadill): Fine-grained dirty bits for each texture/sampler.
- DIRTY_BIT_TEXTURE_BINDINGS,
- DIRTY_BIT_SAMPLER_BINDINGS,
- DIRTY_BIT_MULTISAMPLING,
- DIRTY_BIT_SAMPLE_ALPHA_TO_ONE,
- DIRTY_BIT_COVERAGE_MODULATION, // CHROMIUM_framebuffer_mixed_samples
- DIRTY_BIT_PATH_RENDERING_MATRIX_MV, // CHROMIUM_path_rendering path model view matrix
- DIRTY_BIT_PATH_RENDERING_MATRIX_PROJ, // CHROMIUM_path_rendering path projection matrix
- DIRTY_BIT_PATH_RENDERING_STENCIL_STATE,
- DIRTY_BIT_FRAMEBUFFER_SRGB, // GL_EXT_sRGB_write_control
- DIRTY_BIT_CURRENT_VALUES,
- DIRTY_BIT_INVALID,
- DIRTY_BIT_MAX = DIRTY_BIT_INVALID,
- };
-
- static_assert(DIRTY_BIT_MAX <= 64, "State dirty bits must be capped at 64");
-
- // TODO(jmadill): Consider storing dirty objects in a list instead of by binding.
- enum DirtyObjectType
- {
- DIRTY_OBJECT_READ_FRAMEBUFFER,
- DIRTY_OBJECT_DRAW_FRAMEBUFFER,
- DIRTY_OBJECT_VERTEX_ARRAY,
- // Use a very coarse bit for any program or texture change.
- // TODO(jmadill): Fine-grained dirty bits for each texture/sampler.
- DIRTY_OBJECT_PROGRAM_TEXTURES,
- DIRTY_OBJECT_UNKNOWN,
- DIRTY_OBJECT_MAX = DIRTY_OBJECT_UNKNOWN,
- };
-
- typedef angle::BitSet<DIRTY_BIT_MAX> DirtyBits;
- const DirtyBits &getDirtyBits() const { return mDirtyBits; }
- void clearDirtyBits() { mDirtyBits.reset(); }
- void clearDirtyBits(const DirtyBits &bitset) { mDirtyBits &= ~bitset; }
- void setAllDirtyBits() { mDirtyBits.set(); }
-
- typedef angle::BitSet<DIRTY_OBJECT_MAX> DirtyObjects;
- void clearDirtyObjects() { mDirtyObjects.reset(); }
- void setAllDirtyObjects() { mDirtyObjects.set(); }
- void syncDirtyObjects(const Context *context);
- void syncDirtyObjects(const Context *context, const DirtyObjects &bitset);
- void syncDirtyObject(const Context *context, GLenum target);
- void setObjectDirty(GLenum target);
-
- // This actually clears the current value dirty bits.
- // TODO(jmadill): Pass mutable dirty bits into Impl.
- AttributesMask getAndResetDirtyCurrentValues() const;
-
- void setImageUnit(const Context *context,
- GLuint unit,
- Texture *texture,
- GLint level,
- GLboolean layered,
- GLint layer,
- GLenum access,
- GLenum format);
-
- const ImageUnit &getImageUnit(GLuint unit) const;
- const std::vector<Texture *> &getCompleteTextureCache() const { return mCompleteTextureCache; }
-
- // Handle a dirty texture event.
- void signal(size_t textureIndex, InitState initState) override;
-
- Error clearUnclearedActiveTextures(const Context *context);
-
- private:
- void syncProgramTextures(const Context *context);
-
- // Cached values from Context's caps
- GLuint mMaxDrawBuffers;
- GLuint mMaxCombinedTextureImageUnits;
-
- ColorF mColorClearValue;
- GLfloat mDepthClearValue;
- int mStencilClearValue;
-
- RasterizerState mRasterizer;
- bool mScissorTest;
- Rectangle mScissor;
-
- BlendState mBlend;
- ColorF mBlendColor;
- bool mSampleCoverage;
- GLfloat mSampleCoverageValue;
- bool mSampleCoverageInvert;
- bool mSampleMask;
- GLuint mMaxSampleMaskWords;
- std::array<GLbitfield, MAX_SAMPLE_MASK_WORDS> mSampleMaskValues;
-
- DepthStencilState mDepthStencil;
- GLint mStencilRef;
- GLint mStencilBackRef;
-
- GLfloat mLineWidth;
-
- GLenum mGenerateMipmapHint;
- GLenum mFragmentShaderDerivativeHint;
-
- bool mBindGeneratesResource;
- bool mClientArraysEnabled;
-
- Rectangle mViewport;
- float mNearZ;
- float mFarZ;
-
- Framebuffer *mReadFramebuffer;
- Framebuffer *mDrawFramebuffer;
- BindingPointer<Renderbuffer> mRenderbuffer;
- Program *mProgram;
- BindingPointer<ProgramPipeline> mProgramPipeline;
-
- typedef std::vector<VertexAttribCurrentValueData> VertexAttribVector;
- VertexAttribVector mVertexAttribCurrentValues; // From glVertexAttrib
- VertexArray *mVertexArray;
-
- // Texture and sampler bindings
- size_t mActiveSampler; // Active texture unit selector - GL_TEXTURE0
-
- typedef std::vector<BindingPointer<Texture>> TextureBindingVector;
- typedef std::map<GLenum, TextureBindingVector> TextureBindingMap;
- TextureBindingMap mSamplerTextures;
-
- // Texture Completeness Caching
- // ----------------------------
- // The texture completeness cache uses dirty bits to avoid having to scan the list
- // of textures each draw call. This gl::State class implements OnAttachmentDirtyReceiver,
- // and keeps an array of bindings to the Texture class. When the Textures are marked dirty,
- // they send messages to the State class (and any Framebuffers they're attached to) via the
- // State::signal method (see above). Internally this then invalidates the completeness cache.
- //
- // Note this requires that we also invalidate the completeness cache manually on events like
- // re-binding textures/samplers or a change in the program. For more information see the
- // signal_utils.h header and the design doc linked there.
-
- // A cache of complete textures. nullptr indicates unbound or incomplete.
- // Don't use BindingPointer because this cache is only valid within a draw call.
- // Also stores a notification channel to the texture itself to handle texture change events.
- std::vector<Texture *> mCompleteTextureCache;
- std::vector<OnAttachmentDirtyBinding> mCompleteTextureBindings;
- InitState mCachedTexturesInitState;
- using ActiveTextureMask = angle::BitSet<IMPLEMENTATION_MAX_ACTIVE_TEXTURES>;
- ActiveTextureMask mActiveTexturesMask;
-
- typedef std::vector<BindingPointer<Sampler>> SamplerBindingVector;
- SamplerBindingVector mSamplers;
-
- typedef std::vector<ImageUnit> ImageUnitVector;
- ImageUnitVector mImageUnits;
-
- typedef std::map<GLenum, BindingPointer<Query>> ActiveQueryMap;
- ActiveQueryMap mActiveQueries;
-
- // Stores the currently bound buffer for each binding point. It has entries for the element
- // array buffer and the transform feedback buffer but these should not be used. Instead these
- // bind points are respectively owned by current the vertex array object and the current
- // transform feedback object.
- using BoundBufferMap = angle::PackedEnumMap<BufferBinding, BindingPointer<Buffer>>;
- BoundBufferMap mBoundBuffers;
-
- using BufferVector = std::vector<OffsetBindingPointer<Buffer>>;
- BufferVector mUniformBuffers;
- BufferVector mAtomicCounterBuffers;
- BufferVector mShaderStorageBuffers;
-
- BindingPointer<TransformFeedback> mTransformFeedback;
-
- BindingPointer<Buffer> mPixelUnpackBuffer;
- PixelUnpackState mUnpack;
- BindingPointer<Buffer> mPixelPackBuffer;
- PixelPackState mPack;
-
- bool mPrimitiveRestart;
-
- Debug mDebug;
-
- bool mMultiSampling;
- bool mSampleAlphaToOne;
-
- GLenum mCoverageModulation;
-
- // CHROMIUM_path_rendering
- GLfloat mPathMatrixMV[16];
- GLfloat mPathMatrixProj[16];
- GLenum mPathStencilFunc;
- GLint mPathStencilRef;
- GLuint mPathStencilMask;
-
- // GL_EXT_sRGB_write_control
- bool mFramebufferSRGB;
-
- // GL_ANGLE_robust_resource_intialization
- bool mRobustResourceInit;
-
- // GL_ANGLE_program_cache_control
- bool mProgramBinaryCacheEnabled;
-
- DirtyBits mDirtyBits;
- DirtyObjects mDirtyObjects;
- mutable AttributesMask mDirtyCurrentValues;
-};
-
-} // namespace gl
-
-#endif // LIBANGLE_STATE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Stream.cpp b/src/3rdparty/angle/src/libANGLE/Stream.cpp
deleted file mode 100644
index 68279976b7..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Stream.cpp
+++ /dev/null
@@ -1,271 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Stream.cpp: Implements the egl::Stream class, representing the stream
-// where frames are streamed in. Implements EGLStreanKHR.
-
-#include "libANGLE/Stream.h"
-
-#include <platform/Platform.h>
-#include <EGL/eglext.h>
-
-#include "common/debug.h"
-#include "common/mathutil.h"
-#include "common/platform.h"
-#include "common/utilities.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Display.h"
-#include "libANGLE/renderer/DisplayImpl.h"
-#include "libANGLE/renderer/StreamProducerImpl.h"
-
-namespace egl
-{
-
-Stream::Stream(Display *display, const AttributeMap &attribs)
- : mDisplay(display),
- mProducerImplementation(nullptr),
- mState(EGL_STREAM_STATE_CREATED_KHR),
- mProducerFrame(0),
- mConsumerFrame(0),
- mConsumerLatency(attribs.getAsInt(EGL_CONSUMER_LATENCY_USEC_KHR, 0)),
- mConsumerAcquireTimeout(attribs.getAsInt(EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR, 0)),
- mPlaneCount(0),
- mConsumerType(ConsumerType::NoConsumer),
- mProducerType(ProducerType::NoProducer)
-{
- for (auto &plane : mPlanes)
- {
- plane.textureUnit = -1;
- plane.texture = nullptr;
- }
-}
-
-Stream::~Stream()
-{
- SafeDelete(mProducerImplementation);
- for (auto &plane : mPlanes)
- {
- if (plane.texture != nullptr)
- {
- plane.texture->releaseStream();
- }
- }
-}
-
-void Stream::setConsumerLatency(EGLint latency)
-{
- mConsumerLatency = latency;
-}
-
-EGLint Stream::getConsumerLatency() const
-{
- return mConsumerLatency;
-}
-
-EGLuint64KHR Stream::getProducerFrame() const
-{
- return mProducerFrame;
-}
-
-EGLuint64KHR Stream::getConsumerFrame() const
-{
- return mConsumerFrame;
-}
-
-EGLenum Stream::getState() const
-{
- return mState;
-}
-
-void Stream::setConsumerAcquireTimeout(EGLint timeout)
-{
- mConsumerAcquireTimeout = timeout;
-}
-
-EGLint Stream::getConsumerAcquireTimeout() const
-{
- return mConsumerAcquireTimeout;
-}
-
-Stream::ProducerType Stream::getProducerType() const
-{
- return mProducerType;
-}
-
-Stream::ConsumerType Stream::getConsumerType() const
-{
- return mConsumerType;
-}
-
-EGLint Stream::getPlaneCount() const
-{
- return mPlaneCount;
-}
-
-rx::StreamProducerImpl *Stream::getImplementation()
-{
- return mProducerImplementation;
-}
-
-Error Stream::createConsumerGLTextureExternal(const AttributeMap &attributes, gl::Context *context)
-{
- ASSERT(mState == EGL_STREAM_STATE_CREATED_KHR);
- ASSERT(mConsumerType == ConsumerType::NoConsumer);
- ASSERT(mProducerType == ProducerType::NoProducer);
- ASSERT(context != nullptr);
-
- const auto &glState = context->getGLState();
- EGLenum bufferType = attributes.getAsInt(EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER);
- if (bufferType == EGL_RGB_BUFFER)
- {
- mPlanes[0].texture = glState.getTargetTexture(GL_TEXTURE_EXTERNAL_OES);
- ASSERT(mPlanes[0].texture != nullptr);
- mPlanes[0].texture->bindStream(this);
- mConsumerType = ConsumerType::GLTextureRGB;
- mPlaneCount = 1;
- }
- else
- {
- mPlaneCount = attributes.getAsInt(EGL_YUV_NUMBER_OF_PLANES_EXT, 2);
- ASSERT(mPlaneCount <= 3);
- for (EGLint i = 0; i < mPlaneCount; i++)
- {
- // Fetch all the textures
- mPlanes[i].textureUnit = attributes.getAsInt(EGL_YUV_PLANE0_TEXTURE_UNIT_NV + i, -1);
- if (mPlanes[i].textureUnit != EGL_NONE)
- {
- mPlanes[i].texture =
- glState.getSamplerTexture(mPlanes[i].textureUnit, GL_TEXTURE_EXTERNAL_OES);
- ASSERT(mPlanes[i].texture != nullptr);
- }
- }
-
- // Bind them to the stream
- for (EGLint i = 0; i < mPlaneCount; i++)
- {
- if (mPlanes[i].textureUnit != EGL_NONE)
- {
- mPlanes[i].texture->bindStream(this);
- }
- }
- mConsumerType = ConsumerType::GLTextureYUV;
- }
-
- mContext = context;
- mState = EGL_STREAM_STATE_CONNECTING_KHR;
-
- return NoError();
-}
-
-Error Stream::createProducerD3D11TextureNV12(const AttributeMap &attributes)
-{
- ASSERT(mState == EGL_STREAM_STATE_CONNECTING_KHR);
- ASSERT(mConsumerType == ConsumerType::GLTextureYUV);
- ASSERT(mProducerType == ProducerType::NoProducer);
- ASSERT(mPlaneCount == 2);
-
- mProducerImplementation = mDisplay->getImplementation()->createStreamProducerD3DTextureNV12(
- mConsumerType, attributes);
- mProducerType = ProducerType::D3D11TextureNV12;
- mState = EGL_STREAM_STATE_EMPTY_KHR;
-
- return NoError();
-}
-
-// Called when the consumer of this stream starts using the stream
-Error Stream::consumerAcquire(const gl::Context *context)
-{
- ASSERT(mState == EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR ||
- mState == EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR);
- ASSERT(mConsumerType == ConsumerType::GLTextureRGB ||
- mConsumerType == ConsumerType::GLTextureYUV);
- ASSERT(mProducerType == ProducerType::D3D11TextureNV12);
-
- mState = EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR;
- mConsumerFrame++;
-
- // Bind the planes to the gl textures
- for (int i = 0; i < mPlaneCount; i++)
- {
- if (mPlanes[i].texture != nullptr)
- {
- ANGLE_TRY(mPlanes[i].texture->acquireImageFromStream(
- context, mProducerImplementation->getGLFrameDescription(i)));
- }
- }
-
- return NoError();
-}
-
-Error Stream::consumerRelease(const gl::Context *context)
-{
- ASSERT(mState == EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR ||
- mState == EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR);
- ASSERT(mConsumerType == ConsumerType::GLTextureRGB ||
- mConsumerType == ConsumerType::GLTextureYUV);
- ASSERT(mProducerType == ProducerType::D3D11TextureNV12);
-
- // Release the images
- for (int i = 0; i < mPlaneCount; i++)
- {
- if (mPlanes[i].texture != nullptr)
- {
- ANGLE_TRY(mPlanes[i].texture->releaseImageFromStream(context));
- }
- }
-
- return NoError();
-}
-
-bool Stream::isConsumerBoundToContext(const gl::Context *context) const
-{
- ASSERT(context != nullptr);
- return (context == mContext);
-}
-
-Error Stream::validateD3D11NV12Texture(void *texture) const
-{
- ASSERT(mConsumerType == ConsumerType::GLTextureRGB ||
- mConsumerType == ConsumerType::GLTextureYUV);
- ASSERT(mProducerType == ProducerType::D3D11TextureNV12);
- ASSERT(mProducerImplementation != nullptr);
-
- return mProducerImplementation->validateD3DNV12Texture(texture);
-}
-
-Error Stream::postD3D11NV12Texture(void *texture, const AttributeMap &attributes)
-{
- ASSERT(mConsumerType == ConsumerType::GLTextureRGB ||
- mConsumerType == ConsumerType::GLTextureYUV);
- ASSERT(mProducerType == ProducerType::D3D11TextureNV12);
-
- mProducerImplementation->postD3DNV12Texture(texture, attributes);
- mProducerFrame++;
-
- mState = EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR;
-
- return NoError();
-}
-
-// This is called when a texture object associated with this stream is destroyed. Even if multiple
-// textures are bound, one being destroyed invalidates the stream, so all the remaining textures
-// will be released and the stream will be invalidated.
-void Stream::releaseTextures()
-{
- for (auto &plane : mPlanes)
- {
- if (plane.texture != nullptr)
- {
- plane.texture->releaseStream();
- plane.texture = nullptr;
- }
- }
- mConsumerType = ConsumerType::NoConsumer;
- mProducerType = ProducerType::NoProducer;
- mState = EGL_STREAM_STATE_DISCONNECTED_KHR;
-}
-
-} // namespace egl
diff --git a/src/3rdparty/angle/src/libANGLE/Stream.h b/src/3rdparty/angle/src/libANGLE/Stream.h
deleted file mode 100644
index b674c44008..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Stream.h
+++ /dev/null
@@ -1,143 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Stream.h: Defines the egl::Stream class, representing the stream
-// where frames are streamed in. Implements EGLStreanKHR.
-
-#ifndef LIBANGLE_STREAM_H_
-#define LIBANGLE_STREAM_H_
-
-#include <array>
-
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-
-#include "common/angleutils.h"
-#include "libANGLE/AttributeMap.h"
-
-namespace rx
-{
-class StreamProducerImpl;
-}
-
-namespace gl
-{
-class Context;
-class Texture;
-}
-
-namespace egl
-{
-class Display;
-class Error;
-class Thread;
-
-class Stream final : angle::NonCopyable
-{
- public:
- Stream(Display *display, const AttributeMap &attribs);
- ~Stream();
-
- enum class ConsumerType
- {
- NoConsumer,
- GLTextureRGB,
- GLTextureYUV,
- };
-
- enum class ProducerType
- {
- NoProducer,
- D3D11TextureNV12,
- };
-
- // A GL texture interpretation of a part of a producer frame. For use with GL texture consumers
- struct GLTextureDescription
- {
- unsigned int width;
- unsigned int height;
- unsigned int internalFormat;
- unsigned int mipLevels;
- };
-
- EGLenum getState() const;
-
- void setConsumerLatency(EGLint latency);
- EGLint getConsumerLatency() const;
-
- EGLuint64KHR getProducerFrame() const;
- EGLuint64KHR getConsumerFrame() const;
-
- void setConsumerAcquireTimeout(EGLint timeout);
- EGLint getConsumerAcquireTimeout() const;
-
- ConsumerType getConsumerType() const;
- ProducerType getProducerType() const;
-
- EGLint getPlaneCount() const;
-
- rx::StreamProducerImpl *getImplementation();
-
- // Consumer creation methods
- Error createConsumerGLTextureExternal(const AttributeMap &attributes, gl::Context *context);
-
- // Producer creation methods
- Error createProducerD3D11TextureNV12(const AttributeMap &attributes);
-
- // Consumer methods
- Error consumerAcquire(const gl::Context *context);
- Error consumerRelease(const gl::Context *context);
-
- // Some consumers are bound to GL contexts. This validates that a given context is bound to the
- // stream's consumer
- bool isConsumerBoundToContext(const gl::Context *context) const;
-
- // Producer methods
- Error validateD3D11NV12Texture(void *texture) const;
- Error postD3D11NV12Texture(void *texture, const AttributeMap &attributes);
-
- private:
- // Associated display
- Display *mDisplay;
-
- // Producer Implementation
- rx::StreamProducerImpl *mProducerImplementation;
-
- // Associated GL context. Note that this is a weak pointer used for validation purposes only,
- // and should never be arbitrarily dereferenced without knowing the context still exists as it
- // can become dangling at any time.
- gl::Context *mContext;
-
- // EGL defined attributes
- EGLint mState;
- EGLuint64KHR mProducerFrame;
- EGLuint64KHR mConsumerFrame;
- EGLint mConsumerLatency;
-
- // EGL gltexture consumer attributes
- EGLint mConsumerAcquireTimeout;
-
- // EGL gltexture yuv consumer attributes
- EGLint mPlaneCount;
- struct PlaneTexture
- {
- EGLint textureUnit;
- gl::Texture *texture;
- };
- // Texture units and textures for all the planes
- std::array<PlaneTexture, 3> mPlanes;
-
- // Consumer and producer types
- ConsumerType mConsumerType;
- ProducerType mProducerType;
-
- // ANGLE-only method, used internally
- friend class gl::Texture;
- void releaseTextures();
-};
-} // namespace egl
-
-#endif // LIBANGLE_STREAM_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Surface.cpp b/src/3rdparty/angle/src/libANGLE/Surface.cpp
deleted file mode 100644
index 746da03778..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Surface.cpp
+++ /dev/null
@@ -1,484 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Surface.cpp: Implements the egl::Surface class, representing a drawing surface
-// such as the client area of a window, including any back buffers.
-// Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3.
-
-#include "libANGLE/Surface.h"
-
-#include <EGL/eglext.h>
-
-#include <iostream>
-
-#include "libANGLE/Config.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Display.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/Thread.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/EGLImplFactory.h"
-
-namespace egl
-{
-
-SurfaceState::SurfaceState(const egl::Config *configIn, const AttributeMap &attributesIn)
- : defaultFramebuffer(nullptr), config(configIn), attributes(attributesIn)
-{
-}
-
-Surface::Surface(EGLint surfaceType, const egl::Config *config, const AttributeMap &attributes)
- : FramebufferAttachmentObject(),
- mState(config, attributes),
- mImplementation(nullptr),
- mCurrentCount(0),
- mDestroyed(false),
- mType(surfaceType),
- mPostSubBufferRequested(false),
- mLargestPbuffer(false),
- mGLColorspace(EGL_GL_COLORSPACE_LINEAR),
- mVGAlphaFormat(EGL_VG_ALPHA_FORMAT_NONPRE),
- mVGColorspace(EGL_VG_COLORSPACE_sRGB),
- mMipmapTexture(false),
- mMipmapLevel(0),
- mHorizontalResolution(EGL_UNKNOWN),
- mVerticalResolution(EGL_UNKNOWN),
- mMultisampleResolve(EGL_MULTISAMPLE_RESOLVE_DEFAULT),
- mFixedSize(false),
- mFixedWidth(0),
- mFixedHeight(0),
- mTextureFormat(EGL_NO_TEXTURE),
- mTextureTarget(EGL_NO_TEXTURE),
- // FIXME: Determine actual pixel aspect ratio
- mPixelAspectRatio(static_cast<EGLint>(1.0 * EGL_DISPLAY_SCALING)),
- mRenderBuffer(EGL_BACK_BUFFER),
- mSwapBehavior(EGL_NONE),
- mOrientation(0),
- mTexture(),
- mBackFormat(config->renderTargetFormat),
- mDSFormat(config->depthStencilFormat)
-{
- mPostSubBufferRequested = (attributes.get(EGL_POST_SUB_BUFFER_SUPPORTED_NV, EGL_FALSE) == EGL_TRUE);
- mFlexibleSurfaceCompatibilityRequested =
- (attributes.get(EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE, EGL_FALSE) == EGL_TRUE);
-
- if (mType == EGL_PBUFFER_BIT)
- {
- mLargestPbuffer = (attributes.get(EGL_LARGEST_PBUFFER, EGL_FALSE) == EGL_TRUE);
- }
-
- mGLColorspace =
- static_cast<EGLenum>(attributes.get(EGL_GL_COLORSPACE, EGL_GL_COLORSPACE_LINEAR));
- mVGAlphaFormat =
- static_cast<EGLenum>(attributes.get(EGL_VG_ALPHA_FORMAT, EGL_VG_ALPHA_FORMAT_NONPRE));
- mVGColorspace = static_cast<EGLenum>(attributes.get(EGL_VG_COLORSPACE, EGL_VG_COLORSPACE_sRGB));
- mMipmapTexture = (attributes.get(EGL_MIPMAP_TEXTURE, EGL_FALSE) == EGL_TRUE);
-
- mDirectComposition = (attributes.get(EGL_DIRECT_COMPOSITION_ANGLE, EGL_FALSE) == EGL_TRUE);
-
- mRobustResourceInitialization =
- (attributes.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
-
- mFixedSize = (attributes.get(EGL_FIXED_SIZE_ANGLE, EGL_FALSE) == EGL_TRUE);
- if (mFixedSize)
- {
- mFixedWidth = static_cast<size_t>(attributes.get(EGL_WIDTH, 0));
- mFixedHeight = static_cast<size_t>(attributes.get(EGL_HEIGHT, 0));
- }
-
- if (mType != EGL_WINDOW_BIT)
- {
- mTextureFormat = static_cast<EGLenum>(attributes.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE));
- mTextureTarget = static_cast<EGLenum>(attributes.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE));
- }
-
- mOrientation = static_cast<EGLint>(attributes.get(EGL_SURFACE_ORIENTATION_ANGLE, 0));
-}
-
-Surface::~Surface()
-{
-}
-
-rx::FramebufferAttachmentObjectImpl *Surface::getAttachmentImpl() const
-{
- return mImplementation;
-}
-
-Error Surface::destroyImpl(const Display *display)
-{
- if (mState.defaultFramebuffer)
- {
- mState.defaultFramebuffer->destroyDefault(display);
- }
- if (mImplementation)
- {
- mImplementation->destroy(display);
- }
-
- if (mTexture.get())
- {
- if (mImplementation)
- {
- ANGLE_TRY(mImplementation->releaseTexImage(EGL_BACK_BUFFER));
- }
- auto glErr = mTexture->releaseTexImageFromSurface(display->getProxyContext());
- if (glErr.isError())
- {
- return Error(EGL_BAD_SURFACE);
- }
- mTexture.set(nullptr, nullptr);
- }
-
- if (mState.defaultFramebuffer)
- {
- mState.defaultFramebuffer->onDestroy(display->getProxyContext());
- }
- SafeDelete(mState.defaultFramebuffer);
- SafeDelete(mImplementation);
-
- delete this;
- return NoError();
-}
-
-Error Surface::initialize(const Display *display)
-{
- ANGLE_TRY(mImplementation->initialize(display));
-
- // Initialized here since impl is nullptr in the constructor.
- // Must happen after implementation initialize for Android.
- mSwapBehavior = mImplementation->getSwapBehavior();
-
- // Must happen after implementation initialize for OSX.
- mState.defaultFramebuffer = createDefaultFramebuffer(display);
- ASSERT(mState.defaultFramebuffer != nullptr);
-
- return NoError();
-}
-
-Error Surface::setIsCurrent(const gl::Context *context, bool isCurrent)
-{
- if (isCurrent)
- {
- mCurrentCount++;
- return NoError();
- }
-
- ASSERT(mCurrentCount > 0);
- mCurrentCount--;
- if (mCurrentCount == 0 && mDestroyed)
- {
- ASSERT(context);
- return destroyImpl(context->getCurrentDisplay());
- }
- return NoError();
-}
-
-Error Surface::onDestroy(const Display *display)
-{
- mDestroyed = true;
- if (mCurrentCount == 0)
- {
- return destroyImpl(display);
- }
- return NoError();
-}
-
-EGLint Surface::getType() const
-{
- return mType;
-}
-
-Error Surface::swap(const gl::Context *context)
-{
- return mImplementation->swap(context);
-}
-
-Error Surface::swapWithDamage(const gl::Context *context, EGLint *rects, EGLint n_rects)
-{
- return mImplementation->swapWithDamage(context, rects, n_rects);
-}
-
-Error Surface::postSubBuffer(const gl::Context *context,
- EGLint x,
- EGLint y,
- EGLint width,
- EGLint height)
-{
- return mImplementation->postSubBuffer(context, x, y, width, height);
-}
-
-Error Surface::querySurfacePointerANGLE(EGLint attribute, void **value)
-{
- return mImplementation->querySurfacePointerANGLE(attribute, value);
-}
-
-EGLint Surface::isPostSubBufferSupported() const
-{
- return mPostSubBufferRequested && mImplementation->isPostSubBufferSupported();
-}
-
-void Surface::setSwapInterval(EGLint interval)
-{
- mImplementation->setSwapInterval(interval);
-}
-
-void Surface::setMipmapLevel(EGLint level)
-{
- // Level is set but ignored
- UNIMPLEMENTED();
- mMipmapLevel = level;
-}
-
-void Surface::setMultisampleResolve(EGLenum resolve)
-{
- // Behaviour is set but ignored
- UNIMPLEMENTED();
- mMultisampleResolve = resolve;
-}
-
-void Surface::setSwapBehavior(EGLenum behavior)
-{
- // Behaviour is set but ignored
- UNIMPLEMENTED();
- mSwapBehavior = behavior;
-}
-
-const Config *Surface::getConfig() const
-{
- return mState.config;
-}
-
-EGLint Surface::getPixelAspectRatio() const
-{
- return mPixelAspectRatio;
-}
-
-EGLenum Surface::getRenderBuffer() const
-{
- return mRenderBuffer;
-}
-
-EGLenum Surface::getSwapBehavior() const
-{
- return mSwapBehavior;
-}
-
-EGLenum Surface::getTextureFormat() const
-{
- return mTextureFormat;
-}
-
-EGLenum Surface::getTextureTarget() const
-{
- return mTextureTarget;
-}
-
-bool Surface::getLargestPbuffer() const
-{
- return mLargestPbuffer;
-}
-
-EGLenum Surface::getGLColorspace() const
-{
- return mGLColorspace;
-}
-
-EGLenum Surface::getVGAlphaFormat() const
-{
- return mVGAlphaFormat;
-}
-
-EGLenum Surface::getVGColorspace() const
-{
- return mVGColorspace;
-}
-
-bool Surface::getMipmapTexture() const
-{
- return mMipmapTexture;
-}
-
-EGLint Surface::getMipmapLevel() const
-{
- return mMipmapLevel;
-}
-
-EGLint Surface::getHorizontalResolution() const
-{
- return mHorizontalResolution;
-}
-
-EGLint Surface::getVerticalResolution() const
-{
- return mVerticalResolution;
-}
-
-EGLenum Surface::getMultisampleResolve() const
-{
- return mMultisampleResolve;
-}
-
-EGLint Surface::isFixedSize() const
-{
- return mFixedSize;
-}
-
-EGLint Surface::getWidth() const
-{
- return mFixedSize ? static_cast<EGLint>(mFixedWidth) : mImplementation->getWidth();
-}
-
-EGLint Surface::getHeight() const
-{
- return mFixedSize ? static_cast<EGLint>(mFixedHeight) : mImplementation->getHeight();
-}
-
-Error Surface::bindTexImage(const gl::Context *context, gl::Texture *texture, EGLint buffer)
-{
- ASSERT(!mTexture.get());
- ANGLE_TRY(mImplementation->bindTexImage(texture, buffer));
-
- auto glErr = texture->bindTexImageFromSurface(context, this);
- if (glErr.isError())
- {
- return Error(EGL_BAD_SURFACE);
- }
- mTexture.set(context, texture);
-
- return NoError();
-}
-
-Error Surface::releaseTexImage(const gl::Context *context, EGLint buffer)
-{
- ASSERT(context);
-
- ANGLE_TRY(mImplementation->releaseTexImage(buffer));
-
- ASSERT(mTexture.get());
- auto glErr = mTexture->releaseTexImageFromSurface(context);
- if (glErr.isError())
- {
- return Error(EGL_BAD_SURFACE);
- }
- mTexture.set(context, nullptr);
-
- return NoError();
-}
-
-Error Surface::getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc)
-{
- return mImplementation->getSyncValues(ust, msc, sbc);
-}
-
-void Surface::releaseTexImageFromTexture(const gl::Context *context)
-{
- ASSERT(mTexture.get());
- mTexture.set(context, nullptr);
-}
-
-gl::Extents Surface::getAttachmentSize(const gl::ImageIndex & /*target*/) const
-{
- return gl::Extents(getWidth(), getHeight(), 1);
-}
-
-const gl::Format &Surface::getAttachmentFormat(GLenum binding, const gl::ImageIndex &target) const
-{
- return (binding == GL_BACK ? mBackFormat : mDSFormat);
-}
-
-GLsizei Surface::getAttachmentSamples(const gl::ImageIndex &target) const
-{
- return getConfig()->samples;
-}
-
-GLuint Surface::getId() const
-{
- UNREACHABLE();
- return 0;
-}
-
-gl::Framebuffer *Surface::createDefaultFramebuffer(const Display *display)
-{
- return new gl::Framebuffer(display, this);
-}
-
-gl::InitState Surface::initState(const gl::ImageIndex & /*imageIndex*/) const
-{
- // TODO(jmadill): Lazy surface init.
- return gl::InitState::Initialized;
-}
-
-void Surface::setInitState(const gl::ImageIndex & /*imageIndex*/, gl::InitState /*initState*/)
-{
- // No-op.
-}
-
-WindowSurface::WindowSurface(rx::EGLImplFactory *implFactory,
- const egl::Config *config,
- EGLNativeWindowType window,
- const AttributeMap &attribs)
- : Surface(EGL_WINDOW_BIT, config, attribs)
-{
- mImplementation = implFactory->createWindowSurface(mState, window, attribs);
-}
-
-WindowSurface::~WindowSurface()
-{
-}
-
-PbufferSurface::PbufferSurface(rx::EGLImplFactory *implFactory,
- const Config *config,
- const AttributeMap &attribs)
- : Surface(EGL_PBUFFER_BIT, config, attribs)
-{
- mImplementation = implFactory->createPbufferSurface(mState, attribs);
-}
-
-PbufferSurface::PbufferSurface(rx::EGLImplFactory *implFactory,
- const Config *config,
- EGLenum buftype,
- EGLClientBuffer clientBuffer,
- const AttributeMap &attribs)
- : Surface(EGL_PBUFFER_BIT, config, attribs)
-{
- mImplementation =
- implFactory->createPbufferFromClientBuffer(mState, buftype, clientBuffer, attribs);
-}
-
-PbufferSurface::~PbufferSurface()
-{
-}
-
-PixmapSurface::PixmapSurface(rx::EGLImplFactory *implFactory,
- const Config *config,
- NativePixmapType nativePixmap,
- const AttributeMap &attribs)
- : Surface(EGL_PIXMAP_BIT, config, attribs)
-{
- mImplementation = implFactory->createPixmapSurface(mState, nativePixmap, attribs);
-}
-
-PixmapSurface::~PixmapSurface()
-{
-}
-
-// SurfaceDeleter implementation.
-
-SurfaceDeleter::SurfaceDeleter(const Display *display) : mDisplay(display)
-{
-}
-
-SurfaceDeleter::~SurfaceDeleter()
-{
-}
-
-void SurfaceDeleter::operator()(Surface *surface)
-{
- ANGLE_SWALLOW_ERR(surface->onDestroy(mDisplay));
-}
-
-} // namespace egl
diff --git a/src/3rdparty/angle/src/libANGLE/Surface.h b/src/3rdparty/angle/src/libANGLE/Surface.h
deleted file mode 100644
index b3188ff909..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Surface.h
+++ /dev/null
@@ -1,238 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Surface.h: Defines the egl::Surface class, representing a drawing surface
-// such as the client area of a window, including any back buffers.
-// Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3.
-
-#ifndef LIBANGLE_SURFACE_H_
-#define LIBANGLE_SURFACE_H_
-
-#include <EGL/egl.h>
-
-#include "common/angleutils.h"
-#include "libANGLE/AttributeMap.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/RefCountObject.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/SurfaceImpl.h"
-
-namespace gl
-{
-class Framebuffer;
-class Texture;
-}
-
-namespace rx
-{
-class EGLImplFactory;
-}
-
-namespace egl
-{
-class Display;
-struct Config;
-
-struct SurfaceState final : private angle::NonCopyable
-{
- SurfaceState(const egl::Config *configIn, const AttributeMap &attributesIn);
-
- gl::Framebuffer *defaultFramebuffer;
- const egl::Config *config;
- AttributeMap attributes;
-};
-
-class Surface : public gl::FramebufferAttachmentObject
-{
- public:
- rx::SurfaceImpl *getImplementation() const { return mImplementation; }
-
- EGLint getType() const;
-
- Error initialize(const Display *display);
- Error swap(const gl::Context *context);
- Error swapWithDamage(const gl::Context *context, EGLint *rects, EGLint n_rects);
- Error postSubBuffer(const gl::Context *context,
- EGLint x,
- EGLint y,
- EGLint width,
- EGLint height);
- Error querySurfacePointerANGLE(EGLint attribute, void **value);
- Error bindTexImage(const gl::Context *context, gl::Texture *texture, EGLint buffer);
- Error releaseTexImage(const gl::Context *context, EGLint buffer);
-
- Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc);
-
- EGLint isPostSubBufferSupported() const;
-
- void setSwapInterval(EGLint interval);
- Error setIsCurrent(const gl::Context *context, bool isCurrent);
- Error onDestroy(const Display *display);
-
- void setMipmapLevel(EGLint level);
- void setMultisampleResolve(EGLenum resolve);
- void setSwapBehavior(EGLenum behavior);
-
- const Config *getConfig() const;
-
- // width and height can change with client window resizing
- EGLint getWidth() const;
- EGLint getHeight() const;
- EGLint getPixelAspectRatio() const;
- EGLenum getRenderBuffer() const;
- EGLenum getSwapBehavior() const;
- EGLenum getTextureFormat() const;
- EGLenum getTextureTarget() const;
- bool getLargestPbuffer() const;
- EGLenum getGLColorspace() const;
- EGLenum getVGAlphaFormat() const;
- EGLenum getVGColorspace() const;
- bool getMipmapTexture() const;
- EGLint getMipmapLevel() const;
- EGLint getHorizontalResolution() const;
- EGLint getVerticalResolution() const;
- EGLenum getMultisampleResolve() const;
-
- gl::Texture *getBoundTexture() const { return mTexture.get(); }
- gl::Framebuffer *getDefaultFramebuffer() { return mState.defaultFramebuffer; }
-
- EGLint isFixedSize() const;
-
- // FramebufferAttachmentObject implementation
- gl::Extents getAttachmentSize(const gl::ImageIndex &imageIndex) const override;
- const gl::Format &getAttachmentFormat(GLenum binding,
- const gl::ImageIndex &imageIndex) const override;
- GLsizei getAttachmentSamples(const gl::ImageIndex &imageIndex) const override;
-
- void onAttach(const gl::Context *context) override {}
- void onDetach(const gl::Context *context) override {}
- GLuint getId() const override;
-
- bool flexibleSurfaceCompatibilityRequested() const
- {
- return mFlexibleSurfaceCompatibilityRequested;
- }
- EGLint getOrientation() const { return mOrientation; }
-
- bool directComposition() const { return mDirectComposition; }
-
- gl::InitState initState(const gl::ImageIndex &imageIndex) const override;
- void setInitState(const gl::ImageIndex &imageIndex, gl::InitState initState) override;
-
- bool isRobustResourceInitEnabled() const { return mRobustResourceInitialization; }
-
- protected:
- Surface(EGLint surfaceType, const egl::Config *config, const AttributeMap &attributes);
- ~Surface() override;
- rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override;
-
- gl::Framebuffer *createDefaultFramebuffer(const Display *display);
-
- // ANGLE-only method, used internally
- friend class gl::Texture;
- void releaseTexImageFromTexture(const gl::Context *context);
-
- SurfaceState mState;
- rx::SurfaceImpl *mImplementation;
- int mCurrentCount;
- bool mDestroyed;
-
- EGLint mType;
-
- bool mPostSubBufferRequested;
- bool mFlexibleSurfaceCompatibilityRequested;
-
- bool mLargestPbuffer;
- EGLenum mGLColorspace;
- EGLenum mVGAlphaFormat;
- EGLenum mVGColorspace;
- bool mMipmapTexture;
- EGLint mMipmapLevel;
- EGLint mHorizontalResolution;
- EGLint mVerticalResolution;
- EGLenum mMultisampleResolve;
-
- bool mFixedSize;
- size_t mFixedWidth;
- size_t mFixedHeight;
-
- bool mDirectComposition;
-
- bool mRobustResourceInitialization;
-
- EGLenum mTextureFormat;
- EGLenum mTextureTarget;
-
- EGLint mPixelAspectRatio; // Display aspect ratio
- EGLenum mRenderBuffer; // Render buffer
- EGLenum mSwapBehavior; // Buffer swap behavior
-
- EGLint mOrientation;
-
- gl::BindingPointer<gl::Texture> mTexture;
-
- gl::Format mBackFormat;
- gl::Format mDSFormat;
-
- private:
- Error destroyImpl(const Display *display);
-};
-
-class WindowSurface final : public Surface
-{
- public:
- WindowSurface(rx::EGLImplFactory *implFactory,
- const Config *config,
- EGLNativeWindowType window,
- const AttributeMap &attribs);
- ~WindowSurface() override;
-};
-
-class PbufferSurface final : public Surface
-{
- public:
- PbufferSurface(rx::EGLImplFactory *implFactory,
- const Config *config,
- const AttributeMap &attribs);
- PbufferSurface(rx::EGLImplFactory *implFactory,
- const Config *config,
- EGLenum buftype,
- EGLClientBuffer clientBuffer,
- const AttributeMap &attribs);
-
- protected:
- ~PbufferSurface() override;
-};
-
-class PixmapSurface final : public Surface
-{
- public:
- PixmapSurface(rx::EGLImplFactory *implFactory,
- const Config *config,
- NativePixmapType nativePixmap,
- const AttributeMap &attribs);
-
- protected:
- ~PixmapSurface() override;
-};
-
-class SurfaceDeleter final
-{
- public:
- SurfaceDeleter(const Display *display);
- ~SurfaceDeleter();
- void operator()(Surface *surface);
-
- private:
- const Display *mDisplay;
-};
-
-using SurfacePointer = angle::UniqueObjectPointerBase<Surface, SurfaceDeleter>;
-
-} // namespace egl
-
-#endif // LIBANGLE_SURFACE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Texture.cpp b/src/3rdparty/angle/src/libANGLE/Texture.cpp
deleted file mode 100644
index da92e65916..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Texture.cpp
+++ /dev/null
@@ -1,1484 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Texture.cpp: Implements the gl::Texture class. [OpenGL ES 2.0.24] section 3.7 page 63.
-
-#include "libANGLE/Texture.h"
-
-#include "common/mathutil.h"
-#include "common/utilities.h"
-#include "libANGLE/Config.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/ContextState.h"
-#include "libANGLE/Image.h"
-#include "libANGLE/Surface.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/GLImplFactory.h"
-#include "libANGLE/renderer/TextureImpl.h"
-
-namespace gl
-{
-
-namespace
-{
-bool IsPointSampled(const SamplerState &samplerState)
-{
- return (samplerState.magFilter == GL_NEAREST &&
- (samplerState.minFilter == GL_NEAREST ||
- samplerState.minFilter == GL_NEAREST_MIPMAP_NEAREST));
-}
-
-size_t GetImageDescIndex(GLenum target, size_t level)
-{
- return IsCubeMapTextureTarget(target) ? ((level * 6) + CubeMapTextureTargetToLayerIndex(target))
- : level;
-}
-
-ImageIndex GetImageIndexFromDescIndex(GLenum target, size_t descIndex)
-{
- if (target == GL_TEXTURE_CUBE_MAP)
- {
- size_t faceIndex = descIndex % 6;
- size_t mipIndex = descIndex / 6;
- return ImageIndex::MakeCube(LayerIndexToCubeMapTextureTarget(faceIndex),
- static_cast<GLint>(mipIndex));
- }
-
- return ImageIndex::MakeGeneric(target, static_cast<GLint>(descIndex));
-}
-
-InitState DetermineInitState(const Context *context, const uint8_t *pixels)
-{
- // Can happen in tests.
- if (!context || !context->isRobustResourceInitEnabled())
- return InitState::Initialized;
-
- const auto &glState = context->getGLState();
- return (pixels == nullptr && glState.getTargetBuffer(gl::BufferBinding::PixelUnpack) == nullptr)
- ? InitState::MayNeedInit
- : InitState::Initialized;
-}
-
-} // namespace
-
-bool IsMipmapFiltered(const SamplerState &samplerState)
-{
- switch (samplerState.minFilter)
- {
- case GL_NEAREST:
- case GL_LINEAR:
- return false;
- case GL_NEAREST_MIPMAP_NEAREST:
- case GL_LINEAR_MIPMAP_NEAREST:
- case GL_NEAREST_MIPMAP_LINEAR:
- case GL_LINEAR_MIPMAP_LINEAR:
- return true;
- default:
- UNREACHABLE();
- return false;
- }
-}
-
-SwizzleState::SwizzleState()
- : swizzleRed(GL_INVALID_INDEX),
- swizzleGreen(GL_INVALID_INDEX),
- swizzleBlue(GL_INVALID_INDEX),
- swizzleAlpha(GL_INVALID_INDEX)
-{
-}
-
-SwizzleState::SwizzleState(GLenum red, GLenum green, GLenum blue, GLenum alpha)
- : swizzleRed(red), swizzleGreen(green), swizzleBlue(blue), swizzleAlpha(alpha)
-{
-}
-
-bool SwizzleState::swizzleRequired() const
-{
- return swizzleRed != GL_RED || swizzleGreen != GL_GREEN || swizzleBlue != GL_BLUE ||
- swizzleAlpha != GL_ALPHA;
-}
-
-bool SwizzleState::operator==(const SwizzleState &other) const
-{
- return swizzleRed == other.swizzleRed && swizzleGreen == other.swizzleGreen &&
- swizzleBlue == other.swizzleBlue && swizzleAlpha == other.swizzleAlpha;
-}
-
-bool SwizzleState::operator!=(const SwizzleState &other) const
-{
- return !(*this == other);
-}
-
-TextureState::TextureState(GLenum target)
- : mTarget(target),
- mSwizzleState(GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA),
- mSamplerState(SamplerState::CreateDefaultForTarget(target)),
- mBaseLevel(0),
- mMaxLevel(1000),
- mDepthStencilTextureMode(GL_DEPTH_COMPONENT),
- mImmutableFormat(false),
- mImmutableLevels(0),
- mUsage(GL_NONE),
- mImageDescs((IMPLEMENTATION_MAX_TEXTURE_LEVELS + 1) *
- (target == GL_TEXTURE_CUBE_MAP ? 6 : 1)),
- mInitState(InitState::MayNeedInit)
-{
-}
-
-TextureState::~TextureState()
-{
-}
-
-bool TextureState::swizzleRequired() const
-{
- return mSwizzleState.swizzleRequired();
-}
-
-GLuint TextureState::getEffectiveBaseLevel() const
-{
- if (mImmutableFormat)
- {
- // GLES 3.0.4 section 3.8.10
- return std::min(mBaseLevel, mImmutableLevels - 1);
- }
- // Some classes use the effective base level to index arrays with level data. By clamping the
- // effective base level to max levels these arrays need just one extra item to store properties
- // that should be returned for all out-of-range base level values, instead of needing special
- // handling for out-of-range base levels.
- return std::min(mBaseLevel, static_cast<GLuint>(IMPLEMENTATION_MAX_TEXTURE_LEVELS));
-}
-
-GLuint TextureState::getEffectiveMaxLevel() const
-{
- if (mImmutableFormat)
- {
- // GLES 3.0.4 section 3.8.10
- GLuint clampedMaxLevel = std::max(mMaxLevel, getEffectiveBaseLevel());
- clampedMaxLevel = std::min(clampedMaxLevel, mImmutableLevels - 1);
- return clampedMaxLevel;
- }
- return mMaxLevel;
-}
-
-GLuint TextureState::getMipmapMaxLevel() const
-{
- const ImageDesc &baseImageDesc = getImageDesc(getBaseImageTarget(), getEffectiveBaseLevel());
- GLuint expectedMipLevels = 0;
- if (mTarget == GL_TEXTURE_3D)
- {
- const int maxDim = std::max(std::max(baseImageDesc.size.width, baseImageDesc.size.height),
- baseImageDesc.size.depth);
- expectedMipLevels = static_cast<GLuint>(log2(maxDim));
- }
- else
- {
- expectedMipLevels = static_cast<GLuint>(
- log2(std::max(baseImageDesc.size.width, baseImageDesc.size.height)));
- }
-
- return std::min<GLuint>(getEffectiveBaseLevel() + expectedMipLevels, getEffectiveMaxLevel());
-}
-
-bool TextureState::setBaseLevel(GLuint baseLevel)
-{
- if (mBaseLevel != baseLevel)
- {
- mBaseLevel = baseLevel;
- return true;
- }
- return false;
-}
-
-bool TextureState::setMaxLevel(GLuint maxLevel)
-{
- if (mMaxLevel != maxLevel)
- {
- mMaxLevel = maxLevel;
- return true;
- }
-
- return false;
-}
-
-// Tests for cube texture completeness. [OpenGL ES 2.0.24] section 3.7.10 page 81.
-// According to [OpenGL ES 3.0.5] section 3.8.13 Texture Completeness page 160 any
-// per-level checks begin at the base-level.
-// For OpenGL ES2 the base level is always zero.
-bool TextureState::isCubeComplete() const
-{
- ASSERT(mTarget == GL_TEXTURE_CUBE_MAP);
-
- const ImageDesc &baseImageDesc =
- getImageDesc(FirstCubeMapTextureTarget, getEffectiveBaseLevel());
- if (baseImageDesc.size.width == 0 || baseImageDesc.size.width != baseImageDesc.size.height)
- {
- return false;
- }
-
- for (GLenum face = FirstCubeMapTextureTarget + 1; face <= LastCubeMapTextureTarget; face++)
- {
- const ImageDesc &faceImageDesc = getImageDesc(face, getEffectiveBaseLevel());
- if (faceImageDesc.size.width != baseImageDesc.size.width ||
- faceImageDesc.size.height != baseImageDesc.size.height ||
- !Format::SameSized(faceImageDesc.format, baseImageDesc.format))
- {
- return false;
- }
- }
-
- return true;
-}
-
-bool TextureState::computeSamplerCompleteness(const SamplerState &samplerState,
- const ContextState &data) const
-{
- if (mBaseLevel > mMaxLevel)
- {
- return false;
- }
- const ImageDesc &baseImageDesc = getImageDesc(getBaseImageTarget(), getEffectiveBaseLevel());
- if (baseImageDesc.size.width == 0 || baseImageDesc.size.height == 0 ||
- baseImageDesc.size.depth == 0)
- {
- return false;
- }
- // The cases where the texture is incomplete because base level is out of range should be
- // handled by the above condition.
- ASSERT(mBaseLevel < IMPLEMENTATION_MAX_TEXTURE_LEVELS || mImmutableFormat);
-
- if (mTarget == GL_TEXTURE_CUBE_MAP && baseImageDesc.size.width != baseImageDesc.size.height)
- {
- return false;
- }
-
- // According to es 3.1 spec, texture is justified as incomplete if sized internalformat is
- // unfilterable(table 20.11) and filter is not GL_NEAREST(8.16). The default value of minFilter
- // is NEAREST_MIPMAP_LINEAR and magFilter is LINEAR(table 20.11,). For multismaple texture,
- // filter state of multisample texture is ignored(11.1.3.3). So it shouldn't be judged as
- // incomplete texture. So, we ignore filtering for multisample texture completeness here.
- if (mTarget != GL_TEXTURE_2D_MULTISAMPLE &&
- !baseImageDesc.format.info->filterSupport(data.getClientVersion(), data.getExtensions()) &&
- !IsPointSampled(samplerState))
- {
- return false;
- }
- bool npotSupport = data.getExtensions().textureNPOT || data.getClientMajorVersion() >= 3;
- if (!npotSupport)
- {
- if ((samplerState.wrapS != GL_CLAMP_TO_EDGE && !isPow2(baseImageDesc.size.width)) ||
- (samplerState.wrapT != GL_CLAMP_TO_EDGE && !isPow2(baseImageDesc.size.height)))
- {
- return false;
- }
- }
-
- if (mTarget != GL_TEXTURE_2D_MULTISAMPLE && IsMipmapFiltered(samplerState))
- {
- if (!npotSupport)
- {
- if (!isPow2(baseImageDesc.size.width) || !isPow2(baseImageDesc.size.height))
- {
- return false;
- }
- }
-
- if (!computeMipmapCompleteness())
- {
- return false;
- }
- }
- else
- {
- if (mTarget == GL_TEXTURE_CUBE_MAP && !isCubeComplete())
- {
- return false;
- }
- }
-
- // From GL_OES_EGL_image_external_essl3: If state is present in a sampler object bound to a
- // texture unit that would have been rejected by a call to TexParameter* for the texture bound
- // to that unit, the behavior of the implementation is as if the texture were incomplete. For
- // example, if TEXTURE_WRAP_S or TEXTURE_WRAP_T is set to anything but CLAMP_TO_EDGE on the
- // sampler object bound to a texture unit and the texture bound to that unit is an external
- // texture, the texture will be considered incomplete.
- // Sampler object state which does not affect sampling for the type of texture bound to a
- // texture unit, such as TEXTURE_WRAP_R for an external texture, does not affect completeness.
- if (mTarget == GL_TEXTURE_EXTERNAL_OES)
- {
- if (samplerState.wrapS != GL_CLAMP_TO_EDGE || samplerState.wrapT != GL_CLAMP_TO_EDGE)
- {
- return false;
- }
-
- if (samplerState.minFilter != GL_LINEAR && samplerState.minFilter != GL_NEAREST)
- {
- return false;
- }
- }
-
- // OpenGLES 3.0.2 spec section 3.8.13 states that a texture is not mipmap complete if:
- // The internalformat specified for the texture arrays is a sized internal depth or
- // depth and stencil format (see table 3.13), the value of TEXTURE_COMPARE_-
- // MODE is NONE, and either the magnification filter is not NEAREST or the mini-
- // fication filter is neither NEAREST nor NEAREST_MIPMAP_NEAREST.
- if (mTarget != GL_TEXTURE_2D_MULTISAMPLE && baseImageDesc.format.info->depthBits > 0 &&
- data.getClientMajorVersion() >= 3)
- {
- // Note: we restrict this validation to sized types. For the OES_depth_textures
- // extension, due to some underspecification problems, we must allow linear filtering
- // for legacy compatibility with WebGL 1.
- // See http://crbug.com/649200
- if (samplerState.compareMode == GL_NONE && baseImageDesc.format.info->sized)
- {
- if ((samplerState.minFilter != GL_NEAREST &&
- samplerState.minFilter != GL_NEAREST_MIPMAP_NEAREST) ||
- samplerState.magFilter != GL_NEAREST)
- {
- return false;
- }
- }
- }
-
- return true;
-}
-
-bool TextureState::computeMipmapCompleteness() const
-{
- const GLuint maxLevel = getMipmapMaxLevel();
-
- for (GLuint level = getEffectiveBaseLevel(); level <= maxLevel; level++)
- {
- if (mTarget == GL_TEXTURE_CUBE_MAP)
- {
- for (GLenum face = FirstCubeMapTextureTarget; face <= LastCubeMapTextureTarget; face++)
- {
- if (!computeLevelCompleteness(face, level))
- {
- return false;
- }
- }
- }
- else
- {
- if (!computeLevelCompleteness(mTarget, level))
- {
- return false;
- }
- }
- }
-
- return true;
-}
-
-bool TextureState::computeLevelCompleteness(GLenum target, size_t level) const
-{
- ASSERT(level < IMPLEMENTATION_MAX_TEXTURE_LEVELS);
-
- if (mImmutableFormat)
- {
- return true;
- }
-
- const ImageDesc &baseImageDesc = getImageDesc(getBaseImageTarget(), getEffectiveBaseLevel());
- if (baseImageDesc.size.width == 0 || baseImageDesc.size.height == 0 ||
- baseImageDesc.size.depth == 0)
- {
- return false;
- }
-
- const ImageDesc &levelImageDesc = getImageDesc(target, level);
- if (levelImageDesc.size.width == 0 || levelImageDesc.size.height == 0 ||
- levelImageDesc.size.depth == 0)
- {
- return false;
- }
-
- if (!Format::SameSized(levelImageDesc.format, baseImageDesc.format))
- {
- return false;
- }
-
- ASSERT(level >= getEffectiveBaseLevel());
- const size_t relativeLevel = level - getEffectiveBaseLevel();
- if (levelImageDesc.size.width != std::max(1, baseImageDesc.size.width >> relativeLevel))
- {
- return false;
- }
-
- if (levelImageDesc.size.height != std::max(1, baseImageDesc.size.height >> relativeLevel))
- {
- return false;
- }
-
- if (mTarget == GL_TEXTURE_3D)
- {
- if (levelImageDesc.size.depth != std::max(1, baseImageDesc.size.depth >> relativeLevel))
- {
- return false;
- }
- }
- else if (mTarget == GL_TEXTURE_2D_ARRAY)
- {
- if (levelImageDesc.size.depth != baseImageDesc.size.depth)
- {
- return false;
- }
- }
-
- return true;
-}
-
-GLenum TextureState::getBaseImageTarget() const
-{
- return mTarget == GL_TEXTURE_CUBE_MAP ? FirstCubeMapTextureTarget : mTarget;
-}
-
-ImageDesc::ImageDesc()
- : ImageDesc(Extents(0, 0, 0), Format::Invalid(), 0, GL_TRUE, InitState::Initialized)
-{
-}
-
-ImageDesc::ImageDesc(const Extents &size, const Format &format, const InitState initState)
- : size(size), format(format), samples(0), fixedSampleLocations(GL_TRUE), initState(initState)
-{
-}
-
-ImageDesc::ImageDesc(const Extents &size,
- const Format &format,
- const GLsizei samples,
- const bool fixedSampleLocations,
- const InitState initState)
- : size(size),
- format(format),
- samples(samples),
- fixedSampleLocations(fixedSampleLocations),
- initState(initState)
-{
-}
-
-const ImageDesc &TextureState::getImageDesc(GLenum target, size_t level) const
-{
- size_t descIndex = GetImageDescIndex(target, level);
- ASSERT(descIndex < mImageDescs.size());
- return mImageDescs[descIndex];
-}
-
-void TextureState::setImageDesc(GLenum target, size_t level, const ImageDesc &desc)
-{
- size_t descIndex = GetImageDescIndex(target, level);
- ASSERT(descIndex < mImageDescs.size());
- mImageDescs[descIndex] = desc;
- if (desc.initState == InitState::MayNeedInit)
- {
- mInitState = InitState::MayNeedInit;
- }
-}
-
-const ImageDesc &TextureState::getImageDesc(const ImageIndex &imageIndex) const
-{
- return getImageDesc(imageIndex.type, imageIndex.mipIndex);
-}
-
-void TextureState::setImageDescChain(GLuint baseLevel,
- GLuint maxLevel,
- Extents baseSize,
- const Format &format,
- InitState initState)
-{
- for (GLuint level = baseLevel; level <= maxLevel; level++)
- {
- int relativeLevel = (level - baseLevel);
- Extents levelSize(std::max<int>(baseSize.width >> relativeLevel, 1),
- std::max<int>(baseSize.height >> relativeLevel, 1),
- (mTarget == GL_TEXTURE_2D_ARRAY)
- ? baseSize.depth
- : std::max<int>(baseSize.depth >> relativeLevel, 1));
- ImageDesc levelInfo(levelSize, format, initState);
-
- if (mTarget == GL_TEXTURE_CUBE_MAP)
- {
- for (GLenum face = FirstCubeMapTextureTarget; face <= LastCubeMapTextureTarget; face++)
- {
- setImageDesc(face, level, levelInfo);
- }
- }
- else
- {
- setImageDesc(mTarget, level, levelInfo);
- }
- }
-}
-
-void TextureState::setImageDescChainMultisample(Extents baseSize,
- const Format &format,
- GLsizei samples,
- bool fixedSampleLocations,
- InitState initState)
-{
- ASSERT(mTarget == GL_TEXTURE_2D_MULTISAMPLE);
- ImageDesc levelInfo(baseSize, format, samples, fixedSampleLocations, initState);
- setImageDesc(mTarget, 0, levelInfo);
-}
-
-void TextureState::clearImageDesc(GLenum target, size_t level)
-{
- setImageDesc(target, level, ImageDesc());
-}
-
-void TextureState::clearImageDescs()
-{
- for (size_t descIndex = 0; descIndex < mImageDescs.size(); descIndex++)
- {
- mImageDescs[descIndex] = ImageDesc();
- }
-}
-
-Texture::Texture(rx::GLImplFactory *factory, GLuint id, GLenum target)
- : egl::ImageSibling(id),
- mState(target),
- mTexture(factory->createTexture(mState)),
- mLabel(),
- mBoundSurface(nullptr),
- mBoundStream(nullptr)
-{
-}
-
-Error Texture::onDestroy(const Context *context)
-{
- if (mBoundSurface)
- {
- ANGLE_TRY(mBoundSurface->releaseTexImage(context, EGL_BACK_BUFFER));
- mBoundSurface = nullptr;
- }
- if (mBoundStream)
- {
- mBoundStream->releaseTextures();
- mBoundStream = nullptr;
- }
-
- ANGLE_TRY(orphanImages(context));
-
- if (mTexture)
- {
- ANGLE_TRY(mTexture->onDestroy(context));
- }
- return NoError();
-}
-
-Texture::~Texture()
-{
- SafeDelete(mTexture);
-}
-
-void Texture::setLabel(const std::string &label)
-{
- mLabel = label;
- mDirtyBits.set(DIRTY_BIT_LABEL);
-}
-
-const std::string &Texture::getLabel() const
-{
- return mLabel;
-}
-
-GLenum Texture::getTarget() const
-{
- return mState.mTarget;
-}
-
-void Texture::setSwizzleRed(GLenum swizzleRed)
-{
- mState.mSwizzleState.swizzleRed = swizzleRed;
- mDirtyBits.set(DIRTY_BIT_SWIZZLE_RED);
-}
-
-GLenum Texture::getSwizzleRed() const
-{
- return mState.mSwizzleState.swizzleRed;
-}
-
-void Texture::setSwizzleGreen(GLenum swizzleGreen)
-{
- mState.mSwizzleState.swizzleGreen = swizzleGreen;
- mDirtyBits.set(DIRTY_BIT_SWIZZLE_GREEN);
-}
-
-GLenum Texture::getSwizzleGreen() const
-{
- return mState.mSwizzleState.swizzleGreen;
-}
-
-void Texture::setSwizzleBlue(GLenum swizzleBlue)
-{
- mState.mSwizzleState.swizzleBlue = swizzleBlue;
- mDirtyBits.set(DIRTY_BIT_SWIZZLE_BLUE);
-}
-
-GLenum Texture::getSwizzleBlue() const
-{
- return mState.mSwizzleState.swizzleBlue;
-}
-
-void Texture::setSwizzleAlpha(GLenum swizzleAlpha)
-{
- mState.mSwizzleState.swizzleAlpha = swizzleAlpha;
- mDirtyBits.set(DIRTY_BIT_SWIZZLE_ALPHA);
-}
-
-GLenum Texture::getSwizzleAlpha() const
-{
- return mState.mSwizzleState.swizzleAlpha;
-}
-
-void Texture::setMinFilter(GLenum minFilter)
-{
- mState.mSamplerState.minFilter = minFilter;
- mDirtyBits.set(DIRTY_BIT_MIN_FILTER);
-}
-
-GLenum Texture::getMinFilter() const
-{
- return mState.mSamplerState.minFilter;
-}
-
-void Texture::setMagFilter(GLenum magFilter)
-{
- mState.mSamplerState.magFilter = magFilter;
- mDirtyBits.set(DIRTY_BIT_MAG_FILTER);
-}
-
-GLenum Texture::getMagFilter() const
-{
- return mState.mSamplerState.magFilter;
-}
-
-void Texture::setWrapS(GLenum wrapS)
-{
- mState.mSamplerState.wrapS = wrapS;
- mDirtyBits.set(DIRTY_BIT_WRAP_S);
-}
-
-GLenum Texture::getWrapS() const
-{
- return mState.mSamplerState.wrapS;
-}
-
-void Texture::setWrapT(GLenum wrapT)
-{
- mState.mSamplerState.wrapT = wrapT;
- mDirtyBits.set(DIRTY_BIT_WRAP_T);
-}
-
-GLenum Texture::getWrapT() const
-{
- return mState.mSamplerState.wrapT;
-}
-
-void Texture::setWrapR(GLenum wrapR)
-{
- mState.mSamplerState.wrapR = wrapR;
- mDirtyBits.set(DIRTY_BIT_WRAP_R);
-}
-
-GLenum Texture::getWrapR() const
-{
- return mState.mSamplerState.wrapR;
-}
-
-void Texture::setMaxAnisotropy(float maxAnisotropy)
-{
- mState.mSamplerState.maxAnisotropy = maxAnisotropy;
- mDirtyBits.set(DIRTY_BIT_MAX_ANISOTROPY);
-}
-
-float Texture::getMaxAnisotropy() const
-{
- return mState.mSamplerState.maxAnisotropy;
-}
-
-void Texture::setMinLod(GLfloat minLod)
-{
- mState.mSamplerState.minLod = minLod;
- mDirtyBits.set(DIRTY_BIT_MIN_LOD);
-}
-
-GLfloat Texture::getMinLod() const
-{
- return mState.mSamplerState.minLod;
-}
-
-void Texture::setMaxLod(GLfloat maxLod)
-{
- mState.mSamplerState.maxLod = maxLod;
- mDirtyBits.set(DIRTY_BIT_MAX_LOD);
-}
-
-GLfloat Texture::getMaxLod() const
-{
- return mState.mSamplerState.maxLod;
-}
-
-void Texture::setCompareMode(GLenum compareMode)
-{
- mState.mSamplerState.compareMode = compareMode;
- mDirtyBits.set(DIRTY_BIT_COMPARE_MODE);
-}
-
-GLenum Texture::getCompareMode() const
-{
- return mState.mSamplerState.compareMode;
-}
-
-void Texture::setCompareFunc(GLenum compareFunc)
-{
- mState.mSamplerState.compareFunc = compareFunc;
- mDirtyBits.set(DIRTY_BIT_COMPARE_FUNC);
-}
-
-GLenum Texture::getCompareFunc() const
-{
- return mState.mSamplerState.compareFunc;
-}
-
-void Texture::setSRGBDecode(GLenum sRGBDecode)
-{
- mState.mSamplerState.sRGBDecode = sRGBDecode;
- mDirtyBits.set(DIRTY_BIT_SRGB_DECODE);
-}
-
-GLenum Texture::getSRGBDecode() const
-{
- return mState.mSamplerState.sRGBDecode;
-}
-
-const SamplerState &Texture::getSamplerState() const
-{
- return mState.mSamplerState;
-}
-
-Error Texture::setBaseLevel(const Context *context, GLuint baseLevel)
-{
- if (mState.setBaseLevel(baseLevel))
- {
- ANGLE_TRY(mTexture->setBaseLevel(context, mState.getEffectiveBaseLevel()));
- mDirtyBits.set(DIRTY_BIT_BASE_LEVEL);
- invalidateCompletenessCache();
- }
-
- return NoError();
-}
-
-GLuint Texture::getBaseLevel() const
-{
- return mState.mBaseLevel;
-}
-
-void Texture::setMaxLevel(GLuint maxLevel)
-{
- if (mState.setMaxLevel(maxLevel))
- {
- mDirtyBits.set(DIRTY_BIT_MAX_LEVEL);
- invalidateCompletenessCache();
- }
-}
-
-GLuint Texture::getMaxLevel() const
-{
- return mState.mMaxLevel;
-}
-
-void Texture::setDepthStencilTextureMode(GLenum mode)
-{
- if (mode != mState.mDepthStencilTextureMode)
- {
- // Changing the mode from the default state (GL_DEPTH_COMPONENT) is not implemented yet
- UNIMPLEMENTED();
- }
-
- // TODO(geofflang): add dirty bits
- mState.mDepthStencilTextureMode = mode;
-}
-
-GLenum Texture::getDepthStencilTextureMode() const
-{
- return mState.mDepthStencilTextureMode;
-}
-
-bool Texture::getImmutableFormat() const
-{
- return mState.mImmutableFormat;
-}
-
-GLuint Texture::getImmutableLevels() const
-{
- return mState.mImmutableLevels;
-}
-
-void Texture::setUsage(GLenum usage)
-{
- mState.mUsage = usage;
- mDirtyBits.set(DIRTY_BIT_USAGE);
-}
-
-GLenum Texture::getUsage() const
-{
- return mState.mUsage;
-}
-
-const TextureState &Texture::getTextureState() const
-{
- return mState;
-}
-
-size_t Texture::getWidth(GLenum target, size_t level) const
-{
- ASSERT(target == mState.mTarget ||
- (mState.mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
- return mState.getImageDesc(target, level).size.width;
-}
-
-size_t Texture::getHeight(GLenum target, size_t level) const
-{
- ASSERT(target == mState.mTarget ||
- (mState.mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
- return mState.getImageDesc(target, level).size.height;
-}
-
-size_t Texture::getDepth(GLenum target, size_t level) const
-{
- ASSERT(target == mState.mTarget ||
- (mState.mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
- return mState.getImageDesc(target, level).size.depth;
-}
-
-const Format &Texture::getFormat(GLenum target, size_t level) const
-{
- ASSERT(target == mState.mTarget ||
- (mState.mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
- return mState.getImageDesc(target, level).format;
-}
-
-GLsizei Texture::getSamples(GLenum target, size_t level) const
-{
- ASSERT(target == mState.mTarget ||
- (mState.mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
- return mState.getImageDesc(target, level).samples;
-}
-
-bool Texture::getFixedSampleLocations(GLenum target, size_t level) const
-{
- ASSERT(target == mState.mTarget ||
- (mState.mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
- return mState.getImageDesc(target, level).fixedSampleLocations;
-}
-
-GLuint Texture::getMipmapMaxLevel() const
-{
- return mState.getMipmapMaxLevel();
-}
-
-bool Texture::isMipmapComplete() const
-{
- return mState.computeMipmapCompleteness();
-}
-
-egl::Surface *Texture::getBoundSurface() const
-{
- return mBoundSurface;
-}
-
-egl::Stream *Texture::getBoundStream() const
-{
- return mBoundStream;
-}
-
-void Texture::signalDirty(InitState initState) const
-{
- mDirtyChannel.signal(initState);
- invalidateCompletenessCache();
-}
-
-Error Texture::setImage(const Context *context,
- const PixelUnpackState &unpackState,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const Extents &size,
- GLenum format,
- GLenum type,
- const uint8_t *pixels)
-{
- ASSERT(target == mState.mTarget ||
- (mState.mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
-
- // Release from previous calls to eglBindTexImage, to avoid calling the Impl after
- ANGLE_TRY(releaseTexImageInternal(context));
- ANGLE_TRY(orphanImages(context));
-
- ANGLE_TRY(mTexture->setImage(context, target, level, internalFormat, size, format, type,
- unpackState, pixels));
-
- InitState initState = DetermineInitState(context, pixels);
- mState.setImageDesc(target, level, ImageDesc(size, Format(internalFormat, type), initState));
- signalDirty(initState);
-
- return NoError();
-}
-
-Error Texture::setSubImage(const Context *context,
- const PixelUnpackState &unpackState,
- GLenum target,
- size_t level,
- const Box &area,
- GLenum format,
- GLenum type,
- const uint8_t *pixels)
-{
- ASSERT(target == mState.mTarget ||
- (mState.mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
-
- ANGLE_TRY(ensureSubImageInitialized(context, target, level, area));
-
- return mTexture->setSubImage(context, target, level, area, format, type, unpackState, pixels);
-}
-
-Error Texture::setCompressedImage(const Context *context,
- const PixelUnpackState &unpackState,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const Extents &size,
- size_t imageSize,
- const uint8_t *pixels)
-{
- ASSERT(target == mState.mTarget ||
- (mState.mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
-
- // Release from previous calls to eglBindTexImage, to avoid calling the Impl after
- ANGLE_TRY(releaseTexImageInternal(context));
- ANGLE_TRY(orphanImages(context));
-
- ANGLE_TRY(mTexture->setCompressedImage(context, target, level, internalFormat, size,
- unpackState, imageSize, pixels));
-
- InitState initState = DetermineInitState(context, pixels);
- mState.setImageDesc(target, level, ImageDesc(size, Format(internalFormat), initState));
- signalDirty(initState);
-
- return NoError();
-}
-
-Error Texture::setCompressedSubImage(const Context *context,
- const PixelUnpackState &unpackState,
- GLenum target,
- size_t level,
- const Box &area,
- GLenum format,
- size_t imageSize,
- const uint8_t *pixels)
-{
- ASSERT(target == mState.mTarget ||
- (mState.mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
-
- ANGLE_TRY(ensureSubImageInitialized(context, target, level, area));
-
- return mTexture->setCompressedSubImage(context, target, level, area, format, unpackState,
- imageSize, pixels);
-}
-
-Error Texture::copyImage(const Context *context,
- GLenum target,
- size_t level,
- const Rectangle &sourceArea,
- GLenum internalFormat,
- Framebuffer *source)
-{
- ASSERT(target == mState.mTarget ||
- (mState.mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
-
- // Release from previous calls to eglBindTexImage, to avoid calling the Impl after
- ANGLE_TRY(releaseTexImageInternal(context));
- ANGLE_TRY(orphanImages(context));
-
- // Ensure source FBO is initialized.
- ANGLE_TRY(source->ensureReadAttachmentInitialized(context, GL_COLOR_BUFFER_BIT));
-
- // Use the source FBO size as the init image area.
- Box destBox(0, 0, 0, sourceArea.width, sourceArea.height, 1);
- ANGLE_TRY(ensureSubImageInitialized(context, target, level, destBox));
-
- ANGLE_TRY(mTexture->copyImage(context, target, level, sourceArea, internalFormat, source));
-
- const InternalFormat &internalFormatInfo =
- GetInternalFormatInfo(internalFormat, GL_UNSIGNED_BYTE);
-
- mState.setImageDesc(target, level,
- ImageDesc(Extents(sourceArea.width, sourceArea.height, 1),
- Format(internalFormatInfo), InitState::Initialized));
-
- // We need to initialize this texture only if the source attachment is not initialized.
- signalDirty(InitState::Initialized);
-
- return NoError();
-}
-
-Error Texture::copySubImage(const Context *context,
- GLenum target,
- size_t level,
- const Offset &destOffset,
- const Rectangle &sourceArea,
- Framebuffer *source)
-{
- ASSERT(target == mState.mTarget ||
- (mState.mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
-
- // 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));
-
- return mTexture->copySubImage(context, target, level, destOffset, sourceArea, source);
-}
-
-Error Texture::copyTexture(const Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- GLenum type,
- size_t sourceLevel,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- Texture *source)
-{
- ASSERT(target == mState.mTarget ||
- (mState.mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
-
- // Release from previous calls to eglBindTexImage, to avoid calling the Impl after
- ANGLE_TRY(releaseTexImageInternal(context));
- ANGLE_TRY(orphanImages(context));
-
- // Initialize source texture.
- // Note: we don't have a way to notify which portions of the image changed currently.
- ANGLE_TRY(source->ensureInitialized(context));
-
- ANGLE_TRY(mTexture->copyTexture(context, target, level, internalFormat, type, sourceLevel,
- unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha,
- source));
-
- const auto &sourceDesc = source->mState.getImageDesc(source->getTarget(), 0);
- const InternalFormat &internalFormatInfo = GetInternalFormatInfo(internalFormat, type);
- mState.setImageDesc(
- target, level,
- ImageDesc(sourceDesc.size, Format(internalFormatInfo), InitState::Initialized));
-
- signalDirty(InitState::Initialized);
-
- return NoError();
-}
-
-Error Texture::copySubTexture(const Context *context,
- GLenum target,
- size_t level,
- const Offset &destOffset,
- size_t sourceLevel,
- const Rectangle &sourceArea,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- Texture *source)
-{
- ASSERT(target == mState.mTarget ||
- (mState.mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
-
- // Ensure source is initialized.
- ANGLE_TRY(source->ensureInitialized(context));
-
- Box destBox(destOffset.x, destOffset.y, destOffset.y, sourceArea.width, sourceArea.height, 1);
- ANGLE_TRY(ensureSubImageInitialized(context, target, level, destBox));
-
- return mTexture->copySubTexture(context, target, level, destOffset, sourceLevel, sourceArea,
- unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha,
- source);
-}
-
-Error Texture::copyCompressedTexture(const Context *context, const Texture *source)
-{
- // Release from previous calls to eglBindTexImage, to avoid calling the Impl after
- ANGLE_TRY(releaseTexImageInternal(context));
- ANGLE_TRY(orphanImages(context));
-
- ANGLE_TRY(mTexture->copyCompressedTexture(context, source));
-
- ASSERT(source->getTarget() != GL_TEXTURE_CUBE_MAP && getTarget() != GL_TEXTURE_CUBE_MAP);
- const auto &sourceDesc = source->mState.getImageDesc(source->getTarget(), 0);
- mState.setImageDesc(getTarget(), 0, sourceDesc);
-
- return NoError();
-}
-
-Error Texture::setStorage(const Context *context,
- GLenum target,
- GLsizei levels,
- GLenum internalFormat,
- const Extents &size)
-{
- ASSERT(target == mState.mTarget);
-
- // Release from previous calls to eglBindTexImage, to avoid calling the Impl after
- ANGLE_TRY(releaseTexImageInternal(context));
- ANGLE_TRY(orphanImages(context));
-
- ANGLE_TRY(mTexture->setStorage(context, target, levels, internalFormat, size));
-
- 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);
-
- signalDirty(InitState::MayNeedInit);
-
- return NoError();
-}
-
-Error Texture::setStorageMultisample(const Context *context,
- GLenum target,
- GLsizei samples,
- GLint internalFormat,
- const Extents &size,
- bool fixedSampleLocations)
-{
- ASSERT(target == mState.mTarget);
-
- // Release from previous calls to eglBindTexImage, to avoid calling the Impl after
- ANGLE_TRY(releaseTexImageInternal(context));
- ANGLE_TRY(orphanImages(context));
-
- ANGLE_TRY(mTexture->setStorageMultisample(context, target, samples, internalFormat, size,
- fixedSampleLocations));
-
- mState.mImmutableFormat = true;
- mState.mImmutableLevels = static_cast<GLuint>(1);
- mState.clearImageDescs();
- mState.setImageDescChainMultisample(size, Format(internalFormat), samples, fixedSampleLocations,
- InitState::MayNeedInit);
-
- signalDirty(InitState::MayNeedInit);
-
- return NoError();
-}
-
-Error Texture::generateMipmap(const Context *context)
-{
- // Release from previous calls to eglBindTexImage, to avoid calling the Impl after
- ANGLE_TRY(releaseTexImageInternal(context));
-
- // EGL_KHR_gl_image states that images are only orphaned when generating mipmaps if the texture
- // is not mip complete.
- if (!isMipmapComplete())
- {
- ANGLE_TRY(orphanImages(context));
- }
-
- const GLuint baseLevel = mState.getEffectiveBaseLevel();
- const GLuint maxLevel = mState.getMipmapMaxLevel();
-
- if (maxLevel > baseLevel)
- {
- syncState();
- const ImageDesc &baseImageInfo =
- mState.getImageDesc(mState.getBaseImageTarget(), baseLevel);
-
- // Clear the base image immediately if necessary.
- if (context->isRobustResourceInitEnabled() &&
- baseImageInfo.initState == InitState::MayNeedInit)
- {
- ANGLE_TRY(initializeContents(
- context, GetImageIndexFromDescIndex(mState.getBaseImageTarget(), baseLevel)));
- }
-
- ANGLE_TRY(mTexture->generateMipmap(context));
-
- mState.setImageDescChain(baseLevel, maxLevel, baseImageInfo.size, baseImageInfo.format,
- InitState::Initialized);
- }
-
- signalDirty(InitState::Initialized);
-
- return NoError();
-}
-
-Error Texture::bindTexImageFromSurface(const Context *context, egl::Surface *surface)
-{
- ASSERT(surface);
-
- if (mBoundSurface)
- {
- ANGLE_TRY(releaseTexImageFromSurface(context));
- }
-
- ANGLE_TRY(mTexture->bindTexImage(context, surface));
- mBoundSurface = surface;
-
- // Set the image info to the size and format of the surface
- ASSERT(mState.mTarget == GL_TEXTURE_2D || mState.mTarget == GL_TEXTURE_RECTANGLE_ANGLE);
- Extents size(surface->getWidth(), surface->getHeight(), 1);
- ImageDesc desc(size, Format(surface->getConfig()->renderTargetFormat), InitState::Initialized);
- mState.setImageDesc(mState.mTarget, 0, desc);
- signalDirty(InitState::Initialized);
- return NoError();
-}
-
-Error Texture::releaseTexImageFromSurface(const Context *context)
-{
- ASSERT(mBoundSurface);
- mBoundSurface = nullptr;
- ANGLE_TRY(mTexture->releaseTexImage(context));
-
- // Erase the image info for level 0
- ASSERT(mState.mTarget == GL_TEXTURE_2D || mState.mTarget == GL_TEXTURE_RECTANGLE_ANGLE);
- mState.clearImageDesc(mState.mTarget, 0);
- signalDirty(InitState::Initialized);
- return NoError();
-}
-
-void Texture::bindStream(egl::Stream *stream)
-{
- ASSERT(stream);
-
- // It should not be possible to bind a texture already bound to another stream
- ASSERT(mBoundStream == nullptr);
-
- mBoundStream = stream;
-
- ASSERT(mState.mTarget == GL_TEXTURE_EXTERNAL_OES);
-}
-
-void Texture::releaseStream()
-{
- ASSERT(mBoundStream);
- mBoundStream = nullptr;
-}
-
-Error Texture::acquireImageFromStream(const Context *context,
- const egl::Stream::GLTextureDescription &desc)
-{
- ASSERT(mBoundStream != nullptr);
- ANGLE_TRY(mTexture->setImageExternal(context, mState.mTarget, mBoundStream, desc));
-
- Extents size(desc.width, desc.height, 1);
- mState.setImageDesc(mState.mTarget, 0,
- ImageDesc(size, Format(desc.internalFormat), InitState::Initialized));
- signalDirty(InitState::Initialized);
- return NoError();
-}
-
-Error Texture::releaseImageFromStream(const Context *context)
-{
- ASSERT(mBoundStream != nullptr);
- ANGLE_TRY(mTexture->setImageExternal(context, mState.mTarget, nullptr,
- egl::Stream::GLTextureDescription()));
-
- // Set to incomplete
- mState.clearImageDesc(mState.mTarget, 0);
- signalDirty(InitState::Initialized);
- return NoError();
-}
-
-Error Texture::releaseTexImageInternal(const Context *context)
-{
- if (mBoundSurface)
- {
- // Notify the surface
- mBoundSurface->releaseTexImageFromTexture(context);
-
- // Then, call the same method as from the surface
- ANGLE_TRY(releaseTexImageFromSurface(context));
- }
- return NoError();
-}
-
-Error Texture::setEGLImageTarget(const Context *context, GLenum target, egl::Image *imageTarget)
-{
- ASSERT(target == mState.mTarget);
- ASSERT(target == GL_TEXTURE_2D || target == GL_TEXTURE_EXTERNAL_OES);
-
- // Release from previous calls to eglBindTexImage, to avoid calling the Impl after
- ANGLE_TRY(releaseTexImageInternal(context));
- ANGLE_TRY(orphanImages(context));
-
- ANGLE_TRY(mTexture->setEGLImageTarget(context, target, imageTarget));
-
- setTargetImage(context, imageTarget);
-
- Extents size(static_cast<int>(imageTarget->getWidth()),
- static_cast<int>(imageTarget->getHeight()), 1);
-
- auto initState = imageTarget->sourceInitState();
-
- mState.clearImageDescs();
- mState.setImageDesc(target, 0, ImageDesc(size, imageTarget->getFormat(), initState));
- signalDirty(initState);
-
- return NoError();
-}
-
-Extents Texture::getAttachmentSize(const ImageIndex &imageIndex) const
-{
- return mState.getImageDesc(imageIndex).size;
-}
-
-const Format &Texture::getAttachmentFormat(GLenum /*binding*/, const ImageIndex &imageIndex) const
-{
- return mState.getImageDesc(imageIndex).format;
-}
-
-GLsizei Texture::getAttachmentSamples(const ImageIndex &imageIndex) const
-{
- return getSamples(imageIndex.type, 0);
-}
-
-void Texture::onAttach(const Context *context)
-{
- addRef();
-}
-
-void Texture::onDetach(const Context *context)
-{
- release(context);
-}
-
-GLuint Texture::getId() const
-{
- return id();
-}
-
-void Texture::syncState()
-{
- mTexture->syncState(mDirtyBits);
- mDirtyBits.reset();
-}
-
-rx::FramebufferAttachmentObjectImpl *Texture::getAttachmentImpl() const
-{
- return mTexture;
-}
-
-bool Texture::isSamplerComplete(const Context *context, const Sampler *optionalSampler)
-{
- const auto &samplerState =
- optionalSampler ? optionalSampler->getSamplerState() : mState.mSamplerState;
- const auto &contextState = context->getContextState();
-
- if (contextState.getContextID() != mCompletenessCache.context ||
- mCompletenessCache.samplerState != samplerState)
- {
- mCompletenessCache.context = context->getContextState().getContextID();
- mCompletenessCache.samplerState = samplerState;
- mCompletenessCache.samplerComplete =
- mState.computeSamplerCompleteness(samplerState, contextState);
- }
-
- return mCompletenessCache.samplerComplete;
-}
-
-Texture::SamplerCompletenessCache::SamplerCompletenessCache()
- : context(0), samplerState(), samplerComplete(false)
-{
-}
-
-void Texture::invalidateCompletenessCache() const
-{
- mCompletenessCache.context = 0;
-}
-
-Error Texture::ensureInitialized(const Context *context)
-{
- if (!context->isRobustResourceInitEnabled() || mState.mInitState == InitState::Initialized)
- {
- return NoError();
- }
-
- bool anyDirty = false;
-
- for (size_t descIndex = 0; descIndex < mState.mImageDescs.size(); ++descIndex)
- {
- auto &imageDesc = mState.mImageDescs[descIndex];
- if (imageDesc.initState == InitState::MayNeedInit)
- {
- ASSERT(mState.mInitState == InitState::MayNeedInit);
- const auto &imageIndex = GetImageIndexFromDescIndex(mState.mTarget, descIndex);
- ANGLE_TRY(initializeContents(context, imageIndex));
- imageDesc.initState = InitState::Initialized;
- anyDirty = true;
- }
- }
- if (anyDirty)
- {
- signalDirty(InitState::Initialized);
- }
- mState.mInitState = InitState::Initialized;
-
- return NoError();
-}
-
-InitState Texture::initState(const ImageIndex &imageIndex) const
-{
- return mState.getImageDesc(imageIndex).initState;
-}
-
-InitState Texture::initState() const
-{
- return mState.mInitState;
-}
-
-void Texture::setInitState(const ImageIndex &imageIndex, InitState initState)
-{
- ImageDesc newDesc = mState.getImageDesc(imageIndex);
- newDesc.initState = initState;
- mState.setImageDesc(imageIndex.type, imageIndex.mipIndex, newDesc);
-}
-
-Error Texture::ensureSubImageInitialized(const Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area)
-{
- if (!context->isRobustResourceInitEnabled() || mState.mInitState == InitState::Initialized)
- {
- return NoError();
- }
-
- // Pre-initialize the texture contents if necessary.
- // TODO(jmadill): Check if area overlaps the entire texture.
- const auto &imageIndex = GetImageIndexFromDescIndex(target, level);
- const auto &desc = mState.getImageDesc(imageIndex);
- if (desc.initState == InitState::MayNeedInit)
- {
- ASSERT(mState.mInitState == InitState::MayNeedInit);
- bool coversWholeImage = area.x == 0 && area.y == 0 && area.z == 0 &&
- area.width == desc.size.width && area.height == desc.size.height &&
- area.depth == desc.size.depth;
- if (!coversWholeImage)
- {
- ANGLE_TRY(initializeContents(context, imageIndex));
- }
- setInitState(imageIndex, InitState::Initialized);
- }
-
- return NoError();
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/Texture.h b/src/3rdparty/angle/src/libANGLE/Texture.h
deleted file mode 100644
index 7525da2b2f..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Texture.h
+++ /dev/null
@@ -1,471 +0,0 @@
-//
-// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Texture.h: Defines the gl::Texture class [OpenGL ES 2.0.24] section 3.7 page 63.
-
-#ifndef LIBANGLE_TEXTURE_H_
-#define LIBANGLE_TEXTURE_H_
-
-#include <vector>
-#include <map>
-
-#include "angle_gl.h"
-#include "common/Optional.h"
-#include "common/debug.h"
-#include "libANGLE/Caps.h"
-#include "libANGLE/Constants.h"
-#include "libANGLE/Debug.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/Image.h"
-#include "libANGLE/Stream.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/formatutils.h"
-
-namespace egl
-{
-class Surface;
-class Stream;
-}
-
-namespace rx
-{
-class GLImplFactory;
-class TextureImpl;
-class TextureGL;
-}
-
-namespace gl
-{
-class ContextState;
-class Framebuffer;
-class Sampler;
-class Texture;
-
-bool IsMipmapFiltered(const SamplerState &samplerState);
-
-struct ImageDesc final
-{
- ImageDesc();
- ImageDesc(const Extents &size, const Format &format, const InitState initState);
- ImageDesc(const Extents &size,
- const Format &format,
- const GLsizei samples,
- const bool fixedSampleLocations,
- const InitState initState);
-
- ImageDesc(const ImageDesc &other) = default;
- ImageDesc &operator=(const ImageDesc &other) = default;
-
- Extents size;
- Format format;
- GLsizei samples;
- bool fixedSampleLocations;
-
- // Needed for robust resource initialization.
- InitState initState;
-};
-
-struct SwizzleState final
-{
- SwizzleState();
- SwizzleState(GLenum red, GLenum green, GLenum blue, GLenum alpha);
- SwizzleState(const SwizzleState &other) = default;
- SwizzleState &operator=(const SwizzleState &other) = default;
-
- bool swizzleRequired() const;
-
- bool operator==(const SwizzleState &other) const;
- bool operator!=(const SwizzleState &other) const;
-
- GLenum swizzleRed;
- GLenum swizzleGreen;
- GLenum swizzleBlue;
- GLenum swizzleAlpha;
-};
-
-// State from Table 6.9 (state per texture object) in the OpenGL ES 3.0.2 spec.
-struct TextureState final : private angle::NonCopyable
-{
- TextureState(GLenum target);
- ~TextureState();
-
- bool swizzleRequired() const;
- GLuint getEffectiveBaseLevel() const;
- GLuint getEffectiveMaxLevel() const;
-
- // Returns the value called "q" in the GLES 3.0.4 spec section 3.8.10.
- GLuint getMipmapMaxLevel() const;
-
- // Returns true if base level changed.
- bool setBaseLevel(GLuint baseLevel);
- bool setMaxLevel(GLuint maxLevel);
-
- bool isCubeComplete() const;
-
- const ImageDesc &getImageDesc(GLenum target, size_t level) const;
- const ImageDesc &getImageDesc(const ImageIndex &imageIndex) const;
-
- GLenum getTarget() const { return mTarget; }
- const SwizzleState &getSwizzleState() const { return mSwizzleState; }
- const SamplerState &getSamplerState() const { return mSamplerState; }
- GLenum getUsage() const { return mUsage; }
-
- private:
- // Texture needs access to the ImageDesc functions.
- friend class Texture;
- // TODO(jmadill): Remove TextureGL from friends.
- friend class rx::TextureGL;
- friend bool operator==(const TextureState &a, const TextureState &b);
-
- bool computeSamplerCompleteness(const SamplerState &samplerState,
- const ContextState &data) const;
- bool computeMipmapCompleteness() const;
- bool computeLevelCompleteness(GLenum target, size_t level) const;
-
- GLenum getBaseImageTarget() const;
-
- void setImageDesc(GLenum target, size_t level, const ImageDesc &desc);
- void setImageDescChain(GLuint baselevel,
- GLuint maxLevel,
- Extents baseSize,
- const Format &format,
- InitState initState);
- void setImageDescChainMultisample(Extents baseSize,
- const Format &format,
- GLsizei samples,
- bool fixedSampleLocations,
- InitState initState);
-
- void clearImageDesc(GLenum target, size_t level);
- void clearImageDescs();
-
- const GLenum mTarget;
-
- SwizzleState mSwizzleState;
-
- SamplerState mSamplerState;
-
- GLuint mBaseLevel;
- GLuint mMaxLevel;
-
- GLenum mDepthStencilTextureMode;
-
- bool mImmutableFormat;
- GLuint mImmutableLevels;
-
- // From GL_ANGLE_texture_usage
- GLenum mUsage;
-
- std::vector<ImageDesc> mImageDescs;
- InitState mInitState;
-};
-
-bool operator==(const TextureState &a, const TextureState &b);
-bool operator!=(const TextureState &a, const TextureState &b);
-
-class Texture final : public egl::ImageSibling,
- public LabeledObject
-{
- public:
- Texture(rx::GLImplFactory *factory, GLuint id, GLenum target);
- ~Texture() override;
-
- Error onDestroy(const Context *context) override;
-
- void setLabel(const std::string &label) override;
- const std::string &getLabel() const override;
-
- GLenum getTarget() const;
-
- void setSwizzleRed(GLenum swizzleRed);
- GLenum getSwizzleRed() const;
-
- void setSwizzleGreen(GLenum swizzleGreen);
- GLenum getSwizzleGreen() const;
-
- void setSwizzleBlue(GLenum swizzleBlue);
- GLenum getSwizzleBlue() const;
-
- void setSwizzleAlpha(GLenum swizzleAlpha);
- GLenum getSwizzleAlpha() const;
-
- void setMinFilter(GLenum minFilter);
- GLenum getMinFilter() const;
-
- void setMagFilter(GLenum magFilter);
- GLenum getMagFilter() const;
-
- void setWrapS(GLenum wrapS);
- GLenum getWrapS() const;
-
- void setWrapT(GLenum wrapT);
- GLenum getWrapT() const;
-
- void setWrapR(GLenum wrapR);
- GLenum getWrapR() const;
-
- void setMaxAnisotropy(float maxAnisotropy);
- float getMaxAnisotropy() const;
-
- void setMinLod(GLfloat minLod);
- GLfloat getMinLod() const;
-
- void setMaxLod(GLfloat maxLod);
- GLfloat getMaxLod() const;
-
- void setCompareMode(GLenum compareMode);
- GLenum getCompareMode() const;
-
- void setCompareFunc(GLenum compareFunc);
- GLenum getCompareFunc() const;
-
- void setSRGBDecode(GLenum sRGBDecode);
- GLenum getSRGBDecode() const;
-
- const SamplerState &getSamplerState() const;
-
- gl::Error setBaseLevel(const Context *context, GLuint baseLevel);
- GLuint getBaseLevel() const;
-
- void setMaxLevel(GLuint maxLevel);
- GLuint getMaxLevel() const;
-
- void setDepthStencilTextureMode(GLenum mode);
- GLenum getDepthStencilTextureMode() const;
-
- bool getImmutableFormat() const;
-
- GLuint getImmutableLevels() const;
-
- void setUsage(GLenum usage);
- GLenum getUsage() const;
-
- const TextureState &getTextureState() const;
-
- size_t getWidth(GLenum target, size_t level) const;
- size_t getHeight(GLenum target, size_t level) const;
- size_t getDepth(GLenum target, size_t level) const;
- GLsizei getSamples(GLenum target, size_t level) const;
- bool getFixedSampleLocations(GLenum target, size_t level) const;
- const Format &getFormat(GLenum target, size_t level) const;
-
- // Returns the value called "q" in the GLES 3.0.4 spec section 3.8.10.
- GLuint getMipmapMaxLevel() const;
-
- bool isMipmapComplete() const;
-
- Error setImage(const Context *context,
- const PixelUnpackState &unpackState,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const Extents &size,
- GLenum format,
- GLenum type,
- const uint8_t *pixels);
- Error setSubImage(const Context *context,
- const PixelUnpackState &unpackState,
- GLenum target,
- size_t level,
- const Box &area,
- GLenum format,
- GLenum type,
- const uint8_t *pixels);
-
- Error setCompressedImage(const Context *context,
- const PixelUnpackState &unpackState,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const Extents &size,
- size_t imageSize,
- const uint8_t *pixels);
- Error setCompressedSubImage(const Context *context,
- const PixelUnpackState &unpackState,
- GLenum target,
- size_t level,
- const Box &area,
- GLenum format,
- size_t imageSize,
- const uint8_t *pixels);
-
- Error copyImage(const Context *context,
- GLenum target,
- size_t level,
- const Rectangle &sourceArea,
- GLenum internalFormat,
- Framebuffer *source);
- Error copySubImage(const Context *context,
- GLenum target,
- size_t level,
- const Offset &destOffset,
- const Rectangle &sourceArea,
- Framebuffer *source);
-
- Error copyTexture(const Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- GLenum type,
- size_t sourceLevel,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- Texture *source);
- Error copySubTexture(const Context *context,
- GLenum target,
- size_t level,
- const Offset &destOffset,
- size_t sourceLevel,
- const Rectangle &sourceArea,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- Texture *source);
- Error copyCompressedTexture(const Context *context, const Texture *source);
-
- Error setStorage(const Context *context,
- GLenum target,
- GLsizei levels,
- GLenum internalFormat,
- const Extents &size);
-
- Error setStorageMultisample(const Context *context,
- GLenum target,
- GLsizei samples,
- GLint internalformat,
- const Extents &size,
- bool fixedSampleLocations);
-
- Error setEGLImageTarget(const Context *context, GLenum target, egl::Image *imageTarget);
-
- Error generateMipmap(const Context *context);
-
- egl::Surface *getBoundSurface() const;
- egl::Stream *getBoundStream() const;
-
- void signalDirty(InitState initState) const;
-
- bool isSamplerComplete(const Context *context, const Sampler *optionalSampler);
-
- rx::TextureImpl *getImplementation() const { return mTexture; }
-
- // FramebufferAttachmentObject implementation
- Extents getAttachmentSize(const ImageIndex &imageIndex) const override;
- const Format &getAttachmentFormat(GLenum binding, const ImageIndex &imageIndex) const override;
- GLsizei getAttachmentSamples(const ImageIndex &imageIndex) const override;
-
- void onAttach(const Context *context) override;
- void onDetach(const Context *context) override;
- GLuint getId() const override;
-
- // Needed for robust resource init.
- Error ensureInitialized(const Context *context);
- InitState initState(const ImageIndex &imageIndex) const override;
- InitState initState() const;
- void setInitState(const ImageIndex &imageIndex, InitState initState) override;
-
- enum DirtyBitType
- {
- // Sampler state
- DIRTY_BIT_MIN_FILTER,
- DIRTY_BIT_MAG_FILTER,
- DIRTY_BIT_WRAP_S,
- DIRTY_BIT_WRAP_T,
- DIRTY_BIT_WRAP_R,
- DIRTY_BIT_MAX_ANISOTROPY,
- DIRTY_BIT_MIN_LOD,
- DIRTY_BIT_MAX_LOD,
- DIRTY_BIT_COMPARE_MODE,
- DIRTY_BIT_COMPARE_FUNC,
- DIRTY_BIT_SRGB_DECODE,
-
- // Texture state
- DIRTY_BIT_SWIZZLE_RED,
- DIRTY_BIT_SWIZZLE_GREEN,
- DIRTY_BIT_SWIZZLE_BLUE,
- DIRTY_BIT_SWIZZLE_ALPHA,
- DIRTY_BIT_BASE_LEVEL,
- DIRTY_BIT_MAX_LEVEL,
-
- // Misc
- DIRTY_BIT_LABEL,
- DIRTY_BIT_USAGE,
-
- DIRTY_BIT_COUNT,
- };
- using DirtyBits = angle::BitSet<DIRTY_BIT_COUNT>;
-
- void syncState();
- bool hasAnyDirtyBit() const { return mDirtyBits.any(); }
-
- private:
- rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override;
-
- // ANGLE-only method, used internally
- friend class egl::Surface;
- Error bindTexImageFromSurface(const Context *context, egl::Surface *surface);
- Error releaseTexImageFromSurface(const Context *context);
-
- // ANGLE-only methods, used internally
- friend class egl::Stream;
- void bindStream(egl::Stream *stream);
- void releaseStream();
- Error acquireImageFromStream(const Context *context,
- const egl::Stream::GLTextureDescription &desc);
- Error releaseImageFromStream(const Context *context);
-
- void invalidateCompletenessCache() const;
- Error releaseTexImageInternal(const Context *context);
-
- Error ensureSubImageInitialized(const Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area);
-
- TextureState mState;
- DirtyBits mDirtyBits;
- rx::TextureImpl *mTexture;
-
- std::string mLabel;
-
- egl::Surface *mBoundSurface;
- egl::Stream *mBoundStream;
-
- struct SamplerCompletenessCache
- {
- SamplerCompletenessCache();
-
- // Context used to generate this cache entry
- ContextID context;
-
- // All values that affect sampler completeness that are not stored within
- // the texture itself
- SamplerState samplerState;
-
- // Result of the sampler completeness with the above parameters
- bool samplerComplete;
- };
-
- mutable SamplerCompletenessCache mCompletenessCache;
-};
-
-inline bool operator==(const TextureState &a, const TextureState &b)
-{
- return a.mSwizzleState == b.mSwizzleState && a.mSamplerState == b.mSamplerState &&
- a.mBaseLevel == b.mBaseLevel && a.mMaxLevel == b.mMaxLevel &&
- a.mImmutableFormat == b.mImmutableFormat && a.mImmutableLevels == b.mImmutableLevels &&
- a.mUsage == b.mUsage;
-}
-
-inline bool operator!=(const TextureState &a, const TextureState &b)
-{
- return !(a == b);
-}
-} // namespace gl
-
-#endif // LIBANGLE_TEXTURE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Thread.cpp b/src/3rdparty/angle/src/libANGLE/Thread.cpp
deleted file mode 100644
index d346db1fa2..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Thread.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-//
-// Copyright(c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Thread.cpp : Defines the Thread class which represents a global EGL thread.
-
-#include "libANGLE/Thread.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Error.h"
-
-namespace egl
-{
-Thread::Thread()
- : mError(EGL_SUCCESS),
- mAPI(EGL_OPENGL_ES_API),
- mContext(static_cast<gl::Context *>(EGL_NO_CONTEXT))
-{
-}
-
-void Thread::setError(const Error &error)
-{
- mError = error.getCode();
-}
-
-EGLint Thread::getError() const
-{
- return mError;
-}
-
-void Thread::setAPI(EGLenum api)
-{
- mAPI = api;
-}
-
-EGLenum Thread::getAPI() const
-{
- return mAPI;
-}
-
-void Thread::setCurrent(gl::Context *context)
-{
- mContext = context;
-}
-
-Surface *Thread::getCurrentDrawSurface() const
-{
- if (mContext)
- {
- return mContext->getCurrentDrawSurface();
- }
- return nullptr;
-}
-
-Surface *Thread::getCurrentReadSurface() const
-{
- if (mContext)
- {
- return mContext->getCurrentReadSurface();
- }
- return nullptr;
-}
-
-gl::Context *Thread::getContext() const
-{
- return mContext;
-}
-
-gl::Context *Thread::getValidContext() const
-{
- if (mContext && mContext->isContextLost())
- {
- mContext->handleError(gl::OutOfMemory() << "Context has been lost.");
- return nullptr;
- }
-
- return mContext;
-}
-
-Display *Thread::getCurrentDisplay() const
-{
- if (mContext)
- {
- return mContext->getCurrentDisplay();
- }
- return nullptr;
-}
-
-} // namespace egl
diff --git a/src/3rdparty/angle/src/libANGLE/Thread.h b/src/3rdparty/angle/src/libANGLE/Thread.h
deleted file mode 100644
index 6406dad9e0..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Thread.h
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-// Copyright(c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Thread.h : Defines the Thread class which represents a global EGL thread.
-
-#ifndef LIBANGLE_THREAD_H_
-#define LIBANGLE_THREAD_H_
-
-#include <EGL/egl.h>
-
-namespace gl
-{
-class Context;
-} // namespace gl
-
-namespace egl
-{
-class Error;
-class Display;
-class Surface;
-
-class Thread
-{
- public:
- Thread();
-
- void setError(const Error &error);
- EGLint getError() const;
-
- void setAPI(EGLenum api);
- EGLenum getAPI() const;
-
- void setCurrent(gl::Context *context);
- Surface *getCurrentDrawSurface() const;
- Surface *getCurrentReadSurface() const;
- gl::Context *getContext() const;
- gl::Context *getValidContext() const;
- Display *getCurrentDisplay() const;
-
- private:
- EGLint mError;
- EGLenum mAPI;
- gl::Context *mContext;
-};
-
-} // namespace egl
-
-#endif // LIBANGLE_THREAD_H_
diff --git a/src/3rdparty/angle/src/libANGLE/TransformFeedback.cpp b/src/3rdparty/angle/src/libANGLE/TransformFeedback.cpp
deleted file mode 100644
index 99235debd4..0000000000
--- a/src/3rdparty/angle/src/libANGLE/TransformFeedback.cpp
+++ /dev/null
@@ -1,221 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-#include "libANGLE/TransformFeedback.h"
-
-#include "libANGLE/Buffer.h"
-#include "libANGLE/Caps.h"
-#include "libANGLE/ContextState.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/renderer/GLImplFactory.h"
-#include "libANGLE/renderer/TransformFeedbackImpl.h"
-
-namespace gl
-{
-
-TransformFeedbackState::TransformFeedbackState(size_t maxIndexedBuffers)
- : mLabel(),
- mActive(false),
- mPrimitiveMode(GL_NONE),
- mPaused(false),
- mProgram(nullptr),
- mGenericBuffer(),
- mIndexedBuffers(maxIndexedBuffers)
-{
-}
-
-TransformFeedbackState::~TransformFeedbackState()
-{
-}
-
-const BindingPointer<Buffer> &TransformFeedbackState::getGenericBuffer() const
-{
- return mGenericBuffer;
-}
-
-const OffsetBindingPointer<Buffer> &TransformFeedbackState::getIndexedBuffer(size_t idx) const
-{
- return mIndexedBuffers[idx];
-}
-
-const std::vector<OffsetBindingPointer<Buffer>> &TransformFeedbackState::getIndexedBuffers() const
-{
- return mIndexedBuffers;
-}
-
-TransformFeedback::TransformFeedback(rx::GLImplFactory *implFactory, GLuint id, const Caps &caps)
- : RefCountObject(id),
- mState(caps.maxTransformFeedbackSeparateAttributes),
- mImplementation(implFactory->createTransformFeedback(mState))
-{
- ASSERT(mImplementation != nullptr);
-}
-
-Error TransformFeedback::onDestroy(const Context *context)
-{
- if (mState.mProgram)
- {
- mState.mProgram->release(context);
- mState.mProgram = nullptr;
- }
-
- ASSERT(!mState.mProgram);
- mState.mGenericBuffer.set(context, nullptr);
- for (size_t i = 0; i < mState.mIndexedBuffers.size(); i++)
- {
- mState.mIndexedBuffers[i].set(context, nullptr);
- }
-
- return NoError();
-}
-
-TransformFeedback::~TransformFeedback()
-{
- SafeDelete(mImplementation);
-}
-
-void TransformFeedback::setLabel(const std::string &label)
-{
- mState.mLabel = label;
-}
-
-const std::string &TransformFeedback::getLabel() const
-{
- return mState.mLabel;
-}
-
-void TransformFeedback::begin(const Context *context, GLenum primitiveMode, Program *program)
-{
- mState.mActive = true;
- mState.mPrimitiveMode = primitiveMode;
- mState.mPaused = false;
- mImplementation->begin(primitiveMode);
- bindProgram(context, program);
-}
-
-void TransformFeedback::end(const Context *context)
-{
- mState.mActive = false;
- mState.mPrimitiveMode = GL_NONE;
- mState.mPaused = false;
- mImplementation->end();
- if (mState.mProgram)
- {
- mState.mProgram->release(context);
- mState.mProgram = nullptr;
- }
-}
-
-void TransformFeedback::pause()
-{
- mState.mPaused = true;
- mImplementation->pause();
-}
-
-void TransformFeedback::resume()
-{
- mState.mPaused = false;
- mImplementation->resume();
-}
-
-bool TransformFeedback::isActive() const
-{
- return mState.mActive;
-}
-
-bool TransformFeedback::isPaused() const
-{
- return mState.mPaused;
-}
-
-GLenum TransformFeedback::getPrimitiveMode() const
-{
- return mState.mPrimitiveMode;
-}
-
-void TransformFeedback::bindProgram(const Context *context, Program *program)
-{
- if (mState.mProgram != program)
- {
- if (mState.mProgram != nullptr)
- {
- mState.mProgram->release(context);
- }
- mState.mProgram = program;
- if (mState.mProgram != nullptr)
- {
- mState.mProgram->addRef();
- }
- }
-}
-
-bool TransformFeedback::hasBoundProgram(GLuint program) const
-{
- return mState.mProgram != nullptr && mState.mProgram->id() == program;
-}
-
-void TransformFeedback::bindGenericBuffer(const Context *context, Buffer *buffer)
-{
- mState.mGenericBuffer.set(context, buffer);
- mImplementation->bindGenericBuffer(mState.mGenericBuffer);
-}
-
-void TransformFeedback::detachBuffer(const Context *context, GLuint bufferName)
-{
- for (size_t index = 0; index < mState.mIndexedBuffers.size(); index++)
- {
- if (mState.mIndexedBuffers[index].id() == bufferName)
- {
- mState.mIndexedBuffers[index].set(context, nullptr);
- mImplementation->bindIndexedBuffer(index, mState.mIndexedBuffers[index]);
- }
- }
-
- if (mState.mGenericBuffer.id() == bufferName)
- {
- mState.mGenericBuffer.set(context, nullptr);
- mImplementation->bindGenericBuffer(mState.mGenericBuffer);
- }
-}
-
-const BindingPointer<Buffer> &TransformFeedback::getGenericBuffer() const
-{
- return mState.mGenericBuffer;
-}
-
-void TransformFeedback::bindIndexedBuffer(const Context *context,
- size_t index,
- Buffer *buffer,
- size_t offset,
- size_t size)
-{
- ASSERT(index < mState.mIndexedBuffers.size());
- mState.mIndexedBuffers[index].set(context, buffer, offset, size);
- mImplementation->bindIndexedBuffer(index, mState.mIndexedBuffers[index]);
-}
-
-const OffsetBindingPointer<Buffer> &TransformFeedback::getIndexedBuffer(size_t index) const
-{
- ASSERT(index < mState.mIndexedBuffers.size());
- return mState.mIndexedBuffers[index];
-}
-
-size_t TransformFeedback::getIndexedBufferCount() const
-{
- return mState.mIndexedBuffers.size();
-}
-
-rx::TransformFeedbackImpl *TransformFeedback::getImplementation()
-{
- return mImplementation;
-}
-
-const rx::TransformFeedbackImpl *TransformFeedback::getImplementation() const
-{
- return mImplementation;
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/TransformFeedback.h b/src/3rdparty/angle/src/libANGLE/TransformFeedback.h
deleted file mode 100644
index 2b35d43f9a..0000000000
--- a/src/3rdparty/angle/src/libANGLE/TransformFeedback.h
+++ /dev/null
@@ -1,101 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-#ifndef LIBANGLE_TRANSFORM_FEEDBACK_H_
-#define LIBANGLE_TRANSFORM_FEEDBACK_H_
-
-#include "libANGLE/RefCountObject.h"
-
-#include "common/angleutils.h"
-#include "libANGLE/Debug.h"
-
-#include "angle_gl.h"
-
-namespace rx
-{
-class GLImplFactory;
-class TransformFeedbackImpl;
-}
-
-namespace gl
-{
-class Buffer;
-struct Caps;
-class Context;
-class Program;
-
-class TransformFeedbackState final : angle::NonCopyable
-{
- public:
- TransformFeedbackState(size_t maxIndexedBuffers);
- ~TransformFeedbackState();
-
- const BindingPointer<Buffer> &getGenericBuffer() const;
- const OffsetBindingPointer<Buffer> &getIndexedBuffer(size_t idx) const;
- const std::vector<OffsetBindingPointer<Buffer>> &getIndexedBuffers() const;
-
- private:
- friend class TransformFeedback;
-
- std::string mLabel;
-
- bool mActive;
- GLenum mPrimitiveMode;
- bool mPaused;
-
- Program *mProgram;
-
- BindingPointer<Buffer> mGenericBuffer;
- std::vector<OffsetBindingPointer<Buffer>> mIndexedBuffers;
-};
-
-class TransformFeedback final : public RefCountObject, public LabeledObject
-{
- public:
- TransformFeedback(rx::GLImplFactory *implFactory, GLuint id, const Caps &caps);
- ~TransformFeedback() override;
- Error onDestroy(const Context *context) override;
-
- void setLabel(const std::string &label) override;
- const std::string &getLabel() const override;
-
- void begin(const Context *context, GLenum primitiveMode, Program *program);
- void end(const Context *context);
- void pause();
- void resume();
-
- bool isActive() const;
- bool isPaused() const;
- GLenum getPrimitiveMode() const;
-
- bool hasBoundProgram(GLuint program) const;
-
- void bindGenericBuffer(const Context *context, Buffer *buffer);
- const BindingPointer<Buffer> &getGenericBuffer() const;
-
- void bindIndexedBuffer(const Context *context,
- size_t index,
- Buffer *buffer,
- size_t offset,
- size_t size);
- const OffsetBindingPointer<Buffer> &getIndexedBuffer(size_t index) const;
- size_t getIndexedBufferCount() const;
-
- void detachBuffer(const Context *context, GLuint bufferName);
-
- rx::TransformFeedbackImpl *getImplementation();
- const rx::TransformFeedbackImpl *getImplementation() const;
-
- private:
- void bindProgram(const Context *context, Program *program);
-
- TransformFeedbackState mState;
- rx::TransformFeedbackImpl* mImplementation;
-};
-
-}
-
-#endif // LIBANGLE_TRANSFORM_FEEDBACK_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Uniform.cpp b/src/3rdparty/angle/src/libANGLE/Uniform.cpp
deleted file mode 100644
index dee8eee915..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Uniform.cpp
+++ /dev/null
@@ -1,226 +0,0 @@
-//
-// Copyright (c) 2010-2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-#include "libANGLE/Uniform.h"
-
-#include "common/utilities.h"
-
-#include <cstring>
-
-namespace gl
-{
-
-StaticallyUsed::StaticallyUsed()
- : vertexStaticUse(false), fragmentStaticUse(false), computeStaticUse(false)
-{
-}
-
-StaticallyUsed::~StaticallyUsed()
-{
-}
-
-StaticallyUsed::StaticallyUsed(const StaticallyUsed &rhs) = default;
-StaticallyUsed &StaticallyUsed::operator=(const StaticallyUsed &rhs) = default;
-
-void StaticallyUsed::setStaticUse(GLenum shaderType, bool used)
-{
- switch (shaderType)
- {
- case GL_VERTEX_SHADER:
- vertexStaticUse = used;
- break;
-
- case GL_FRAGMENT_SHADER:
- fragmentStaticUse = used;
- break;
-
- case GL_COMPUTE_SHADER:
- computeStaticUse = used;
- break;
-
- default:
- UNREACHABLE();
- }
-}
-
-void StaticallyUsed::unionReferencesWith(const StaticallyUsed &other)
-{
- vertexStaticUse |= other.vertexStaticUse;
- fragmentStaticUse |= other.fragmentStaticUse;
- computeStaticUse |= other.computeStaticUse;
-}
-
-LinkedUniform::LinkedUniform()
- : typeInfo(nullptr), bufferIndex(-1), blockInfo(sh::BlockMemberInfo::getDefaultBlockInfo())
-{
-}
-
-LinkedUniform::LinkedUniform(GLenum typeIn,
- GLenum precisionIn,
- const std::string &nameIn,
- const std::vector<unsigned int> &arraySizesIn,
- const int bindingIn,
- const int offsetIn,
- const int locationIn,
- const int bufferIndexIn,
- const sh::BlockMemberInfo &blockInfoIn)
- : typeInfo(&GetUniformTypeInfo(typeIn)), bufferIndex(bufferIndexIn), blockInfo(blockInfoIn)
-{
- type = typeIn;
- precision = precisionIn;
- name = nameIn;
- arraySizes = arraySizesIn;
- binding = bindingIn;
- offset = offsetIn;
- location = locationIn;
- ASSERT(!isArrayOfArrays());
- ASSERT(!isArray() || !isStruct());
-}
-
-LinkedUniform::LinkedUniform(const sh::Uniform &uniform)
- : sh::Uniform(uniform),
- typeInfo(&GetUniformTypeInfo(type)),
- bufferIndex(-1),
- blockInfo(sh::BlockMemberInfo::getDefaultBlockInfo())
-{
- ASSERT(!isArrayOfArrays());
- ASSERT(!isArray() || !isStruct());
-}
-
-LinkedUniform::LinkedUniform(const LinkedUniform &uniform)
- : sh::Uniform(uniform),
- StaticallyUsed(uniform),
- typeInfo(uniform.typeInfo),
- bufferIndex(uniform.bufferIndex),
- blockInfo(uniform.blockInfo)
-{
-}
-
-LinkedUniform &LinkedUniform::operator=(const LinkedUniform &uniform)
-{
- sh::Uniform::operator=(uniform);
- StaticallyUsed::operator=(uniform);
- typeInfo = uniform.typeInfo;
- bufferIndex = uniform.bufferIndex;
- blockInfo = uniform.blockInfo;
- return *this;
-}
-
-LinkedUniform::~LinkedUniform()
-{
-}
-
-bool LinkedUniform::isInDefaultBlock() const
-{
- return bufferIndex == -1;
-}
-
-bool LinkedUniform::isSampler() const
-{
- return typeInfo->isSampler;
-}
-
-bool LinkedUniform::isImage() const
-{
- return typeInfo->isImageType;
-}
-
-bool LinkedUniform::isAtomicCounter() const
-{
- return IsAtomicCounterType(type);
-}
-
-bool LinkedUniform::isField() const
-{
- return name.find('.') != std::string::npos;
-}
-
-size_t LinkedUniform::getElementSize() const
-{
- return typeInfo->externalSize;
-}
-
-size_t LinkedUniform::getElementComponents() const
-{
- return typeInfo->componentCount;
-}
-
-BufferVariable::BufferVariable()
- : bufferIndex(-1), blockInfo(sh::BlockMemberInfo::getDefaultBlockInfo()), topLevelArraySize(-1)
-{
-}
-
-BufferVariable::BufferVariable(GLenum typeIn,
- GLenum precisionIn,
- const std::string &nameIn,
- const std::vector<unsigned int> &arraySizesIn,
- const int bufferIndexIn,
- const sh::BlockMemberInfo &blockInfoIn)
- : bufferIndex(bufferIndexIn), blockInfo(blockInfoIn), topLevelArraySize(-1)
-{
- type = typeIn;
- precision = precisionIn;
- name = nameIn;
- arraySizes = arraySizesIn;
-}
-
-BufferVariable::~BufferVariable()
-{
-}
-
-ShaderVariableBuffer::ShaderVariableBuffer() : binding(0), dataSize(0)
-{
-}
-
-ShaderVariableBuffer::ShaderVariableBuffer(const ShaderVariableBuffer &other) = default;
-
-ShaderVariableBuffer::~ShaderVariableBuffer()
-{
-}
-
-int ShaderVariableBuffer::numActiveVariables() const
-{
- return static_cast<int>(memberIndexes.size());
-}
-
-InterfaceBlock::InterfaceBlock() : isArray(false), arrayElement(0)
-{
-}
-
-InterfaceBlock::InterfaceBlock(const std::string &nameIn,
- const std::string &mappedNameIn,
- bool isArrayIn,
- unsigned int arrayElementIn,
- int bindingIn)
- : name(nameIn), mappedName(mappedNameIn), isArray(isArrayIn), arrayElement(arrayElementIn)
-{
- binding = bindingIn;
-}
-
-std::string InterfaceBlock::nameWithArrayIndex() const
-{
- std::stringstream fullNameStr;
- fullNameStr << name;
- if (isArray)
- {
- fullNameStr << "[" << arrayElement << "]";
- }
-
- return fullNameStr.str();
-}
-
-std::string InterfaceBlock::mappedNameWithArrayIndex() const
-{
- std::stringstream fullNameStr;
- fullNameStr << mappedName;
- if (isArray)
- {
- fullNameStr << "[" << arrayElement << "]";
- }
-
- return fullNameStr.str();
-}
-}
diff --git a/src/3rdparty/angle/src/libANGLE/Uniform.h b/src/3rdparty/angle/src/libANGLE/Uniform.h
deleted file mode 100644
index 14c39387a6..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Uniform.h
+++ /dev/null
@@ -1,126 +0,0 @@
-//
-// Copyright (c) 2010-2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-#ifndef LIBANGLE_UNIFORM_H_
-#define LIBANGLE_UNIFORM_H_
-
-#include <string>
-#include <vector>
-
-#include "angle_gl.h"
-#include "common/debug.h"
-#include "common/MemoryBuffer.h"
-#include "compiler/translator/blocklayout.h"
-#include "libANGLE/angletypes.h"
-
-namespace gl
-{
-struct UniformTypeInfo;
-
-struct StaticallyUsed
-{
- StaticallyUsed();
- StaticallyUsed(const StaticallyUsed &rhs);
- virtual ~StaticallyUsed();
-
- StaticallyUsed &operator=(const StaticallyUsed &rhs);
-
- void setStaticUse(GLenum shaderType, bool used);
- void unionReferencesWith(const StaticallyUsed &other);
-
- bool vertexStaticUse;
- bool fragmentStaticUse;
- bool computeStaticUse;
-};
-
-// Helper struct representing a single shader uniform
-struct LinkedUniform : public sh::Uniform, public StaticallyUsed
-{
- LinkedUniform();
- LinkedUniform(GLenum type,
- GLenum precision,
- const std::string &name,
- const std::vector<unsigned int> &arraySizes,
- const int binding,
- const int offset,
- const int location,
- const int bufferIndex,
- const sh::BlockMemberInfo &blockInfo);
- LinkedUniform(const sh::Uniform &uniform);
- LinkedUniform(const LinkedUniform &uniform);
- LinkedUniform &operator=(const LinkedUniform &uniform);
- ~LinkedUniform() override;
-
- bool isSampler() const;
- bool isImage() const;
- bool isAtomicCounter() const;
- bool isInDefaultBlock() const;
- bool isField() const;
- size_t getElementSize() const;
- size_t getElementComponents() const;
-
- const UniformTypeInfo *typeInfo;
-
- // Identifies the containing buffer backed resource -- interface block or atomic counter buffer.
- int bufferIndex;
- sh::BlockMemberInfo blockInfo;
-};
-
-struct BufferVariable : public sh::ShaderVariable, public StaticallyUsed
-{
- BufferVariable();
- BufferVariable(GLenum type,
- GLenum precision,
- const std::string &name,
- const std::vector<unsigned int> &arraySizes,
- const int bufferIndex,
- const sh::BlockMemberInfo &blockInfo);
- ~BufferVariable() override;
-
- int bufferIndex;
- sh::BlockMemberInfo blockInfo;
-
- int topLevelArraySize;
-};
-
-// Parent struct for atomic counter, uniform block, and shader storage block buffer, which all
-// contain a group of shader variables, and have a GL buffer backed.
-struct ShaderVariableBuffer : public StaticallyUsed
-{
- ShaderVariableBuffer();
- ShaderVariableBuffer(const ShaderVariableBuffer &other);
- ~ShaderVariableBuffer() override;
- int numActiveVariables() const;
-
- int binding;
- unsigned int dataSize;
- std::vector<unsigned int> memberIndexes;
-};
-
-using AtomicCounterBuffer = ShaderVariableBuffer;
-
-// Helper struct representing a single shader interface block
-struct InterfaceBlock : public ShaderVariableBuffer
-{
- InterfaceBlock();
- InterfaceBlock(const std::string &nameIn,
- const std::string &mappedNameIn,
- bool isArrayIn,
- unsigned int arrayElementIn,
- int bindingIn);
-
- std::string nameWithArrayIndex() const;
- std::string mappedNameWithArrayIndex() const;
-
- std::string name;
- std::string mappedName;
- bool isArray;
- unsigned int arrayElement;
-};
-
-}
-
-#endif // LIBANGLE_UNIFORM_H_
diff --git a/src/3rdparty/angle/src/libANGLE/VaryingPacking.cpp b/src/3rdparty/angle/src/libANGLE/VaryingPacking.cpp
deleted file mode 100644
index 6fc707b549..0000000000
--- a/src/3rdparty/angle/src/libANGLE/VaryingPacking.cpp
+++ /dev/null
@@ -1,408 +0,0 @@
-//
-// Copyright 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// VaryingPacking:
-// Class which describes a mapping from varyings to registers, according
-// to the spec, or using custom packing algorithms. We also keep a register
-// allocation list for the D3D renderer.
-//
-
-#include "libANGLE/VaryingPacking.h"
-
-#include "common/utilities.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/Shader.h"
-
-namespace gl
-{
-
-namespace
-{
-
-// true if varying x has a higher priority in packing than y
-bool ComparePackedVarying(const PackedVarying &x, const PackedVarying &y)
-{
- // If the PackedVarying 'x' or 'y' to be compared is an array element, this clones an equivalent
- // non-array shader variable 'vx' or 'vy' for actual comparison instead.
- sh::ShaderVariable vx, vy;
- const sh::ShaderVariable *px, *py;
- if (x.isArrayElement())
- {
- vx = *x.varying;
- vx.arraySizes.clear();
- px = &vx;
- }
- else
- {
- px = x.varying;
- }
-
- if (y.isArrayElement())
- {
- vy = *y.varying;
- vy.arraySizes.clear();
- py = &vy;
- }
- else
- {
- py = y.varying;
- }
-
- return gl::CompareShaderVar(*px, *py);
-}
-
-} // anonymous namespace
-
-// Implementation of VaryingPacking
-VaryingPacking::VaryingPacking(GLuint maxVaryingVectors, PackMode packMode)
- : mRegisterMap(maxVaryingVectors), mPackMode(packMode)
-{
-}
-
-VaryingPacking::~VaryingPacking() = default;
-
-// Packs varyings into generic varying registers, using the algorithm from
-// See [OpenGL ES Shading Language 1.00 rev. 17] appendix A section 7 page 111
-// Also [OpenGL ES Shading Language 3.00 rev. 4] Section 11 page 119
-// Returns false if unsuccessful.
-bool VaryingPacking::packVarying(const PackedVarying &packedVarying)
-{
- const auto &varying = *packedVarying.varying;
-
- // "Non - square matrices of type matCxR consume the same space as a square matrix of type matN
- // where N is the greater of C and R."
- // Here we are a bit more conservative and allow packing non-square matrices more tightly.
- // Make sure we use transposed matrix types to count registers correctly.
- ASSERT(!varying.isStruct());
- GLenum transposedType = gl::TransposeMatrixType(varying.type);
- unsigned int varyingRows = gl::VariableRowCount(transposedType);
- unsigned int varyingColumns = gl::VariableColumnCount(transposedType);
-
- // "Variables of type mat2 occupies 2 complete rows."
- // For non-WebGL contexts, we allow mat2 to occupy only two columns per row.
- if (mPackMode == PackMode::WEBGL_STRICT && varying.type == GL_FLOAT_MAT2)
- {
- varyingColumns = 4;
- }
-
- // "Arrays of size N are assumed to take N times the size of the base type"
- // GLSL ES 3.10 section 4.3.6: Output variables cannot be arrays of arrays or arrays of
- // structures, so we may use getBasicTypeElementCount().
- const unsigned int elementCount = varying.getBasicTypeElementCount();
- varyingRows *= (packedVarying.isArrayElement() ? 1 : elementCount);
-
- unsigned int maxVaryingVectors = static_cast<unsigned int>(mRegisterMap.size());
-
- // Fail if we are packing a single over-large varying.
- if (varyingRows > maxVaryingVectors)
- {
- return false;
- }
-
- // "For 2, 3 and 4 component variables packing is started using the 1st column of the 1st row.
- // Variables are then allocated to successive rows, aligning them to the 1st column."
- if (varyingColumns >= 2 && varyingColumns <= 4)
- {
- for (unsigned int row = 0; row <= maxVaryingVectors - varyingRows; ++row)
- {
- if (isFree(row, 0, varyingRows, varyingColumns))
- {
- insert(row, 0, packedVarying);
- return true;
- }
- }
-
- // "For 2 component variables, when there are no spare rows, the strategy is switched to
- // using the highest numbered row and the lowest numbered column where the variable will
- // fit."
- if (varyingColumns == 2)
- {
- for (unsigned int r = maxVaryingVectors - varyingRows + 1; r-- >= 1;)
- {
- if (isFree(r, 2, varyingRows, 2))
- {
- insert(r, 2, packedVarying);
- return true;
- }
- }
- }
-
- return false;
- }
-
- // "1 component variables have their own packing rule. They are packed in order of size, largest
- // first. Each variable is placed in the column that leaves the least amount of space in the
- // column and aligned to the lowest available rows within that column."
- ASSERT(varyingColumns == 1);
- unsigned int contiguousSpace[4] = {0};
- unsigned int bestContiguousSpace[4] = {0};
- unsigned int totalSpace[4] = {0};
-
- for (unsigned int row = 0; row < maxVaryingVectors; ++row)
- {
- for (unsigned int column = 0; column < 4; ++column)
- {
- if (mRegisterMap[row][column])
- {
- contiguousSpace[column] = 0;
- }
- else
- {
- contiguousSpace[column]++;
- totalSpace[column]++;
-
- if (contiguousSpace[column] > bestContiguousSpace[column])
- {
- bestContiguousSpace[column] = contiguousSpace[column];
- }
- }
- }
- }
-
- unsigned int bestColumn = 0;
- for (unsigned int column = 1; column < 4; ++column)
- {
- if (bestContiguousSpace[column] >= varyingRows &&
- (bestContiguousSpace[bestColumn] < varyingRows ||
- totalSpace[column] < totalSpace[bestColumn]))
- {
- bestColumn = column;
- }
- }
-
- if (bestContiguousSpace[bestColumn] >= varyingRows)
- {
- for (unsigned int row = 0; row < maxVaryingVectors; row++)
- {
- if (isFree(row, bestColumn, varyingRows, 1))
- {
- for (unsigned int arrayIndex = 0; arrayIndex < varyingRows; ++arrayIndex)
- {
- // If varyingRows > 1, it must be an array.
- PackedVaryingRegister registerInfo;
- registerInfo.packedVarying = &packedVarying;
- registerInfo.registerRow = row + arrayIndex;
- registerInfo.registerColumn = bestColumn;
- registerInfo.varyingArrayIndex =
- (packedVarying.isArrayElement() ? packedVarying.arrayIndex : arrayIndex);
- registerInfo.varyingRowIndex = 0;
- // Do not record register info for builtins.
- // TODO(jmadill): Clean this up.
- if (!packedVarying.varying->isBuiltIn())
- {
- mRegisterList.push_back(registerInfo);
- }
- mRegisterMap[row + arrayIndex][bestColumn] = true;
- }
- break;
- }
- }
- return true;
- }
-
- return false;
-}
-
-bool VaryingPacking::isFree(unsigned int registerRow,
- unsigned int registerColumn,
- unsigned int varyingRows,
- unsigned int varyingColumns) const
-{
- for (unsigned int row = 0; row < varyingRows; ++row)
- {
- ASSERT(registerRow + row < mRegisterMap.size());
- for (unsigned int column = 0; column < varyingColumns; ++column)
- {
- ASSERT(registerColumn + column < 4);
- if (mRegisterMap[registerRow + row][registerColumn + column])
- {
- return false;
- }
- }
- }
-
- return true;
-}
-
-void VaryingPacking::insert(unsigned int registerRow,
- unsigned int registerColumn,
- const PackedVarying &packedVarying)
-{
- unsigned int varyingRows = 0;
- unsigned int varyingColumns = 0;
-
- const auto &varying = *packedVarying.varying;
- ASSERT(!varying.isStruct());
- GLenum transposedType = gl::TransposeMatrixType(varying.type);
- varyingRows = gl::VariableRowCount(transposedType);
- varyingColumns = gl::VariableColumnCount(transposedType);
-
- PackedVaryingRegister registerInfo;
- registerInfo.packedVarying = &packedVarying;
- registerInfo.registerColumn = registerColumn;
-
- // GLSL ES 3.10 section 4.3.6: Output variables cannot be arrays of arrays or arrays of
- // structures, so we may use getBasicTypeElementCount().
- const unsigned int arrayElementCount = varying.getBasicTypeElementCount();
- for (unsigned int arrayElement = 0; arrayElement < arrayElementCount; ++arrayElement)
- {
- if (packedVarying.isArrayElement() && arrayElement != packedVarying.arrayIndex)
- {
- continue;
- }
- for (unsigned int varyingRow = 0; varyingRow < varyingRows; ++varyingRow)
- {
- registerInfo.registerRow = registerRow + (arrayElement * varyingRows) + varyingRow;
- registerInfo.varyingRowIndex = varyingRow;
- registerInfo.varyingArrayIndex = arrayElement;
- // Do not record register info for builtins.
- // TODO(jmadill): Clean this up.
- if (!packedVarying.varying->isBuiltIn())
- {
- mRegisterList.push_back(registerInfo);
- }
-
- for (unsigned int columnIndex = 0; columnIndex < varyingColumns; ++columnIndex)
- {
- mRegisterMap[registerInfo.registerRow][registerColumn + columnIndex] = true;
- }
- }
- }
-}
-
-bool VaryingPacking::collectAndPackUserVaryings(gl::InfoLog &infoLog,
- const Program::MergedVaryings &mergedVaryings,
- const std::vector<std::string> &tfVaryings)
-{
- std::set<std::string> uniqueFullNames;
- mPackedVaryings.clear();
-
- for (const auto &ref : mergedVaryings)
- {
- const sh::Varying *input = ref.second.vertex;
- const sh::Varying *output = ref.second.fragment;
-
- // Only pack statically used varyings that have a matched input or output, plus special
- // builtins.
- if (((input && output) || (output && output->isBuiltIn())) && output->staticUse)
- {
- // Will get the vertex shader interpolation by default.
- auto interpolation = ref.second.get()->interpolation;
-
- // Note that we lose the vertex shader static use information here. The data for the
- // variable is taken from the fragment shader.
- if (output->isStruct())
- {
- ASSERT(!output->isArray());
- for (const auto &field : output->fields)
- {
- ASSERT(!field.isStruct() && !field.isArray());
- mPackedVaryings.push_back(PackedVarying(field, interpolation, output->name));
- uniqueFullNames.insert(mPackedVaryings.back().nameWithArrayIndex());
- }
- }
- else
- {
- mPackedVaryings.push_back(PackedVarying(*output, interpolation));
- uniqueFullNames.insert(mPackedVaryings.back().nameWithArrayIndex());
- }
- continue;
- }
-
- // Keep Transform FB varyings in the merged list always.
- if (!input)
- {
- continue;
- }
-
- for (const std::string &tfVarying : tfVaryings)
- {
- std::vector<unsigned int> subscripts;
- std::string baseName = ParseResourceName(tfVarying, &subscripts);
- size_t subscript = GL_INVALID_INDEX;
- if (!subscripts.empty())
- {
- subscript = subscripts.back();
- }
- // Already packed for fragment shader.
- if (uniqueFullNames.count(tfVarying) > 0 || uniqueFullNames.count(baseName) > 0)
- {
- continue;
- }
- // Array as a whole and array element conflict has already been checked in
- // linkValidateTransformFeedback.
- if (baseName == input->name)
- {
- // Transform feedback for varying structs is underspecified.
- // See Khronos bug 9856.
- // TODO(jmadill): Figure out how to be spec-compliant here.
- if (!input->isStruct() && tfVarying.compare(0, 3, "gl_") != 0)
- {
- mPackedVaryings.push_back(PackedVarying(*input, input->interpolation));
- mPackedVaryings.back().vertexOnly = true;
- mPackedVaryings.back().arrayIndex = static_cast<GLuint>(subscript);
- uniqueFullNames.insert(tfVarying);
- }
- // Continue to match next array element for 'input' if the current match is array
- // element.
- if (subscript == GL_INVALID_INDEX)
- {
- break;
- }
- }
- }
- }
-
- std::sort(mPackedVaryings.begin(), mPackedVaryings.end(), ComparePackedVarying);
-
- return packUserVaryings(infoLog, mPackedVaryings, tfVaryings);
-}
-
-// See comment on packVarying.
-bool VaryingPacking::packUserVaryings(gl::InfoLog &infoLog,
- const std::vector<PackedVarying> &packedVaryings,
- const std::vector<std::string> &transformFeedbackVaryings)
-{
-
- // "Variables are packed into the registers one at a time so that they each occupy a contiguous
- // subrectangle. No splitting of variables is permitted."
- for (const PackedVarying &packedVarying : packedVaryings)
- {
- if (!packVarying(packedVarying))
- {
- infoLog << "Could not pack varying " << packedVarying.nameWithArrayIndex();
- return false;
- }
- }
-
- // Sort the packed register list
- std::sort(mRegisterList.begin(), mRegisterList.end());
-
- // Assign semantic indices
- for (unsigned int semanticIndex = 0;
- semanticIndex < static_cast<unsigned int>(mRegisterList.size()); ++semanticIndex)
- {
- mRegisterList[semanticIndex].semanticIndex = semanticIndex;
- }
-
- return true;
-}
-
-unsigned int VaryingPacking::getRegisterCount() const
-{
- unsigned int count = 0;
-
- for (const Register &reg : mRegisterMap)
- {
- if (reg.data[0] || reg.data[1] || reg.data[2] || reg.data[3])
- {
- ++count;
- }
- }
-
- return count;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/VaryingPacking.h b/src/3rdparty/angle/src/libANGLE/VaryingPacking.h
deleted file mode 100644
index 14b25f929e..0000000000
--- a/src/3rdparty/angle/src/libANGLE/VaryingPacking.h
+++ /dev/null
@@ -1,184 +0,0 @@
-//
-// Copyright 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// VaryingPacking:
-// Class which describes a mapping from varyings to registers, according
-// to the spec, or using custom packing algorithms. We also keep a register
-// allocation list for the D3D renderer.
-//
-
-#ifndef LIBANGLE_VARYINGPACKING_H_
-#define LIBANGLE_VARYINGPACKING_H_
-
-#include <GLSLANG/ShaderVars.h>
-
-#include "angle_gl.h"
-#include "common/angleutils.h"
-#include "libANGLE/Program.h"
-
-namespace gl
-{
-class InfoLog;
-
-struct PackedVarying
-{
- PackedVarying(const sh::ShaderVariable &varyingIn, sh::InterpolationType interpolationIn)
- : PackedVarying(varyingIn, interpolationIn, "")
- {
- }
- PackedVarying(const sh::ShaderVariable &varyingIn,
- sh::InterpolationType interpolationIn,
- const std::string &parentStructNameIn)
- : varying(&varyingIn),
- vertexOnly(false),
- interpolation(interpolationIn),
- parentStructName(parentStructNameIn),
- arrayIndex(GL_INVALID_INDEX)
- {
- }
-
- bool isStructField() const { return !parentStructName.empty(); }
-
- bool isArrayElement() const { return arrayIndex != GL_INVALID_INDEX; }
-
- std::string nameWithArrayIndex() const
- {
- std::stringstream fullNameStr;
- fullNameStr << varying->name;
- if (arrayIndex != GL_INVALID_INDEX)
- {
- fullNameStr << "[" << arrayIndex << "]";
- }
- return fullNameStr.str();
- }
-
- const sh::ShaderVariable *varying;
-
- // Transform feedback varyings can be only referenced in the VS.
- bool vertexOnly;
-
- // Cached so we can store sh::ShaderVariable to point to varying fields.
- sh::InterpolationType interpolation;
-
- // Struct name
- std::string parentStructName;
-
- GLuint arrayIndex;
-};
-
-struct PackedVaryingRegister final
-{
- PackedVaryingRegister()
- : packedVarying(nullptr),
- varyingArrayIndex(0),
- varyingRowIndex(0),
- registerRow(0),
- registerColumn(0)
- {
- }
-
- PackedVaryingRegister(const PackedVaryingRegister &) = default;
- PackedVaryingRegister &operator=(const PackedVaryingRegister &) = default;
-
- bool operator<(const PackedVaryingRegister &other) const
- {
- return sortOrder() < other.sortOrder();
- }
-
- unsigned int sortOrder() const
- {
- // TODO(jmadill): Handle interpolation types
- return registerRow * 4 + registerColumn;
- }
-
- bool isStructField() const { return !structFieldName.empty(); }
-
- // Index to the array of varyings.
- const PackedVarying *packedVarying;
-
- // The array element of the packed varying.
- unsigned int varyingArrayIndex;
-
- // The row of the array element of the packed varying.
- unsigned int varyingRowIndex;
-
- // The register row to which we've assigned this packed varying.
- unsigned int registerRow;
-
- // The column of the register row into which we've packed this varying.
- unsigned int registerColumn;
-
- // Assigned after packing
- unsigned int semanticIndex;
-
- // Struct member this varying corresponds to.
- std::string structFieldName;
-};
-
-// Supported packing modes:
-enum class PackMode
-{
- // We treat mat2 arrays as taking two full rows.
- WEBGL_STRICT,
-
- // We allow mat2 to take a 2x2 chunk.
- ANGLE_RELAXED,
-};
-
-class VaryingPacking final : angle::NonCopyable
-{
- public:
- VaryingPacking(GLuint maxVaryingVectors, PackMode packMode);
- ~VaryingPacking();
-
- bool packUserVaryings(gl::InfoLog &infoLog,
- const std::vector<PackedVarying> &packedVaryings,
- const std::vector<std::string> &tfVaryings);
-
- bool collectAndPackUserVaryings(gl::InfoLog &infoLog,
- const Program::MergedVaryings &mergedVaryings,
- const std::vector<std::string> &tfVaryings);
-
- struct Register
- {
- Register() { data[0] = data[1] = data[2] = data[3] = false; }
-
- bool &operator[](unsigned int index) { return data[index]; }
- bool operator[](unsigned int index) const { return data[index]; }
-
- bool data[4];
- };
-
- Register &operator[](unsigned int index) { return mRegisterMap[index]; }
- const Register &operator[](unsigned int index) const { return mRegisterMap[index]; }
-
- const std::vector<PackedVaryingRegister> &getRegisterList() const { return mRegisterList; }
- unsigned int getMaxSemanticIndex() const
- {
- return static_cast<unsigned int>(mRegisterList.size());
- }
- unsigned int getRegisterCount() const;
- size_t getRegisterMapSize() const { return mRegisterMap.size(); }
-
- private:
- bool packVarying(const PackedVarying &packedVarying);
- bool isFree(unsigned int registerRow,
- unsigned int registerColumn,
- unsigned int varyingRows,
- unsigned int varyingColumns) const;
- void insert(unsigned int registerRow,
- unsigned int registerColumn,
- const PackedVarying &packedVarying);
-
- std::vector<Register> mRegisterMap;
- std::vector<PackedVaryingRegister> mRegisterList;
- std::vector<PackedVarying> mPackedVaryings;
-
- PackMode mPackMode;
-};
-
-} // namespace gl
-
-#endif // LIBANGLE_VARYINGPACKING_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Version.h b/src/3rdparty/angle/src/libANGLE/Version.h
deleted file mode 100644
index 7bd41846c8..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Version.h
+++ /dev/null
@@ -1,34 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Version.h: Encapsulation of a GL version.
-
-#ifndef LIBANGLE_VERSION_H_
-#define LIBANGLE_VERSION_H_
-
-namespace gl
-{
-
-struct Version
-{
- constexpr Version();
- constexpr Version(unsigned int major, unsigned int minor);
-
- unsigned int major;
- unsigned int minor;
-};
-
-bool operator==(const Version &a, const Version &b);
-bool operator!=(const Version &a, const Version &b);
-bool operator>=(const Version &a, const Version &b);
-bool operator<=(const Version &a, const Version &b);
-bool operator<(const Version &a, const Version &b);
-bool operator>(const Version &a, const Version &b);
-}
-
-#include "Version.inl"
-
-#endif // LIBANGLE_VERSION_H_
diff --git a/src/3rdparty/angle/src/libANGLE/Version.inl b/src/3rdparty/angle/src/libANGLE/Version.inl
deleted file mode 100644
index c98054829e..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Version.inl
+++ /dev/null
@@ -1,59 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Version.inl: Encapsulation of a GL version.
-
-#include <tuple>
-
-namespace gl
-{
-
-constexpr Version::Version()
- : Version(0, 0)
-{
-}
-
-// Avoid conflicts with linux system defines
-#undef major
-#undef minor
-
-constexpr Version::Version(unsigned int major_, unsigned int minor_)
- : major(major_),
- minor(minor_)
-{
-}
-
-inline bool operator==(const Version &a, const Version &b)
-{
- return std::tie(a.major, a.minor) == std::tie(b.major, b.minor);
-}
-
-inline bool operator!=(const Version &a, const Version &b)
-{
- return std::tie(a.major, a.minor) != std::tie(b.major, b.minor);
-}
-
-inline bool operator>=(const Version &a, const Version &b)
-{
- return std::tie(a.major, a.minor) >= std::tie(b.major, b.minor);
-}
-
-inline bool operator<=(const Version &a, const Version &b)
-{
- return std::tie(a.major, a.minor) <= std::tie(b.major, b.minor);
-}
-
-inline bool operator<(const Version &a, const Version &b)
-{
- return std::tie(a.major, a.minor) < std::tie(b.major, b.minor);
-}
-
-inline bool operator>(const Version &a, const Version &b)
-{
- return std::tie(a.major, a.minor) > std::tie(b.major, b.minor);
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/VertexArray.cpp b/src/3rdparty/angle/src/libANGLE/VertexArray.cpp
deleted file mode 100644
index a8c2fce155..0000000000
--- a/src/3rdparty/angle/src/libANGLE/VertexArray.cpp
+++ /dev/null
@@ -1,267 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Implementation of the state class for mananging GLES 3 Vertex Array Objects.
-//
-
-#include "libANGLE/VertexArray.h"
-#include "libANGLE/Buffer.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/renderer/GLImplFactory.h"
-#include "libANGLE/renderer/VertexArrayImpl.h"
-
-namespace gl
-{
-
-VertexArrayState::VertexArrayState(size_t maxAttribs, size_t maxAttribBindings)
- : mLabel(), mVertexBindings(maxAttribBindings), mMaxEnabledAttribute(0)
-{
- ASSERT(maxAttribs <= maxAttribBindings);
-
- for (size_t i = 0; i < maxAttribs; i++)
- {
- mVertexAttributes.emplace_back(static_cast<GLuint>(i));
- }
-}
-
-VertexArrayState::~VertexArrayState()
-{
-}
-
-VertexArray::VertexArray(rx::GLImplFactory *factory,
- GLuint id,
- size_t maxAttribs,
- size_t maxAttribBindings)
- : mId(id),
- mState(maxAttribs, maxAttribBindings),
- mVertexArray(factory->createVertexArray(mState))
-{
-}
-
-void VertexArray::onDestroy(const Context *context)
-{
- for (auto &binding : mState.mVertexBindings)
- {
- binding.setBuffer(context, nullptr);
- }
- mState.mElementArrayBuffer.set(context, nullptr);
- mVertexArray->destroy(context);
- SafeDelete(mVertexArray);
- delete this;
-}
-
-VertexArray::~VertexArray()
-{
- ASSERT(!mVertexArray);
-}
-
-GLuint VertexArray::id() const
-{
- return mId;
-}
-
-void VertexArray::setLabel(const std::string &label)
-{
- mState.mLabel = label;
-}
-
-const std::string &VertexArray::getLabel() const
-{
- return mState.mLabel;
-}
-
-void VertexArray::detachBuffer(const Context *context, GLuint bufferName)
-{
- for (auto &binding : mState.mVertexBindings)
- {
- if (binding.getBuffer().id() == bufferName)
- {
- binding.setBuffer(context, nullptr);
- }
- }
-
- if (mState.mElementArrayBuffer.id() == bufferName)
- {
- mState.mElementArrayBuffer.set(context, nullptr);
- }
-}
-
-const VertexAttribute &VertexArray::getVertexAttribute(size_t attribIndex) const
-{
- ASSERT(attribIndex < getMaxAttribs());
- return mState.mVertexAttributes[attribIndex];
-}
-
-const VertexBinding &VertexArray::getVertexBinding(size_t bindingIndex) const
-{
- ASSERT(bindingIndex < getMaxBindings());
- return mState.mVertexBindings[bindingIndex];
-}
-
-size_t VertexArray::GetVertexIndexFromDirtyBit(size_t dirtyBit)
-{
- static_assert(gl::MAX_VERTEX_ATTRIBS == gl::MAX_VERTEX_ATTRIB_BINDINGS,
- "The stride of vertex attributes should equal to that of vertex bindings.");
- ASSERT(dirtyBit > DIRTY_BIT_ELEMENT_ARRAY_BUFFER);
- return (dirtyBit - DIRTY_BIT_ATTRIB_0_ENABLED) % gl::MAX_VERTEX_ATTRIBS;
-}
-
-void VertexArray::bindVertexBufferImpl(const Context *context,
- size_t bindingIndex,
- Buffer *boundBuffer,
- GLintptr offset,
- GLsizei stride)
-{
- ASSERT(bindingIndex < getMaxBindings());
-
- VertexBinding *binding = &mState.mVertexBindings[bindingIndex];
-
- binding->setBuffer(context, boundBuffer);
- binding->setOffset(offset);
- binding->setStride(stride);
-}
-
-void VertexArray::bindVertexBuffer(const Context *context,
- size_t bindingIndex,
- Buffer *boundBuffer,
- GLintptr offset,
- GLsizei stride)
-{
- bindVertexBufferImpl(context, bindingIndex, boundBuffer, offset, stride);
-
- mDirtyBits.set(DIRTY_BIT_BINDING_0_BUFFER + bindingIndex);
-}
-
-void VertexArray::setVertexAttribBinding(const Context *context,
- size_t attribIndex,
- GLuint bindingIndex)
-{
- ASSERT(attribIndex < getMaxAttribs() && bindingIndex < getMaxBindings());
-
- if (mState.mVertexAttributes[attribIndex].bindingIndex != bindingIndex)
- {
- // In ES 3.0 contexts, the binding cannot change, hence the code below is unreachable.
- ASSERT(context->getClientVersion() >= ES_3_1);
- mState.mVertexAttributes[attribIndex].bindingIndex = bindingIndex;
-
- mDirtyBits.set(DIRTY_BIT_ATTRIB_0_BINDING + attribIndex);
- }
-}
-
-void VertexArray::setVertexBindingDivisor(size_t bindingIndex, GLuint divisor)
-{
- ASSERT(bindingIndex < getMaxBindings());
-
- mState.mVertexBindings[bindingIndex].setDivisor(divisor);
-
- mDirtyBits.set(DIRTY_BIT_BINDING_0_DIVISOR + bindingIndex);
-}
-
-void VertexArray::setVertexAttribFormatImpl(size_t attribIndex,
- GLint size,
- GLenum type,
- bool normalized,
- bool pureInteger,
- GLuint relativeOffset)
-{
- ASSERT(attribIndex < getMaxAttribs());
-
- VertexAttribute *attrib = &mState.mVertexAttributes[attribIndex];
-
- attrib->size = size;
- attrib->type = type;
- attrib->normalized = normalized;
- attrib->pureInteger = pureInteger;
- attrib->relativeOffset = relativeOffset;
-}
-
-void VertexArray::setVertexAttribFormat(size_t attribIndex,
- GLint size,
- GLenum type,
- bool normalized,
- bool pureInteger,
- GLuint relativeOffset)
-{
- setVertexAttribFormatImpl(attribIndex, size, type, normalized, pureInteger, relativeOffset);
-
- mDirtyBits.set(DIRTY_BIT_ATTRIB_0_FORMAT + attribIndex);
-}
-
-void VertexArray::setVertexAttribDivisor(const Context *context, size_t attribIndex, GLuint divisor)
-{
- ASSERT(attribIndex < getMaxAttribs());
-
- setVertexAttribBinding(context, attribIndex, static_cast<GLuint>(attribIndex));
- setVertexBindingDivisor(attribIndex, divisor);
-}
-
-void VertexArray::enableAttribute(size_t attribIndex, bool enabledState)
-{
- ASSERT(attribIndex < getMaxAttribs());
-
- mState.mVertexAttributes[attribIndex].enabled = enabledState;
-
- mDirtyBits.set(DIRTY_BIT_ATTRIB_0_ENABLED + attribIndex);
-
- // Update state cache
- if (enabledState)
- {
- mState.mMaxEnabledAttribute = std::max(attribIndex + 1, mState.mMaxEnabledAttribute);
- }
- else if (mState.mMaxEnabledAttribute == attribIndex + 1)
- {
- while (mState.mMaxEnabledAttribute > 0 &&
- !mState.mVertexAttributes[mState.mMaxEnabledAttribute - 1].enabled)
- {
- --mState.mMaxEnabledAttribute;
- }
- }
-}
-
-void VertexArray::setVertexAttribPointer(const Context *context,
- size_t attribIndex,
- gl::Buffer *boundBuffer,
- GLint size,
- GLenum type,
- bool normalized,
- bool pureInteger,
- GLsizei stride,
- const void *pointer)
-{
- ASSERT(attribIndex < getMaxAttribs());
-
- GLintptr offset = boundBuffer ? reinterpret_cast<GLintptr>(pointer) : 0;
-
- setVertexAttribFormatImpl(attribIndex, size, type, normalized, pureInteger, 0);
- setVertexAttribBinding(context, attribIndex, static_cast<GLuint>(attribIndex));
-
- VertexAttribute &attrib = mState.mVertexAttributes[attribIndex];
-
- GLsizei effectiveStride =
- stride != 0 ? stride : static_cast<GLsizei>(ComputeVertexAttributeTypeSize(attrib));
- attrib.pointer = pointer;
- attrib.vertexAttribArrayStride = stride;
-
- bindVertexBufferImpl(context, attribIndex, boundBuffer, offset, effectiveStride);
-
- mDirtyBits.set(DIRTY_BIT_ATTRIB_0_POINTER + attribIndex);
-}
-
-void VertexArray::setElementArrayBuffer(const Context *context, Buffer *buffer)
-{
- mState.mElementArrayBuffer.set(context, buffer);
- mDirtyBits.set(DIRTY_BIT_ELEMENT_ARRAY_BUFFER);
-}
-
-void VertexArray::syncState(const Context *context)
-{
- if (mDirtyBits.any())
- {
- mVertexArray->syncState(context, mDirtyBits);
- mDirtyBits.reset();
- }
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/VertexArray.h b/src/3rdparty/angle/src/libANGLE/VertexArray.h
deleted file mode 100644
index f82ec789f0..0000000000
--- a/src/3rdparty/angle/src/libANGLE/VertexArray.h
+++ /dev/null
@@ -1,205 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// This class contains prototypes for representing GLES 3 Vertex Array Objects:
-//
-// The buffer objects that are to be used by the vertex stage of the GL are collected
-// together to form a vertex array object. All state related to the definition of data used
-// by the vertex processor is encapsulated in a vertex array object.
-//
-
-#ifndef LIBANGLE_VERTEXARRAY_H_
-#define LIBANGLE_VERTEXARRAY_H_
-
-#include "libANGLE/RefCountObject.h"
-#include "libANGLE/Constants.h"
-#include "libANGLE/Debug.h"
-#include "libANGLE/State.h"
-#include "libANGLE/VertexAttribute.h"
-
-#include <vector>
-
-namespace rx
-{
-class GLImplFactory;
-class VertexArrayImpl;
-} // namespace rx
-
-namespace gl
-{
-class Buffer;
-
-class VertexArrayState final : angle::NonCopyable
-{
- public:
- VertexArrayState(size_t maxAttribs, size_t maxBindings);
- ~VertexArrayState();
-
- const std::string &getLabel() const { return mLabel; }
-
- const BindingPointer<Buffer> &getElementArrayBuffer() const { return mElementArrayBuffer; }
- size_t getMaxAttribs() const { return mVertexAttributes.size(); }
- size_t getMaxBindings() const { return mVertexBindings.size(); }
- size_t getMaxEnabledAttribute() const { return mMaxEnabledAttribute; }
- const std::vector<VertexAttribute> &getVertexAttributes() const { return mVertexAttributes; }
- const VertexAttribute &getVertexAttribute(size_t attribIndex) const
- {
- return mVertexAttributes[attribIndex];
- }
- const std::vector<VertexBinding> &getVertexBindings() const { return mVertexBindings; }
- const VertexBinding &getVertexBinding(size_t bindingIndex) const
- {
- return mVertexBindings[bindingIndex];
- }
- const VertexBinding &getBindingFromAttribIndex(size_t attribIndex) const
- {
- return mVertexBindings[mVertexAttributes[attribIndex].bindingIndex];
- }
- size_t getBindingIndexFromAttribIndex(size_t attribIndex) const
- {
- return mVertexAttributes[attribIndex].bindingIndex;
- }
-
- private:
- friend class VertexArray;
- std::string mLabel;
- std::vector<VertexAttribute> mVertexAttributes;
- BindingPointer<Buffer> mElementArrayBuffer;
- std::vector<VertexBinding> mVertexBindings;
- size_t mMaxEnabledAttribute;
-};
-
-class VertexArray final : public LabeledObject
-{
- public:
- VertexArray(rx::GLImplFactory *factory, GLuint id, size_t maxAttribs, size_t maxAttribBindings);
-
- void onDestroy(const Context *context);
-
- GLuint id() const;
-
- void setLabel(const std::string &label) override;
- const std::string &getLabel() const override;
-
- const VertexBinding &getVertexBinding(size_t bindingIndex) const;
- const VertexAttribute &getVertexAttribute(size_t attribIndex) const;
- const VertexBinding &getBindingFromAttribIndex(size_t attribIndex) const
- {
- return mState.getBindingFromAttribIndex(attribIndex);
- }
-
- void detachBuffer(const Context *context, GLuint bufferName);
- void setVertexAttribDivisor(const Context *context, size_t index, GLuint divisor);
- void enableAttribute(size_t attribIndex, bool enabledState);
- void setVertexAttribPointer(const Context *context,
- size_t attribIndex,
- Buffer *boundBuffer,
- GLint size,
- GLenum type,
- bool normalized,
- bool pureInteger,
- GLsizei stride,
- const void *pointer);
- void setVertexAttribFormat(size_t attribIndex,
- GLint size,
- GLenum type,
- bool normalized,
- bool pureInteger,
- GLuint relativeOffset);
- void bindVertexBuffer(const Context *context,
- size_t bindingIndex,
- Buffer *boundBuffer,
- GLintptr offset,
- GLsizei stride);
- void setVertexAttribBinding(const Context *context, size_t attribIndex, GLuint bindingIndex);
- void setVertexBindingDivisor(size_t bindingIndex, GLuint divisor);
- void setVertexAttribFormatImpl(size_t attribIndex,
- GLint size,
- GLenum type,
- bool normalized,
- bool pureInteger,
- GLuint relativeOffset);
- void bindVertexBufferImpl(const Context *context,
- size_t bindingIndex,
- Buffer *boundBuffer,
- GLintptr offset,
- GLsizei stride);
-
- void setElementArrayBuffer(const Context *context, Buffer *buffer);
-
- const BindingPointer<Buffer> &getElementArrayBuffer() const
- {
- return mState.getElementArrayBuffer();
- }
- size_t getMaxAttribs() const { return mState.getMaxAttribs(); }
- size_t getMaxBindings() const { return mState.getMaxBindings(); }
-
- const std::vector<VertexAttribute> &getVertexAttributes() const
- {
- return mState.getVertexAttributes();
- }
- const std::vector<VertexBinding> &getVertexBindings() const
- {
- return mState.getVertexBindings();
- }
-
- rx::VertexArrayImpl *getImplementation() const { return mVertexArray; }
-
- size_t getMaxEnabledAttribute() const { return mState.getMaxEnabledAttribute(); }
-
- enum DirtyBitType
- {
- DIRTY_BIT_ELEMENT_ARRAY_BUFFER,
-
- // Reserve bits for enabled flags
- DIRTY_BIT_ATTRIB_0_ENABLED,
- DIRTY_BIT_ATTRIB_MAX_ENABLED = DIRTY_BIT_ATTRIB_0_ENABLED + gl::MAX_VERTEX_ATTRIBS,
-
- // Reserve bits for attrib pointers
- DIRTY_BIT_ATTRIB_0_POINTER = DIRTY_BIT_ATTRIB_MAX_ENABLED,
- DIRTY_BIT_ATTRIB_MAX_POINTER = DIRTY_BIT_ATTRIB_0_POINTER + gl::MAX_VERTEX_ATTRIBS,
-
- // Reserve bits for changes to VertexAttribFormat
- DIRTY_BIT_ATTRIB_0_FORMAT = DIRTY_BIT_ATTRIB_MAX_POINTER,
- DIRTY_BIT_ATTRIB_MAX_FORMAT = DIRTY_BIT_ATTRIB_0_FORMAT + gl::MAX_VERTEX_ATTRIBS,
-
- // Reserve bits for changes to VertexAttribBinding
- DIRTY_BIT_ATTRIB_0_BINDING = DIRTY_BIT_ATTRIB_MAX_FORMAT,
- DIRTY_BIT_ATTRIB_MAX_BINDING = DIRTY_BIT_ATTRIB_0_BINDING + gl::MAX_VERTEX_ATTRIBS,
-
- // Reserve bits for changes to BindVertexBuffer
- DIRTY_BIT_BINDING_0_BUFFER = DIRTY_BIT_ATTRIB_MAX_BINDING,
- DIRTY_BIT_BINDING_MAX_BUFFER = DIRTY_BIT_BINDING_0_BUFFER + gl::MAX_VERTEX_ATTRIB_BINDINGS,
-
- // Reserve bits for binding divisors
- DIRTY_BIT_BINDING_0_DIVISOR = DIRTY_BIT_BINDING_MAX_BUFFER,
- DIRTY_BIT_BINDING_MAX_DIVISOR =
- DIRTY_BIT_BINDING_0_DIVISOR + gl::MAX_VERTEX_ATTRIB_BINDINGS,
-
- DIRTY_BIT_UNKNOWN = DIRTY_BIT_BINDING_MAX_DIVISOR,
- DIRTY_BIT_MAX = DIRTY_BIT_UNKNOWN,
- };
-
- using DirtyBits = angle::BitSet<DIRTY_BIT_MAX>;
-
- static size_t GetVertexIndexFromDirtyBit(size_t dirtyBit);
-
- void syncState(const Context *context);
- bool hasAnyDirtyBit() const { return mDirtyBits.any(); }
-
- private:
- ~VertexArray() override;
-
- GLuint mId;
-
- VertexArrayState mState;
- DirtyBits mDirtyBits;
-
- rx::VertexArrayImpl *mVertexArray;
-};
-
-} // namespace gl
-
-#endif // LIBANGLE_VERTEXARRAY_H_
diff --git a/src/3rdparty/angle/src/libANGLE/VertexAttribute.cpp b/src/3rdparty/angle/src/libANGLE/VertexAttribute.cpp
deleted file mode 100644
index 20f7452fa5..0000000000
--- a/src/3rdparty/angle/src/libANGLE/VertexAttribute.cpp
+++ /dev/null
@@ -1,162 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Implementation of the state classes for mananging GLES 3.1 Vertex Array Objects.
-//
-
-#include "libANGLE/VertexAttribute.h"
-
-namespace gl
-{
-
-// [OpenGL ES 3.1] (November 3, 2016) Section 20 Page 361
-// Table 20.2: Vertex Array Object State
-VertexBinding::VertexBinding() : mStride(16u), mDivisor(0), mOffset(0)
-{
-}
-
-VertexBinding::VertexBinding(VertexBinding &&binding)
-{
- *this = std::move(binding);
-}
-
-VertexBinding::~VertexBinding()
-{
-}
-
-VertexBinding &VertexBinding::operator=(VertexBinding &&binding)
-{
- if (this != &binding)
- {
- mStride = binding.mStride;
- mDivisor = binding.mDivisor;
- mOffset = binding.mOffset;
- std::swap(binding.mBuffer, mBuffer);
- }
- return *this;
-}
-
-VertexAttribute::VertexAttribute(GLuint bindingIndex)
- : enabled(false),
- type(GL_FLOAT),
- size(4u),
- normalized(false),
- pureInteger(false),
- pointer(nullptr),
- relativeOffset(0),
- vertexAttribArrayStride(0),
- bindingIndex(bindingIndex)
-{
-}
-
-VertexAttribute::VertexAttribute(VertexAttribute &&attrib)
- : enabled(attrib.enabled),
- type(attrib.type),
- size(attrib.size),
- normalized(attrib.normalized),
- pureInteger(attrib.pureInteger),
- pointer(attrib.pointer),
- relativeOffset(attrib.relativeOffset),
- vertexAttribArrayStride(attrib.vertexAttribArrayStride),
- bindingIndex(attrib.bindingIndex)
-{
-}
-
-VertexAttribute &VertexAttribute::operator=(VertexAttribute &&attrib)
-{
- if (this != &attrib)
- {
- enabled = attrib.enabled;
- type = attrib.type;
- size = attrib.size;
- normalized = attrib.normalized;
- pureInteger = attrib.pureInteger;
- pointer = attrib.pointer;
- relativeOffset = attrib.relativeOffset;
- vertexAttribArrayStride = attrib.vertexAttribArrayStride;
- bindingIndex = attrib.bindingIndex;
- }
- return *this;
-}
-
-size_t ComputeVertexAttributeTypeSize(const VertexAttribute& attrib)
-{
- GLuint size = attrib.size;
- switch (attrib.type)
- {
- case GL_BYTE: return size * sizeof(GLbyte);
- case GL_UNSIGNED_BYTE: return size * sizeof(GLubyte);
- case GL_SHORT: return size * sizeof(GLshort);
- case GL_UNSIGNED_SHORT: return size * sizeof(GLushort);
- case GL_INT: return size * sizeof(GLint);
- case GL_UNSIGNED_INT: return size * sizeof(GLuint);
- case GL_INT_2_10_10_10_REV: return 4;
- case GL_UNSIGNED_INT_2_10_10_10_REV: return 4;
- case GL_FIXED: return size * sizeof(GLfixed);
- case GL_HALF_FLOAT: return size * sizeof(GLhalf);
- case GL_FLOAT: return size * sizeof(GLfloat);
- default: UNREACHABLE(); return size * sizeof(GLfloat);
- }
-}
-
-size_t ComputeVertexAttributeStride(const VertexAttribute &attrib, const VertexBinding &binding)
-{
- // In ES 3.1, VertexAttribPointer will store the type size in the binding stride.
- // Hence, rendering always uses the binding's stride.
- return attrib.enabled ? binding.getStride() : 16u;
-}
-
-// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
-GLintptr ComputeVertexAttributeOffset(const VertexAttribute &attrib, const VertexBinding &binding)
-{
- return attrib.relativeOffset + binding.getOffset();
-}
-
-size_t ComputeVertexBindingElementCount(GLuint divisor, size_t drawCount, size_t instanceCount)
-{
- // For instanced rendering, we draw "instanceDrawCount" sets of "vertexDrawCount" vertices.
- //
- // A vertex attribute with a positive divisor loads one instanced vertex for every set of
- // non-instanced vertices, and the instanced vertex index advances once every "mDivisor"
- // instances.
- if (instanceCount > 0 && divisor > 0)
- {
- // When instanceDrawCount is not a multiple attrib.divisor, the division must round up.
- // For instance, with 5 non-instanced vertices and a divisor equal to 3, we need 2 instanced
- // vertices.
- return (instanceCount + divisor - 1u) / divisor;
- }
-
- return drawCount;
-}
-
-GLenum GetVertexAttributeBaseType(const VertexAttribute &attrib)
-{
- if (attrib.pureInteger)
- {
- switch (attrib.type)
- {
- case GL_BYTE:
- case GL_SHORT:
- case GL_INT:
- return GL_INT;
-
- case GL_UNSIGNED_BYTE:
- case GL_UNSIGNED_SHORT:
- case GL_UNSIGNED_INT:
- return GL_UNSIGNED_INT;
-
- default:
- UNREACHABLE();
- return GL_NONE;
- }
- }
- else
- {
- return GL_FLOAT;
- }
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/VertexAttribute.h b/src/3rdparty/angle/src/libANGLE/VertexAttribute.h
deleted file mode 100644
index c531bece7c..0000000000
--- a/src/3rdparty/angle/src/libANGLE/VertexAttribute.h
+++ /dev/null
@@ -1,107 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Helper structures about Generic Vertex Attribute.
-//
-
-#ifndef LIBANGLE_VERTEXATTRIBUTE_H_
-#define LIBANGLE_VERTEXATTRIBUTE_H_
-
-#include "libANGLE/Buffer.h"
-
-namespace gl
-{
-class VertexArray;
-
-//
-// Implementation of Generic Vertex Attribute Bindings for ES3.1. The members are intentionally made
-// private in order to hide implementation details.
-//
-class VertexBinding final : angle::NonCopyable
-{
- public:
- VertexBinding();
- VertexBinding(VertexBinding &&binding);
- ~VertexBinding();
- VertexBinding &operator=(VertexBinding &&binding);
-
- GLuint getStride() const { return mStride; }
- void setStride(GLuint strideIn) { mStride = strideIn; }
-
- GLuint getDivisor() const { return mDivisor; }
- void setDivisor(GLuint divisorIn) { mDivisor = divisorIn; }
-
- GLintptr getOffset() const { return mOffset; }
- void setOffset(GLintptr offsetIn) { mOffset = offsetIn; }
-
- const BindingPointer<Buffer> &getBuffer() const { return mBuffer; }
- void setBuffer(const gl::Context *context, Buffer *bufferIn) { mBuffer.set(context, bufferIn); }
-
- private:
- GLuint mStride;
- GLuint mDivisor;
- GLintptr mOffset;
-
- BindingPointer<Buffer> mBuffer;
-};
-
-//
-// Implementation of Generic Vertex Attributes for ES3.1
-//
-struct VertexAttribute final : private angle::NonCopyable
-{
- explicit VertexAttribute(GLuint bindingIndex);
- explicit VertexAttribute(VertexAttribute &&attrib);
- VertexAttribute &operator=(VertexAttribute &&attrib);
-
- bool enabled; // For glEnable/DisableVertexAttribArray
- GLenum type;
- GLuint size;
- bool normalized;
- bool pureInteger;
-
- const void *pointer;
- GLuint relativeOffset;
-
- GLuint vertexAttribArrayStride; // ONLY for queries of VERTEX_ATTRIB_ARRAY_STRIDE
- GLuint bindingIndex;
-};
-
-size_t ComputeVertexAttributeTypeSize(const VertexAttribute &attrib);
-
-// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
-size_t ComputeVertexAttributeStride(const VertexAttribute &attrib, const VertexBinding &binding);
-
-// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
-GLintptr ComputeVertexAttributeOffset(const VertexAttribute &attrib, const VertexBinding &binding);
-
-size_t ComputeVertexBindingElementCount(GLuint divisor, size_t drawCount, size_t instanceCount);
-
-GLenum GetVertexAttributeBaseType(const VertexAttribute &attrib);
-
-struct VertexAttribCurrentValueData
-{
- union {
- GLfloat FloatValues[4];
- GLint IntValues[4];
- GLuint UnsignedIntValues[4];
- };
- GLenum Type;
-
- VertexAttribCurrentValueData();
-
- void setFloatValues(const GLfloat floatValues[4]);
- void setIntValues(const GLint intValues[4]);
- void setUnsignedIntValues(const GLuint unsignedIntValues[4]);
-};
-
-bool operator==(const VertexAttribCurrentValueData &a, const VertexAttribCurrentValueData &b);
-bool operator!=(const VertexAttribCurrentValueData &a, const VertexAttribCurrentValueData &b);
-
-} // namespace gl
-
-#include "VertexAttribute.inl"
-
-#endif // LIBANGLE_VERTEXATTRIBUTE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/VertexAttribute.inl b/src/3rdparty/angle/src/libANGLE/VertexAttribute.inl
deleted file mode 100644
index 1c1843e46f..0000000000
--- a/src/3rdparty/angle/src/libANGLE/VertexAttribute.inl
+++ /dev/null
@@ -1,58 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// VertexAttribute.inl: Inline vertex attribute methods
-//
-
-namespace gl
-{
-
-inline VertexAttribCurrentValueData::VertexAttribCurrentValueData()
- : Type(GL_FLOAT)
-{
- FloatValues[0] = 0.0f;
- FloatValues[1] = 0.0f;
- FloatValues[2] = 0.0f;
- FloatValues[3] = 1.0f;
-}
-
-inline void VertexAttribCurrentValueData::setFloatValues(const GLfloat floatValues[4])
-{
- for (unsigned int valueIndex = 0; valueIndex < 4; valueIndex++)
- {
- FloatValues[valueIndex] = floatValues[valueIndex];
- }
- Type = GL_FLOAT;
-}
-
-inline void VertexAttribCurrentValueData::setIntValues(const GLint intValues[4])
-{
- for (unsigned int valueIndex = 0; valueIndex < 4; valueIndex++)
- {
- IntValues[valueIndex] = intValues[valueIndex];
- }
- Type = GL_INT;
-}
-
-inline void VertexAttribCurrentValueData::setUnsignedIntValues(const GLuint unsignedIntValues[4])
-{
- for (unsigned int valueIndex = 0; valueIndex < 4; valueIndex++)
- {
- UnsignedIntValues[valueIndex] = unsignedIntValues[valueIndex];
- }
- Type = GL_UNSIGNED_INT;
-}
-
-inline bool operator==(const VertexAttribCurrentValueData &a, const VertexAttribCurrentValueData &b)
-{
- return (a.Type == b.Type && memcmp(a.FloatValues, b.FloatValues, sizeof(float) * 4) == 0);
-}
-
-inline bool operator!=(const VertexAttribCurrentValueData &a, const VertexAttribCurrentValueData &b)
-{
- return !(a == b);
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/Workarounds.h b/src/3rdparty/angle/src/libANGLE/Workarounds.h
deleted file mode 100644
index 898031d78d..0000000000
--- a/src/3rdparty/angle/src/libANGLE/Workarounds.h
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Workarounds.h: Workarounds for driver bugs and other behaviors seen
-// on all platforms.
-
-#ifndef LIBANGLE_WORKAROUNDS_H_
-#define LIBANGLE_WORKAROUNDS_H_
-
-namespace gl
-{
-
-struct Workarounds
-{
- // Force the context to be lost (via KHR_robustness) if a GL_OUT_OF_MEMORY error occurs. The
- // driver may be in an inconsistent state if this happens, and some users of ANGLE rely on this
- // notification to prevent further execution.
- bool loseContextOnOutOfMemory = false;
-
- // Program binaries don't contain transform feedback varyings on Qualcomm GPUs.
- // Work around this by disabling the program cache for programs with transform feedback.
- bool disableProgramCachingForTransformFeedback = false;
-};
-} // namespace gl
-
-#endif // LIBANGLE_WORKAROUNDS_H_
diff --git a/src/3rdparty/angle/src/libANGLE/WorkerThread.cpp b/src/3rdparty/angle/src/libANGLE/WorkerThread.cpp
deleted file mode 100644
index b5d789ef93..0000000000
--- a/src/3rdparty/angle/src/libANGLE/WorkerThread.cpp
+++ /dev/null
@@ -1,157 +0,0 @@
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// WorkerThread:
-// Task running thread for ANGLE, similar to a TaskRunner in Chromium.
-// Might be implemented differently depending on platform.
-//
-
-#include "libANGLE/WorkerThread.h"
-
-namespace angle
-{
-
-namespace priv
-{
-// SingleThreadedWorkerPool implementation.
-SingleThreadedWorkerPool::SingleThreadedWorkerPool(size_t maxThreads)
- : WorkerThreadPoolBase(maxThreads)
-{
-}
-
-SingleThreadedWorkerPool::~SingleThreadedWorkerPool()
-{
-}
-
-SingleThreadedWaitableEvent SingleThreadedWorkerPool::postWorkerTaskImpl(Closure *task)
-{
- (*task)();
- return SingleThreadedWaitableEvent(EventResetPolicy::Automatic, EventInitialState::Signaled);
-}
-
-// SingleThreadedWaitableEvent implementation.
-SingleThreadedWaitableEvent::SingleThreadedWaitableEvent()
- : SingleThreadedWaitableEvent(EventResetPolicy::Automatic, EventInitialState::NonSignaled)
-{
-}
-
-SingleThreadedWaitableEvent::SingleThreadedWaitableEvent(EventResetPolicy resetPolicy,
- EventInitialState initialState)
- : WaitableEventBase(resetPolicy, initialState)
-{
-}
-
-SingleThreadedWaitableEvent::~SingleThreadedWaitableEvent()
-{
-}
-
-SingleThreadedWaitableEvent::SingleThreadedWaitableEvent(SingleThreadedWaitableEvent &&other)
- : WaitableEventBase(std::move(other))
-{
-}
-
-SingleThreadedWaitableEvent &SingleThreadedWaitableEvent::operator=(
- SingleThreadedWaitableEvent &&other)
-{
- return copyBase(std::move(other));
-}
-
-void SingleThreadedWaitableEvent::resetImpl()
-{
- mSignaled = false;
-}
-
-void SingleThreadedWaitableEvent::waitImpl()
-{
-}
-
-void SingleThreadedWaitableEvent::signalImpl()
-{
- mSignaled = true;
-}
-
-#if (ANGLE_STD_ASYNC_WORKERS == ANGLE_ENABLED)
-// AsyncWorkerPool implementation.
-AsyncWorkerPool::AsyncWorkerPool(size_t maxThreads) : WorkerThreadPoolBase(maxThreads)
-{
-}
-
-AsyncWorkerPool::~AsyncWorkerPool()
-{
-}
-
-AsyncWaitableEvent AsyncWorkerPool::postWorkerTaskImpl(Closure *task)
-{
- auto future = std::async(std::launch::async, [task] { (*task)(); });
-
- AsyncWaitableEvent waitable(EventResetPolicy::Automatic, EventInitialState::NonSignaled);
-
- waitable.setFuture(std::move(future));
-
- return waitable;
-}
-
-// AsyncWaitableEvent implementation.
-AsyncWaitableEvent::AsyncWaitableEvent()
- : AsyncWaitableEvent(EventResetPolicy::Automatic, EventInitialState::NonSignaled)
-{
-}
-
-AsyncWaitableEvent::AsyncWaitableEvent(EventResetPolicy resetPolicy, EventInitialState initialState)
- : WaitableEventBase(resetPolicy, initialState)
-{
-}
-
-AsyncWaitableEvent::~AsyncWaitableEvent()
-{
-}
-
-AsyncWaitableEvent::AsyncWaitableEvent(AsyncWaitableEvent &&other)
- : WaitableEventBase(std::move(other)), mFuture(std::move(other.mFuture))
-{
-}
-
-AsyncWaitableEvent &AsyncWaitableEvent::operator=(AsyncWaitableEvent &&other)
-{
- std::swap(mFuture, other.mFuture);
- return copyBase(std::move(other));
-}
-
-void AsyncWaitableEvent::setFuture(std::future<void> &&future)
-{
- mFuture = std::move(future);
-}
-
-void AsyncWaitableEvent::resetImpl()
-{
- mSignaled = false;
- mFuture = std::future<void>();
-}
-
-void AsyncWaitableEvent::waitImpl()
-{
- if (mSignaled || !mFuture.valid())
- {
- return;
- }
-
- mFuture.wait();
- signal();
-}
-
-void AsyncWaitableEvent::signalImpl()
-{
- mSignaled = true;
-
- if (mResetPolicy == EventResetPolicy::Automatic)
- {
- reset();
- }
-}
-#endif // (ANGLE_STD_ASYNC_WORKERS == ANGLE_ENABLED)
-
-} // namespace priv
-
-} // namespace angle
diff --git a/src/3rdparty/angle/src/libANGLE/WorkerThread.h b/src/3rdparty/angle/src/libANGLE/WorkerThread.h
deleted file mode 100644
index f6b81dce21..0000000000
--- a/src/3rdparty/angle/src/libANGLE/WorkerThread.h
+++ /dev/null
@@ -1,284 +0,0 @@
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// WorkerThread:
-// Asychronous tasks/threads for ANGLE, similar to a TaskRunner in Chromium.
-// Can be implemented as different targets, depending on platform.
-//
-
-#ifndef LIBANGLE_WORKER_THREAD_H_
-#define LIBANGLE_WORKER_THREAD_H_
-
-#include <array>
-#include <vector>
-
-#include "common/debug.h"
-#include "libANGLE/features.h"
-
-#if (ANGLE_STD_ASYNC_WORKERS == ANGLE_ENABLED)
-#include <future>
-#endif // (ANGLE_STD_ASYNC_WORKERS == ANGLE_ENABLED)
-
-namespace angle
-{
-// Indicates whether a WaitableEvent should automatically reset the event state after a single
-// waiting thread has been released or remain signaled until reset() is manually invoked.
-enum class EventResetPolicy
-{
- Manual,
- Automatic
-};
-
-// Specify the initial state on creation.
-enum class EventInitialState
-{
- NonSignaled,
- Signaled
-};
-
-// A callback function with no return value and no arguments.
-class Closure
-{
- public:
- virtual ~Closure() = default;
- virtual void operator()() = 0;
-};
-
-namespace priv
-{
-// An event that we can wait on, useful for joining worker threads.
-template <typename Impl>
-class WaitableEventBase : angle::NonCopyable
-{
- public:
- WaitableEventBase(EventResetPolicy resetPolicy, EventInitialState initialState);
-
- WaitableEventBase(WaitableEventBase &&other);
-
- // Puts the event in the un-signaled state.
- void reset();
-
- // Waits indefinitely for the event to be signaled.
- void wait();
-
- // Puts the event in the signaled state, causing any thread blocked on Wait to be woken up.
- // The event state is reset to non-signaled after a waiting thread has been released.
- void signal();
-
- protected:
- Impl &copyBase(Impl &&other);
-
- template <size_t Count>
- static size_t WaitManyBase(std::array<Impl, Count> *waitables);
-
- EventResetPolicy mResetPolicy;
- bool mSignaled;
-};
-
-template <typename Impl>
-WaitableEventBase<Impl>::WaitableEventBase(EventResetPolicy resetPolicy,
- EventInitialState initialState)
- : mResetPolicy(resetPolicy), mSignaled(initialState == EventInitialState::Signaled)
-{
-}
-
-template <typename Impl>
-WaitableEventBase<Impl>::WaitableEventBase(WaitableEventBase &&other)
- : mResetPolicy(other.mResetPolicy), mSignaled(other.mSignaled)
-{
-}
-
-template <typename Impl>
-void WaitableEventBase<Impl>::reset()
-{
- static_cast<Impl *>(this)->resetImpl();
-}
-
-template <typename Impl>
-void WaitableEventBase<Impl>::wait()
-{
- static_cast<Impl *>(this)->waitImpl();
-}
-
-template <typename Impl>
-void WaitableEventBase<Impl>::signal()
-{
- static_cast<Impl *>(this)->signalImpl();
-}
-
-template <typename Impl>
-template <size_t Count>
-// static
-size_t WaitableEventBase<Impl>::WaitManyBase(std::array<Impl, Count> *waitables)
-{
- ASSERT(Count > 0);
-
- for (size_t index = 0; index < Count; ++index)
- {
- (*waitables)[index].wait();
- }
-
- return 0;
-}
-
-template <typename Impl>
-Impl &WaitableEventBase<Impl>::copyBase(Impl &&other)
-{
- std::swap(mSignaled, other.mSignaled);
- std::swap(mResetPolicy, other.mResetPolicy);
- return *static_cast<Impl *>(this);
-}
-
-class SingleThreadedWaitableEvent : public WaitableEventBase<SingleThreadedWaitableEvent>
-{
- public:
- SingleThreadedWaitableEvent();
- SingleThreadedWaitableEvent(EventResetPolicy resetPolicy, EventInitialState initialState);
- ~SingleThreadedWaitableEvent();
-
- SingleThreadedWaitableEvent(SingleThreadedWaitableEvent &&other);
- SingleThreadedWaitableEvent &operator=(SingleThreadedWaitableEvent &&other);
-
- void resetImpl();
- void waitImpl();
- void signalImpl();
-
- // Wait, synchronously, on multiple events.
- // returns the index of a WaitableEvent which has been signaled.
- template <size_t Count>
- static size_t WaitMany(std::array<SingleThreadedWaitableEvent, Count> *waitables);
-};
-
-template <size_t Count>
-// static
-size_t SingleThreadedWaitableEvent::WaitMany(
- std::array<SingleThreadedWaitableEvent, Count> *waitables)
-{
- return WaitableEventBase<SingleThreadedWaitableEvent>::WaitManyBase(waitables);
-}
-
-#if (ANGLE_STD_ASYNC_WORKERS == ANGLE_ENABLED)
-class AsyncWaitableEvent : public WaitableEventBase<AsyncWaitableEvent>
-{
- public:
- AsyncWaitableEvent();
- AsyncWaitableEvent(EventResetPolicy resetPolicy, EventInitialState initialState);
- ~AsyncWaitableEvent();
-
- AsyncWaitableEvent(AsyncWaitableEvent &&other);
- AsyncWaitableEvent &operator=(AsyncWaitableEvent &&other);
-
- void resetImpl();
- void waitImpl();
- void signalImpl();
-
- // Wait, synchronously, on multiple events.
- // returns the index of a WaitableEvent which has been signaled.
- template <size_t Count>
- static size_t WaitMany(std::array<AsyncWaitableEvent, Count> *waitables);
-
- private:
- friend class AsyncWorkerPool;
- void setFuture(std::future<void> &&future);
-
- std::future<void> mFuture;
-};
-
-template <size_t Count>
-// static
-size_t AsyncWaitableEvent::WaitMany(std::array<AsyncWaitableEvent, Count> *waitables)
-{
- return WaitableEventBase<AsyncWaitableEvent>::WaitManyBase(waitables);
-}
-#endif // (ANGLE_STD_ASYNC_WORKERS == ANGLE_ENABLED)
-
-// The traits class allows the the thread pool to return the "Typed" waitable event from postTask.
-// Otherwise postTask would always think it returns the current active type, so the unit tests
-// could not run on multiple worker types in the same compilation.
-template <typename Impl>
-struct WorkerThreadPoolTraits;
-
-class SingleThreadedWorkerPool;
-template <>
-struct WorkerThreadPoolTraits<SingleThreadedWorkerPool>
-{
- using WaitableEventType = SingleThreadedWaitableEvent;
-};
-
-#if (ANGLE_STD_ASYNC_WORKERS == ANGLE_ENABLED)
-class AsyncWorkerPool;
-template <>
-struct WorkerThreadPoolTraits<AsyncWorkerPool>
-{
- using WaitableEventType = AsyncWaitableEvent;
-};
-#endif // (ANGLE_STD_ASYNC_WORKERS == ANGLE_ENABLED)
-
-// Request WorkerThreads from the WorkerThreadPool. Each pool can keep worker threads around so
-// we avoid the costly spin up and spin down time.
-template <typename Impl>
-class WorkerThreadPoolBase : angle::NonCopyable
-{
- public:
- WorkerThreadPoolBase(size_t maxThreads);
- ~WorkerThreadPoolBase();
-
- using WaitableEventType = typename WorkerThreadPoolTraits<Impl>::WaitableEventType;
-
- // Returns an event to wait on for the task to finish.
- // If the pool fails to create the task, returns null.
- WaitableEventType postWorkerTask(Closure *task);
-};
-
-template <typename Impl>
-WorkerThreadPoolBase<Impl>::WorkerThreadPoolBase(size_t maxThreads)
-{
-}
-
-template <typename Impl>
-WorkerThreadPoolBase<Impl>::~WorkerThreadPoolBase()
-{
-}
-
-template <typename Impl>
-typename WorkerThreadPoolBase<Impl>::WaitableEventType WorkerThreadPoolBase<Impl>::postWorkerTask(
- Closure *task)
-{
- return static_cast<Impl *>(this)->postWorkerTaskImpl(task);
-}
-
-class SingleThreadedWorkerPool : public WorkerThreadPoolBase<SingleThreadedWorkerPool>
-{
- public:
- SingleThreadedWorkerPool(size_t maxThreads);
- ~SingleThreadedWorkerPool();
-
- SingleThreadedWaitableEvent postWorkerTaskImpl(Closure *task);
-};
-
-#if (ANGLE_STD_ASYNC_WORKERS == ANGLE_ENABLED)
-class AsyncWorkerPool : public WorkerThreadPoolBase<AsyncWorkerPool>
-{
- public:
- AsyncWorkerPool(size_t maxThreads);
- ~AsyncWorkerPool();
-
- AsyncWaitableEvent postWorkerTaskImpl(Closure *task);
-};
-#endif // (ANGLE_STD_ASYNC_WORKERS == ANGLE_ENABLED)
-
-} // namespace priv
-
-#if (ANGLE_STD_ASYNC_WORKERS == ANGLE_ENABLED)
-using WaitableEvent = priv::AsyncWaitableEvent;
-using WorkerThreadPool = priv::AsyncWorkerPool;
-#else
-using WaitableEvent = priv::SingleThreadedWaitableEvent;
-using WorkerThreadPool = priv::SingleThreadedWorkerPool;
-#endif // (ANGLE_STD_ASYNC_WORKERS == ANGLE_ENABLED)
-
-} // namespace angle
-
-#endif // LIBANGLE_WORKER_THREAD_H_
diff --git a/src/3rdparty/angle/src/libANGLE/angletypes.cpp b/src/3rdparty/angle/src/libANGLE/angletypes.cpp
deleted file mode 100644
index 702d391e46..0000000000
--- a/src/3rdparty/angle/src/libANGLE/angletypes.cpp
+++ /dev/null
@@ -1,259 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// angletypes.h : Defines a variety of structures and enum types that are used throughout libGLESv2
-
-#include "libANGLE/angletypes.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/VertexAttribute.h"
-#include "libANGLE/State.h"
-#include "libANGLE/VertexArray.h"
-
-namespace gl
-{
-
-PrimitiveType GetPrimitiveType(GLenum drawMode)
-{
- switch (drawMode)
- {
- case GL_POINTS:
- return PRIMITIVE_POINTS;
- case GL_LINES:
- return PRIMITIVE_LINES;
- case GL_LINE_STRIP:
- return PRIMITIVE_LINE_STRIP;
- case GL_LINE_LOOP:
- return PRIMITIVE_LINE_LOOP;
- case GL_TRIANGLES:
- return PRIMITIVE_TRIANGLES;
- case GL_TRIANGLE_STRIP:
- return PRIMITIVE_TRIANGLE_STRIP;
- case GL_TRIANGLE_FAN:
- return PRIMITIVE_TRIANGLE_FAN;
- default:
- UNREACHABLE();
- return PRIMITIVE_TYPE_MAX;
- }
-}
-
-RasterizerState::RasterizerState()
-{
- memset(this, 0, sizeof(RasterizerState));
-
- rasterizerDiscard = false;
- cullFace = false;
- cullMode = CullFaceMode::Back;
- frontFace = GL_CCW;
- polygonOffsetFill = false;
- polygonOffsetFactor = 0.0f;
- polygonOffsetUnits = 0.0f;
- pointDrawMode = false;
- multiSample = false;
-}
-
-bool operator==(const RasterizerState &a, const RasterizerState &b)
-{
- return memcmp(&a, &b, sizeof(RasterizerState)) == 0;
-}
-
-bool operator!=(const RasterizerState &a, const RasterizerState &b)
-{
- return !(a == b);
-}
-
-BlendState::BlendState()
-{
- memset(this, 0, sizeof(BlendState));
-
- blend = false;
- sourceBlendRGB = GL_ONE;
- sourceBlendAlpha = GL_ONE;
- destBlendRGB = GL_ZERO;
- destBlendAlpha = GL_ZERO;
- blendEquationRGB = GL_FUNC_ADD;
- blendEquationAlpha = GL_FUNC_ADD;
- sampleAlphaToCoverage = false;
- dither = true;
-}
-
-BlendState::BlendState(const BlendState &other)
-{
- memcpy(this, &other, sizeof(BlendState));
-}
-
-bool operator==(const BlendState &a, const BlendState &b)
-{
- return memcmp(&a, &b, sizeof(BlendState)) == 0;
-}
-
-bool operator!=(const BlendState &a, const BlendState &b)
-{
- return !(a == b);
-}
-
-DepthStencilState::DepthStencilState()
-{
- memset(this, 0, sizeof(DepthStencilState));
-
- depthTest = false;
- depthFunc = GL_LESS;
- depthMask = true;
- stencilTest = false;
- stencilFunc = GL_ALWAYS;
- stencilMask = static_cast<GLuint>(-1);
- stencilWritemask = static_cast<GLuint>(-1);
- stencilBackFunc = GL_ALWAYS;
- stencilBackMask = static_cast<GLuint>(-1);
- stencilBackWritemask = static_cast<GLuint>(-1);
- stencilFail = GL_KEEP;
- stencilPassDepthFail = GL_KEEP;
- stencilPassDepthPass = GL_KEEP;
- stencilBackFail = GL_KEEP;
- stencilBackPassDepthFail = GL_KEEP;
- stencilBackPassDepthPass = GL_KEEP;
-}
-
-DepthStencilState::DepthStencilState(const DepthStencilState &other)
-{
- memcpy(this, &other, sizeof(DepthStencilState));
-}
-
-bool operator==(const DepthStencilState &a, const DepthStencilState &b)
-{
- return memcmp(&a, &b, sizeof(DepthStencilState)) == 0;
-}
-
-bool operator!=(const DepthStencilState &a, const DepthStencilState &b)
-{
- return !(a == b);
-}
-
-SamplerState::SamplerState()
-{
- memset(this, 0, sizeof(SamplerState));
-
- minFilter = GL_NEAREST_MIPMAP_LINEAR;
- magFilter = GL_LINEAR;
- wrapS = GL_REPEAT;
- wrapT = GL_REPEAT;
- wrapR = GL_REPEAT;
- maxAnisotropy = 1.0f;
- minLod = -1000.0f;
- maxLod = 1000.0f;
- compareMode = GL_NONE;
- compareFunc = GL_LEQUAL;
- sRGBDecode = GL_DECODE_EXT;
-}
-
-SamplerState::SamplerState(const SamplerState &other) = default;
-
-// static
-SamplerState SamplerState::CreateDefaultForTarget(GLenum target)
-{
- SamplerState state;
-
- // According to OES_EGL_image_external and ARB_texture_rectangle: For external textures, the
- // default min filter is GL_LINEAR and the default s and t wrap modes are GL_CLAMP_TO_EDGE.
- if (target == GL_TEXTURE_EXTERNAL_OES || target == GL_TEXTURE_RECTANGLE_ANGLE)
- {
- state.minFilter = GL_LINEAR;
- state.wrapS = GL_CLAMP_TO_EDGE;
- state.wrapT = GL_CLAMP_TO_EDGE;
- }
-
- return state;
-}
-
-ImageUnit::ImageUnit()
- : texture(), level(0), layered(false), layer(0), access(GL_READ_ONLY), format(GL_R32UI)
-{
-}
-
-ImageUnit::ImageUnit(const ImageUnit &other) = default;
-
-ImageUnit::~ImageUnit() = default;
-
-static void MinMax(int a, int b, int *minimum, int *maximum)
-{
- if (a < b)
- {
- *minimum = a;
- *maximum = b;
- }
- else
- {
- *minimum = b;
- *maximum = a;
- }
-}
-
-bool ClipRectangle(const Rectangle &source, const Rectangle &clip, Rectangle *intersection)
-{
- int minSourceX, maxSourceX, minSourceY, maxSourceY;
- MinMax(source.x, source.x + source.width, &minSourceX, &maxSourceX);
- MinMax(source.y, source.y + source.height, &minSourceY, &maxSourceY);
-
- int minClipX, maxClipX, minClipY, maxClipY;
- MinMax(clip.x, clip.x + clip.width, &minClipX, &maxClipX);
- MinMax(clip.y, clip.y + clip.height, &minClipY, &maxClipY);
-
- if (minSourceX >= maxClipX || maxSourceX <= minClipX || minSourceY >= maxClipY || maxSourceY <= minClipY)
- {
- if (intersection)
- {
- intersection->x = minSourceX;
- intersection->y = maxSourceY;
- intersection->width = maxSourceX - minSourceX;
- intersection->height = maxSourceY - minSourceY;
- }
-
- return false;
- }
- else
- {
- if (intersection)
- {
- intersection->x = std::max(minSourceX, minClipX);
- intersection->y = std::max(minSourceY, minClipY);
- intersection->width = std::min(maxSourceX, maxClipX) - std::max(minSourceX, minClipX);
- intersection->height = std::min(maxSourceY, maxClipY) - std::max(minSourceY, minClipY);
- }
-
- return true;
- }
-}
-
-bool Box::operator==(const Box &other) const
-{
- return (x == other.x && y == other.y && z == other.z &&
- width == other.width && height == other.height && depth == other.depth);
-}
-
-bool Box::operator!=(const Box &other) const
-{
- return !(*this == other);
-}
-
-bool operator==(const Offset &a, const Offset &b)
-{
- return a.x == b.x && a.y == b.y && a.z == b.z;
-}
-
-bool operator!=(const Offset &a, const Offset &b)
-{
- return !(a == b);
-}
-
-bool operator==(const Extents &lhs, const Extents &rhs)
-{
- return lhs.width == rhs.width && lhs.height == rhs.height && lhs.depth == rhs.depth;
-}
-
-bool operator!=(const Extents &lhs, const Extents &rhs)
-{
- return !(lhs == rhs);
-}
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/angletypes.h b/src/3rdparty/angle/src/libANGLE/angletypes.h
deleted file mode 100644
index 4f364b090a..0000000000
--- a/src/3rdparty/angle/src/libANGLE/angletypes.h
+++ /dev/null
@@ -1,487 +0,0 @@
-//
-// Copyright (c) 2012-2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// angletypes.h : Defines a variety of structures and enum types that are used throughout libGLESv2
-
-#ifndef LIBANGLE_ANGLETYPES_H_
-#define LIBANGLE_ANGLETYPES_H_
-
-#include "common/bitset_utils.h"
-#include "libANGLE/Constants.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/PackedGLEnums.h"
-#include "libANGLE/RefCountObject.h"
-
-#include <stdint.h>
-
-#include <bitset>
-#include <map>
-#include <unordered_map>
-
-namespace gl
-{
-class Buffer;
-class Texture;
-
-enum PrimitiveType
-{
- PRIMITIVE_POINTS,
- PRIMITIVE_LINES,
- PRIMITIVE_LINE_STRIP,
- PRIMITIVE_LINE_LOOP,
- PRIMITIVE_TRIANGLES,
- PRIMITIVE_TRIANGLE_STRIP,
- PRIMITIVE_TRIANGLE_FAN,
- PRIMITIVE_TYPE_MAX,
-};
-
-PrimitiveType GetPrimitiveType(GLenum drawMode);
-
-enum SamplerType
-{
- SAMPLER_PIXEL,
- SAMPLER_VERTEX,
- SAMPLER_COMPUTE
-};
-
-enum ShaderType
-{
- SHADER_VERTEX,
- SHADER_FRAGMENT,
- SHADER_GEOMETRY,
- SHADER_COMPUTE,
- SHADER_TYPE_MAX
-};
-
-struct Rectangle
-{
- Rectangle() : x(0), y(0), width(0), height(0) {}
- Rectangle(int x_in, int y_in, int width_in, int height_in)
- : x(x_in), y(y_in), width(width_in), height(height_in)
- {
- }
-
- int x0() const { return x; }
- int y0() const { return y; }
- int x1() const { return x + width; }
- int y1() const { return y + height; }
-
- int x;
- int y;
- int width;
- int height;
-};
-
-bool operator==(const Rectangle &a, const Rectangle &b);
-bool operator!=(const Rectangle &a, const Rectangle &b);
-
-bool ClipRectangle(const Rectangle &source, const Rectangle &clip, Rectangle *intersection);
-
-struct Offset
-{
- int x;
- int y;
- int z;
-
- Offset() : x(0), y(0), z(0) { }
- Offset(int x_in, int y_in, int z_in) : x(x_in), y(y_in), z(z_in) { }
-};
-
-bool operator==(const Offset &a, const Offset &b);
-bool operator!=(const Offset &a, const Offset &b);
-
-struct Extents
-{
- int width;
- int height;
- int depth;
-
- Extents() : width(0), height(0), depth(0) { }
- Extents(int width_, int height_, int depth_) : width(width_), height(height_), depth(depth_) { }
-
- Extents(const Extents &other) = default;
- Extents &operator=(const Extents &other) = default;
-
- bool empty() const { return (width * height * depth) == 0; }
-};
-
-bool operator==(const Extents &lhs, const Extents &rhs);
-bool operator!=(const Extents &lhs, const Extents &rhs);
-
-struct Box
-{
- int x;
- int y;
- int z;
- int width;
- int height;
- int depth;
-
- Box() : x(0), y(0), z(0), width(0), height(0), depth(0) { }
- Box(int x_in, int y_in, int z_in, int width_in, int height_in, int depth_in) : x(x_in), y(y_in), z(z_in), width(width_in), height(height_in), depth(depth_in) { }
- Box(const Offset &offset, const Extents &size) : x(offset.x), y(offset.y), z(offset.z), width(size.width), height(size.height), depth(size.depth) { }
- bool operator==(const Box &other) const;
- bool operator!=(const Box &other) const;
-};
-
-struct RasterizerState final
-{
- // This will zero-initialize the struct, including padding.
- RasterizerState();
-
- bool cullFace;
- CullFaceMode cullMode;
- GLenum frontFace;
-
- bool polygonOffsetFill;
- GLfloat polygonOffsetFactor;
- GLfloat polygonOffsetUnits;
-
- bool pointDrawMode;
- bool multiSample;
-
- bool rasterizerDiscard;
-};
-
-bool operator==(const RasterizerState &a, const RasterizerState &b);
-bool operator!=(const RasterizerState &a, const RasterizerState &b);
-
-struct BlendState final
-{
- // This will zero-initialize the struct, including padding.
- BlendState();
- BlendState(const BlendState &other);
-
- bool blend;
- GLenum sourceBlendRGB;
- GLenum destBlendRGB;
- GLenum sourceBlendAlpha;
- GLenum destBlendAlpha;
- GLenum blendEquationRGB;
- GLenum blendEquationAlpha;
-
- bool colorMaskRed;
- bool colorMaskGreen;
- bool colorMaskBlue;
- bool colorMaskAlpha;
-
- bool sampleAlphaToCoverage;
-
- bool dither;
-};
-
-bool operator==(const BlendState &a, const BlendState &b);
-bool operator!=(const BlendState &a, const BlendState &b);
-
-struct DepthStencilState final
-{
- // This will zero-initialize the struct, including padding.
- DepthStencilState();
- DepthStencilState(const DepthStencilState &other);
-
- bool depthTest;
- GLenum depthFunc;
- bool depthMask;
-
- bool stencilTest;
- GLenum stencilFunc;
- GLuint stencilMask;
- GLenum stencilFail;
- GLenum stencilPassDepthFail;
- GLenum stencilPassDepthPass;
- GLuint stencilWritemask;
- GLenum stencilBackFunc;
- GLuint stencilBackMask;
- GLenum stencilBackFail;
- GLenum stencilBackPassDepthFail;
- GLenum stencilBackPassDepthPass;
- GLuint stencilBackWritemask;
-};
-
-bool operator==(const DepthStencilState &a, const DepthStencilState &b);
-bool operator!=(const DepthStencilState &a, const DepthStencilState &b);
-
-// State from Table 6.10 (state per sampler object)
-struct SamplerState final
-{
- // This will zero-initialize the struct, including padding.
- SamplerState();
- SamplerState(const SamplerState &other);
-
- static SamplerState CreateDefaultForTarget(GLenum target);
-
- GLenum minFilter;
- GLenum magFilter;
-
- GLenum wrapS;
- GLenum wrapT;
- GLenum wrapR;
-
- // From EXT_texture_filter_anisotropic
- float maxAnisotropy;
-
- GLfloat minLod;
- GLfloat maxLod;
-
- GLenum compareMode;
- GLenum compareFunc;
-
- GLenum sRGBDecode;
-};
-
-bool operator==(const SamplerState &a, const SamplerState &b);
-bool operator!=(const SamplerState &a, const SamplerState &b);
-
-struct DrawArraysIndirectCommand
-{
- GLuint count;
- GLuint instanceCount;
- GLuint first;
- GLuint baseInstance;
-};
-static_assert(sizeof(DrawArraysIndirectCommand) == 16,
- "Unexpected size of DrawArraysIndirectCommand");
-
-struct DrawElementsIndirectCommand
-{
- GLuint count;
- GLuint primCount;
- GLuint firstIndex;
- GLint baseVertex;
- GLuint baseInstance;
-};
-static_assert(sizeof(DrawElementsIndirectCommand) == 20,
- "Unexpected size of DrawElementsIndirectCommand");
-
-struct ImageUnit
-{
- ImageUnit();
- ImageUnit(const ImageUnit &other);
- ~ImageUnit();
-
- BindingPointer<Texture> texture;
- GLint level;
- GLboolean layered;
- GLint layer;
- GLenum access;
- GLenum format;
-};
-
-struct PixelStoreStateBase
-{
- GLint alignment = 4;
- GLint rowLength = 0;
- GLint skipRows = 0;
- GLint skipPixels = 0;
- GLint imageHeight = 0;
- GLint skipImages = 0;
-};
-
-struct PixelUnpackState : PixelStoreStateBase
-{
-};
-
-struct PixelPackState : PixelStoreStateBase
-{
- bool reverseRowOrder = false;
-};
-
-// Used in Program and VertexArray.
-using AttributesMask = angle::BitSet<MAX_VERTEX_ATTRIBS>;
-
-// Used in Program
-using UniformBlockBindingMask = angle::BitSet<IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS>;
-
-// Used in Framebuffer
-using DrawBufferMask = angle::BitSet<IMPLEMENTATION_MAX_DRAW_BUFFERS>;
-
-using ContextID = uintptr_t;
-
-constexpr size_t CUBE_FACE_COUNT = 6;
-
-using TextureMap = std::map<GLenum, BindingPointer<Texture>>;
-
-template <typename T>
-using AttachmentArray = std::array<T, IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS>;
-
-template <typename T>
-using DrawBuffersArray = std::array<T, IMPLEMENTATION_MAX_DRAW_BUFFERS>;
-
-} // namespace gl
-
-namespace rx
-{
-// A macro that determines whether an object has a given runtime type.
-#if defined(__clang__)
-#if __has_feature(cxx_rtti)
-#define ANGLE_HAS_DYNAMIC_CAST 1
-#endif
-#elif !defined(NDEBUG) && (!defined(_MSC_VER) || defined(_CPPRTTI)) && (!defined(__GNUC__) || __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 3) || defined(__GXX_RTTI))
-#define ANGLE_HAS_DYNAMIC_CAST 1
-#endif
-
-#ifdef ANGLE_HAS_DYNAMIC_CAST
-#define ANGLE_HAS_DYNAMIC_TYPE(type, obj) (dynamic_cast<type >(obj) != nullptr)
-#undef ANGLE_HAS_DYNAMIC_CAST
-#else
-#define ANGLE_HAS_DYNAMIC_TYPE(type, obj) (obj != nullptr)
-#endif
-
-// Downcast a base implementation object (EG TextureImpl to TextureD3D)
-template <typename DestT, typename SrcT>
-inline DestT *GetAs(SrcT *src)
-{
- ASSERT(ANGLE_HAS_DYNAMIC_TYPE(DestT*, src));
- return static_cast<DestT*>(src);
-}
-
-template <typename DestT, typename SrcT>
-inline const DestT *GetAs(const SrcT *src)
-{
- ASSERT(ANGLE_HAS_DYNAMIC_TYPE(const DestT*, src));
- return static_cast<const DestT*>(src);
-}
-
-#undef ANGLE_HAS_DYNAMIC_TYPE
-
-// Downcast a GL object to an Impl (EG gl::Texture to rx::TextureD3D)
-template <typename DestT, typename SrcT>
-inline DestT *GetImplAs(SrcT *src)
-{
- return GetAs<DestT>(src->getImplementation());
-}
-
-template <typename DestT, typename SrcT>
-inline DestT *SafeGetImplAs(SrcT *src)
-{
- return src != nullptr ? GetAs<DestT>(src->getImplementation()) : nullptr;
-}
-
-} // namespace rx
-
-#include "angletypes.inl"
-
-namespace angle
-{
-// Zero-based for better array indexing
-enum FramebufferBinding
-{
- FramebufferBindingRead = 0,
- FramebufferBindingDraw,
- FramebufferBindingSingletonMax,
- FramebufferBindingBoth = FramebufferBindingSingletonMax,
- FramebufferBindingMax,
- FramebufferBindingUnknown = FramebufferBindingMax,
-};
-
-inline FramebufferBinding EnumToFramebufferBinding(GLenum enumValue)
-{
- switch (enumValue)
- {
- case GL_READ_FRAMEBUFFER:
- return FramebufferBindingRead;
- case GL_DRAW_FRAMEBUFFER:
- return FramebufferBindingDraw;
- case GL_FRAMEBUFFER:
- return FramebufferBindingBoth;
- default:
- UNREACHABLE();
- return FramebufferBindingUnknown;
- }
-}
-
-inline GLenum FramebufferBindingToEnum(FramebufferBinding binding)
-{
- switch (binding)
- {
- case FramebufferBindingRead:
- return GL_READ_FRAMEBUFFER;
- case FramebufferBindingDraw:
- return GL_DRAW_FRAMEBUFFER;
- case FramebufferBindingBoth:
- return GL_FRAMEBUFFER;
- default:
- UNREACHABLE();
- return GL_NONE;
- }
-}
-
-template <typename ObjT, typename ContextT>
-class DestroyThenDelete
-{
- public:
- DestroyThenDelete(const ContextT *context) : mContext(context) {}
-
- void operator()(ObjT *obj)
- {
- ANGLE_SWALLOW_ERR(obj->onDestroy(mContext));
- delete obj;
- }
-
- private:
- const ContextT *mContext;
-};
-
-// Helper class for wrapping an onDestroy function.
-template <typename ObjT, typename DeleterT>
-class UniqueObjectPointerBase : angle::NonCopyable
-{
- public:
- template <typename ContextT>
- UniqueObjectPointerBase(const ContextT *context) : mObject(nullptr), mDeleter(context)
- {
- }
-
- template <typename ContextT>
- UniqueObjectPointerBase(ObjT *obj, const ContextT *context) : mObject(obj), mDeleter(context)
- {
- }
-
- ~UniqueObjectPointerBase()
- {
- if (mObject)
- {
- mDeleter(mObject);
- }
- }
-
- ObjT *operator->() const { return mObject; }
-
- ObjT *release()
- {
- auto obj = mObject;
- mObject = nullptr;
- return obj;
- }
-
- ObjT *get() const { return mObject; }
-
- void reset(ObjT *obj)
- {
- if (mObject)
- {
- mDeleter(mObject);
- }
- mObject = obj;
- }
-
- private:
- ObjT *mObject;
- DeleterT mDeleter;
-};
-
-template <typename ObjT, typename ContextT>
-using UniqueObjectPointer = UniqueObjectPointerBase<ObjT, DestroyThenDelete<ObjT, ContextT>>;
-
-} // namespace angle
-
-namespace gl
-{
-class ContextState;
-
-} // namespace gl
-
-#endif // LIBANGLE_ANGLETYPES_H_
diff --git a/src/3rdparty/angle/src/libANGLE/angletypes.inl b/src/3rdparty/angle/src/libANGLE/angletypes.inl
deleted file mode 100644
index 3fbe0747d2..0000000000
--- a/src/3rdparty/angle/src/libANGLE/angletypes.inl
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// Copyright (c) 2012-2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// angletypes.inl : Inline definitions of some functions from angletypes.h
-
-namespace gl
-{
-
-inline bool operator==(const Rectangle &a, const Rectangle &b)
-{
- return a.x == b.x &&
- a.y == b.y &&
- a.width == b.width &&
- a.height == b.height;
-}
-
-inline bool operator!=(const Rectangle &a, const Rectangle &b)
-{
- return !(a == b);
-}
-
-inline bool operator==(const SamplerState &a, const SamplerState &b)
-{
- return memcmp(&a, &b, sizeof(SamplerState)) == 0;
-}
-
-inline bool operator!=(const SamplerState &a, const SamplerState &b)
-{
- return !(a == b);
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/entry_points_enum_autogen.h b/src/3rdparty/angle/src/libANGLE/entry_points_enum_autogen.h
deleted file mode 100644
index 14b5e3c1b0..0000000000
--- a/src/3rdparty/angle/src/libANGLE/entry_points_enum_autogen.h
+++ /dev/null
@@ -1,336 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by generate_entry_points.py using data from gl.xml.
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// entry_points_enum_autogen.h:
-// Defines the GLES entry points enumeration.
-
-#ifndef LIBGLESV2_ENTRYPOINTSENUM_AUTOGEN_H_
-#define LIBGLESV2_ENTRYPOINTSENUM_AUTOGEN_H_
-
-namespace gl
-{
-enum class EntryPoint
-{
- Invalid,
- ActiveTexture,
- AttachShader,
- BindAttribLocation,
- BindBuffer,
- BindFramebuffer,
- BindRenderbuffer,
- BindTexture,
- BlendColor,
- BlendEquation,
- BlendEquationSeparate,
- BlendFunc,
- BlendFuncSeparate,
- BufferData,
- BufferSubData,
- CheckFramebufferStatus,
- Clear,
- ClearColor,
- ClearDepthf,
- ClearStencil,
- ColorMask,
- CompileShader,
- CompressedTexImage2D,
- CompressedTexSubImage2D,
- CopyTexImage2D,
- CopyTexSubImage2D,
- CreateProgram,
- CreateShader,
- CullFace,
- DeleteBuffers,
- DeleteFramebuffers,
- DeleteProgram,
- DeleteRenderbuffers,
- DeleteShader,
- DeleteTextures,
- DepthFunc,
- DepthMask,
- DepthRangef,
- DetachShader,
- Disable,
- DisableVertexAttribArray,
- DrawArrays,
- DrawElements,
- Enable,
- EnableVertexAttribArray,
- Finish,
- Flush,
- FramebufferRenderbuffer,
- FramebufferTexture2D,
- FrontFace,
- GenBuffers,
- GenerateMipmap,
- GenFramebuffers,
- GenRenderbuffers,
- GenTextures,
- GetActiveAttrib,
- GetActiveUniform,
- GetAttachedShaders,
- GetAttribLocation,
- GetBooleanv,
- GetBufferParameteriv,
- GetError,
- GetFloatv,
- GetFramebufferAttachmentParameteriv,
- GetIntegerv,
- GetProgramiv,
- GetProgramInfoLog,
- GetRenderbufferParameteriv,
- GetShaderiv,
- GetShaderInfoLog,
- GetShaderPrecisionFormat,
- GetShaderSource,
- GetString,
- GetTexParameterfv,
- GetTexParameteriv,
- GetUniformfv,
- GetUniformiv,
- GetUniformLocation,
- GetVertexAttribfv,
- GetVertexAttribiv,
- GetVertexAttribPointerv,
- Hint,
- IsBuffer,
- IsEnabled,
- IsFramebuffer,
- IsProgram,
- IsRenderbuffer,
- IsShader,
- IsTexture,
- LineWidth,
- LinkProgram,
- PixelStorei,
- PolygonOffset,
- ReadPixels,
- ReleaseShaderCompiler,
- RenderbufferStorage,
- SampleCoverage,
- Scissor,
- ShaderBinary,
- ShaderSource,
- StencilFunc,
- StencilFuncSeparate,
- StencilMask,
- StencilMaskSeparate,
- StencilOp,
- StencilOpSeparate,
- TexImage2D,
- TexParameterf,
- TexParameterfv,
- TexParameteri,
- TexParameteriv,
- TexSubImage2D,
- Uniform1f,
- Uniform1fv,
- Uniform1i,
- Uniform1iv,
- Uniform2f,
- Uniform2fv,
- Uniform2i,
- Uniform2iv,
- Uniform3f,
- Uniform3fv,
- Uniform3i,
- Uniform3iv,
- Uniform4f,
- Uniform4fv,
- Uniform4i,
- Uniform4iv,
- UniformMatrix2fv,
- UniformMatrix3fv,
- UniformMatrix4fv,
- UseProgram,
- ValidateProgram,
- VertexAttrib1f,
- VertexAttrib1fv,
- VertexAttrib2f,
- VertexAttrib2fv,
- VertexAttrib3f,
- VertexAttrib3fv,
- VertexAttrib4f,
- VertexAttrib4fv,
- VertexAttribPointer,
- Viewport,
- ReadBuffer,
- DrawRangeElements,
- TexImage3D,
- TexSubImage3D,
- CopyTexSubImage3D,
- CompressedTexImage3D,
- CompressedTexSubImage3D,
- GenQueries,
- DeleteQueries,
- IsQuery,
- BeginQuery,
- EndQuery,
- GetQueryiv,
- GetQueryObjectuiv,
- UnmapBuffer,
- GetBufferPointerv,
- DrawBuffers,
- UniformMatrix2x3fv,
- UniformMatrix3x2fv,
- UniformMatrix2x4fv,
- UniformMatrix4x2fv,
- UniformMatrix3x4fv,
- UniformMatrix4x3fv,
- BlitFramebuffer,
- RenderbufferStorageMultisample,
- FramebufferTextureLayer,
- MapBufferRange,
- FlushMappedBufferRange,
- BindVertexArray,
- DeleteVertexArrays,
- GenVertexArrays,
- IsVertexArray,
- GetIntegeri_v,
- BeginTransformFeedback,
- EndTransformFeedback,
- BindBufferRange,
- BindBufferBase,
- TransformFeedbackVaryings,
- GetTransformFeedbackVarying,
- VertexAttribIPointer,
- GetVertexAttribIiv,
- GetVertexAttribIuiv,
- VertexAttribI4i,
- VertexAttribI4ui,
- VertexAttribI4iv,
- VertexAttribI4uiv,
- GetUniformuiv,
- GetFragDataLocation,
- Uniform1ui,
- Uniform2ui,
- Uniform3ui,
- Uniform4ui,
- Uniform1uiv,
- Uniform2uiv,
- Uniform3uiv,
- Uniform4uiv,
- ClearBufferiv,
- ClearBufferuiv,
- ClearBufferfv,
- ClearBufferfi,
- GetStringi,
- CopyBufferSubData,
- GetUniformIndices,
- GetActiveUniformsiv,
- GetUniformBlockIndex,
- GetActiveUniformBlockiv,
- GetActiveUniformBlockName,
- UniformBlockBinding,
- DrawArraysInstanced,
- DrawElementsInstanced,
- FenceSync,
- IsSync,
- DeleteSync,
- ClientWaitSync,
- WaitSync,
- GetInteger64v,
- GetSynciv,
- GetInteger64i_v,
- GetBufferParameteri64v,
- GenSamplers,
- DeleteSamplers,
- IsSampler,
- BindSampler,
- SamplerParameteri,
- SamplerParameteriv,
- SamplerParameterf,
- SamplerParameterfv,
- GetSamplerParameteriv,
- GetSamplerParameterfv,
- VertexAttribDivisor,
- BindTransformFeedback,
- DeleteTransformFeedbacks,
- GenTransformFeedbacks,
- IsTransformFeedback,
- PauseTransformFeedback,
- ResumeTransformFeedback,
- GetProgramBinary,
- ProgramBinary,
- ProgramParameteri,
- InvalidateFramebuffer,
- InvalidateSubFramebuffer,
- TexStorage2D,
- TexStorage3D,
- GetInternalformativ,
- DispatchCompute,
- DispatchComputeIndirect,
- DrawArraysIndirect,
- DrawElementsIndirect,
- FramebufferParameteri,
- GetFramebufferParameteriv,
- GetProgramInterfaceiv,
- GetProgramResourceIndex,
- GetProgramResourceName,
- GetProgramResourceiv,
- GetProgramResourceLocation,
- UseProgramStages,
- ActiveShaderProgram,
- CreateShaderProgramv,
- BindProgramPipeline,
- DeleteProgramPipelines,
- GenProgramPipelines,
- IsProgramPipeline,
- GetProgramPipelineiv,
- ProgramUniform1i,
- ProgramUniform2i,
- ProgramUniform3i,
- ProgramUniform4i,
- ProgramUniform1ui,
- ProgramUniform2ui,
- ProgramUniform3ui,
- ProgramUniform4ui,
- ProgramUniform1f,
- ProgramUniform2f,
- ProgramUniform3f,
- ProgramUniform4f,
- ProgramUniform1iv,
- ProgramUniform2iv,
- ProgramUniform3iv,
- ProgramUniform4iv,
- ProgramUniform1uiv,
- ProgramUniform2uiv,
- ProgramUniform3uiv,
- ProgramUniform4uiv,
- ProgramUniform1fv,
- ProgramUniform2fv,
- ProgramUniform3fv,
- ProgramUniform4fv,
- ProgramUniformMatrix2fv,
- ProgramUniformMatrix3fv,
- ProgramUniformMatrix4fv,
- ProgramUniformMatrix2x3fv,
- ProgramUniformMatrix3x2fv,
- ProgramUniformMatrix2x4fv,
- ProgramUniformMatrix4x2fv,
- ProgramUniformMatrix3x4fv,
- ProgramUniformMatrix4x3fv,
- ValidateProgramPipeline,
- GetProgramPipelineInfoLog,
- BindImageTexture,
- GetBooleani_v,
- MemoryBarrier,
- MemoryBarrierByRegion,
- TexStorage2DMultisample,
- GetMultisamplefv,
- SampleMaski,
- GetTexLevelParameteriv,
- GetTexLevelParameterfv,
- BindVertexBuffer,
- VertexAttribFormat,
- VertexAttribIFormat,
- VertexAttribBinding,
- VertexBindingDivisor,
- DrawElementsInstancedANGLE
-};
-} // namespace gl
-#endif // LIBGLESV2_ENTRY_POINTS_ENUM_AUTOGEN_H_
diff --git a/src/3rdparty/angle/src/libANGLE/es3_copy_conversion_formats.json b/src/3rdparty/angle/src/libANGLE/es3_copy_conversion_formats.json
deleted file mode 100644
index 39b71fd93a..0000000000
--- a/src/3rdparty/angle/src/libANGLE/es3_copy_conversion_formats.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "From ES 3.0.1 spec, table 3.15":
- [
- [ "GL_ALPHA", "GL_RGBA" ],
- [ "GL_LUMINANCE", "GL_RED" ],
- [ "GL_LUMINANCE", "GL_RG" ],
- [ "GL_LUMINANCE", "GL_RGB" ],
- [ "GL_LUMINANCE", "GL_RGBA" ],
- [ "GL_LUMINANCE_ALPHA", "GL_RGBA" ],
- [ "GL_RED", "GL_RED" ],
- [ "GL_RED", "GL_RG" ],
- [ "GL_RED", "GL_RGB" ],
- [ "GL_RED", "GL_RGBA" ],
- [ "GL_RG", "GL_RG" ],
- [ "GL_RG", "GL_RGB" ],
- [ "GL_RG", "GL_RGBA" ],
- [ "GL_RGB", "GL_RGB" ],
- [ "GL_RGB", "GL_RGBA" ],
- [ "GL_RGBA", "GL_RGBA" ]
- ],
-
- "Necessary for ANGLE back-buffers":
- [
- [ "GL_ALPHA", "GL_BGRA_EXT" ],
- [ "GL_LUMINANCE", "GL_BGRA_EXT" ],
- [ "GL_LUMINANCE_ALPHA", "GL_BGRA_EXT" ],
- [ "GL_RED", "GL_BGRA_EXT" ],
- [ "GL_RG", "GL_BGRA_EXT" ],
- [ "GL_RGB", "GL_BGRA_EXT" ],
- [ "GL_RGBA", "GL_BGRA_EXT" ],
- [ "GL_BGRA_EXT", "GL_BGRA_EXT" ],
-
- [ "GL_RED_INTEGER", "GL_RED_INTEGER" ],
- [ "GL_RED_INTEGER", "GL_RG_INTEGER" ],
- [ "GL_RED_INTEGER", "GL_RGB_INTEGER" ],
- [ "GL_RED_INTEGER", "GL_RGBA_INTEGER" ],
- [ "GL_RG_INTEGER", "GL_RG_INTEGER" ],
- [ "GL_RG_INTEGER", "GL_RGB_INTEGER" ],
- [ "GL_RG_INTEGER", "GL_RGBA_INTEGER" ],
- [ "GL_RGB_INTEGER", "GL_RGB_INTEGER" ],
- [ "GL_RGB_INTEGER", "GL_RGBA_INTEGER" ],
- [ "GL_RGBA_INTEGER", "GL_RGBA_INTEGER" ]
- ]
-}
diff --git a/src/3rdparty/angle/src/libANGLE/es3_copy_conversion_table_autogen.cpp b/src/3rdparty/angle/src/libANGLE/es3_copy_conversion_table_autogen.cpp
deleted file mode 100644
index 149f79f458..0000000000
--- a/src/3rdparty/angle/src/libANGLE/es3_copy_conversion_table_autogen.cpp
+++ /dev/null
@@ -1,171 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by gen_copy_conversion_table.py using data from es3_copy_conversion_formats.json.
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// format_map:
-// Determining the sized internal format from a (format,type) pair.
-// Also check es3 format combinations for validity.
-
-#include "angle_gl.h"
-#include "common/debug.h"
-
-namespace gl
-{
-
-bool ValidES3CopyConversion(GLenum textureFormat, GLenum framebufferFormat)
-{
- switch (textureFormat)
- {
- case GL_ALPHA:
- switch (framebufferFormat)
- {
- case GL_BGRA_EXT:
- case GL_RGBA:
- return true;
- default:
- break;
- }
- break;
-
- case GL_BGRA_EXT:
- switch (framebufferFormat)
- {
- case GL_BGRA_EXT:
- return true;
- default:
- break;
- }
- break;
-
- case GL_LUMINANCE:
- switch (framebufferFormat)
- {
- case GL_BGRA_EXT:
- case GL_RED:
- case GL_RG:
- case GL_RGB:
- case GL_RGBA:
- return true;
- default:
- break;
- }
- break;
-
- case GL_LUMINANCE_ALPHA:
- switch (framebufferFormat)
- {
- case GL_BGRA_EXT:
- case GL_RGBA:
- return true;
- default:
- break;
- }
- break;
-
- case GL_RED:
- switch (framebufferFormat)
- {
- case GL_BGRA_EXT:
- case GL_RED:
- case GL_RG:
- case GL_RGB:
- case GL_RGBA:
- return true;
- default:
- break;
- }
- break;
-
- case GL_RED_INTEGER:
- switch (framebufferFormat)
- {
- case GL_RED_INTEGER:
- case GL_RGBA_INTEGER:
- case GL_RGB_INTEGER:
- case GL_RG_INTEGER:
- return true;
- default:
- break;
- }
- break;
-
- case GL_RG:
- switch (framebufferFormat)
- {
- case GL_BGRA_EXT:
- case GL_RG:
- case GL_RGB:
- case GL_RGBA:
- return true;
- default:
- break;
- }
- break;
-
- case GL_RGB:
- switch (framebufferFormat)
- {
- case GL_BGRA_EXT:
- case GL_RGB:
- case GL_RGBA:
- return true;
- default:
- break;
- }
- break;
-
- case GL_RGBA:
- switch (framebufferFormat)
- {
- case GL_BGRA_EXT:
- case GL_RGBA:
- return true;
- default:
- break;
- }
- break;
-
- case GL_RGBA_INTEGER:
- switch (framebufferFormat)
- {
- case GL_RGBA_INTEGER:
- return true;
- default:
- break;
- }
- break;
-
- case GL_RGB_INTEGER:
- switch (framebufferFormat)
- {
- case GL_RGBA_INTEGER:
- case GL_RGB_INTEGER:
- return true;
- default:
- break;
- }
- break;
-
- case GL_RG_INTEGER:
- switch (framebufferFormat)
- {
- case GL_RGBA_INTEGER:
- case GL_RGB_INTEGER:
- case GL_RG_INTEGER:
- return true;
- default:
- break;
- }
- break;
-
- default:
- break;
- }
-
- return false;
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/es3_format_type_combinations.json b/src/3rdparty/angle/src/libANGLE/es3_format_type_combinations.json
deleted file mode 100644
index fb12242e75..0000000000
--- a/src/3rdparty/angle/src/libANGLE/es3_format_type_combinations.json
+++ /dev/null
@@ -1,171 +0,0 @@
-{
- "Format combinations from ES 3.0.1 spec, table 3.2":
- [
- [ "GL_RGBA8", "GL_RGBA", "GL_UNSIGNED_BYTE" ],
- [ "GL_RGB5_A1", "GL_RGBA", "GL_UNSIGNED_BYTE" ],
- [ "GL_RGBA4", "GL_RGBA", "GL_UNSIGNED_BYTE" ],
- [ "GL_SRGB8_ALPHA8", "GL_RGBA", "GL_UNSIGNED_BYTE" ],
- [ "GL_RGBA8_SNORM", "GL_RGBA", "GL_BYTE" ],
- [ "GL_RGBA4", "GL_RGBA", "GL_UNSIGNED_SHORT_4_4_4_4" ],
- [ "GL_RGB10_A2", "GL_RGBA", "GL_UNSIGNED_INT_2_10_10_10_REV" ],
- [ "GL_RGB5_A1", "GL_RGBA", "GL_UNSIGNED_INT_2_10_10_10_REV" ],
- [ "GL_RGB5_A1", "GL_RGBA", "GL_UNSIGNED_SHORT_5_5_5_1" ],
- [ "GL_RGBA16F", "GL_RGBA", "GL_HALF_FLOAT" ],
- [ "GL_RGBA16F", "GL_RGBA", "GL_HALF_FLOAT_OES" ],
- [ "GL_RGBA32F", "GL_RGBA", "GL_FLOAT" ],
- [ "GL_RGBA16F", "GL_RGBA", "GL_FLOAT" ],
- [ "GL_RGBA8UI", "GL_RGBA_INTEGER", "GL_UNSIGNED_BYTE" ],
- [ "GL_RGBA8I", "GL_RGBA_INTEGER", "GL_BYTE" ],
- [ "GL_RGBA16UI", "GL_RGBA_INTEGER", "GL_UNSIGNED_SHORT" ],
- [ "GL_RGBA16I", "GL_RGBA_INTEGER", "GL_SHORT" ],
- [ "GL_RGBA32UI", "GL_RGBA_INTEGER", "GL_UNSIGNED_INT" ],
- [ "GL_RGBA32I", "GL_RGBA_INTEGER", "GL_INT" ],
- [ "GL_RGB10_A2UI", "GL_RGBA_INTEGER", "GL_UNSIGNED_INT_2_10_10_10_REV" ],
- [ "GL_RGB8", "GL_RGB", "GL_UNSIGNED_BYTE" ],
- [ "GL_RGB565", "GL_RGB", "GL_UNSIGNED_BYTE" ],
- [ "GL_SRGB8", "GL_RGB", "GL_UNSIGNED_BYTE" ],
- [ "GL_RGB8_SNORM", "GL_RGB", "GL_BYTE" ],
- [ "GL_RGB565", "GL_RGB", "GL_UNSIGNED_SHORT_5_6_5" ],
- [ "GL_R11F_G11F_B10F", "GL_RGB", "GL_UNSIGNED_INT_10F_11F_11F_REV" ],
- [ "GL_RGB9_E5", "GL_RGB", "GL_UNSIGNED_INT_5_9_9_9_REV" ],
- [ "GL_RGB16F", "GL_RGB", "GL_HALF_FLOAT" ],
- [ "GL_RGB16F", "GL_RGB", "GL_HALF_FLOAT_OES" ],
- [ "GL_R11F_G11F_B10F", "GL_RGB", "GL_HALF_FLOAT" ],
- [ "GL_R11F_G11F_B10F", "GL_RGB", "GL_HALF_FLOAT_OES" ],
- [ "GL_RGB9_E5", "GL_RGB", "GL_HALF_FLOAT" ],
- [ "GL_RGB9_E5", "GL_RGB", "GL_HALF_FLOAT_OES" ],
- [ "GL_RGB32F", "GL_RGB", "GL_FLOAT" ],
- [ "GL_RGB16F", "GL_RGB", "GL_FLOAT" ],
- [ "GL_R11F_G11F_B10F", "GL_RGB", "GL_FLOAT" ],
- [ "GL_RGB9_E5", "GL_RGB", "GL_FLOAT" ],
- [ "GL_RGB8UI", "GL_RGB_INTEGER", "GL_UNSIGNED_BYTE" ],
- [ "GL_RGB8I", "GL_RGB_INTEGER", "GL_BYTE" ],
- [ "GL_RGB16UI", "GL_RGB_INTEGER", "GL_UNSIGNED_SHORT" ],
- [ "GL_RGB16I", "GL_RGB_INTEGER", "GL_SHORT" ],
- [ "GL_RGB32UI", "GL_RGB_INTEGER", "GL_UNSIGNED_INT" ],
- [ "GL_RGB32I", "GL_RGB_INTEGER", "GL_INT" ],
- [ "GL_RG8", "GL_RG", "GL_UNSIGNED_BYTE" ],
- [ "GL_RG8_SNORM", "GL_RG", "GL_BYTE" ],
- [ "GL_RG16F", "GL_RG", "GL_HALF_FLOAT" ],
- [ "GL_RG16F", "GL_RG", "GL_HALF_FLOAT_OES" ],
- [ "GL_RG32F", "GL_RG", "GL_FLOAT" ],
- [ "GL_RG16F", "GL_RG", "GL_FLOAT" ],
- [ "GL_RG8UI", "GL_RG_INTEGER", "GL_UNSIGNED_BYTE" ],
- [ "GL_RG8I", "GL_RG_INTEGER", "GL_BYTE" ],
- [ "GL_RG16UI", "GL_RG_INTEGER", "GL_UNSIGNED_SHORT" ],
- [ "GL_RG16I", "GL_RG_INTEGER", "GL_SHORT" ],
- [ "GL_RG32UI", "GL_RG_INTEGER", "GL_UNSIGNED_INT" ],
- [ "GL_RG32I", "GL_RG_INTEGER", "GL_INT" ],
- [ "GL_R8", "GL_RED", "GL_UNSIGNED_BYTE" ],
- [ "GL_R8_SNORM", "GL_RED", "GL_BYTE" ],
- [ "GL_R16F", "GL_RED", "GL_HALF_FLOAT" ],
- [ "GL_R16F", "GL_RED", "GL_HALF_FLOAT_OES" ],
- [ "GL_R32F", "GL_RED", "GL_FLOAT" ],
- [ "GL_R16F", "GL_RED", "GL_FLOAT" ],
- [ "GL_R8UI", "GL_RED_INTEGER", "GL_UNSIGNED_BYTE" ],
- [ "GL_R8I", "GL_RED_INTEGER", "GL_BYTE" ],
- [ "GL_R16UI", "GL_RED_INTEGER", "GL_UNSIGNED_SHORT" ],
- [ "GL_R16I", "GL_RED_INTEGER", "GL_SHORT" ],
- [ "GL_R32UI", "GL_RED_INTEGER", "GL_UNSIGNED_INT" ],
- [ "GL_R32I", "GL_RED_INTEGER", "GL_INT" ]
- ],
- "Unsized formats":
- [
- [ "GL_RGBA", "GL_RGBA", "GL_UNSIGNED_BYTE" ],
- [ "GL_RGBA", "GL_RGBA", "GL_UNSIGNED_SHORT_4_4_4_4" ],
- [ "GL_RGBA", "GL_RGBA", "GL_UNSIGNED_SHORT_5_5_5_1" ],
- [ "GL_RGB", "GL_RGB", "GL_UNSIGNED_BYTE" ],
- [ "GL_RGB", "GL_RGB", "GL_UNSIGNED_SHORT_5_6_5" ],
- [ "GL_LUMINANCE_ALPHA", "GL_LUMINANCE_ALPHA", "GL_UNSIGNED_BYTE" ],
- [ "GL_LUMINANCE", "GL_LUMINANCE", "GL_UNSIGNED_BYTE" ],
- [ "GL_ALPHA", "GL_ALPHA", "GL_UNSIGNED_BYTE" ],
- [ "GL_SRGB_ALPHA_EXT", "GL_SRGB_ALPHA_EXT", "GL_UNSIGNED_BYTE" ],
- [ "GL_SRGB_EXT", "GL_SRGB_EXT", "GL_UNSIGNED_BYTE" ],
- [ "GL_RG", "GL_RG", "GL_UNSIGNED_BYTE" ],
- [ "GL_RG", "GL_RG", "GL_FLOAT" ],
- [ "GL_RG", "GL_RG", "GL_HALF_FLOAT" ],
- [ "GL_RG", "GL_RG", "GL_HALF_FLOAT_OES" ],
- [ "GL_RED", "GL_RED", "GL_UNSIGNED_BYTE" ],
- [ "GL_RED", "GL_RED", "GL_FLOAT" ],
- [ "GL_RED", "GL_RED", "GL_HALF_FLOAT" ],
- [ "GL_RED", "GL_RED", "GL_HALF_FLOAT_OES" ],
- [ "GL_DEPTH_STENCIL", "GL_DEPTH_STENCIL", "GL_UNSIGNED_INT_24_8" ]
- ],
- "Depth stencil formats":
- [
- [ "GL_DEPTH_COMPONENT16", "GL_DEPTH_COMPONENT", "GL_UNSIGNED_SHORT" ],
- [ "GL_DEPTH_COMPONENT24", "GL_DEPTH_COMPONENT", "GL_UNSIGNED_INT" ],
- [ "GL_DEPTH_COMPONENT16", "GL_DEPTH_COMPONENT", "GL_UNSIGNED_INT" ],
- [ "GL_DEPTH_COMPONENT32F", "GL_DEPTH_COMPONENT", "GL_FLOAT" ],
- [ "GL_DEPTH24_STENCIL8", "GL_DEPTH_STENCIL", "GL_UNSIGNED_INT_24_8" ],
- [ "GL_DEPTH32F_STENCIL8", "GL_DEPTH_STENCIL", "GL_FLOAT_32_UNSIGNED_INT_24_8_REV" ]
- ],
- "From GL_EXT_sRGB":
- [
- [ "GL_SRGB8_ALPHA8_EXT", "GL_SRGB_ALPHA_EXT", "GL_UNSIGNED_BYTE" ],
- [ "GL_SRGB8", "GL_SRGB_EXT", "GL_UNSIGNED_BYTE" ]
- ],
- "From GL_OES_texture_float":
- [
- [ "GL_RGBA", "GL_RGBA", "GL_FLOAT" ],
- [ "GL_RGB", "GL_RGB", "GL_FLOAT" ],
- [ "GL_LUMINANCE_ALPHA", "GL_LUMINANCE_ALPHA", "GL_FLOAT" ],
- [ "GL_LUMINANCE", "GL_LUMINANCE", "GL_FLOAT" ],
- [ "GL_ALPHA", "GL_ALPHA", "GL_FLOAT" ]
- ],
- "From GL_OES_texture_half_float":
- [
- [ "GL_RGBA", "GL_RGBA", "GL_HALF_FLOAT_OES" ],
- [ "GL_RGB", "GL_RGB", "GL_HALF_FLOAT_OES" ],
- [ "GL_LUMINANCE_ALPHA", "GL_LUMINANCE_ALPHA", "GL_HALF_FLOAT" ],
- [ "GL_LUMINANCE_ALPHA", "GL_LUMINANCE_ALPHA", "GL_HALF_FLOAT_OES" ],
- [ "GL_LUMINANCE", "GL_LUMINANCE", "GL_HALF_FLOAT" ],
- [ "GL_LUMINANCE", "GL_LUMINANCE", "GL_HALF_FLOAT_OES" ],
- [ "GL_ALPHA", "GL_ALPHA", "GL_HALF_FLOAT" ],
- [ "GL_ALPHA", "GL_ALPHA", "GL_HALF_FLOAT_OES" ]
- ],
- "From GL_EXT_texture_format_BGRA8888":
- [
- [ "GL_BGRA_EXT", "GL_BGRA_EXT", "GL_UNSIGNED_BYTE" ]
- ],
- "From GL_EXT_texture_storage":
- [
- [ "GL_ALPHA8_EXT", "GL_ALPHA", "GL_UNSIGNED_BYTE" ],
- [ "GL_LUMINANCE8_EXT", "GL_LUMINANCE", "GL_UNSIGNED_BYTE" ],
- [ "GL_LUMINANCE8_ALPHA8_EXT", "GL_LUMINANCE_ALPHA", "GL_UNSIGNED_BYTE" ],
- [ "GL_ALPHA32F_EXT", "GL_ALPHA", "GL_FLOAT" ],
- [ "GL_LUMINANCE32F_EXT", "GL_LUMINANCE", "GL_FLOAT" ],
- [ "GL_LUMINANCE_ALPHA32F_EXT", "GL_LUMINANCE_ALPHA", "GL_FLOAT" ],
- [ "GL_ALPHA16F_EXT", "GL_ALPHA", "GL_HALF_FLOAT" ],
- [ "GL_ALPHA16F_EXT", "GL_ALPHA", "GL_HALF_FLOAT_OES" ],
- [ "GL_LUMINANCE16F_EXT", "GL_LUMINANCE", "GL_HALF_FLOAT" ],
- [ "GL_LUMINANCE16F_EXT", "GL_LUMINANCE", "GL_HALF_FLOAT_OES" ],
- [ "GL_LUMINANCE_ALPHA16F_EXT", "GL_LUMINANCE_ALPHA", "GL_HALF_FLOAT" ],
- [ "GL_LUMINANCE_ALPHA16F_EXT", "GL_LUMINANCE_ALPHA", "GL_HALF_FLOAT_OES" ]
- ],
- "From GL_EXT_texture_storage and GL_EXT_texture_format_BGRA8888":
- [
- [ "GL_BGRA8_EXT", "GL_BGRA_EXT", "GL_UNSIGNED_BYTE" ],
- [ "GL_BGRA4_ANGLEX", "GL_BGRA_EXT", "GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT" ],
- [ "GL_BGRA4_ANGLEX", "GL_BGRA_EXT", "GL_UNSIGNED_BYTE" ],
- [ "GL_BGR5_A1_ANGLEX", "GL_BGRA_EXT", "GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT" ],
- [ "GL_BGR5_A1_ANGLEX", "GL_BGRA_EXT", "GL_UNSIGNED_BYTE" ]
- ],
- "From GL_ANGLE_depth_texture and OES_depth_texture":
- [
- [ "GL_DEPTH_COMPONENT32_OES", "GL_DEPTH_COMPONENT", "GL_UNSIGNED_INT_24_8" ],
- [ "GL_DEPTH_COMPONENT", "GL_DEPTH_COMPONENT", "GL_UNSIGNED_SHORT" ],
- [ "GL_DEPTH_COMPONENT", "GL_DEPTH_COMPONENT", "GL_UNSIGNED_INT" ]
- ],
- "From GL_EXT_texture_norm16":
- [
- [ "GL_R16_EXT", "GL_RED", "GL_UNSIGNED_SHORT" ],
- [ "GL_RG16_EXT", "GL_RG", "GL_UNSIGNED_SHORT" ],
- [ "GL_RGB16_EXT", "GL_RGB", "GL_UNSIGNED_SHORT" ],
- [ "GL_RGBA16_EXT", "GL_RGBA", "GL_UNSIGNED_SHORT" ],
- [ "GL_R16_SNORM_EXT", "GL_RED", "GL_SHORT" ],
- [ "GL_RG16_SNORM_EXT", "GL_RG", "GL_SHORT" ],
- [ "GL_RGB16_SNORM_EXT", "GL_RGB", "GL_SHORT" ],
- [ "GL_RGBA16_SNORM_EXT", "GL_RGBA", "GL_SHORT" ]
- ]
-}
diff --git a/src/3rdparty/angle/src/libANGLE/features.h b/src/3rdparty/angle/src/libANGLE/features.h
deleted file mode 100644
index 48a194ff0b..0000000000
--- a/src/3rdparty/angle/src/libANGLE/features.h
+++ /dev/null
@@ -1,65 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-#ifndef LIBANGLE_FEATURES_H_
-#define LIBANGLE_FEATURES_H_
-
-#include "common/platform.h"
-
-#define ANGLE_DISABLED 0
-#define ANGLE_ENABLED 1
-
-// Feature defaults
-
-// Direct3D9EX
-// The "Debug This Pixel..." feature in PIX often fails when using the
-// D3D9Ex interfaces. In order to get debug pixel to work on a Vista/Win 7
-// machine, define "ANGLE_D3D9EX=0" in your project file.
-#if !defined(ANGLE_D3D9EX)
-#define ANGLE_D3D9EX ANGLE_ENABLED
-#endif
-
-// Vsync
-// ENABLED allows Vsync to be configured at runtime
-// DISABLED disallows Vsync
-#if !defined(ANGLE_VSYNC)
-#define ANGLE_VSYNC ANGLE_ENABLED
-#endif
-
-// Program binary loading
-#if !defined(ANGLE_PROGRAM_BINARY_LOAD)
-#define ANGLE_PROGRAM_BINARY_LOAD ANGLE_ENABLED
-#endif
-
-// Append HLSL assembly to shader debug info. Defaults to enabled in Debug and off in Release.
-#if !defined(ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO)
-#if !defined(NDEBUG)
-#define ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO ANGLE_ENABLED
-#else
-#define ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO ANGLE_DISABLED
-#endif // !defined(NDEBUG)
-#endif // !defined(ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO)
-
-// Program link validation of precisions for uniforms. This feature was
-// requested by developers to allow non-conformant shaders to be used which
-// contain mismatched precisions.
-// ENABLED validate that precision for uniforms match between vertex and fragment shaders
-// DISABLED allow precision for uniforms to differ between vertex and fragment shaders
-#if !defined(ANGLE_PROGRAM_LINK_VALIDATE_UNIFORM_PRECISION)
-#define ANGLE_PROGRAM_LINK_VALIDATE_UNIFORM_PRECISION ANGLE_ENABLED
-#endif
-
-// Controls if our threading code uses std::async or falls back to single-threaded operations.
-// TODO(jmadill): Enable on Linux once STL chrono headers are updated.
-#if !defined(ANGLE_STD_ASYNC_WORKERS)
-#if defined(ANGLE_PLATFORM_WINDOWS)
-#define ANGLE_STD_ASYNC_WORKERS ANGLE_ENABLED
-#else
-#define ANGLE_STD_ASYNC_WORKERS ANGLE_DISABLED
-#endif // defined(ANGLE_PLATFORM_WINDOWS)
-#endif // !defined(ANGLE_STD_ASYNC_WORKERS)
-
-#endif // LIBANGLE_FEATURES_H_
diff --git a/src/3rdparty/angle/src/libANGLE/format_map_autogen.cpp b/src/3rdparty/angle/src/libANGLE/format_map_autogen.cpp
deleted file mode 100644
index a7f3ebafc8..0000000000
--- a/src/3rdparty/angle/src/libANGLE/format_map_autogen.cpp
+++ /dev/null
@@ -1,1570 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by gen_format_map.py using data from format_map_data.json.
-// ES3 format info from es3_format_type_combinations.json.
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// format_map:
-// Determining the sized internal format from a (format,type) pair.
-// Also check es3 format combinations for validity.
-
-#include "angle_gl.h"
-#include "common/debug.h"
-
-namespace gl
-{
-
-GLenum GetSizedFormatInternal(GLenum format, GLenum type)
-{
- switch (format)
- {
- case GL_ALPHA:
- switch (type)
- {
- case GL_FLOAT:
- return GL_ALPHA32F_EXT;
- case GL_HALF_FLOAT:
- return GL_ALPHA16F_EXT;
- case GL_HALF_FLOAT_OES:
- return GL_ALPHA16F_EXT;
- case GL_UNSIGNED_BYTE:
- return GL_ALPHA8_EXT;
- default:
- break;
- }
- break;
-
- case GL_BGRA_EXT:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return GL_BGRA8_EXT;
- case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
- return GL_BGR5_A1_ANGLEX;
- case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
- return GL_BGRA4_ANGLEX;
- case GL_UNSIGNED_SHORT_5_6_5:
- return GL_BGR565_ANGLEX;
- default:
- break;
- }
- break;
-
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
- default:
- break;
- }
- break;
-
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
- default:
- break;
- }
- break;
-
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
- default:
- break;
- }
- break;
-
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
- default:
- break;
- }
- break;
-
- case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
- default:
- break;
- }
- break;
-
- case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
- default:
- break;
- }
- break;
-
- case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
- default:
- break;
- }
- break;
-
- case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return GL_COMPRESSED_SRGB_S3TC_DXT1_EXT;
- default:
- break;
- }
- break;
-
- case GL_DEPTH_COMPONENT:
- switch (type)
- {
- case GL_FLOAT:
- return GL_DEPTH_COMPONENT32F;
- case GL_UNSIGNED_INT:
- return GL_DEPTH_COMPONENT32_OES;
- case GL_UNSIGNED_SHORT:
- return GL_DEPTH_COMPONENT16;
- default:
- break;
- }
- break;
-
- case GL_DEPTH_STENCIL:
- switch (type)
- {
- case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
- return GL_DEPTH32F_STENCIL8;
- case GL_UNSIGNED_INT_24_8:
- return GL_DEPTH24_STENCIL8;
- default:
- break;
- }
- break;
-
- case GL_LUMINANCE:
- switch (type)
- {
- case GL_FLOAT:
- return GL_LUMINANCE32F_EXT;
- case GL_HALF_FLOAT:
- return GL_LUMINANCE16F_EXT;
- case GL_HALF_FLOAT_OES:
- return GL_LUMINANCE16F_EXT;
- case GL_UNSIGNED_BYTE:
- return GL_LUMINANCE8_EXT;
- default:
- break;
- }
- break;
-
- case GL_LUMINANCE_ALPHA:
- switch (type)
- {
- case GL_FLOAT:
- return GL_LUMINANCE_ALPHA32F_EXT;
- case GL_HALF_FLOAT:
- return GL_LUMINANCE_ALPHA16F_EXT;
- case GL_HALF_FLOAT_OES:
- return GL_LUMINANCE_ALPHA16F_EXT;
- case GL_UNSIGNED_BYTE:
- return GL_LUMINANCE8_ALPHA8_EXT;
- default:
- break;
- }
- break;
-
- case GL_RED:
- switch (type)
- {
- case GL_BYTE:
- return GL_R8_SNORM;
- case GL_FLOAT:
- return GL_R32F;
- case GL_HALF_FLOAT:
- return GL_R16F;
- case GL_HALF_FLOAT_OES:
- return GL_R16F;
- case GL_SHORT:
- return GL_R16_SNORM_EXT;
- case GL_UNSIGNED_BYTE:
- return GL_R8;
- case GL_UNSIGNED_SHORT:
- return GL_R16_EXT;
- default:
- break;
- }
- break;
-
- case GL_RED_INTEGER:
- switch (type)
- {
- case GL_BYTE:
- return GL_R8I;
- case GL_INT:
- return GL_R32I;
- case GL_SHORT:
- return GL_R16I;
- case GL_UNSIGNED_BYTE:
- return GL_R8UI;
- case GL_UNSIGNED_INT:
- return GL_R32UI;
- case GL_UNSIGNED_SHORT:
- return GL_R16UI;
- default:
- break;
- }
- break;
-
- case GL_RG:
- switch (type)
- {
- case GL_BYTE:
- return GL_RG8_SNORM;
- case GL_FLOAT:
- return GL_RG32F;
- case GL_HALF_FLOAT:
- return GL_RG16F;
- case GL_HALF_FLOAT_OES:
- return GL_RG16F;
- case GL_SHORT:
- return GL_RG16_SNORM_EXT;
- case GL_UNSIGNED_BYTE:
- return GL_RG8;
- case GL_UNSIGNED_SHORT:
- return GL_RG16_EXT;
- default:
- break;
- }
- break;
-
- case GL_RGB:
- switch (type)
- {
- case GL_BYTE:
- return GL_RGB8_SNORM;
- case GL_FLOAT:
- return GL_RGB32F;
- case GL_HALF_FLOAT:
- return GL_RGB16F;
- case GL_HALF_FLOAT_OES:
- return GL_RGB16F;
- case GL_SHORT:
- return GL_RGB16_SNORM_EXT;
- case GL_UNSIGNED_BYTE:
- return GL_RGB8;
- case GL_UNSIGNED_INT_10F_11F_11F_REV:
- return GL_R11F_G11F_B10F;
- case GL_UNSIGNED_INT_5_9_9_9_REV:
- return GL_RGB9_E5;
- case GL_UNSIGNED_SHORT:
- return GL_RGB16_EXT;
- case GL_UNSIGNED_SHORT_5_6_5:
- return GL_RGB565;
- default:
- break;
- }
- break;
-
- case GL_RGBA:
- switch (type)
- {
- case GL_BYTE:
- return GL_RGBA8_SNORM;
- case GL_FLOAT:
- return GL_RGBA32F;
- case GL_HALF_FLOAT:
- return GL_RGBA16F;
- case GL_HALF_FLOAT_OES:
- return GL_RGBA16F;
- case GL_SHORT:
- return GL_RGBA16_SNORM_EXT;
- case GL_UNSIGNED_BYTE:
- return GL_RGBA8;
- case GL_UNSIGNED_INT_2_10_10_10_REV:
- return GL_RGB10_A2;
- case GL_UNSIGNED_SHORT:
- return GL_RGBA16_EXT;
- case GL_UNSIGNED_SHORT_4_4_4_4:
- return GL_RGBA4;
- case GL_UNSIGNED_SHORT_5_5_5_1:
- return GL_RGB5_A1;
- default:
- break;
- }
- break;
-
- case GL_RGBA_INTEGER:
- switch (type)
- {
- case GL_BYTE:
- return GL_RGBA8I;
- case GL_INT:
- return GL_RGBA32I;
- case GL_SHORT:
- return GL_RGBA16I;
- case GL_UNSIGNED_BYTE:
- return GL_RGBA8UI;
- case GL_UNSIGNED_INT:
- return GL_RGBA32UI;
- case GL_UNSIGNED_INT_2_10_10_10_REV:
- return GL_RGB10_A2UI;
- case GL_UNSIGNED_SHORT:
- return GL_RGBA16UI;
- default:
- break;
- }
- break;
-
- case GL_RGB_INTEGER:
- switch (type)
- {
- case GL_BYTE:
- return GL_RGB8I;
- case GL_INT:
- return GL_RGB32I;
- case GL_SHORT:
- return GL_RGB16I;
- case GL_UNSIGNED_BYTE:
- return GL_RGB8UI;
- case GL_UNSIGNED_INT:
- return GL_RGB32UI;
- case GL_UNSIGNED_SHORT:
- return GL_RGB16UI;
- default:
- break;
- }
- break;
-
- case GL_RG_INTEGER:
- switch (type)
- {
- case GL_BYTE:
- return GL_RG8I;
- case GL_INT:
- return GL_RG32I;
- case GL_SHORT:
- return GL_RG16I;
- case GL_UNSIGNED_BYTE:
- return GL_RG8UI;
- case GL_UNSIGNED_INT:
- return GL_RG32UI;
- case GL_UNSIGNED_SHORT:
- return GL_RG16UI;
- default:
- break;
- }
- break;
-
- case GL_SRGB_ALPHA_EXT:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return GL_SRGB8_ALPHA8;
- default:
- break;
- }
- break;
-
- case GL_SRGB_EXT:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return GL_SRGB8;
- default:
- break;
- }
- break;
-
- case GL_STENCIL:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return GL_STENCIL_INDEX8;
- default:
- break;
- }
- break;
-
- case GL_NONE:
- return GL_NONE;
-
- default:
- break;
- }
-
- return GL_NONE;
-}
-
-bool ValidES3Format(GLenum format)
-{
- switch (format)
- {
- case GL_ALPHA:
- case GL_BGRA_EXT:
- case GL_DEPTH_COMPONENT:
- case GL_DEPTH_STENCIL:
- case GL_LUMINANCE:
- case GL_LUMINANCE_ALPHA:
- case GL_RED:
- case GL_RED_INTEGER:
- case GL_RG:
- case GL_RGB:
- case GL_RGBA:
- case GL_RGBA_INTEGER:
- case GL_RGB_INTEGER:
- case GL_RG_INTEGER:
- case GL_SRGB_ALPHA_EXT:
- case GL_SRGB_EXT:
- return true;
-
- default:
- return false;
- }
-}
-
-bool ValidES3Type(GLenum type)
-{
- switch (type)
- {
- case GL_BYTE:
- case GL_FLOAT:
- case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
- case GL_HALF_FLOAT:
- case GL_HALF_FLOAT_OES:
- case GL_INT:
- case GL_SHORT:
- case GL_UNSIGNED_BYTE:
- case GL_UNSIGNED_INT:
- case GL_UNSIGNED_INT_10F_11F_11F_REV:
- case GL_UNSIGNED_INT_24_8:
- case GL_UNSIGNED_INT_2_10_10_10_REV:
- case GL_UNSIGNED_INT_5_9_9_9_REV:
- case GL_UNSIGNED_SHORT:
- case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
- case GL_UNSIGNED_SHORT_4_4_4_4:
- case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
- case GL_UNSIGNED_SHORT_5_5_5_1:
- case GL_UNSIGNED_SHORT_5_6_5:
- return true;
-
- default:
- return false;
- }
-}
-
-bool ValidES3FormatCombination(GLenum format, GLenum type, GLenum internalFormat)
-{
- ASSERT(ValidES3Format(format) && ValidES3Type(type));
-
- switch (format)
- {
- case GL_RGB_INTEGER:
- switch (type)
- {
- case GL_INT:
- {
- switch (internalFormat)
- {
- case GL_RGB32I:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_SHORT:
- {
- switch (internalFormat)
- {
- case GL_RGB16UI:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_SHORT:
- {
- switch (internalFormat)
- {
- case GL_RGB16I:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_BYTE:
- {
- switch (internalFormat)
- {
- case GL_RGB8UI:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_BYTE:
- {
- switch (internalFormat)
- {
- case GL_RGB8I:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_INT:
- {
- switch (internalFormat)
- {
- case GL_RGB32UI:
- return true;
- default:
- break;
- }
- break;
- }
- default:
- break;
- }
- break;
-
- case GL_RGBA_INTEGER:
- switch (type)
- {
- case GL_INT:
- {
- switch (internalFormat)
- {
- case GL_RGBA32I:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_SHORT:
- {
- switch (internalFormat)
- {
- case GL_RGBA16UI:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_INT_2_10_10_10_REV:
- {
- switch (internalFormat)
- {
- case GL_RGB10_A2UI:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_SHORT:
- {
- switch (internalFormat)
- {
- case GL_RGBA16I:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_BYTE:
- {
- switch (internalFormat)
- {
- case GL_RGBA8UI:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_BYTE:
- {
- switch (internalFormat)
- {
- case GL_RGBA8I:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_INT:
- {
- switch (internalFormat)
- {
- case GL_RGBA32UI:
- return true;
- default:
- break;
- }
- break;
- }
- default:
- break;
- }
- break;
-
- case GL_RGB:
- switch (type)
- {
- case GL_UNSIGNED_INT_10F_11F_11F_REV:
- {
- switch (internalFormat)
- {
- case GL_R11F_G11F_B10F:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_SHORT:
- {
- switch (internalFormat)
- {
- case GL_RGB16_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_SHORT:
- {
- switch (internalFormat)
- {
- case GL_RGB16_SNORM_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_BYTE:
- {
- switch (internalFormat)
- {
- case GL_RGB:
- case GL_RGB8:
- case GL_RGB565:
- case GL_SRGB8:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_SHORT_5_6_5:
- {
- switch (internalFormat)
- {
- case GL_RGB:
- case GL_RGB565:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_HALF_FLOAT_OES:
- {
- switch (internalFormat)
- {
- case GL_RGB:
- case GL_RGB16F:
- case GL_R11F_G11F_B10F:
- case GL_RGB9_E5:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_HALF_FLOAT:
- {
- switch (internalFormat)
- {
- case GL_RGB16F:
- case GL_R11F_G11F_B10F:
- case GL_RGB9_E5:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_FLOAT:
- {
- switch (internalFormat)
- {
- case GL_RGB:
- case GL_RGB32F:
- case GL_RGB16F:
- case GL_R11F_G11F_B10F:
- case GL_RGB9_E5:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_BYTE:
- {
- switch (internalFormat)
- {
- case GL_RGB8_SNORM:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_INT_5_9_9_9_REV:
- {
- switch (internalFormat)
- {
- case GL_RGB9_E5:
- return true;
- default:
- break;
- }
- break;
- }
- default:
- break;
- }
- break;
-
- case GL_LUMINANCE_ALPHA:
- switch (type)
- {
- case GL_HALF_FLOAT:
- {
- switch (internalFormat)
- {
- case GL_LUMINANCE_ALPHA:
- case GL_LUMINANCE_ALPHA16F_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_FLOAT:
- {
- switch (internalFormat)
- {
- case GL_LUMINANCE_ALPHA:
- case GL_LUMINANCE_ALPHA32F_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_BYTE:
- {
- switch (internalFormat)
- {
- case GL_LUMINANCE_ALPHA:
- case GL_LUMINANCE8_ALPHA8_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_HALF_FLOAT_OES:
- {
- switch (internalFormat)
- {
- case GL_LUMINANCE_ALPHA:
- case GL_LUMINANCE_ALPHA16F_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- default:
- break;
- }
- break;
-
- case GL_ALPHA:
- switch (type)
- {
- case GL_HALF_FLOAT:
- {
- switch (internalFormat)
- {
- case GL_ALPHA:
- case GL_ALPHA16F_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_FLOAT:
- {
- switch (internalFormat)
- {
- case GL_ALPHA:
- case GL_ALPHA32F_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_BYTE:
- {
- switch (internalFormat)
- {
- case GL_ALPHA:
- case GL_ALPHA8_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_HALF_FLOAT_OES:
- {
- switch (internalFormat)
- {
- case GL_ALPHA:
- case GL_ALPHA16F_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- default:
- break;
- }
- break;
-
- case GL_RGBA:
- switch (type)
- {
- case GL_UNSIGNED_SHORT:
- {
- switch (internalFormat)
- {
- case GL_RGBA16_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_INT_2_10_10_10_REV:
- {
- switch (internalFormat)
- {
- case GL_RGB10_A2:
- case GL_RGB5_A1:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_SHORT:
- {
- switch (internalFormat)
- {
- case GL_RGBA16_SNORM_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_SHORT_4_4_4_4:
- {
- switch (internalFormat)
- {
- case GL_RGBA:
- case GL_RGBA4:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_BYTE:
- {
- switch (internalFormat)
- {
- case GL_RGBA:
- case GL_RGBA8:
- case GL_RGB5_A1:
- case GL_RGBA4:
- case GL_SRGB8_ALPHA8:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_HALF_FLOAT_OES:
- {
- switch (internalFormat)
- {
- case GL_RGBA:
- case GL_RGBA16F:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_HALF_FLOAT:
- {
- switch (internalFormat)
- {
- case GL_RGBA16F:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_FLOAT:
- {
- switch (internalFormat)
- {
- case GL_RGBA:
- case GL_RGBA32F:
- case GL_RGBA16F:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_BYTE:
- {
- switch (internalFormat)
- {
- case GL_RGBA8_SNORM:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_SHORT_5_5_5_1:
- {
- switch (internalFormat)
- {
- case GL_RGBA:
- case GL_RGB5_A1:
- return true;
- default:
- break;
- }
- break;
- }
- default:
- break;
- }
- break;
-
- case GL_LUMINANCE:
- switch (type)
- {
- case GL_HALF_FLOAT:
- {
- switch (internalFormat)
- {
- case GL_LUMINANCE:
- case GL_LUMINANCE16F_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_FLOAT:
- {
- switch (internalFormat)
- {
- case GL_LUMINANCE:
- case GL_LUMINANCE32F_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_BYTE:
- {
- switch (internalFormat)
- {
- case GL_LUMINANCE:
- case GL_LUMINANCE8_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_HALF_FLOAT_OES:
- {
- switch (internalFormat)
- {
- case GL_LUMINANCE:
- case GL_LUMINANCE16F_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- default:
- break;
- }
- break;
-
- case GL_RG_INTEGER:
- switch (type)
- {
- case GL_INT:
- {
- switch (internalFormat)
- {
- case GL_RG32I:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_SHORT:
- {
- switch (internalFormat)
- {
- case GL_RG16UI:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_SHORT:
- {
- switch (internalFormat)
- {
- case GL_RG16I:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_BYTE:
- {
- switch (internalFormat)
- {
- case GL_RG8UI:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_BYTE:
- {
- switch (internalFormat)
- {
- case GL_RG8I:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_INT:
- {
- switch (internalFormat)
- {
- case GL_RG32UI:
- return true;
- default:
- break;
- }
- break;
- }
- default:
- break;
- }
- break;
-
- case GL_RED_INTEGER:
- switch (type)
- {
- case GL_INT:
- {
- switch (internalFormat)
- {
- case GL_R32I:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_SHORT:
- {
- switch (internalFormat)
- {
- case GL_R16UI:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_SHORT:
- {
- switch (internalFormat)
- {
- case GL_R16I:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_BYTE:
- {
- switch (internalFormat)
- {
- case GL_R8UI:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_BYTE:
- {
- switch (internalFormat)
- {
- case GL_R8I:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_INT:
- {
- switch (internalFormat)
- {
- case GL_R32UI:
- return true;
- default:
- break;
- }
- break;
- }
- default:
- break;
- }
- break;
-
- case GL_RED:
- switch (type)
- {
- case GL_UNSIGNED_SHORT:
- {
- switch (internalFormat)
- {
- case GL_R16_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_SHORT:
- {
- switch (internalFormat)
- {
- case GL_R16_SNORM_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_FLOAT:
- {
- switch (internalFormat)
- {
- case GL_RED:
- case GL_R32F:
- case GL_R16F:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_HALF_FLOAT_OES:
- {
- switch (internalFormat)
- {
- case GL_RED:
- case GL_R16F:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_HALF_FLOAT:
- {
- switch (internalFormat)
- {
- case GL_RED:
- case GL_R16F:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_BYTE:
- {
- switch (internalFormat)
- {
- case GL_RED:
- case GL_R8:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_BYTE:
- {
- switch (internalFormat)
- {
- case GL_R8_SNORM:
- return true;
- default:
- break;
- }
- break;
- }
- default:
- break;
- }
- break;
-
- case GL_DEPTH_COMPONENT:
- switch (type)
- {
- case GL_UNSIGNED_INT:
- {
- switch (internalFormat)
- {
- case GL_DEPTH_COMPONENT:
- case GL_DEPTH_COMPONENT24:
- case GL_DEPTH_COMPONENT16:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_INT_24_8:
- {
- switch (internalFormat)
- {
- case GL_DEPTH_COMPONENT32_OES:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_FLOAT:
- {
- switch (internalFormat)
- {
- case GL_DEPTH_COMPONENT32F:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_SHORT:
- {
- switch (internalFormat)
- {
- case GL_DEPTH_COMPONENT:
- case GL_DEPTH_COMPONENT16:
- return true;
- default:
- break;
- }
- break;
- }
- default:
- break;
- }
- break;
-
- case GL_DEPTH_STENCIL:
- switch (type)
- {
- case GL_UNSIGNED_INT_24_8:
- {
- switch (internalFormat)
- {
- case GL_DEPTH_STENCIL:
- case GL_DEPTH24_STENCIL8:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
- {
- switch (internalFormat)
- {
- case GL_DEPTH32F_STENCIL8:
- return true;
- default:
- break;
- }
- break;
- }
- default:
- break;
- }
- break;
-
- case GL_SRGB_EXT:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- {
- switch (internalFormat)
- {
- case GL_SRGB_EXT:
- case GL_SRGB8:
- return true;
- default:
- break;
- }
- break;
- }
- default:
- break;
- }
- break;
-
- case GL_SRGB_ALPHA_EXT:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- {
- switch (internalFormat)
- {
- case GL_SRGB_ALPHA_EXT:
- case GL_SRGB8_ALPHA8_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- default:
- break;
- }
- break;
-
- case GL_RG:
- switch (type)
- {
- case GL_UNSIGNED_SHORT:
- {
- switch (internalFormat)
- {
- case GL_RG16_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_SHORT:
- {
- switch (internalFormat)
- {
- case GL_RG16_SNORM_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_FLOAT:
- {
- switch (internalFormat)
- {
- case GL_RG:
- case GL_RG32F:
- case GL_RG16F:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_HALF_FLOAT_OES:
- {
- switch (internalFormat)
- {
- case GL_RG:
- case GL_RG16F:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_HALF_FLOAT:
- {
- switch (internalFormat)
- {
- case GL_RG:
- case GL_RG16F:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_BYTE:
- {
- switch (internalFormat)
- {
- case GL_RG:
- case GL_RG8:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_BYTE:
- {
- switch (internalFormat)
- {
- case GL_RG8_SNORM:
- return true;
- default:
- break;
- }
- break;
- }
- default:
- break;
- }
- break;
-
- case GL_BGRA_EXT:
- switch (type)
- {
- case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
- {
- switch (internalFormat)
- {
- case GL_BGRA4_ANGLEX:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_BYTE:
- {
- switch (internalFormat)
- {
- case GL_BGRA8_EXT:
- case GL_BGRA4_ANGLEX:
- case GL_BGR5_A1_ANGLEX:
- case GL_BGRA_EXT:
- return true;
- default:
- break;
- }
- break;
- }
- case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
- {
- switch (internalFormat)
- {
- case GL_BGR5_A1_ANGLEX:
- return true;
- default:
- break;
- }
- break;
- }
- default:
- break;
- }
- break;
-
- default:
- UNREACHABLE();
- break;
- }
-
- return false;
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/format_map_data.json b/src/3rdparty/angle/src/libANGLE/format_map_data.json
deleted file mode 100644
index a4f1c98b4d..0000000000
--- a/src/3rdparty/angle/src/libANGLE/format_map_data.json
+++ /dev/null
@@ -1,142 +0,0 @@
-{
- "GL_RGBA": {
- "GL_UNSIGNED_BYTE": "GL_RGBA8",
- "GL_UNSIGNED_SHORT": "GL_RGBA16_EXT",
- "GL_BYTE": "GL_RGBA8_SNORM",
- "GL_SHORT": "GL_RGBA16_SNORM_EXT",
- "GL_UNSIGNED_SHORT_4_4_4_4": "GL_RGBA4",
- "GL_UNSIGNED_SHORT_5_5_5_1": "GL_RGB5_A1",
- "GL_UNSIGNED_INT_2_10_10_10_REV": "GL_RGB10_A2",
- "GL_FLOAT": "GL_RGBA32F",
- "GL_HALF_FLOAT": "GL_RGBA16F",
- "GL_HALF_FLOAT_OES": "GL_RGBA16F"
- },
- "GL_RGBA_INTEGER": {
- "GL_UNSIGNED_BYTE": "GL_RGBA8UI",
- "GL_BYTE": "GL_RGBA8I",
- "GL_UNSIGNED_SHORT": "GL_RGBA16UI",
- "GL_SHORT": "GL_RGBA16I",
- "GL_UNSIGNED_INT": "GL_RGBA32UI",
- "GL_INT": "GL_RGBA32I",
- "GL_UNSIGNED_INT_2_10_10_10_REV": "GL_RGB10_A2UI"
- },
- "GL_RGB": {
- "GL_UNSIGNED_BYTE": "GL_RGB8",
- "GL_UNSIGNED_SHORT": "GL_RGB16_EXT",
- "GL_BYTE": "GL_RGB8_SNORM",
- "GL_SHORT": "GL_RGB16_SNORM_EXT",
- "GL_UNSIGNED_SHORT_5_6_5": "GL_RGB565",
- "GL_UNSIGNED_INT_10F_11F_11F_REV": "GL_R11F_G11F_B10F",
- "GL_UNSIGNED_INT_5_9_9_9_REV": "GL_RGB9_E5",
- "GL_FLOAT": "GL_RGB32F",
- "GL_HALF_FLOAT": "GL_RGB16F",
- "GL_HALF_FLOAT_OES": "GL_RGB16F"
- },
- "GL_RGB_INTEGER": {
- "GL_UNSIGNED_BYTE": "GL_RGB8UI",
- "GL_BYTE": "GL_RGB8I", "GL_UNSIGNED_SHORT": "GL_RGB16UI",
- "GL_SHORT": "GL_RGB16I",
- "GL_UNSIGNED_INT": "GL_RGB32UI",
- "GL_INT": "GL_RGB32I"
- },
- "GL_RG": {
- "GL_UNSIGNED_BYTE": "GL_RG8",
- "GL_UNSIGNED_SHORT": "GL_RG16_EXT",
- "GL_BYTE": "GL_RG8_SNORM",
- "GL_SHORT": "GL_RG16_SNORM_EXT",
- "GL_FLOAT": "GL_RG32F",
- "GL_HALF_FLOAT": "GL_RG16F",
- "GL_HALF_FLOAT_OES": "GL_RG16F"
- },
- "GL_RG_INTEGER": {
- "GL_UNSIGNED_BYTE": "GL_RG8UI",
- "GL_BYTE": "GL_RG8I",
- "GL_UNSIGNED_SHORT": "GL_RG16UI",
- "GL_SHORT": "GL_RG16I",
- "GL_UNSIGNED_INT": "GL_RG32UI",
- "GL_INT": "GL_RG32I"
- },
- "GL_RED": {
- "GL_UNSIGNED_BYTE": "GL_R8",
- "GL_UNSIGNED_SHORT": "GL_R16_EXT",
- "GL_BYTE": "GL_R8_SNORM",
- "GL_SHORT": "GL_R16_SNORM_EXT",
- "GL_FLOAT": "GL_R32F",
- "GL_HALF_FLOAT": "GL_R16F",
- "GL_HALF_FLOAT_OES": "GL_R16F"
- },
- "GL_RED_INTEGER": {
- "GL_UNSIGNED_BYTE": "GL_R8UI",
- "GL_BYTE": "GL_R8I",
- "GL_UNSIGNED_SHORT": "GL_R16UI",
- "GL_SHORT": "GL_R16I",
- "GL_UNSIGNED_INT": "GL_R32UI",
- "GL_INT": "GL_R32I"
- },
- "GL_LUMINANCE_ALPHA": {
- "GL_UNSIGNED_BYTE": "GL_LUMINANCE8_ALPHA8_EXT",
- "GL_FLOAT": "GL_LUMINANCE_ALPHA32F_EXT",
- "GL_HALF_FLOAT": "GL_LUMINANCE_ALPHA16F_EXT",
- "GL_HALF_FLOAT_OES": "GL_LUMINANCE_ALPHA16F_EXT"
- },
- "GL_LUMINANCE": {
- "GL_UNSIGNED_BYTE": "GL_LUMINANCE8_EXT",
- "GL_FLOAT": "GL_LUMINANCE32F_EXT",
- "GL_HALF_FLOAT": "GL_LUMINANCE16F_EXT",
- "GL_HALF_FLOAT_OES": "GL_LUMINANCE16F_EXT"
- },
- "GL_ALPHA": {
- "GL_UNSIGNED_BYTE": "GL_ALPHA8_EXT",
- "GL_FLOAT": "GL_ALPHA32F_EXT",
- "GL_HALF_FLOAT": "GL_ALPHA16F_EXT",
- "GL_HALF_FLOAT_OES": "GL_ALPHA16F_EXT"
- },
- "GL_BGRA_EXT": {
- "GL_UNSIGNED_BYTE": "GL_BGRA8_EXT",
- "GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT": "GL_BGRA4_ANGLEX",
- "GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT": "GL_BGR5_A1_ANGLEX",
- "GL_UNSIGNED_SHORT_5_6_5": "GL_BGR565_ANGLEX"
- },
- "GL_SRGB_EXT": {
- "GL_UNSIGNED_BYTE": "GL_SRGB8"
- },
- "GL_SRGB_ALPHA_EXT": {
- "GL_UNSIGNED_BYTE": "GL_SRGB8_ALPHA8"
- },
- "GL_COMPRESSED_RGB_S3TC_DXT1_EXT": {
- "GL_UNSIGNED_BYTE": "GL_COMPRESSED_RGB_S3TC_DXT1_EXT"
- },
- "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT": {
- "GL_UNSIGNED_BYTE": "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT"
- },
- "GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE": {
- "GL_UNSIGNED_BYTE": "GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE"
- },
- "GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE": {
- "GL_UNSIGNED_BYTE": "GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE"
- },
- "GL_COMPRESSED_SRGB_S3TC_DXT1_EXT": {
- "GL_UNSIGNED_BYTE": "GL_COMPRESSED_SRGB_S3TC_DXT1_EXT"
- },
- "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT": {
- "GL_UNSIGNED_BYTE": "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT"
- },
- "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT": {
- "GL_UNSIGNED_BYTE": "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT"
- },
- "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT": {
- "GL_UNSIGNED_BYTE": "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT"
- },
- "GL_DEPTH_COMPONENT": {
- "GL_UNSIGNED_SHORT": "GL_DEPTH_COMPONENT16",
- "GL_UNSIGNED_INT": "GL_DEPTH_COMPONENT32_OES",
- "GL_FLOAT": "GL_DEPTH_COMPONENT32F"
- },
- "GL_STENCIL": {
- "GL_UNSIGNED_BYTE": "GL_STENCIL_INDEX8"
- },
- "GL_DEPTH_STENCIL": {
- "GL_UNSIGNED_INT_24_8": "GL_DEPTH24_STENCIL8",
- "GL_FLOAT_32_UNSIGNED_INT_24_8_REV": "GL_DEPTH32F_STENCIL8"
- }
-}
diff --git a/src/3rdparty/angle/src/libANGLE/formatutils.cpp b/src/3rdparty/angle/src/libANGLE/formatutils.cpp
deleted file mode 100644
index 67bb2efdea..0000000000
--- a/src/3rdparty/angle/src/libANGLE/formatutils.cpp
+++ /dev/null
@@ -1,2133 +0,0 @@
-//
-// Copyright (c) 2013-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// formatutils.cpp: Queries for GL image formats.
-
-#include "libANGLE/formatutils.h"
-
-#include "common/mathutil.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Framebuffer.h"
-
-using namespace angle;
-
-namespace gl
-{
-
-// ES2 requires that format is equal to internal format at all glTex*Image2D entry points and the implementation
-// can decide the true, sized, internal format. The ES2FormatMap determines the internal format for all valid
-// format and type combinations.
-GLenum GetSizedFormatInternal(GLenum format, GLenum type);
-
-namespace
-{
-using InternalFormatInfoMap =
- std::unordered_map<GLenum, std::unordered_map<GLenum, InternalFormat>>;
-
-} // anonymous namespace
-
-FormatType::FormatType() : format(GL_NONE), type(GL_NONE)
-{
-}
-
-FormatType::FormatType(GLenum format_, GLenum type_) : format(format_), type(type_)
-{
-}
-
-bool FormatType::operator<(const FormatType &other) const
-{
- if (format != other.format)
- return format < other.format;
- return type < other.type;
-}
-
-Type::Type()
- : bytes(0),
- bytesShift(0),
- specialInterpretation(false)
-{
-}
-
-static Type GenTypeInfo(GLuint bytes, bool specialInterpretation)
-{
- Type info;
- info.bytes = bytes;
- GLuint i = 0;
- while ((1u << i) < bytes)
- {
- ++i;
- }
- info.bytesShift = i;
- ASSERT((1u << info.bytesShift) == bytes);
- info.specialInterpretation = specialInterpretation;
- return info;
-}
-
-bool operator<(const Type& a, const Type& b)
-{
- return memcmp(&a, &b, sizeof(Type)) < 0;
-}
-
-// Information about internal formats
-static bool AlwaysSupported(const Version &, const Extensions &)
-{
- return true;
-}
-
-static bool NeverSupported(const Version &, const Extensions &)
-{
- return false;
-}
-
-template <GLuint minCoreGLMajorVersion, GLuint minCoreGLMinorVersion>
-static bool RequireES(const Version &clientVersion, const Extensions &)
-{
- return clientVersion >= Version(minCoreGLMajorVersion, minCoreGLMinorVersion);
-}
-
-// Pointer to a boolean memeber of the Extensions struct
-typedef bool(Extensions::*ExtensionBool);
-
-// Check support for a single extension
-template <ExtensionBool bool1>
-static bool RequireExt(const Version &, const Extensions &extensions)
-{
- return extensions.*bool1;
-}
-
-// Check for a minimum client version or a single extension
-template <GLuint minCoreGLMajorVersion, GLuint minCoreGLMinorVersion, ExtensionBool bool1>
-static bool RequireESOrExt(const Version &clientVersion, const Extensions &extensions)
-{
- return clientVersion >= Version(minCoreGLMajorVersion, minCoreGLMinorVersion) ||
- extensions.*bool1;
-}
-
-// Check for a minimum client version or two extensions
-template <GLuint minCoreGLMajorVersion,
- GLuint minCoreGLMinorVersion,
- ExtensionBool bool1,
- ExtensionBool bool2>
-static bool RequireESOrExtAndExt(const Version &clientVersion, const Extensions &extensions)
-{
- return clientVersion >= Version(minCoreGLMajorVersion, minCoreGLMinorVersion) ||
- (extensions.*bool1 && extensions.*bool2);
-}
-
-// Check for a minimum client version or at least one of two extensions
-template <GLuint minCoreGLMajorVersion,
- GLuint minCoreGLMinorVersion,
- ExtensionBool bool1,
- ExtensionBool bool2>
-static bool RequireESOrExtOrExt(const Version &clientVersion, const Extensions &extensions)
-{
- return clientVersion >= Version(minCoreGLMajorVersion, minCoreGLMinorVersion) ||
- extensions.*bool1 || extensions.*bool2;
-}
-
-// Check support for two extensions
-template <ExtensionBool bool1, ExtensionBool bool2>
-static bool RequireExtAndExt(const Version &, const Extensions &extensions)
-{
- return extensions.*bool1 && extensions.*bool2;
-}
-
-// Check support for either of two extensions
-template <ExtensionBool bool1, ExtensionBool bool2>
-static bool RequireExtOrExt(const Version &, const Extensions &extensions)
-{
- return extensions.*bool1 || extensions.*bool2;
-}
-
-// Special function for half float formats with three or four channels.
-static bool HalfFloatSupport(const Version &clientVersion, const Extensions &extensions)
-{
- return clientVersion >= Version(3, 0) || extensions.textureHalfFloat;
-}
-
-static bool HalfFloatRGBRenderableSupport(const Version &clientVersion,
- const Extensions &extensions)
-{
- return HalfFloatSupport(clientVersion, extensions) && extensions.colorBufferHalfFloat;
-}
-
-static bool HalfFloatRGBARenderableSupport(const Version &clientVersion,
- const Extensions &extensions)
-{
- return HalfFloatSupport(clientVersion, extensions) &&
- (extensions.colorBufferHalfFloat || extensions.colorBufferFloat);
-}
-
-// Special function for half float formats with one or two channels.
-
-// R16F, RG16F
-static bool HalfFloatRGSupport(const Version &clientVersion, const Extensions &extensions)
-{
- return clientVersion >= Version(3, 0) || (extensions.textureHalfFloat && extensions.textureRG);
-}
-
-// R16F, RG16F
-static bool HalfFloatRGRenderableSupport(const Version &clientVersion, const Extensions &extensions)
-{
- // It's unclear if EXT_color_buffer_half_float gives renderability to non-OES half float
- // textures
- return HalfFloatRGSupport(clientVersion, extensions) &&
- (extensions.colorBufferHalfFloat || extensions.colorBufferFloat);
-}
-
-// RED + HALF_FLOAT_OES, RG + HALF_FLOAT_OES
-static bool UnsizedHalfFloatOESRGSupport(const Version &, const Extensions &extensions)
-{
- return extensions.textureHalfFloat && extensions.textureRG;
-}
-
-// RED + HALF_FLOAT_OES, RG + HALF_FLOAT_OES
-static bool UnsizedHalfFloatOESRGRenderableSupport(const Version &clientVersion,
- const Extensions &extensions)
-{
- return UnsizedHalfFloatOESRGSupport(clientVersion, extensions) &&
- extensions.colorBufferHalfFloat;
-}
-
-// RGB + HALF_FLOAT_OES, RGBA + HALF_FLOAT_OES
-static bool UnsizedHalfFloatOESSupport(const Version &clientVersion, const Extensions &extensions)
-{
- return extensions.textureHalfFloat;
-}
-
-// RGB + HALF_FLOAT_OES, RGBA + HALF_FLOAT_OES
-static bool UnsizedHalfFloatOESRenderableSupport(const Version &clientVersion,
- const Extensions &extensions)
-{
- return UnsizedHalfFloatOESSupport(clientVersion, extensions) && extensions.colorBufferHalfFloat;
-}
-
-// Special function for float formats with three or four channels.
-
-// RGB32F, RGBA32F
-static bool FloatSupport(const Version &clientVersion, const Extensions &extensions)
-{
- return clientVersion >= Version(3, 0) || extensions.textureFloat;
-}
-
-// RGB32F
-static bool FloatRGBRenderableSupport(const Version &clientVersion, const Extensions &extensions)
-{
- return FloatSupport(clientVersion, extensions) && extensions.colorBufferFloatRGB;
-}
-
-// RGBA32F
-static bool FloatRGBARenderableSupport(const Version &clientVersion, const Extensions &extensions)
-{
- return FloatSupport(clientVersion, extensions) &&
- (extensions.colorBufferFloat || extensions.colorBufferFloatRGBA);
-}
-
-// RGB + FLOAT, RGBA + FLOAT
-static bool UnsizedFloatSupport(const Version &clientVersion, const Extensions &extensions)
-{
- return extensions.textureFloat;
-}
-
-// RGB + FLOAT
-static bool UnsizedFloatRGBRenderableSupport(const Version &clientVersion,
- const Extensions &extensions)
-{
- return UnsizedFloatSupport(clientVersion, extensions) && extensions.colorBufferFloatRGB;
-}
-
-// RGBA + FLOAT
-static bool UnsizedFloatRGBARenderableSupport(const Version &clientVersion,
- const Extensions &extensions)
-{
- return UnsizedFloatSupport(clientVersion, extensions) &&
- (extensions.colorBufferFloatRGBA || extensions.colorBufferFloat);
-}
-
-// Special function for float formats with one or two channels.
-
-// R32F, RG32F
-static bool FloatRGSupport(const Version &clientVersion, const Extensions &extensions)
-{
- return clientVersion >= Version(3, 0) || (extensions.textureFloat && extensions.textureRG);
-}
-
-// R32F, RG32F
-static bool FloatRGRenderableSupport(const Version &clientVersion, const Extensions &extensions)
-{
- return FloatRGSupport(clientVersion, extensions) && extensions.colorBufferFloat;
-}
-
-// RED + FLOAT, RG + FLOAT
-static bool UnsizedFloatRGSupport(const Version &clientVersion, const Extensions &extensions)
-{
- return extensions.textureFloat && extensions.textureRG;
-}
-
-// RED + FLOAT, RG + FLOAT
-static bool UnsizedFloatRGRenderableSupport(const Version &clientVersion,
- const Extensions &extensions)
-{
- return FloatRGSupport(clientVersion, extensions) && extensions.colorBufferFloat;
-}
-
-InternalFormat::InternalFormat()
- : internalFormat(GL_NONE),
- sized(false),
- sizedInternalFormat(GL_NONE),
- redBits(0),
- greenBits(0),
- blueBits(0),
- luminanceBits(0),
- alphaBits(0),
- sharedBits(0),
- depthBits(0),
- stencilBits(0),
- pixelBytes(0),
- componentCount(0),
- compressed(false),
- compressedBlockWidth(0),
- compressedBlockHeight(0),
- format(GL_NONE),
- type(GL_NONE),
- componentType(GL_NONE),
- colorEncoding(GL_NONE),
- textureSupport(NeverSupported),
- renderSupport(NeverSupported),
- filterSupport(NeverSupported)
-{
-}
-
-InternalFormat::InternalFormat(const InternalFormat &other) = default;
-
-bool InternalFormat::isLUMA() const
-{
- return ((redBits + greenBits + blueBits + depthBits + stencilBits) == 0 &&
- (luminanceBits + alphaBits) > 0);
-}
-
-GLenum InternalFormat::getReadPixelsFormat() const
-{
- return format;
-}
-
-GLenum InternalFormat::getReadPixelsType(const Version &version) const
-{
- switch (type)
- {
- case GL_HALF_FLOAT:
- case GL_HALF_FLOAT_OES:
- if (version < Version(3, 0))
- {
- // The internal format may have a type of GL_HALF_FLOAT but when exposing this type
- // as the IMPLEMENTATION_READ_TYPE, only HALF_FLOAT_OES is allowed by
- // OES_texture_half_float. HALF_FLOAT becomes core in ES3 and is acceptable to use
- // as an IMPLEMENTATION_READ_TYPE.
- return GL_HALF_FLOAT_OES;
- }
- else
- {
- return GL_HALF_FLOAT;
- }
-
- default:
- return type;
- }
-}
-
-bool InternalFormat::isRequiredRenderbufferFormat(const Version &version) const
-{
- // GLES 3.0.5 section 4.4.2.2:
- // "Implementations are required to support the same internal formats for renderbuffers as the
- // required formats for textures enumerated in section 3.8.3.1, with the exception of the color
- // formats labelled "texture-only"."
- if (!sized || compressed)
- {
- return false;
- }
-
- // Luma formats.
- if (isLUMA())
- {
- return false;
- }
-
- // Depth/stencil formats.
- if (depthBits > 0 || stencilBits > 0)
- {
- // GLES 2.0.25 table 4.5.
- // GLES 3.0.5 section 3.8.3.1.
- // GLES 3.1 table 8.14.
-
- // Required formats in all versions.
- switch (internalFormat)
- {
- case GL_DEPTH_COMPONENT16:
- case GL_STENCIL_INDEX8:
- // Note that STENCIL_INDEX8 is not mentioned in GLES 3.0.5 section 3.8.3.1, but it
- // is in section 4.4.2.2.
- return true;
- default:
- break;
- }
- if (version.major < 3)
- {
- return false;
- }
- // Required formats in GLES 3.0 and up.
- switch (internalFormat)
- {
- case GL_DEPTH_COMPONENT32F:
- case GL_DEPTH_COMPONENT24:
- case GL_DEPTH32F_STENCIL8:
- case GL_DEPTH24_STENCIL8:
- return true;
- default:
- return false;
- }
- }
-
- // RGBA formats.
- // GLES 2.0.25 table 4.5.
- // GLES 3.0.5 section 3.8.3.1.
- // GLES 3.1 table 8.13.
-
- // Required formats in all versions.
- switch (internalFormat)
- {
- case GL_RGBA4:
- case GL_RGB5_A1:
- case GL_RGB565:
- return true;
- default:
- break;
- }
- if (version.major < 3)
- {
- return false;
- }
-
- if (format == GL_BGRA_EXT)
- {
- return false;
- }
-
- switch (componentType)
- {
- case GL_SIGNED_NORMALIZED:
- case GL_FLOAT:
- return false;
- case GL_UNSIGNED_INT:
- case GL_INT:
- // Integer RGB formats are not required renderbuffer formats.
- if (alphaBits == 0 && blueBits != 0)
- {
- return false;
- }
- // All integer R and RG formats are required.
- // Integer RGBA formats including RGB10_A2_UI are required.
- return true;
- case GL_UNSIGNED_NORMALIZED:
- if (internalFormat == GL_SRGB8)
- {
- return false;
- }
- return true;
- default:
- UNREACHABLE();
- return false;
- }
-}
-
-Format::Format(GLenum internalFormat) : Format(GetSizedInternalFormatInfo(internalFormat))
-{
-}
-
-Format::Format(const InternalFormat &internalFormat) : info(&internalFormat)
-{
-}
-
-Format::Format(GLenum internalFormat, GLenum type)
- : info(&GetInternalFormatInfo(internalFormat, type))
-{
-}
-
-Format::Format(const Format &other) = default;
-Format &Format::operator=(const Format &other) = default;
-
-bool Format::valid() const
-{
- return info->internalFormat != GL_NONE;
-}
-
-// static
-bool Format::SameSized(const Format &a, const Format &b)
-{
- return a.info->sizedInternalFormat == b.info->sizedInternalFormat;
-}
-
-static GLenum EquivalentBlitInternalFormat(GLenum internalformat)
-{
- // BlitFramebuffer works if the color channels are identically
- // sized, even if there is a swizzle (for example, blitting from a
- // multisampled RGBA8 renderbuffer to a BGRA8 texture). This could
- // be expanded and/or autogenerated if that is found necessary.
- if (internalformat == GL_BGRA8_EXT)
- return GL_RGBA8;
- return internalformat;
-}
-
-// static
-bool Format::EquivalentForBlit(const Format &a, const Format &b)
-{
- return (EquivalentBlitInternalFormat(a.info->sizedInternalFormat) ==
- EquivalentBlitInternalFormat(b.info->sizedInternalFormat));
-}
-
-// static
-Format Format::Invalid()
-{
- static Format invalid(GL_NONE, GL_NONE);
- return invalid;
-}
-
-std::ostream &operator<<(std::ostream &os, const Format &fmt)
-{
- // TODO(ynovikov): return string representation when available
- return FmtHexShort(os, fmt.info->sizedInternalFormat);
-}
-
-bool InternalFormat::operator==(const InternalFormat &other) const
-{
- // We assume all internal formats are unique if they have the same internal format and type
- return internalFormat == other.internalFormat && type == other.type;
-}
-
-bool InternalFormat::operator!=(const InternalFormat &other) const
-{
- return !(*this == other);
-}
-
-void InsertFormatInfo(InternalFormatInfoMap *map, const InternalFormat &formatInfo)
-{
- ASSERT(!formatInfo.sized || (*map).count(formatInfo.internalFormat) == 0);
- ASSERT((*map)[formatInfo.internalFormat].count(formatInfo.type) == 0);
- (*map)[formatInfo.internalFormat][formatInfo.type] = formatInfo;
-}
-
-void AddRGBAFormat(InternalFormatInfoMap *map,
- GLenum internalFormat,
- bool sized,
- GLuint red,
- GLuint green,
- GLuint blue,
- GLuint alpha,
- GLuint shared,
- GLenum format,
- GLenum type,
- GLenum componentType,
- bool srgb,
- InternalFormat::SupportCheckFunction textureSupport,
- InternalFormat::SupportCheckFunction renderSupport,
- InternalFormat::SupportCheckFunction filterSupport)
-{
- InternalFormat formatInfo;
- formatInfo.internalFormat = internalFormat;
- formatInfo.sized = sized;
- formatInfo.sizedInternalFormat =
- sized ? internalFormat : GetSizedFormatInternal(internalFormat, type);
- formatInfo.redBits = red;
- formatInfo.greenBits = green;
- formatInfo.blueBits = blue;
- formatInfo.alphaBits = alpha;
- formatInfo.sharedBits = shared;
- formatInfo.pixelBytes = (red + green + blue + alpha + shared) / 8;
- formatInfo.componentCount =
- ((red > 0) ? 1 : 0) + ((green > 0) ? 1 : 0) + ((blue > 0) ? 1 : 0) + ((alpha > 0) ? 1 : 0);
- formatInfo.format = format;
- formatInfo.type = type;
- formatInfo.componentType = componentType;
- formatInfo.colorEncoding = (srgb ? GL_SRGB : GL_LINEAR);
- formatInfo.textureSupport = textureSupport;
- formatInfo.renderSupport = renderSupport;
- formatInfo.filterSupport = filterSupport;
-
- InsertFormatInfo(map, formatInfo);
-}
-
-static void AddLUMAFormat(InternalFormatInfoMap *map,
- GLenum internalFormat,
- bool sized,
- GLuint luminance,
- GLuint alpha,
- GLenum format,
- GLenum type,
- GLenum componentType,
- InternalFormat::SupportCheckFunction textureSupport,
- InternalFormat::SupportCheckFunction renderSupport,
- InternalFormat::SupportCheckFunction filterSupport)
-{
- InternalFormat formatInfo;
- formatInfo.internalFormat = internalFormat;
- formatInfo.sized = sized;
- formatInfo.sizedInternalFormat =
- sized ? internalFormat : GetSizedFormatInternal(internalFormat, type);
- formatInfo.luminanceBits = luminance;
- formatInfo.alphaBits = alpha;
- formatInfo.pixelBytes = (luminance + alpha) / 8;
- formatInfo.componentCount = ((luminance > 0) ? 1 : 0) + ((alpha > 0) ? 1 : 0);
- formatInfo.format = format;
- formatInfo.type = type;
- formatInfo.componentType = componentType;
- formatInfo.colorEncoding = GL_LINEAR;
- formatInfo.textureSupport = textureSupport;
- formatInfo.renderSupport = renderSupport;
- formatInfo.filterSupport = filterSupport;
-
- InsertFormatInfo(map, formatInfo);
-}
-
-void AddDepthStencilFormat(InternalFormatInfoMap *map,
- GLenum internalFormat,
- bool sized,
- GLuint depthBits,
- GLuint stencilBits,
- GLuint unusedBits,
- GLenum format,
- GLenum type,
- GLenum componentType,
- InternalFormat::SupportCheckFunction textureSupport,
- InternalFormat::SupportCheckFunction renderSupport,
- InternalFormat::SupportCheckFunction filterSupport)
-{
- InternalFormat formatInfo;
- formatInfo.internalFormat = internalFormat;
- formatInfo.sized = sized;
- formatInfo.sizedInternalFormat =
- sized ? internalFormat : GetSizedFormatInternal(internalFormat, type);
- formatInfo.depthBits = depthBits;
- formatInfo.stencilBits = stencilBits;
- formatInfo.pixelBytes = (depthBits + stencilBits + unusedBits) / 8;
- formatInfo.componentCount = ((depthBits > 0) ? 1 : 0) + ((stencilBits > 0) ? 1 : 0);
- formatInfo.format = format;
- formatInfo.type = type;
- formatInfo.componentType = componentType;
- formatInfo.colorEncoding = GL_LINEAR;
- formatInfo.textureSupport = textureSupport;
- formatInfo.renderSupport = renderSupport;
- formatInfo.filterSupport = filterSupport;
-
- InsertFormatInfo(map, formatInfo);
-}
-
-void AddCompressedFormat(InternalFormatInfoMap *map,
- GLenum internalFormat,
- GLuint compressedBlockWidth,
- GLuint compressedBlockHeight,
- GLuint compressedBlockSize,
- GLuint componentCount,
- GLenum format,
- GLenum type,
- bool srgb,
- InternalFormat::SupportCheckFunction textureSupport,
- InternalFormat::SupportCheckFunction renderSupport,
- InternalFormat::SupportCheckFunction filterSupport)
-{
- InternalFormat formatInfo;
- formatInfo.internalFormat = internalFormat;
- formatInfo.sized = true;
- formatInfo.sizedInternalFormat = internalFormat;
- formatInfo.compressedBlockWidth = compressedBlockWidth;
- formatInfo.compressedBlockHeight = compressedBlockHeight;
- formatInfo.pixelBytes = compressedBlockSize / 8;
- formatInfo.componentCount = componentCount;
- formatInfo.format = format;
- formatInfo.type = type;
- formatInfo.componentType = GL_UNSIGNED_NORMALIZED;
- formatInfo.colorEncoding = (srgb ? GL_SRGB : GL_LINEAR);
- formatInfo.compressed = true;
- formatInfo.textureSupport = textureSupport;
- formatInfo.renderSupport = renderSupport;
- formatInfo.filterSupport = filterSupport;
-
- InsertFormatInfo(map, formatInfo);
-}
-
-static InternalFormatInfoMap BuildInternalFormatInfoMap()
-{
- InternalFormatInfoMap map;
-
- // From ES 3.0.1 spec, table 3.12
- map[GL_NONE][GL_NONE] = InternalFormat();
-
- // clang-format off
-
- // | Internal format |sized| R | G | B | A |S | Format | Type | Component type | SRGB | Texture supported | Renderable | Filterable |
- AddRGBAFormat(&map, GL_R8, true, 8, 0, 0, 0, 0, GL_RED, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireESOrExt<3, 0, &Extensions::textureRG>, RequireESOrExt<3, 0, &Extensions::textureRG>, AlwaysSupported);
- AddRGBAFormat(&map, GL_R8_SNORM, true, 8, 0, 0, 0, 0, GL_RED, GL_BYTE, GL_SIGNED_NORMALIZED, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
- AddRGBAFormat(&map, GL_RG8, true, 8, 8, 0, 0, 0, GL_RG, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireESOrExt<3, 0, &Extensions::textureRG>, RequireESOrExt<3, 0, &Extensions::textureRG>, AlwaysSupported);
- AddRGBAFormat(&map, GL_RG8_SNORM, true, 8, 8, 0, 0, 0, GL_RG, GL_BYTE, GL_SIGNED_NORMALIZED, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGB8, true, 8, 8, 8, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireESOrExt<3, 0, &Extensions::rgb8rgba8>, RequireESOrExt<3, 0, &Extensions::rgb8rgba8>, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGB8_SNORM, true, 8, 8, 8, 0, 0, GL_RGB, GL_BYTE, GL_SIGNED_NORMALIZED, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGB565, true, 5, 6, 5, 0, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_NORMALIZED, false, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGBA4, true, 4, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_NORMALIZED, false, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGB5_A1, true, 5, 5, 5, 1, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, GL_UNSIGNED_NORMALIZED, false, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGBA8, true, 8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireESOrExt<3, 0, &Extensions::rgb8rgba8>, RequireESOrExt<3, 0, &Extensions::rgb8rgba8>, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGBA8_SNORM, true, 8, 8, 8, 8, 0, GL_RGBA, GL_BYTE, GL_SIGNED_NORMALIZED, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGB10_A2, true, 10, 10, 10, 2, 0, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_NORMALIZED, false, RequireES<3, 0>, RequireES<3, 0>, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGB10_A2UI, true, 10, 10, 10, 2, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
- AddRGBAFormat(&map, GL_SRGB8, true, 8, 8, 8, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, true, RequireESOrExt<3, 0, &Extensions::sRGB>, NeverSupported, AlwaysSupported);
- AddRGBAFormat(&map, GL_SRGB8_ALPHA8, true, 8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, true, RequireESOrExt<3, 0, &Extensions::sRGB>, RequireESOrExt<3, 0, &Extensions::sRGB>, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGB9_E5, true, 9, 9, 9, 0, 5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, GL_FLOAT, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
- AddRGBAFormat(&map, GL_R8I, true, 8, 0, 0, 0, 0, GL_RED_INTEGER, GL_BYTE, GL_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
- AddRGBAFormat(&map, GL_R8UI, true, 8, 0, 0, 0, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
- AddRGBAFormat(&map, GL_R16I, true, 16, 0, 0, 0, 0, GL_RED_INTEGER, GL_SHORT, GL_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
- AddRGBAFormat(&map, GL_R16UI, true, 16, 0, 0, 0, 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
- AddRGBAFormat(&map, GL_R32I, true, 32, 0, 0, 0, 0, GL_RED_INTEGER, GL_INT, GL_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
- AddRGBAFormat(&map, GL_R32UI, true, 32, 0, 0, 0, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
- AddRGBAFormat(&map, GL_RG8I, true, 8, 8, 0, 0, 0, GL_RG_INTEGER, GL_BYTE, GL_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
- AddRGBAFormat(&map, GL_RG8UI, true, 8, 8, 0, 0, 0, GL_RG_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
- AddRGBAFormat(&map, GL_RG16I, true, 16, 16, 0, 0, 0, GL_RG_INTEGER, GL_SHORT, GL_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
- AddRGBAFormat(&map, GL_RG16UI, true, 16, 16, 0, 0, 0, GL_RG_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
- AddRGBAFormat(&map, GL_RG32I, true, 32, 32, 0, 0, 0, GL_RG_INTEGER, GL_INT, GL_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
- AddRGBAFormat(&map, GL_R11F_G11F_B10F, true, 11, 11, 10, 0, 0, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, GL_FLOAT, false, RequireES<3, 0>, RequireExt<&Extensions::colorBufferFloat>, AlwaysSupported);
- AddRGBAFormat(&map, GL_RG32UI, true, 32, 32, 0, 0, 0, GL_RG_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
- AddRGBAFormat(&map, GL_RGB8I, true, 8, 8, 8, 0, 0, GL_RGB_INTEGER, GL_BYTE, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGB8UI, true, 8, 8, 8, 0, 0, GL_RGB_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGB16I, true, 16, 16, 16, 0, 0, GL_RGB_INTEGER, GL_SHORT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGB16UI, true, 16, 16, 16, 0, 0, GL_RGB_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGB32I, true, 32, 32, 32, 0, 0, GL_RGB_INTEGER, GL_INT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGB32UI, true, 32, 32, 32, 0, 0, GL_RGB_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGBA8I, true, 8, 8, 8, 8, 0, GL_RGBA_INTEGER, GL_BYTE, GL_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
- AddRGBAFormat(&map, GL_RGBA8UI, true, 8, 8, 8, 8, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
- AddRGBAFormat(&map, GL_RGBA16I, true, 16, 16, 16, 16, 0, GL_RGBA_INTEGER, GL_SHORT, GL_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
- AddRGBAFormat(&map, GL_RGBA16UI, true, 16, 16, 16, 16, 0, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
- AddRGBAFormat(&map, GL_RGBA32I, true, 32, 32, 32, 32, 0, GL_RGBA_INTEGER, GL_INT, GL_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
- AddRGBAFormat(&map, GL_RGBA32UI, true, 32, 32, 32, 32, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
-
- AddRGBAFormat(&map, GL_BGRA8_EXT, true, 8, 8, 8, 8, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureFormatBGRA8888>, RequireExt<&Extensions::textureFormatBGRA8888>, AlwaysSupported);
- AddRGBAFormat(&map, GL_BGRA4_ANGLEX, true, 4, 4, 4, 4, 0, GL_BGRA_EXT, GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureFormatBGRA8888>, RequireExt<&Extensions::textureFormatBGRA8888>, AlwaysSupported);
- AddRGBAFormat(&map, GL_BGR5_A1_ANGLEX, true, 5, 5, 5, 1, 0, GL_BGRA_EXT, GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureFormatBGRA8888>, RequireExt<&Extensions::textureFormatBGRA8888>, AlwaysSupported);
-
- // Special format which is not really supported, so always false for all supports.
- AddRGBAFormat(&map, GL_BGR565_ANGLEX, true, 5, 6, 5, 1, 0, GL_BGRA_EXT, GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_NORMALIZED, false, NeverSupported, NeverSupported, NeverSupported);
-
- // Floating point renderability and filtering is provided by OES_texture_float and OES_texture_half_float
- // | Internal format |sized| D |S | Format | Type | Comp | SRGB | Texture supported | Renderable | Filterable |
- // | | | | | | | type | | | | |
- AddRGBAFormat(&map, GL_R16F, true, 16, 0, 0, 0, 0, GL_RED, GL_HALF_FLOAT, GL_FLOAT, false, HalfFloatRGSupport, HalfFloatRGRenderableSupport, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
- AddRGBAFormat(&map, GL_RG16F, true, 16, 16, 0, 0, 0, GL_RG, GL_HALF_FLOAT, GL_FLOAT, false, HalfFloatRGSupport, HalfFloatRGRenderableSupport, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
- AddRGBAFormat(&map, GL_RGB16F, true, 16, 16, 16, 0, 0, GL_RGB, GL_HALF_FLOAT, GL_FLOAT, false, HalfFloatSupport, HalfFloatRGBRenderableSupport, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
- AddRGBAFormat(&map, GL_RGBA16F, true, 16, 16, 16, 16, 0, GL_RGBA, GL_HALF_FLOAT, GL_FLOAT, false, HalfFloatSupport, HalfFloatRGBARenderableSupport, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
- AddRGBAFormat(&map, GL_R32F, true, 32, 0, 0, 0, 0, GL_RED, GL_FLOAT, GL_FLOAT, false, FloatRGSupport, FloatRGRenderableSupport, RequireExt<&Extensions::textureFloatLinear> );
- AddRGBAFormat(&map, GL_RG32F, true, 32, 32, 0, 0, 0, GL_RG, GL_FLOAT, GL_FLOAT, false, FloatRGSupport, FloatRGRenderableSupport, RequireExt<&Extensions::textureFloatLinear> );
- AddRGBAFormat(&map, GL_RGB32F, true, 32, 32, 32, 0, 0, GL_RGB, GL_FLOAT, GL_FLOAT, false, FloatSupport, FloatRGBRenderableSupport, RequireExt<&Extensions::textureFloatLinear> );
- AddRGBAFormat(&map, GL_RGBA32F, true, 32, 32, 32, 32, 0, GL_RGBA, GL_FLOAT, GL_FLOAT, false, FloatSupport, FloatRGBARenderableSupport, RequireExt<&Extensions::textureFloatLinear> );
-
- // Depth stencil formats
- // | Internal format |sized| D |S | X | Format | Type | Component type | Supported | Renderable | Filterable |
- AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT16, true, 16, 0, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, GL_UNSIGNED_NORMALIZED, RequireES<2, 0>, RequireES<2, 0>, RequireESOrExt<3, 0, &Extensions::depthTextures>);
- AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT24, true, 24, 0, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, GL_UNSIGNED_NORMALIZED, RequireES<3, 0>, RequireES<3, 0>, RequireESOrExt<3, 0, &Extensions::depthTextures>);
- AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT32F, true, 32, 0, 0, GL_DEPTH_COMPONENT, GL_FLOAT, GL_FLOAT, RequireES<3, 0>, RequireES<3, 0>, RequireESOrExt<3, 0, &Extensions::depthTextures>);
- AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT32_OES, true, 32, 0, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, GL_UNSIGNED_NORMALIZED, RequireExtOrExt<&Extensions::depthTextures, &Extensions::depth32>, RequireExtOrExt<&Extensions::depthTextures, &Extensions::depth32>, AlwaysSupported );
- AddDepthStencilFormat(&map, GL_DEPTH24_STENCIL8, true, 24, 8, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, GL_UNSIGNED_NORMALIZED, RequireESOrExt<3, 0, &Extensions::depthTextures>, RequireESOrExtOrExt<3, 0, &Extensions::depthTextures, &Extensions::packedDepthStencil>, AlwaysSupported );
- AddDepthStencilFormat(&map, GL_DEPTH32F_STENCIL8, true, 32, 8, 24, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, GL_FLOAT, RequireES<3, 0>, RequireES<3, 0>, AlwaysSupported );
- // STENCIL_INDEX8 is special-cased, see around the bottom of the list.
-
- // Luminance alpha formats
- // | Internal format |sized| L | A | Format | Type | Component type | Supported | Renderable | Filterable |
- AddLUMAFormat(&map, GL_ALPHA8_EXT, true, 0, 8, GL_ALPHA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireExt<&Extensions::textureStorage>, NeverSupported, AlwaysSupported);
- AddLUMAFormat(&map, GL_LUMINANCE8_EXT, true, 8, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireExt<&Extensions::textureStorage>, NeverSupported, AlwaysSupported);
- AddLUMAFormat(&map, GL_LUMINANCE8_ALPHA8_EXT, true, 8, 8, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireExt<&Extensions::textureStorage>, NeverSupported, AlwaysSupported);
- AddLUMAFormat(&map, GL_ALPHA16F_EXT, true, 0, 16, GL_ALPHA, GL_HALF_FLOAT_OES, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureHalfFloat>, NeverSupported, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
- AddLUMAFormat(&map, GL_LUMINANCE16F_EXT, true, 16, 0, GL_LUMINANCE, GL_HALF_FLOAT_OES, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureHalfFloat>, NeverSupported, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
- AddLUMAFormat(&map, GL_LUMINANCE_ALPHA16F_EXT, true, 16, 16, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureHalfFloat>, NeverSupported, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
- AddLUMAFormat(&map, GL_ALPHA32F_EXT, true, 0, 32, GL_ALPHA, GL_FLOAT, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureFloat>, NeverSupported, RequireExt<&Extensions::textureFloatLinear>);
- AddLUMAFormat(&map, GL_LUMINANCE32F_EXT, true, 32, 0, GL_LUMINANCE, GL_FLOAT, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureFloat>, NeverSupported, RequireExt<&Extensions::textureFloatLinear>);
- AddLUMAFormat(&map, GL_LUMINANCE_ALPHA32F_EXT, true, 32, 32, GL_LUMINANCE_ALPHA, GL_FLOAT, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureFloat>, NeverSupported, RequireExt<&Extensions::textureFloatLinear>);
-
- // Compressed formats, From ES 3.0.1 spec, table 3.16
- // | Internal format |W |H | BS |CC| Format | Type | SRGB | Supported | Renderable | Filterable |
- AddCompressedFormat(&map, GL_COMPRESSED_R11_EAC, 4, 4, 64, 1, GL_RED, GL_UNSIGNED_BYTE, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SIGNED_R11_EAC, 4, 4, 64, 1, GL_RED, GL_UNSIGNED_BYTE, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RG11_EAC, 4, 4, 128, 2, GL_RG, GL_UNSIGNED_BYTE, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SIGNED_RG11_EAC, 4, 4, 128, 2, GL_RG, GL_UNSIGNED_BYTE, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGB8_ETC2, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ETC2, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, true, RequireES<3, 0>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, true, RequireES<3, 0>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA8_ETC2_EAC, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireES<3, 0>, NeverSupported, AlwaysSupported);
-
- // From GL_EXT_texture_compression_dxt1
- // | Internal format |W |H | BS |CC| Format | Type | SRGB | Supported | Renderable | Filterable |
- AddCompressedFormat(&map, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::textureCompressionDXT1>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 4, 4, 64, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::textureCompressionDXT1>, NeverSupported, AlwaysSupported);
-
- // 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>, NeverSupported, AlwaysSupported);
-
- // 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>, NeverSupported, AlwaysSupported);
-
- // 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>, NeverSupported, AlwaysSupported);
-
- // From GL_EXT_texture_compression_s3tc_srgb
- // | Internal format |W |H | BS |CC| Format | Type | SRGB | Supported | Renderable | Filterable |
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::textureCompressionS3TCsRGB>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 4, 4, 64, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::textureCompressionS3TCsRGB>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::textureCompressionS3TCsRGB>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::textureCompressionS3TCsRGB>, NeverSupported, AlwaysSupported);
-
- // From KHR_texture_compression_astc_hdr
- // | Internal format | W | H | BS |CC| Format | Type | SRGB | Supported | Renderable | Filterable |
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_4x4_KHR, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_5x4_KHR, 5, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_5x5_KHR, 5, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_6x5_KHR, 6, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_6x6_KHR, 6, 6, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_8x5_KHR, 8, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_8x6_KHR, 8, 6, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_8x8_KHR, 8, 8, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_10x5_KHR, 10, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_10x6_KHR, 10, 6, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_10x8_KHR, 10, 8, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_10x10_KHR, 10, 10, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_12x10_KHR, 12, 10, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_12x12_KHR, 12, 12, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
-
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, 5, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, 5, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, 6, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, 6, 6, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, 8, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, 8, 6, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, 8, 8, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, 10, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, 10, 6, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, 10, 8, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, 10, 10, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, 12, 10, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, 12, 12, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
-
- // 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
- // - All other stencil formats (all depth-stencil) are either float or normalized
- // - It affects only validation of internalformat in RenderbufferStorageMultisample.
- // | Internal format |sized|D |S |X | Format | Type | Component type | Supported | Renderable | Filterable |
- AddDepthStencilFormat(&map, GL_STENCIL_INDEX8, true, 0, 8, 0, GL_STENCIL, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireES<2, 0>, RequireES<2, 0>, NeverSupported);
-
- // From GL_ANGLE_lossy_etc_decode
- // | Internal format |W |H |BS |CC| Format | Type | SRGB | Supported | Renderable | Filterable |
- AddCompressedFormat(&map, GL_ETC1_RGB8_LOSSY_DECODE_ANGLE, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::lossyETCDecode>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::lossyETCDecode>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::lossyETCDecode>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE, 4, 4, 64, 3, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::lossyETCDecode>, NeverSupported, AlwaysSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE, 4, 4, 64, 3, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::lossyETCDecode>, NeverSupported, AlwaysSupported);
-
- // From GL_EXT_texture_norm16
- // | Internal format |sized| R | G | B | A |S | Format | Type | Component type | SRGB | Texture supported | Renderable | Filterable |
- AddRGBAFormat(&map, GL_R16_EXT, true, 16, 0, 0, 0, 0, GL_RED, GL_UNSIGNED_SHORT, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>, RequireExt<&Extensions::textureNorm16>, AlwaysSupported);
- AddRGBAFormat(&map, GL_R16_SNORM_EXT, true, 16, 0, 0, 0, 0, GL_RED, GL_SHORT, GL_SIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>, NeverSupported, AlwaysSupported);
- AddRGBAFormat(&map, GL_RG16_EXT, true, 16, 16, 0, 0, 0, GL_RG, GL_UNSIGNED_SHORT, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>, RequireExt<&Extensions::textureNorm16>, AlwaysSupported);
- AddRGBAFormat(&map, GL_RG16_SNORM_EXT, true, 16, 16, 0, 0, 0, GL_RG, GL_SHORT, GL_SIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>, NeverSupported, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGB16_EXT, true, 16, 16, 16, 0, 0, GL_RGB, GL_UNSIGNED_SHORT, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>, NeverSupported, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGB16_SNORM_EXT, true, 16, 16, 16, 0, 0, GL_RGB, GL_SHORT, GL_SIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>, NeverSupported, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGBA16_EXT, true, 16, 16, 16, 16, 0, GL_RGBA, GL_UNSIGNED_SHORT, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>, RequireExt<&Extensions::textureNorm16>, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGBA16_SNORM_EXT, true, 16, 16, 16, 16, 0, GL_RGBA, GL_SHORT, GL_SIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>, NeverSupported, AlwaysSupported);
-
- // Unsized formats
- // | Internal format |sized | R | G | B | A |S | Format | Type | Component type | SRGB | Texture supported | Renderable | Filterable |
- AddRGBAFormat(&map, GL_RED, false, 8, 0, 0, 0, 0, GL_RED, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureRG>, AlwaysSupported, AlwaysSupported);
- AddRGBAFormat(&map, GL_RED, false, 8, 0, 0, 0, 0, GL_RED, GL_BYTE, GL_SIGNED_NORMALIZED, false, NeverSupported, NeverSupported, NeverSupported );
- AddRGBAFormat(&map, GL_RG, false, 8, 8, 0, 0, 0, GL_RG, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureRG>, AlwaysSupported, AlwaysSupported);
- AddRGBAFormat(&map, GL_RG, false, 8, 8, 0, 0, 0, GL_RG, GL_BYTE, GL_SIGNED_NORMALIZED, false, NeverSupported, NeverSupported, NeverSupported );
- AddRGBAFormat(&map, GL_RGB, false, 8, 8, 8, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireES<2, 0>, AlwaysSupported, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGB, false, 5, 6, 5, 0, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_NORMALIZED, false, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGB, false, 8, 8, 8, 0, 0, GL_RGB, GL_BYTE, GL_SIGNED_NORMALIZED, false, NeverSupported, NeverSupported, NeverSupported );
- AddRGBAFormat(&map, GL_RGBA, false, 4, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_NORMALIZED, false, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGBA, false, 5, 5, 5, 1, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, GL_UNSIGNED_NORMALIZED, false, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGBA, false, 8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGBA, false, 10, 10, 10, 2, 0, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_NORMALIZED, false, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
- AddRGBAFormat(&map, GL_RGBA, false, 8, 8, 8, 8, 0, GL_RGBA, GL_BYTE, GL_SIGNED_NORMALIZED, false, NeverSupported, NeverSupported, NeverSupported );
- AddRGBAFormat(&map, GL_SRGB, false, 8, 8, 8, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, true, RequireExt<&Extensions::sRGB>, NeverSupported, AlwaysSupported);
- AddRGBAFormat(&map, GL_SRGB_ALPHA_EXT, false, 8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, true, RequireExt<&Extensions::sRGB>, RequireExt<&Extensions::sRGB>, AlwaysSupported);
-
- AddRGBAFormat(&map, GL_BGRA_EXT, false, 8, 8, 8, 8, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureFormatBGRA8888>, RequireExt<&Extensions::textureFormatBGRA8888>, AlwaysSupported);
-
- // Unsized integer formats
- // |Internal format |sized | R | G | B | A |S | Format | Type | Component type | SRGB | Texture | Renderable | Filterable |
- AddRGBAFormat(&map, GL_RED_INTEGER, false, 8, 0, 0, 0, 0, GL_RED_INTEGER, GL_BYTE, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RED_INTEGER, false, 8, 0, 0, 0, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RED_INTEGER, false, 16, 0, 0, 0, 0, GL_RED_INTEGER, GL_SHORT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RED_INTEGER, false, 16, 0, 0, 0, 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RED_INTEGER, false, 32, 0, 0, 0, 0, GL_RED_INTEGER, GL_INT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RED_INTEGER, false, 32, 0, 0, 0, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RG_INTEGER, false, 8, 8, 0, 0, 0, GL_RG_INTEGER, GL_BYTE, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RG_INTEGER, false, 8, 8, 0, 0, 0, GL_RG_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RG_INTEGER, false, 16, 16, 0, 0, 0, GL_RG_INTEGER, GL_SHORT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RG_INTEGER, false, 16, 16, 0, 0, 0, GL_RG_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RG_INTEGER, false, 32, 32, 0, 0, 0, GL_RG_INTEGER, GL_INT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RG_INTEGER, false, 32, 32, 0, 0, 0, GL_RG_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGB_INTEGER, false, 8, 8, 8, 0, 0, GL_RGB_INTEGER, GL_BYTE, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGB_INTEGER, false, 8, 8, 8, 0, 0, GL_RGB_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGB_INTEGER, false, 16, 16, 16, 0, 0, GL_RGB_INTEGER, GL_SHORT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGB_INTEGER, false, 16, 16, 16, 0, 0, GL_RGB_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGB_INTEGER, false, 32, 32, 32, 0, 0, GL_RGB_INTEGER, GL_INT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGB_INTEGER, false, 32, 32, 32, 0, 0, GL_RGB_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGBA_INTEGER, false, 8, 8, 8, 8, 0, GL_RGBA_INTEGER, GL_BYTE, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGBA_INTEGER, false, 8, 8, 8, 8, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGBA_INTEGER, false, 16, 16, 16, 16, 0, GL_RGBA_INTEGER, GL_SHORT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGBA_INTEGER, false, 16, 16, 16, 16, 0, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGBA_INTEGER, false, 32, 32, 32, 32, 0, GL_RGBA_INTEGER, GL_INT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGBA_INTEGER, false, 32, 32, 32, 32, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
- AddRGBAFormat(&map, GL_RGBA_INTEGER, false, 10, 10, 10, 2, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
-
- // Unsized floating point formats
- // |Internal format |sized | R | G | B | A |S | Format | Type | Comp | SRGB | Texture supported | Renderable | Filterable |
- AddRGBAFormat(&map, GL_RED, false, 16, 0, 0, 0, 0, GL_RED, GL_HALF_FLOAT, GL_FLOAT, false, NeverSupported, NeverSupported, NeverSupported );
- AddRGBAFormat(&map, GL_RG, false, 16, 16, 0, 0, 0, GL_RG, GL_HALF_FLOAT, GL_FLOAT, false, NeverSupported, NeverSupported, NeverSupported );
- AddRGBAFormat(&map, GL_RGB, false, 16, 16, 16, 0, 0, GL_RGB, GL_HALF_FLOAT, GL_FLOAT, false, NeverSupported, NeverSupported, NeverSupported );
- AddRGBAFormat(&map, GL_RGBA, false, 16, 16, 16, 16, 0, GL_RGBA, GL_HALF_FLOAT, GL_FLOAT, false, NeverSupported, NeverSupported, NeverSupported );
- AddRGBAFormat(&map, GL_RED, false, 16, 0, 0, 0, 0, GL_RED, GL_HALF_FLOAT_OES, GL_FLOAT, false, UnsizedHalfFloatOESRGSupport, UnsizedHalfFloatOESRGRenderableSupport, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
- AddRGBAFormat(&map, GL_RG, false, 16, 16, 0, 0, 0, GL_RG, GL_HALF_FLOAT_OES, GL_FLOAT, false, UnsizedHalfFloatOESRGSupport, UnsizedHalfFloatOESRGRenderableSupport, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
- AddRGBAFormat(&map, GL_RGB, false, 16, 16, 16, 0, 0, GL_RGB, GL_HALF_FLOAT_OES, GL_FLOAT, false, UnsizedHalfFloatOESSupport, UnsizedHalfFloatOESRenderableSupport, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
- AddRGBAFormat(&map, GL_RGBA, false, 16, 16, 16, 16, 0, GL_RGBA, GL_HALF_FLOAT_OES, GL_FLOAT, false, UnsizedHalfFloatOESSupport, UnsizedHalfFloatOESRenderableSupport, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
- AddRGBAFormat(&map, GL_RED, false, 32, 0, 0, 0, 0, GL_RED, GL_FLOAT, GL_FLOAT, false, UnsizedFloatRGSupport, UnsizedFloatRGRenderableSupport, RequireExt<&Extensions::textureFloatLinear> );
- AddRGBAFormat(&map, GL_RG, false, 32, 32, 0, 0, 0, GL_RG, GL_FLOAT, GL_FLOAT, false, UnsizedFloatRGSupport, UnsizedFloatRGRenderableSupport, RequireExt<&Extensions::textureFloatLinear> );
- AddRGBAFormat(&map, GL_RGB, false, 32, 32, 32, 0, 0, GL_RGB, GL_FLOAT, GL_FLOAT, false, UnsizedFloatSupport, UnsizedFloatRGBRenderableSupport, RequireExt<&Extensions::textureFloatLinear> );
- AddRGBAFormat(&map, GL_RGB, false, 9, 9, 9, 0, 5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, GL_FLOAT, false, NeverSupported, NeverSupported, NeverSupported );
- AddRGBAFormat(&map, GL_RGB, false, 11, 11, 10, 0, 0, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, GL_FLOAT, false, NeverSupported, NeverSupported, NeverSupported );
- AddRGBAFormat(&map, GL_RGBA, false, 32, 32, 32, 32, 0, GL_RGBA, GL_FLOAT, GL_FLOAT, false, UnsizedFloatSupport, UnsizedFloatRGBARenderableSupport, RequireExt<&Extensions::textureFloatLinear> );
-
- // Unsized luminance alpha formats
- // | Internal format |sized | L | A | Format | Type | Component type | Supported | Renderable | Filterable |
- AddLUMAFormat(&map, GL_ALPHA, false, 0, 8, GL_ALPHA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireES<2, 0>, NeverSupported, AlwaysSupported );
- AddLUMAFormat(&map, GL_LUMINANCE, false, 8, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireES<2, 0>, NeverSupported, AlwaysSupported );
- AddLUMAFormat(&map, GL_LUMINANCE_ALPHA, false, 8, 8, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireES<2, 0>, NeverSupported, AlwaysSupported );
- AddLUMAFormat(&map, GL_ALPHA, false, 0, 16, GL_ALPHA, GL_HALF_FLOAT_OES, GL_FLOAT, RequireExt<&Extensions::textureHalfFloat>, NeverSupported, RequireExt<&Extensions::textureHalfFloatLinear>);
- AddLUMAFormat(&map, GL_LUMINANCE, false, 16, 0, GL_LUMINANCE, GL_HALF_FLOAT_OES, GL_FLOAT, RequireExt<&Extensions::textureHalfFloat>, NeverSupported, RequireExt<&Extensions::textureHalfFloatLinear>);
- AddLUMAFormat(&map, GL_LUMINANCE_ALPHA ,false, 16, 16, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES, GL_FLOAT, RequireExt<&Extensions::textureHalfFloat>, NeverSupported, RequireExt<&Extensions::textureHalfFloatLinear>);
- AddLUMAFormat(&map, GL_ALPHA, false, 0, 32, GL_ALPHA, GL_FLOAT, GL_FLOAT, RequireExt<&Extensions::textureFloat>, NeverSupported, RequireExt<&Extensions::textureFloatLinear> );
- AddLUMAFormat(&map, GL_LUMINANCE, false, 32, 0, GL_LUMINANCE, GL_FLOAT, GL_FLOAT, RequireExt<&Extensions::textureFloat>, NeverSupported, RequireExt<&Extensions::textureFloatLinear> );
- AddLUMAFormat(&map, GL_LUMINANCE_ALPHA, false, 32, 32, GL_LUMINANCE_ALPHA, GL_FLOAT, GL_FLOAT, RequireExt<&Extensions::textureFloat>, NeverSupported, RequireExt<&Extensions::textureFloatLinear> );
-
- // Unsized depth stencil formats
- // | Internal format |sized | D |S | X | Format | Type | Component type | Supported | Renderable | Filterable |
- AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT, false, 16, 0, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, GL_UNSIGNED_NORMALIZED, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
- AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT, false, 24, 0, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, GL_UNSIGNED_NORMALIZED, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
- AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT, false, 32, 0, 0, GL_DEPTH_COMPONENT, GL_FLOAT, GL_FLOAT, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
- AddDepthStencilFormat(&map, GL_DEPTH_STENCIL, false, 24, 8, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, GL_UNSIGNED_NORMALIZED, RequireESOrExt<3, 0, &Extensions::packedDepthStencil>, RequireESOrExt<3, 0, &Extensions::packedDepthStencil>, AlwaysSupported);
- AddDepthStencilFormat(&map, GL_DEPTH_STENCIL, false, 32, 8, 24, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, GL_FLOAT, RequireESOrExt<3, 0, &Extensions::packedDepthStencil>, RequireESOrExt<3, 0, &Extensions::packedDepthStencil>, AlwaysSupported);
- AddDepthStencilFormat(&map, GL_STENCIL, false, 0, 8, 0, GL_STENCIL, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireES<2, 0>, RequireES<2, 0>, NeverSupported);
- // clang-format on
-
- return map;
-}
-
-static const InternalFormatInfoMap &GetInternalFormatMap()
-{
- static const InternalFormatInfoMap formatMap = BuildInternalFormatInfoMap();
- return formatMap;
-}
-
-static FormatSet BuildAllSizedInternalFormatSet()
-{
- FormatSet result;
-
- for (const auto &internalFormat : GetInternalFormatMap())
- {
- for (const auto &type : internalFormat.second)
- {
- if (type.second.sized)
- {
- // TODO(jmadill): Fix this hack.
- if (internalFormat.first == GL_BGR565_ANGLEX)
- continue;
-
- result.insert(internalFormat.first);
- }
- }
- }
-
- return result;
-}
-
-const Type &GetTypeInfo(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- case GL_BYTE:
- {
- static const Type info = GenTypeInfo(1, false);
- return info;
- }
- case GL_UNSIGNED_SHORT:
- case GL_SHORT:
- case GL_HALF_FLOAT:
- case GL_HALF_FLOAT_OES:
- {
- static const Type info = GenTypeInfo(2, false);
- return info;
- }
- case GL_UNSIGNED_INT:
- case GL_INT:
- case GL_FLOAT:
- {
- static const Type info = GenTypeInfo(4, false);
- return info;
- }
- case GL_UNSIGNED_SHORT_5_6_5:
- case GL_UNSIGNED_SHORT_4_4_4_4:
- case GL_UNSIGNED_SHORT_5_5_5_1:
- case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
- case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
- {
- static const Type info = GenTypeInfo(2, true);
- return info;
- }
- case GL_UNSIGNED_INT_2_10_10_10_REV:
- case GL_UNSIGNED_INT_24_8:
- case GL_UNSIGNED_INT_10F_11F_11F_REV:
- case GL_UNSIGNED_INT_5_9_9_9_REV:
- {
- ASSERT(GL_UNSIGNED_INT_24_8_OES == GL_UNSIGNED_INT_24_8);
- static const Type info = GenTypeInfo(4, true);
- return info;
- }
- case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
- {
- static const Type info = GenTypeInfo(8, true);
- return info;
- }
- default:
- {
- static const Type defaultInfo;
- return defaultInfo;
- }
- }
-}
-
-const InternalFormat &GetSizedInternalFormatInfo(GLenum internalFormat)
-{
- static const InternalFormat defaultInternalFormat;
- const InternalFormatInfoMap &formatMap = GetInternalFormatMap();
- auto iter = formatMap.find(internalFormat);
-
- // Sized internal formats only have one type per entry
- if (iter == formatMap.end() || iter->second.size() != 1)
- {
- return defaultInternalFormat;
- }
-
- const InternalFormat &internalFormatInfo = iter->second.begin()->second;
- if (!internalFormatInfo.sized)
- {
- return defaultInternalFormat;
- }
-
- return internalFormatInfo;
-}
-
-const InternalFormat &GetInternalFormatInfo(GLenum internalFormat, GLenum type)
-{
- static const InternalFormat defaultInternalFormat;
- const InternalFormatInfoMap &formatMap = GetInternalFormatMap();
-
- auto internalFormatIter = formatMap.find(internalFormat);
- if (internalFormatIter == formatMap.end())
- {
- return defaultInternalFormat;
- }
-
- // If the internal format is sized, simply return it without the type check.
- if (internalFormatIter->second.size() == 1 && internalFormatIter->second.begin()->second.sized)
- {
- return internalFormatIter->second.begin()->second;
- }
-
- auto typeIter = internalFormatIter->second.find(type);
- if (typeIter == internalFormatIter->second.end())
- {
- return defaultInternalFormat;
- }
-
- return typeIter->second;
-}
-
-GLuint InternalFormat::computePixelBytes(GLenum formatType) const
-{
- const auto &typeInfo = GetTypeInfo(formatType);
- GLuint components = typeInfo.specialInterpretation ? 1u : componentCount;
- return components * typeInfo.bytes;
-}
-
-ErrorOrResult<GLuint> InternalFormat::computeRowPitch(GLenum formatType,
- GLsizei width,
- GLint alignment,
- GLint rowLength) const
-{
- // Compressed images do not use pack/unpack parameters.
- if (compressed)
- {
- ASSERT(rowLength == 0);
- return computeCompressedImageSize(Extents(width, 1, 1));
- }
-
- CheckedNumeric<GLuint> checkedWidth(rowLength > 0 ? rowLength : width);
- CheckedNumeric<GLuint> checkedRowBytes = checkedWidth * computePixelBytes(formatType);
-
- ASSERT(alignment > 0 && isPow2(alignment));
- CheckedNumeric<GLuint> checkedAlignment(alignment);
- auto aligned = rx::roundUp(checkedRowBytes, checkedAlignment);
- ANGLE_TRY_CHECKED_MATH(aligned);
- return aligned.ValueOrDie();
-}
-
-ErrorOrResult<GLuint> InternalFormat::computeDepthPitch(GLsizei height,
- GLint imageHeight,
- GLuint rowPitch) const
-{
- GLuint rows =
- (imageHeight > 0 ? static_cast<GLuint>(imageHeight) : static_cast<GLuint>(height));
- CheckedNumeric<GLuint> checkedRowPitch(rowPitch);
-
- auto depthPitch = checkedRowPitch * rows;
- ANGLE_TRY_CHECKED_MATH(depthPitch);
- return depthPitch.ValueOrDie();
-}
-
-ErrorOrResult<GLuint> InternalFormat::computeDepthPitch(GLenum formatType,
- GLsizei width,
- GLsizei height,
- GLint alignment,
- GLint rowLength,
- GLint imageHeight) const
-{
- GLuint rowPitch = 0;
- ANGLE_TRY_RESULT(computeRowPitch(formatType, width, alignment, rowLength), rowPitch);
- return computeDepthPitch(height, imageHeight, rowPitch);
-}
-
-ErrorOrResult<GLuint> InternalFormat::computeCompressedImageSize(const Extents &size) const
-{
- CheckedNumeric<GLuint> checkedWidth(size.width);
- CheckedNumeric<GLuint> checkedHeight(size.height);
- CheckedNumeric<GLuint> checkedDepth(size.depth);
- CheckedNumeric<GLuint> checkedBlockWidth(compressedBlockWidth);
- CheckedNumeric<GLuint> checkedBlockHeight(compressedBlockHeight);
-
- ASSERT(compressed);
- auto numBlocksWide = (checkedWidth + checkedBlockWidth - 1u) / checkedBlockWidth;
- auto numBlocksHigh = (checkedHeight + checkedBlockHeight - 1u) / checkedBlockHeight;
- auto bytes = numBlocksWide * numBlocksHigh * pixelBytes * checkedDepth;
- ANGLE_TRY_CHECKED_MATH(bytes);
- return bytes.ValueOrDie();
-}
-
-ErrorOrResult<GLuint> InternalFormat::computeSkipBytes(GLuint rowPitch,
- GLuint depthPitch,
- const PixelStoreStateBase &state,
- bool is3D) const
-{
- CheckedNumeric<GLuint> checkedRowPitch(rowPitch);
- CheckedNumeric<GLuint> checkedDepthPitch(depthPitch);
- CheckedNumeric<GLuint> checkedSkipImages(static_cast<GLuint>(state.skipImages));
- CheckedNumeric<GLuint> checkedSkipRows(static_cast<GLuint>(state.skipRows));
- CheckedNumeric<GLuint> checkedSkipPixels(static_cast<GLuint>(state.skipPixels));
- CheckedNumeric<GLuint> checkedPixelBytes(pixelBytes);
- auto checkedSkipImagesBytes = checkedSkipImages * checkedDepthPitch;
- if (!is3D)
- {
- checkedSkipImagesBytes = 0;
- }
- auto skipBytes = checkedSkipImagesBytes + checkedSkipRows * checkedRowPitch +
- checkedSkipPixels * checkedPixelBytes;
- ANGLE_TRY_CHECKED_MATH(skipBytes);
- return skipBytes.ValueOrDie();
-}
-
-ErrorOrResult<GLuint> InternalFormat::computePackUnpackEndByte(
- GLenum formatType,
- const Extents &size,
- const PixelStoreStateBase &state,
- bool is3D) const
-{
- GLuint rowPitch = 0;
- ANGLE_TRY_RESULT(computeRowPitch(formatType, size.width, state.alignment, state.rowLength),
- rowPitch);
-
- GLuint depthPitch = 0;
- if (is3D)
- {
- ANGLE_TRY_RESULT(computeDepthPitch(size.height, state.imageHeight, rowPitch), depthPitch);
- }
-
- CheckedNumeric<GLuint> checkedCopyBytes = 0;
- if (compressed)
- {
- ANGLE_TRY_RESULT(computeCompressedImageSize(size), checkedCopyBytes);
- }
- else if (size.height != 0 && (!is3D || size.depth != 0))
- {
- CheckedNumeric<GLuint> bytes = computePixelBytes(formatType);
- checkedCopyBytes += size.width * bytes;
-
- CheckedNumeric<GLuint> heightMinusOne = size.height - 1;
- checkedCopyBytes += heightMinusOne * rowPitch;
-
- if (is3D)
- {
- CheckedNumeric<GLuint> depthMinusOne = size.depth - 1;
- checkedCopyBytes += depthMinusOne * depthPitch;
- }
- }
-
- CheckedNumeric<GLuint> checkedSkipBytes = 0;
- ANGLE_TRY_RESULT(computeSkipBytes(rowPitch, depthPitch, state, is3D), checkedSkipBytes);
-
- CheckedNumeric<GLuint> endByte = checkedCopyBytes + checkedSkipBytes;
-
- ANGLE_TRY_CHECKED_MATH(endByte);
- return endByte.ValueOrDie();
-}
-
-GLenum GetUnsizedFormat(GLenum internalFormat)
-{
- auto sizedFormatInfo = GetSizedInternalFormatInfo(internalFormat);
- if (sizedFormatInfo.internalFormat != GL_NONE)
- {
- return sizedFormatInfo.format;
- }
-
- return internalFormat;
-}
-
-const FormatSet &GetAllSizedInternalFormats()
-{
- static FormatSet formatSet = BuildAllSizedInternalFormatSet();
- return formatSet;
-}
-
-AttributeType GetAttributeType(GLenum enumValue)
-{
- switch (enumValue)
- {
- case GL_FLOAT:
- return ATTRIBUTE_FLOAT;
- case GL_FLOAT_VEC2:
- return ATTRIBUTE_VEC2;
- case GL_FLOAT_VEC3:
- return ATTRIBUTE_VEC3;
- case GL_FLOAT_VEC4:
- return ATTRIBUTE_VEC4;
- case GL_INT:
- return ATTRIBUTE_INT;
- case GL_INT_VEC2:
- return ATTRIBUTE_IVEC2;
- case GL_INT_VEC3:
- return ATTRIBUTE_IVEC3;
- case GL_INT_VEC4:
- return ATTRIBUTE_IVEC4;
- case GL_UNSIGNED_INT:
- return ATTRIBUTE_UINT;
- case GL_UNSIGNED_INT_VEC2:
- return ATTRIBUTE_UVEC2;
- case GL_UNSIGNED_INT_VEC3:
- return ATTRIBUTE_UVEC3;
- case GL_UNSIGNED_INT_VEC4:
- return ATTRIBUTE_UVEC4;
- case GL_FLOAT_MAT2:
- return ATTRIBUTE_MAT2;
- case GL_FLOAT_MAT3:
- return ATTRIBUTE_MAT3;
- case GL_FLOAT_MAT4:
- return ATTRIBUTE_MAT4;
- case GL_FLOAT_MAT2x3:
- return ATTRIBUTE_MAT2x3;
- case GL_FLOAT_MAT2x4:
- return ATTRIBUTE_MAT2x4;
- case GL_FLOAT_MAT3x2:
- return ATTRIBUTE_MAT3x2;
- case GL_FLOAT_MAT3x4:
- return ATTRIBUTE_MAT3x4;
- case GL_FLOAT_MAT4x2:
- return ATTRIBUTE_MAT4x2;
- case GL_FLOAT_MAT4x3:
- return ATTRIBUTE_MAT4x3;
- default:
- UNREACHABLE();
- return ATTRIBUTE_FLOAT;
- }
-}
-
-VertexFormatType GetVertexFormatType(GLenum type, GLboolean normalized, GLuint components, bool pureInteger)
-{
- switch (type)
- {
- case GL_BYTE:
- switch (components)
- {
- case 1:
- if (pureInteger)
- return VERTEX_FORMAT_SBYTE1_INT;
- if (normalized)
- return VERTEX_FORMAT_SBYTE1_NORM;
- return VERTEX_FORMAT_SBYTE1;
- case 2:
- if (pureInteger)
- return VERTEX_FORMAT_SBYTE2_INT;
- if (normalized)
- return VERTEX_FORMAT_SBYTE2_NORM;
- return VERTEX_FORMAT_SBYTE2;
- case 3:
- if (pureInteger)
- return VERTEX_FORMAT_SBYTE3_INT;
- if (normalized)
- return VERTEX_FORMAT_SBYTE3_NORM;
- return VERTEX_FORMAT_SBYTE3;
- case 4:
- if (pureInteger)
- return VERTEX_FORMAT_SBYTE4_INT;
- if (normalized)
- return VERTEX_FORMAT_SBYTE4_NORM;
- return VERTEX_FORMAT_SBYTE4;
- default:
- UNREACHABLE();
- break;
- }
- case GL_UNSIGNED_BYTE:
- switch (components)
- {
- case 1:
- if (pureInteger)
- return VERTEX_FORMAT_UBYTE1_INT;
- if (normalized)
- return VERTEX_FORMAT_UBYTE1_NORM;
- return VERTEX_FORMAT_UBYTE1;
- case 2:
- if (pureInteger)
- return VERTEX_FORMAT_UBYTE2_INT;
- if (normalized)
- return VERTEX_FORMAT_UBYTE2_NORM;
- return VERTEX_FORMAT_UBYTE2;
- case 3:
- if (pureInteger)
- return VERTEX_FORMAT_UBYTE3_INT;
- if (normalized)
- return VERTEX_FORMAT_UBYTE3_NORM;
- return VERTEX_FORMAT_UBYTE3;
- case 4:
- if (pureInteger)
- return VERTEX_FORMAT_UBYTE4_INT;
- if (normalized)
- return VERTEX_FORMAT_UBYTE4_NORM;
- return VERTEX_FORMAT_UBYTE4;
- default:
- UNREACHABLE();
- break;
- }
- case GL_SHORT:
- switch (components)
- {
- case 1:
- if (pureInteger)
- return VERTEX_FORMAT_SSHORT1_INT;
- if (normalized)
- return VERTEX_FORMAT_SSHORT1_NORM;
- return VERTEX_FORMAT_SSHORT1;
- case 2:
- if (pureInteger)
- return VERTEX_FORMAT_SSHORT2_INT;
- if (normalized)
- return VERTEX_FORMAT_SSHORT2_NORM;
- return VERTEX_FORMAT_SSHORT2;
- case 3:
- if (pureInteger)
- return VERTEX_FORMAT_SSHORT3_INT;
- if (normalized)
- return VERTEX_FORMAT_SSHORT3_NORM;
- return VERTEX_FORMAT_SSHORT3;
- case 4:
- if (pureInteger)
- return VERTEX_FORMAT_SSHORT4_INT;
- if (normalized)
- return VERTEX_FORMAT_SSHORT4_NORM;
- return VERTEX_FORMAT_SSHORT4;
- default:
- UNREACHABLE();
- break;
- }
- case GL_UNSIGNED_SHORT:
- switch (components)
- {
- case 1:
- if (pureInteger)
- return VERTEX_FORMAT_USHORT1_INT;
- if (normalized)
- return VERTEX_FORMAT_USHORT1_NORM;
- return VERTEX_FORMAT_USHORT1;
- case 2:
- if (pureInteger)
- return VERTEX_FORMAT_USHORT2_INT;
- if (normalized)
- return VERTEX_FORMAT_USHORT2_NORM;
- return VERTEX_FORMAT_USHORT2;
- case 3:
- if (pureInteger)
- return VERTEX_FORMAT_USHORT3_INT;
- if (normalized)
- return VERTEX_FORMAT_USHORT3_NORM;
- return VERTEX_FORMAT_USHORT3;
- case 4:
- if (pureInteger)
- return VERTEX_FORMAT_USHORT4_INT;
- if (normalized)
- return VERTEX_FORMAT_USHORT4_NORM;
- return VERTEX_FORMAT_USHORT4;
- default:
- UNREACHABLE();
- break;
- }
- case GL_INT:
- switch (components)
- {
- case 1:
- if (pureInteger)
- return VERTEX_FORMAT_SINT1_INT;
- if (normalized)
- return VERTEX_FORMAT_SINT1_NORM;
- return VERTEX_FORMAT_SINT1;
- case 2:
- if (pureInteger)
- return VERTEX_FORMAT_SINT2_INT;
- if (normalized)
- return VERTEX_FORMAT_SINT2_NORM;
- return VERTEX_FORMAT_SINT2;
- case 3:
- if (pureInteger)
- return VERTEX_FORMAT_SINT3_INT;
- if (normalized)
- return VERTEX_FORMAT_SINT3_NORM;
- return VERTEX_FORMAT_SINT3;
- case 4:
- if (pureInteger)
- return VERTEX_FORMAT_SINT4_INT;
- if (normalized)
- return VERTEX_FORMAT_SINT4_NORM;
- return VERTEX_FORMAT_SINT4;
- default:
- UNREACHABLE();
- break;
- }
- case GL_UNSIGNED_INT:
- switch (components)
- {
- case 1:
- if (pureInteger)
- return VERTEX_FORMAT_UINT1_INT;
- if (normalized)
- return VERTEX_FORMAT_UINT1_NORM;
- return VERTEX_FORMAT_UINT1;
- case 2:
- if (pureInteger)
- return VERTEX_FORMAT_UINT2_INT;
- if (normalized)
- return VERTEX_FORMAT_UINT2_NORM;
- return VERTEX_FORMAT_UINT2;
- case 3:
- if (pureInteger)
- return VERTEX_FORMAT_UINT3_INT;
- if (normalized)
- return VERTEX_FORMAT_UINT3_NORM;
- return VERTEX_FORMAT_UINT3;
- case 4:
- if (pureInteger)
- return VERTEX_FORMAT_UINT4_INT;
- if (normalized)
- return VERTEX_FORMAT_UINT4_NORM;
- return VERTEX_FORMAT_UINT4;
- default:
- UNREACHABLE();
- break;
- }
- case GL_FLOAT:
- switch (components)
- {
- case 1:
- return VERTEX_FORMAT_FLOAT1;
- case 2:
- return VERTEX_FORMAT_FLOAT2;
- case 3:
- return VERTEX_FORMAT_FLOAT3;
- case 4:
- return VERTEX_FORMAT_FLOAT4;
- default:
- UNREACHABLE();
- break;
- }
- case GL_HALF_FLOAT:
- switch (components)
- {
- case 1:
- return VERTEX_FORMAT_HALF1;
- case 2:
- return VERTEX_FORMAT_HALF2;
- case 3:
- return VERTEX_FORMAT_HALF3;
- case 4:
- return VERTEX_FORMAT_HALF4;
- default:
- UNREACHABLE();
- break;
- }
- case GL_FIXED:
- switch (components)
- {
- case 1:
- return VERTEX_FORMAT_FIXED1;
- case 2:
- return VERTEX_FORMAT_FIXED2;
- case 3:
- return VERTEX_FORMAT_FIXED3;
- case 4:
- return VERTEX_FORMAT_FIXED4;
- default:
- UNREACHABLE();
- break;
- }
- case GL_INT_2_10_10_10_REV:
- if (pureInteger)
- return VERTEX_FORMAT_SINT210_INT;
- if (normalized)
- return VERTEX_FORMAT_SINT210_NORM;
- return VERTEX_FORMAT_SINT210;
- case GL_UNSIGNED_INT_2_10_10_10_REV:
- if (pureInteger)
- return VERTEX_FORMAT_UINT210_INT;
- if (normalized)
- return VERTEX_FORMAT_UINT210_NORM;
- return VERTEX_FORMAT_UINT210;
- default:
- UNREACHABLE();
- break;
- }
- return VERTEX_FORMAT_UBYTE1;
-}
-
-VertexFormatType GetVertexFormatType(const VertexAttribute &attrib)
-{
- return GetVertexFormatType(attrib.type, attrib.normalized, attrib.size, attrib.pureInteger);
-}
-
-VertexFormatType GetVertexFormatType(const VertexAttribute &attrib, GLenum currentValueType)
-{
- if (!attrib.enabled)
- {
- return GetVertexFormatType(currentValueType, GL_FALSE, 4, (currentValueType != GL_FLOAT));
- }
- return GetVertexFormatType(attrib);
-}
-
-const VertexFormat &GetVertexFormatFromType(VertexFormatType vertexFormatType)
-{
- switch (vertexFormatType)
- {
- case VERTEX_FORMAT_SBYTE1:
- {
- static const VertexFormat format(GL_BYTE, GL_FALSE, 1, false);
- return format;
- }
- case VERTEX_FORMAT_SBYTE1_NORM:
- {
- static const VertexFormat format(GL_BYTE, GL_TRUE, 1, false);
- return format;
- }
- case VERTEX_FORMAT_SBYTE2:
- {
- static const VertexFormat format(GL_BYTE, GL_FALSE, 2, false);
- return format;
- }
- case VERTEX_FORMAT_SBYTE2_NORM:
- {
- static const VertexFormat format(GL_BYTE, GL_TRUE, 2, false);
- return format;
- }
- case VERTEX_FORMAT_SBYTE3:
- {
- static const VertexFormat format(GL_BYTE, GL_FALSE, 3, false);
- return format;
- }
- case VERTEX_FORMAT_SBYTE3_NORM:
- {
- static const VertexFormat format(GL_BYTE, GL_TRUE, 3, false);
- return format;
- }
- case VERTEX_FORMAT_SBYTE4:
- {
- static const VertexFormat format(GL_BYTE, GL_FALSE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_SBYTE4_NORM:
- {
- static const VertexFormat format(GL_BYTE, GL_TRUE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_UBYTE1:
- {
- static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 1, false);
- return format;
- }
- case VERTEX_FORMAT_UBYTE1_NORM:
- {
- static const VertexFormat format(GL_UNSIGNED_BYTE, GL_TRUE, 1, false);
- return format;
- }
- case VERTEX_FORMAT_UBYTE2:
- {
- static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 2, false);
- return format;
- }
- case VERTEX_FORMAT_UBYTE2_NORM:
- {
- static const VertexFormat format(GL_UNSIGNED_BYTE, GL_TRUE, 2, false);
- return format;
- }
- case VERTEX_FORMAT_UBYTE3:
- {
- static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 3, false);
- return format;
- }
- case VERTEX_FORMAT_UBYTE3_NORM:
- {
- static const VertexFormat format(GL_UNSIGNED_BYTE, GL_TRUE, 3, false);
- return format;
- }
- case VERTEX_FORMAT_UBYTE4:
- {
- static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_UBYTE4_NORM:
- {
- static const VertexFormat format(GL_UNSIGNED_BYTE, GL_TRUE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_SSHORT1:
- {
- static const VertexFormat format(GL_SHORT, GL_FALSE, 1, false);
- return format;
- }
- case VERTEX_FORMAT_SSHORT1_NORM:
- {
- static const VertexFormat format(GL_SHORT, GL_TRUE, 1, false);
- return format;
- }
- case VERTEX_FORMAT_SSHORT2:
- {
- static const VertexFormat format(GL_SHORT, GL_FALSE, 2, false);
- return format;
- }
- case VERTEX_FORMAT_SSHORT2_NORM:
- {
- static const VertexFormat format(GL_SHORT, GL_TRUE, 2, false);
- return format;
- }
- case VERTEX_FORMAT_SSHORT3:
- {
- static const VertexFormat format(GL_SHORT, GL_FALSE, 3, false);
- return format;
- }
- case VERTEX_FORMAT_SSHORT3_NORM:
- {
- static const VertexFormat format(GL_SHORT, GL_TRUE, 3, false);
- return format;
- }
- case VERTEX_FORMAT_SSHORT4:
- {
- static const VertexFormat format(GL_SHORT, GL_FALSE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_SSHORT4_NORM:
- {
- static const VertexFormat format(GL_SHORT, GL_TRUE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_USHORT1:
- {
- static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 1, false);
- return format;
- }
- case VERTEX_FORMAT_USHORT1_NORM:
- {
- static const VertexFormat format(GL_UNSIGNED_SHORT, GL_TRUE, 1, false);
- return format;
- }
- case VERTEX_FORMAT_USHORT2:
- {
- static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 2, false);
- return format;
- }
- case VERTEX_FORMAT_USHORT2_NORM:
- {
- static const VertexFormat format(GL_UNSIGNED_SHORT, GL_TRUE, 2, false);
- return format;
- }
- case VERTEX_FORMAT_USHORT3:
- {
- static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 3, false);
- return format;
- }
- case VERTEX_FORMAT_USHORT3_NORM:
- {
- static const VertexFormat format(GL_UNSIGNED_SHORT, GL_TRUE, 3, false);
- return format;
- }
- case VERTEX_FORMAT_USHORT4:
- {
- static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_USHORT4_NORM:
- {
- static const VertexFormat format(GL_UNSIGNED_SHORT, GL_TRUE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_SINT1:
- {
- static const VertexFormat format(GL_INT, GL_FALSE, 1, false);
- return format;
- }
- case VERTEX_FORMAT_SINT1_NORM:
- {
- static const VertexFormat format(GL_INT, GL_TRUE, 1, false);
- return format;
- }
- case VERTEX_FORMAT_SINT2:
- {
- static const VertexFormat format(GL_INT, GL_FALSE, 2, false);
- return format;
- }
- case VERTEX_FORMAT_SINT2_NORM:
- {
- static const VertexFormat format(GL_INT, GL_TRUE, 2, false);
- return format;
- }
- case VERTEX_FORMAT_SINT3:
- {
- static const VertexFormat format(GL_INT, GL_FALSE, 3, false);
- return format;
- }
- case VERTEX_FORMAT_SINT3_NORM:
- {
- static const VertexFormat format(GL_INT, GL_TRUE, 3, false);
- return format;
- }
- case VERTEX_FORMAT_SINT4:
- {
- static const VertexFormat format(GL_INT, GL_FALSE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_SINT4_NORM:
- {
- static const VertexFormat format(GL_INT, GL_TRUE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_UINT1:
- {
- static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 1, false);
- return format;
- }
- case VERTEX_FORMAT_UINT1_NORM:
- {
- static const VertexFormat format(GL_UNSIGNED_INT, GL_TRUE, 1, false);
- return format;
- }
- case VERTEX_FORMAT_UINT2:
- {
- static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 2, false);
- return format;
- }
- case VERTEX_FORMAT_UINT2_NORM:
- {
- static const VertexFormat format(GL_UNSIGNED_INT, GL_TRUE, 2, false);
- return format;
- }
- case VERTEX_FORMAT_UINT3:
- {
- static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 3, false);
- return format;
- }
- case VERTEX_FORMAT_UINT3_NORM:
- {
- static const VertexFormat format(GL_UNSIGNED_INT, GL_TRUE, 3, false);
- return format;
- }
- case VERTEX_FORMAT_UINT4:
- {
- static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_UINT4_NORM:
- {
- static const VertexFormat format(GL_UNSIGNED_INT, GL_TRUE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_SBYTE1_INT:
- {
- static const VertexFormat format(GL_BYTE, GL_FALSE, 1, true);
- return format;
- }
- case VERTEX_FORMAT_SBYTE2_INT:
- {
- static const VertexFormat format(GL_BYTE, GL_FALSE, 2, true);
- return format;
- }
- case VERTEX_FORMAT_SBYTE3_INT:
- {
- static const VertexFormat format(GL_BYTE, GL_FALSE, 3, true);
- return format;
- }
- case VERTEX_FORMAT_SBYTE4_INT:
- {
- static const VertexFormat format(GL_BYTE, GL_FALSE, 4, true);
- return format;
- }
- case VERTEX_FORMAT_UBYTE1_INT:
- {
- static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 1, true);
- return format;
- }
- case VERTEX_FORMAT_UBYTE2_INT:
- {
- static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 2, true);
- return format;
- }
- case VERTEX_FORMAT_UBYTE3_INT:
- {
- static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 3, true);
- return format;
- }
- case VERTEX_FORMAT_UBYTE4_INT:
- {
- static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 4, true);
- return format;
- }
- case VERTEX_FORMAT_SSHORT1_INT:
- {
- static const VertexFormat format(GL_SHORT, GL_FALSE, 1, true);
- return format;
- }
- case VERTEX_FORMAT_SSHORT2_INT:
- {
- static const VertexFormat format(GL_SHORT, GL_FALSE, 2, true);
- return format;
- }
- case VERTEX_FORMAT_SSHORT3_INT:
- {
- static const VertexFormat format(GL_SHORT, GL_FALSE, 3, true);
- return format;
- }
- case VERTEX_FORMAT_SSHORT4_INT:
- {
- static const VertexFormat format(GL_SHORT, GL_FALSE, 4, true);
- return format;
- }
- case VERTEX_FORMAT_USHORT1_INT:
- {
- static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 1, true);
- return format;
- }
- case VERTEX_FORMAT_USHORT2_INT:
- {
- static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 2, true);
- return format;
- }
- case VERTEX_FORMAT_USHORT3_INT:
- {
- static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 3, true);
- return format;
- }
- case VERTEX_FORMAT_USHORT4_INT:
- {
- static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 4, true);
- return format;
- }
- case VERTEX_FORMAT_SINT1_INT:
- {
- static const VertexFormat format(GL_INT, GL_FALSE, 1, true);
- return format;
- }
- case VERTEX_FORMAT_SINT2_INT:
- {
- static const VertexFormat format(GL_INT, GL_FALSE, 2, true);
- return format;
- }
- case VERTEX_FORMAT_SINT3_INT:
- {
- static const VertexFormat format(GL_INT, GL_FALSE, 3, true);
- return format;
- }
- case VERTEX_FORMAT_SINT4_INT:
- {
- static const VertexFormat format(GL_INT, GL_FALSE, 4, true);
- return format;
- }
- case VERTEX_FORMAT_UINT1_INT:
- {
- static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 1, true);
- return format;
- }
- case VERTEX_FORMAT_UINT2_INT:
- {
- static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 2, true);
- return format;
- }
- case VERTEX_FORMAT_UINT3_INT:
- {
- static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 3, true);
- return format;
- }
- case VERTEX_FORMAT_UINT4_INT:
- {
- static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 4, true);
- return format;
- }
- case VERTEX_FORMAT_FIXED1:
- {
- static const VertexFormat format(GL_FIXED, GL_FALSE, 1, false);
- return format;
- }
- case VERTEX_FORMAT_FIXED2:
- {
- static const VertexFormat format(GL_FIXED, GL_FALSE, 2, false);
- return format;
- }
- case VERTEX_FORMAT_FIXED3:
- {
- static const VertexFormat format(GL_FIXED, GL_FALSE, 3, false);
- return format;
- }
- case VERTEX_FORMAT_FIXED4:
- {
- static const VertexFormat format(GL_FIXED, GL_FALSE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_HALF1:
- {
- static const VertexFormat format(GL_HALF_FLOAT, GL_FALSE, 1, false);
- return format;
- }
- case VERTEX_FORMAT_HALF2:
- {
- static const VertexFormat format(GL_HALF_FLOAT, GL_FALSE, 2, false);
- return format;
- }
- case VERTEX_FORMAT_HALF3:
- {
- static const VertexFormat format(GL_HALF_FLOAT, GL_FALSE, 3, false);
- return format;
- }
- case VERTEX_FORMAT_HALF4:
- {
- static const VertexFormat format(GL_HALF_FLOAT, GL_FALSE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_FLOAT1:
- {
- static const VertexFormat format(GL_FLOAT, GL_FALSE, 1, false);
- return format;
- }
- case VERTEX_FORMAT_FLOAT2:
- {
- static const VertexFormat format(GL_FLOAT, GL_FALSE, 2, false);
- return format;
- }
- case VERTEX_FORMAT_FLOAT3:
- {
- static const VertexFormat format(GL_FLOAT, GL_FALSE, 3, false);
- return format;
- }
- case VERTEX_FORMAT_FLOAT4:
- {
- static const VertexFormat format(GL_FLOAT, GL_FALSE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_SINT210:
- {
- static const VertexFormat format(GL_INT_2_10_10_10_REV, GL_FALSE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_UINT210:
- {
- static const VertexFormat format(GL_UNSIGNED_INT_2_10_10_10_REV, GL_FALSE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_SINT210_NORM:
- {
- static const VertexFormat format(GL_INT_2_10_10_10_REV, GL_TRUE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_UINT210_NORM:
- {
- static const VertexFormat format(GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE, 4, false);
- return format;
- }
- case VERTEX_FORMAT_SINT210_INT:
- {
- static const VertexFormat format(GL_INT_2_10_10_10_REV, GL_FALSE, 4, true);
- return format;
- }
- case VERTEX_FORMAT_UINT210_INT:
- {
- static const VertexFormat format(GL_UNSIGNED_INT_2_10_10_10_REV, GL_FALSE, 4, true);
- return format;
- }
- default:
- {
- static const VertexFormat format(GL_NONE, GL_FALSE, 0, false);
- return format;
- }
- }
-}
-
-size_t GetVertexFormatTypeSize(VertexFormatType vertexFormatType)
-{
- switch (vertexFormatType)
- {
- case VERTEX_FORMAT_SBYTE1:
- case VERTEX_FORMAT_SBYTE1_NORM:
- case VERTEX_FORMAT_UBYTE1:
- case VERTEX_FORMAT_UBYTE1_NORM:
- case VERTEX_FORMAT_SBYTE1_INT:
- case VERTEX_FORMAT_UBYTE1_INT:
- return 1;
-
- case VERTEX_FORMAT_SBYTE2:
- case VERTEX_FORMAT_SBYTE2_NORM:
- case VERTEX_FORMAT_UBYTE2:
- case VERTEX_FORMAT_UBYTE2_NORM:
- case VERTEX_FORMAT_SBYTE2_INT:
- case VERTEX_FORMAT_UBYTE2_INT:
- case VERTEX_FORMAT_SSHORT1:
- case VERTEX_FORMAT_SSHORT1_NORM:
- case VERTEX_FORMAT_USHORT1:
- case VERTEX_FORMAT_USHORT1_NORM:
- case VERTEX_FORMAT_SSHORT1_INT:
- case VERTEX_FORMAT_USHORT1_INT:
- case VERTEX_FORMAT_HALF1:
- return 2;
-
- case VERTEX_FORMAT_SBYTE3:
- case VERTEX_FORMAT_SBYTE3_NORM:
- case VERTEX_FORMAT_UBYTE3:
- case VERTEX_FORMAT_UBYTE3_NORM:
- case VERTEX_FORMAT_SBYTE3_INT:
- case VERTEX_FORMAT_UBYTE3_INT:
- return 3;
-
- case VERTEX_FORMAT_SBYTE4:
- case VERTEX_FORMAT_SBYTE4_NORM:
- case VERTEX_FORMAT_UBYTE4:
- case VERTEX_FORMAT_UBYTE4_NORM:
- case VERTEX_FORMAT_SBYTE4_INT:
- case VERTEX_FORMAT_UBYTE4_INT:
- case VERTEX_FORMAT_SSHORT2:
- case VERTEX_FORMAT_SSHORT2_NORM:
- case VERTEX_FORMAT_USHORT2:
- case VERTEX_FORMAT_USHORT2_NORM:
- case VERTEX_FORMAT_SSHORT2_INT:
- case VERTEX_FORMAT_USHORT2_INT:
- case VERTEX_FORMAT_SINT1:
- case VERTEX_FORMAT_SINT1_NORM:
- case VERTEX_FORMAT_UINT1:
- case VERTEX_FORMAT_UINT1_NORM:
- case VERTEX_FORMAT_SINT1_INT:
- case VERTEX_FORMAT_UINT1_INT:
- case VERTEX_FORMAT_HALF2:
- case VERTEX_FORMAT_FIXED1:
- case VERTEX_FORMAT_FLOAT1:
- case VERTEX_FORMAT_SINT210:
- case VERTEX_FORMAT_UINT210:
- case VERTEX_FORMAT_SINT210_NORM:
- case VERTEX_FORMAT_UINT210_NORM:
- case VERTEX_FORMAT_SINT210_INT:
- case VERTEX_FORMAT_UINT210_INT:
- return 4;
-
- case VERTEX_FORMAT_SSHORT3:
- case VERTEX_FORMAT_SSHORT3_NORM:
- case VERTEX_FORMAT_USHORT3:
- case VERTEX_FORMAT_USHORT3_NORM:
- case VERTEX_FORMAT_SSHORT3_INT:
- case VERTEX_FORMAT_USHORT3_INT:
- case VERTEX_FORMAT_HALF3:
- return 6;
-
- case VERTEX_FORMAT_SSHORT4:
- case VERTEX_FORMAT_SSHORT4_NORM:
- case VERTEX_FORMAT_USHORT4:
- case VERTEX_FORMAT_USHORT4_NORM:
- case VERTEX_FORMAT_SSHORT4_INT:
- case VERTEX_FORMAT_USHORT4_INT:
- case VERTEX_FORMAT_SINT2:
- case VERTEX_FORMAT_SINT2_NORM:
- case VERTEX_FORMAT_UINT2:
- case VERTEX_FORMAT_UINT2_NORM:
- case VERTEX_FORMAT_SINT2_INT:
- case VERTEX_FORMAT_UINT2_INT:
- case VERTEX_FORMAT_HALF4:
- case VERTEX_FORMAT_FIXED2:
- case VERTEX_FORMAT_FLOAT2:
- return 8;
-
- case VERTEX_FORMAT_SINT3:
- case VERTEX_FORMAT_SINT3_NORM:
- case VERTEX_FORMAT_UINT3:
- case VERTEX_FORMAT_UINT3_NORM:
- case VERTEX_FORMAT_SINT3_INT:
- case VERTEX_FORMAT_UINT3_INT:
- case VERTEX_FORMAT_FIXED3:
- case VERTEX_FORMAT_FLOAT3:
- return 12;
-
- case VERTEX_FORMAT_SINT4:
- case VERTEX_FORMAT_SINT4_NORM:
- case VERTEX_FORMAT_UINT4:
- case VERTEX_FORMAT_UINT4_NORM:
- case VERTEX_FORMAT_SINT4_INT:
- case VERTEX_FORMAT_UINT4_INT:
- case VERTEX_FORMAT_FIXED4:
- case VERTEX_FORMAT_FLOAT4:
- return 16;
-
- case VERTEX_FORMAT_INVALID:
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-bool ValidES3InternalFormat(GLenum internalFormat)
-{
- const InternalFormatInfoMap &formatMap = GetInternalFormatMap();
- return internalFormat != GL_NONE && formatMap.find(internalFormat) != formatMap.end();
-}
-
-VertexFormat::VertexFormat(GLenum typeIn, GLboolean normalizedIn, GLuint componentsIn, bool pureIntegerIn)
- : type(typeIn),
- normalized(normalizedIn),
- components(componentsIn),
- pureInteger(pureIntegerIn)
-{
- // float -> !normalized
- ASSERT(!(type == GL_FLOAT || type == GL_HALF_FLOAT || type == GL_FIXED) || normalized == GL_FALSE);
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/formatutils.h b/src/3rdparty/angle/src/libANGLE/formatutils.h
deleted file mode 100644
index dbfe590846..0000000000
--- a/src/3rdparty/angle/src/libANGLE/formatutils.h
+++ /dev/null
@@ -1,329 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// formatutils.h: Queries for GL image formats.
-
-#ifndef LIBANGLE_FORMATUTILS_H_
-#define LIBANGLE_FORMATUTILS_H_
-
-#include <cstddef>
-#include <ostream>
-#include <stdint.h>
-
-#include "angle_gl.h"
-#include "libANGLE/Caps.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/Version.h"
-#include "libANGLE/angletypes.h"
-
-namespace gl
-{
-struct VertexAttribute;
-
-struct FormatType final
-{
- FormatType();
- FormatType(GLenum format_, GLenum type_);
- FormatType(const FormatType &other) = default;
- FormatType &operator=(const FormatType &other) = default;
-
- bool operator<(const FormatType &other) const;
-
- GLenum format;
- GLenum type;
-};
-
-struct Type
-{
- Type();
-
- GLuint bytes;
- GLuint bytesShift; // Bit shift by this value to effectively divide/multiply by "bytes" in a more optimal way
- bool specialInterpretation;
-};
-const Type &GetTypeInfo(GLenum type);
-
-// Information about an OpenGL internal format. Can be keyed on the internalFormat and type
-// members.
-struct InternalFormat
-{
- InternalFormat();
- InternalFormat(const InternalFormat &other);
-
- GLuint computePixelBytes(GLenum formatType) const;
-
- ErrorOrResult<GLuint> computeRowPitch(GLenum formatType,
- GLsizei width,
- GLint alignment,
- GLint rowLength) const;
- ErrorOrResult<GLuint> computeDepthPitch(GLsizei height,
- GLint imageHeight,
- GLuint rowPitch) const;
- ErrorOrResult<GLuint> computeDepthPitch(GLenum formatType,
- GLsizei width,
- GLsizei height,
- GLint alignment,
- GLint rowLength,
- GLint imageHeight) const;
-
- ErrorOrResult<GLuint> computeCompressedImageSize(const Extents &size) const;
-
- ErrorOrResult<GLuint> computeSkipBytes(GLuint rowPitch,
- GLuint depthPitch,
- const PixelStoreStateBase &state,
- bool is3D) const;
-
- ErrorOrResult<GLuint> computePackUnpackEndByte(GLenum formatType,
- const Extents &size,
- const PixelStoreStateBase &state,
- bool is3D) const;
-
- bool isLUMA() const;
- GLenum getReadPixelsFormat() const;
- GLenum getReadPixelsType(const Version &version) const;
-
- // Return true if the format is a required renderbuffer format in the given version of the core
- // spec. Note that it isn't always clear whether all the rules that apply to core required
- // renderbuffer formats also apply to additional formats added by extensions. Because of this
- // extension formats are conservatively not included.
- bool isRequiredRenderbufferFormat(const Version &version) const;
-
- bool operator==(const InternalFormat &other) const;
- bool operator!=(const InternalFormat &other) const;
-
- GLenum internalFormat;
-
- bool sized;
- GLenum sizedInternalFormat;
-
- GLuint redBits;
- GLuint greenBits;
- GLuint blueBits;
-
- GLuint luminanceBits;
-
- GLuint alphaBits;
- GLuint sharedBits;
-
- GLuint depthBits;
- GLuint stencilBits;
-
- GLuint pixelBytes;
-
- GLuint componentCount;
-
- bool compressed;
- GLuint compressedBlockWidth;
- GLuint compressedBlockHeight;
-
- GLenum format;
- GLenum type;
-
- GLenum componentType;
- GLenum colorEncoding;
-
- typedef bool (*SupportCheckFunction)(const Version &, const Extensions &);
- SupportCheckFunction textureSupport;
- SupportCheckFunction renderSupport;
- SupportCheckFunction filterSupport;
-};
-
-// A "Format" wraps an InternalFormat struct, querying it from either a sized internal format or
-// unsized internal format and type.
-// TODO(geofflang): Remove this, it doesn't add any more information than the InternalFormat object.
-struct Format
-{
- // Sized types only.
- explicit Format(GLenum internalFormat);
-
- // Sized or unsized types.
- explicit Format(const InternalFormat &internalFormat);
- Format(GLenum internalFormat, GLenum type);
-
- Format(const Format &other);
- Format &operator=(const Format &other);
-
- bool valid() const;
-
- static Format Invalid();
- static bool SameSized(const Format &a, const Format &b);
- static bool EquivalentForBlit(const Format &a, const Format &b);
-
- friend std::ostream &operator<<(std::ostream &os, const Format &fmt);
-
- // This is the sized info.
- const InternalFormat *info;
-};
-
-const InternalFormat &GetSizedInternalFormatInfo(GLenum internalFormat);
-const InternalFormat &GetInternalFormatInfo(GLenum internalFormat, GLenum type);
-
-// Strip sizing information from an internal format. Doesn't necessarily validate that the internal
-// format is valid.
-GLenum GetUnsizedFormat(GLenum internalFormat);
-
-typedef std::set<GLenum> FormatSet;
-const FormatSet &GetAllSizedInternalFormats();
-
-// From the ESSL 3.00.4 spec:
-// Vertex shader inputs can only be float, floating-point vectors, matrices, signed and unsigned
-// integers and integer vectors. Vertex shader inputs cannot be arrays or structures.
-
-enum AttributeType
-{
- ATTRIBUTE_FLOAT,
- ATTRIBUTE_VEC2,
- ATTRIBUTE_VEC3,
- ATTRIBUTE_VEC4,
- ATTRIBUTE_INT,
- ATTRIBUTE_IVEC2,
- ATTRIBUTE_IVEC3,
- ATTRIBUTE_IVEC4,
- ATTRIBUTE_UINT,
- ATTRIBUTE_UVEC2,
- ATTRIBUTE_UVEC3,
- ATTRIBUTE_UVEC4,
- ATTRIBUTE_MAT2,
- ATTRIBUTE_MAT3,
- ATTRIBUTE_MAT4,
- ATTRIBUTE_MAT2x3,
- ATTRIBUTE_MAT2x4,
- ATTRIBUTE_MAT3x2,
- ATTRIBUTE_MAT3x4,
- ATTRIBUTE_MAT4x2,
- ATTRIBUTE_MAT4x3,
-};
-
-AttributeType GetAttributeType(GLenum enumValue);
-
-enum VertexFormatType
-{
- VERTEX_FORMAT_INVALID,
- VERTEX_FORMAT_SBYTE1,
- VERTEX_FORMAT_SBYTE1_NORM,
- VERTEX_FORMAT_SBYTE2,
- VERTEX_FORMAT_SBYTE2_NORM,
- VERTEX_FORMAT_SBYTE3,
- VERTEX_FORMAT_SBYTE3_NORM,
- VERTEX_FORMAT_SBYTE4,
- VERTEX_FORMAT_SBYTE4_NORM,
- VERTEX_FORMAT_UBYTE1,
- VERTEX_FORMAT_UBYTE1_NORM,
- VERTEX_FORMAT_UBYTE2,
- VERTEX_FORMAT_UBYTE2_NORM,
- VERTEX_FORMAT_UBYTE3,
- VERTEX_FORMAT_UBYTE3_NORM,
- VERTEX_FORMAT_UBYTE4,
- VERTEX_FORMAT_UBYTE4_NORM,
- VERTEX_FORMAT_SSHORT1,
- VERTEX_FORMAT_SSHORT1_NORM,
- VERTEX_FORMAT_SSHORT2,
- VERTEX_FORMAT_SSHORT2_NORM,
- VERTEX_FORMAT_SSHORT3,
- VERTEX_FORMAT_SSHORT3_NORM,
- VERTEX_FORMAT_SSHORT4,
- VERTEX_FORMAT_SSHORT4_NORM,
- VERTEX_FORMAT_USHORT1,
- VERTEX_FORMAT_USHORT1_NORM,
- VERTEX_FORMAT_USHORT2,
- VERTEX_FORMAT_USHORT2_NORM,
- VERTEX_FORMAT_USHORT3,
- VERTEX_FORMAT_USHORT3_NORM,
- VERTEX_FORMAT_USHORT4,
- VERTEX_FORMAT_USHORT4_NORM,
- VERTEX_FORMAT_SINT1,
- VERTEX_FORMAT_SINT1_NORM,
- VERTEX_FORMAT_SINT2,
- VERTEX_FORMAT_SINT2_NORM,
- VERTEX_FORMAT_SINT3,
- VERTEX_FORMAT_SINT3_NORM,
- VERTEX_FORMAT_SINT4,
- VERTEX_FORMAT_SINT4_NORM,
- VERTEX_FORMAT_UINT1,
- VERTEX_FORMAT_UINT1_NORM,
- VERTEX_FORMAT_UINT2,
- VERTEX_FORMAT_UINT2_NORM,
- VERTEX_FORMAT_UINT3,
- VERTEX_FORMAT_UINT3_NORM,
- VERTEX_FORMAT_UINT4,
- VERTEX_FORMAT_UINT4_NORM,
- VERTEX_FORMAT_SBYTE1_INT,
- VERTEX_FORMAT_SBYTE2_INT,
- VERTEX_FORMAT_SBYTE3_INT,
- VERTEX_FORMAT_SBYTE4_INT,
- VERTEX_FORMAT_UBYTE1_INT,
- VERTEX_FORMAT_UBYTE2_INT,
- VERTEX_FORMAT_UBYTE3_INT,
- VERTEX_FORMAT_UBYTE4_INT,
- VERTEX_FORMAT_SSHORT1_INT,
- VERTEX_FORMAT_SSHORT2_INT,
- VERTEX_FORMAT_SSHORT3_INT,
- VERTEX_FORMAT_SSHORT4_INT,
- VERTEX_FORMAT_USHORT1_INT,
- VERTEX_FORMAT_USHORT2_INT,
- VERTEX_FORMAT_USHORT3_INT,
- VERTEX_FORMAT_USHORT4_INT,
- VERTEX_FORMAT_SINT1_INT,
- VERTEX_FORMAT_SINT2_INT,
- VERTEX_FORMAT_SINT3_INT,
- VERTEX_FORMAT_SINT4_INT,
- VERTEX_FORMAT_UINT1_INT,
- VERTEX_FORMAT_UINT2_INT,
- VERTEX_FORMAT_UINT3_INT,
- VERTEX_FORMAT_UINT4_INT,
- VERTEX_FORMAT_FIXED1,
- VERTEX_FORMAT_FIXED2,
- VERTEX_FORMAT_FIXED3,
- VERTEX_FORMAT_FIXED4,
- VERTEX_FORMAT_HALF1,
- VERTEX_FORMAT_HALF2,
- VERTEX_FORMAT_HALF3,
- VERTEX_FORMAT_HALF4,
- VERTEX_FORMAT_FLOAT1,
- VERTEX_FORMAT_FLOAT2,
- VERTEX_FORMAT_FLOAT3,
- VERTEX_FORMAT_FLOAT4,
- VERTEX_FORMAT_SINT210,
- VERTEX_FORMAT_UINT210,
- VERTEX_FORMAT_SINT210_NORM,
- VERTEX_FORMAT_UINT210_NORM,
- VERTEX_FORMAT_SINT210_INT,
- VERTEX_FORMAT_UINT210_INT,
-};
-
-typedef std::vector<VertexFormatType> InputLayout;
-
-struct VertexFormat : private angle::NonCopyable
-{
- VertexFormat(GLenum typeIn, GLboolean normalizedIn, GLuint componentsIn, bool pureIntegerIn);
-
- GLenum type;
- GLboolean normalized;
- GLuint components;
- bool pureInteger;
-};
-
-VertexFormatType GetVertexFormatType(GLenum type, GLboolean normalized, GLuint components, bool pureInteger);
-VertexFormatType GetVertexFormatType(const VertexAttribute &attrib);
-VertexFormatType GetVertexFormatType(const VertexAttribute &attrib, GLenum currentValueType);
-const VertexFormat &GetVertexFormatFromType(VertexFormatType vertexFormatType);
-size_t GetVertexFormatTypeSize(VertexFormatType vertexFormatType);
-
-// Check if an internal format is ever valid in ES3. Makes no checks about support for a specific
-// context.
-bool ValidES3InternalFormat(GLenum internalFormat);
-
-// Implemented in format_map_autogen.cpp
-bool ValidES3Format(GLenum format);
-bool ValidES3Type(GLenum type);
-bool ValidES3FormatCombination(GLenum format, GLenum type, GLenum internalFormat);
-
-// Implemented in es3_copy_conversion_table_autogen.cpp
-bool ValidES3CopyConversion(GLenum textureFormat, GLenum framebufferFormat);
-
-} // namespace gl
-
-#endif // LIBANGLE_FORMATUTILS_H_
diff --git a/src/3rdparty/angle/src/libANGLE/histogram_macros.h b/src/3rdparty/angle/src/libANGLE/histogram_macros.h
deleted file mode 100644
index fb428b46d2..0000000000
--- a/src/3rdparty/angle/src/libANGLE/histogram_macros.h
+++ /dev/null
@@ -1,112 +0,0 @@
-//
-// Copyright 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// histogram_macros.h:
-// Helpers for making histograms, to keep consistency with Chromium's
-// histogram_macros.h.
-
-#ifndef LIBANGLE_HISTOGRAM_MACROS_H_
-#define LIBANGLE_HISTOGRAM_MACROS_H_
-
-#include <platform/Platform.h>
-
-#define ANGLE_HISTOGRAM_TIMES(name, sample) ANGLE_HISTOGRAM_CUSTOM_TIMES( \
- name, sample, 1, 10000, 50)
-
-#define ANGLE_HISTOGRAM_MEDIUM_TIMES(name, sample) ANGLE_HISTOGRAM_CUSTOM_TIMES( \
- name, sample, 10, 180000, 50)
-
-// Use this macro when times can routinely be much longer than 10 seconds.
-#define ANGLE_HISTOGRAM_LONG_TIMES(name, sample) ANGLE_HISTOGRAM_CUSTOM_TIMES( \
- name, sample, 1, 3600000, 50)
-
-// Use this macro when times can routinely be much longer than 10 seconds and
-// you want 100 buckets.
-#define ANGLE_HISTOGRAM_LONG_TIMES_100(name, sample) ANGLE_HISTOGRAM_CUSTOM_TIMES( \
- name, sample, 1, 3600000, 100)
-
-// For folks that need real specific times, use this to select a precise range
-// of times you want plotted, and the number of buckets you want used.
-#define ANGLE_HISTOGRAM_CUSTOM_TIMES(name, sample, min, max, bucket_count) \
- ANGLE_HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, bucket_count)
-
-#define ANGLE_HISTOGRAM_COUNTS(name, sample) ANGLE_HISTOGRAM_CUSTOM_COUNTS( \
- name, sample, 1, 1000000, 50)
-
-#define ANGLE_HISTOGRAM_COUNTS_100(name, sample) \
- ANGLE_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, 100, 50)
-
-#define ANGLE_HISTOGRAM_COUNTS_10000(name, sample) \
- ANGLE_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, 10000, 50)
-
-#define ANGLE_HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, bucket_count) \
- ANGLEPlatformCurrent()->histogramCustomCounts(ANGLEPlatformCurrent(), name, sample, min, max, \
- bucket_count)
-
-#define ANGLE_HISTOGRAM_PERCENTAGE(name, under_one_hundred) \
- ANGLE_HISTOGRAM_ENUMERATION(name, under_one_hundred, 101)
-
-#define ANGLE_HISTOGRAM_BOOLEAN(name, sample) \
- ANGLEPlatformCurrent()->histogramBoolean(ANGLEPlatformCurrent(), name, sample)
-
-#define ANGLE_HISTOGRAM_ENUMERATION(name, sample, boundary_value) \
- ANGLEPlatformCurrent()->histogramEnumeration(ANGLEPlatformCurrent(), name, sample, \
- boundary_value)
-
-#define ANGLE_HISTOGRAM_MEMORY_KB(name, sample) ANGLE_HISTOGRAM_CUSTOM_COUNTS( \
- name, sample, 1000, 500000, 50)
-
-#define ANGLE_HISTOGRAM_MEMORY_MB(name, sample) ANGLE_HISTOGRAM_CUSTOM_COUNTS( \
- name, sample, 1, 1000, 50)
-
-#define ANGLE_HISTOGRAM_SPARSE_SLOWLY(name, sample) \
- ANGLEPlatformCurrent()->histogramSparse(ANGLEPlatformCurrent(), name, sample)
-
-// Scoped class which logs its time on this earth as a UMA statistic. This is
-// recommended for when you want a histogram which measures the time it takes
-// for a method to execute. This measures up to 10 seconds.
-#define SCOPED_ANGLE_HISTOGRAM_TIMER(name) \
- SCOPED_ANGLE_HISTOGRAM_TIMER_EXPANDER(name, false, __COUNTER__)
-
-// Similar scoped histogram timer, but this uses ANGLE_HISTOGRAM_LONG_TIMES_100,
-// which measures up to an hour, and uses 100 buckets. This is more expensive
-// to store, so only use if this often takes >10 seconds.
-#define SCOPED_ANGLE_HISTOGRAM_LONG_TIMER(name) \
- SCOPED_ANGLE_HISTOGRAM_TIMER_EXPANDER(name, true, __COUNTER__)
-
-// This nested macro is necessary to expand __COUNTER__ to an actual value.
-#define SCOPED_ANGLE_HISTOGRAM_TIMER_EXPANDER(name, is_long, key) \
- SCOPED_ANGLE_HISTOGRAM_TIMER_UNIQUE(name, is_long, key)
-
-#define SCOPED_ANGLE_HISTOGRAM_TIMER_UNIQUE(name, is_long, key) \
- class ScopedHistogramTimer##key \
- { \
- public: \
- ScopedHistogramTimer##key() \
- : constructed_(ANGLEPlatformCurrent()->currentTime(ANGLEPlatformCurrent())) \
- { \
- } \
- ~ScopedHistogramTimer##key() \
- { \
- if (constructed_ == 0) \
- return; \
- auto *platform = ANGLEPlatformCurrent(); \
- double elapsed = platform->currentTime(platform) - constructed_; \
- int elapsedMS = static_cast<int>(elapsed * 1000.0); \
- if (is_long) \
- { \
- ANGLE_HISTOGRAM_LONG_TIMES_100(name, elapsedMS); \
- } \
- else \
- { \
- ANGLE_HISTOGRAM_TIMES(name, elapsedMS); \
- } \
- } \
- \
- private: \
- double constructed_; \
- } scoped_histogram_timer_##key
-
-#endif // LIBANGLE_HISTOGRAM_MACROS_H_
diff --git a/src/3rdparty/angle/src/libANGLE/packed_gl_enums.json b/src/3rdparty/angle/src/libANGLE/packed_gl_enums.json
deleted file mode 100644
index 7e77de2f36..0000000000
--- a/src/3rdparty/angle/src/libANGLE/packed_gl_enums.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "BufferBinding":
- {
- "Array": "GL_ARRAY_BUFFER",
- "AtomicCounter": "GL_ATOMIC_COUNTER_BUFFER",
- "CopyRead": "GL_COPY_READ_BUFFER",
- "CopyWrite": "GL_COPY_WRITE_BUFFER",
- "DispatchIndirect": "GL_DISPATCH_INDIRECT_BUFFER",
- "DrawIndirect": "GL_DRAW_INDIRECT_BUFFER",
- "ElementArray": "GL_ELEMENT_ARRAY_BUFFER",
- "PixelPack": "GL_PIXEL_PACK_BUFFER",
- "PixelUnpack": "GL_PIXEL_UNPACK_BUFFER",
- "ShaderStorage": "GL_SHADER_STORAGE_BUFFER",
- "TransformFeedback": "GL_TRANSFORM_FEEDBACK_BUFFER",
- "Uniform": "GL_UNIFORM_BUFFER"
- },
- "BufferUsage":
- {
- "DynamicCopy": "GL_DYNAMIC_COPY",
- "DynamicDraw": "GL_DYNAMIC_DRAW",
- "DynamicRead": "GL_DYNAMIC_READ",
- "StaticCopy": "GL_STATIC_COPY",
- "StaticDraw": "GL_STATIC_DRAW",
- "StaticRead": "GL_STATIC_READ",
- "StreamCopy": "GL_STREAM_COPY",
- "StreamDraw": "GL_STREAM_DRAW",
- "StreamRead": "GL_STREAM_READ"
- },
- "CullFaceMode":
- {
- "Back": "GL_BACK",
- "Front": "GL_FRONT",
- "FrontAndBack": "GL_FRONT_AND_BACK"
- }
-}
diff --git a/src/3rdparty/angle/src/libANGLE/params.cpp b/src/3rdparty/angle/src/libANGLE/params.cpp
deleted file mode 100644
index a89d87e0a9..0000000000
--- a/src/3rdparty/angle/src/libANGLE/params.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// params:
-// Parameter wrapper structs for OpenGL ES. These helpers cache re-used values
-// in entry point routines.
-
-#include "libANGLE/params.h"
-
-#include "common/utilities.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/VertexArray.h"
-
-namespace gl
-{
-
-// static
-constexpr ParamTypeInfo ParamsBase::TypeInfo;
-constexpr ParamTypeInfo HasIndexRange::TypeInfo;
-
-HasIndexRange::HasIndexRange()
- : ParamsBase(nullptr), mContext(nullptr), mCount(0), mType(GL_NONE), mIndices(nullptr)
-{
-}
-
-HasIndexRange::HasIndexRange(Context *context, GLsizei count, GLenum type, const void *indices)
- : ParamsBase(context), mContext(context), mCount(count), mType(type), mIndices(indices)
-{
-}
-
-const Optional<IndexRange> &HasIndexRange::getIndexRange() const
-{
- if (mIndexRange.valid() || !mContext)
- {
- return mIndexRange;
- }
-
- const State &state = mContext->getGLState();
-
- const gl::VertexArray *vao = state.getVertexArray();
- gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get();
-
- if (elementArrayBuffer)
- {
- uintptr_t offset = reinterpret_cast<uintptr_t>(mIndices);
- IndexRange indexRange;
- Error error =
- elementArrayBuffer->getIndexRange(mContext, mType, static_cast<size_t>(offset), mCount,
- state.isPrimitiveRestartEnabled(), &indexRange);
- if (error.isError())
- {
- mContext->handleError(error);
- return mIndexRange;
- }
-
- mIndexRange = indexRange;
- }
- else
- {
- mIndexRange = ComputeIndexRange(mType, mIndices, mCount, state.isPrimitiveRestartEnabled());
- }
-
- return mIndexRange;
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/params.h b/src/3rdparty/angle/src/libANGLE/params.h
deleted file mode 100644
index 27dba640ff..0000000000
--- a/src/3rdparty/angle/src/libANGLE/params.h
+++ /dev/null
@@ -1,228 +0,0 @@
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// params:
-// Parameter wrapper structs for OpenGL ES. These helpers cache re-used values
-// in entry point routines.
-
-#ifndef LIBANGLE_PARAMS_H_
-#define LIBANGLE_PARAMS_H_
-
-#include "angle_gl.h"
-#include "common/Optional.h"
-#include "common/angleutils.h"
-#include "common/mathutil.h"
-#include "libANGLE/entry_points_enum_autogen.h"
-
-namespace gl
-{
-class Context;
-
-template <EntryPoint EP>
-struct EntryPointParam;
-
-template <EntryPoint EP>
-using EntryPointParamType = typename EntryPointParam<EP>::Type;
-
-class ParamTypeInfo
-{
- public:
- constexpr ParamTypeInfo(const char *selfClass, const ParamTypeInfo *parentType)
- : mSelfClass(selfClass), mParentTypeInfo(parentType)
- {
- }
-
- constexpr bool hasDynamicType(const ParamTypeInfo &typeInfo) const
- {
- return mSelfClass == typeInfo.mSelfClass ||
- (mParentTypeInfo && mParentTypeInfo->hasDynamicType(typeInfo));
- }
-
- constexpr bool isValid() const { return mSelfClass != nullptr; }
-
- private:
- const char *mSelfClass;
- const ParamTypeInfo *mParentTypeInfo;
-};
-
-#define ANGLE_PARAM_TYPE_INFO(NAME, BASENAME) \
- static constexpr ParamTypeInfo TypeInfo = {#NAME, &BASENAME::TypeInfo}
-
-class ParamsBase : angle::NonCopyable
-{
- public:
- ParamsBase(Context *context, ...){};
-
- template <EntryPoint EP, typename... ArgsT>
- static void Factory(EntryPointParamType<EP> *objBuffer, ArgsT... args);
-
- static constexpr ParamTypeInfo TypeInfo = {nullptr, nullptr};
-};
-
-// static
-template <EntryPoint EP, typename... ArgsT>
-ANGLE_INLINE void ParamsBase::Factory(EntryPointParamType<EP> *objBuffer, ArgsT... args)
-{
- new (objBuffer) EntryPointParamType<EP>(args...);
-}
-
-class HasIndexRange : public ParamsBase
-{
- public:
- // Dummy placeholder that can't generate an index range.
- HasIndexRange();
- HasIndexRange(Context *context, GLsizei count, GLenum type, const void *indices);
-
- template <EntryPoint EP, typename... ArgsT>
- static void Factory(HasIndexRange *objBuffer, ArgsT... args);
-
- const Optional<IndexRange> &getIndexRange() const;
-
- ANGLE_PARAM_TYPE_INFO(HasIndexRange, ParamsBase);
-
- private:
- Context *mContext;
- GLsizei mCount;
- GLenum mType;
- const GLvoid *mIndices;
- mutable Optional<IndexRange> mIndexRange;
-};
-
-// Entry point funcs essentially re-map different entry point parameter arrays into
-// the format the parameter type class expects. For example, for HasIndexRange, for the
-// various indexed draw calls, they drop parameters that aren't useful and re-arrange
-// the rest.
-#define ANGLE_ENTRY_POINT_FUNC(NAME, CLASS, ...) \
- \
-template<> struct EntryPointParam<EntryPoint::NAME> \
- { \
- using Type = CLASS; \
- }; \
- \
-template<> inline void CLASS::Factory<EntryPoint::NAME>(__VA_ARGS__)
-
-ANGLE_ENTRY_POINT_FUNC(DrawElements,
- HasIndexRange,
- HasIndexRange *objBuffer,
- Context *context,
- GLenum /*mode*/,
- GLsizei count,
- GLenum type,
- const void *indices)
-{
- return ParamsBase::Factory<EntryPoint::DrawElements>(objBuffer, context, count, type, indices);
-}
-
-ANGLE_ENTRY_POINT_FUNC(DrawElementsInstanced,
- HasIndexRange,
- HasIndexRange *objBuffer,
- Context *context,
- GLenum /*mode*/,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei /*instanceCount*/)
-{
- return ParamsBase::Factory<EntryPoint::DrawElementsInstanced>(objBuffer, context, count, type,
- indices);
-}
-
-ANGLE_ENTRY_POINT_FUNC(DrawElementsInstancedANGLE,
- HasIndexRange,
- HasIndexRange *objBuffer,
- Context *context,
- GLenum /*mode*/,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei /*instanceCount*/)
-{
- return ParamsBase::Factory<EntryPoint::DrawElementsInstancedANGLE>(objBuffer, context, count,
- type, indices);
-}
-
-ANGLE_ENTRY_POINT_FUNC(DrawRangeElements,
- HasIndexRange,
- HasIndexRange *objBuffer,
- Context *context,
- GLenum /*mode*/,
- GLuint /*start*/,
- GLuint /*end*/,
- GLsizei count,
- GLenum type,
- const void *indices)
-{
- return ParamsBase::Factory<EntryPoint::DrawRangeElements>(objBuffer, context, count, type,
- indices);
-}
-
-#undef ANGLE_ENTRY_POINT_FUNC
-
-template <EntryPoint EP>
-struct EntryPointParam
-{
- using Type = ParamsBase;
-};
-
-// A template struct for determining the default value to return for each entry point.
-template <EntryPoint EP, typename ReturnType>
-struct DefaultReturnValue;
-
-// Default return values for each basic return type.
-template <EntryPoint EP>
-struct DefaultReturnValue<EP, GLint>
-{
- static constexpr GLint kValue = -1;
-};
-
-// This doubles as the GLenum return value.
-template <EntryPoint EP>
-struct DefaultReturnValue<EP, GLuint>
-{
- static constexpr GLuint kValue = 0;
-};
-
-template <EntryPoint EP>
-struct DefaultReturnValue<EP, GLboolean>
-{
- static constexpr GLboolean kValue = GL_FALSE;
-};
-
-// Catch-all rules for pointer types.
-template <EntryPoint EP, typename PointerType>
-struct DefaultReturnValue<EP, const PointerType *>
-{
- static constexpr const PointerType *kValue = nullptr;
-};
-
-template <EntryPoint EP, typename PointerType>
-struct DefaultReturnValue<EP, PointerType *>
-{
- static constexpr PointerType *kValue = nullptr;
-};
-
-// Overloaded to return invalid index
-template <>
-struct DefaultReturnValue<EntryPoint::GetUniformBlockIndex, GLuint>
-{
- static constexpr GLuint kValue = GL_INVALID_INDEX;
-};
-
-// Specialized enum error value.
-template <>
-struct DefaultReturnValue<EntryPoint::ClientWaitSync, GLenum>
-{
- static constexpr GLenum kValue = GL_WAIT_FAILED;
-};
-
-template <EntryPoint EP, typename ReturnType>
-constexpr ANGLE_INLINE ReturnType GetDefaultReturnValue()
-{
- return DefaultReturnValue<EP, ReturnType>::kValue;
-}
-
-} // namespace gl
-
-#endif // LIBANGLE_PARAMS_H_
diff --git a/src/3rdparty/angle/src/libANGLE/queryconversions.cpp b/src/3rdparty/angle/src/libANGLE/queryconversions.cpp
deleted file mode 100644
index 78d219365e..0000000000
--- a/src/3rdparty/angle/src/libANGLE/queryconversions.cpp
+++ /dev/null
@@ -1,283 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// queryconversions.cpp: Implementation of state query cast conversions
-
-#include "libANGLE/queryconversions.h"
-
-#include <vector>
-
-#include "libANGLE/Context.h"
-#include "common/utilities.h"
-
-namespace gl
-{
-
-namespace
-{
-
-GLint64 ExpandFloatToInteger(GLfloat value)
-{
- return static_cast<GLint64>((static_cast<double>(0xFFFFFFFFULL) * value - 1.0) / 2.0);
-}
-
-template <typename QueryT, typename NativeT>
-QueryT CastFromStateValueToInt(GLenum pname, NativeT value)
-{
- GLenum nativeType = GLTypeToGLenum<NativeT>::value;
-
- if (nativeType == GL_FLOAT)
- {
- // RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
- if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
- {
- return clampCast<QueryT>(ExpandFloatToInteger(static_cast<GLfloat>(value)));
- }
- else
- {
- return clampCast<QueryT>(std::round(value));
- }
- }
-
- return clampCast<QueryT>(value);
-}
-
-template <typename NativeT, typename QueryT>
-NativeT CastQueryValueToInt(GLenum pname, QueryT value)
-{
- GLenum queryType = GLTypeToGLenum<QueryT>::value;
-
- if (queryType == GL_FLOAT)
- {
- return static_cast<NativeT>(std::round(value));
- }
-
- return static_cast<NativeT>(value);
-}
-
-} // anonymous namespace
-
-// ES 3.10 Section 2.2.2
-// When querying bitmasks(such as SAMPLE_MASK_VALUE or STENCIL_WRITEMASK) with GetIntegerv, the
-// mask value is treated as a signed integer, so that mask values with the high bit set will not be
-// clamped when returned as signed integers.
-GLint CastMaskValue(const Context *context, GLuint value)
-{
- return (context->getClientVersion() >= Version(3, 1) ? static_cast<GLint>(value)
- : clampCast<GLint>(value));
-}
-
-template <typename QueryT, typename InternalT>
-QueryT CastFromGLintStateValue(GLenum pname, InternalT value)
-{
- return CastFromStateValue<QueryT, GLint>(pname, clampCast<GLint, InternalT>(value));
-}
-
-template GLfloat CastFromGLintStateValue<GLfloat, GLenum>(GLenum pname, GLenum value);
-template GLint CastFromGLintStateValue<GLint, GLenum>(GLenum pname, GLenum value);
-template GLint64 CastFromGLintStateValue<GLint64, GLenum>(GLenum pname, GLenum value);
-template GLuint CastFromGLintStateValue<GLuint, GLenum>(GLenum pname, GLenum value);
-template GLfloat CastFromGLintStateValue<GLfloat, bool>(GLenum pname, bool value);
-template GLuint CastFromGLintStateValue<GLuint, bool>(GLenum pname, bool value);
-template GLint CastFromGLintStateValue<GLint, bool>(GLenum pname, bool value);
-
-template <typename QueryT, typename NativeT>
-QueryT CastFromStateValue(GLenum pname, NativeT value)
-{
- GLenum queryType = GLTypeToGLenum<QueryT>::value;
-
- switch (queryType)
- {
- case GL_INT:
- case GL_INT_64_ANGLEX:
- case GL_UNSIGNED_INT:
- case GL_UINT_64_ANGLEX:
- return CastFromStateValueToInt<QueryT, NativeT>(pname, value);
- case GL_FLOAT:
- return static_cast<QueryT>(value);
- case GL_BOOL:
- return static_cast<QueryT>(value == static_cast<NativeT>(0) ? GL_FALSE : GL_TRUE);
- default:
- UNREACHABLE();
- return 0;
- }
-}
-template GLint CastFromStateValue<GLint, GLint>(GLenum pname, GLint value);
-template GLint CastFromStateValue<GLint, GLint64>(GLenum pname, GLint64 value);
-template GLint64 CastFromStateValue<GLint64, GLint>(GLenum pname, GLint value);
-template GLint64 CastFromStateValue<GLint64, GLint64>(GLenum pname, GLint64 value);
-template GLfloat CastFromStateValue<GLfloat, GLint>(GLenum pname, GLint value);
-template GLfloat CastFromStateValue<GLfloat, GLfloat>(GLenum pname, GLfloat value);
-template GLint CastFromStateValue<GLint, GLfloat>(GLenum pname, GLfloat value);
-template GLuint CastFromStateValue<GLuint, GLint>(GLenum pname, GLint value);
-template GLuint CastFromStateValue<GLuint, GLuint>(GLenum pname, GLuint value);
-template GLint CastFromStateValue<GLint, GLboolean>(GLenum pname, GLboolean value);
-template GLint64 CastFromStateValue<GLint64, GLboolean>(GLenum pname, GLboolean value);
-template GLint CastFromStateValue<GLint, GLuint>(GLenum pname, GLuint value);
-template GLint64 CastFromStateValue<GLint64, GLuint>(GLenum pname, GLuint value);
-template GLuint64 CastFromStateValue<GLuint64, GLuint>(GLenum pname, GLuint value);
-
-template <typename NativeT, typename QueryT>
-NativeT CastQueryValueTo(GLenum pname, QueryT value)
-{
- GLenum nativeType = GLTypeToGLenum<NativeT>::value;
-
- switch (nativeType)
- {
- case GL_INT:
- case GL_INT_64_ANGLEX:
- case GL_UNSIGNED_INT:
- case GL_UINT_64_ANGLEX:
- return CastQueryValueToInt<NativeT, QueryT>(pname, value);
- case GL_FLOAT:
- return static_cast<NativeT>(value);
- case GL_BOOL:
- return static_cast<NativeT>(value == static_cast<QueryT>(0) ? GL_FALSE : GL_TRUE);
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-template GLint CastQueryValueTo<GLint, GLfloat>(GLenum pname, GLfloat value);
-template GLboolean CastQueryValueTo<GLboolean, GLint>(GLenum pname, GLint value);
-template GLint CastQueryValueTo<GLint, GLint>(GLenum pname, GLint value);
-template GLfloat CastQueryValueTo<GLfloat, GLint>(GLenum pname, GLint value);
-template GLfloat CastQueryValueTo<GLfloat, GLfloat>(GLenum pname, GLfloat value);
-template GLuint CastQueryValueTo<GLuint, GLint>(GLenum pname, GLint value);
-template GLuint CastQueryValueTo<GLuint, GLfloat>(GLenum pname, GLfloat value);
-
-template <typename QueryT>
-void CastStateValues(Context *context, GLenum nativeType, GLenum pname,
- unsigned int numParams, QueryT *outParams)
-{
- if (nativeType == GL_INT)
- {
- std::vector<GLint> intParams(numParams, 0);
- context->getIntegervImpl(pname, intParams.data());
-
- for (unsigned int i = 0; i < numParams; ++i)
- {
- outParams[i] = CastFromStateValue<QueryT>(pname, intParams[i]);
- }
- }
- else if (nativeType == GL_BOOL)
- {
- std::vector<GLboolean> boolParams(numParams, GL_FALSE);
- context->getBooleanvImpl(pname, boolParams.data());
-
- for (unsigned int i = 0; i < numParams; ++i)
- {
- outParams[i] = (boolParams[i] == GL_FALSE ? static_cast<QueryT>(0) : static_cast<QueryT>(1));
- }
- }
- else if (nativeType == GL_FLOAT)
- {
- std::vector<GLfloat> floatParams(numParams, 0.0f);
- context->getFloatvImpl(pname, floatParams.data());
-
- for (unsigned int i = 0; i < numParams; ++i)
- {
- outParams[i] = CastFromStateValue<QueryT>(pname, floatParams[i]);
- }
- }
- else if (nativeType == GL_INT_64_ANGLEX)
- {
- std::vector<GLint64> int64Params(numParams, 0);
- context->getInteger64v(pname, int64Params.data());
-
- for (unsigned int i = 0; i < numParams; ++i)
- {
- outParams[i] = CastFromStateValue<QueryT>(pname, int64Params[i]);
- }
- }
- else UNREACHABLE();
-}
-
-// Explicit template instantiation (how we export template functions in different files)
-// The calls below will make CastStateValues successfully link with the GL state query types
-// The GL state query API types are: bool, int, uint, float, int64, uint64
-
-template void CastStateValues<GLboolean>(Context *, GLenum, GLenum, unsigned int, GLboolean *);
-template void CastStateValues<GLint>(Context *, GLenum, GLenum, unsigned int, GLint *);
-template void CastStateValues<GLuint>(Context *, GLenum, GLenum, unsigned int, GLuint *);
-template void CastStateValues<GLfloat>(Context *, GLenum, GLenum, unsigned int, GLfloat *);
-template void CastStateValues<GLint64>(Context *, GLenum, GLenum, unsigned int, GLint64 *);
-
-template <typename QueryT>
-void CastIndexedStateValues(Context *context,
- GLenum nativeType,
- GLenum pname,
- GLuint index,
- unsigned int numParams,
- QueryT *outParams)
-{
- if (nativeType == GL_INT)
- {
- std::vector<GLint> intParams(numParams, 0);
- context->getIntegeri_v(pname, index, intParams.data());
-
- for (unsigned int i = 0; i < numParams; ++i)
- {
- outParams[i] = CastFromStateValue<QueryT>(pname, intParams[i]);
- }
- }
- else if (nativeType == GL_BOOL)
- {
- std::vector<GLboolean> boolParams(numParams, GL_FALSE);
- context->getBooleani_v(pname, index, boolParams.data());
-
- for (unsigned int i = 0; i < numParams; ++i)
- {
- outParams[i] =
- (boolParams[i] == GL_FALSE ? static_cast<QueryT>(0) : static_cast<QueryT>(1));
- }
- }
- else if (nativeType == GL_INT_64_ANGLEX)
- {
- std::vector<GLint64> int64Params(numParams, 0);
- context->getInteger64i_v(pname, index, int64Params.data());
-
- for (unsigned int i = 0; i < numParams; ++i)
- {
- outParams[i] = CastFromStateValue<QueryT>(pname, int64Params[i]);
- }
- }
- else
- UNREACHABLE();
-}
-
-template void CastIndexedStateValues<GLboolean>(Context *,
- GLenum,
- GLenum,
- GLuint index,
- unsigned int,
- GLboolean *);
-template void CastIndexedStateValues<GLint>(Context *,
- GLenum,
- GLenum,
- GLuint index,
- unsigned int,
- GLint *);
-template void CastIndexedStateValues<GLuint>(Context *,
- GLenum,
- GLenum,
- GLuint index,
- unsigned int,
- GLuint *);
-template void CastIndexedStateValues<GLfloat>(Context *,
- GLenum,
- GLenum,
- GLuint index,
- unsigned int,
- GLfloat *);
-template void CastIndexedStateValues<GLint64>(Context *,
- GLenum,
- GLenum,
- GLuint index,
- unsigned int,
- GLint64 *);
-}
diff --git a/src/3rdparty/angle/src/libANGLE/queryconversions.h b/src/3rdparty/angle/src/libANGLE/queryconversions.h
deleted file mode 100644
index 805f36cf02..0000000000
--- a/src/3rdparty/angle/src/libANGLE/queryconversions.h
+++ /dev/null
@@ -1,117 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// queryconversions.h: Declaration of state query cast conversions
-
-#ifndef LIBANGLE_QUERY_CONVERSIONS_H_
-#define LIBANGLE_QUERY_CONVERSIONS_H_
-
-#include "angle_gl.h"
-#include "common/angleutils.h"
-
-namespace gl
-{
-class Context;
-
-// Helper class for converting a GL type to a GLenum:
-// We can't use CastStateValueEnum generally, because of GLboolean + GLubyte overlap.
-// We restrict our use to CastFromStateValue and CastQueryValueTo, where it eliminates
-// duplicate parameters.
-
-template <typename GLType>
-struct GLTypeToGLenum
-{
- // static constexpr GLenum value;
-};
-
-template <>
-struct GLTypeToGLenum<GLint>
-{
- static constexpr GLenum value = GL_INT;
-};
-template <>
-struct GLTypeToGLenum<GLuint>
-{
- static constexpr GLenum value = GL_UNSIGNED_INT;
-};
-template <>
-struct GLTypeToGLenum<GLboolean>
-{
- static constexpr GLenum value = GL_BOOL;
-};
-template <>
-struct GLTypeToGLenum<GLint64>
-{
- static constexpr GLenum value = GL_INT_64_ANGLEX;
-};
-template <>
-struct GLTypeToGLenum<GLuint64>
-{
- static constexpr GLenum value = GL_UINT_64_ANGLEX;
-};
-template <>
-struct GLTypeToGLenum<GLfloat>
-{
- static constexpr GLenum value = GL_FLOAT;
-};
-
-GLint CastMaskValue(const Context *context, GLuint value);
-
-template <typename QueryT, typename InternalT>
-QueryT CastFromGLintStateValue(GLenum pname, InternalT value);
-
-template <typename QueryT, typename NativeT>
-QueryT CastFromStateValue(GLenum pname, NativeT value);
-
-template <typename NativeT, typename QueryT>
-NativeT CastQueryValueTo(GLenum pname, QueryT value);
-
-template <typename ParamType>
-GLenum ConvertToGLenum(GLenum pname, ParamType param)
-{
- return static_cast<GLenum>(CastQueryValueTo<GLuint>(pname, param));
-}
-
-template <typename ParamType>
-GLenum ConvertToGLenum(ParamType param)
-{
- return ConvertToGLenum(GL_NONE, param);
-}
-
-template <typename ParamType>
-GLenum ConvertToGLint(ParamType param)
-{
- return CastQueryValueTo<GLint>(GL_NONE, param);
-}
-
-template <typename ParamType>
-bool ConvertToBool(ParamType param)
-{
- return param != GL_FALSE;
-}
-
-template <typename ParamType>
-GLboolean ConvertToGLBoolean(ParamType param)
-{
- return param ? GL_TRUE : GL_FALSE;
-}
-
-// The GL state query API types are: bool, int, uint, float, int64, uint64
-template <typename QueryT>
-void CastStateValues(Context *context, GLenum nativeType, GLenum pname,
- unsigned int numParams, QueryT *outParams);
-
-// The GL state query API types are: bool, int, uint, float, int64, uint64
-template <typename QueryT>
-void CastIndexedStateValues(Context *context,
- GLenum nativeType,
- GLenum pname,
- GLuint index,
- unsigned int numParams,
- QueryT *outParams);
-}
-
-#endif // LIBANGLE_QUERY_CONVERSIONS_H_
diff --git a/src/3rdparty/angle/src/libANGLE/queryutils.cpp b/src/3rdparty/angle/src/libANGLE/queryutils.cpp
deleted file mode 100644
index 16a989c688..0000000000
--- a/src/3rdparty/angle/src/libANGLE/queryutils.cpp
+++ /dev/null
@@ -1,1916 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// queryutils.cpp: Utilities for querying values from GL objects
-
-#include "libANGLE/queryutils.h"
-
-#include "common/utilities.h"
-
-#include "libANGLE/Buffer.h"
-#include "libANGLE/Config.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Fence.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/Renderbuffer.h"
-#include "libANGLE/Sampler.h"
-#include "libANGLE/Shader.h"
-#include "libANGLE/Surface.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/Uniform.h"
-#include "libANGLE/VertexAttribute.h"
-#include "libANGLE/queryconversions.h"
-
-namespace gl
-{
-
-namespace
-{
-
-template <typename ParamType>
-void QueryTexLevelParameterBase(const Texture *texture,
- GLenum target,
- GLint level,
- GLenum pname,
- ParamType *params)
-{
- ASSERT(texture != nullptr);
- const InternalFormat *info = texture->getTextureState().getImageDesc(target, level).format.info;
-
- switch (pname)
- {
- case GL_TEXTURE_RED_TYPE:
- *params = CastFromGLintStateValue<ParamType>(
- pname, info->redBits ? info->componentType : GL_NONE);
- break;
- case GL_TEXTURE_GREEN_TYPE:
- *params = CastFromGLintStateValue<ParamType>(
- pname, info->greenBits ? info->componentType : GL_NONE);
- break;
- case GL_TEXTURE_BLUE_TYPE:
- *params = CastFromGLintStateValue<ParamType>(
- pname, info->blueBits ? info->componentType : GL_NONE);
- break;
- case GL_TEXTURE_ALPHA_TYPE:
- *params = CastFromGLintStateValue<ParamType>(
- pname, info->alphaBits ? info->componentType : GL_NONE);
- break;
- case GL_TEXTURE_DEPTH_TYPE:
- *params = CastFromGLintStateValue<ParamType>(
- pname, info->depthBits ? info->componentType : GL_NONE);
- break;
- case GL_TEXTURE_RED_SIZE:
- *params = CastFromGLintStateValue<ParamType>(pname, info->redBits);
- break;
- case GL_TEXTURE_GREEN_SIZE:
- *params = CastFromGLintStateValue<ParamType>(pname, info->greenBits);
- break;
- case GL_TEXTURE_BLUE_SIZE:
- *params = CastFromGLintStateValue<ParamType>(pname, info->blueBits);
- break;
- case GL_TEXTURE_ALPHA_SIZE:
- *params = CastFromGLintStateValue<ParamType>(pname, info->alphaBits);
- break;
- case GL_TEXTURE_DEPTH_SIZE:
- *params = CastFromGLintStateValue<ParamType>(pname, info->depthBits);
- break;
- case GL_TEXTURE_STENCIL_SIZE:
- *params = CastFromGLintStateValue<ParamType>(pname, info->stencilBits);
- break;
- case GL_TEXTURE_SHARED_SIZE:
- *params = CastFromGLintStateValue<ParamType>(pname, info->sharedBits);
- break;
- case GL_TEXTURE_INTERNAL_FORMAT:
- *params = CastFromGLintStateValue<ParamType>(
- pname, info->internalFormat ? info->internalFormat : GL_RGBA);
- break;
- case GL_TEXTURE_WIDTH:
- *params = CastFromGLintStateValue<ParamType>(
- pname, static_cast<uint32_t>(texture->getWidth(target, level)));
- break;
- case GL_TEXTURE_HEIGHT:
- *params = CastFromGLintStateValue<ParamType>(
- pname, static_cast<uint32_t>(texture->getHeight(target, level)));
- break;
- case GL_TEXTURE_DEPTH:
- *params = CastFromGLintStateValue<ParamType>(
- pname, static_cast<uint32_t>(texture->getDepth(target, level)));
- break;
- case GL_TEXTURE_SAMPLES:
- *params = CastFromStateValue<ParamType>(pname, texture->getSamples(target, level));
- break;
- case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
- *params = CastFromStateValue<ParamType>(
- pname, static_cast<GLint>(texture->getFixedSampleLocations(target, level)));
- break;
- case GL_TEXTURE_COMPRESSED:
- *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(info->compressed));
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-template <typename ParamType>
-void QueryTexParameterBase(const Texture *texture, GLenum pname, ParamType *params)
-{
- ASSERT(texture != nullptr);
-
- switch (pname)
- {
- case GL_TEXTURE_MAG_FILTER:
- *params = CastFromGLintStateValue<ParamType>(pname, texture->getMagFilter());
- break;
- case GL_TEXTURE_MIN_FILTER:
- *params = CastFromGLintStateValue<ParamType>(pname, texture->getMinFilter());
- break;
- case GL_TEXTURE_WRAP_S:
- *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapS());
- break;
- case GL_TEXTURE_WRAP_T:
- *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapT());
- break;
- case GL_TEXTURE_WRAP_R:
- *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapR());
- break;
- case GL_TEXTURE_IMMUTABLE_FORMAT:
- *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableFormat());
- break;
- case GL_TEXTURE_IMMUTABLE_LEVELS:
- *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableLevels());
- break;
- case GL_TEXTURE_USAGE_ANGLE:
- *params = CastFromGLintStateValue<ParamType>(pname, texture->getUsage());
- break;
- case GL_TEXTURE_MAX_ANISOTROPY_EXT:
- *params = CastFromStateValue<ParamType>(pname, texture->getMaxAnisotropy());
- break;
- case GL_TEXTURE_SWIZZLE_R:
- *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleRed());
- break;
- case GL_TEXTURE_SWIZZLE_G:
- *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleGreen());
- break;
- case GL_TEXTURE_SWIZZLE_B:
- *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleBlue());
- break;
- case GL_TEXTURE_SWIZZLE_A:
- *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleAlpha());
- break;
- case GL_TEXTURE_BASE_LEVEL:
- *params = CastFromGLintStateValue<ParamType>(pname, texture->getBaseLevel());
- break;
- case GL_TEXTURE_MAX_LEVEL:
- *params = CastFromGLintStateValue<ParamType>(pname, texture->getMaxLevel());
- break;
- case GL_TEXTURE_MIN_LOD:
- *params = CastFromStateValue<ParamType>(pname, texture->getSamplerState().minLod);
- break;
- case GL_TEXTURE_MAX_LOD:
- *params = CastFromStateValue<ParamType>(pname, texture->getSamplerState().maxLod);
- break;
- case GL_TEXTURE_COMPARE_MODE:
- *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareMode());
- break;
- case GL_TEXTURE_COMPARE_FUNC:
- *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareFunc());
- break;
- case GL_TEXTURE_SRGB_DECODE_EXT:
- *params = CastFromGLintStateValue<ParamType>(pname, texture->getSRGBDecode());
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-template <typename ParamType>
-void SetTexParameterBase(Context *context, Texture *texture, GLenum pname, const ParamType *params)
-{
- ASSERT(texture != nullptr);
-
- switch (pname)
- {
- case GL_TEXTURE_WRAP_S:
- texture->setWrapS(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_WRAP_T:
- texture->setWrapT(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_WRAP_R:
- texture->setWrapR(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_MIN_FILTER:
- texture->setMinFilter(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_MAG_FILTER:
- texture->setMagFilter(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_USAGE_ANGLE:
- texture->setUsage(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_MAX_ANISOTROPY_EXT:
- texture->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
- break;
- case GL_TEXTURE_COMPARE_MODE:
- texture->setCompareMode(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_COMPARE_FUNC:
- texture->setCompareFunc(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_SWIZZLE_R:
- texture->setSwizzleRed(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_SWIZZLE_G:
- texture->setSwizzleGreen(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_SWIZZLE_B:
- texture->setSwizzleBlue(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_SWIZZLE_A:
- texture->setSwizzleAlpha(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_BASE_LEVEL:
- {
- context->handleError(texture->setBaseLevel(
- context, clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0]))));
- break;
- }
- case GL_TEXTURE_MAX_LEVEL:
- texture->setMaxLevel(clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0])));
- break;
- case GL_TEXTURE_MIN_LOD:
- texture->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
- break;
- case GL_TEXTURE_MAX_LOD:
- texture->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
- break;
- case GL_DEPTH_STENCIL_TEXTURE_MODE:
- texture->setDepthStencilTextureMode(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_SRGB_DECODE_EXT:
- texture->setSRGBDecode(ConvertToGLenum(pname, params[0]));
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-template <typename ParamType>
-void QuerySamplerParameterBase(const Sampler *sampler, GLenum pname, ParamType *params)
-{
- switch (pname)
- {
- case GL_TEXTURE_MIN_FILTER:
- *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMinFilter());
- break;
- case GL_TEXTURE_MAG_FILTER:
- *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMagFilter());
- break;
- case GL_TEXTURE_WRAP_S:
- *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapS());
- break;
- case GL_TEXTURE_WRAP_T:
- *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapT());
- break;
- case GL_TEXTURE_WRAP_R:
- *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapR());
- break;
- case GL_TEXTURE_MAX_ANISOTROPY_EXT:
- *params = CastFromStateValue<ParamType>(pname, sampler->getMaxAnisotropy());
- break;
- case GL_TEXTURE_MIN_LOD:
- *params = CastFromStateValue<ParamType>(pname, sampler->getMinLod());
- break;
- case GL_TEXTURE_MAX_LOD:
- *params = CastFromStateValue<ParamType>(pname, sampler->getMaxLod());
- break;
- case GL_TEXTURE_COMPARE_MODE:
- *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareMode());
- break;
- case GL_TEXTURE_COMPARE_FUNC:
- *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareFunc());
- break;
- case GL_TEXTURE_SRGB_DECODE_EXT:
- *params = CastFromGLintStateValue<ParamType>(pname, sampler->getSRGBDecode());
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-template <typename ParamType>
-void SetSamplerParameterBase(Sampler *sampler, GLenum pname, const ParamType *params)
-{
- switch (pname)
- {
- case GL_TEXTURE_WRAP_S:
- sampler->setWrapS(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_WRAP_T:
- sampler->setWrapT(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_WRAP_R:
- sampler->setWrapR(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_MIN_FILTER:
- sampler->setMinFilter(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_MAG_FILTER:
- sampler->setMagFilter(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_MAX_ANISOTROPY_EXT:
- sampler->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
- break;
- case GL_TEXTURE_COMPARE_MODE:
- sampler->setCompareMode(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_COMPARE_FUNC:
- sampler->setCompareFunc(ConvertToGLenum(pname, params[0]));
- break;
- case GL_TEXTURE_MIN_LOD:
- sampler->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
- break;
- case GL_TEXTURE_MAX_LOD:
- sampler->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
- break;
- case GL_TEXTURE_SRGB_DECODE_EXT:
- sampler->setSRGBDecode(ConvertToGLenum(pname, params[0]));
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
-template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
-void QueryVertexAttribBase(const VertexAttribute &attrib,
- const VertexBinding &binding,
- const CurrentDataType (&currentValueData)[CurrentValueCount],
- GLenum pname,
- ParamType *params)
-{
- switch (pname)
- {
- case GL_CURRENT_VERTEX_ATTRIB:
- for (size_t i = 0; i < CurrentValueCount; ++i)
- {
- params[i] = CastFromStateValue<ParamType>(pname, currentValueData[i]);
- }
- break;
- case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
- *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.enabled));
- break;
- case GL_VERTEX_ATTRIB_ARRAY_SIZE:
- *params = CastFromGLintStateValue<ParamType>(pname, attrib.size);
- break;
- case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
- *params = CastFromGLintStateValue<ParamType>(pname, attrib.vertexAttribArrayStride);
- break;
- case GL_VERTEX_ATTRIB_ARRAY_TYPE:
- *params = CastFromGLintStateValue<ParamType>(pname, attrib.type);
- break;
- case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
- *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.normalized));
- break;
- case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
- *params = CastFromGLintStateValue<ParamType>(pname, binding.getBuffer().id());
- break;
- case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
- *params = CastFromGLintStateValue<ParamType>(pname, binding.getDivisor());
- break;
- case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
- *params = CastFromGLintStateValue<ParamType>(pname, attrib.pureInteger);
- break;
- case GL_VERTEX_ATTRIB_BINDING:
- *params = CastFromGLintStateValue<ParamType>(pname, attrib.bindingIndex);
- break;
- case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
- *params = CastFromGLintStateValue<ParamType>(pname, attrib.relativeOffset);
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-template <typename ParamType>
-void QueryBufferParameterBase(const Buffer *buffer, GLenum pname, ParamType *params)
-{
- ASSERT(buffer != nullptr);
-
- switch (pname)
- {
- case GL_BUFFER_USAGE:
- *params = CastFromGLintStateValue<ParamType>(pname, ToGLenum(buffer->getUsage()));
- break;
- case GL_BUFFER_SIZE:
- *params = CastFromStateValue<ParamType>(pname, buffer->getSize());
- break;
- case GL_BUFFER_ACCESS_FLAGS:
- *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccessFlags());
- break;
- case GL_BUFFER_ACCESS_OES:
- *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccess());
- break;
- case GL_BUFFER_MAPPED:
- *params = CastFromStateValue<ParamType>(pname, buffer->isMapped());
- break;
- case GL_BUFFER_MAP_OFFSET:
- *params = CastFromStateValue<ParamType>(pname, buffer->getMapOffset());
- break;
- case GL_BUFFER_MAP_LENGTH:
- *params = CastFromStateValue<ParamType>(pname, buffer->getMapLength());
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-GLint GetCommonVariableProperty(const sh::ShaderVariable &var, GLenum prop)
-{
- switch (prop)
- {
- case GL_TYPE:
- return clampCast<GLint>(var.type);
-
- case GL_ARRAY_SIZE:
- // Queryable variables are guaranteed not to be arrays of arrays or arrays of structs,
- // see GLES 3.1 spec section 7.3.1.1 page 77.
- return clampCast<GLint>(var.getBasicTypeElementCount());
-
- case GL_NAME_LENGTH:
- // ES31 spec p84: This counts the terminating null char.
- return clampCast<GLint>(var.name.size() + 1u);
-
- default:
- UNREACHABLE();
- return GL_INVALID_VALUE;
- }
-}
-
-GLint GetInputResourceProperty(const Program *program, GLuint index, GLenum prop)
-{
- const auto &attribute = program->getInputResource(index);
- switch (prop)
- {
- case GL_TYPE:
- case GL_ARRAY_SIZE:
- case GL_NAME_LENGTH:
- return GetCommonVariableProperty(attribute, prop);
-
- case GL_LOCATION:
- return program->getAttributeLocation(attribute.name);
-
- case GL_REFERENCED_BY_VERTEX_SHADER:
- return 1;
-
- case GL_REFERENCED_BY_FRAGMENT_SHADER:
- case GL_REFERENCED_BY_COMPUTE_SHADER:
- return 0;
-
- default:
- UNREACHABLE();
- return GL_INVALID_VALUE;
- }
-}
-
-GLint GetOutputResourceProperty(const Program *program, GLuint index, const GLenum prop)
-{
- const auto &outputVariable = program->getOutputResource(index);
- switch (prop)
- {
- case GL_TYPE:
- case GL_ARRAY_SIZE:
- case GL_NAME_LENGTH:
- return GetCommonVariableProperty(outputVariable, prop);
-
- case GL_LOCATION:
- return program->getFragDataLocation(outputVariable.name);
-
- case GL_REFERENCED_BY_VERTEX_SHADER:
- return 0;
-
- case GL_REFERENCED_BY_FRAGMENT_SHADER:
- return 1;
-
- case GL_REFERENCED_BY_COMPUTE_SHADER:
- return 0;
-
- default:
- UNREACHABLE();
- return GL_INVALID_VALUE;
- }
-}
-
-GLint QueryProgramInterfaceActiveResources(const Program *program, GLenum programInterface)
-{
- switch (programInterface)
- {
- case GL_PROGRAM_INPUT:
- return clampCast<GLint>(program->getAttributes().size());
-
- case GL_PROGRAM_OUTPUT:
- return clampCast<GLint>(program->getState().getOutputVariables().size());
-
- case GL_UNIFORM:
- return clampCast<GLint>(program->getState().getUniforms().size());
-
- case GL_UNIFORM_BLOCK:
- return clampCast<GLint>(program->getState().getUniformBlocks().size());
-
- case GL_ATOMIC_COUNTER_BUFFER:
- return clampCast<GLint>(program->getState().getAtomicCounterBuffers().size());
-
- case GL_BUFFER_VARIABLE:
- return clampCast<GLint>(program->getState().getBufferVariables().size());
-
- case GL_SHADER_STORAGE_BLOCK:
- return clampCast<GLint>(program->getState().getShaderStorageBlocks().size());
-
- // TODO(jie.a.chen@intel.com): more interfaces.
- case GL_TRANSFORM_FEEDBACK_VARYING:
- UNIMPLEMENTED();
- return 0;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-template <typename T, typename M>
-GLint FindMaxSize(const std::vector<T> &resources, M member)
-{
- GLint max = 0;
- for (const T &resource : resources)
- {
- max = std::max(max, clampCast<GLint>((resource.*member).size()));
- }
- return max;
-}
-
-GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programInterface)
-{
- GLint maxNameLength = 0;
- switch (programInterface)
- {
- case GL_PROGRAM_INPUT:
- maxNameLength = FindMaxSize(program->getAttributes(), &sh::Attribute::name);
- break;
-
- case GL_PROGRAM_OUTPUT:
- maxNameLength =
- FindMaxSize(program->getState().getOutputVariables(), &sh::OutputVariable::name);
- break;
-
- case GL_UNIFORM:
- maxNameLength = FindMaxSize(program->getState().getUniforms(), &LinkedUniform::name);
- break;
-
- case GL_UNIFORM_BLOCK:
- maxNameLength =
- FindMaxSize(program->getState().getUniformBlocks(), &InterfaceBlock::name);
- break;
-
- case GL_BUFFER_VARIABLE:
- maxNameLength =
- FindMaxSize(program->getState().getBufferVariables(), &BufferVariable::name);
- break;
-
- case GL_SHADER_STORAGE_BLOCK:
- maxNameLength =
- FindMaxSize(program->getState().getShaderStorageBlocks(), &InterfaceBlock::name);
- break;
-
- // TODO(jie.a.chen@intel.com): more interfaces.
- case GL_TRANSFORM_FEEDBACK_VARYING:
- UNIMPLEMENTED();
- return 0;
-
- default:
- UNREACHABLE();
- return 0;
- }
- // This length includes an extra character for the null terminator.
- return (maxNameLength == 0 ? 0 : maxNameLength + 1);
-}
-
-GLint QueryProgramInterfaceMaxNumActiveVariables(const Program *program, GLenum programInterface)
-{
- switch (programInterface)
- {
- case GL_UNIFORM_BLOCK:
- return FindMaxSize(program->getState().getUniformBlocks(),
- &InterfaceBlock::memberIndexes);
- case GL_ATOMIC_COUNTER_BUFFER:
- return FindMaxSize(program->getState().getAtomicCounterBuffers(),
- &AtomicCounterBuffer::memberIndexes);
-
- case GL_SHADER_STORAGE_BLOCK:
- return FindMaxSize(program->getState().getShaderStorageBlocks(),
- &InterfaceBlock::memberIndexes);
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-GLenum GetUniformPropertyEnum(GLenum prop)
-{
- switch (prop)
- {
- case GL_UNIFORM_TYPE:
- return GL_TYPE;
- case GL_UNIFORM_SIZE:
- return GL_ARRAY_SIZE;
- case GL_UNIFORM_NAME_LENGTH:
- return GL_NAME_LENGTH;
- case GL_UNIFORM_BLOCK_INDEX:
- return GL_BLOCK_INDEX;
- case GL_UNIFORM_OFFSET:
- return GL_OFFSET;
- case GL_UNIFORM_ARRAY_STRIDE:
- return GL_ARRAY_STRIDE;
- case GL_UNIFORM_MATRIX_STRIDE:
- return GL_MATRIX_STRIDE;
- case GL_UNIFORM_IS_ROW_MAJOR:
- return GL_IS_ROW_MAJOR;
-
- default:
- return prop;
- }
-}
-
-GLenum GetUniformBlockPropertyEnum(GLenum prop)
-{
- switch (prop)
- {
- case GL_UNIFORM_BLOCK_BINDING:
- return GL_BUFFER_BINDING;
-
- case GL_UNIFORM_BLOCK_DATA_SIZE:
- return GL_BUFFER_DATA_SIZE;
-
- case GL_UNIFORM_BLOCK_NAME_LENGTH:
- return GL_NAME_LENGTH;
-
- case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
- return GL_NUM_ACTIVE_VARIABLES;
-
- case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
- return GL_ACTIVE_VARIABLES;
-
- case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
- return GL_REFERENCED_BY_VERTEX_SHADER;
-
- case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
- return GL_REFERENCED_BY_FRAGMENT_SHADER;
-
- default:
- return prop;
- }
-}
-
-void GetShaderVariableBufferResourceProperty(const ShaderVariableBuffer &buffer,
- GLenum pname,
- GLint *params,
- GLsizei bufSize,
- GLsizei *outputPosition)
-
-{
- switch (pname)
- {
- case GL_BUFFER_BINDING:
- params[(*outputPosition)++] = buffer.binding;
- break;
- case GL_BUFFER_DATA_SIZE:
- params[(*outputPosition)++] = clampCast<GLint>(buffer.dataSize);
- break;
- case GL_NUM_ACTIVE_VARIABLES:
- params[(*outputPosition)++] = buffer.numActiveVariables();
- break;
- case GL_ACTIVE_VARIABLES:
- for (size_t memberIndex = 0;
- memberIndex < buffer.memberIndexes.size() && *outputPosition < bufSize;
- ++memberIndex)
- {
- params[(*outputPosition)++] = clampCast<GLint>(buffer.memberIndexes[memberIndex]);
- }
- break;
- case GL_REFERENCED_BY_VERTEX_SHADER:
- params[(*outputPosition)++] = static_cast<GLint>(buffer.vertexStaticUse);
- break;
- case GL_REFERENCED_BY_FRAGMENT_SHADER:
- params[(*outputPosition)++] = static_cast<GLint>(buffer.fragmentStaticUse);
- break;
- case GL_REFERENCED_BY_COMPUTE_SHADER:
- params[(*outputPosition)++] = static_cast<GLint>(buffer.computeStaticUse);
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void GetInterfaceBlockResourceProperty(const InterfaceBlock &block,
- GLenum pname,
- GLint *params,
- GLsizei bufSize,
- GLsizei *outputPosition)
-{
- if (pname == GL_NAME_LENGTH)
- {
- params[(*outputPosition)++] = clampCast<GLint>(block.nameWithArrayIndex().size() + 1);
- return;
- }
- GetShaderVariableBufferResourceProperty(block, pname, params, bufSize, outputPosition);
-}
-
-void GetUniformBlockResourceProperty(const Program *program,
- GLuint blockIndex,
- GLenum pname,
- GLint *params,
- GLsizei bufSize,
- GLsizei *outputPosition)
-
-{
- ASSERT(*outputPosition < bufSize);
- const auto &block = program->getUniformBlockByIndex(blockIndex);
- GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
-}
-
-void GetShaderStorageBlockResourceProperty(const Program *program,
- GLuint blockIndex,
- GLenum pname,
- GLint *params,
- GLsizei bufSize,
- GLsizei *outputPosition)
-
-{
- ASSERT(*outputPosition < bufSize);
- const auto &block = program->getShaderStorageBlockByIndex(blockIndex);
- GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
-}
-
-void GetAtomicCounterBufferResourceProperty(const Program *program,
- GLuint index,
- GLenum pname,
- GLint *params,
- GLsizei bufSize,
- GLsizei *outputPosition)
-
-{
- ASSERT(*outputPosition < bufSize);
- const auto &buffer = program->getState().getAtomicCounterBuffers()[index];
- GetShaderVariableBufferResourceProperty(buffer, pname, params, bufSize, outputPosition);
-}
-
-} // anonymous namespace
-
-void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
- GLenum attachment,
- GLenum pname,
- GLint *params)
-{
- ASSERT(framebuffer);
-
- const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
- if (attachmentObject == nullptr)
- {
- // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
- // is NONE, then querying any other pname will generate INVALID_ENUM.
-
- // ES 3.0.2 spec pg 235 states that if the attachment type is none,
- // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
- // INVALID_OPERATION for all other pnames
-
- switch (pname)
- {
- case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
- *params = GL_NONE;
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
- *params = 0;
- break;
-
- default:
- UNREACHABLE();
- break;
- }
-
- return;
- }
-
- switch (pname)
- {
- case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
- *params = attachmentObject->type();
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
- *params = attachmentObject->id();
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
- *params = attachmentObject->mipLevel();
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
- *params = attachmentObject->cubeMapFace();
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
- *params = attachmentObject->getRedSize();
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
- *params = attachmentObject->getGreenSize();
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
- *params = attachmentObject->getBlueSize();
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
- *params = attachmentObject->getAlphaSize();
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
- *params = attachmentObject->getDepthSize();
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
- *params = attachmentObject->getStencilSize();
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
- *params = attachmentObject->getComponentType();
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
- *params = attachmentObject->getColorEncoding();
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
- *params = attachmentObject->layer();
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
- *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:
- *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;
-
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
-{
- QueryBufferParameterBase(buffer, pname, params);
-}
-
-void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
-{
- QueryBufferParameterBase(buffer, pname, params);
-}
-
-void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
-{
- switch (pname)
- {
- case GL_BUFFER_MAP_POINTER:
- *params = buffer->getMapPointer();
- break;
-
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
-{
- ASSERT(program != nullptr);
-
- switch (pname)
- {
- case GL_DELETE_STATUS:
- *params = program->isFlaggedForDeletion();
- return;
- case GL_LINK_STATUS:
- *params = program->isLinked();
- return;
- case GL_VALIDATE_STATUS:
- *params = program->isValidated();
- return;
- case GL_INFO_LOG_LENGTH:
- *params = program->getInfoLogLength();
- return;
- case GL_ATTACHED_SHADERS:
- *params = program->getAttachedShadersCount();
- return;
- case GL_ACTIVE_ATTRIBUTES:
- *params = program->getActiveAttributeCount();
- return;
- case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
- *params = program->getActiveAttributeMaxLength();
- return;
- case GL_ACTIVE_UNIFORMS:
- *params = program->getActiveUniformCount();
- return;
- case GL_ACTIVE_UNIFORM_MAX_LENGTH:
- *params = program->getActiveUniformMaxLength();
- return;
- case GL_PROGRAM_BINARY_LENGTH_OES:
- *params = program->getBinaryLength(context);
- return;
- case GL_ACTIVE_UNIFORM_BLOCKS:
- *params = program->getActiveUniformBlockCount();
- return;
- case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
- *params = program->getActiveUniformBlockMaxLength();
- break;
- case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
- *params = program->getTransformFeedbackBufferMode();
- break;
- case GL_TRANSFORM_FEEDBACK_VARYINGS:
- *params = program->getTransformFeedbackVaryingCount();
- break;
- case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
- *params = program->getTransformFeedbackVaryingMaxLength();
- break;
- case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
- *params = program->getBinaryRetrievableHint();
- break;
- case GL_PROGRAM_SEPARABLE:
- *params = program->isSeparable();
- break;
- case GL_COMPUTE_WORK_GROUP_SIZE:
- {
- const sh::WorkGroupSize &localSize = program->getComputeShaderLocalSize();
- params[0] = localSize[0];
- params[1] = localSize[1];
- params[2] = localSize[2];
- }
- break;
- case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
- *params = program->getActiveAtomicCounterBufferCount();
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void QueryRenderbufferiv(const Context *context,
- const Renderbuffer *renderbuffer,
- GLenum pname,
- GLint *params)
-{
- ASSERT(renderbuffer != nullptr);
-
- switch (pname)
- {
- case GL_RENDERBUFFER_WIDTH:
- *params = renderbuffer->getWidth();
- break;
- case GL_RENDERBUFFER_HEIGHT:
- *params = renderbuffer->getHeight();
- break;
- case GL_RENDERBUFFER_INTERNAL_FORMAT:
- // Special case the WebGL 1 DEPTH_STENCIL format.
- if (context->isWebGL1() &&
- renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
- {
- *params = GL_DEPTH_STENCIL;
- }
- else
- {
- *params = renderbuffer->getFormat().info->internalFormat;
- }
- break;
- case GL_RENDERBUFFER_RED_SIZE:
- *params = renderbuffer->getRedSize();
- break;
- case GL_RENDERBUFFER_GREEN_SIZE:
- *params = renderbuffer->getGreenSize();
- break;
- case GL_RENDERBUFFER_BLUE_SIZE:
- *params = renderbuffer->getBlueSize();
- break;
- case GL_RENDERBUFFER_ALPHA_SIZE:
- *params = renderbuffer->getAlphaSize();
- break;
- case GL_RENDERBUFFER_DEPTH_SIZE:
- *params = renderbuffer->getDepthSize();
- break;
- case GL_RENDERBUFFER_STENCIL_SIZE:
- *params = renderbuffer->getStencilSize();
- break;
- case GL_RENDERBUFFER_SAMPLES_ANGLE:
- *params = renderbuffer->getSamples();
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void QueryShaderiv(const Context *context, Shader *shader, GLenum pname, GLint *params)
-{
- ASSERT(shader != nullptr);
-
- switch (pname)
- {
- case GL_SHADER_TYPE:
- *params = shader->getType();
- return;
- case GL_DELETE_STATUS:
- *params = shader->isFlaggedForDeletion();
- return;
- case GL_COMPILE_STATUS:
- *params = shader->isCompiled(context) ? GL_TRUE : GL_FALSE;
- return;
- case GL_INFO_LOG_LENGTH:
- *params = shader->getInfoLogLength(context);
- return;
- case GL_SHADER_SOURCE_LENGTH:
- *params = shader->getSourceLength();
- return;
- case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
- *params = shader->getTranslatedSourceWithDebugInfoLength(context);
- return;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void QueryTexLevelParameterfv(const Texture *texture,
- GLenum target,
- GLint level,
- GLenum pname,
- GLfloat *params)
-{
- QueryTexLevelParameterBase(texture, target, level, pname, params);
-}
-
-void QueryTexLevelParameteriv(const Texture *texture,
- GLenum target,
- GLint level,
- GLenum pname,
- GLint *params)
-{
- QueryTexLevelParameterBase(texture, target, level, pname, params);
-}
-
-void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
-{
- QueryTexParameterBase(texture, pname, params);
-}
-
-void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
-{
- QueryTexParameterBase(texture, pname, params);
-}
-
-void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
-{
- QuerySamplerParameterBase(sampler, pname, params);
-}
-
-void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
-{
- QuerySamplerParameterBase(sampler, pname, params);
-}
-
-void QueryVertexAttribfv(const VertexAttribute &attrib,
- const VertexBinding &binding,
- const VertexAttribCurrentValueData &currentValueData,
- GLenum pname,
- GLfloat *params)
-{
- QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
-}
-
-void QueryVertexAttribiv(const VertexAttribute &attrib,
- const VertexBinding &binding,
- const VertexAttribCurrentValueData &currentValueData,
- GLenum pname,
- GLint *params)
-{
- QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
-}
-
-void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
-{
- switch (pname)
- {
- case GL_VERTEX_ATTRIB_ARRAY_POINTER:
- *pointer = const_cast<void *>(attrib.pointer);
- break;
-
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void QueryVertexAttribIiv(const VertexAttribute &attrib,
- const VertexBinding &binding,
- const VertexAttribCurrentValueData &currentValueData,
- GLenum pname,
- GLint *params)
-{
- QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
-}
-
-void QueryVertexAttribIuiv(const VertexAttribute &attrib,
- const VertexBinding &binding,
- const VertexAttribCurrentValueData &currentValueData,
- GLenum pname,
- GLuint *params)
-{
- QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
-}
-
-void QueryActiveUniformBlockiv(const Program *program,
- GLuint uniformBlockIndex,
- GLenum pname,
- GLint *params)
-{
- GLenum prop = GetUniformBlockPropertyEnum(pname);
- QueryProgramResourceiv(program, GL_UNIFORM_BLOCK, uniformBlockIndex, 1, &prop,
- std::numeric_limits<GLsizei>::max(), nullptr, params);
-}
-
-void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
-{
- switch (pname)
- {
- case GL_NUM_SAMPLE_COUNTS:
- if (bufSize != 0)
- {
- *params = clampCast<GLint>(format.sampleCounts.size());
- }
- break;
-
- case GL_SAMPLES:
- {
- size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
- auto sampleReverseIt = format.sampleCounts.rbegin();
- for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
- {
- params[sampleIndex] = *sampleReverseIt++;
- }
- }
- break;
-
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
-{
- ASSERT(framebuffer);
-
- switch (pname)
- {
- case GL_FRAMEBUFFER_DEFAULT_WIDTH:
- *params = framebuffer->getDefaultWidth();
- break;
- case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
- *params = framebuffer->getDefaultHeight();
- break;
- case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
- *params = framebuffer->getDefaultSamples();
- break;
- case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
- *params = ConvertToGLBoolean(framebuffer->getDefaultFixedSampleLocations());
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-Error QuerySynciv(const Sync *sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
- ASSERT(sync);
-
- // All queries return one value, exit early if the buffer can't fit anything.
- if (bufSize < 1)
- {
- if (length != nullptr)
- {
- *length = 0;
- }
- return NoError();
- }
-
- switch (pname)
- {
- case GL_OBJECT_TYPE:
- *values = clampCast<GLint>(GL_SYNC_FENCE);
- break;
- case GL_SYNC_CONDITION:
- *values = clampCast<GLint>(sync->getCondition());
- break;
- case GL_SYNC_FLAGS:
- *values = clampCast<GLint>(sync->getFlags());
- break;
- case GL_SYNC_STATUS:
- ANGLE_TRY(sync->getStatus(values));
- break;
-
- default:
- UNREACHABLE();
- break;
- }
-
- if (length != nullptr)
- {
- *length = 1;
- }
-
- return NoError();
-}
-
-void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
-{
- SetTexParameterBase(context, texture, pname, &param);
-}
-
-void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
-{
- SetTexParameterBase(context, texture, pname, params);
-}
-
-void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
-{
- SetTexParameterBase(context, texture, pname, &param);
-}
-
-void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
-{
- SetTexParameterBase(context, texture, pname, params);
-}
-
-void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
-{
- SetSamplerParameterBase(sampler, pname, &param);
-}
-
-void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
-{
- SetSamplerParameterBase(sampler, pname, params);
-}
-
-void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
-{
- SetSamplerParameterBase(sampler, pname, &param);
-}
-
-void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
-{
- SetSamplerParameterBase(sampler, pname, params);
-}
-
-void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param)
-{
- ASSERT(framebuffer);
-
- switch (pname)
- {
- case GL_FRAMEBUFFER_DEFAULT_WIDTH:
- framebuffer->setDefaultWidth(param);
- break;
- case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
- framebuffer->setDefaultHeight(param);
- break;
- case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
- framebuffer->setDefaultSamples(param);
- break;
- case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
- framebuffer->setDefaultFixedSampleLocations(ConvertToBool(param));
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void SetProgramParameteri(Program *program, GLenum pname, GLint value)
-{
- ASSERT(program);
-
- switch (pname)
- {
- case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
- program->setBinaryRetrievableHint(ConvertToBool(value));
- break;
- case GL_PROGRAM_SEPARABLE:
- program->setSeparable(ConvertToBool(value));
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-GLint GetUniformResourceProperty(const Program *program, GLuint index, const GLenum prop)
-{
- const auto &uniform = program->getUniformByIndex(index);
- GLenum resourceProp = GetUniformPropertyEnum(prop);
- switch (resourceProp)
- {
- case GL_TYPE:
- case GL_ARRAY_SIZE:
- case GL_NAME_LENGTH:
- return GetCommonVariableProperty(uniform, resourceProp);
-
- case GL_LOCATION:
- return program->getUniformLocation(uniform.name);
-
- case GL_BLOCK_INDEX:
- return (uniform.isAtomicCounter() ? -1 : uniform.bufferIndex);
-
- case GL_OFFSET:
- return uniform.blockInfo.offset;
-
- case GL_ARRAY_STRIDE:
- return uniform.blockInfo.arrayStride;
-
- case GL_MATRIX_STRIDE:
- return uniform.blockInfo.matrixStride;
-
- case GL_IS_ROW_MAJOR:
- return static_cast<GLint>(uniform.blockInfo.isRowMajorMatrix);
-
- case GL_REFERENCED_BY_VERTEX_SHADER:
- return uniform.vertexStaticUse;
-
- case GL_REFERENCED_BY_FRAGMENT_SHADER:
- return uniform.fragmentStaticUse;
-
- case GL_REFERENCED_BY_COMPUTE_SHADER:
- return uniform.computeStaticUse;
-
- case GL_ATOMIC_COUNTER_BUFFER_INDEX:
- return (uniform.isAtomicCounter() ? uniform.bufferIndex : -1);
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-GLint GetBufferVariableResourceProperty(const Program *program, GLuint index, const GLenum prop)
-{
- const auto &bufferVariable = program->getBufferVariableByIndex(index);
- switch (prop)
- {
- case GL_TYPE:
- case GL_ARRAY_SIZE:
- case GL_NAME_LENGTH:
- return GetCommonVariableProperty(bufferVariable, prop);
-
- case GL_BLOCK_INDEX:
- return bufferVariable.bufferIndex;
-
- case GL_OFFSET:
- return bufferVariable.blockInfo.offset;
-
- case GL_ARRAY_STRIDE:
- return bufferVariable.blockInfo.arrayStride;
-
- case GL_MATRIX_STRIDE:
- return bufferVariable.blockInfo.matrixStride;
-
- case GL_IS_ROW_MAJOR:
- return static_cast<GLint>(bufferVariable.blockInfo.isRowMajorMatrix);
-
- case GL_REFERENCED_BY_VERTEX_SHADER:
- return bufferVariable.vertexStaticUse;
-
- case GL_REFERENCED_BY_FRAGMENT_SHADER:
- return bufferVariable.fragmentStaticUse;
-
- case GL_REFERENCED_BY_COMPUTE_SHADER:
- return bufferVariable.computeStaticUse;
-
- case GL_TOP_LEVEL_ARRAY_SIZE:
- return bufferVariable.topLevelArraySize;
-
- case GL_TOP_LEVEL_ARRAY_STRIDE:
- return bufferVariable.blockInfo.topLevelArrayStride;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-GLuint QueryProgramResourceIndex(const Program *program,
- GLenum programInterface,
- const GLchar *name)
-{
- switch (programInterface)
- {
- case GL_PROGRAM_INPUT:
- return program->getInputResourceIndex(name);
-
- case GL_PROGRAM_OUTPUT:
- return program->getOutputResourceIndex(name);
-
- case GL_UNIFORM:
- return program->getState().getUniformIndexFromName(name);
-
- case GL_BUFFER_VARIABLE:
- return program->getState().getBufferVariableIndexFromName(name);
-
- case GL_SHADER_STORAGE_BLOCK:
- return program->getShaderStorageBlockIndex(name);
-
- case GL_UNIFORM_BLOCK:
- return program->getUniformBlockIndex(name);
-
- // TODO(jie.a.chen@intel.com): more interfaces.
- case GL_TRANSFORM_FEEDBACK_VARYING:
- UNIMPLEMENTED();
- return GL_INVALID_INDEX;
-
- default:
- UNREACHABLE();
- return GL_INVALID_INDEX;
- }
-}
-
-void QueryProgramResourceName(const Program *program,
- GLenum programInterface,
- GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *name)
-{
- switch (programInterface)
- {
- case GL_PROGRAM_INPUT:
- program->getInputResourceName(index, bufSize, length, name);
- break;
-
- case GL_PROGRAM_OUTPUT:
- program->getOutputResourceName(index, bufSize, length, name);
- break;
-
- case GL_UNIFORM:
- program->getUniformResourceName(index, bufSize, length, name);
- break;
-
- case GL_BUFFER_VARIABLE:
- program->getBufferVariableResourceName(index, bufSize, length, name);
- break;
-
- case GL_SHADER_STORAGE_BLOCK:
- program->getActiveShaderStorageBlockName(index, bufSize, length, name);
- break;
-
- case GL_UNIFORM_BLOCK:
- program->getActiveUniformBlockName(index, bufSize, length, name);
- break;
-
- // TODO(jie.a.chen@intel.com): more interfaces.
- case GL_TRANSFORM_FEEDBACK_VARYING:
- UNIMPLEMENTED();
- break;
-
- default:
- UNREACHABLE();
- }
-}
-
-GLint QueryProgramResourceLocation(const Program *program,
- GLenum programInterface,
- const GLchar *name)
-{
- switch (programInterface)
- {
- case GL_PROGRAM_INPUT:
- return program->getAttributeLocation(name);
-
- case GL_PROGRAM_OUTPUT:
- return program->getFragDataLocation(name);
-
- case GL_UNIFORM:
- return program->getUniformLocation(name);
-
- default:
- UNREACHABLE();
- return -1;
- }
-}
-
-void QueryProgramResourceiv(const Program *program,
- GLenum programInterface,
- GLuint index,
- GLsizei propCount,
- const GLenum *props,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params)
-{
- if (!program->isLinked())
- {
- if (length != nullptr)
- {
- *length = 0;
- }
- return;
- }
-
- GLsizei pos = 0;
- for (GLsizei i = 0; i < propCount; i++)
- {
- switch (programInterface)
- {
- case GL_PROGRAM_INPUT:
- params[i] = GetInputResourceProperty(program, index, props[i]);
- ++pos;
- break;
-
- case GL_PROGRAM_OUTPUT:
- params[i] = GetOutputResourceProperty(program, index, props[i]);
- ++pos;
- break;
-
- case GL_UNIFORM:
- params[i] = GetUniformResourceProperty(program, index, props[i]);
- ++pos;
- break;
-
- case GL_BUFFER_VARIABLE:
- params[i] = GetBufferVariableResourceProperty(program, index, props[i]);
- ++pos;
- break;
-
- case GL_UNIFORM_BLOCK:
- GetUniformBlockResourceProperty(program, index, props[i], params, bufSize, &pos);
- break;
-
- case GL_SHADER_STORAGE_BLOCK:
- GetShaderStorageBlockResourceProperty(program, index, props[i], params, bufSize,
- &pos);
- break;
-
- case GL_ATOMIC_COUNTER_BUFFER:
- GetAtomicCounterBufferResourceProperty(program, index, props[i], params, bufSize,
- &pos);
- break;
- // TODO(jie.a.chen@intel.com): more interfaces.
- case GL_TRANSFORM_FEEDBACK_VARYING:
- UNIMPLEMENTED();
- params[i] = GL_INVALID_VALUE;
- break;
-
- default:
- UNREACHABLE();
- params[i] = GL_INVALID_VALUE;
- }
- if (pos == bufSize)
- {
- // Most properties return one value, but GL_ACTIVE_VARIABLES returns an array of values.
- // This checks not to break buffer bounds for such case.
- break;
- }
- }
-
- if (length != nullptr)
- {
- *length = pos;
- }
-}
-
-void QueryProgramInterfaceiv(const Program *program,
- GLenum programInterface,
- GLenum pname,
- GLint *params)
-{
- switch (pname)
- {
- case GL_ACTIVE_RESOURCES:
- *params = QueryProgramInterfaceActiveResources(program, programInterface);
- break;
-
- case GL_MAX_NAME_LENGTH:
- *params = QueryProgramInterfaceMaxNameLength(program, programInterface);
- break;
-
- case GL_MAX_NUM_ACTIVE_VARIABLES:
- *params = QueryProgramInterfaceMaxNumActiveVariables(program, programInterface);
- break;
-
- default:
- UNREACHABLE();
- }
-}
-
-} // namespace gl
-
-namespace egl
-{
-
-void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
-{
- ASSERT(config != nullptr);
- switch (attribute)
- {
- case EGL_BUFFER_SIZE:
- *value = config->bufferSize;
- break;
- case EGL_ALPHA_SIZE:
- *value = config->alphaSize;
- break;
- case EGL_BLUE_SIZE:
- *value = config->blueSize;
- break;
- case EGL_GREEN_SIZE:
- *value = config->greenSize;
- break;
- case EGL_RED_SIZE:
- *value = config->redSize;
- break;
- case EGL_DEPTH_SIZE:
- *value = config->depthSize;
- break;
- case EGL_STENCIL_SIZE:
- *value = config->stencilSize;
- break;
- case EGL_CONFIG_CAVEAT:
- *value = config->configCaveat;
- break;
- case EGL_CONFIG_ID:
- *value = config->configID;
- break;
- case EGL_LEVEL:
- *value = config->level;
- break;
- case EGL_NATIVE_RENDERABLE:
- *value = config->nativeRenderable;
- break;
- case EGL_NATIVE_VISUAL_ID:
- *value = config->nativeVisualID;
- break;
- case EGL_NATIVE_VISUAL_TYPE:
- *value = config->nativeVisualType;
- break;
- case EGL_SAMPLES:
- *value = config->samples;
- break;
- case EGL_SAMPLE_BUFFERS:
- *value = config->sampleBuffers;
- break;
- case EGL_SURFACE_TYPE:
- *value = config->surfaceType;
- break;
- case EGL_TRANSPARENT_TYPE:
- *value = config->transparentType;
- break;
- case EGL_TRANSPARENT_BLUE_VALUE:
- *value = config->transparentBlueValue;
- break;
- case EGL_TRANSPARENT_GREEN_VALUE:
- *value = config->transparentGreenValue;
- break;
- case EGL_TRANSPARENT_RED_VALUE:
- *value = config->transparentRedValue;
- break;
- case EGL_BIND_TO_TEXTURE_RGB:
- *value = config->bindToTextureRGB;
- break;
- case EGL_BIND_TO_TEXTURE_RGBA:
- *value = config->bindToTextureRGBA;
- break;
- case EGL_MIN_SWAP_INTERVAL:
- *value = config->minSwapInterval;
- break;
- case EGL_MAX_SWAP_INTERVAL:
- *value = config->maxSwapInterval;
- break;
- case EGL_LUMINANCE_SIZE:
- *value = config->luminanceSize;
- break;
- case EGL_ALPHA_MASK_SIZE:
- *value = config->alphaMaskSize;
- break;
- case EGL_COLOR_BUFFER_TYPE:
- *value = config->colorBufferType;
- break;
- case EGL_RENDERABLE_TYPE:
- *value = config->renderableType;
- break;
- case EGL_MATCH_NATIVE_PIXMAP:
- *value = false;
- UNIMPLEMENTED();
- break;
- case EGL_CONFORMANT:
- *value = config->conformant;
- break;
- case EGL_MAX_PBUFFER_WIDTH:
- *value = config->maxPBufferWidth;
- break;
- case EGL_MAX_PBUFFER_HEIGHT:
- *value = config->maxPBufferHeight;
- break;
- case EGL_MAX_PBUFFER_PIXELS:
- *value = config->maxPBufferPixels;
- break;
- case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
- *value = config->optimalOrientation;
- break;
- case EGL_COLOR_COMPONENT_TYPE_EXT:
- *value = config->colorComponentType;
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *value)
-{
- switch (attribute)
- {
- case EGL_CONFIG_ID:
- *value = context->getConfig()->configID;
- break;
- case EGL_CONTEXT_CLIENT_TYPE:
- *value = context->getClientType();
- break;
- case EGL_CONTEXT_CLIENT_VERSION:
- *value = context->getClientMajorVersion();
- break;
- case EGL_RENDER_BUFFER:
- *value = context->getRenderBuffer();
- break;
- case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
- *value = context->isRobustResourceInitEnabled();
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
-{
- switch (attribute)
- {
- case EGL_GL_COLORSPACE:
- *value = surface->getGLColorspace();
- break;
- case EGL_VG_ALPHA_FORMAT:
- *value = surface->getVGAlphaFormat();
- break;
- case EGL_VG_COLORSPACE:
- *value = surface->getVGColorspace();
- break;
- case EGL_CONFIG_ID:
- *value = surface->getConfig()->configID;
- break;
- case EGL_HEIGHT:
- *value = surface->getHeight();
- break;
- case EGL_HORIZONTAL_RESOLUTION:
- *value = surface->getHorizontalResolution();
- break;
- case EGL_LARGEST_PBUFFER:
- // The EGL spec states that value is not written if the surface is not a pbuffer
- if (surface->getType() == EGL_PBUFFER_BIT)
- {
- *value = surface->getLargestPbuffer();
- }
- break;
- case EGL_MIPMAP_TEXTURE:
- // The EGL spec states that value is not written if the surface is not a pbuffer
- if (surface->getType() == EGL_PBUFFER_BIT)
- {
- *value = surface->getMipmapTexture();
- }
- break;
- case EGL_MIPMAP_LEVEL:
- // The EGL spec states that value is not written if the surface is not a pbuffer
- if (surface->getType() == EGL_PBUFFER_BIT)
- {
- *value = surface->getMipmapLevel();
- }
- break;
- case EGL_MULTISAMPLE_RESOLVE:
- *value = surface->getMultisampleResolve();
- break;
- case EGL_PIXEL_ASPECT_RATIO:
- *value = surface->getPixelAspectRatio();
- break;
- case EGL_RENDER_BUFFER:
- *value = surface->getRenderBuffer();
- break;
- case EGL_SWAP_BEHAVIOR:
- *value = surface->getSwapBehavior();
- break;
- case EGL_TEXTURE_FORMAT:
- // The EGL spec states that value is not written if the surface is not a pbuffer
- if (surface->getType() == EGL_PBUFFER_BIT)
- {
- *value = surface->getTextureFormat();
- }
- break;
- case EGL_TEXTURE_TARGET:
- // The EGL spec states that value is not written if the surface is not a pbuffer
- if (surface->getType() == EGL_PBUFFER_BIT)
- {
- *value = surface->getTextureTarget();
- }
- break;
- case EGL_VERTICAL_RESOLUTION:
- *value = surface->getVerticalResolution();
- break;
- case EGL_WIDTH:
- *value = surface->getWidth();
- break;
- case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
- *value = surface->isPostSubBufferSupported();
- break;
- case EGL_FIXED_SIZE_ANGLE:
- *value = surface->isFixedSize();
- break;
- case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
- *value = surface->flexibleSurfaceCompatibilityRequested();
- break;
- case EGL_SURFACE_ORIENTATION_ANGLE:
- *value = surface->getOrientation();
- break;
- case EGL_DIRECT_COMPOSITION_ANGLE:
- *value = surface->directComposition();
- break;
- case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
- *value = surface->isRobustResourceInitEnabled();
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
-{
- switch (attribute)
- {
- case EGL_MIPMAP_LEVEL:
- surface->setMipmapLevel(value);
- break;
- case EGL_MULTISAMPLE_RESOLVE:
- surface->setMultisampleResolve(value);
- break;
- case EGL_SWAP_BEHAVIOR:
- surface->setSwapBehavior(value);
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-} // namespace egl
diff --git a/src/3rdparty/angle/src/libANGLE/queryutils.h b/src/3rdparty/angle/src/libANGLE/queryutils.h
deleted file mode 100644
index 990cbc169e..0000000000
--- a/src/3rdparty/angle/src/libANGLE/queryutils.h
+++ /dev/null
@@ -1,162 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// queryutils.h: Utilities for querying values from GL objects
-
-#ifndef LIBANGLE_QUERYUTILS_H_
-#define LIBANGLE_QUERYUTILS_H_
-
-#include "angle_gl.h"
-#include "common/angleutils.h"
-
-#include <EGL/egl.h>
-
-namespace gl
-{
-class Buffer;
-class Context;
-class Error;
-class Sync;
-class Framebuffer;
-class Program;
-class Renderbuffer;
-class Sampler;
-class Shader;
-class Texture;
-struct TextureCaps;
-struct UniformBlock;
-struct VertexAttribute;
-class VertexBinding;
-struct VertexAttribCurrentValueData;
-
-void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
- GLenum attachment,
- GLenum pname,
- GLint *params);
-void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params);
-void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params);
-void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params);
-void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params);
-void QueryRenderbufferiv(const Context *context,
- const Renderbuffer *renderbuffer,
- GLenum pname,
- GLint *params);
-void QueryShaderiv(const Context *context, Shader *shader, GLenum pname, GLint *params);
-void QueryTexLevelParameterfv(const Texture *texture,
- GLenum target,
- GLint level,
- GLenum pname,
- GLfloat *params);
-void QueryTexLevelParameteriv(const Texture *texture,
- GLenum target,
- GLint level,
- GLenum pname,
- GLint *params);
-void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params);
-void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params);
-void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params);
-void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params);
-
-// Warning: you should ensure binding really matches attrib.bindingIndex before using the following
-// functions.
-void QueryVertexAttribfv(const VertexAttribute &attrib,
- const VertexBinding &binding,
- const VertexAttribCurrentValueData &currentValueData,
- GLenum pname,
- GLfloat *params);
-
-void QueryVertexAttribiv(const VertexAttribute &attrib,
- const VertexBinding &binding,
- const VertexAttribCurrentValueData &currentValueData,
- GLenum pname,
- GLint *params);
-
-void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer);
-
-void QueryVertexAttribIiv(const VertexAttribute &attrib,
- const VertexBinding &binding,
- const VertexAttribCurrentValueData &currentValueData,
- GLenum pname,
- GLint *params);
-
-void QueryVertexAttribIuiv(const VertexAttribute &attrib,
- const VertexBinding &binding,
- const VertexAttribCurrentValueData &currentValueData,
- GLenum pname,
- GLuint *params);
-
-void QueryActiveUniformBlockiv(const Program *program,
- GLuint uniformBlockIndex,
- GLenum pname,
- GLint *params);
-
-void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params);
-
-void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params);
-
-Error QuerySynciv(const Sync *sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
-
-void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param);
-void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params);
-void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param);
-void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params);
-
-void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param);
-void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params);
-void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param);
-void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params);
-
-void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param);
-
-void SetProgramParameteri(Program *program, GLenum pname, GLint value);
-
-GLint GetUniformResourceProperty(const Program *program, GLuint index, const GLenum prop);
-
-GLuint QueryProgramResourceIndex(const Program *program,
- GLenum programInterface,
- const GLchar *name);
-
-void QueryProgramResourceName(const Program *program,
- GLenum programInterface,
- GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *name);
-
-GLint QueryProgramResourceLocation(const Program *program,
- GLenum programInterface,
- const GLchar *name);
-void QueryProgramResourceiv(const Program *program,
- GLenum programInterface,
- GLuint index,
- GLsizei propCount,
- const GLenum *props,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params);
-
-void QueryProgramInterfaceiv(const Program *program,
- GLenum programInterface,
- GLenum pname,
- GLint *params);
-
-} // namespace gl
-
-namespace egl
-{
-struct Config;
-class Surface;
-
-void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value);
-
-void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *value);
-
-void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value);
-void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value);
-
-} // namespace egl
-
-#endif // LIBANGLE_QUERYUTILS_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/BufferImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/BufferImpl.h
deleted file mode 100644
index f76fcdc8d7..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/BufferImpl.h
+++ /dev/null
@@ -1,69 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// BufferImpl.h: Defines the abstract rx::BufferImpl class.
-
-#ifndef LIBANGLE_RENDERER_BUFFERIMPL_H_
-#define LIBANGLE_RENDERER_BUFFERIMPL_H_
-
-#include "common/angleutils.h"
-#include "common/mathutil.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/PackedGLEnums.h"
-
-#include <stdint.h>
-
-namespace gl
-{
-class BufferState;
-class Context;
-}
-
-namespace rx
-{
-class BufferImpl : angle::NonCopyable
-{
- public:
- BufferImpl(const gl::BufferState &state) : mState(state) {}
- virtual ~BufferImpl() {}
- virtual void destroy(const gl::Context *context) {}
-
- virtual gl::Error setData(const gl::Context *context,
- gl::BufferBinding target,
- const void *data,
- size_t size,
- gl::BufferUsage usage) = 0;
- virtual gl::Error setSubData(const gl::Context *context,
- gl::BufferBinding target,
- const void *data,
- size_t size,
- size_t offset) = 0;
- virtual gl::Error copySubData(const gl::Context *context,
- BufferImpl *source,
- GLintptr sourceOffset,
- GLintptr destOffset,
- GLsizeiptr size) = 0;
- virtual gl::Error map(const gl::Context *context, GLenum access, void **mapPtr) = 0;
- virtual gl::Error mapRange(const gl::Context *context,
- size_t offset,
- size_t length,
- GLbitfield access,
- void **mapPtr) = 0;
- virtual gl::Error unmap(const gl::Context *context, GLboolean *result) = 0;
-
- virtual gl::Error getIndexRange(const gl::Context *context,
- GLenum type,
- size_t offset,
- size_t count,
- bool primitiveRestartEnabled,
- gl::IndexRange *outRange) = 0;
-
- protected:
- const gl::BufferState &mState;
-};
-}
-
-#endif // LIBANGLE_RENDERER_BUFFERIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/BufferImpl_mock.h b/src/3rdparty/angle/src/libANGLE/renderer/BufferImpl_mock.h
deleted file mode 100644
index 5a4e21003c..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/BufferImpl_mock.h
+++ /dev/null
@@ -1,48 +0,0 @@
-//
-// Copyright 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// BufferImpl_mock.h: Defines a mock of the BufferImpl class.
-
-#ifndef LIBANGLE_RENDERER_BUFFERIMPLMOCK_H_
-#define LIBANGLE_RENDERER_BUFFERIMPLMOCK_H_
-
-#include "gmock/gmock.h"
-
-#include "libANGLE/Buffer.h"
-#include "libANGLE/renderer/BufferImpl.h"
-
-namespace rx
-{
-class MockBufferImpl : public BufferImpl
-{
- public:
- MockBufferImpl() : BufferImpl(mMockState) {}
- ~MockBufferImpl() { destructor(); }
-
- MOCK_METHOD5(
- setData,
- gl::Error(const gl::Context *, gl::BufferBinding, const void *, size_t, gl::BufferUsage));
- MOCK_METHOD5(setSubData,
- gl::Error(const gl::Context *, gl::BufferBinding, const void *, size_t, size_t));
- MOCK_METHOD5(
- copySubData,
- gl::Error(const gl::Context *contextImpl, BufferImpl *, GLintptr, GLintptr, GLsizeiptr));
- MOCK_METHOD3(map, gl::Error(const gl::Context *contextImpl, GLenum, void **));
- MOCK_METHOD5(mapRange,
- gl::Error(const gl::Context *contextImpl, size_t, size_t, GLbitfield, void **));
- MOCK_METHOD2(unmap, gl::Error(const gl::Context *contextImpl, GLboolean *result));
-
- MOCK_METHOD6(getIndexRange,
- gl::Error(const gl::Context *, GLenum, size_t, size_t, bool, gl::IndexRange *));
-
- MOCK_METHOD0(destructor, void());
-
- protected:
- gl::BufferState mMockState;
-};
-}
-
-#endif // LIBANGLE_RENDERER_BUFFERIMPLMOCK_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/CompilerImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/CompilerImpl.h
deleted file mode 100644
index 82f1ffe0d3..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/CompilerImpl.h
+++ /dev/null
@@ -1,34 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// CompilerImpl.h: Defines the rx::CompilerImpl class, an implementation interface
-// for the gl::Compiler object.
-
-#include "common/angleutils.h"
-#include "GLSLANG/ShaderLang.h"
-#include "libANGLE/Error.h"
-
-#ifndef LIBANGLE_RENDERER_COMPILERIMPL_H_
-#define LIBANGLE_RENDERER_COMPILERIMPL_H_
-
-namespace rx
-{
-
-class CompilerImpl : angle::NonCopyable
-{
- public:
- CompilerImpl() {}
- virtual ~CompilerImpl() {}
-
- virtual gl::Error release() = 0;
-
- // TODO(jmadill): Expose translator built-in resources init method.
- virtual ShShaderOutput getTranslatorOutputType() const = 0;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_COMPILERIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/ContextImpl.cpp b/src/3rdparty/angle/src/libANGLE/renderer/ContextImpl.cpp
deleted file mode 100644
index 8d3df291d3..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/ContextImpl.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// ContextImpl:
-// Implementation-specific functionality associated with a GL Context.
-//
-
-#include "libANGLE/renderer/ContextImpl.h"
-
-namespace rx
-{
-
-ContextImpl::ContextImpl(const gl::ContextState &state)
- : mState(state), mMemoryProgramCache(nullptr)
-{
-}
-
-ContextImpl::~ContextImpl()
-{
-}
-
-void ContextImpl::stencilFillPath(const gl::Path *path, GLenum fillMode, GLuint mask)
-{
- UNREACHABLE();
-}
-
-void ContextImpl::stencilStrokePath(const gl::Path *path, GLint reference, GLuint mask)
-{
- UNREACHABLE();
-}
-
-void ContextImpl::coverFillPath(const gl::Path *path, GLenum coverMode)
-{
- UNREACHABLE();
-}
-
-void ContextImpl::coverStrokePath(const gl::Path *path, GLenum coverMode)
-{
- UNREACHABLE();
-}
-
-void ContextImpl::stencilThenCoverFillPath(const gl::Path *path,
- GLenum fillMode,
- GLuint mask,
- GLenum coverMode)
-{
- UNREACHABLE();
-}
-
-void ContextImpl::stencilThenCoverStrokePath(const gl::Path *path,
- GLint reference,
- GLuint mask,
- GLenum coverMode)
-{
- UNREACHABLE();
-}
-
-void ContextImpl::coverFillPathInstanced(const std::vector<gl::Path *> &paths,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues)
-{
- UNREACHABLE();
-}
-
-void ContextImpl::coverStrokePathInstanced(const std::vector<gl::Path *> &paths,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues)
-{
- UNREACHABLE();
-}
-
-void ContextImpl::stencilFillPathInstanced(const std::vector<gl::Path *> &paths,
- GLenum fillMode,
- GLuint mask,
- GLenum transformType,
- const GLfloat *transformValues)
-{
- UNREACHABLE();
-}
-
-void ContextImpl::stencilStrokePathInstanced(const std::vector<gl::Path *> &paths,
- GLint reference,
- GLuint mask,
- GLenum transformType,
- const GLfloat *transformValues)
-{
- UNREACHABLE();
-}
-
-void ContextImpl::stencilThenCoverFillPathInstanced(const std::vector<gl::Path *> &paths,
- GLenum coverMode,
- GLenum fillMode,
- GLuint mask,
- GLenum transformType,
- const GLfloat *transformValues)
-{
- UNREACHABLE();
-}
-
-void ContextImpl::stencilThenCoverStrokePathInstanced(const std::vector<gl::Path *> &paths,
- GLenum coverMode,
- GLint reference,
- GLuint mask,
- GLenum transformType,
- const GLfloat *transformValues)
-{
- UNREACHABLE();
-}
-
-void ContextImpl::setMemoryProgramCache(gl::MemoryProgramCache *memoryProgramCache)
-{
- mMemoryProgramCache = memoryProgramCache;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/ContextImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/ContextImpl.h
deleted file mode 100644
index 7ba4b5ad2d..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/ContextImpl.h
+++ /dev/null
@@ -1,186 +0,0 @@
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// ContextImpl:
-// Implementation-specific functionality associated with a GL Context.
-//
-
-#ifndef LIBANGLE_RENDERER_CONTEXTIMPL_H_
-#define LIBANGLE_RENDERER_CONTEXTIMPL_H_
-
-#include <vector>
-
-#include "common/angleutils.h"
-#include "libANGLE/ContextState.h"
-#include "libANGLE/renderer/GLImplFactory.h"
-
-namespace gl
-{
-class MemoryProgramCache;
-class Path;
-struct Workarounds;
-}
-
-namespace rx
-{
-class ContextImpl : public GLImplFactory
-{
- public:
- ContextImpl(const gl::ContextState &state);
- ~ContextImpl() override;
-
- virtual void onDestroy(const gl::Context *context) {}
-
- virtual gl::Error initialize() = 0;
-
- // Flush and finish.
- virtual gl::Error flush(const gl::Context *context) = 0;
- virtual gl::Error finish(const gl::Context *context) = 0;
-
- // Drawing methods.
- virtual gl::Error drawArrays(const gl::Context *context,
- GLenum mode,
- GLint first,
- GLsizei count) = 0;
- virtual gl::Error drawArraysInstanced(const gl::Context *context,
- GLenum mode,
- GLint first,
- GLsizei count,
- GLsizei instanceCount) = 0;
-
- virtual gl::Error drawElements(const gl::Context *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices) = 0;
- virtual gl::Error drawElementsInstanced(const gl::Context *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei instances) = 0;
- virtual gl::Error drawRangeElements(const gl::Context *context,
- GLenum mode,
- GLuint start,
- GLuint end,
- GLsizei count,
- GLenum type,
- const void *indices) = 0;
-
- virtual gl::Error drawArraysIndirect(const gl::Context *context,
- GLenum mode,
- const void *indirect) = 0;
- virtual gl::Error drawElementsIndirect(const gl::Context *context,
- GLenum mode,
- GLenum type,
- const void *indirect) = 0;
-
- // CHROMIUM_path_rendering path drawing methods.
- virtual void stencilFillPath(const gl::Path *path, GLenum fillMode, GLuint mask);
- virtual void stencilStrokePath(const gl::Path *path, GLint reference, GLuint mask);
- virtual void coverFillPath(const gl::Path *path, GLenum coverMode);
- virtual void coverStrokePath(const gl::Path *path, GLenum coverMode);
- virtual void stencilThenCoverFillPath(const gl::Path *path,
- GLenum fillMode,
- GLuint mask,
- GLenum coverMode);
-
- virtual void stencilThenCoverStrokePath(const gl::Path *path,
- GLint reference,
- GLuint mask,
- GLenum coverMode);
-
- virtual void coverFillPathInstanced(const std::vector<gl::Path *> &paths,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues);
- virtual void coverStrokePathInstanced(const std::vector<gl::Path *> &paths,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues);
- virtual void stencilFillPathInstanced(const std::vector<gl::Path *> &paths,
- GLenum fillMode,
- GLuint mask,
- GLenum transformType,
- const GLfloat *transformValues);
- virtual void stencilStrokePathInstanced(const std::vector<gl::Path *> &paths,
- GLint reference,
- GLuint mask,
- GLenum transformType,
- const GLfloat *transformValues);
- virtual void stencilThenCoverFillPathInstanced(const std::vector<gl::Path *> &paths,
- GLenum coverMode,
- GLenum fillMode,
- GLuint mask,
- GLenum transformType,
- const GLfloat *transformValues);
- virtual void stencilThenCoverStrokePathInstanced(const std::vector<gl::Path *> &paths,
- GLenum coverMode,
- GLint reference,
- GLuint mask,
- GLenum transformType,
- const GLfloat *transformValues);
-
- // Device loss
- virtual GLenum getResetStatus() = 0;
-
- // Vendor and description strings.
- virtual std::string getVendorString() const = 0;
- virtual std::string getRendererDescription() const = 0;
-
- // EXT_debug_marker
- virtual void insertEventMarker(GLsizei length, const char *marker) = 0;
- virtual void pushGroupMarker(GLsizei length, const char *marker) = 0;
- virtual void popGroupMarker() = 0;
-
- // KHR_debug
- virtual void pushDebugGroup(GLenum source, GLuint id, GLsizei length, const char *message) = 0;
- virtual void popDebugGroup() = 0;
-
- // State sync with dirty bits.
- virtual void syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits) = 0;
-
- // Disjoint timer queries
- virtual GLint getGPUDisjoint() = 0;
- virtual GLint64 getTimestamp() = 0;
-
- // Context switching
- virtual void onMakeCurrent(const gl::Context *context) = 0;
-
- // Native capabilities, unmodified by gl::Context.
- virtual const gl::Caps &getNativeCaps() const = 0;
- virtual const gl::TextureCapsMap &getNativeTextureCaps() const = 0;
- virtual const gl::Extensions &getNativeExtensions() const = 0;
- virtual const gl::Limitations &getNativeLimitations() const = 0;
-
- virtual void applyNativeWorkarounds(gl::Workarounds *workarounds) const {}
-
- virtual gl::Error dispatchCompute(const gl::Context *context,
- GLuint numGroupsX,
- GLuint numGroupsY,
- GLuint numGroupsZ) = 0;
-
- const gl::ContextState &getContextState() { return mState; }
- int getClientMajorVersion() const { return mState.getClientMajorVersion(); }
- int getClientMinorVersion() const { return mState.getClientMinorVersion(); }
- const gl::State &getGLState() const { return mState.getState(); }
- const gl::Caps &getCaps() const { return mState.getCaps(); }
- const gl::TextureCapsMap &getTextureCaps() const { return mState.getTextureCaps(); }
- const gl::Extensions &getExtensions() const { return mState.getExtensions(); }
- const gl::Limitations &getLimitations() const { return mState.getLimitations(); }
-
- // A common GL driver behaviour is to trigger dynamic shader recompilation on a draw call,
- // based on the current render states. We store a mutable pointer to the program cache so
- // on draw calls we can store the refreshed shaders in the cache.
- void setMemoryProgramCache(gl::MemoryProgramCache *memoryProgramCache);
-
- protected:
- const gl::ContextState &mState;
- gl::MemoryProgramCache *mMemoryProgramCache;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_CONTEXTIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/DeviceImpl.cpp b/src/3rdparty/angle/src/libANGLE/renderer/DeviceImpl.cpp
deleted file mode 100644
index 6a166236d0..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/DeviceImpl.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// DeviceImpl.cpp: Implementation methods of egl::Device
-
-#include "libANGLE/renderer/DeviceImpl.h"
-
-namespace rx
-{
-
-DeviceImpl::DeviceImpl()
-{
-}
-
-DeviceImpl::~DeviceImpl()
-{
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/DeviceImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/DeviceImpl.h
deleted file mode 100644
index 550bc1e2d9..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/DeviceImpl.h
+++ /dev/null
@@ -1,37 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// DeviceImpl.h: Implementation methods of egl::Device
-
-#ifndef LIBANGLE_RENDERER_DEVICEIMPL_H_
-#define LIBANGLE_RENDERER_DEVICEIMPL_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/Caps.h"
-
-namespace egl
-{
-class Device;
-}
-
-namespace rx
-{
-class DeviceImpl : angle::NonCopyable
-{
- public:
- DeviceImpl();
- virtual ~DeviceImpl();
-
- virtual egl::Error getDevice(void **outValue) = 0;
- virtual EGLint getType() = 0;
- virtual void generateExtensions(egl::DeviceExtensions *outExtensions) const = 0;
- virtual bool deviceExternallySourced() = 0;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_DEVICEIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/DisplayImpl.cpp b/src/3rdparty/angle/src/libANGLE/renderer/DisplayImpl.cpp
deleted file mode 100644
index 5cc9da96dc..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/DisplayImpl.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// DisplayImpl.cpp: Implementation methods of egl::Display
-
-#include "libANGLE/renderer/DisplayImpl.h"
-
-#include "libANGLE/Display.h"
-#include "libANGLE/Surface.h"
-
-namespace rx
-{
-
-DisplayImpl::DisplayImpl(const egl::DisplayState &state)
- : mState(state), mExtensionsInitialized(false), mCapsInitialized(false)
-{
-}
-
-DisplayImpl::~DisplayImpl()
-{
- ASSERT(mState.surfaceSet.empty());
-}
-
-const egl::DisplayExtensions &DisplayImpl::getExtensions() const
-{
- if (!mExtensionsInitialized)
- {
- generateExtensions(&mExtensions);
- mExtensionsInitialized = true;
- }
-
- return mExtensions;
-}
-
-egl::Error DisplayImpl::validateClientBuffer(const egl::Config *configuration,
- EGLenum buftype,
- EGLClientBuffer clientBuffer,
- const egl::AttributeMap &attribs) const
-{
- UNREACHABLE();
- return egl::EglBadDisplay() << "DisplayImpl::validateClientBuffer unimplemented.";
-}
-
-const egl::Caps &DisplayImpl::getCaps() const
-{
- if (!mCapsInitialized)
- {
- generateCaps(&mCaps);
- mCapsInitialized = true;
- }
-
- return mCaps;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/DisplayImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/DisplayImpl.h
deleted file mode 100644
index b1c49d9bc8..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/DisplayImpl.h
+++ /dev/null
@@ -1,96 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// DisplayImpl.h: Implementation methods of egl::Display
-
-#ifndef LIBANGLE_RENDERER_DISPLAYIMPL_H_
-#define LIBANGLE_RENDERER_DISPLAYIMPL_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/Caps.h"
-#include "libANGLE/Config.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/renderer/EGLImplFactory.h"
-#include "libANGLE/Stream.h"
-#include "libANGLE/Version.h"
-
-#include <set>
-#include <vector>
-
-namespace egl
-{
-class AttributeMap;
-class Display;
-struct DisplayState;
-struct Config;
-class Surface;
-class ImageSibling;
-class Thread;
-}
-
-namespace gl
-{
-class Context;
-}
-
-namespace rx
-{
-class SurfaceImpl;
-class ImageImpl;
-struct ConfigDesc;
-class DeviceImpl;
-class StreamProducerImpl;
-
-class DisplayImpl : public EGLImplFactory
-{
- public:
- DisplayImpl(const egl::DisplayState &state);
- ~DisplayImpl() override;
-
- virtual egl::Error initialize(egl::Display *display) = 0;
- virtual void terminate() = 0;
-
- virtual egl::Error makeCurrent(egl::Surface *drawSurface, egl::Surface *readSurface, gl::Context *context) = 0;
-
- virtual egl::ConfigSet generateConfigs() = 0;
-
- virtual bool testDeviceLost() = 0;
- virtual egl::Error restoreLostDevice(const egl::Display *display) = 0;
-
- virtual bool isValidNativeWindow(EGLNativeWindowType window) const = 0;
- virtual egl::Error validateClientBuffer(const egl::Config *configuration,
- EGLenum buftype,
- EGLClientBuffer clientBuffer,
- const egl::AttributeMap &attribs) const;
-
- virtual std::string getVendorString() const = 0;
-
- virtual egl::Error getDevice(DeviceImpl **device) = 0;
-
- virtual egl::Error waitClient(const gl::Context *context) const = 0;
- virtual egl::Error waitNative(const gl::Context *context, EGLint engine) const = 0;
- virtual gl::Version getMaxSupportedESVersion() const = 0;
- const egl::Caps &getCaps() const;
-
- const egl::DisplayExtensions &getExtensions() const;
-
- protected:
- const egl::DisplayState &mState;
-
- private:
- virtual void generateExtensions(egl::DisplayExtensions *outExtensions) const = 0;
- virtual void generateCaps(egl::Caps *outCaps) const = 0;
-
- mutable bool mExtensionsInitialized;
- mutable egl::DisplayExtensions mExtensions;
-
- mutable bool mCapsInitialized;
- mutable egl::Caps mCaps;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_DISPLAYIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/EGLImplFactory.h b/src/3rdparty/angle/src/libANGLE/renderer/EGLImplFactory.h
deleted file mode 100644
index 0433364cd3..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/EGLImplFactory.h
+++ /dev/null
@@ -1,68 +0,0 @@
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// EGLImplFactory.h:
-// Factory interface for EGL Impl objects.
-//
-
-#ifndef LIBANGLE_RENDERER_EGLIMPLFACTORY_H_
-#define LIBANGLE_RENDERER_EGLIMPLFACTORY_H_
-
-#include "libANGLE/Stream.h"
-
-namespace egl
-{
-class AttributeMap;
-struct Config;
-class ImageSibling;
-struct ImageState;
-struct SurfaceState;
-}
-
-namespace gl
-{
-class Context;
-class ContextState;
-}
-
-namespace rx
-{
-class ContextImpl;
-class ImageImpl;
-class SurfaceImpl;
-
-class EGLImplFactory : angle::NonCopyable
-{
- public:
- EGLImplFactory() {}
- virtual ~EGLImplFactory() {}
-
- virtual SurfaceImpl *createWindowSurface(const egl::SurfaceState &state,
- EGLNativeWindowType window,
- const egl::AttributeMap &attribs) = 0;
- virtual SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state,
- const egl::AttributeMap &attribs) = 0;
- virtual SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state,
- EGLenum buftype,
- EGLClientBuffer clientBuffer,
- const egl::AttributeMap &attribs) = 0;
- virtual SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state,
- NativePixmapType nativePixmap,
- const egl::AttributeMap &attribs) = 0;
-
- virtual ImageImpl *createImage(const egl::ImageState &state,
- EGLenum target,
- const egl::AttributeMap &attribs) = 0;
-
- virtual ContextImpl *createContext(const gl::ContextState &state) = 0;
-
- virtual StreamProducerImpl *createStreamProducerD3DTextureNV12(
- egl::Stream::ConsumerType consumerType,
- const egl::AttributeMap &attribs) = 0;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_EGLIMPLFACTORY_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/FenceNVImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/FenceNVImpl.h
deleted file mode 100644
index a534914970..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/FenceNVImpl.h
+++ /dev/null
@@ -1,34 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// FenceNVImpl.h: Defines the rx::FenceNVImpl class.
-
-#ifndef LIBANGLE_RENDERER_FENCENVIMPL_H_
-#define LIBANGLE_RENDERER_FENCENVIMPL_H_
-
-#include "libANGLE/Error.h"
-
-#include "common/angleutils.h"
-
-#include "angle_gl.h"
-
-namespace rx
-{
-
-class FenceNVImpl : angle::NonCopyable
-{
- public:
- FenceNVImpl() { };
- virtual ~FenceNVImpl() { };
-
- virtual gl::Error set(GLenum condition) = 0;
- virtual gl::Error test(GLboolean *outFinished) = 0;
- virtual gl::Error finish() = 0;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_FENCENVIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/Format.h b/src/3rdparty/angle/src/libANGLE/renderer/Format.h
deleted file mode 100644
index 66bdace3e9..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/Format.h
+++ /dev/null
@@ -1,105 +0,0 @@
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Format:
-// A universal description of typed GPU storage. Across multiple
-// renderer back-ends, there are common formats and some distinct
-// permutations, this enum encapsulates them all. Formats apply to
-// textures, but could also apply to any typed data.
-
-#ifndef LIBANGLE_RENDERER_FORMAT_H_
-#define LIBANGLE_RENDERER_FORMAT_H_
-
-#include "libANGLE/renderer/renderer_utils.h"
-
-namespace angle
-{
-
-struct Format final : private angle::NonCopyable
-{
- enum class ID;
-
- constexpr Format(ID id,
- GLenum glFormat,
- GLenum fboFormat,
- rx::MipGenerationFunction mipGen,
- const rx::FastCopyFunctionMap &fastCopyFunctions,
- rx::ColorReadFunction colorRead,
- rx::ColorWriteFunction colorWrite,
- GLenum componentType,
- GLuint redBits,
- GLuint greenBits,
- GLuint blueBits,
- GLuint alphaBits,
- GLuint depthBits,
- GLuint stencilBits);
-
- static const Format &Get(ID id);
- static ID InternalFormatToID(GLenum internalFormat);
-
- ID id;
-
- // The closest matching GL internal format for the storage this format uses. Note that this
- // may be a different internal format than the one this ANGLE format is used for.
- GLenum glInternalFormat;
-
- // The format we should report to the GL layer when querying implementation formats from a FBO.
- // This might not be the same as the glInternalFormat, since some DXGI formats don't have
- // matching GL format enums, like BGRA4, BGR5A1 and B5G6R6.
- GLenum fboImplementationInternalFormat;
-
- rx::MipGenerationFunction mipGenerationFunction;
- rx::ColorReadFunction colorReadFunction;
- rx::ColorWriteFunction colorWriteFunction;
-
- // A map from a gl::FormatType to a fast pixel copy function for this format.
- const rx::FastCopyFunctionMap &fastCopyFunctions;
-
- GLenum componentType;
-
- GLuint redBits;
- GLuint greenBits;
- GLuint blueBits;
- GLuint alphaBits;
- GLuint depthBits;
- GLuint stencilBits;
-};
-
-constexpr Format::Format(ID id,
- GLenum glFormat,
- GLenum fboFormat,
- rx::MipGenerationFunction mipGen,
- const rx::FastCopyFunctionMap &fastCopyFunctions,
- rx::ColorReadFunction colorRead,
- rx::ColorWriteFunction colorWrite,
- GLenum componentType,
- GLuint redBits,
- GLuint greenBits,
- GLuint blueBits,
- GLuint alphaBits,
- GLuint depthBits,
- GLuint stencilBits)
- : id(id),
- glInternalFormat(glFormat),
- fboImplementationInternalFormat(fboFormat),
- mipGenerationFunction(mipGen),
- colorReadFunction(colorRead),
- colorWriteFunction(colorWrite),
- fastCopyFunctions(fastCopyFunctions),
- componentType(componentType),
- redBits(redBits),
- greenBits(greenBits),
- blueBits(blueBits),
- alphaBits(alphaBits),
- depthBits(depthBits),
- stencilBits(stencilBits)
-{
-}
-
-} // namespace angle
-
-#include "libANGLE/renderer/Format_ID_autogen.inl"
-
-#endif // LIBANGLE_RENDERER_FORMAT_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/Format_ID_autogen.inl b/src/3rdparty/angle/src/libANGLE/renderer/Format_ID_autogen.inl
deleted file mode 100644
index b2cbfb0410..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/Format_ID_autogen.inl
+++ /dev/null
@@ -1,147 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by gen_angle_format_table.py using data from angle_format_data.json
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// ANGLE format enumeration.
-
-namespace angle
-{
-
-enum class Format::ID
-{
- NONE,
- A16_FLOAT,
- A32_FLOAT,
- A8_UNORM,
- ASTC_10x10_SRGB_BLOCK,
- ASTC_10x10_UNORM_BLOCK,
- ASTC_10x5_SRGB_BLOCK,
- ASTC_10x5_UNORM_BLOCK,
- ASTC_10x6_SRGB_BLOCK,
- ASTC_10x6_UNORM_BLOCK,
- ASTC_10x8_SRGB_BLOCK,
- ASTC_10x8_UNORM_BLOCK,
- ASTC_12x10_SRGB_BLOCK,
- ASTC_12x10_UNORM_BLOCK,
- ASTC_12x12_SRGB_BLOCK,
- ASTC_12x12_UNORM_BLOCK,
- ASTC_4x4_SRGB_BLOCK,
- ASTC_4x4_UNORM_BLOCK,
- ASTC_5x4_SRGB_BLOCK,
- ASTC_5x4_UNORM_BLOCK,
- ASTC_5x5_SRGB_BLOCK,
- ASTC_5x5_UNORM_BLOCK,
- ASTC_6x5_SRGB_BLOCK,
- ASTC_6x5_UNORM_BLOCK,
- ASTC_6x6_SRGB_BLOCK,
- ASTC_6x6_UNORM_BLOCK,
- ASTC_8x5_SRGB_BLOCK,
- ASTC_8x5_UNORM_BLOCK,
- ASTC_8x6_SRGB_BLOCK,
- ASTC_8x6_UNORM_BLOCK,
- ASTC_8x8_SRGB_BLOCK,
- ASTC_8x8_UNORM_BLOCK,
- B4G4R4A4_UNORM,
- B5G5R5A1_UNORM,
- B5G6R5_UNORM,
- B8G8R8A8_UNORM,
- B8G8R8A8_UNORM_SRGB,
- B8G8R8X8_UNORM,
- BC1_RGBA_UNORM_BLOCK,
- BC1_RGBA_UNORM_SRGB_BLOCK,
- BC1_RGB_UNORM_BLOCK,
- BC1_RGB_UNORM_SRGB_BLOCK,
- BC2_RGBA_UNORM_BLOCK,
- BC2_RGBA_UNORM_SRGB_BLOCK,
- BC3_RGBA_UNORM_BLOCK,
- BC3_RGBA_UNORM_SRGB_BLOCK,
- D16_UNORM,
- D24_UNORM,
- D24_UNORM_S8_UINT,
- D32_FLOAT,
- D32_FLOAT_S8X24_UINT,
- D32_UNORM,
- EAC_R11G11_SNORM_BLOCK,
- EAC_R11G11_UNORM_BLOCK,
- EAC_R11_SNORM_BLOCK,
- EAC_R11_UNORM_BLOCK,
- ETC1_LOSSY_DECODE_R8G8B8_UNORM_BLOCK,
- ETC1_R8G8B8_UNORM_BLOCK,
- ETC2_R8G8B8A1_SRGB_BLOCK,
- ETC2_R8G8B8A1_UNORM_BLOCK,
- ETC2_R8G8B8A8_SRGB_BLOCK,
- ETC2_R8G8B8A8_UNORM_BLOCK,
- ETC2_R8G8B8_SRGB_BLOCK,
- ETC2_R8G8B8_UNORM_BLOCK,
- L16A16_FLOAT,
- L16_FLOAT,
- L32A32_FLOAT,
- L32_FLOAT,
- L8A8_UNORM,
- L8_UNORM,
- R10G10B10A2_UINT,
- R10G10B10A2_UNORM,
- R11G11B10_FLOAT,
- R16G16B16A16_FLOAT,
- R16G16B16A16_SINT,
- R16G16B16A16_SNORM,
- R16G16B16A16_UINT,
- R16G16B16A16_UNORM,
- R16G16B16_FLOAT,
- R16G16B16_SINT,
- R16G16B16_SNORM,
- R16G16B16_UINT,
- R16G16B16_UNORM,
- R16G16_FLOAT,
- R16G16_SINT,
- R16G16_SNORM,
- R16G16_UINT,
- R16G16_UNORM,
- R16_FLOAT,
- R16_SINT,
- R16_SNORM,
- R16_UINT,
- R16_UNORM,
- R32G32B32A32_FLOAT,
- R32G32B32A32_SINT,
- R32G32B32A32_UINT,
- R32G32B32_FLOAT,
- R32G32B32_SINT,
- R32G32B32_UINT,
- R32G32_FLOAT,
- R32G32_SINT,
- R32G32_UINT,
- R32_FLOAT,
- R32_SINT,
- R32_UINT,
- R4G4B4A4_UNORM,
- R5G5B5A1_UNORM,
- R5G6B5_UNORM,
- R8G8B8A8_SINT,
- R8G8B8A8_SNORM,
- R8G8B8A8_UINT,
- R8G8B8A8_UNORM,
- R8G8B8A8_UNORM_SRGB,
- R8G8B8_SINT,
- R8G8B8_SNORM,
- R8G8B8_UINT,
- R8G8B8_UNORM,
- R8G8B8_UNORM_SRGB,
- R8G8_SINT,
- R8G8_SNORM,
- R8G8_UINT,
- R8G8_UNORM,
- R8_SINT,
- R8_SNORM,
- R8_UINT,
- R8_UNORM,
- R9G9B9E5_SHAREDEXP,
- S8_UINT
-};
-
-constexpr uint32_t kNumANGLEFormats = 128;
-
-} // namespace angle
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/Format_table_autogen.cpp b/src/3rdparty/angle/src/libANGLE/renderer/Format_table_autogen.cpp
deleted file mode 100644
index ecb3ad231a..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/Format_table_autogen.cpp
+++ /dev/null
@@ -1,434 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by gen_angle_format_table.py using data from angle_format_data.json
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// ANGLE Format table:
-// Queries for typed format information from the ANGLE format enum.
-
-#include "libANGLE/renderer/Format.h"
-
-#include "image_util/copyimage.h"
-#include "image_util/generatemip.h"
-#include "image_util/loadimage.h"
-
-namespace angle
-{
-
-static constexpr rx::FastCopyFunctionMap::Entry BGRAEntry = {GL_RGBA, GL_UNSIGNED_BYTE,
- CopyBGRA8ToRGBA8};
-static constexpr rx::FastCopyFunctionMap BGRACopyFunctions = {&BGRAEntry, 1};
-static constexpr rx::FastCopyFunctionMap NoCopyFunctions;
-
-constexpr Format g_formatInfoTable[] = {
- // clang-format off
- { Format::ID::NONE, GL_NONE, GL_NONE, nullptr, NoCopyFunctions, nullptr, nullptr, GL_NONE, 0, 0, 0, 0, 0, 0 },
- { Format::ID::A16_FLOAT, GL_ALPHA16F_EXT, GL_ALPHA16F_EXT, GenerateMip<A16F>, NoCopyFunctions, ReadColor<A16F, GLfloat>, WriteColor<A16F, GLfloat>, GL_FLOAT, 0, 0, 0, 16, 0, 0 },
- { Format::ID::A32_FLOAT, GL_ALPHA32F_EXT, GL_ALPHA32F_EXT, GenerateMip<A32F>, NoCopyFunctions, ReadColor<A32F, GLfloat>, WriteColor<A32F, GLfloat>, GL_FLOAT, 0, 0, 0, 32, 0, 0 },
- { Format::ID::A8_UNORM, GL_ALPHA8_EXT, GL_ALPHA8_EXT, GenerateMip<A8>, NoCopyFunctions, ReadColor<A8, GLfloat>, WriteColor<A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 8, 0, 0 },
- { Format::ID::ASTC_10x10_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_10x10_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_10x10_KHR, GL_COMPRESSED_RGBA_ASTC_10x10_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_10x5_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_10x5_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_10x5_KHR, GL_COMPRESSED_RGBA_ASTC_10x5_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_10x6_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_10x6_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_10x6_KHR, GL_COMPRESSED_RGBA_ASTC_10x6_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_10x8_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_10x8_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_10x8_KHR, GL_COMPRESSED_RGBA_ASTC_10x8_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_12x10_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_12x10_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_12x10_KHR, GL_COMPRESSED_RGBA_ASTC_12x10_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_12x12_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_12x12_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_12x12_KHR, GL_COMPRESSED_RGBA_ASTC_12x12_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_4x4_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_4x4_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_4x4_KHR, GL_COMPRESSED_RGBA_ASTC_4x4_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_5x4_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_5x4_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_5x4_KHR, GL_COMPRESSED_RGBA_ASTC_5x4_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_5x5_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_5x5_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_5x5_KHR, GL_COMPRESSED_RGBA_ASTC_5x5_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_6x5_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_6x5_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_6x5_KHR, GL_COMPRESSED_RGBA_ASTC_6x5_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_6x6_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_6x6_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_6x6_KHR, GL_COMPRESSED_RGBA_ASTC_6x6_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_8x5_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_8x5_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_8x5_KHR, GL_COMPRESSED_RGBA_ASTC_8x5_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_8x6_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_8x6_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_8x6_KHR, GL_COMPRESSED_RGBA_ASTC_8x6_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_8x8_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_8x8_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_8x8_KHR, GL_COMPRESSED_RGBA_ASTC_8x8_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::B4G4R4A4_UNORM, GL_BGRA4_ANGLEX, GL_RGBA4, GenerateMip<A4R4G4B4>, NoCopyFunctions, ReadColor<A4R4G4B4, GLfloat>, WriteColor<A4R4G4B4, GLfloat>, GL_UNSIGNED_NORMALIZED, 4, 4, 4, 4, 0, 0 },
- { Format::ID::B5G5R5A1_UNORM, GL_BGR5_A1_ANGLEX, GL_RGB5_A1, GenerateMip<A1R5G5B5>, NoCopyFunctions, ReadColor<A1R5G5B5, GLfloat>, WriteColor<A1R5G5B5, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 5, 5, 1, 0, 0 },
- { Format::ID::B5G6R5_UNORM, GL_BGR565_ANGLEX, GL_RGB565, GenerateMip<B5G6R5>, NoCopyFunctions, ReadColor<B5G6R5, GLfloat>, WriteColor<B5G6R5, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 6, 5, 0, 0, 0 },
- { Format::ID::B8G8R8A8_UNORM, GL_BGRA8_EXT, GL_BGRA8_EXT, GenerateMip<B8G8R8A8>, BGRACopyFunctions, ReadColor<B8G8R8A8, GLfloat>, WriteColor<B8G8R8A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
- { Format::ID::B8G8R8A8_UNORM_SRGB, GL_BGRA8_SRGB_ANGLEX, GL_BGRA8_SRGB_ANGLEX, GenerateMip<B8G8R8A8>, NoCopyFunctions, ReadColor<B8G8R8A8, GLfloat>, WriteColor<B8G8R8A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
- { Format::ID::B8G8R8X8_UNORM, GL_BGRA8_EXT, GL_BGRA8_EXT, GenerateMip<B8G8R8X8>, NoCopyFunctions, ReadColor<B8G8R8X8, GLfloat>, WriteColor<B8G8R8X8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
- { Format::ID::BC1_RGBA_UNORM_BLOCK, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::BC1_RGBA_UNORM_SRGB_BLOCK, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::BC1_RGB_UNORM_BLOCK, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::BC1_RGB_UNORM_SRGB_BLOCK, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::BC2_RGBA_UNORM_BLOCK, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::BC2_RGBA_UNORM_SRGB_BLOCK, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::BC3_RGBA_UNORM_BLOCK, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::BC3_RGBA_UNORM_SRGB_BLOCK, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::D16_UNORM, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT16, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 16, 0 },
- { Format::ID::D24_UNORM, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT24, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 24, 0 },
- { Format::ID::D24_UNORM_S8_UINT, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 24, 8 },
- { Format::ID::D32_FLOAT, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT32F, nullptr, NoCopyFunctions, nullptr, nullptr, GL_FLOAT, 0, 0, 0, 0, 32, 0 },
- { Format::ID::D32_FLOAT_S8X24_UINT, GL_DEPTH32F_STENCIL8, GL_DEPTH32F_STENCIL8, nullptr, NoCopyFunctions, nullptr, nullptr, GL_FLOAT, 0, 0, 0, 0, 32, 8 },
- { Format::ID::D32_UNORM, GL_DEPTH_COMPONENT32_OES, GL_DEPTH_COMPONENT32_OES, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 32, 0 },
- { Format::ID::EAC_R11G11_SNORM_BLOCK, GL_COMPRESSED_SIGNED_RG11_EAC, GL_COMPRESSED_SIGNED_RG11_EAC, nullptr, NoCopyFunctions, nullptr, nullptr, GL_SIGNED_NORMALIZED, 11, 11, 0, 0, 0, 0 },
- { Format::ID::EAC_R11G11_UNORM_BLOCK, GL_COMPRESSED_RG11_EAC, GL_COMPRESSED_RG11_EAC, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 11, 11, 0, 0, 0, 0 },
- { Format::ID::EAC_R11_SNORM_BLOCK, GL_COMPRESSED_SIGNED_R11_EAC, GL_COMPRESSED_SIGNED_R11_EAC, nullptr, NoCopyFunctions, nullptr, nullptr, GL_SIGNED_NORMALIZED, 11, 0, 0, 0, 0, 0 },
- { Format::ID::EAC_R11_UNORM_BLOCK, GL_COMPRESSED_R11_EAC, GL_COMPRESSED_R11_EAC, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 11, 0, 0, 0, 0, 0 },
- { Format::ID::ETC1_LOSSY_DECODE_R8G8B8_UNORM_BLOCK, GL_ETC1_RGB8_LOSSY_DECODE_ANGLE, GL_ETC1_RGB8_LOSSY_DECODE_ANGLE, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
- { Format::ID::ETC1_R8G8B8_UNORM_BLOCK, GL_ETC1_RGB8_OES, GL_ETC1_RGB8_OES, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
- { Format::ID::ETC2_R8G8B8A1_SRGB_BLOCK, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 1, 0, 0 },
- { Format::ID::ETC2_R8G8B8A1_UNORM_BLOCK, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 1, 0, 0 },
- { Format::ID::ETC2_R8G8B8A8_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
- { Format::ID::ETC2_R8G8B8A8_UNORM_BLOCK, GL_COMPRESSED_RGBA8_ETC2_EAC, GL_COMPRESSED_RGBA8_ETC2_EAC, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
- { Format::ID::ETC2_R8G8B8_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ETC2, GL_COMPRESSED_SRGB8_ETC2, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
- { Format::ID::ETC2_R8G8B8_UNORM_BLOCK, GL_COMPRESSED_RGB8_ETC2, GL_COMPRESSED_RGB8_ETC2, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
- { Format::ID::L16A16_FLOAT, GL_LUMINANCE_ALPHA16F_EXT, GL_LUMINANCE_ALPHA16F_EXT, GenerateMip<L16A16F>, NoCopyFunctions, ReadColor<L16A16F, GLfloat>, WriteColor<L16A16F, GLfloat>, GL_FLOAT, 0, 0, 0, 16, 0, 0 },
- { Format::ID::L16_FLOAT, GL_LUMINANCE16F_EXT, GL_LUMINANCE16F_EXT, GenerateMip<L16F>, NoCopyFunctions, ReadColor<L16F, GLfloat>, WriteColor<L16F, GLfloat>, GL_FLOAT, 0, 0, 0, 0, 0, 0 },
- { Format::ID::L32A32_FLOAT, GL_LUMINANCE_ALPHA32F_EXT, GL_LUMINANCE_ALPHA32F_EXT, GenerateMip<L32A32F>, NoCopyFunctions, ReadColor<L32A32F, GLfloat>, WriteColor<L32A32F, GLfloat>, GL_FLOAT, 0, 0, 0, 32, 0, 0 },
- { Format::ID::L32_FLOAT, GL_LUMINANCE32F_EXT, GL_LUMINANCE32F_EXT, GenerateMip<L32F>, NoCopyFunctions, ReadColor<L32F, GLfloat>, WriteColor<L32F, GLfloat>, GL_FLOAT, 0, 0, 0, 0, 0, 0 },
- { Format::ID::L8A8_UNORM, GL_LUMINANCE8_ALPHA8_EXT, GL_LUMINANCE8_ALPHA8_EXT, GenerateMip<L8A8>, NoCopyFunctions, ReadColor<L8A8, GLfloat>, WriteColor<L8A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 8, 0, 0 },
- { Format::ID::L8_UNORM, GL_LUMINANCE8_EXT, GL_LUMINANCE8_EXT, GenerateMip<L8>, NoCopyFunctions, ReadColor<L8, GLfloat>, WriteColor<L8, GLfloat>, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::R10G10B10A2_UINT, GL_RGB10_A2UI, GL_RGB10_A2UI, GenerateMip<R10G10B10A2>, NoCopyFunctions, ReadColor<R10G10B10A2, GLuint>, WriteColor<R10G10B10A2, GLuint>, GL_UNSIGNED_INT, 10, 10, 10, 2, 0, 0 },
- { Format::ID::R10G10B10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, GenerateMip<R10G10B10A2>, NoCopyFunctions, ReadColor<R10G10B10A2, GLfloat>, WriteColor<R10G10B10A2, GLfloat>, GL_UNSIGNED_NORMALIZED, 10, 10, 10, 2, 0, 0 },
- { Format::ID::R11G11B10_FLOAT, GL_R11F_G11F_B10F, GL_R11F_G11F_B10F, GenerateMip<R11G11B10F>, NoCopyFunctions, ReadColor<R11G11B10F, GLfloat>, WriteColor<R11G11B10F, GLfloat>, GL_FLOAT, 11, 11, 10, 0, 0, 0 },
- { Format::ID::R16G16B16A16_FLOAT, GL_RGBA16F, GL_RGBA16F, GenerateMip<R16G16B16A16F>, NoCopyFunctions, ReadColor<R16G16B16A16F, GLfloat>, WriteColor<R16G16B16A16F, GLfloat>, GL_FLOAT, 16, 16, 16, 16, 0, 0 },
- { Format::ID::R16G16B16A16_SINT, GL_RGBA16I, GL_RGBA16I, GenerateMip<R16G16B16A16S>, NoCopyFunctions, ReadColor<R16G16B16A16S, GLint>, WriteColor<R16G16B16A16S, GLint>, GL_INT, 16, 16, 16, 16, 0, 0 },
- { Format::ID::R16G16B16A16_SNORM, GL_RGBA16_SNORM_EXT, GL_RGBA16_SNORM_EXT, GenerateMip<R16G16B16A16S>, NoCopyFunctions, ReadColor<R16G16B16A16S, GLfloat>, WriteColor<R16G16B16A16S, GLfloat>, GL_SIGNED_NORMALIZED, 16, 16, 16, 16, 0, 0 },
- { Format::ID::R16G16B16A16_UINT, GL_RGBA16UI, GL_RGBA16UI, GenerateMip<R16G16B16A16>, NoCopyFunctions, ReadColor<R16G16B16A16, GLuint>, WriteColor<R16G16B16A16, GLuint>, GL_UNSIGNED_INT, 16, 16, 16, 16, 0, 0 },
- { Format::ID::R16G16B16A16_UNORM, GL_RGBA16_EXT, GL_RGBA16_EXT, GenerateMip<R16G16B16A16>, NoCopyFunctions, ReadColor<R16G16B16A16, GLfloat>, WriteColor<R16G16B16A16, GLfloat>, GL_UNSIGNED_NORMALIZED, 16, 16, 16, 16, 0, 0 },
- { Format::ID::R16G16B16_FLOAT, GL_RGB16F, GL_RGB16F, GenerateMip<R16G16B16F>, NoCopyFunctions, ReadColor<R16G16B16F, GLfloat>, WriteColor<R16G16B16F, GLfloat>, GL_FLOAT, 16, 16, 16, 0, 0, 0 },
- { Format::ID::R16G16B16_SINT, GL_RGB16I, GL_RGB16I, GenerateMip<R16G16B16S>, NoCopyFunctions, ReadColor<R16G16B16S, GLint>, WriteColor<R16G16B16S, GLint>, GL_INT, 16, 16, 16, 0, 0, 0 },
- { Format::ID::R16G16B16_SNORM, GL_RGB16_SNORM_EXT, GL_RGB16_SNORM_EXT, GenerateMip<R16G16B16S>, NoCopyFunctions, ReadColor<R16G16B16S, GLfloat>, WriteColor<R16G16B16S, GLfloat>, GL_SIGNED_NORMALIZED, 16, 16, 16, 0, 0, 0 },
- { Format::ID::R16G16B16_UINT, GL_RGB16UI, GL_RGB16UI, GenerateMip<R16G16B16>, NoCopyFunctions, ReadColor<R16G16B16, GLuint>, WriteColor<R16G16B16, GLuint>, GL_UNSIGNED_INT, 16, 16, 16, 0, 0, 0 },
- { Format::ID::R16G16B16_UNORM, GL_RGB16_EXT, GL_RGB16_EXT, GenerateMip<R16G16B16>, NoCopyFunctions, ReadColor<R16G16B16, GLfloat>, WriteColor<R16G16B16, GLfloat>, GL_UNSIGNED_NORMALIZED, 16, 16, 16, 0, 0, 0 },
- { Format::ID::R16G16_FLOAT, GL_RG16F, GL_RG16F, GenerateMip<R16G16F>, NoCopyFunctions, ReadColor<R16G16F, GLfloat>, WriteColor<R16G16F, GLfloat>, GL_FLOAT, 16, 16, 0, 0, 0, 0 },
- { Format::ID::R16G16_SINT, GL_RG16I, GL_RG16I, GenerateMip<R16G16S>, NoCopyFunctions, ReadColor<R16G16S, GLint>, WriteColor<R16G16S, GLint>, GL_INT, 16, 16, 0, 0, 0, 0 },
- { Format::ID::R16G16_SNORM, GL_RG16_SNORM_EXT, GL_RG16_SNORM_EXT, GenerateMip<R16G16S>, NoCopyFunctions, ReadColor<R16G16S, GLfloat>, WriteColor<R16G16S, GLfloat>, GL_SIGNED_NORMALIZED, 16, 16, 0, 0, 0, 0 },
- { Format::ID::R16G16_UINT, GL_RG16UI, GL_RG16UI, GenerateMip<R16G16>, NoCopyFunctions, ReadColor<R16G16, GLuint>, WriteColor<R16G16, GLuint>, GL_UNSIGNED_INT, 16, 16, 0, 0, 0, 0 },
- { Format::ID::R16G16_UNORM, GL_RG16_EXT, GL_RG16_EXT, GenerateMip<R16G16>, NoCopyFunctions, ReadColor<R16G16, GLfloat>, WriteColor<R16G16, GLfloat>, GL_UNSIGNED_NORMALIZED, 16, 16, 0, 0, 0, 0 },
- { Format::ID::R16_FLOAT, GL_R16F, GL_R16F, GenerateMip<R16F>, NoCopyFunctions, ReadColor<R16F, GLfloat>, WriteColor<R16F, GLfloat>, GL_FLOAT, 16, 0, 0, 0, 0, 0 },
- { Format::ID::R16_SINT, GL_R16I, GL_R16I, GenerateMip<R16S>, NoCopyFunctions, ReadColor<R16S, GLint>, WriteColor<R16S, GLint>, GL_INT, 16, 0, 0, 0, 0, 0 },
- { Format::ID::R16_SNORM, GL_R16_SNORM_EXT, GL_R16_SNORM_EXT, GenerateMip<R16S>, NoCopyFunctions, ReadColor<R16S, GLfloat>, WriteColor<R16S, GLfloat>, GL_SIGNED_NORMALIZED, 16, 0, 0, 0, 0, 0 },
- { Format::ID::R16_UINT, GL_R16UI, GL_R16UI, GenerateMip<R16>, NoCopyFunctions, ReadColor<R16, GLuint>, WriteColor<R16, GLuint>, GL_UNSIGNED_INT, 16, 0, 0, 0, 0, 0 },
- { Format::ID::R16_UNORM, GL_R16_EXT, GL_R16_EXT, GenerateMip<R16>, NoCopyFunctions, ReadColor<R16, GLfloat>, WriteColor<R16, GLfloat>, GL_UNSIGNED_NORMALIZED, 16, 0, 0, 0, 0, 0 },
- { Format::ID::R32G32B32A32_FLOAT, GL_RGBA32F, GL_RGBA32F, GenerateMip<R32G32B32A32F>, NoCopyFunctions, ReadColor<R32G32B32A32F, GLfloat>, WriteColor<R32G32B32A32F, GLfloat>, GL_FLOAT, 32, 32, 32, 32, 0, 0 },
- { Format::ID::R32G32B32A32_SINT, GL_RGBA32I, GL_RGBA32I, GenerateMip<R32G32B32A32S>, NoCopyFunctions, ReadColor<R32G32B32A32S, GLint>, WriteColor<R32G32B32A32S, GLint>, GL_INT, 32, 32, 32, 32, 0, 0 },
- { Format::ID::R32G32B32A32_UINT, GL_RGBA32UI, GL_RGBA32UI, GenerateMip<R32G32B32A32>, NoCopyFunctions, ReadColor<R32G32B32A32, GLuint>, WriteColor<R32G32B32A32, GLuint>, GL_UNSIGNED_INT, 32, 32, 32, 32, 0, 0 },
- { Format::ID::R32G32B32_FLOAT, GL_RGB32F, GL_RGB32F, GenerateMip<R32G32B32F>, NoCopyFunctions, ReadColor<R32G32B32F, GLfloat>, WriteColor<R32G32B32F, GLfloat>, GL_FLOAT, 32, 32, 32, 0, 0, 0 },
- { Format::ID::R32G32B32_SINT, GL_RGB32I, GL_RGB32I, GenerateMip<R32G32B32S>, NoCopyFunctions, ReadColor<R32G32B32S, GLint>, WriteColor<R32G32B32S, GLint>, GL_INT, 32, 32, 32, 0, 0, 0 },
- { Format::ID::R32G32B32_UINT, GL_RGB32UI, GL_RGB32UI, GenerateMip<R32G32B32>, NoCopyFunctions, ReadColor<R32G32B32, GLuint>, WriteColor<R32G32B32, GLuint>, GL_UNSIGNED_INT, 32, 32, 32, 0, 0, 0 },
- { Format::ID::R32G32_FLOAT, GL_RG32F, GL_RG32F, GenerateMip<R32G32F>, NoCopyFunctions, ReadColor<R32G32F, GLfloat>, WriteColor<R32G32F, GLfloat>, GL_FLOAT, 32, 32, 0, 0, 0, 0 },
- { Format::ID::R32G32_SINT, GL_RG32I, GL_RG32I, GenerateMip<R32G32S>, NoCopyFunctions, ReadColor<R32G32S, GLint>, WriteColor<R32G32S, GLint>, GL_INT, 32, 32, 0, 0, 0, 0 },
- { Format::ID::R32G32_UINT, GL_RG32UI, GL_RG32UI, GenerateMip<R32G32>, NoCopyFunctions, ReadColor<R32G32, GLuint>, WriteColor<R32G32, GLuint>, GL_UNSIGNED_INT, 32, 32, 0, 0, 0, 0 },
- { Format::ID::R32_FLOAT, GL_R32F, GL_R32F, GenerateMip<R32F>, NoCopyFunctions, ReadColor<R32F, GLfloat>, WriteColor<R32F, GLfloat>, GL_FLOAT, 32, 0, 0, 0, 0, 0 },
- { Format::ID::R32_SINT, GL_R32I, GL_R32I, GenerateMip<R32S>, NoCopyFunctions, ReadColor<R32S, GLint>, WriteColor<R32S, GLint>, GL_INT, 32, 0, 0, 0, 0, 0 },
- { Format::ID::R32_UINT, GL_R32UI, GL_R32UI, GenerateMip<R32>, NoCopyFunctions, ReadColor<R32, GLuint>, WriteColor<R32, GLuint>, GL_UNSIGNED_INT, 32, 0, 0, 0, 0, 0 },
- { Format::ID::R4G4B4A4_UNORM, GL_RGBA4, GL_RGBA4, GenerateMip<R4G4B4A4>, NoCopyFunctions, ReadColor<R4G4B4A4, GLfloat>, WriteColor<R4G4B4A4, GLfloat>, GL_UNSIGNED_NORMALIZED, 4, 4, 4, 4, 0, 0 },
- { Format::ID::R5G5B5A1_UNORM, GL_RGB5_A1, GL_RGB5_A1, GenerateMip<R5G5B5A1>, NoCopyFunctions, ReadColor<R5G5B5A1, GLfloat>, WriteColor<R5G5B5A1, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 5, 5, 1, 0, 0 },
- { Format::ID::R5G6B5_UNORM, GL_RGB565, GL_RGB565, GenerateMip<R5G6B5>, NoCopyFunctions, ReadColor<R5G6B5, GLfloat>, WriteColor<R5G6B5, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 6, 5, 0, 0, 0 },
- { Format::ID::R8G8B8A8_SINT, GL_RGBA8I, GL_RGBA8I, GenerateMip<R8G8B8A8S>, NoCopyFunctions, ReadColor<R8G8B8A8S, GLint>, WriteColor<R8G8B8A8S, GLint>, GL_INT, 8, 8, 8, 8, 0, 0 },
- { Format::ID::R8G8B8A8_SNORM, GL_RGBA8_SNORM, GL_RGBA8_SNORM, GenerateMip<R8G8B8A8S>, NoCopyFunctions, ReadColor<R8G8B8A8S, GLfloat>, WriteColor<R8G8B8A8S, GLfloat>, GL_SIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
- { Format::ID::R8G8B8A8_UINT, GL_RGBA8UI, GL_RGBA8UI, GenerateMip<R8G8B8A8>, NoCopyFunctions, ReadColor<R8G8B8A8, GLuint>, WriteColor<R8G8B8A8, GLuint>, GL_UNSIGNED_INT, 8, 8, 8, 8, 0, 0 },
- { Format::ID::R8G8B8A8_UNORM, GL_RGBA8, GL_RGBA8, GenerateMip<R8G8B8A8>, NoCopyFunctions, ReadColor<R8G8B8A8, GLfloat>, WriteColor<R8G8B8A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
- { Format::ID::R8G8B8A8_UNORM_SRGB, GL_SRGB8_ALPHA8, GL_SRGB8_ALPHA8, GenerateMip<R8G8B8A8SRGB>, NoCopyFunctions, ReadColor<R8G8B8A8SRGB, GLfloat>, WriteColor<R8G8B8A8SRGB, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
- { Format::ID::R8G8B8_SINT, GL_RGB8I, GL_RGB8I, GenerateMip<R8G8B8S>, NoCopyFunctions, ReadColor<R8G8B8S, GLint>, WriteColor<R8G8B8S, GLint>, GL_INT, 8, 8, 8, 0, 0, 0 },
- { Format::ID::R8G8B8_SNORM, GL_RGB8_SNORM, GL_RGB8_SNORM, GenerateMip<R8G8B8S>, NoCopyFunctions, ReadColor<R8G8B8S, GLfloat>, WriteColor<R8G8B8S, GLfloat>, GL_SIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
- { Format::ID::R8G8B8_UINT, GL_RGB8UI, GL_RGB8UI, GenerateMip<R8G8B8>, NoCopyFunctions, ReadColor<R8G8B8, GLuint>, WriteColor<R8G8B8, GLuint>, GL_UNSIGNED_INT, 8, 8, 8, 0, 0, 0 },
- { Format::ID::R8G8B8_UNORM, GL_RGB8, GL_RGB8, GenerateMip<R8G8B8>, NoCopyFunctions, ReadColor<R8G8B8, GLfloat>, WriteColor<R8G8B8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
- { Format::ID::R8G8B8_UNORM_SRGB, GL_SRGB8, GL_SRGB8, GenerateMip<R8G8B8>, NoCopyFunctions, ReadColor<R8G8B8, GLfloat>, WriteColor<R8G8B8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
- { Format::ID::R8G8_SINT, GL_RG8I, GL_RG8I, GenerateMip<R8G8S>, NoCopyFunctions, ReadColor<R8G8S, GLint>, WriteColor<R8G8S, GLint>, GL_INT, 8, 8, 0, 0, 0, 0 },
- { Format::ID::R8G8_SNORM, GL_RG8_SNORM, GL_RG8_SNORM, GenerateMip<R8G8S>, NoCopyFunctions, ReadColor<R8G8S, GLfloat>, WriteColor<R8G8S, GLfloat>, GL_SIGNED_NORMALIZED, 8, 8, 0, 0, 0, 0 },
- { Format::ID::R8G8_UINT, GL_RG8UI, GL_RG8UI, GenerateMip<R8G8>, NoCopyFunctions, ReadColor<R8G8, GLuint>, WriteColor<R8G8, GLuint>, GL_UNSIGNED_INT, 8, 8, 0, 0, 0, 0 },
- { Format::ID::R8G8_UNORM, GL_RG8, GL_RG8, GenerateMip<R8G8>, NoCopyFunctions, ReadColor<R8G8, GLfloat>, WriteColor<R8G8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 0, 0, 0, 0 },
- { Format::ID::R8_SINT, GL_R8I, GL_R8I, GenerateMip<R8S>, NoCopyFunctions, ReadColor<R8S, GLint>, WriteColor<R8S, GLint>, GL_INT, 8, 0, 0, 0, 0, 0 },
- { Format::ID::R8_SNORM, GL_R8_SNORM, GL_R8_SNORM, GenerateMip<R8S>, NoCopyFunctions, ReadColor<R8S, GLfloat>, WriteColor<R8S, GLfloat>, GL_SIGNED_NORMALIZED, 8, 0, 0, 0, 0, 0 },
- { Format::ID::R8_UINT, GL_R8UI, GL_R8UI, GenerateMip<R8>, NoCopyFunctions, ReadColor<R8, GLuint>, WriteColor<R8, GLuint>, GL_UNSIGNED_INT, 8, 0, 0, 0, 0, 0 },
- { Format::ID::R8_UNORM, GL_R8, GL_R8, GenerateMip<R8>, NoCopyFunctions, ReadColor<R8, GLfloat>, WriteColor<R8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 0, 0, 0, 0, 0 },
- { Format::ID::R9G9B9E5_SHAREDEXP, GL_RGB9_E5, GL_RGB9_E5, GenerateMip<R9G9B9E5>, NoCopyFunctions, ReadColor<R9G9B9E5, GLfloat>, WriteColor<R9G9B9E5, GLfloat>, GL_FLOAT, 9, 9, 9, 0, 0, 0 },
- { Format::ID::S8_UINT, GL_STENCIL_INDEX8, GL_STENCIL_INDEX8, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_INT, 0, 0, 0, 0, 0, 8 },
- // clang-format on
-};
-
-// static
-Format::ID Format::InternalFormatToID(GLenum internalFormat)
-{
- switch (internalFormat)
- {
- case GL_RGBA16_EXT:
- return Format::ID::R16G16B16A16_UNORM;
- case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
- return Format::ID::ETC1_LOSSY_DECODE_R8G8B8_UNORM_BLOCK;
- case GL_RG8I:
- return Format::ID::R8G8_SINT;
- case GL_R16F:
- return Format::ID::R16_FLOAT;
- case GL_RGBA8I:
- return Format::ID::R8G8B8A8_SINT;
- case GL_RG8UI:
- return Format::ID::R8G8_UINT;
- case GL_RGBA8_SNORM:
- return Format::ID::R8G8B8A8_SNORM;
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
- return Format::ID::ASTC_12x10_SRGB_BLOCK;
- case GL_RG8_SNORM:
- return Format::ID::R8G8_SNORM;
- case GL_BGR565_ANGLEX:
- return Format::ID::B5G6R5_UNORM;
- case GL_DEPTH_COMPONENT24:
- return Format::ID::D24_UNORM;
- case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
- return Format::ID::ETC2_R8G8B8A1_UNORM_BLOCK;
- case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
- return Format::ID::ASTC_10x10_UNORM_BLOCK;
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
- return Format::ID::ASTC_8x6_SRGB_BLOCK;
- case GL_RGB32UI:
- return Format::ID::R32G32B32_UINT;
- case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
- return Format::ID::ASTC_6x5_UNORM_BLOCK;
- case GL_ALPHA32F_EXT:
- return Format::ID::A32_FLOAT;
- case GL_R16UI:
- return Format::ID::R16_UINT;
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
- return Format::ID::ASTC_5x4_SRGB_BLOCK;
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
- return Format::ID::ASTC_5x5_SRGB_BLOCK;
- case GL_COMPRESSED_R11_EAC:
- return Format::ID::EAC_R11_UNORM_BLOCK;
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
- return Format::ID::ASTC_10x10_SRGB_BLOCK;
- case GL_RGBA32UI:
- return Format::ID::R32G32B32A32_UINT;
- case GL_R8_SNORM:
- return Format::ID::R8_SNORM;
- case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
- return Format::ID::BC1_RGBA_UNORM_SRGB_BLOCK;
- case GL_LUMINANCE32F_EXT:
- return Format::ID::L32_FLOAT;
- case GL_RG16_EXT:
- return Format::ID::R16G16_UNORM;
- case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
- return Format::ID::ETC2_R8G8B8A1_SRGB_BLOCK;
- case GL_SRGB8:
- return Format::ID::R8G8B8_UNORM_SRGB;
- case GL_LUMINANCE8_ALPHA8_EXT:
- return Format::ID::L8A8_UNORM;
- case GL_BGRX8_ANGLEX:
- return Format::ID::B8G8R8X8_UNORM;
- case GL_RGB16_SNORM_EXT:
- return Format::ID::R16G16B16_SNORM;
- case GL_RGBA8UI:
- return Format::ID::R8G8B8A8_UINT;
- case GL_BGRA4_ANGLEX:
- return Format::ID::B4G4R4A4_UNORM;
- case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
- return Format::ID::ETC2_R8G8B8A8_SRGB_BLOCK;
- case GL_LUMINANCE8_EXT:
- return Format::ID::L8_UNORM;
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
- return Format::ID::BC3_RGBA_UNORM_BLOCK;
- case GL_R16I:
- return Format::ID::R16_SINT;
- case GL_RGB5_A1:
- return Format::ID::R5G5B5A1_UNORM;
- case GL_RGB16UI:
- return Format::ID::R16G16B16_UINT;
- case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
- return Format::ID::ASTC_4x4_UNORM_BLOCK;
- case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
- return Format::ID::BC2_RGBA_UNORM_SRGB_BLOCK;
- case GL_R16_SNORM_EXT:
- return Format::ID::R16_SNORM;
- case GL_COMPRESSED_RGB8_ETC2:
- return Format::ID::ETC2_R8G8B8_UNORM_BLOCK;
- case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
- return Format::ID::BC1_RGB_UNORM_SRGB_BLOCK;
- case GL_RGBA32F:
- return Format::ID::R32G32B32A32_FLOAT;
- case GL_RGBA32I:
- return Format::ID::R32G32B32A32_SINT;
- case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
- return Format::ID::BC3_RGBA_UNORM_SRGB_BLOCK;
- case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
- return Format::ID::ASTC_8x5_UNORM_BLOCK;
- case GL_RG8:
- return Format::ID::R8G8_UNORM;
- case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
- return Format::ID::ASTC_8x8_UNORM_BLOCK;
- case GL_RGB10_A2:
- return Format::ID::R10G10B10A2_UNORM;
- case GL_COMPRESSED_SIGNED_RG11_EAC:
- return Format::ID::EAC_R11G11_SNORM_BLOCK;
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
- return Format::ID::ASTC_6x6_SRGB_BLOCK;
- case GL_DEPTH_COMPONENT16:
- return Format::ID::D16_UNORM;
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
- return Format::ID::ASTC_10x5_SRGB_BLOCK;
- case GL_RGB32I:
- return Format::ID::R32G32B32_SINT;
- case GL_R8:
- return Format::ID::R8_UNORM;
- case GL_RGB32F:
- return Format::ID::R32G32B32_FLOAT;
- case GL_R16_EXT:
- return Format::ID::R16_UNORM;
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
- return Format::ID::ASTC_8x8_SRGB_BLOCK;
- case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
- return Format::ID::ASTC_10x5_UNORM_BLOCK;
- case GL_R11F_G11F_B10F:
- return Format::ID::R11G11B10_FLOAT;
- case GL_RGB8:
- return Format::ID::R8G8B8_UNORM;
- case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
- return Format::ID::ASTC_5x5_UNORM_BLOCK;
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
- return Format::ID::ASTC_8x5_SRGB_BLOCK;
- case GL_RGBA16I:
- return Format::ID::R16G16B16A16_SINT;
- case GL_R8I:
- return Format::ID::R8_SINT;
- case GL_RGB8_SNORM:
- return Format::ID::R8G8B8_SNORM;
- case GL_RG32F:
- return Format::ID::R32G32_FLOAT;
- case GL_DEPTH_COMPONENT32F:
- return Format::ID::D32_FLOAT;
- case GL_RG32I:
- return Format::ID::R32G32_SINT;
- case GL_ALPHA8_EXT:
- return Format::ID::A8_UNORM;
- case GL_RGB16_EXT:
- return Format::ID::R16G16B16_UNORM;
- case GL_BGRA8_EXT:
- return Format::ID::B8G8R8A8_UNORM;
- case GL_RG32UI:
- return Format::ID::R32G32_UINT;
- case GL_RGBA16UI:
- return Format::ID::R16G16B16A16_UINT;
- case GL_COMPRESSED_RGBA8_ETC2_EAC:
- return Format::ID::ETC2_R8G8B8A8_UNORM_BLOCK;
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- return Format::ID::BC1_RGBA_UNORM_BLOCK;
- case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
- return Format::ID::ASTC_10x6_UNORM_BLOCK;
- case GL_COMPRESSED_SRGB8_ETC2:
- return Format::ID::ETC2_R8G8B8_SRGB_BLOCK;
- case GL_BGRA8_SRGB_ANGLEX:
- return Format::ID::B8G8R8A8_UNORM_SRGB;
- case GL_DEPTH32F_STENCIL8:
- return Format::ID::D32_FLOAT_S8X24_UINT;
- case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
- return Format::ID::ASTC_6x6_UNORM_BLOCK;
- case GL_R32UI:
- return Format::ID::R32_UINT;
- case GL_BGR5_A1_ANGLEX:
- return Format::ID::B5G5R5A1_UNORM;
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
- return Format::ID::ASTC_12x12_SRGB_BLOCK;
- case GL_COMPRESSED_RG11_EAC:
- return Format::ID::EAC_R11G11_UNORM_BLOCK;
- case GL_SRGB8_ALPHA8:
- return Format::ID::R8G8B8A8_UNORM_SRGB;
- case GL_LUMINANCE_ALPHA16F_EXT:
- return Format::ID::L16A16_FLOAT;
- case GL_RGBA:
- return Format::ID::R8G8B8A8_UNORM;
- case GL_ETC1_RGB8_OES:
- return Format::ID::ETC1_R8G8B8_UNORM_BLOCK;
- case GL_DEPTH24_STENCIL8:
- return Format::ID::D24_UNORM_S8_UINT;
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
- return Format::ID::ASTC_4x4_SRGB_BLOCK;
- case GL_RGB16I:
- return Format::ID::R16G16B16_SINT;
- case GL_R8UI:
- return Format::ID::R8_UINT;
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
- return Format::ID::ASTC_10x6_SRGB_BLOCK;
- case GL_RGBA16F:
- return Format::ID::R16G16B16A16_FLOAT;
- case GL_COMPRESSED_SIGNED_R11_EAC:
- return Format::ID::EAC_R11_SNORM_BLOCK;
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
- return Format::ID::BC1_RGB_UNORM_BLOCK;
- case GL_RGB8I:
- return Format::ID::R8G8B8_SINT;
- case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
- return Format::ID::ASTC_8x6_UNORM_BLOCK;
- case GL_STENCIL_INDEX8:
- return Format::ID::S8_UINT;
- case GL_LUMINANCE_ALPHA32F_EXT:
- return Format::ID::L32A32_FLOAT;
- case GL_ALPHA16F_EXT:
- return Format::ID::A16_FLOAT;
- case GL_RGB8UI:
- return Format::ID::R8G8B8_UINT;
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
- return Format::ID::ASTC_10x8_SRGB_BLOCK;
- case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
- return Format::ID::ASTC_12x10_UNORM_BLOCK;
- case GL_RGB9_E5:
- return Format::ID::R9G9B9E5_SHAREDEXP;
- case GL_RGBA16_SNORM_EXT:
- return Format::ID::R16G16B16A16_SNORM;
- case GL_R32I:
- return Format::ID::R32_SINT;
- case GL_DEPTH_COMPONENT32_OES:
- return Format::ID::D32_UNORM;
- case GL_R32F:
- return Format::ID::R32_FLOAT;
- case GL_NONE:
- return Format::ID::NONE;
- case GL_RG16F:
- return Format::ID::R16G16_FLOAT;
- case GL_RGB:
- return Format::ID::R8G8B8_UNORM;
- case GL_RGB565:
- return Format::ID::R5G6B5_UNORM;
- case GL_LUMINANCE16F_EXT:
- return Format::ID::L16_FLOAT;
- case GL_RG16UI:
- return Format::ID::R16G16_UINT;
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
- return Format::ID::BC2_RGBA_UNORM_BLOCK;
- case GL_RG16I:
- return Format::ID::R16G16_SINT;
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
- return Format::ID::ASTC_6x5_SRGB_BLOCK;
- case GL_RG16_SNORM_EXT:
- return Format::ID::R16G16_SNORM;
- case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
- return Format::ID::ASTC_12x12_UNORM_BLOCK;
- case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
- return Format::ID::ASTC_5x4_UNORM_BLOCK;
- case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
- return Format::ID::ASTC_10x8_UNORM_BLOCK;
- case GL_RGBA4:
- return Format::ID::R4G4B4A4_UNORM;
- case GL_RGBA8:
- return Format::ID::R8G8B8A8_UNORM;
- case GL_RGB16F:
- return Format::ID::R16G16B16_FLOAT;
- case GL_RGB10_A2UI:
- return Format::ID::R10G10B10A2_UINT;
- default:
- return Format::ID::NONE;
- }
-}
-
-// static
-const Format &Format::Get(ID id)
-{
- return g_formatInfoTable[static_cast<size_t>(id)];
-}
-
-} // namespace angle
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/FramebufferAttachmentObjectImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/FramebufferAttachmentObjectImpl.h
deleted file mode 100644
index 056ddc833a..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/FramebufferAttachmentObjectImpl.h
+++ /dev/null
@@ -1,54 +0,0 @@
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// FramebufferAttachmentObjectImpl.h:
-// Common ancenstor for all implementations of FBO attachable-objects.
-// This means Surfaces, Textures and Renderbuffers.
-//
-
-#ifndef LIBANGLE_RENDERER_FRAMEBUFFER_ATTACHMENT_OBJECT_IMPL_H_
-#define LIBANGLE_RENDERER_FRAMEBUFFER_ATTACHMENT_OBJECT_IMPL_H_
-
-#include "libANGLE/FramebufferAttachment.h"
-
-namespace rx
-{
-
-class FramebufferAttachmentObjectImpl : angle::NonCopyable
-{
- public:
- FramebufferAttachmentObjectImpl() {}
- virtual ~FramebufferAttachmentObjectImpl() {}
-
- virtual gl::Error getAttachmentRenderTarget(const gl::Context *context,
- GLenum binding,
- const gl::ImageIndex &imageIndex,
- FramebufferAttachmentRenderTarget **rtOut);
-
- virtual gl::Error initializeContents(const gl::Context *context,
- const gl::ImageIndex &imageIndex);
-};
-
-inline gl::Error FramebufferAttachmentObjectImpl::getAttachmentRenderTarget(
- const gl::Context *context,
- GLenum binding,
- const gl::ImageIndex &imageIndex,
- FramebufferAttachmentRenderTarget **rtOut)
-{
- UNIMPLEMENTED();
- return gl::OutOfMemory() << "getAttachmentRenderTarget not supported.";
-}
-
-inline gl::Error FramebufferAttachmentObjectImpl::initializeContents(
- const gl::Context *context,
- const gl::ImageIndex &imageIndex)
-{
- UNIMPLEMENTED();
- return gl::OutOfMemory() << "initialize not supported.";
-}
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_FRAMEBUFFER_ATTACHMENT_OBJECT_IMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/FramebufferImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/FramebufferImpl.h
deleted file mode 100644
index ebb166ca80..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/FramebufferImpl.h
+++ /dev/null
@@ -1,95 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// FramebufferImpl.h: Defines the abstract rx::FramebufferImpl class.
-
-#ifndef LIBANGLE_RENDERER_FRAMEBUFFERIMPL_H_
-#define LIBANGLE_RENDERER_FRAMEBUFFERIMPL_H_
-
-#include "angle_gl.h"
-#include "common/angleutils.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/Framebuffer.h"
-
-namespace gl
-{
-class State;
-class Framebuffer;
-class FramebufferAttachment;
-struct Rectangle;
-}
-
-namespace rx
-{
-class DisplayImpl;
-
-class FramebufferImpl : angle::NonCopyable
-{
- public:
- explicit FramebufferImpl(const gl::FramebufferState &state) : mState(state) {}
- virtual ~FramebufferImpl() {}
- virtual void destroy(const gl::Context *context) {}
- virtual void destroyDefault(const egl::Display *display) {}
-
- virtual gl::Error discard(const gl::Context *context,
- size_t count,
- const GLenum *attachments) = 0;
- virtual gl::Error invalidate(const gl::Context *context,
- size_t count,
- const GLenum *attachments) = 0;
- virtual gl::Error invalidateSub(const gl::Context *context,
- size_t count,
- const GLenum *attachments,
- const gl::Rectangle &area) = 0;
-
- virtual gl::Error clear(const gl::Context *context, GLbitfield mask) = 0;
- virtual gl::Error clearBufferfv(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLfloat *values) = 0;
- virtual gl::Error clearBufferuiv(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLuint *values) = 0;
- virtual gl::Error clearBufferiv(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLint *values) = 0;
- virtual gl::Error clearBufferfi(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- GLfloat depth,
- GLint stencil) = 0;
-
- virtual GLenum getImplementationColorReadFormat(const gl::Context *context) const = 0;
- virtual GLenum getImplementationColorReadType(const gl::Context *context) const = 0;
- virtual gl::Error readPixels(const gl::Context *context,
- const gl::Rectangle &area,
- GLenum format,
- GLenum type,
- void *pixels) = 0;
-
- virtual gl::Error blit(const gl::Context *context,
- const gl::Rectangle &sourceArea,
- const gl::Rectangle &destArea,
- GLbitfield mask,
- GLenum filter) = 0;
-
- virtual bool checkStatus(const gl::Context *context) const = 0;
-
- virtual void syncState(const gl::Context *context,
- const gl::Framebuffer::DirtyBits &dirtyBits) = 0;
-
- virtual gl::Error getSamplePosition(size_t index, GLfloat *xy) const = 0;
-
- const gl::FramebufferState &getState() const { return mState; }
-
- protected:
- const gl::FramebufferState &mState;
-};
-}
-
-#endif // LIBANGLE_RENDERER_FRAMEBUFFERIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/FramebufferImpl_mock.h b/src/3rdparty/angle/src/libANGLE/renderer/FramebufferImpl_mock.h
deleted file mode 100644
index c2d069676e..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/FramebufferImpl_mock.h
+++ /dev/null
@@ -1,73 +0,0 @@
-//
-// Copyright 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// FramebufferImpl_mock.h:
-// Defines a mock of the FramebufferImpl class.
-//
-
-#ifndef LIBANGLE_RENDERER_FRAMEBUFFERIMPLMOCK_H_
-#define LIBANGLE_RENDERER_FRAMEBUFFERIMPLMOCK_H_
-
-#include "gmock/gmock.h"
-
-#include "libANGLE/renderer/FramebufferImpl.h"
-
-namespace rx
-{
-
-class MockFramebufferImpl : public rx::FramebufferImpl
-{
- public:
- MockFramebufferImpl() : rx::FramebufferImpl(gl::FramebufferState()) {}
- virtual ~MockFramebufferImpl() { destructor(); }
-
- MOCK_METHOD3(discard, gl::Error(const gl::Context *, size_t, const GLenum *));
- MOCK_METHOD3(invalidate, gl::Error(const gl::Context *, size_t, const GLenum *));
- MOCK_METHOD4(invalidateSub,
- gl::Error(const gl::Context *, size_t, const GLenum *, const gl::Rectangle &));
-
- MOCK_METHOD2(clear, gl::Error(const gl::Context *, GLbitfield));
- MOCK_METHOD4(clearBufferfv, gl::Error(const gl::Context *, GLenum, GLint, const GLfloat *));
- MOCK_METHOD4(clearBufferuiv, gl::Error(const gl::Context *, GLenum, GLint, const GLuint *));
- MOCK_METHOD4(clearBufferiv, gl::Error(const gl::Context *, GLenum, GLint, const GLint *));
- MOCK_METHOD5(clearBufferfi, gl::Error(const gl::Context *, GLenum, GLint, GLfloat, GLint));
-
- MOCK_CONST_METHOD1(getImplementationColorReadFormat, GLenum(const gl::Context *));
- MOCK_CONST_METHOD1(getImplementationColorReadType, GLenum(const gl::Context *));
- MOCK_METHOD5(readPixels,
- gl::Error(const gl::Context *, const gl::Rectangle &, GLenum, GLenum, void *));
-
- MOCK_CONST_METHOD2(getSamplePosition, gl::Error(size_t, GLfloat *));
-
- MOCK_METHOD5(blit,
- gl::Error(const gl::Context *,
- const gl::Rectangle &,
- const gl::Rectangle &,
- GLbitfield,
- GLenum));
-
- MOCK_CONST_METHOD1(checkStatus, bool(const gl::Context *));
-
- MOCK_METHOD2(syncState, void(const gl::Context *, const gl::Framebuffer::DirtyBits &));
-
- MOCK_METHOD0(destructor, void());
-};
-
-inline ::testing::NiceMock<MockFramebufferImpl> *MakeFramebufferMock()
-{
- ::testing::NiceMock<MockFramebufferImpl> *framebufferImpl =
- new ::testing::NiceMock<MockFramebufferImpl>();
- // TODO(jmadill): add ON_CALLS for other returning methods
- ON_CALL(*framebufferImpl, checkStatus(testing::_)).WillByDefault(::testing::Return(true));
-
- // We must mock the destructor since NiceMock doesn't work for destructors.
- EXPECT_CALL(*framebufferImpl, destructor()).Times(1).RetiresOnSaturation();
-
- return framebufferImpl;
-}
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_FRAMEBUFFERIMPLMOCK_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/GLImplFactory.h b/src/3rdparty/angle/src/libANGLE/renderer/GLImplFactory.h
deleted file mode 100644
index b9a135f596..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/GLImplFactory.h
+++ /dev/null
@@ -1,93 +0,0 @@
-//
-// Copyright 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// GLImplFactory.h:
-// Factory interface for OpenGL ES Impl objects.
-//
-
-#ifndef LIBANGLE_RENDERER_GLIMPLFACTORY_H_
-#define LIBANGLE_RENDERER_GLIMPLFACTORY_H_
-
-#include <vector>
-
-#include "angle_gl.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/ProgramPipeline.h"
-#include "libANGLE/Shader.h"
-#include "libANGLE/TransformFeedback.h"
-#include "libANGLE/VertexArray.h"
-
-namespace gl
-{
-class ContextState;
-}
-
-namespace rx
-{
-class BufferImpl;
-class CompilerImpl;
-class ContextImpl;
-class FenceNVImpl;
-class SyncImpl;
-class FramebufferImpl;
-class PathImpl;
-class ProgramImpl;
-class ProgramPipelineImpl;
-class QueryImpl;
-class RenderbufferImpl;
-class SamplerImpl;
-class ShaderImpl;
-class TextureImpl;
-class TransformFeedbackImpl;
-class VertexArrayImpl;
-
-class GLImplFactory : angle::NonCopyable
-{
- public:
- GLImplFactory() {}
- virtual ~GLImplFactory() {}
-
- // Shader creation
- virtual CompilerImpl *createCompiler() = 0;
- virtual ShaderImpl *createShader(const gl::ShaderState &data) = 0;
- virtual ProgramImpl *createProgram(const gl::ProgramState &data) = 0;
-
- // Framebuffer creation
- virtual FramebufferImpl *createFramebuffer(const gl::FramebufferState &data) = 0;
-
- // Texture creation
- virtual TextureImpl *createTexture(const gl::TextureState &state) = 0;
-
- // Renderbuffer creation
- virtual RenderbufferImpl *createRenderbuffer() = 0;
-
- // Buffer creation
- virtual BufferImpl *createBuffer(const gl::BufferState &state) = 0;
-
- // Vertex Array creation
- virtual VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) = 0;
-
- // Query and Fence creation
- virtual QueryImpl *createQuery(GLenum type) = 0;
- virtual FenceNVImpl *createFenceNV() = 0;
- virtual SyncImpl *createSync() = 0;
-
- // Transform Feedback creation
- virtual TransformFeedbackImpl *createTransformFeedback(
- const gl::TransformFeedbackState &state) = 0;
-
- // Sampler object creation
- virtual SamplerImpl *createSampler(const gl::SamplerState &state) = 0;
-
- // Program Pipeline object creation
- virtual ProgramPipelineImpl *createProgramPipeline(const gl::ProgramPipelineState &data) = 0;
-
- virtual std::vector<PathImpl *> createPaths(GLsizei range) = 0;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_GLIMPLFACTORY_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/ImageImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/ImageImpl.h
deleted file mode 100644
index 79694eaebf..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/ImageImpl.h
+++ /dev/null
@@ -1,42 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ImageImpl.h: Defines the rx::ImageImpl class representing the EGLimage object.
-
-#ifndef LIBANGLE_RENDERER_IMAGEIMPL_H_
-#define LIBANGLE_RENDERER_IMAGEIMPL_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/Error.h"
-
-namespace gl
-{
-class Context;
-} // namespace gl
-
-namespace egl
-{
-class ImageSibling;
-struct ImageState;
-} // namespace egl
-
-namespace rx
-{
-class ImageImpl : angle::NonCopyable
-{
- public:
- ImageImpl(const egl::ImageState &state) : mState(state) {}
- virtual ~ImageImpl() {}
- virtual egl::Error initialize() = 0;
-
- virtual gl::Error orphan(const gl::Context *context, egl::ImageSibling *sibling) = 0;
-
- protected:
- const egl::ImageState &mState;
-};
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_IMAGEIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/ImageImpl_mock.h b/src/3rdparty/angle/src/libANGLE/renderer/ImageImpl_mock.h
deleted file mode 100644
index 30c0cc2594..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/ImageImpl_mock.h
+++ /dev/null
@@ -1,34 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ImageImpl_mock.h: Defines a mock of the ImageImpl class.
-
-#ifndef LIBANGLE_RENDERER_IMAGEIMPLMOCK_H_
-#define LIBANGLE_RENDERER_IMAGEIMPLMOCK_H_
-
-#include "gmock/gmock.h"
-
-#include "libANGLE/renderer/ImageImpl.h"
-
-namespace rx
-{
-class MockImageImpl : public ImageImpl
-{
- public:
- MockImageImpl(const egl::ImageState &state,
- EGLenum /*target*/,
- const egl::AttributeMap & /*attribs*/)
- : ImageImpl(state)
- {
- }
- virtual ~MockImageImpl() { destructor(); }
- MOCK_METHOD0(initialize, egl::Error(void));
- MOCK_METHOD2(orphan, gl::Error(const gl::Context *, egl::ImageSibling *));
- MOCK_METHOD0(destructor, void());
-};
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_IMAGEIMPLMOCK_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/PathImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/PathImpl.h
deleted file mode 100644
index 3607f69a2b..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/PathImpl.h
+++ /dev/null
@@ -1,36 +0,0 @@
-//
-// Copyright (c) 2002-2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// PathImpl.h: Defines the Path implementation interface for
-// CHROMIUM_path_rendering path objects.
-
-#ifndef LIBANGLE_RENDERER_PATHIMPL_H_
-#define LIBANGLE_RENDERER_PATHIMPL_H_
-
-#include "angle_gl.h"
-#include "common/angleutils.h"
-#include "libANGLE/Error.h"
-
-namespace rx
-{
-
-class PathImpl : angle::NonCopyable
-{
- public:
- virtual ~PathImpl() {}
-
- virtual gl::Error setCommands(GLsizei numCommands,
- const GLubyte *commands,
- GLsizei numCoords,
- GLenum coordType,
- const void *coords) = 0;
-
- virtual void setPathParameter(GLenum pname, GLfloat value) = 0;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_PATHIMPL_H_ \ No newline at end of file
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/ProgramImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/ProgramImpl.h
deleted file mode 100644
index 2371b2759c..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/ProgramImpl.h
+++ /dev/null
@@ -1,107 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ProgramImpl.h: Defines the abstract rx::ProgramImpl class.
-
-#ifndef LIBANGLE_RENDERER_PROGRAMIMPL_H_
-#define LIBANGLE_RENDERER_PROGRAMIMPL_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/BinaryStream.h"
-#include "libANGLE/Constants.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/Shader.h"
-
-#include <map>
-
-namespace gl
-{
-class Context;
-struct ProgramLinkedResources;
-}
-
-namespace sh
-{
-struct BlockMemberInfo;
-}
-
-namespace rx
-{
-class ProgramImpl : angle::NonCopyable
-{
- public:
- ProgramImpl(const gl::ProgramState &state) : mState(state) {}
- virtual ~ProgramImpl() {}
- virtual void destroy(const gl::Context *context) {}
-
- virtual gl::LinkResult load(const gl::Context *context,
- gl::InfoLog &infoLog,
- gl::BinaryInputStream *stream) = 0;
- virtual void save(const gl::Context *context, gl::BinaryOutputStream *stream) = 0;
- virtual void setBinaryRetrievableHint(bool retrievable) = 0;
- virtual void setSeparable(bool separable) = 0;
-
- virtual gl::LinkResult link(const gl::Context *context,
- const gl::ProgramLinkedResources &resources,
- gl::InfoLog &infoLog) = 0;
- virtual GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) = 0;
-
- virtual void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) = 0;
- virtual void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) = 0;
- virtual void setUniform3fv(GLint location, GLsizei count, const GLfloat *v) = 0;
- virtual void setUniform4fv(GLint location, GLsizei count, const GLfloat *v) = 0;
- virtual void setUniform1iv(GLint location, GLsizei count, const GLint *v) = 0;
- virtual void setUniform2iv(GLint location, GLsizei count, const GLint *v) = 0;
- virtual void setUniform3iv(GLint location, GLsizei count, const GLint *v) = 0;
- virtual void setUniform4iv(GLint location, GLsizei count, const GLint *v) = 0;
- virtual void setUniform1uiv(GLint location, GLsizei count, const GLuint *v) = 0;
- virtual void setUniform2uiv(GLint location, GLsizei count, const GLuint *v) = 0;
- virtual void setUniform3uiv(GLint location, GLsizei count, const GLuint *v) = 0;
- virtual void setUniform4uiv(GLint location, GLsizei count, const GLuint *v) = 0;
- virtual void setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = 0;
- virtual void setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = 0;
- virtual void setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = 0;
- virtual void setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = 0;
- virtual void setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = 0;
- virtual void setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = 0;
- virtual void setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = 0;
- virtual void setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = 0;
- virtual void setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = 0;
-
- // Done in the back-end to avoid having to keep a system copy of uniform data.
- virtual void getUniformfv(const gl::Context *context,
- GLint location,
- GLfloat *params) const = 0;
- virtual void getUniformiv(const gl::Context *context, GLint location, GLint *params) const = 0;
- virtual void getUniformuiv(const gl::Context *context,
- GLint location,
- GLuint *params) const = 0;
-
- // TODO: synchronize in syncState when dirty bits exist.
- virtual void setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding) = 0;
-
- // CHROMIUM_path_rendering
- // Set parameters to control fragment shader input variable interpolation
- virtual void setPathFragmentInputGen(const std::string &inputName,
- GLenum genMode,
- GLint components,
- const GLfloat *coeffs) = 0;
-
- // Implementation-specific method for ignoring unreferenced uniforms. Some implementations may
- // perform more extensive analysis and ignore some locations that ANGLE doesn't detect as
- // unreferenced. This method is not required to be overriden by a back-end.
- virtual void markUnusedUniformLocations(std::vector<gl::VariableLocation> *uniformLocations,
- std::vector<gl::SamplerBinding> *samplerBindings)
- {
- }
-
- protected:
- const gl::ProgramState &mState;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_PROGRAMIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/ProgramImpl_mock.h b/src/3rdparty/angle/src/libANGLE/renderer/ProgramImpl_mock.h
deleted file mode 100644
index 4717ab8843..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/ProgramImpl_mock.h
+++ /dev/null
@@ -1,84 +0,0 @@
-//
-// Copyright 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// ProgramImpl_mock.h:
-// Defines a mock of the ProgramImpl class.
-//
-
-#ifndef LIBANGLE_RENDERER_PROGRAMIMPLMOCK_H_
-#define LIBANGLE_RENDERER_PROGRAMIMPLMOCK_H_
-
-#include "gmock/gmock.h"
-
-#include "libANGLE/ProgramLinkedResources.h"
-#include "libANGLE/renderer/ProgramImpl.h"
-
-namespace rx
-{
-
-class MockProgramImpl : public rx::ProgramImpl
-{
- public:
- MockProgramImpl() : ProgramImpl(gl::ProgramState()) {}
- virtual ~MockProgramImpl() { destructor(); }
-
- MOCK_METHOD3(load, gl::LinkResult(const gl::Context *, gl::InfoLog &, gl::BinaryInputStream *));
- MOCK_METHOD2(save, void(const gl::Context *, gl::BinaryOutputStream *));
- MOCK_METHOD1(setBinaryRetrievableHint, void(bool));
- MOCK_METHOD1(setSeparable, void(bool));
-
- MOCK_METHOD3(link,
- gl::LinkResult(const gl::Context *,
- const gl::ProgramLinkedResources &,
- gl::InfoLog &));
- MOCK_METHOD2(validate, GLboolean(const gl::Caps &, gl::InfoLog *));
-
- MOCK_METHOD3(setUniform1fv, void(GLint, GLsizei, const GLfloat *));
- MOCK_METHOD3(setUniform2fv, void(GLint, GLsizei, const GLfloat *));
- MOCK_METHOD3(setUniform3fv, void(GLint, GLsizei, const GLfloat *));
- MOCK_METHOD3(setUniform4fv, void(GLint, GLsizei, const GLfloat *));
- MOCK_METHOD3(setUniform1iv, void(GLint, GLsizei, const GLint *));
- MOCK_METHOD3(setUniform2iv, void(GLint, GLsizei, const GLint *));
- MOCK_METHOD3(setUniform3iv, void(GLint, GLsizei, const GLint *));
- MOCK_METHOD3(setUniform4iv, void(GLint, GLsizei, const GLint *));
- MOCK_METHOD3(setUniform1uiv, void(GLint, GLsizei, const GLuint *));
- MOCK_METHOD3(setUniform2uiv, void(GLint, GLsizei, const GLuint *));
- MOCK_METHOD3(setUniform3uiv, void(GLint, GLsizei, const GLuint *));
- MOCK_METHOD3(setUniform4uiv, void(GLint, GLsizei, const GLuint *));
-
- MOCK_METHOD4(setUniformMatrix2fv, void(GLint, GLsizei, GLboolean, const GLfloat *));
- MOCK_METHOD4(setUniformMatrix3fv, void(GLint, GLsizei, GLboolean, const GLfloat *));
- MOCK_METHOD4(setUniformMatrix4fv, void(GLint, GLsizei, GLboolean, const GLfloat *));
- MOCK_METHOD4(setUniformMatrix2x3fv, void(GLint, GLsizei, GLboolean, const GLfloat *));
- MOCK_METHOD4(setUniformMatrix3x2fv, void(GLint, GLsizei, GLboolean, const GLfloat *));
- MOCK_METHOD4(setUniformMatrix2x4fv, void(GLint, GLsizei, GLboolean, const GLfloat *));
- MOCK_METHOD4(setUniformMatrix4x2fv, void(GLint, GLsizei, GLboolean, const GLfloat *));
- MOCK_METHOD4(setUniformMatrix3x4fv, void(GLint, GLsizei, GLboolean, const GLfloat *));
- MOCK_METHOD4(setUniformMatrix4x3fv, void(GLint, GLsizei, GLboolean, const GLfloat *));
-
- MOCK_CONST_METHOD3(getUniformfv, void(const gl::Context *, GLint, GLfloat *));
- MOCK_CONST_METHOD3(getUniformiv, void(const gl::Context *, GLint, GLint *));
- MOCK_CONST_METHOD3(getUniformuiv, void(const gl::Context *, GLint, GLuint *));
-
- MOCK_METHOD2(setUniformBlockBinding, void(GLuint, GLuint));
- MOCK_METHOD4(setPathFragmentInputGen,
- void(const std::string &, GLenum, GLint, const GLfloat *));
-
- MOCK_METHOD0(destructor, void());
-};
-
-inline ::testing::NiceMock<MockProgramImpl> *MakeProgramMock()
-{
- ::testing::NiceMock<MockProgramImpl> *programImpl = new ::testing::NiceMock<MockProgramImpl>();
- // TODO(jmadill): add ON_CALLS for returning methods
- // We must mock the destructor since NiceMock doesn't work for destructors.
- EXPECT_CALL(*programImpl, destructor()).Times(1).RetiresOnSaturation();
-
- return programImpl;
-}
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_PROGRAMIMPLMOCK_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/ProgramPipelineImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/ProgramPipelineImpl.h
deleted file mode 100644
index 242e9260f1..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/ProgramPipelineImpl.h
+++ /dev/null
@@ -1,32 +0,0 @@
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ProgramPipelineImpl.h: Defines the abstract rx::ProgramPipelineImpl class.
-
-#ifndef LIBANGLE_RENDERER_PROGRAMPIPELINEIMPL_H_
-#define LIBANGLE_RENDERER_PROGRAMPIPELINEIMPL_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/ProgramPipeline.h"
-
-namespace rx
-{
-class ContextImpl;
-
-class ProgramPipelineImpl : public angle::NonCopyable
-{
- public:
- ProgramPipelineImpl(const gl::ProgramPipelineState &state) : mState(state) {}
- virtual ~ProgramPipelineImpl() {}
- virtual void destroy(const ContextImpl *contextImpl) {}
-
- protected:
- const gl::ProgramPipelineState &mState;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_PROGRAMPIPELINEIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/QueryImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/QueryImpl.h
deleted file mode 100644
index d738eb4ffc..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/QueryImpl.h
+++ /dev/null
@@ -1,44 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// QueryImpl.h: Defines the abstract rx::QueryImpl class.
-
-#ifndef LIBANGLE_RENDERER_QUERYIMPL_H_
-#define LIBANGLE_RENDERER_QUERYIMPL_H_
-
-#include "libANGLE/Error.h"
-
-#include "common/angleutils.h"
-
-#include <GLES2/gl2.h>
-
-namespace rx
-{
-
-class QueryImpl : angle::NonCopyable
-{
- public:
- explicit QueryImpl(GLenum type) { mType = type; }
- virtual ~QueryImpl() { }
-
- virtual gl::Error begin() = 0;
- virtual gl::Error end() = 0;
- virtual gl::Error queryCounter() = 0;
- virtual gl::Error getResult(GLint *params) = 0;
- virtual gl::Error getResult(GLuint *params) = 0;
- virtual gl::Error getResult(GLint64 *params) = 0;
- virtual gl::Error getResult(GLuint64 *params) = 0;
- virtual gl::Error isResultAvailable(bool *available) = 0;
-
- GLenum getType() const { return mType; }
-
- private:
- GLenum mType;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_QUERYIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/RenderbufferImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/RenderbufferImpl.h
deleted file mode 100644
index a70ab1d0f0..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/RenderbufferImpl.h
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// RenderbufferImpl.h: Defines the abstract class gl::RenderbufferImpl
-
-#ifndef LIBANGLE_RENDERER_RENDERBUFFERIMPL_H_
-#define LIBANGLE_RENDERER_RENDERBUFFERIMPL_H_
-
-#include "angle_gl.h"
-#include "common/angleutils.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/renderer/FramebufferAttachmentObjectImpl.h"
-
-namespace egl
-{
-class Image;
-}
-
-namespace rx
-{
-
-class RenderbufferImpl : public FramebufferAttachmentObjectImpl
-{
- public:
- RenderbufferImpl() {}
- ~RenderbufferImpl() override {}
- virtual gl::Error onDestroy(const gl::Context *context);
-
- virtual gl::Error setStorage(const gl::Context *context,
- GLenum internalformat,
- size_t width,
- size_t height) = 0;
- virtual gl::Error setStorageMultisample(const gl::Context *context,
- size_t samples,
- GLenum internalformat,
- size_t width,
- size_t height) = 0;
- virtual gl::Error setStorageEGLImageTarget(const gl::Context *context, egl::Image *image) = 0;
-};
-
-inline gl::Error RenderbufferImpl::onDestroy(const gl::Context *context)
-{
- return gl::NoError();
-}
-}
-
-#endif // LIBANGLE_RENDERER_RENDERBUFFERIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/RenderbufferImpl_mock.h b/src/3rdparty/angle/src/libANGLE/renderer/RenderbufferImpl_mock.h
deleted file mode 100644
index 408b9a5fe9..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/RenderbufferImpl_mock.h
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// RenderbufferImpl_mock.h: Defines a mock of the RenderbufferImpl class.
-
-#ifndef LIBANGLE_RENDERER_RENDERBUFFERIMPLMOCK_H_
-#define LIBANGLE_RENDERER_RENDERBUFFERIMPLMOCK_H_
-
-#include "gmock/gmock.h"
-
-#include "libANGLE/Image.h"
-#include "libANGLE/renderer/RenderbufferImpl.h"
-
-namespace rx
-{
-
-class MockRenderbufferImpl : public RenderbufferImpl
-{
- public:
- virtual ~MockRenderbufferImpl() { destructor(); }
- MOCK_METHOD4(setStorage, gl::Error(const gl::Context *, GLenum, size_t, size_t));
- MOCK_METHOD5(setStorageMultisample,
- gl::Error(const gl::Context *, size_t, GLenum, size_t, size_t));
- MOCK_METHOD2(setStorageEGLImageTarget, gl::Error(const gl::Context *, egl::Image *));
-
- MOCK_METHOD4(getAttachmentRenderTarget,
- gl::Error(const gl::Context *,
- GLenum,
- const gl::ImageIndex &,
- FramebufferAttachmentRenderTarget **));
-
- MOCK_METHOD0(destructor, void());
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_RENDERBUFFERIMPLMOCK_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/SamplerImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/SamplerImpl.h
deleted file mode 100644
index 66e1079b64..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/SamplerImpl.h
+++ /dev/null
@@ -1,39 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// SamplerImpl.h: Defines the abstract rx::SamplerImpl class.
-
-#ifndef LIBANGLE_RENDERER_SAMPLERIMPL_H_
-#define LIBANGLE_RENDERER_SAMPLERIMPL_H_
-
-#include "common/angleutils.h"
-
-namespace gl
-{
-class Context;
-struct SamplerState;
-} // namespace gl
-
-namespace rx
-{
-
-class SamplerImpl : angle::NonCopyable
-{
- public:
- SamplerImpl(const gl::SamplerState &state) : mState(state) {}
- virtual ~SamplerImpl() {}
-
- virtual void syncState(const gl::Context *context)
- {
- // Default implementation: no-op.
- }
-
- protected:
- const gl::SamplerState &mState;
-};
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_SAMPLERIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/ShaderImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/ShaderImpl.h
deleted file mode 100644
index 77e02d0237..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/ShaderImpl.h
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ShaderImpl.h: Defines the abstract rx::ShaderImpl class.
-
-#ifndef LIBANGLE_RENDERER_SHADERIMPL_H_
-#define LIBANGLE_RENDERER_SHADERIMPL_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/Shader.h"
-
-namespace rx
-{
-
-class ShaderImpl : angle::NonCopyable
-{
- public:
- ShaderImpl(const gl::ShaderState &data) : mData(data) {}
- virtual ~ShaderImpl() { }
-
- // Returns additional sh::Compile options.
- virtual ShCompileOptions prepareSourceAndReturnOptions(std::stringstream *sourceStream,
- std::string *sourcePath) = 0;
- // Returns success for compiling on the driver. Returns success.
- virtual bool postTranslateCompile(gl::Compiler *compiler, std::string *infoLog) = 0;
-
- virtual std::string getDebugInfo() const = 0;
-
- const gl::ShaderState &getData() const { return mData; }
-
- protected:
- const gl::ShaderState &mData;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_SHADERIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/StreamProducerImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/StreamProducerImpl.h
deleted file mode 100644
index 1915bf75d3..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/StreamProducerImpl.h
+++ /dev/null
@@ -1,39 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// StreamProducerImpl.h: Defines the abstract rx::StreamProducerImpl class.
-
-#ifndef LIBANGLE_RENDERER_STREAMPRODUCERIMPL_H_
-#define LIBANGLE_RENDERER_STREAMPRODUCERIMPL_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/Stream.h"
-
-namespace rx
-{
-
-class StreamProducerImpl : angle::NonCopyable
-{
- public:
- explicit StreamProducerImpl() {}
- virtual ~StreamProducerImpl() {}
-
- // Validates the ability for the producer to accept an arbitrary pointer to a frame. All
- // pointers should be validated through this function before being used to produce a frame.
- virtual egl::Error validateD3DNV12Texture(void *pointer) const = 0;
-
- // Constructs a frame from an arbitrary external pointer that points to producer specific frame
- // data. Replaces the internal frame with the new one.
- virtual void postD3DNV12Texture(void *pointer, const egl::AttributeMap &attributes) = 0;
-
- // Returns an OpenGL texture interpretation of some frame attributes for the purpose of
- // constructing an OpenGL texture from a frame. Depending on the producer and consumer, some
- // frames may have multiple "planes" with different OpenGL texture representations.
- virtual egl::Stream::GLTextureDescription getGLFrameDescription(int planeIndex) = 0;
-};
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_STREAMPRODUCERIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/SurfaceImpl.cpp b/src/3rdparty/angle/src/libANGLE/renderer/SurfaceImpl.cpp
deleted file mode 100644
index cd2fa3dde6..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/SurfaceImpl.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// SurfaceImpl.cpp: Implementation of Surface stub method class
-
-#include "libANGLE/renderer/SurfaceImpl.h"
-
-namespace rx
-{
-
-SurfaceImpl::SurfaceImpl(const egl::SurfaceState &state) : mState(state)
-{
-}
-
-SurfaceImpl::~SurfaceImpl()
-{
-}
-
-egl::Error SurfaceImpl::swapWithDamage(const gl::Context *context, EGLint *rects, EGLint n_rects)
-{
- UNREACHABLE();
- return egl::EglBadSurface() << "swapWithDamage implementation missing.";
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/SurfaceImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/SurfaceImpl.h
deleted file mode 100644
index eaa27de281..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/SurfaceImpl.h
+++ /dev/null
@@ -1,73 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// SurfaceImpl.h: Implementation methods of egl::Surface
-
-#ifndef LIBANGLE_RENDERER_SURFACEIMPL_H_
-#define LIBANGLE_RENDERER_SURFACEIMPL_H_
-
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-
-#include "common/angleutils.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/renderer/FramebufferAttachmentObjectImpl.h"
-
-namespace gl
-{
-class FramebufferState;
-}
-
-namespace egl
-{
-class Display;
-struct Config;
-struct SurfaceState;
-class Thread;
-}
-
-namespace rx
-{
-class FramebufferImpl;
-
-class SurfaceImpl : public FramebufferAttachmentObjectImpl
-{
- public:
- SurfaceImpl(const egl::SurfaceState &surfaceState);
- ~SurfaceImpl() override;
- virtual void destroy(const egl::Display *display) {}
-
- virtual egl::Error initialize(const egl::Display *display) = 0;
- virtual FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) = 0;
- virtual egl::Error swap(const gl::Context *context) = 0;
- virtual egl::Error swapWithDamage(const gl::Context *context, EGLint *rects, EGLint n_rects);
- virtual egl::Error postSubBuffer(const gl::Context *context,
- EGLint x,
- EGLint y,
- EGLint width,
- EGLint height) = 0;
- virtual egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) = 0;
- virtual egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) = 0;
- virtual egl::Error releaseTexImage(EGLint buffer) = 0;
- virtual egl::Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc) = 0;
- virtual void setSwapInterval(EGLint interval) = 0;
-
- // width and height can change with client window resizing
- virtual EGLint getWidth() const = 0;
- virtual EGLint getHeight() const = 0;
-
- virtual EGLint isPostSubBufferSupported() const = 0;
- virtual EGLint getSwapBehavior() const = 0;
-
- protected:
- const egl::SurfaceState &mState;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_SURFACEIMPL_H_
-
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/SyncImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/SyncImpl.h
deleted file mode 100644
index 22c92c3729..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/SyncImpl.h
+++ /dev/null
@@ -1,34 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// SyncImpl.h: Defines the rx::SyncImpl class.
-
-#ifndef LIBANGLE_RENDERER_FENCESYNCIMPL_H_
-#define LIBANGLE_RENDERER_FENCESYNCIMPL_H_
-
-#include "libANGLE/Error.h"
-
-#include "common/angleutils.h"
-
-#include "angle_gl.h"
-
-namespace rx
-{
-
-class SyncImpl : angle::NonCopyable
-{
- public:
- SyncImpl(){};
- virtual ~SyncImpl(){};
-
- virtual gl::Error set(GLenum condition, GLbitfield flags) = 0;
- virtual gl::Error clientWait(GLbitfield flags, GLuint64 timeout, GLenum *outResult) = 0;
- virtual gl::Error serverWait(GLbitfield flags, GLuint64 timeout) = 0;
- virtual gl::Error getStatus(GLint *outResult) = 0;
-};
-}
-
-#endif // LIBANGLE_RENDERER_FENCESYNCIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/TextureImpl.cpp b/src/3rdparty/angle/src/libANGLE/renderer/TextureImpl.cpp
deleted file mode 100644
index 830d30e6d1..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/TextureImpl.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// TextureImpl.cpp: Defines the abstract rx::TextureImpl classes.
-
-#include "libANGLE/renderer/TextureImpl.h"
-
-namespace rx
-{
-
-TextureImpl::TextureImpl(const gl::TextureState &state) : mState(state)
-{
-}
-
-TextureImpl::~TextureImpl()
-{
-}
-
-gl::Error TextureImpl::onDestroy(const gl::Context *context)
-{
- return gl::NoError();
-}
-
-gl::Error TextureImpl::copyTexture(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- GLenum type,
- size_t sourceLevel,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- const gl::Texture *source)
-{
- UNREACHABLE();
- return gl::InternalError() << "CHROMIUM_copy_texture exposed but not implemented.";
-}
-
-gl::Error TextureImpl::copySubTexture(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Offset &destOffset,
- size_t sourceLevel,
- const gl::Rectangle &sourceArea,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- const gl::Texture *source)
-{
- UNREACHABLE();
- return gl::InternalError() << "CHROMIUM_copy_texture exposed but not implemented.";
-}
-
-gl::Error TextureImpl::copyCompressedTexture(const gl::Context *context, const gl::Texture *source)
-{
- UNREACHABLE();
- return gl::InternalError() << "CHROMIUM_copy_compressed_texture exposed but not implemented.";
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/TextureImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/TextureImpl.h
deleted file mode 100644
index 3b4f28f5f7..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/TextureImpl.h
+++ /dev/null
@@ -1,159 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// TextureImpl.h: Defines the abstract rx::TextureImpl classes.
-
-#ifndef LIBANGLE_RENDERER_TEXTUREIMPL_H_
-#define LIBANGLE_RENDERER_TEXTUREIMPL_H_
-
-#include <stdint.h>
-
-#include "angle_gl.h"
-#include "common/angleutils.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/ImageIndex.h"
-#include "libANGLE/Stream.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/renderer/FramebufferAttachmentObjectImpl.h"
-
-namespace egl
-{
-class Surface;
-class Image;
-}
-
-namespace gl
-{
-struct Box;
-struct Extents;
-struct Offset;
-struct Rectangle;
-class Framebuffer;
-struct PixelUnpackState;
-struct TextureState;
-}
-
-namespace rx
-{
-class ContextImpl;
-
-class TextureImpl : public FramebufferAttachmentObjectImpl
-{
- public:
- TextureImpl(const gl::TextureState &state);
- ~TextureImpl() override;
-
- virtual gl::Error onDestroy(const gl::Context *context);
-
- virtual gl::Error setImage(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels) = 0;
- virtual gl::Error setSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels) = 0;
-
- virtual gl::Error setCompressedImage(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels) = 0;
- virtual gl::Error setCompressedSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels) = 0;
-
- virtual gl::Error copyImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Rectangle &sourceArea,
- GLenum internalFormat,
- const gl::Framebuffer *source) = 0;
- virtual gl::Error copySubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- const gl::Framebuffer *source) = 0;
-
- virtual gl::Error copyTexture(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- GLenum type,
- size_t sourceLevel,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- const gl::Texture *source);
- virtual gl::Error copySubTexture(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Offset &destOffset,
- size_t sourceLevel,
- const gl::Rectangle &sourceArea,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- const gl::Texture *source);
-
- virtual gl::Error copyCompressedTexture(const gl::Context *context, const gl::Texture *source);
-
- virtual gl::Error setStorage(const gl::Context *context,
- GLenum target,
- size_t levels,
- GLenum internalFormat,
- const gl::Extents &size) = 0;
-
- virtual gl::Error setStorageMultisample(const gl::Context *context,
- GLenum target,
- GLsizei samples,
- GLint internalformat,
- const gl::Extents &size,
- bool fixedSampleLocations) = 0;
-
- virtual gl::Error setEGLImageTarget(const gl::Context *context,
- GLenum target,
- egl::Image *image) = 0;
-
- virtual gl::Error setImageExternal(const gl::Context *context,
- GLenum target,
- egl::Stream *stream,
- const egl::Stream::GLTextureDescription &desc) = 0;
-
- virtual gl::Error generateMipmap(const gl::Context *context) = 0;
-
- virtual gl::Error setBaseLevel(const gl::Context *context, GLuint baseLevel) = 0;
-
- virtual gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) = 0;
- virtual gl::Error releaseTexImage(const gl::Context *context) = 0;
-
- virtual void syncState(const gl::Texture::DirtyBits &dirtyBits) = 0;
-
- protected:
- const gl::TextureState &mState;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_TEXTUREIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/TextureImpl_mock.h b/src/3rdparty/angle/src/libANGLE/renderer/TextureImpl_mock.h
deleted file mode 100644
index e7fa441781..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/TextureImpl_mock.h
+++ /dev/null
@@ -1,131 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// TextureImpl_mock.h: Defines a mock of the TextureImpl class.
-
-#ifndef LIBANGLE_RENDERER_TEXTUREIMPLMOCK_H_
-#define LIBANGLE_RENDERER_TEXTUREIMPLMOCK_H_
-
-#include "gmock/gmock.h"
-
-#include "libANGLE/renderer/TextureImpl.h"
-
-namespace rx
-{
-
-class MockTextureImpl : public TextureImpl
-{
- public:
- MockTextureImpl() : TextureImpl(mMockState), mMockState(GL_TEXTURE_2D) {}
- virtual ~MockTextureImpl() { destructor(); }
- MOCK_METHOD9(setImage,
- gl::Error(const gl::Context *,
- GLenum,
- size_t,
- GLenum,
- const gl::Extents &,
- GLenum,
- GLenum,
- const gl::PixelUnpackState &,
- const uint8_t *));
- MOCK_METHOD8(setSubImage,
- gl::Error(const gl::Context *,
- GLenum,
- size_t,
- const gl::Box &,
- GLenum,
- GLenum,
- const gl::PixelUnpackState &,
- const uint8_t *));
- MOCK_METHOD8(setCompressedImage,
- gl::Error(const gl::Context *,
- GLenum,
- size_t,
- GLenum,
- const gl::Extents &,
- const gl::PixelUnpackState &,
- size_t,
- const uint8_t *));
- MOCK_METHOD8(setCompressedSubImage,
- gl::Error(const gl::Context *,
- GLenum,
- size_t,
- const gl::Box &,
- GLenum,
- const gl::PixelUnpackState &,
- size_t,
- const uint8_t *));
- MOCK_METHOD6(copyImage,
- gl::Error(const gl::Context *,
- GLenum,
- size_t,
- const gl::Rectangle &,
- GLenum,
- const gl::Framebuffer *));
- MOCK_METHOD6(copySubImage,
- gl::Error(const gl::Context *,
- GLenum,
- size_t,
- const gl::Offset &,
- const gl::Rectangle &,
- const gl::Framebuffer *));
- MOCK_METHOD10(copyTexture,
- gl::Error(const gl::Context *,
- GLenum,
- size_t,
- GLenum,
- GLenum,
- size_t,
- bool,
- bool,
- bool,
- const gl::Texture *));
- MOCK_METHOD10(copySubTexture,
- gl::Error(const gl::Context *,
- GLenum,
- size_t,
- const gl::Offset &,
- size_t,
- const gl::Rectangle &,
- bool,
- bool,
- bool,
- const gl::Texture *));
- MOCK_METHOD2(copyCompressedTexture, gl::Error(const gl::Context *, const gl::Texture *source));
- MOCK_METHOD5(setStorage,
- gl::Error(const gl::Context *, GLenum, size_t, GLenum, const gl::Extents &));
- MOCK_METHOD4(setImageExternal,
- gl::Error(const gl::Context *,
- GLenum,
- egl::Stream *,
- const egl::Stream::GLTextureDescription &));
- MOCK_METHOD3(setEGLImageTarget, gl::Error(const gl::Context *, GLenum, egl::Image *));
- MOCK_METHOD1(generateMipmap, gl::Error(const gl::Context *));
- MOCK_METHOD2(bindTexImage, gl::Error(const gl::Context *, egl::Surface *));
- MOCK_METHOD1(releaseTexImage, gl::Error(const gl::Context *));
-
- MOCK_METHOD4(getAttachmentRenderTarget,
- gl::Error(const gl::Context *,
- GLenum,
- const gl::ImageIndex &,
- FramebufferAttachmentRenderTarget **));
-
- MOCK_METHOD6(setStorageMultisample,
- gl::Error(const gl::Context *, GLenum, GLsizei, GLint, const gl::Extents &, bool));
-
- MOCK_METHOD2(setBaseLevel, gl::Error(const gl::Context *, GLuint));
-
- MOCK_METHOD1(syncState, void(const gl::Texture::DirtyBits &));
-
- MOCK_METHOD0(destructor, void());
-
- protected:
- gl::TextureState mMockState;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_TEXTUREIMPLMOCK_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/TransformFeedbackImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/TransformFeedbackImpl.h
deleted file mode 100644
index ad371e9b36..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/TransformFeedbackImpl.h
+++ /dev/null
@@ -1,39 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// TransformFeedbackImpl.h: Defines the abstract rx::TransformFeedbackImpl class.
-
-#ifndef LIBANGLE_RENDERER_TRANSFORMFEEDBACKIMPL_H_
-#define LIBANGLE_RENDERER_TRANSFORMFEEDBACKIMPL_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/TransformFeedback.h"
-
-namespace rx
-{
-
-class TransformFeedbackImpl : angle::NonCopyable
-{
- public:
- TransformFeedbackImpl(const gl::TransformFeedbackState &state) : mState(state) {}
- virtual ~TransformFeedbackImpl() { }
-
- virtual void begin(GLenum primitiveMode) = 0;
- virtual void end() = 0;
- virtual void pause() = 0;
- virtual void resume() = 0;
-
- virtual void bindGenericBuffer(const gl::BindingPointer<gl::Buffer> &binding) = 0;
- virtual void bindIndexedBuffer(size_t index,
- const gl::OffsetBindingPointer<gl::Buffer> &binding) = 0;
-
- protected:
- const gl::TransformFeedbackState &mState;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_TRANSFORMFEEDBACKIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/TransformFeedbackImpl_mock.h b/src/3rdparty/angle/src/libANGLE/renderer/TransformFeedbackImpl_mock.h
deleted file mode 100644
index 2de3ad79a9..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/TransformFeedbackImpl_mock.h
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// TransformFeedbackImpl_mock.h: Defines a mock of the TransformFeedbackImpl class.
-
-#ifndef LIBANGLE_RENDERER_TRANSFORMFEEDBACKIMPLMOCK_H_
-#define LIBANGLE_RENDERER_TRANSFORMFEEDBACKIMPLMOCK_H_
-
-#include "gmock/gmock.h"
-
-#include "libANGLE/renderer/TransformFeedbackImpl.h"
-
-namespace rx
-{
-
-class MockTransformFeedbackImpl : public TransformFeedbackImpl
-{
- public:
- MockTransformFeedbackImpl(const gl::TransformFeedbackState &state)
- : TransformFeedbackImpl(state)
- {
- }
- ~MockTransformFeedbackImpl() { destructor(); }
-
- MOCK_METHOD1(begin, void(GLenum primitiveMode));
- MOCK_METHOD0(end, void());
- MOCK_METHOD0(pause, void());
- MOCK_METHOD0(resume, void());
-
- MOCK_METHOD1(bindGenericBuffer, void(const gl::BindingPointer<gl::Buffer> &));
- MOCK_METHOD2(bindIndexedBuffer, void(size_t, const gl::OffsetBindingPointer<gl::Buffer> &));
-
- MOCK_METHOD0(destructor, void());
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_TRANSFORMFEEDBACKIMPLMOCK_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/VertexArrayImpl.h b/src/3rdparty/angle/src/libANGLE/renderer/VertexArrayImpl.h
deleted file mode 100644
index e48cc53d6c..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/VertexArrayImpl.h
+++ /dev/null
@@ -1,37 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// VertexAttribImpl.h: Defines the abstract rx::VertexAttribImpl class.
-
-#ifndef LIBANGLE_RENDERER_VERTEXARRAYIMPL_H_
-#define LIBANGLE_RENDERER_VERTEXARRAYIMPL_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/Buffer.h"
-#include "libANGLE/VertexArray.h"
-
-namespace rx
-{
-class ContextImpl;
-
-class VertexArrayImpl : angle::NonCopyable
-{
- public:
- VertexArrayImpl(const gl::VertexArrayState &state) : mState(state) {}
- virtual void syncState(const gl::Context *context, const gl::VertexArray::DirtyBits &dirtyBits)
- {
- }
-
- virtual void destroy(const gl::Context *context) {}
- virtual ~VertexArrayImpl() {}
-
- protected:
- const gl::VertexArrayState &mState;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_VERTEXARRAYIMPL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/angle_format_data.json b/src/3rdparty/angle/src/libANGLE/renderer/angle_format_data.json
deleted file mode 100644
index 5b3a226e2e..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/angle_format_data.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "B5G6R5_UNORM": {
- "fboImplementationInternalFormat": "GL_RGB565"
- },
- "B5G5R5A1_UNORM": {
- "fboImplementationInternalFormat": "GL_RGB5_A1",
- "channelStruct": "A1R5G5B5"
- },
- "B8G8R8X8_UNORM": {
- "glInternalFormat": "GL_BGRA8_EXT",
- "channelStruct": "B8G8R8X8"
- },
- "R9G9B9E5_SHAREDEXP": {
- "componentType": "float",
- "channelStruct": "R9G9B9E5"
- },
- "B4G4R4A4_UNORM": {
- "fboImplementationInternalFormat": "GL_RGBA4",
- "channelStruct": "A4R4G4B4"
- },
- "R8G8B8A8_UNORM_SRGB": {
- "channelStruct": "R8G8B8A8SRGB"
- }
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/angle_format_map.json b/src/3rdparty/angle/src/libANGLE/renderer/angle_format_map.json
deleted file mode 100644
index 5a4e487cbd..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/angle_format_map.json
+++ /dev/null
@@ -1,132 +0,0 @@
-[
- [ "GL_ALPHA16F_EXT", "A16_FLOAT" ],
- [ "GL_ALPHA32F_EXT", "A32_FLOAT" ],
- [ "GL_ALPHA8_EXT", "A8_UNORM" ],
- [ "GL_BGR565_ANGLEX", "B5G6R5_UNORM" ],
- [ "GL_BGR5_A1_ANGLEX", "B5G5R5A1_UNORM" ],
- [ "GL_BGRA4_ANGLEX", "B4G4R4A4_UNORM" ],
- [ "GL_BGRA8_EXT", "B8G8R8A8_UNORM" ],
- [ "GL_BGRA8_SRGB_ANGLEX", "B8G8R8A8_UNORM_SRGB"],
- [ "GL_BGRX8_ANGLEX", "B8G8R8X8_UNORM" ],
- [ "GL_COMPRESSED_R11_EAC", "EAC_R11_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RG11_EAC", "EAC_R11G11_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGB8_ETC2", "ETC2_R8G8B8_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2", "ETC2_R8G8B8A1_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGBA8_ETC2_EAC", "ETC2_R8G8B8A8_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT", "BC1_RGBA_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE", "BC2_RGBA_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE", "BC3_RGBA_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGBA_ASTC_4x4_KHR", "ASTC_4x4_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGBA_ASTC_5x4_KHR", "ASTC_5x4_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGBA_ASTC_5x5_KHR", "ASTC_5x5_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGBA_ASTC_6x5_KHR", "ASTC_6x5_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGBA_ASTC_6x6_KHR", "ASTC_6x6_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGBA_ASTC_8x5_KHR", "ASTC_8x5_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGBA_ASTC_8x6_KHR", "ASTC_8x6_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGBA_ASTC_8x8_KHR", "ASTC_8x8_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGBA_ASTC_10x5_KHR", "ASTC_10x5_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGBA_ASTC_10x6_KHR", "ASTC_10x6_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGBA_ASTC_10x8_KHR", "ASTC_10x8_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGBA_ASTC_10x10_KHR", "ASTC_10x10_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGBA_ASTC_12x10_KHR", "ASTC_12x10_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGBA_ASTC_12x12_KHR", "ASTC_12x12_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_RGB_S3TC_DXT1_EXT", "BC1_RGB_UNORM_BLOCK" ],
- [ "GL_COMPRESSED_SIGNED_R11_EAC", "EAC_R11_SNORM_BLOCK" ],
- [ "GL_COMPRESSED_SIGNED_RG11_EAC", "EAC_R11G11_SNORM_BLOCK" ],
- [ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR", "ASTC_4x4_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR", "ASTC_5x4_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR", "ASTC_5x5_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR", "ASTC_6x5_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR", "ASTC_6x6_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR", "ASTC_8x5_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR", "ASTC_8x6_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR", "ASTC_8x8_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR", "ASTC_10x5_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR", "ASTC_10x6_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR", "ASTC_10x8_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR", "ASTC_10x10_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR", "ASTC_12x10_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR", "ASTC_12x12_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC", "ETC2_R8G8B8A8_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB8_ETC2", "ETC2_R8G8B8_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2", "ETC2_R8G8B8A1_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT", "BC1_RGBA_UNORM_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT", "BC2_RGBA_UNORM_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT", "BC3_RGBA_UNORM_SRGB_BLOCK" ],
- [ "GL_COMPRESSED_SRGB_S3TC_DXT1_EXT", "BC1_RGB_UNORM_SRGB_BLOCK" ],
- [ "GL_DEPTH24_STENCIL8", "D24_UNORM_S8_UINT" ],
- [ "GL_DEPTH32F_STENCIL8", "D32_FLOAT_S8X24_UINT" ],
- [ "GL_DEPTH_COMPONENT16", "D16_UNORM" ],
- [ "GL_DEPTH_COMPONENT24", "D24_UNORM" ],
- [ "GL_DEPTH_COMPONENT32F", "D32_FLOAT" ],
- [ "GL_DEPTH_COMPONENT32_OES", "D32_UNORM" ],
- [ "GL_ETC1_RGB8_OES", "ETC1_R8G8B8_UNORM_BLOCK" ],
- [ "GL_ETC1_RGB8_LOSSY_DECODE_ANGLE", "ETC1_LOSSY_DECODE_R8G8B8_UNORM_BLOCK" ],
- [ "GL_LUMINANCE16F_EXT", "L16_FLOAT" ],
- [ "GL_LUMINANCE32F_EXT", "L32_FLOAT" ],
- [ "GL_LUMINANCE8_ALPHA8_EXT", "L8A8_UNORM" ],
- [ "GL_LUMINANCE8_EXT", "L8_UNORM" ],
- [ "GL_LUMINANCE_ALPHA16F_EXT", "L16A16_FLOAT" ],
- [ "GL_LUMINANCE_ALPHA32F_EXT", "L32A32_FLOAT" ],
- [ "GL_NONE", "NONE" ],
- [ "GL_R11F_G11F_B10F", "R11G11B10_FLOAT" ],
- [ "GL_R16F", "R16_FLOAT" ],
- [ "GL_R16I", "R16_SINT" ],
- [ "GL_R16UI", "R16_UINT" ],
- [ "GL_R32F", "R32_FLOAT" ],
- [ "GL_R32I", "R32_SINT" ],
- [ "GL_R32UI", "R32_UINT" ],
- [ "GL_R8", "R8_UNORM" ],
- [ "GL_R8I", "R8_SINT" ],
- [ "GL_R8UI", "R8_UINT" ],
- [ "GL_R8_SNORM", "R8_SNORM" ],
- [ "GL_RG16F", "R16G16_FLOAT" ],
- [ "GL_RG16I", "R16G16_SINT" ],
- [ "GL_RG16UI", "R16G16_UINT" ],
- [ "GL_RG32F", "R32G32_FLOAT" ],
- [ "GL_RG32I", "R32G32_SINT" ],
- [ "GL_RG32UI", "R32G32_UINT" ],
- [ "GL_RG8", "R8G8_UNORM" ],
- [ "GL_RG8I", "R8G8_SINT" ],
- [ "GL_RG8UI", "R8G8_UINT" ],
- [ "GL_RG8_SNORM", "R8G8_SNORM" ],
- [ "GL_RGB", "R8G8B8_UNORM" ],
- [ "GL_RGB10_A2", "R10G10B10A2_UNORM" ],
- [ "GL_RGB10_A2UI", "R10G10B10A2_UINT" ],
- [ "GL_RGB16F", "R16G16B16_FLOAT" ],
- [ "GL_RGB16I", "R16G16B16_SINT" ],
- [ "GL_RGB16UI", "R16G16B16_UINT" ],
- [ "GL_RGB32F", "R32G32B32_FLOAT" ],
- [ "GL_RGB32I", "R32G32B32_SINT" ],
- [ "GL_RGB32UI", "R32G32B32_UINT" ],
- [ "GL_RGB565", "R5G6B5_UNORM" ],
- [ "GL_RGB5_A1", "R5G5B5A1_UNORM" ],
- [ "GL_RGB8", "R8G8B8_UNORM" ],
- [ "GL_RGB8I", "R8G8B8_SINT" ],
- [ "GL_RGB8UI", "R8G8B8_UINT" ],
- [ "GL_RGB8_SNORM", "R8G8B8_SNORM" ],
- [ "GL_RGB9_E5", "R9G9B9E5_SHAREDEXP" ],
- [ "GL_RGBA", "R8G8B8A8_UNORM" ],
- [ "GL_RGBA16F", "R16G16B16A16_FLOAT" ],
- [ "GL_RGBA16I", "R16G16B16A16_SINT" ],
- [ "GL_RGBA16UI", "R16G16B16A16_UINT" ],
- [ "GL_RGBA32F", "R32G32B32A32_FLOAT" ],
- [ "GL_RGBA32I", "R32G32B32A32_SINT" ],
- [ "GL_RGBA32UI", "R32G32B32A32_UINT" ],
- [ "GL_RGBA4", "R4G4B4A4_UNORM" ],
- [ "GL_RGBA8", "R8G8B8A8_UNORM" ],
- [ "GL_RGBA8I", "R8G8B8A8_SINT" ],
- [ "GL_RGBA8UI", "R8G8B8A8_UINT" ],
- [ "GL_RGBA8_SNORM", "R8G8B8A8_SNORM" ],
- [ "GL_SRGB8", "R8G8B8_UNORM_SRGB" ],
- [ "GL_SRGB8_ALPHA8", "R8G8B8A8_UNORM_SRGB" ],
- [ "GL_STENCIL_INDEX8", "S8_UINT" ],
- [ "GL_R16_EXT", "R16_UNORM" ],
- [ "GL_RG16_EXT", "R16G16_UNORM" ],
- [ "GL_RGB16_EXT", "R16G16B16_UNORM" ],
- [ "GL_RGBA16_EXT", "R16G16B16A16_UNORM" ],
- [ "GL_R16_SNORM_EXT", "R16_SNORM" ],
- [ "GL_RG16_SNORM_EXT", "R16G16_SNORM" ],
- [ "GL_RGB16_SNORM_EXT", "R16G16B16_SNORM" ],
- [ "GL_RGBA16_SNORM_EXT", "R16G16B16A16_SNORM" ]
-]
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/BufferD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/BufferD3D.cpp
deleted file mode 100644
index 7769ab2b75..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/BufferD3D.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// BufferD3D.cpp Defines common functionality between the Buffer9 and Buffer11 classes.
-
-#include "libANGLE/renderer/d3d/BufferD3D.h"
-
-#include "common/mathutil.h"
-#include "common/utilities.h"
-#include "libANGLE/renderer/d3d/IndexBuffer.h"
-#include "libANGLE/renderer/d3d/VertexBuffer.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-
-namespace rx
-{
-
-unsigned int BufferD3D::mNextSerial = 1;
-
-BufferD3D::BufferD3D(const gl::BufferState &state, BufferFactoryD3D *factory)
- : BufferImpl(state),
- mFactory(factory),
- mStaticIndexBuffer(nullptr),
- mStaticBufferCacheTotalSize(0),
- mStaticVertexBufferOutOfDate(false),
- mUnmodifiedDataUse(0),
- mUsage(D3DBufferUsage::STATIC)
-{
- updateSerial();
-}
-
-BufferD3D::~BufferD3D()
-{
- SafeDelete(mStaticIndexBuffer);
-}
-
-void BufferD3D::emptyStaticBufferCache()
-{
- mStaticVertexBuffers.clear();
- mStaticBufferCacheTotalSize = 0;
-}
-
-void BufferD3D::updateSerial()
-{
- mSerial = mNextSerial++;
-}
-
-void BufferD3D::updateD3DBufferUsage(const gl::Context *context, gl::BufferUsage usage)
-{
- switch (usage)
- {
- 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::DYNAMIC;
- break;
- default:
- UNREACHABLE();
- }
-}
-
-void BufferD3D::initializeStaticData(const gl::Context *context)
-{
- if (mStaticVertexBuffers.empty())
- {
- StaticVertexBufferInterface *newStaticBuffer = new StaticVertexBufferInterface(mFactory);
- mStaticVertexBuffers.push_back(
- std::unique_ptr<StaticVertexBufferInterface>(newStaticBuffer));
- }
- if (!mStaticIndexBuffer)
- {
- mStaticIndexBuffer = new StaticIndexBufferInterface(mFactory);
- }
-}
-
-StaticIndexBufferInterface *BufferD3D::getStaticIndexBuffer()
-{
- return mStaticIndexBuffer;
-}
-
-StaticVertexBufferInterface *BufferD3D::getStaticVertexBuffer(const gl::VertexAttribute &attribute,
- const gl::VertexBinding &binding)
-{
- if (mStaticVertexBuffers.empty())
- {
- // Early out if there aren't any static buffers at all
- return nullptr;
- }
-
- // Early out, the attribute can be added to mStaticVertexBuffer.
- if (mStaticVertexBuffers.size() == 1 && mStaticVertexBuffers[0]->empty())
- {
- return mStaticVertexBuffers[0].get();
- }
-
- // Cache size limiting: track the total allocated buffer sizes.
- size_t currentTotalSize = 0;
-
- // At this point, see if any of the existing static buffers contains the attribute data
- // If there is a cached static buffer that already contains the attribute, then return it
- for (const auto &staticBuffer : mStaticVertexBuffers)
- {
- if (staticBuffer->matchesAttribute(attribute, binding))
- {
- return staticBuffer.get();
- }
-
- currentTotalSize += staticBuffer->getBufferSize();
- }
-
- // Cache size limiting: Clean-up threshold is four times the base buffer size, with a minimum.
- ASSERT(getSize() < std::numeric_limits<size_t>::max() / 4u);
- size_t sizeThreshold = std::max(getSize() * 4u, static_cast<size_t>(0x1000u));
-
- // If we're past the threshold, clear the buffer cache. Note that this will release buffers
- // that are currenly bound, and in an edge case can even translate the same attribute twice
- // in the same draw call. It will not delete currently bound buffers, however, because they
- // are ref counted.
- if (currentTotalSize > sizeThreshold)
- {
- emptyStaticBufferCache();
- }
-
- // At this point, we must create a new static buffer for the attribute data.
- StaticVertexBufferInterface *newStaticBuffer = new StaticVertexBufferInterface(mFactory);
- newStaticBuffer->setAttribute(attribute, binding);
- mStaticVertexBuffers.push_back(std::unique_ptr<StaticVertexBufferInterface>(newStaticBuffer));
- return newStaticBuffer;
-}
-
-void BufferD3D::invalidateStaticData(const gl::Context *context)
-{
- emptyStaticBufferCache();
-
- if (mStaticIndexBuffer && mStaticIndexBuffer->getBufferSize() != 0)
- {
- SafeDelete(mStaticIndexBuffer);
- }
-
- // If the buffer was created with a static usage then we recreate the static
- // buffers so that they are populated the next time we use this buffer.
- if (mUsage == D3DBufferUsage::STATIC)
- {
- initializeStaticData(context);
- }
-
- mUnmodifiedDataUse = 0;
-}
-
-// Creates static buffers if sufficient used data has been left unmodified
-void BufferD3D::promoteStaticUsage(const gl::Context *context, int dataSize)
-{
- if (mUsage == D3DBufferUsage::DYNAMIC)
- {
- mUnmodifiedDataUse += dataSize;
-
- if (mUnmodifiedDataUse > 3 * getSize())
- {
- updateD3DBufferUsage(context, gl::BufferUsage::StaticDraw);
- }
- }
-}
-
-gl::Error BufferD3D::getIndexRange(const gl::Context *context,
- GLenum type,
- size_t offset,
- size_t count,
- bool primitiveRestartEnabled,
- gl::IndexRange *outRange)
-{
- const uint8_t *data = nullptr;
- ANGLE_TRY(getData(context, &data));
-
- *outRange = gl::ComputeIndexRange(type, data + offset, count, primitiveRestartEnabled);
- return gl::NoError();
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/BufferD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/BufferD3D.h
deleted file mode 100644
index 60153748e6..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/BufferD3D.h
+++ /dev/null
@@ -1,89 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// BufferD3D.h: Defines the rx::BufferD3D class, an implementation of BufferImpl.
-
-#ifndef LIBANGLE_RENDERER_D3D_BUFFERD3D_H_
-#define LIBANGLE_RENDERER_D3D_BUFFERD3D_H_
-
-#include "libANGLE/angletypes.h"
-#include "libANGLE/renderer/BufferImpl.h"
-
-#include <stdint.h>
-#include <vector>
-
-namespace gl
-{
-struct VertexAttribute;
-class VertexBinding;
-}
-
-namespace rx
-{
-class BufferFactoryD3D;
-class StaticIndexBufferInterface;
-class StaticVertexBufferInterface;
-
-enum class D3DBufferUsage
-{
- STATIC,
- DYNAMIC,
-};
-
-class BufferD3D : public BufferImpl
-{
- public:
- BufferD3D(const gl::BufferState &state, BufferFactoryD3D *factory);
- ~BufferD3D() override;
-
- unsigned int getSerial() const { return mSerial; }
-
- virtual size_t getSize() const = 0;
- virtual bool supportsDirectBinding() const = 0;
- virtual gl::Error markTransformFeedbackUsage(const gl::Context *context) = 0;
- virtual gl::Error getData(const gl::Context *context, const uint8_t **outData) = 0;
-
- // Warning: you should ensure binding really matches attrib.bindingIndex before using this
- // function.
- StaticVertexBufferInterface *getStaticVertexBuffer(const gl::VertexAttribute &attribute,
- const gl::VertexBinding &binding);
- StaticIndexBufferInterface *getStaticIndexBuffer();
-
- virtual void initializeStaticData(const gl::Context *context);
- virtual void invalidateStaticData(const gl::Context *context);
-
- void promoteStaticUsage(const gl::Context *context, int dataSize);
-
- gl::Error getIndexRange(const gl::Context *context,
- GLenum type,
- size_t offset,
- size_t count,
- bool primitiveRestartEnabled,
- gl::IndexRange *outRange) override;
-
- BufferFactoryD3D *getFactory() const { return mFactory; }
- D3DBufferUsage getUsage() const { return mUsage; }
-
- protected:
- void updateSerial();
- void updateD3DBufferUsage(const gl::Context *context, gl::BufferUsage usage);
- void emptyStaticBufferCache();
-
- BufferFactoryD3D *mFactory;
- unsigned int mSerial;
- static unsigned int mNextSerial;
-
- std::vector<std::unique_ptr<StaticVertexBufferInterface>> mStaticVertexBuffers;
- StaticIndexBufferInterface *mStaticIndexBuffer;
- unsigned int mStaticBufferCacheTotalSize;
- unsigned int mStaticVertexBufferOutOfDate;
- unsigned int mUnmodifiedDataUse;
- D3DBufferUsage mUsage;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_BUFFERD3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/CompilerD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/CompilerD3D.cpp
deleted file mode 100644
index 8ceeec3c39..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/CompilerD3D.cpp
+++ /dev/null
@@ -1,30 +0,0 @@
-//
-// Copyright 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// CompilerD3D:
-// Implementation of the D3D compiler methods.
-//
-
-#include "libANGLE/renderer/d3d/CompilerD3D.h"
-
-namespace rx
-{
-
-CompilerD3D::CompilerD3D(ShShaderOutput translatorOutputType)
- : mTranslatorOutputType(translatorOutputType)
-{
-}
-
-gl::Error CompilerD3D::release()
-{
- return gl::NoError();
-}
-
-ShShaderOutput CompilerD3D::getTranslatorOutputType() const
-{
- return mTranslatorOutputType;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/CompilerD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/CompilerD3D.h
deleted file mode 100644
index bcfe810d04..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/CompilerD3D.h
+++ /dev/null
@@ -1,33 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// CompilerD3D.h: Defines the rx::CompilerD3D class, an implementation of rx::CompilerImpl.
-
-#ifndef LIBANGLE_RENDERER_COMPILERD3D_H_
-#define LIBANGLE_RENDERER_COMPILERD3D_H_
-
-#include "libANGLE/renderer/CompilerImpl.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-
-namespace rx
-{
-
-class CompilerD3D : public CompilerImpl
-{
- public:
- CompilerD3D(ShShaderOutput translatorOutputType);
- ~CompilerD3D() override {}
-
- gl::Error release() override;
- ShShaderOutput getTranslatorOutputType() const override;
-
- private:
- ShShaderOutput mTranslatorOutputType;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_COMPILERD3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DeviceD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/DeviceD3D.cpp
deleted file mode 100644
index 5a06b15279..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DeviceD3D.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// DeviceD3D.cpp: D3D implementation of egl::Device
-
-#include "libANGLE/renderer/d3d/DeviceD3D.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-
-#include "libANGLE/Device.h"
-#include "libANGLE/Display.h"
-
-#include <EGL/eglext.h>
-
-namespace rx
-{
-
-DeviceD3D::DeviceD3D()
- : mDevice(0), mDeviceType(0), mDeviceExternallySourced(false), mIsInitialized(false)
-{
-}
-
-DeviceD3D::~DeviceD3D()
-{
-#if defined(ANGLE_ENABLE_D3D11)
- if (mDeviceType == EGL_D3D11_DEVICE_ANGLE)
- {
- // DeviceD3D holds a ref to an externally-sourced D3D11 device. We must release it.
- ID3D11Device *device = reinterpret_cast<ID3D11Device *>(mDevice);
- device->Release();
- }
-#endif
-}
-
-egl::Error DeviceD3D::getDevice(void **outValue)
-{
- if (!mIsInitialized)
- {
- *outValue = nullptr;
- return egl::EglBadDevice();
- }
-
- *outValue = mDevice;
- return egl::NoError();
-}
-
-egl::Error DeviceD3D::initialize(void *device,
- EGLint deviceType,
- EGLBoolean deviceExternallySourced)
-{
- ASSERT(!mIsInitialized);
- if (mIsInitialized)
- {
- return egl::EglBadDevice();
- }
-
-#if defined(ANGLE_ENABLE_D3D11)
- if (deviceType == EGL_D3D11_DEVICE_ANGLE)
- {
- // Validate the device
- IUnknown *iunknown = reinterpret_cast<IUnknown *>(device);
-
- ID3D11Device *d3dDevice = nullptr;
- HRESULT hr =
- iunknown->QueryInterface(__uuidof(ID3D11Device), reinterpret_cast<void **>(&d3dDevice));
- if (FAILED(hr))
- {
- return egl::EglBadAttribute() << "Invalid D3D device passed into EGLDeviceEXT";
- }
-
- // The QI to ID3D11Device adds a ref to the D3D11 device.
- // Deliberately don't release the ref here, so that the DeviceD3D holds a ref to the
- // D3D11 device.
- }
- else
-#endif
- {
- ASSERT(deviceExternallySourced == EGL_FALSE);
- }
-
- mDevice = device;
- mDeviceType = deviceType;
- mDeviceExternallySourced = !!deviceExternallySourced;
- mIsInitialized = true;
-
- return egl::NoError();
-}
-
-EGLint DeviceD3D::getType()
-{
- return mDeviceType;
-}
-
-void DeviceD3D::generateExtensions(egl::DeviceExtensions *outExtensions) const
-{
- outExtensions->deviceD3D = true;
-}
-
-bool DeviceD3D::deviceExternallySourced()
-{
- return mDeviceExternallySourced;
-}
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DeviceD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/DeviceD3D.h
deleted file mode 100644
index 15eaf9210a..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DeviceD3D.h
+++ /dev/null
@@ -1,39 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// DeviceD3D.h: D3D implementation of egl::Device
-
-#ifndef LIBANGLE_RENDERER_D3D_DEVICED3D_H_
-#define LIBANGLE_RENDERER_D3D_DEVICED3D_H_
-
-#include "libANGLE/Device.h"
-#include "libANGLE/renderer/DeviceImpl.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-
-namespace rx
-{
-class DeviceD3D : public DeviceImpl
-{
- public:
- DeviceD3D();
- ~DeviceD3D() override;
-
- egl::Error initialize(void *device, EGLint deviceType, EGLBoolean external);
- egl::Error getDevice(void **outValue) override;
- EGLint getType() override;
- void generateExtensions(egl::DeviceExtensions *outExtensions) const override;
- bool deviceExternallySourced() override;
-
- private:
- void *mDevice;
- EGLint mDeviceType;
- bool mDeviceExternallySourced;
- bool mIsInitialized;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_DEVICED3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DisplayD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/DisplayD3D.cpp
deleted file mode 100644
index 0edda9c584..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DisplayD3D.cpp
+++ /dev/null
@@ -1,361 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// DisplayD3D.cpp: D3D implementation of egl::Display
-
-#include "libANGLE/renderer/d3d/DisplayD3D.h"
-
-#include <EGL/eglext.h>
-
-#include "libANGLE/Config.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Display.h"
-#include "libANGLE/Surface.h"
-#include "libANGLE/Thread.h"
-#include "libANGLE/histogram_macros.h"
-#include "libANGLE/renderer/d3d/DeviceD3D.h"
-#include "libANGLE/renderer/d3d/EGLImageD3D.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-#include "libANGLE/renderer/d3d/SurfaceD3D.h"
-#include "libANGLE/renderer/d3d/SwapChainD3D.h"
-
-#if defined (ANGLE_ENABLE_D3D9)
-# include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
-#endif // ANGLE_ENABLE_D3D9
-
-#if defined (ANGLE_ENABLE_D3D11)
-# include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#endif // ANGLE_ENABLE_D3D11
-
-#if !defined(ANGLE_DEFAULT_D3D11)
-// Enables use of the Direct3D 11 API for a default display, when available
-# define ANGLE_DEFAULT_D3D11 1
-#endif
-
-namespace rx
-{
-
-typedef RendererD3D *(*CreateRendererD3DFunction)(egl::Display*);
-
-template <typename RendererType>
-static RendererD3D *CreateTypedRendererD3D(egl::Display *display)
-{
- return new RendererType(display);
-}
-
-egl::Error CreateRendererD3D(egl::Display *display, RendererD3D **outRenderer)
-{
- ASSERT(outRenderer != nullptr);
-
- std::vector<CreateRendererD3DFunction> rendererCreationFunctions;
-
- if (display->getPlatform() == EGL_PLATFORM_ANGLE_ANGLE)
- {
- const auto &attribMap = display->getAttributeMap();
- EGLNativeDisplayType nativeDisplay = display->getNativeDisplayId();
-
- EGLint requestedDisplayType = static_cast<EGLint>(
- attribMap.get(EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE));
-
-# if defined(ANGLE_ENABLE_D3D11)
- if (nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
- nativeDisplay == EGL_D3D11_ONLY_DISPLAY_ANGLE ||
- requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
- {
- rendererCreationFunctions.push_back(CreateTypedRendererD3D<Renderer11>);
- }
-# endif
-
-# if defined(ANGLE_ENABLE_D3D9)
- if (nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
- requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE)
- {
- rendererCreationFunctions.push_back(CreateTypedRendererD3D<Renderer9>);
- }
-# endif
-
- if (nativeDisplay != EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE &&
- nativeDisplay != EGL_D3D11_ONLY_DISPLAY_ANGLE &&
- requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE)
- {
- // The default display is requested, try the D3D9 and D3D11 renderers, order them using
- // the definition of ANGLE_DEFAULT_D3D11
-# if ANGLE_DEFAULT_D3D11
-# if defined(ANGLE_ENABLE_D3D11)
- rendererCreationFunctions.push_back(CreateTypedRendererD3D<Renderer11>);
-# endif
-# if defined(ANGLE_ENABLE_D3D9)
- rendererCreationFunctions.push_back(CreateTypedRendererD3D<Renderer9>);
-# endif
-# else
-# if defined(ANGLE_ENABLE_D3D9)
- rendererCreationFunctions.push_back(CreateTypedRendererD3D<Renderer9>);
-# endif
-# if defined(ANGLE_ENABLE_D3D11)
- rendererCreationFunctions.push_back(CreateTypedRendererD3D<Renderer11>);
-# endif
-# endif
- }
- }
- else if (display->getPlatform() == EGL_PLATFORM_DEVICE_EXT)
- {
-#if defined(ANGLE_ENABLE_D3D11)
- if (display->getDevice()->getType() == EGL_D3D11_DEVICE_ANGLE)
- {
- rendererCreationFunctions.push_back(CreateTypedRendererD3D<Renderer11>);
- }
-#endif
- }
- else
- {
- UNIMPLEMENTED();
- }
-
- for (size_t i = 0; i < rendererCreationFunctions.size(); i++)
- {
- RendererD3D *renderer = rendererCreationFunctions[i](display);
- egl::Error result = renderer->initialize();
-
-# if defined(ANGLE_ENABLE_D3D11)
- if (renderer->getRendererClass() == RENDERER_D3D11)
- {
- ASSERT(result.getID() >= 0 && result.getID() < NUM_D3D11_INIT_ERRORS);
- ANGLE_HISTOGRAM_ENUMERATION("GPU.ANGLE.D3D11InitializeResult",
- result.getID(),
- NUM_D3D11_INIT_ERRORS);
- }
-# endif
-
-# if defined(ANGLE_ENABLE_D3D9)
- if (renderer->getRendererClass() == RENDERER_D3D9)
- {
- ASSERT(result.getID() >= 0 && result.getID() < NUM_D3D9_INIT_ERRORS);
- ANGLE_HISTOGRAM_ENUMERATION("GPU.ANGLE.D3D9InitializeResult",
- result.getID(),
- NUM_D3D9_INIT_ERRORS);
- }
-# endif
-
- if (!result.isError())
- {
- *outRenderer = renderer;
- return result;
- }
-
- // Failed to create the renderer, try the next
- SafeDelete(renderer);
- }
-
- return egl::EglNotInitialized() << "No available renderers.";
-}
-
-DisplayD3D::DisplayD3D(const egl::DisplayState &state) : DisplayImpl(state), mRenderer(nullptr)
-{
-}
-
-SurfaceImpl *DisplayD3D::createWindowSurface(const egl::SurfaceState &state,
- EGLNativeWindowType window,
- const egl::AttributeMap &attribs)
-{
- ASSERT(mRenderer != nullptr);
- return new WindowSurfaceD3D(state, mRenderer, mDisplay, window, attribs);
-}
-
-SurfaceImpl *DisplayD3D::createPbufferSurface(const egl::SurfaceState &state,
- const egl::AttributeMap &attribs)
-{
- ASSERT(mRenderer != nullptr);
- return new PbufferSurfaceD3D(state, mRenderer, mDisplay, 0, nullptr, attribs);
-}
-
-SurfaceImpl *DisplayD3D::createPbufferFromClientBuffer(const egl::SurfaceState &state,
- EGLenum buftype,
- EGLClientBuffer clientBuffer,
- const egl::AttributeMap &attribs)
-{
- ASSERT(mRenderer != nullptr);
- return new PbufferSurfaceD3D(state, mRenderer, mDisplay, buftype, clientBuffer, attribs);
-}
-
-SurfaceImpl *DisplayD3D::createPixmapSurface(const egl::SurfaceState &state,
- NativePixmapType nativePixmap,
- const egl::AttributeMap &attribs)
-{
- UNIMPLEMENTED();
- return nullptr;
-}
-
-ImageImpl *DisplayD3D::createImage(const egl::ImageState &state,
- EGLenum target,
- const egl::AttributeMap &attribs)
-{
- return new EGLImageD3D(state, target, attribs, mRenderer);
-}
-
-egl::Error DisplayD3D::getDevice(DeviceImpl **device)
-{
- return mRenderer->getEGLDevice(device);
-}
-
-ContextImpl *DisplayD3D::createContext(const gl::ContextState &state)
-{
- ASSERT(mRenderer != nullptr);
- return mRenderer->createContext(state);
-}
-
-StreamProducerImpl *DisplayD3D::createStreamProducerD3DTextureNV12(
- egl::Stream::ConsumerType consumerType,
- const egl::AttributeMap &attribs)
-{
- ASSERT(mRenderer != nullptr);
- return mRenderer->createStreamProducerD3DTextureNV12(consumerType, attribs);
-}
-
-egl::Error DisplayD3D::makeCurrent(egl::Surface *drawSurface, egl::Surface *readSurface, gl::Context *context)
-{
- return egl::NoError();
-}
-
-egl::Error DisplayD3D::initialize(egl::Display *display)
-{
- ASSERT(mRenderer == nullptr && display != nullptr);
- mDisplay = display;
- ANGLE_TRY(CreateRendererD3D(display, &mRenderer));
- return egl::NoError();
-}
-
-void DisplayD3D::terminate()
-{
- SafeDelete(mRenderer);
-}
-
-egl::ConfigSet DisplayD3D::generateConfigs()
-{
- ASSERT(mRenderer != nullptr);
- return mRenderer->generateConfigs();
-}
-
-bool DisplayD3D::testDeviceLost()
-{
- ASSERT(mRenderer != nullptr);
- return mRenderer->testDeviceLost();
-}
-
-egl::Error DisplayD3D::restoreLostDevice(const egl::Display *display)
-{
- // Release surface resources to make the Reset() succeed
- for (egl::Surface *surface : mState.surfaceSet)
- {
- if (surface->getBoundTexture())
- {
- ANGLE_TRY(surface->releaseTexImage(display->getProxyContext(), EGL_BACK_BUFFER));
- }
- SurfaceD3D *surfaceD3D = GetImplAs<SurfaceD3D>(surface);
- surfaceD3D->releaseSwapChain();
- }
-
- if (!mRenderer->resetDevice())
- {
- return egl::EglBadAlloc();
- }
-
- // Restore any surfaces that may have been lost
- for (const egl::Surface *surface : mState.surfaceSet)
- {
- SurfaceD3D *surfaceD3D = GetImplAs<SurfaceD3D>(surface);
-
- ANGLE_TRY(surfaceD3D->resetSwapChain(display));
- }
-
- return egl::NoError();
-}
-
-bool DisplayD3D::isValidNativeWindow(EGLNativeWindowType window) const
-{
- return mRenderer->isValidNativeWindow(window);
-}
-
-egl::Error DisplayD3D::validateClientBuffer(const egl::Config *configuration,
- EGLenum buftype,
- EGLClientBuffer clientBuffer,
- const egl::AttributeMap &attribs) const
-{
- switch (buftype)
- {
- case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE:
- return mRenderer->validateShareHandle(configuration, static_cast<HANDLE>(clientBuffer),
- attribs);
-
- case EGL_D3D_TEXTURE_ANGLE:
- return mRenderer->getD3DTextureInfo(
- configuration, static_cast<IUnknown *>(clientBuffer), nullptr, nullptr, nullptr);
-
- default:
- return DisplayImpl::validateClientBuffer(configuration, buftype, clientBuffer, attribs);
- }
-}
-
-void DisplayD3D::generateExtensions(egl::DisplayExtensions *outExtensions) const
-{
- mRenderer->generateDisplayExtensions(outExtensions);
-}
-
-std::string DisplayD3D::getVendorString() const
-{
- std::string vendorString = "Google Inc.";
- if (mRenderer)
- {
- vendorString += " " + mRenderer->getVendorString();
- }
-
- return vendorString;
-}
-
-void DisplayD3D::generateCaps(egl::Caps *outCaps) const
-{
- // Display must be initialized to generate caps
- ASSERT(mRenderer != nullptr);
-
- outCaps->textureNPOT = mRenderer->getNativeExtensions().textureNPOT;
-}
-
-egl::Error DisplayD3D::waitClient(const gl::Context *context) const
-{
- for (egl::Surface *surface : mState.surfaceSet)
- {
- SurfaceD3D *surfaceD3D = GetImplAs<SurfaceD3D>(surface);
- ANGLE_TRY(surfaceD3D->checkForOutOfDateSwapChain(context));
- }
-
- return egl::NoError();
-}
-
-egl::Error DisplayD3D::waitNative(const gl::Context *context, EGLint engine) const
-{
- egl::Surface *drawSurface = context->getCurrentDrawSurface();
- egl::Surface *readSurface = context->getCurrentReadSurface();
-
- if (drawSurface != nullptr)
- {
- SurfaceD3D *drawSurfaceD3D = GetImplAs<SurfaceD3D>(drawSurface);
- ANGLE_TRY(drawSurfaceD3D->checkForOutOfDateSwapChain(context));
- }
-
- if (readSurface != nullptr)
- {
- SurfaceD3D *readSurfaceD3D = GetImplAs<SurfaceD3D>(readSurface);
- ANGLE_TRY(readSurfaceD3D->checkForOutOfDateSwapChain(context));
- }
-
- return egl::NoError();
-}
-
-gl::Version DisplayD3D::getMaxSupportedESVersion() const
-{
- return mRenderer->getMaxSupportedESVersion();
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DisplayD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/DisplayD3D.h
deleted file mode 100644
index 7090522312..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DisplayD3D.h
+++ /dev/null
@@ -1,83 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// DisplayD3D.h: D3D implementation of egl::Display
-
-#ifndef LIBANGLE_RENDERER_D3D_DISPLAYD3D_H_
-#define LIBANGLE_RENDERER_D3D_DISPLAYD3D_H_
-
-#include "libANGLE/renderer/DisplayImpl.h"
-#include "libANGLE/Device.h"
-
-namespace rx
-{
-class RendererD3D;
-
-class DisplayD3D : public DisplayImpl
-{
- public:
- DisplayD3D(const egl::DisplayState &state);
-
- egl::Error initialize(egl::Display *display) override;
- void terminate() override;
-
- // Surface creation
- SurfaceImpl *createWindowSurface(const egl::SurfaceState &state,
- EGLNativeWindowType window,
- const egl::AttributeMap &attribs) override;
- SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state,
- const egl::AttributeMap &attribs) override;
- SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state,
- EGLenum buftype,
- EGLClientBuffer clientBuffer,
- const egl::AttributeMap &attribs) override;
- SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state,
- NativePixmapType nativePixmap,
- const egl::AttributeMap &attribs) override;
-
- ImageImpl *createImage(const egl::ImageState &state,
- EGLenum target,
- const egl::AttributeMap &attribs) override;
-
- ContextImpl *createContext(const gl::ContextState &state) override;
-
- StreamProducerImpl *createStreamProducerD3DTextureNV12(
- egl::Stream::ConsumerType consumerType,
- const egl::AttributeMap &attribs) override;
-
- egl::Error makeCurrent(egl::Surface *drawSurface, egl::Surface *readSurface, gl::Context *context) override;
-
- egl::ConfigSet generateConfigs() override;
-
- bool testDeviceLost() override;
- egl::Error restoreLostDevice(const egl::Display *display) override;
-
- bool isValidNativeWindow(EGLNativeWindowType window) const override;
- egl::Error validateClientBuffer(const egl::Config *configuration,
- EGLenum buftype,
- EGLClientBuffer clientBuffer,
- const egl::AttributeMap &attribs) const override;
-
- egl::Error getDevice(DeviceImpl **device) override;
-
- std::string getVendorString() const override;
-
- egl::Error waitClient(const gl::Context *context) const override;
- egl::Error waitNative(const gl::Context *context, EGLint engine) const override;
- gl::Version getMaxSupportedESVersion() const override;
-
- private:
- void generateExtensions(egl::DisplayExtensions *outExtensions) const override;
- void generateCaps(egl::Caps *outCaps) const override;
-
- egl::Display *mDisplay;
-
- rx::RendererD3D *mRenderer;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_DISPLAYD3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.cpp
deleted file mode 100644
index b4143a3f5f..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.cpp
+++ /dev/null
@@ -1,1427 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// DynamicHLSL.cpp: Implementation for link and run-time HLSL generation
-//
-
-#include "libANGLE/renderer/d3d/DynamicHLSL.h"
-
-#include "common/string_utils.h"
-#include "common/utilities.h"
-#include "compiler/translator/blocklayoutHLSL.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/Shader.h"
-#include "libANGLE/VaryingPacking.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/d3d/ProgramD3D.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-#include "libANGLE/renderer/d3d/ShaderD3D.h"
-
-using namespace gl;
-
-namespace rx
-{
-
-namespace
-{
-
-// This class needs to match OutputHLSL::decorate
-class DecorateVariable final : angle::NonCopyable
-{
- public:
- explicit DecorateVariable(const std::string &str) : mName(str) {}
- const std::string &getName() const { return mName; }
-
- private:
- const std::string &mName;
-};
-
-std::ostream &operator<<(std::ostream &o, const DecorateVariable &dv)
-{
- if (dv.getName().compare(0, 3, "gl_") != 0)
- {
- o << "_";
- }
- o << dv.getName();
- return o;
-}
-
-const char *HLSLComponentTypeString(GLenum componentType)
-{
- switch (componentType)
- {
- case GL_UNSIGNED_INT:
- return "uint";
- case GL_INT:
- return "int";
- case GL_UNSIGNED_NORMALIZED:
- case GL_SIGNED_NORMALIZED:
- case GL_FLOAT:
- return "float";
- default:
- UNREACHABLE();
- return "not-component-type";
- }
-}
-
-void HLSLComponentTypeString(std::ostringstream &ostream, GLenum componentType, int componentCount)
-{
- ostream << HLSLComponentTypeString(componentType);
- if (componentCount > 1)
- {
- ostream << componentCount;
- }
-}
-
-const char *HLSLMatrixTypeString(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT_MAT2:
- return "float2x2";
- case GL_FLOAT_MAT3:
- return "float3x3";
- case GL_FLOAT_MAT4:
- return "float4x4";
- case GL_FLOAT_MAT2x3:
- return "float2x3";
- case GL_FLOAT_MAT3x2:
- return "float3x2";
- case GL_FLOAT_MAT2x4:
- return "float2x4";
- case GL_FLOAT_MAT4x2:
- return "float4x2";
- case GL_FLOAT_MAT3x4:
- return "float3x4";
- case GL_FLOAT_MAT4x3:
- return "float4x3";
- default:
- UNREACHABLE();
- return "not-matrix-type";
- }
-}
-
-void HLSLTypeString(std::ostringstream &ostream, GLenum type)
-{
- if (gl::IsMatrixType(type))
- {
- ostream << HLSLMatrixTypeString(type);
- return;
- }
-
- HLSLComponentTypeString(ostream, gl::VariableComponentType(type),
- gl::VariableComponentCount(type));
-}
-
-const PixelShaderOutputVariable *FindOutputAtLocation(
- const std::vector<PixelShaderOutputVariable> &outputVariables,
- unsigned int location)
-{
- for (size_t variableIndex = 0; variableIndex < outputVariables.size(); ++variableIndex)
- {
- if (outputVariables[variableIndex].outputIndex == location)
- {
- return &outputVariables[variableIndex];
- }
- }
-
- return nullptr;
-}
-
-void WriteArrayString(std::ostringstream &strstr, unsigned int i)
-{
- static_assert(GL_INVALID_INDEX == UINT_MAX,
- "GL_INVALID_INDEX must be equal to the max unsigned int.");
- if (i == UINT_MAX)
- {
- return;
- }
-
- strstr << "[";
- strstr << i;
- strstr << "]";
-}
-
-constexpr const char *VERTEX_ATTRIBUTE_STUB_STRING = "@@ VERTEX ATTRIBUTES @@";
-constexpr const char *PIXEL_OUTPUT_STUB_STRING = "@@ PIXEL OUTPUT @@";
-} // anonymous namespace
-
-// BuiltinInfo implementation
-
-BuiltinInfo::BuiltinInfo() = default;
-BuiltinInfo::~BuiltinInfo() = default;
-
-// DynamicHLSL implementation
-
-DynamicHLSL::DynamicHLSL(RendererD3D *const renderer) : mRenderer(renderer)
-{
-}
-
-std::string DynamicHLSL::generateVertexShaderForInputLayout(
- const std::string &sourceShader,
- const InputLayout &inputLayout,
- const std::vector<sh::Attribute> &shaderAttributes) const
-{
- std::ostringstream structStream;
- std::ostringstream initStream;
-
- structStream << "struct VS_INPUT\n"
- << "{\n";
-
- int semanticIndex = 0;
- unsigned int inputIndex = 0;
-
- // If gl_PointSize is used in the shader then pointsprites rendering is expected.
- // If the renderer does not support Geometry shaders then Instanced PointSprite emulation
- // must be used.
- bool usesPointSize = sourceShader.find("GL_USES_POINT_SIZE") != std::string::npos;
- bool useInstancedPointSpriteEmulation =
- usesPointSize && mRenderer->getWorkarounds().useInstancedPointSpriteEmulation;
-
- // Instanced PointSprite emulation requires additional entries in the
- // VS_INPUT structure to support the vertices that make up the quad vertices.
- // These values must be in sync with the cooresponding values added during inputlayout creation
- // in InputLayoutCache::applyVertexBuffers().
- //
- // The additional entries must appear first in the VS_INPUT layout because
- // Windows Phone 8 era devices require per vertex data to physically come
- // before per instance data in the shader.
- if (useInstancedPointSpriteEmulation)
- {
- structStream << " float3 spriteVertexPos : SPRITEPOSITION0;\n"
- << " float2 spriteTexCoord : SPRITETEXCOORD0;\n";
- }
-
- for (size_t attributeIndex = 0; attributeIndex < shaderAttributes.size(); ++attributeIndex)
- {
- const sh::Attribute &shaderAttribute = shaderAttributes[attributeIndex];
- if (!shaderAttribute.name.empty())
- {
- ASSERT(inputIndex < MAX_VERTEX_ATTRIBS);
- VertexFormatType vertexFormatType =
- inputIndex < inputLayout.size() ? inputLayout[inputIndex] : VERTEX_FORMAT_INVALID;
-
- // HLSL code for input structure
- if (IsMatrixType(shaderAttribute.type))
- {
- // Matrix types are always transposed
- structStream << " "
- << HLSLMatrixTypeString(TransposeMatrixType(shaderAttribute.type));
- }
- else
- {
- GLenum componentType = mRenderer->getVertexComponentType(vertexFormatType);
-
- if (shaderAttribute.name == "gl_InstanceID" ||
- shaderAttribute.name == "gl_VertexID")
- {
- // The input types of the instance ID and vertex ID in HLSL (uint) differs from
- // the ones in ESSL (int).
- structStream << " uint";
- }
- else
- {
- structStream << " ";
- HLSLComponentTypeString(structStream, componentType,
- VariableComponentCount(shaderAttribute.type));
- }
- }
-
- structStream << " " << DecorateVariable(shaderAttribute.name) << " : ";
-
- if (shaderAttribute.name == "gl_InstanceID")
- {
- structStream << "SV_InstanceID";
- }
- else if (shaderAttribute.name == "gl_VertexID")
- {
- structStream << "SV_VertexID";
- }
- else
- {
- structStream << "TEXCOORD" << semanticIndex;
- semanticIndex += VariableRegisterCount(shaderAttribute.type);
- }
-
- structStream << ";\n";
-
- // HLSL code for initialization
- initStream << " " << DecorateVariable(shaderAttribute.name) << " = ";
-
- // Mismatched vertex attribute to vertex input may result in an undefined
- // data reinterpretation (eg for pure integer->float, float->pure integer)
- // TODO: issue warning with gl debug info extension, when supported
- if (IsMatrixType(shaderAttribute.type) ||
- (mRenderer->getVertexConversionType(vertexFormatType) & VERTEX_CONVERT_GPU) != 0)
- {
- GenerateAttributeConversionHLSL(vertexFormatType, shaderAttribute, initStream);
- }
- else
- {
- initStream << "input." << DecorateVariable(shaderAttribute.name);
- }
-
- initStream << ";\n";
-
- inputIndex += VariableRowCount(TransposeMatrixType(shaderAttribute.type));
- }
- }
-
- structStream << "};\n"
- "\n"
- "void initAttributes(VS_INPUT input)\n"
- "{\n"
- << initStream.str() << "}\n";
-
- std::string vertexHLSL(sourceShader);
-
- bool success =
- angle::ReplaceSubstring(&vertexHLSL, VERTEX_ATTRIBUTE_STUB_STRING, structStream.str());
- ASSERT(success);
-
- return vertexHLSL;
-}
-
-std::string DynamicHLSL::generatePixelShaderForOutputSignature(
- const std::string &sourceShader,
- const std::vector<PixelShaderOutputVariable> &outputVariables,
- bool usesFragDepth,
- const std::vector<GLenum> &outputLayout) const
-{
- const int shaderModel = mRenderer->getMajorShaderModel();
- std::string targetSemantic = (shaderModel >= 4) ? "SV_TARGET" : "COLOR";
- std::string depthSemantic = (shaderModel >= 4) ? "SV_Depth" : "DEPTH";
-
- std::ostringstream declarationStream;
- std::ostringstream copyStream;
-
- declarationStream << "struct PS_OUTPUT\n"
- "{\n";
-
- size_t numOutputs = outputLayout.size();
-
- // Workaround for HLSL 3.x: We can't do a depth/stencil only render, the runtime will complain.
- if (numOutputs == 0 && (shaderModel == 3 || !mRenderer->getShaderModelSuffix().empty()))
- {
- numOutputs = 1u;
- }
- const PixelShaderOutputVariable defaultOutput(GL_FLOAT_VEC4, "dummy", "float4(0, 0, 0, 1)", 0);
-
- for (size_t layoutIndex = 0; layoutIndex < numOutputs; ++layoutIndex)
- {
- GLenum binding = outputLayout.empty() ? GL_COLOR_ATTACHMENT0 : outputLayout[layoutIndex];
-
- if (binding != GL_NONE)
- {
- unsigned int location = (binding - GL_COLOR_ATTACHMENT0);
-
- const PixelShaderOutputVariable *outputVariable =
- outputLayout.empty() ? &defaultOutput
- : FindOutputAtLocation(outputVariables, location);
-
- // OpenGL ES 3.0 spec $4.2.1
- // If [...] not all user-defined output variables are written, the values of fragment
- // colors
- // corresponding to unwritten variables are similarly undefined.
- if (outputVariable)
- {
- declarationStream << " ";
- HLSLTypeString(declarationStream, outputVariable->type);
- declarationStream << " " << outputVariable->name << " : " << targetSemantic
- << static_cast<int>(layoutIndex) << ";\n";
-
- copyStream << " output." << outputVariable->name << " = "
- << outputVariable->source << ";\n";
- }
- }
- }
-
- if (usesFragDepth)
- {
- declarationStream << " float gl_Depth : " << depthSemantic << ";\n";
- copyStream << " output.gl_Depth = gl_Depth; \n";
- }
-
- declarationStream << "};\n"
- "\n"
- "PS_OUTPUT generateOutput()\n"
- "{\n"
- " PS_OUTPUT output;\n"
- << copyStream.str() << " return output;\n"
- "}\n";
-
- std::string pixelHLSL(sourceShader);
-
- bool success =
- angle::ReplaceSubstring(&pixelHLSL, PIXEL_OUTPUT_STUB_STRING, declarationStream.str());
- ASSERT(success);
-
- return pixelHLSL;
-}
-
-void DynamicHLSL::generateVaryingLinkHLSL(const VaryingPacking &varyingPacking,
- const BuiltinInfo &builtins,
- bool programUsesPointSize,
- std::ostringstream &hlslStream) const
-{
- ASSERT(builtins.dxPosition.enabled);
- hlslStream << "{\n"
- << " float4 dx_Position : " << builtins.dxPosition.str() << ";\n";
-
- if (builtins.glPosition.enabled)
- {
- hlslStream << " float4 gl_Position : " << builtins.glPosition.str() << ";\n";
- }
-
- if (builtins.glFragCoord.enabled)
- {
- hlslStream << " float4 gl_FragCoord : " << builtins.glFragCoord.str() << ";\n";
- }
-
- if (builtins.glPointCoord.enabled)
- {
- hlslStream << " float2 gl_PointCoord : " << builtins.glPointCoord.str() << ";\n";
- }
-
- if (builtins.glPointSize.enabled)
- {
- hlslStream << " float gl_PointSize : " << builtins.glPointSize.str() << ";\n";
- }
-
- if (builtins.glViewIDOVR.enabled)
- {
- hlslStream << " nointerpolation uint gl_ViewID_OVR : " << builtins.glViewIDOVR.str()
- << ";\n";
- }
-
- if (builtins.glViewportIndex.enabled)
- {
- hlslStream << " nointerpolation uint gl_ViewportIndex : "
- << builtins.glViewportIndex.str() << ";\n";
- }
-
- if (builtins.glLayer.enabled)
- {
- hlslStream << " nointerpolation uint gl_Layer : " << builtins.glLayer.str() << ";\n";
- }
-
- std::string varyingSemantic =
- GetVaryingSemantic(mRenderer->getMajorShaderModel(), programUsesPointSize);
-
- for (const PackedVaryingRegister &registerInfo : varyingPacking.getRegisterList())
- {
- const auto &varying = *registerInfo.packedVarying->varying;
- ASSERT(!varying.isStruct());
-
- // TODO: Add checks to ensure D3D interpolation modifiers don't result in too many
- // registers being used.
- // For example, if there are N registers, and we have N vec3 varyings and 1 float
- // varying, then D3D will pack them into N registers.
- // If the float varying has the 'nointerpolation' modifier on it then we would need
- // N + 1 registers, and D3D compilation will fail.
-
- switch (registerInfo.packedVarying->interpolation)
- {
- case sh::INTERPOLATION_SMOOTH:
- hlslStream << " ";
- break;
- case sh::INTERPOLATION_FLAT:
- hlslStream << " nointerpolation ";
- break;
- case sh::INTERPOLATION_CENTROID:
- hlslStream << " centroid ";
- break;
- default:
- UNREACHABLE();
- }
-
- GLenum transposedType = gl::TransposeMatrixType(varying.type);
- GLenum componentType = gl::VariableComponentType(transposedType);
- int columnCount = gl::VariableColumnCount(transposedType);
- HLSLComponentTypeString(hlslStream, componentType, columnCount);
- unsigned int semanticIndex = registerInfo.semanticIndex;
- hlslStream << " v" << semanticIndex << " : " << varyingSemantic << semanticIndex << ";\n";
- }
-
- hlslStream << "};\n";
-}
-
-void DynamicHLSL::generateShaderLinkHLSL(const gl::Context *context,
- const gl::ProgramState &programData,
- const ProgramD3DMetadata &programMetadata,
- const VaryingPacking &varyingPacking,
- const BuiltinVaryingsD3D &builtinsD3D,
- std::string *pixelHLSL,
- std::string *vertexHLSL) const
-{
- ASSERT(pixelHLSL->empty() && vertexHLSL->empty());
-
- const auto &data = context->getContextState();
- gl::Shader *vertexShaderGL = programData.getAttachedVertexShader();
- gl::Shader *fragmentShaderGL = programData.getAttachedFragmentShader();
- const ShaderD3D *fragmentShader = GetImplAs<ShaderD3D>(fragmentShaderGL);
- const int shaderModel = mRenderer->getMajorShaderModel();
-
- // usesViewScale() isn't supported in the D3D9 renderer
- ASSERT(shaderModel >= 4 || !programMetadata.usesViewScale());
-
- bool useInstancedPointSpriteEmulation =
- programMetadata.usesPointSize() &&
- mRenderer->getWorkarounds().useInstancedPointSpriteEmulation;
-
- // Validation done in the compiler
- ASSERT(!fragmentShader->usesFragColor() || !fragmentShader->usesFragData());
-
- std::ostringstream vertexStream;
- vertexStream << vertexShaderGL->getTranslatedSource(context);
-
- // Instanced PointSprite emulation requires additional entries originally generated in the
- // GeometryShader HLSL. These include pointsize clamp values.
- if (useInstancedPointSpriteEmulation)
- {
- vertexStream << "static float minPointSize = "
- << static_cast<int>(data.getCaps().minAliasedPointSize) << ".0f;\n"
- << "static float maxPointSize = "
- << static_cast<int>(data.getCaps().maxAliasedPointSize) << ".0f;\n";
- }
-
- // Add stub string to be replaced when shader is dynamically defined by its layout
- vertexStream << "\n" << std::string(VERTEX_ATTRIBUTE_STUB_STRING) << "\n";
-
- const auto &vertexBuiltins = builtinsD3D[gl::SHADER_VERTEX];
-
- // Write the HLSL input/output declarations
- vertexStream << "struct VS_OUTPUT\n";
- generateVaryingLinkHLSL(varyingPacking, vertexBuiltins, builtinsD3D.usesPointSize(),
- vertexStream);
- vertexStream << "\n"
- << "VS_OUTPUT main(VS_INPUT input)\n"
- << "{\n"
- << " initAttributes(input);\n";
-
- vertexStream << "\n"
- << " gl_main();\n"
- << "\n"
- << " VS_OUTPUT output;\n";
-
- if (vertexBuiltins.glPosition.enabled)
- {
- vertexStream << " output.gl_Position = gl_Position;\n";
- }
-
- if (vertexBuiltins.glViewIDOVR.enabled)
- {
- vertexStream << " output.gl_ViewID_OVR = _ViewID_OVR;\n";
- }
- if (programMetadata.hasANGLEMultiviewEnabled() && programMetadata.canSelectViewInVertexShader())
- {
- ASSERT(vertexBuiltins.glViewportIndex.enabled && vertexBuiltins.glLayer.enabled);
- vertexStream << " if (multiviewSelectViewportIndex)\n"
- << " {\n"
- << " output.gl_ViewportIndex = _ViewID_OVR;\n"
- << " } else {\n"
- << " output.gl_ViewportIndex = 0;\n"
- << " output.gl_Layer = _ViewID_OVR;\n"
- << " }\n";
- }
-
- // On D3D9 or D3D11 Feature Level 9, we need to emulate large viewports using dx_ViewAdjust.
- if (shaderModel >= 4 && mRenderer->getShaderModelSuffix() == "")
- {
- vertexStream << " output.dx_Position.x = gl_Position.x;\n";
-
- if (programMetadata.usesViewScale())
- {
- // This code assumes that dx_ViewScale.y = -1.0f when rendering to texture, and +1.0f
- // when rendering to the default framebuffer. No other values are valid.
- vertexStream << " output.dx_Position.y = dx_ViewScale.y * gl_Position.y;\n";
- }
- else
- {
- vertexStream << " output.dx_Position.y = - gl_Position.y;\n";
- }
-
- vertexStream << " output.dx_Position.z = (gl_Position.z + gl_Position.w) * 0.5;\n"
- << " output.dx_Position.w = gl_Position.w;\n";
- }
- else
- {
- vertexStream << " output.dx_Position.x = gl_Position.x * dx_ViewAdjust.z + "
- "dx_ViewAdjust.x * gl_Position.w;\n";
-
- // If usesViewScale() is true and we're using the D3D11 renderer via Feature Level 9_*,
- // then we need to multiply the gl_Position.y by the viewScale.
- // usesViewScale() isn't supported when using the D3D9 renderer.
- if (programMetadata.usesViewScale() &&
- (shaderModel >= 4 && mRenderer->getShaderModelSuffix() != ""))
- {
- vertexStream << " output.dx_Position.y = dx_ViewScale.y * (gl_Position.y * "
- "dx_ViewAdjust.w + dx_ViewAdjust.y * gl_Position.w);\n";
- }
- else
- {
- vertexStream << " output.dx_Position.y = -(gl_Position.y * dx_ViewAdjust.w + "
- "dx_ViewAdjust.y * gl_Position.w);\n";
- }
-
- vertexStream << " output.dx_Position.z = (gl_Position.z + gl_Position.w) * 0.5;\n"
- << " output.dx_Position.w = gl_Position.w;\n";
- }
-
- // We don't need to output gl_PointSize if we use are emulating point sprites via instancing.
- if (vertexBuiltins.glPointSize.enabled)
- {
- vertexStream << " output.gl_PointSize = gl_PointSize;\n";
- }
-
- if (vertexBuiltins.glFragCoord.enabled)
- {
- vertexStream << " output.gl_FragCoord = gl_Position;\n";
- }
-
- for (const PackedVaryingRegister &registerInfo : varyingPacking.getRegisterList())
- {
- const auto &packedVarying = *registerInfo.packedVarying;
- const auto &varying = *packedVarying.varying;
- ASSERT(!varying.isStruct());
-
- vertexStream << " output.v" << registerInfo.semanticIndex << " = ";
-
- if (packedVarying.isStructField())
- {
- vertexStream << DecorateVariable(packedVarying.parentStructName) << ".";
- }
-
- vertexStream << DecorateVariable(varying.name);
-
- if (varying.isArray())
- {
- WriteArrayString(vertexStream, registerInfo.varyingArrayIndex);
- }
-
- if (VariableRowCount(varying.type) > 1)
- {
- WriteArrayString(vertexStream, registerInfo.varyingRowIndex);
- }
-
- vertexStream << ";\n";
- }
-
- // Instanced PointSprite emulation requires additional entries to calculate
- // the final output vertex positions of the quad that represents each sprite.
- if (useInstancedPointSpriteEmulation)
- {
- vertexStream << "\n"
- << " gl_PointSize = clamp(gl_PointSize, minPointSize, maxPointSize);\n";
-
- vertexStream << " output.dx_Position.x += (input.spriteVertexPos.x * gl_PointSize / "
- "(dx_ViewCoords.x*2)) * output.dx_Position.w;";
-
- if (programMetadata.usesViewScale())
- {
- // Multiply by ViewScale to invert the rendering when appropriate
- vertexStream << " output.dx_Position.y += (-dx_ViewScale.y * "
- "input.spriteVertexPos.y * gl_PointSize / (dx_ViewCoords.y*2)) * "
- "output.dx_Position.w;";
- }
- else
- {
- vertexStream << " output.dx_Position.y += (input.spriteVertexPos.y * gl_PointSize / "
- "(dx_ViewCoords.y*2)) * output.dx_Position.w;";
- }
-
- vertexStream
- << " output.dx_Position.z += input.spriteVertexPos.z * output.dx_Position.w;\n";
-
- if (programMetadata.usesPointCoord())
- {
- vertexStream << "\n"
- << " output.gl_PointCoord = input.spriteTexCoord;\n";
- }
- }
-
- // Renderers that enable instanced pointsprite emulation require the vertex shader output member
- // gl_PointCoord to be set to a default value if used without gl_PointSize. 0.5,0.5 is the same
- // default value used in the generated pixel shader.
- if (programMetadata.usesInsertedPointCoordValue())
- {
- ASSERT(!useInstancedPointSpriteEmulation);
- vertexStream << "\n"
- << " output.gl_PointCoord = float2(0.5, 0.5);\n";
- }
-
- vertexStream << "\n"
- << " return output;\n"
- << "}\n";
-
- const auto &pixelBuiltins = builtinsD3D[gl::SHADER_FRAGMENT];
-
- std::ostringstream pixelStream;
- pixelStream << fragmentShaderGL->getTranslatedSource(context);
- pixelStream << "struct PS_INPUT\n";
- generateVaryingLinkHLSL(varyingPacking, pixelBuiltins, builtinsD3D.usesPointSize(),
- pixelStream);
- pixelStream << "\n";
-
- pixelStream << std::string(PIXEL_OUTPUT_STUB_STRING) << "\n";
-
- if (fragmentShader->usesFrontFacing())
- {
- if (shaderModel >= 4)
- {
- pixelStream << "PS_OUTPUT main(PS_INPUT input, bool isFrontFace : SV_IsFrontFace)\n"
- << "{\n";
- }
- else
- {
- pixelStream << "PS_OUTPUT main(PS_INPUT input, float vFace : VFACE)\n"
- << "{\n";
- }
- }
- else
- {
- pixelStream << "PS_OUTPUT main(PS_INPUT input)\n"
- << "{\n";
- }
-
- if (fragmentShader->usesViewID())
- {
- ASSERT(pixelBuiltins.glViewIDOVR.enabled);
- pixelStream << " _ViewID_OVR = input.gl_ViewID_OVR;\n";
- }
-
- if (pixelBuiltins.glFragCoord.enabled)
- {
- pixelStream << " float rhw = 1.0 / input.gl_FragCoord.w;\n";
-
- // Certain Shader Models (4_0+ and 3_0) allow reading from dx_Position in the pixel shader.
- // Other Shader Models (4_0_level_9_3 and 2_x) don't support this, so we emulate it using
- // dx_ViewCoords.
- if (shaderModel >= 4 && mRenderer->getShaderModelSuffix() == "")
- {
- pixelStream << " gl_FragCoord.x = input.dx_Position.x;\n"
- << " gl_FragCoord.y = input.dx_Position.y;\n";
- }
- else if (shaderModel == 3)
- {
- pixelStream << " gl_FragCoord.x = input.dx_Position.x + 0.5;\n"
- << " gl_FragCoord.y = input.dx_Position.y + 0.5;\n";
- }
- else
- {
- // dx_ViewCoords contains the viewport width/2, height/2, center.x and center.y. See
- // Renderer::setViewport()
- pixelStream << " gl_FragCoord.x = (input.gl_FragCoord.x * rhw) * dx_ViewCoords.x + "
- "dx_ViewCoords.z;\n"
- << " gl_FragCoord.y = (input.gl_FragCoord.y * rhw) * dx_ViewCoords.y + "
- "dx_ViewCoords.w;\n";
- }
-
- if (programMetadata.usesViewScale())
- {
- // For Feature Level 9_3 and below, we need to correct gl_FragCoord.y to account
- // for dx_ViewScale. On Feature Level 10_0+, gl_FragCoord.y is calculated above using
- // dx_ViewCoords and is always correct irrespective of dx_ViewScale's value.
- // NOTE: usesViewScale() can only be true on D3D11 (i.e. Shader Model 4.0+).
- if (shaderModel >= 4 && mRenderer->getShaderModelSuffix() == "")
- {
- // Some assumptions:
- // - dx_ViewScale.y = -1.0f when rendering to texture
- // - dx_ViewScale.y = +1.0f when rendering to the default framebuffer
- // - gl_FragCoord.y has been set correctly above.
- //
- // When rendering to the backbuffer, the code inverts gl_FragCoord's y coordinate.
- // This involves subtracting the y coordinate from the height of the area being
- // rendered to.
- //
- // First we calculate the height of the area being rendered to:
- // render_area_height = (2.0f / (1.0f - input.gl_FragCoord.y * rhw)) *
- // gl_FragCoord.y
- //
- // Note that when we're rendering to default FB, we want our output to be
- // equivalent to:
- // "gl_FragCoord.y = render_area_height - gl_FragCoord.y"
- //
- // When we're rendering to a texture, we want our output to be equivalent to:
- // "gl_FragCoord.y = gl_FragCoord.y;"
- //
- // If we set scale_factor = ((1.0f + dx_ViewScale.y) / 2.0f), then notice that
- // - When rendering to default FB: scale_factor = 1.0f
- // - When rendering to texture: scale_factor = 0.0f
- //
- // Therefore, we can get our desired output by setting:
- // "gl_FragCoord.y = scale_factor * render_area_height - dx_ViewScale.y *
- // gl_FragCoord.y"
- //
- // Simplifying, this becomes:
- pixelStream
- << " gl_FragCoord.y = (1.0f + dx_ViewScale.y) * gl_FragCoord.y /"
- "(1.0f - input.gl_FragCoord.y * rhw) - dx_ViewScale.y * gl_FragCoord.y;\n";
- }
- }
-
- pixelStream << " gl_FragCoord.z = (input.gl_FragCoord.z * rhw) * dx_DepthFront.x + "
- "dx_DepthFront.y;\n"
- << " gl_FragCoord.w = rhw;\n";
- }
-
- if (pixelBuiltins.glPointCoord.enabled && shaderModel >= 3)
- {
- pixelStream << " gl_PointCoord.x = input.gl_PointCoord.x;\n"
- << " gl_PointCoord.y = 1.0 - input.gl_PointCoord.y;\n";
- }
-
- if (fragmentShader->usesFrontFacing())
- {
- if (shaderModel <= 3)
- {
- pixelStream << " gl_FrontFacing = (vFace * dx_DepthFront.z >= 0.0);\n";
- }
- else
- {
- pixelStream << " gl_FrontFacing = isFrontFace;\n";
- }
- }
-
- for (const PackedVaryingRegister &registerInfo : varyingPacking.getRegisterList())
- {
- const auto &packedVarying = *registerInfo.packedVarying;
- const auto &varying = *packedVarying.varying;
- ASSERT(!varying.isBuiltIn() && !varying.isStruct());
-
- // Don't reference VS-only transform feedback varyings in the PS. Note that we're relying on
- // that the staticUse flag is set according to usage in the fragment shader.
- if (packedVarying.vertexOnly || !varying.staticUse)
- continue;
-
- pixelStream << " ";
-
- if (packedVarying.isStructField())
- {
- pixelStream << DecorateVariable(packedVarying.parentStructName) << ".";
- }
-
- pixelStream << DecorateVariable(varying.name);
-
- if (varying.isArray())
- {
- WriteArrayString(pixelStream, registerInfo.varyingArrayIndex);
- }
-
- GLenum transposedType = TransposeMatrixType(varying.type);
- if (VariableRowCount(transposedType) > 1)
- {
- WriteArrayString(pixelStream, registerInfo.varyingRowIndex);
- }
-
- pixelStream << " = input.v" << registerInfo.semanticIndex;
-
- switch (VariableColumnCount(transposedType))
- {
- case 1:
- pixelStream << ".x";
- break;
- case 2:
- pixelStream << ".xy";
- break;
- case 3:
- pixelStream << ".xyz";
- break;
- case 4:
- break;
- default:
- UNREACHABLE();
- }
- pixelStream << ";\n";
- }
-
- pixelStream << "\n"
- << " gl_main();\n"
- << "\n"
- << " return generateOutput();\n"
- << "}\n";
-
- *vertexHLSL = vertexStream.str();
- *pixelHLSL = pixelStream.str();
-}
-
-std::string DynamicHLSL::generateComputeShaderLinkHLSL(const gl::Context *context,
- const gl::ProgramState &programData) const
-{
- gl::Shader *computeShaderGL = programData.getAttachedComputeShader();
- std::stringstream computeStream;
- std::string translatedSource = computeShaderGL->getTranslatedSource(context);
- computeStream << translatedSource;
-
- bool usesWorkGroupID = translatedSource.find("GL_USES_WORK_GROUP_ID") != std::string::npos;
- bool usesLocalInvocationID =
- translatedSource.find("GL_USES_LOCAL_INVOCATION_ID") != std::string::npos;
- bool usesGlobalInvocationID =
- translatedSource.find("GL_USES_GLOBAL_INVOCATION_ID") != std::string::npos;
- bool usesLocalInvocationIndex =
- translatedSource.find("GL_USES_LOCAL_INVOCATION_INDEX") != std::string::npos;
-
- computeStream << "\nstruct CS_INPUT\n{\n";
- if (usesWorkGroupID)
- {
- computeStream << " uint3 dx_WorkGroupID : "
- << "SV_GroupID;\n";
- }
-
- if (usesLocalInvocationID)
- {
- computeStream << " uint3 dx_LocalInvocationID : "
- << "SV_GroupThreadID;\n";
- }
-
- if (usesGlobalInvocationID)
- {
- computeStream << " uint3 dx_GlobalInvocationID : "
- << "SV_DispatchThreadID;\n";
- }
-
- if (usesLocalInvocationIndex)
- {
- computeStream << " uint dx_LocalInvocationIndex : "
- << "SV_GroupIndex;\n";
- }
-
- computeStream << "};\n\n";
-
- const sh::WorkGroupSize &localSize = computeShaderGL->getWorkGroupSize(context);
- computeStream << "[numthreads(" << localSize[0] << ", " << localSize[1] << ", " << localSize[2]
- << ")]\n";
-
- computeStream << "void main(CS_INPUT input)\n"
- << "{\n";
-
- if (usesWorkGroupID)
- {
- computeStream << " gl_WorkGroupID = input.dx_WorkGroupID;\n";
- }
- if (usesLocalInvocationID)
- {
- computeStream << " gl_LocalInvocationID = input.dx_LocalInvocationID;\n";
- }
- if (usesGlobalInvocationID)
- {
- computeStream << " gl_GlobalInvocationID = input.dx_GlobalInvocationID;\n";
- }
- if (usesLocalInvocationIndex)
- {
- computeStream << " gl_LocalInvocationIndex = input.dx_LocalInvocationIndex;\n";
- }
-
- computeStream << "\n"
- << " gl_main();\n"
- << "}\n";
-
- return computeStream.str();
-}
-
-std::string DynamicHLSL::generateGeometryShaderPreamble(const VaryingPacking &varyingPacking,
- const BuiltinVaryingsD3D &builtinsD3D,
- const bool hasANGLEMultiviewEnabled,
- const bool selectViewInVS) const
-{
- ASSERT(mRenderer->getMajorShaderModel() >= 4);
-
- std::ostringstream preambleStream;
-
- const auto &vertexBuiltins = builtinsD3D[gl::SHADER_VERTEX];
-
- preambleStream << "struct GS_INPUT\n";
- generateVaryingLinkHLSL(varyingPacking, vertexBuiltins, builtinsD3D.usesPointSize(),
- preambleStream);
- preambleStream << "\n"
- << "struct GS_OUTPUT\n";
- generateVaryingLinkHLSL(varyingPacking, builtinsD3D[gl::SHADER_GEOMETRY],
- builtinsD3D.usesPointSize(), preambleStream);
- preambleStream
- << "\n"
- << "void copyVertex(inout GS_OUTPUT output, GS_INPUT input, GS_INPUT flatinput)\n"
- << "{\n"
- << " output.gl_Position = input.gl_Position;\n";
-
- if (vertexBuiltins.glPointSize.enabled)
- {
- preambleStream << " output.gl_PointSize = input.gl_PointSize;\n";
- }
-
- if (hasANGLEMultiviewEnabled)
- {
- preambleStream << " output.gl_ViewID_OVR = input.gl_ViewID_OVR;\n";
- if (selectViewInVS)
- {
- ASSERT(builtinsD3D[gl::SHADER_GEOMETRY].glViewportIndex.enabled &&
- builtinsD3D[gl::SHADER_GEOMETRY].glLayer.enabled);
-
- // If the view is already selected in the VS, then we just pass the gl_ViewportIndex and
- // gl_Layer to the output.
- preambleStream << " output.gl_ViewportIndex = input.gl_ViewportIndex;\n"
- << " output.gl_Layer = input.gl_Layer;\n";
- }
- }
-
- for (const PackedVaryingRegister &varyingRegister : varyingPacking.getRegisterList())
- {
- preambleStream << " output.v" << varyingRegister.semanticIndex << " = ";
- if (varyingRegister.packedVarying->interpolation == sh::INTERPOLATION_FLAT)
- {
- preambleStream << "flat";
- }
- preambleStream << "input.v" << varyingRegister.semanticIndex << "; \n";
- }
-
- if (vertexBuiltins.glFragCoord.enabled)
- {
- preambleStream << " output.gl_FragCoord = input.gl_FragCoord;\n";
- }
-
- // Only write the dx_Position if we aren't using point sprites
- preambleStream << "#ifndef ANGLE_POINT_SPRITE_SHADER\n"
- << " output.dx_Position = input.dx_Position;\n"
- << "#endif // ANGLE_POINT_SPRITE_SHADER\n"
- << "}\n";
-
- if (hasANGLEMultiviewEnabled && !selectViewInVS)
- {
- ASSERT(builtinsD3D[gl::SHADER_GEOMETRY].glViewportIndex.enabled &&
- builtinsD3D[gl::SHADER_GEOMETRY].glLayer.enabled);
-
- // According to the HLSL reference, using SV_RenderTargetArrayIndex is only valid if the
- // render target is an array resource. Because of this we do not write to gl_Layer if we are
- // taking the side-by-side code path. We still select the viewport index in the layered code
- // path as that is always valid. See:
- // https://msdn.microsoft.com/en-us/library/windows/desktop/bb509647(v=vs.85).aspx
- preambleStream << "\n"
- << "void selectView(inout GS_OUTPUT output, GS_INPUT input)\n"
- << "{\n"
- << " if (multiviewSelectViewportIndex)\n"
- << " {\n"
- << " output.gl_ViewportIndex = input.gl_ViewID_OVR;\n"
- << " } else {\n"
- << " output.gl_ViewportIndex = 0;\n"
- << " output.gl_Layer = input.gl_ViewID_OVR;\n"
- << " }\n"
- << "}\n";
- }
-
- return preambleStream.str();
-}
-
-std::string DynamicHLSL::generateGeometryShaderHLSL(const gl::Context *context,
- gl::PrimitiveType primitiveType,
- const gl::ProgramState &programData,
- const bool useViewScale,
- const bool hasANGLEMultiviewEnabled,
- const bool selectViewInVS,
- const bool pointSpriteEmulation,
- const std::string &preambleString) const
-{
- ASSERT(mRenderer->getMajorShaderModel() >= 4);
-
- std::stringstream shaderStream;
-
- const bool pointSprites = (primitiveType == PRIMITIVE_POINTS) && pointSpriteEmulation;
- const bool usesPointCoord = preambleString.find("gl_PointCoord") != std::string::npos;
-
- const char *inputPT = nullptr;
- const char *outputPT = nullptr;
- int inputSize = 0;
- int maxVertexOutput = 0;
-
- switch (primitiveType)
- {
- case PRIMITIVE_POINTS:
- inputPT = "point";
- inputSize = 1;
-
- if (pointSprites)
- {
- outputPT = "Triangle";
- maxVertexOutput = 4;
- }
- else
- {
- outputPT = "Point";
- maxVertexOutput = 1;
- }
-
- break;
-
- case PRIMITIVE_LINES:
- case PRIMITIVE_LINE_STRIP:
- case PRIMITIVE_LINE_LOOP:
- inputPT = "line";
- outputPT = "Line";
- inputSize = 2;
- maxVertexOutput = 2;
- break;
-
- case PRIMITIVE_TRIANGLES:
- case PRIMITIVE_TRIANGLE_STRIP:
- case PRIMITIVE_TRIANGLE_FAN:
- inputPT = "triangle";
- outputPT = "Triangle";
- inputSize = 3;
- maxVertexOutput = 3;
- break;
-
- default:
- UNREACHABLE();
- break;
- }
-
- if (pointSprites || hasANGLEMultiviewEnabled)
- {
- shaderStream << "cbuffer DriverConstants : register(b0)\n"
- "{\n";
-
- if (pointSprites)
- {
- shaderStream << " float4 dx_ViewCoords : packoffset(c1);\n";
- if (useViewScale)
- {
- shaderStream << " float2 dx_ViewScale : packoffset(c3);\n";
- }
- }
-
- if (hasANGLEMultiviewEnabled)
- {
- // We have to add a value which we can use to keep track of which multi-view code path
- // is to be selected in the GS.
- shaderStream << " float multiviewSelectViewportIndex : packoffset(c3.z);\n";
- }
-
- shaderStream << "};\n\n";
- }
-
- if (pointSprites)
- {
- shaderStream << "#define ANGLE_POINT_SPRITE_SHADER\n"
- "\n"
- "static float2 pointSpriteCorners[] = \n"
- "{\n"
- " float2( 0.5f, -0.5f),\n"
- " float2( 0.5f, 0.5f),\n"
- " float2(-0.5f, -0.5f),\n"
- " float2(-0.5f, 0.5f)\n"
- "};\n"
- "\n"
- "static float2 pointSpriteTexcoords[] = \n"
- "{\n"
- " float2(1.0f, 1.0f),\n"
- " float2(1.0f, 0.0f),\n"
- " float2(0.0f, 1.0f),\n"
- " float2(0.0f, 0.0f)\n"
- "};\n"
- "\n"
- "static float minPointSize = "
- << static_cast<int>(context->getCaps().minAliasedPointSize)
- << ".0f;\n"
- "static float maxPointSize = "
- << static_cast<int>(context->getCaps().maxAliasedPointSize) << ".0f;\n"
- << "\n";
- }
-
- shaderStream << preambleString << "\n"
- << "[maxvertexcount(" << maxVertexOutput << ")]\n"
- << "void main(" << inputPT << " GS_INPUT input[" << inputSize << "], ";
-
- if (primitiveType == PRIMITIVE_TRIANGLE_STRIP)
- {
- shaderStream << "uint primitiveID : SV_PrimitiveID, ";
- }
-
- shaderStream << " inout " << outputPT << "Stream<GS_OUTPUT> outStream)\n"
- << "{\n"
- << " GS_OUTPUT output = (GS_OUTPUT)0;\n";
-
- if (primitiveType == PRIMITIVE_TRIANGLE_STRIP)
- {
- shaderStream << " uint lastVertexIndex = (primitiveID % 2 == 0 ? 2 : 1);\n";
- }
- else
- {
- shaderStream << " uint lastVertexIndex = " << (inputSize - 1) << ";\n";
- }
-
- for (int vertexIndex = 0; vertexIndex < inputSize; ++vertexIndex)
- {
- shaderStream << " copyVertex(output, input[" << vertexIndex
- << "], input[lastVertexIndex]);\n";
- if (hasANGLEMultiviewEnabled && !selectViewInVS)
- {
- shaderStream << " selectView(output, input[" << vertexIndex << "]);\n";
- }
- if (!pointSprites)
- {
- ASSERT(inputSize == maxVertexOutput);
- shaderStream << " outStream.Append(output);\n";
- }
- }
-
- if (pointSprites)
- {
- shaderStream << "\n"
- " float4 dx_Position = input[0].dx_Position;\n"
- " float gl_PointSize = clamp(input[0].gl_PointSize, minPointSize, "
- "maxPointSize);\n"
- " float2 viewportScale = float2(1.0f / dx_ViewCoords.x, 1.0f / "
- "dx_ViewCoords.y) * dx_Position.w;\n";
-
- for (int corner = 0; corner < 4; corner++)
- {
- if (useViewScale)
- {
- shaderStream << " \n"
- " output.dx_Position = dx_Position + float4(1.0f, "
- "-dx_ViewScale.y, 1.0f, 1.0f)"
- " * float4(pointSpriteCorners["
- << corner << "] * viewportScale * gl_PointSize, 0.0f, 0.0f);\n";
- }
- else
- {
- shaderStream << "\n"
- " output.dx_Position = dx_Position + float4(pointSpriteCorners["
- << corner << "] * viewportScale * gl_PointSize, 0.0f, 0.0f);\n";
- }
-
- if (usesPointCoord)
- {
- shaderStream << " output.gl_PointCoord = pointSpriteTexcoords[" << corner
- << "];\n";
- }
-
- shaderStream << " outStream.Append(output);\n";
- }
- }
-
- shaderStream << " \n"
- " outStream.RestartStrip();\n"
- "}\n";
-
- return shaderStream.str();
-}
-
-// static
-void DynamicHLSL::GenerateAttributeConversionHLSL(gl::VertexFormatType vertexFormatType,
- const sh::ShaderVariable &shaderAttrib,
- std::ostringstream &outStream)
-{
- // Matrix
- if (IsMatrixType(shaderAttrib.type))
- {
- outStream << "transpose(input." << DecorateVariable(shaderAttrib.name) << ")";
- return;
- }
-
- GLenum shaderComponentType = VariableComponentType(shaderAttrib.type);
- int shaderComponentCount = VariableComponentCount(shaderAttrib.type);
- const gl::VertexFormat &vertexFormat = gl::GetVertexFormatFromType(vertexFormatType);
-
- // Perform integer to float conversion (if necessary)
- if (shaderComponentType == GL_FLOAT && vertexFormat.type != GL_FLOAT)
- {
- // TODO: normalization for 32-bit integer formats
- ASSERT(!vertexFormat.normalized && !vertexFormat.pureInteger);
- outStream << "float" << shaderComponentCount << "(input."
- << DecorateVariable(shaderAttrib.name) << ")";
- return;
- }
-
- // No conversion necessary
- outStream << "input." << DecorateVariable(shaderAttrib.name);
-}
-
-void DynamicHLSL::getPixelShaderOutputKey(const gl::ContextState &data,
- const gl::ProgramState &programData,
- const ProgramD3DMetadata &metadata,
- std::vector<PixelShaderOutputVariable> *outPixelShaderKey)
-{
- // Two cases when writing to gl_FragColor and using ESSL 1.0:
- // - with a 3.0 context, the output color is copied to channel 0
- // - with a 2.0 context, the output color is broadcast to all channels
- bool broadcast = metadata.usesBroadcast(data);
- const unsigned int numRenderTargets =
- (broadcast || metadata.usesMultipleFragmentOuts() ? data.getCaps().maxDrawBuffers : 1);
-
- if (metadata.getMajorShaderVersion() < 300)
- {
- for (unsigned int renderTargetIndex = 0; renderTargetIndex < numRenderTargets;
- renderTargetIndex++)
- {
- PixelShaderOutputVariable outputKeyVariable;
- outputKeyVariable.type = GL_FLOAT_VEC4;
- outputKeyVariable.name = "gl_Color" + Str(renderTargetIndex);
- outputKeyVariable.source =
- broadcast ? "gl_Color[0]" : "gl_Color[" + Str(renderTargetIndex) + "]";
- outputKeyVariable.outputIndex = renderTargetIndex;
-
- outPixelShaderKey->push_back(outputKeyVariable);
- }
- }
- else
- {
- const auto &shaderOutputVars =
- metadata.getFragmentShader()->getData().getActiveOutputVariables();
-
- for (size_t outputLocationIndex = 0u;
- outputLocationIndex < programData.getOutputLocations().size(); ++outputLocationIndex)
- {
- const VariableLocation &outputLocation =
- programData.getOutputLocations().at(outputLocationIndex);
- if (!outputLocation.used())
- {
- continue;
- }
- const sh::ShaderVariable &outputVariable = shaderOutputVars[outputLocation.index];
- const std::string &variableName = "out_" + outputVariable.name;
-
- // Fragment outputs can't be arrays of arrays. ESSL 3.10 section 4.3.6.
- const std::string &elementString =
- (outputVariable.isArray() ? Str(outputLocation.arrayIndex) : "");
-
- ASSERT(outputVariable.staticUse);
-
- PixelShaderOutputVariable outputKeyVariable;
- outputKeyVariable.type = outputVariable.type;
- outputKeyVariable.name = variableName + elementString;
- outputKeyVariable.source =
- variableName +
- (outputVariable.isArray() ? ArrayString(outputLocation.arrayIndex) : "");
- outputKeyVariable.outputIndex = outputLocationIndex;
-
- outPixelShaderKey->push_back(outputKeyVariable);
- }
- }
-}
-
-// BuiltinVarying Implementation.
-BuiltinVarying::BuiltinVarying() : enabled(false), index(0), systemValue(false)
-{
-}
-
-std::string BuiltinVarying::str() const
-{
- return (systemValue ? semantic : (semantic + Str(index)));
-}
-
-void BuiltinVarying::enableSystem(const std::string &systemValueSemantic)
-{
- enabled = true;
- semantic = systemValueSemantic;
- systemValue = true;
-}
-
-void BuiltinVarying::enable(const std::string &semanticVal, unsigned int indexVal)
-{
- enabled = true;
- semantic = semanticVal;
- index = indexVal;
-}
-
-// BuiltinVaryingsD3D Implementation.
-BuiltinVaryingsD3D::BuiltinVaryingsD3D(const ProgramD3DMetadata &metadata,
- const VaryingPacking &packing)
-{
- updateBuiltins(gl::SHADER_VERTEX, metadata, packing);
- updateBuiltins(gl::SHADER_FRAGMENT, metadata, packing);
- if (metadata.getRendererMajorShaderModel() >= 4)
- {
- updateBuiltins(gl::SHADER_GEOMETRY, metadata, packing);
- }
-}
-
-BuiltinVaryingsD3D::~BuiltinVaryingsD3D() = default;
-
-void BuiltinVaryingsD3D::updateBuiltins(gl::ShaderType shaderType,
- const ProgramD3DMetadata &metadata,
- const VaryingPacking &packing)
-{
- const std::string &userSemantic = GetVaryingSemantic(metadata.getRendererMajorShaderModel(),
- metadata.usesSystemValuePointSize());
-
- unsigned int reservedSemanticIndex = packing.getMaxSemanticIndex();
-
- BuiltinInfo *builtins = &mBuiltinInfo[shaderType];
-
- if (metadata.getRendererMajorShaderModel() >= 4)
- {
- builtins->dxPosition.enableSystem("SV_Position");
- }
- else if (shaderType == gl::SHADER_FRAGMENT)
- {
- builtins->dxPosition.enableSystem("VPOS");
- }
- else
- {
- builtins->dxPosition.enableSystem("POSITION");
- }
-
- if (metadata.usesTransformFeedbackGLPosition())
- {
- builtins->glPosition.enable(userSemantic, reservedSemanticIndex++);
- }
-
- if (metadata.usesFragCoord())
- {
- builtins->glFragCoord.enable(userSemantic, reservedSemanticIndex++);
- }
-
- if (shaderType == gl::SHADER_VERTEX ? metadata.addsPointCoordToVertexShader()
- : metadata.usesPointCoord())
- {
- // SM3 reserves the TEXCOORD semantic for point sprite texcoords (gl_PointCoord)
- // In D3D11 we manually compute gl_PointCoord in the GS.
- if (metadata.getRendererMajorShaderModel() >= 4)
- {
- builtins->glPointCoord.enable(userSemantic, reservedSemanticIndex++);
- }
- else
- {
- builtins->glPointCoord.enable("TEXCOORD", 0);
- }
- }
-
- if (shaderType == gl::SHADER_VERTEX && metadata.hasANGLEMultiviewEnabled())
- {
- builtins->glViewIDOVR.enable(userSemantic, reservedSemanticIndex++);
- if (metadata.canSelectViewInVertexShader())
- {
- builtins->glViewportIndex.enableSystem("SV_ViewportArrayIndex");
- builtins->glLayer.enableSystem("SV_RenderTargetArrayIndex");
- }
- }
-
- if (shaderType == gl::SHADER_FRAGMENT && metadata.hasANGLEMultiviewEnabled())
- {
- builtins->glViewIDOVR.enable(userSemantic, reservedSemanticIndex++);
- }
-
- if (shaderType == gl::SHADER_GEOMETRY && metadata.hasANGLEMultiviewEnabled())
- {
- // Although it is possible to retrieve gl_ViewID_OVR from the value of
- // SV_ViewportArrayIndex or SV_RenderTargetArrayIndex based on the multi-view state in the
- // driver constant buffer, it is easier and cleaner to pass it as a varying.
- builtins->glViewIDOVR.enable(userSemantic, reservedSemanticIndex++);
-
- // gl_Layer and gl_ViewportIndex are necessary so that we can write to either based on the
- // multiview state in the driver constant buffer.
- builtins->glViewportIndex.enableSystem("SV_ViewportArrayIndex");
- builtins->glLayer.enableSystem("SV_RenderTargetArrayIndex");
- }
-
- // Special case: do not include PSIZE semantic in HLSL 3 pixel shaders
- if (metadata.usesSystemValuePointSize() &&
- (shaderType != gl::SHADER_FRAGMENT || metadata.getRendererMajorShaderModel() >= 4))
- {
- builtins->glPointSize.enableSystem("PSIZE");
- }
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h
deleted file mode 100644
index fe8d9cb0a3..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h
+++ /dev/null
@@ -1,175 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// DynamicHLSL.h: Interface for link and run-time HLSL generation
-//
-
-#ifndef LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_
-#define LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_
-
-#include <map>
-#include <vector>
-
-#include "angle_gl.h"
-#include "common/angleutils.h"
-#include "libANGLE/Constants.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-
-namespace sh
-{
-struct Attribute;
-struct ShaderVariable;
-}
-
-namespace gl
-{
-class InfoLog;
-struct VariableLocation;
-class VaryingPacking;
-struct VertexAttribute;
-}
-
-namespace rx
-{
-class ProgramD3DMetadata;
-class ShaderD3D;
-
-struct PixelShaderOutputVariable
-{
- PixelShaderOutputVariable() {}
- PixelShaderOutputVariable(GLenum typeIn,
- const std::string &nameIn,
- const std::string &sourceIn,
- size_t outputIndexIn)
- : type(typeIn), name(nameIn), source(sourceIn), outputIndex(outputIndexIn)
- {
- }
-
- GLenum type = GL_NONE;
- std::string name;
- std::string source;
- size_t outputIndex = 0;
-};
-
-struct BuiltinVarying final : private angle::NonCopyable
-{
- BuiltinVarying();
-
- std::string str() const;
- void enableSystem(const std::string &systemValueSemantic);
- void enable(const std::string &semanticVal, unsigned int indexVal);
-
- bool enabled;
- std::string semantic;
- unsigned int index;
- bool systemValue;
-};
-
-struct BuiltinInfo
-{
- BuiltinInfo();
- ~BuiltinInfo();
-
- BuiltinVarying dxPosition;
- BuiltinVarying glPosition;
- BuiltinVarying glFragCoord;
- BuiltinVarying glPointCoord;
- BuiltinVarying glPointSize;
- BuiltinVarying glViewIDOVR;
- BuiltinVarying glViewportIndex;
- BuiltinVarying glLayer;
-};
-
-inline std::string GetVaryingSemantic(int majorShaderModel, bool programUsesPointSize)
-{
- // SM3 reserves the TEXCOORD semantic for point sprite texcoords (gl_PointCoord)
- // In D3D11 we manually compute gl_PointCoord in the GS.
- return ((programUsesPointSize && majorShaderModel < 4) ? "COLOR" : "TEXCOORD");
-}
-
-class BuiltinVaryingsD3D
-{
- public:
- BuiltinVaryingsD3D(const ProgramD3DMetadata &metadata, const gl::VaryingPacking &packing);
- ~BuiltinVaryingsD3D();
-
- bool usesPointSize() const { return mBuiltinInfo[gl::SHADER_VERTEX].glPointSize.enabled; }
-
- const BuiltinInfo &operator[](gl::ShaderType shaderType) const
- {
- return mBuiltinInfo[shaderType];
- }
- BuiltinInfo &operator[](gl::ShaderType shaderType) { return mBuiltinInfo[shaderType]; }
-
- private:
- void updateBuiltins(gl::ShaderType shaderType,
- const ProgramD3DMetadata &metadata,
- const gl::VaryingPacking &packing);
-
- std::array<BuiltinInfo, gl::SHADER_TYPE_MAX> mBuiltinInfo;
-};
-
-class DynamicHLSL : angle::NonCopyable
-{
- public:
- explicit DynamicHLSL(RendererD3D *const renderer);
-
- std::string generateVertexShaderForInputLayout(
- const std::string &sourceShader,
- const gl::InputLayout &inputLayout,
- const std::vector<sh::Attribute> &shaderAttributes) const;
- std::string generatePixelShaderForOutputSignature(
- const std::string &sourceShader,
- const std::vector<PixelShaderOutputVariable> &outputVariables,
- bool usesFragDepth,
- const std::vector<GLenum> &outputLayout) const;
- void generateShaderLinkHLSL(const gl::Context *context,
- const gl::ProgramState &programData,
- const ProgramD3DMetadata &programMetadata,
- const gl::VaryingPacking &varyingPacking,
- const BuiltinVaryingsD3D &builtinsD3D,
- std::string *pixelHLSL,
- std::string *vertexHLSL) const;
- std::string generateComputeShaderLinkHLSL(const gl::Context *context,
- const gl::ProgramState &programData) const;
-
- std::string generateGeometryShaderPreamble(const gl::VaryingPacking &varyingPacking,
- const BuiltinVaryingsD3D &builtinsD3D,
- const bool hasANGLEMultiviewEnabled,
- const bool selectViewInVS) const;
-
- std::string generateGeometryShaderHLSL(const gl::Context *context,
- gl::PrimitiveType primitiveType,
- const gl::ProgramState &programData,
- const bool useViewScale,
- const bool hasANGLEMultiviewEnabled,
- const bool selectViewInVS,
- const bool pointSpriteEmulation,
- const std::string &preambleString) const;
-
- void getPixelShaderOutputKey(const gl::ContextState &data,
- const gl::ProgramState &programData,
- const ProgramD3DMetadata &metadata,
- std::vector<PixelShaderOutputVariable> *outPixelShaderKey);
-
- private:
- RendererD3D *const mRenderer;
-
- void generateVaryingLinkHLSL(const gl::VaryingPacking &varyingPacking,
- const BuiltinInfo &builtins,
- bool programUsesPointSize,
- std::ostringstream &hlslStream) const;
-
- static void GenerateAttributeConversionHLSL(gl::VertexFormatType vertexFormatType,
- const sh::ShaderVariable &shaderAttrib,
- std::ostringstream &outStream);
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp
deleted file mode 100644
index fcc2456bd6..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp
+++ /dev/null
@@ -1,87 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// EGLImageD3D.cpp: Implements the rx::EGLImageD3D class, the D3D implementation of EGL images
-
-#include "libANGLE/renderer/d3d/EGLImageD3D.h"
-
-#include "common/debug.h"
-#include "common/utilities.h"
-#include "libANGLE/AttributeMap.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/renderer/d3d/RenderbufferD3D.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-#include "libANGLE/renderer/d3d/RenderTargetD3D.h"
-#include "libANGLE/renderer/d3d/TextureD3D.h"
-#include "libANGLE/renderer/d3d/TextureStorage.h"
-
-#include <EGL/eglext.h>
-
-namespace rx
-{
-
-EGLImageD3D::EGLImageD3D(const egl::ImageState &state,
- EGLenum target,
- const egl::AttributeMap &attribs,
- RendererD3D *renderer)
- : ImageImpl(state), mRenderer(renderer), mRenderTarget(nullptr)
-{
- ASSERT(renderer != nullptr);
-}
-
-EGLImageD3D::~EGLImageD3D()
-{
- SafeDelete(mRenderTarget);
-}
-
-egl::Error EGLImageD3D::initialize()
-{
- return egl::NoError();
-}
-
-gl::Error EGLImageD3D::orphan(const gl::Context *context, egl::ImageSibling *sibling)
-{
- if (sibling == mState.source.get())
- {
- ANGLE_TRY(copyToLocalRendertarget(context));
- }
-
- return gl::NoError();
-}
-
-gl::Error EGLImageD3D::getRenderTarget(const gl::Context *context, RenderTargetD3D **outRT) const
-{
- if (mState.source.get())
- {
- ASSERT(!mRenderTarget);
- FramebufferAttachmentRenderTarget *rt = nullptr;
- ANGLE_TRY(
- mState.source->getAttachmentRenderTarget(context, GL_NONE, mState.imageIndex, &rt));
- *outRT = static_cast<RenderTargetD3D *>(rt);
- return gl::NoError();
- }
- else
- {
- ASSERT(mRenderTarget);
- *outRT = mRenderTarget;
- return gl::NoError();
- }
-}
-
-gl::Error EGLImageD3D::copyToLocalRendertarget(const gl::Context *context)
-{
- ASSERT(mState.source.get() != nullptr);
- ASSERT(mRenderTarget == nullptr);
-
- RenderTargetD3D *curRenderTarget = nullptr;
- ANGLE_TRY(getRenderTarget(context, &curRenderTarget));
-
- // This only currently applies do D3D11, where it invalidates FBOs with this Image attached.
- curRenderTarget->signalDirty(context);
-
- return mRenderer->createRenderTargetCopy(curRenderTarget, &mRenderTarget);
-}
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.h
deleted file mode 100644
index 1ee7984426..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.h
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// EGLImageD3D.h: Defines the rx::EGLImageD3D class, the D3D implementation of EGL images
-
-#ifndef LIBANGLE_RENDERER_D3D_EGLIMAGED3D_H_
-#define LIBANGLE_RENDERER_D3D_EGLIMAGED3D_H_
-
-#include "libANGLE/renderer/ImageImpl.h"
-
-namespace gl
-{
-class Context;
-}
-
-namespace egl
-{
-class AttributeMap;
-}
-
-namespace rx
-{
-class FramebufferAttachmentObjectImpl;
-class TextureD3D;
-class RenderbufferD3D;
-class RendererD3D;
-class RenderTargetD3D;
-
-class EGLImageD3D final : public ImageImpl
-{
- public:
- EGLImageD3D(const egl::ImageState &state,
- EGLenum target,
- const egl::AttributeMap &attribs,
- RendererD3D *renderer);
- ~EGLImageD3D() override;
-
- egl::Error initialize() override;
-
- gl::Error orphan(const gl::Context *context, egl::ImageSibling *sibling) override;
-
- gl::Error getRenderTarget(const gl::Context *context, RenderTargetD3D **outRT) const;
-
- private:
- gl::Error copyToLocalRendertarget(const gl::Context *context);
-
- RendererD3D *mRenderer;
- RenderTargetD3D *mRenderTarget;
-};
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_EGLIMAGED3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/FramebufferD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
deleted file mode 100644
index 3d73b2c840..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
+++ /dev/null
@@ -1,405 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// FramebufferD3D.cpp: Implements the DefaultAttachmentD3D and FramebufferD3D classes.
-
-#include "libANGLE/renderer/d3d/FramebufferD3D.h"
-
-#include "common/bitset_utils.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/Surface.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/ContextImpl.h"
-#include "libANGLE/renderer/d3d/RenderTargetD3D.h"
-#include "libANGLE/renderer/d3d/RenderbufferD3D.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-#include "libANGLE/renderer/d3d/SurfaceD3D.h"
-#include "libANGLE/renderer/d3d/SwapChainD3D.h"
-#include "libANGLE/renderer/d3d/TextureD3D.h"
-
-namespace rx
-{
-
-namespace
-{
-
-ClearParameters GetClearParameters(const gl::State &state, GLbitfield mask)
-{
- ClearParameters clearParams;
- memset(&clearParams, 0, sizeof(ClearParameters));
-
- const auto &blendState = state.getBlendState();
-
- for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
- {
- clearParams.clearColor[i] = false;
- }
- clearParams.colorF = state.getColorClearValue();
- clearParams.colorType = GL_FLOAT;
- clearParams.colorMaskRed = blendState.colorMaskRed;
- clearParams.colorMaskGreen = blendState.colorMaskGreen;
- clearParams.colorMaskBlue = blendState.colorMaskBlue;
- clearParams.colorMaskAlpha = blendState.colorMaskAlpha;
- clearParams.clearDepth = false;
- clearParams.depthValue = state.getDepthClearValue();
- clearParams.clearStencil = false;
- clearParams.stencilValue = state.getStencilClearValue();
- clearParams.stencilWriteMask = state.getDepthStencilState().stencilWritemask;
- clearParams.scissorEnabled = state.isScissorTestEnabled();
- clearParams.scissor = state.getScissor();
-
- const gl::Framebuffer *framebufferObject = state.getDrawFramebuffer();
- if (mask & GL_COLOR_BUFFER_BIT)
- {
- if (framebufferObject->hasEnabledDrawBuffer())
- {
- for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
- {
- clearParams.clearColor[i] = true;
- }
- }
- }
-
- if (mask & GL_DEPTH_BUFFER_BIT)
- {
- if (state.getDepthStencilState().depthMask &&
- framebufferObject->getDepthbuffer() != nullptr)
- {
- clearParams.clearDepth = true;
- }
- }
-
- if (mask & GL_STENCIL_BUFFER_BIT)
- {
- if (framebufferObject->getStencilbuffer() != nullptr &&
- framebufferObject->getStencilbuffer()->getStencilSize() > 0)
- {
- clearParams.clearStencil = true;
- }
- }
-
- return clearParams;
-}
-}
-
-ClearParameters::ClearParameters() = default;
-
-ClearParameters::ClearParameters(const ClearParameters &other) = default;
-
-FramebufferD3D::FramebufferD3D(const gl::FramebufferState &data, RendererD3D *renderer)
- : FramebufferImpl(data), mRenderer(renderer)
-{
-}
-
-FramebufferD3D::~FramebufferD3D()
-{
-}
-
-gl::Error FramebufferD3D::clear(const gl::Context *context, GLbitfield mask)
-{
- ClearParameters clearParams = GetClearParameters(context->getGLState(), mask);
- return clearImpl(context, clearParams);
-}
-
-gl::Error FramebufferD3D::clearBufferfv(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLfloat *values)
-{
- // glClearBufferfv can be called to clear the color buffer or depth buffer
- ClearParameters clearParams = GetClearParameters(context->getGLState(), 0);
-
- if (buffer == GL_COLOR)
- {
- for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
- {
- clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
- }
- clearParams.colorF = gl::ColorF(values[0], values[1], values[2], values[3]);
- clearParams.colorType = GL_FLOAT;
- }
-
- if (buffer == GL_DEPTH)
- {
- clearParams.clearDepth = true;
- clearParams.depthValue = values[0];
- }
-
- return clearImpl(context, clearParams);
-}
-
-gl::Error FramebufferD3D::clearBufferuiv(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLuint *values)
-{
- // glClearBufferuiv can only be called to clear a color buffer
- ClearParameters clearParams = GetClearParameters(context->getGLState(), 0);
- for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
- {
- clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
- }
- clearParams.colorUI = gl::ColorUI(values[0], values[1], values[2], values[3]);
- clearParams.colorType = GL_UNSIGNED_INT;
-
- return clearImpl(context, clearParams);
-}
-
-gl::Error FramebufferD3D::clearBufferiv(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLint *values)
-{
- // glClearBufferiv can be called to clear the color buffer or stencil buffer
- ClearParameters clearParams = GetClearParameters(context->getGLState(), 0);
-
- if (buffer == GL_COLOR)
- {
- for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
- {
- clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
- }
- clearParams.colorI = gl::ColorI(values[0], values[1], values[2], values[3]);
- clearParams.colorType = GL_INT;
- }
-
- if (buffer == GL_STENCIL)
- {
- clearParams.clearStencil = true;
- clearParams.stencilValue = values[0];
- }
-
- return clearImpl(context, clearParams);
-}
-
-gl::Error FramebufferD3D::clearBufferfi(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- GLfloat depth,
- GLint stencil)
-{
- // glClearBufferfi can only be called to clear a depth stencil buffer
- ClearParameters clearParams = GetClearParameters(context->getGLState(), 0);
- clearParams.clearDepth = true;
- clearParams.depthValue = depth;
- clearParams.clearStencil = true;
- clearParams.stencilValue = stencil;
-
- return clearImpl(context, clearParams);
-}
-
-GLenum FramebufferD3D::getImplementationColorReadFormat(const gl::Context *context) const
-{
- const gl::FramebufferAttachment *readAttachment = mState.getReadAttachment();
-
- if (readAttachment == nullptr)
- {
- return GL_NONE;
- }
-
- RenderTargetD3D *attachmentRenderTarget = nullptr;
- gl::Error error = readAttachment->getRenderTarget(context, &attachmentRenderTarget);
- if (error.isError())
- {
- return GL_NONE;
- }
-
- GLenum implementationFormat = getRenderTargetImplementationFormat(attachmentRenderTarget);
- const gl::InternalFormat &implementationFormatInfo =
- gl::GetSizedInternalFormatInfo(implementationFormat);
-
- return implementationFormatInfo.getReadPixelsFormat();
-}
-
-GLenum FramebufferD3D::getImplementationColorReadType(const gl::Context *context) const
-{
- const gl::FramebufferAttachment *readAttachment = mState.getReadAttachment();
-
- if (readAttachment == nullptr)
- {
- return GL_NONE;
- }
-
- RenderTargetD3D *attachmentRenderTarget = nullptr;
- gl::Error error = readAttachment->getRenderTarget(context, &attachmentRenderTarget);
- if (error.isError())
- {
- return GL_NONE;
- }
-
- GLenum implementationFormat = getRenderTargetImplementationFormat(attachmentRenderTarget);
- const gl::InternalFormat &implementationFormatInfo =
- gl::GetSizedInternalFormatInfo(implementationFormat);
-
- return implementationFormatInfo.getReadPixelsType(context->getClientVersion());
-}
-
-gl::Error FramebufferD3D::readPixels(const gl::Context *context,
- const gl::Rectangle &origArea,
- GLenum format,
- GLenum type,
- void *pixels)
-{
- // Clip read area to framebuffer.
- const gl::Extents fbSize = getState().getReadAttachment()->getSize();
- const gl::Rectangle fbRect(0, 0, fbSize.width, fbSize.height);
- gl::Rectangle area;
- if (!ClipRectangle(origArea, fbRect, &area))
- {
- // nothing to read
- return gl::NoError();
- }
-
- const gl::PixelPackState &packState = context->getGLState().getPackState();
-
- const gl::InternalFormat &sizedFormatInfo = gl::GetInternalFormatInfo(format, type);
-
- GLuint outputPitch = 0;
- ANGLE_TRY_RESULT(sizedFormatInfo.computeRowPitch(type, origArea.width, packState.alignment,
- packState.rowLength),
- outputPitch);
- GLuint outputSkipBytes = 0;
- ANGLE_TRY_RESULT(sizedFormatInfo.computeSkipBytes(outputPitch, 0, packState, false),
- outputSkipBytes);
- outputSkipBytes +=
- (area.x - origArea.x) * sizedFormatInfo.pixelBytes + (area.y - origArea.y) * outputPitch;
-
- return readPixelsImpl(context, area, format, type, outputPitch, packState,
- reinterpret_cast<uint8_t *>(pixels) + outputSkipBytes);
-}
-
-gl::Error FramebufferD3D::blit(const gl::Context *context,
- const gl::Rectangle &sourceArea,
- const gl::Rectangle &destArea,
- GLbitfield mask,
- GLenum filter)
-{
- const auto &glState = context->getGLState();
- const gl::Framebuffer *sourceFramebuffer = glState.getReadFramebuffer();
- const gl::Rectangle *scissor = glState.isScissorTestEnabled() ? &glState.getScissor() : nullptr;
- ANGLE_TRY(blitImpl(context, sourceArea, destArea, scissor, (mask & GL_COLOR_BUFFER_BIT) != 0,
- (mask & GL_DEPTH_BUFFER_BIT) != 0, (mask & GL_STENCIL_BUFFER_BIT) != 0,
- filter, sourceFramebuffer));
-
- return gl::NoError();
-}
-
-bool FramebufferD3D::checkStatus(const gl::Context *context) const
-{
- // if we have both a depth and stencil buffer, they must refer to the same object
- // since we only support packed_depth_stencil and not separate depth and stencil
- if (mState.getDepthAttachment() != nullptr && mState.getStencilAttachment() != nullptr &&
- mState.getDepthStencilAttachment() == nullptr)
- {
- return false;
- }
-
- // D3D11 does not allow for overlapping RenderTargetViews.
- // If WebGL compatibility is enabled, this has already been checked at a higher level.
- ASSERT(!context->getExtensions().webglCompatibility || mState.colorAttachmentsAreUniqueImages());
- if (!context->getExtensions().webglCompatibility)
- {
- if (!mState.colorAttachmentsAreUniqueImages())
- {
- return false;
- }
- }
-
- // D3D requires all render targets to have the same dimensions.
- if (!mState.attachmentsHaveSameDimensions())
- {
- return false;
- }
-
- return true;
-}
-
-void FramebufferD3D::syncState(const gl::Context *context,
- const gl::Framebuffer::DirtyBits &dirtyBits)
-{
- if (!mColorAttachmentsForRender.valid())
- {
- return;
- }
-
- for (auto dirtyBit : dirtyBits)
- {
- if ((dirtyBit >= gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0 &&
- dirtyBit < gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_MAX) ||
- dirtyBit == gl::Framebuffer::DIRTY_BIT_DRAW_BUFFERS)
- {
- mColorAttachmentsForRender.reset();
- }
- }
-}
-
-const gl::AttachmentList &FramebufferD3D::getColorAttachmentsForRender(const gl::Context *context)
-{
- gl::DrawBufferMask activeProgramOutputs =
- context->getContextState().getState().getProgram()->getActiveOutputVariables();
-
- if (mColorAttachmentsForRender.valid() && mCurrentActiveProgramOutputs == activeProgramOutputs)
- {
- return mColorAttachmentsForRender.value();
- }
-
- // Does not actually free memory
- gl::AttachmentList colorAttachmentsForRender;
-
- const auto &colorAttachments = mState.getColorAttachments();
- const auto &drawBufferStates = mState.getDrawBufferStates();
- const auto &workarounds = mRenderer->getWorkarounds();
-
- for (size_t attachmentIndex = 0; attachmentIndex < colorAttachments.size(); ++attachmentIndex)
- {
- GLenum drawBufferState = drawBufferStates[attachmentIndex];
- const gl::FramebufferAttachment &colorAttachment = colorAttachments[attachmentIndex];
-
- if (colorAttachment.isAttached() && drawBufferState != GL_NONE &&
- activeProgramOutputs[attachmentIndex])
- {
- ASSERT(drawBufferState == GL_BACK ||
- drawBufferState == (GL_COLOR_ATTACHMENT0_EXT + attachmentIndex));
- colorAttachmentsForRender.push_back(&colorAttachment);
- }
- else if (!workarounds.mrtPerfWorkaround)
- {
- colorAttachmentsForRender.push_back(nullptr);
- }
- }
-
- // When rendering with no render target on D3D, two bugs lead to incorrect behavior on Intel
- // drivers < 4815. The rendering samples always pass neglecting discard statements in pixel
- // shader. We add a dummy texture as render target in such case.
- if (mRenderer->getWorkarounds().addDummyTextureNoRenderTarget &&
- colorAttachmentsForRender.empty())
- {
- static_assert(static_cast<size_t>(activeProgramOutputs.size()) <= 32,
- "Size of active program outputs should less or equal than 32.");
- GLenum i = static_cast<GLenum>(
- gl::ScanForward(static_cast<uint32_t>(activeProgramOutputs.bits())));
-
- gl::Texture *dummyTex = nullptr;
- // TODO(Jamie): Handle error if dummy texture can't be created.
- ANGLE_SWALLOW_ERR(mRenderer->getIncompleteTexture(context, GL_TEXTURE_2D, &dummyTex));
- if (dummyTex)
- {
- gl::ImageIndex index = gl::ImageIndex::Make2D(0);
- gl::FramebufferAttachment *dummyAttach = new gl::FramebufferAttachment(
- context, GL_TEXTURE, GL_COLOR_ATTACHMENT0_EXT + i, index, dummyTex);
- colorAttachmentsForRender.push_back(dummyAttach);
- }
- }
-
- mColorAttachmentsForRender = std::move(colorAttachmentsForRender);
- mCurrentActiveProgramOutputs = activeProgramOutputs;
-
- return mColorAttachmentsForRender.value();
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/FramebufferD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/FramebufferD3D.h
deleted file mode 100644
index a7312fdef4..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/FramebufferD3D.h
+++ /dev/null
@@ -1,134 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// FramebufferD3D.h: Defines the DefaultAttachmentD3D and FramebufferD3D classes.
-
-#ifndef LIBANGLE_RENDERER_D3D_FRAMBUFFERD3D_H_
-#define LIBANGLE_RENDERER_D3D_FRAMBUFFERD3D_H_
-
-#include <cstdint>
-#include <vector>
-
-#include "common/Color.h"
-#include "common/Optional.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/renderer/FramebufferImpl.h"
-
-namespace gl
-{
-class FramebufferAttachment;
-struct PixelPackState;
-
-typedef std::vector<const FramebufferAttachment *> AttachmentList;
-}
-
-namespace rx
-{
-class RendererD3D;
-class RenderTargetD3D;
-
-struct ClearParameters
-{
- ClearParameters();
- ClearParameters(const ClearParameters &other);
-
- bool clearColor[gl::IMPLEMENTATION_MAX_DRAW_BUFFERS];
- gl::ColorF colorF;
- gl::ColorI colorI;
- gl::ColorUI colorUI;
- GLenum colorType;
- bool colorMaskRed;
- bool colorMaskGreen;
- bool colorMaskBlue;
- bool colorMaskAlpha;
-
- bool clearDepth;
- float depthValue;
-
- bool clearStencil;
- GLint stencilValue;
- GLuint stencilWriteMask;
-
- bool scissorEnabled;
- gl::Rectangle scissor;
-};
-
-class FramebufferD3D : public FramebufferImpl
-{
- public:
- FramebufferD3D(const gl::FramebufferState &data, RendererD3D *renderer);
- ~FramebufferD3D() override;
-
- gl::Error clear(const gl::Context *context, GLbitfield mask) override;
- gl::Error clearBufferfv(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLfloat *values) override;
- gl::Error clearBufferuiv(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLuint *values) override;
- gl::Error clearBufferiv(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLint *values) override;
- gl::Error clearBufferfi(const gl::Context *context,
- GLenum buffer,
- GLint drawbuffer,
- GLfloat depth,
- GLint stencil) override;
-
- GLenum getImplementationColorReadFormat(const gl::Context *context) const override;
- GLenum getImplementationColorReadType(const gl::Context *context) const override;
- gl::Error readPixels(const gl::Context *context,
- const gl::Rectangle &area,
- GLenum format,
- GLenum type,
- void *pixels) override;
-
- gl::Error blit(const gl::Context *context,
- const gl::Rectangle &sourceArea,
- const gl::Rectangle &destArea,
- GLbitfield mask,
- GLenum filter) override;
-
- bool checkStatus(const gl::Context *context) const override;
-
- void syncState(const gl::Context *context,
- const gl::Framebuffer::DirtyBits &dirtyBits) override;
-
- const gl::AttachmentList &getColorAttachmentsForRender(const gl::Context *context);
-
- private:
- virtual gl::Error clearImpl(const gl::Context *context, const ClearParameters &clearParams) = 0;
-
- virtual gl::Error readPixelsImpl(const gl::Context *context,
- const gl::Rectangle &area,
- GLenum format,
- GLenum type,
- size_t outputPitch,
- const gl::PixelPackState &pack,
- uint8_t *pixels) = 0;
-
- virtual gl::Error blitImpl(const gl::Context *context,
- const gl::Rectangle &sourceArea,
- const gl::Rectangle &destArea,
- const gl::Rectangle *scissor,
- bool blitRenderTarget,
- bool blitDepth,
- bool blitStencil,
- GLenum filter,
- const gl::Framebuffer *sourceFramebuffer) = 0;
-
- virtual GLenum getRenderTargetImplementationFormat(RenderTargetD3D *renderTarget) const = 0;
-
- RendererD3D *mRenderer;
- Optional<gl::AttachmentList> mColorAttachmentsForRender;
- gl::DrawBufferMask mCurrentActiveProgramOutputs;
-};
-}
-
-#endif // LIBANGLE_RENDERER_D3D_FRAMBUFFERD3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/HLSLCompiler.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/HLSLCompiler.cpp
deleted file mode 100644
index 5d47308d67..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/HLSLCompiler.cpp
+++ /dev/null
@@ -1,354 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-#include "libANGLE/renderer/d3d/HLSLCompiler.h"
-
-#include <sstream>
-
-#include "common/utilities.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/features.h"
-#include "libANGLE/histogram_macros.h"
-#include "third_party/trace_event/trace_event.h"
-
-#ifndef QT_D3DCOMPILER_DLL
-#define QT_D3DCOMPILER_DLL D3DCOMPILER_DLL
-#endif
-
-#if ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO == ANGLE_ENABLED
-namespace
-{
-#ifdef CREATE_COMPILER_FLAG_INFO
- #undef CREATE_COMPILER_FLAG_INFO
-#endif
-
-#define CREATE_COMPILER_FLAG_INFO(flag) { flag, #flag }
-
-struct CompilerFlagInfo
-{
- UINT mFlag;
- const char *mName;
-};
-
-CompilerFlagInfo CompilerFlagInfos[] =
-{
- // NOTE: The data below is copied from d3dcompiler.h
- // If something changes there it should be changed here as well
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_DEBUG), // (1 << 0)
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_SKIP_VALIDATION), // (1 << 1)
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_SKIP_OPTIMIZATION), // (1 << 2)
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_PACK_MATRIX_ROW_MAJOR), // (1 << 3)
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_PACK_MATRIX_COLUMN_MAJOR), // (1 << 4)
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_PARTIAL_PRECISION), // (1 << 5)
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_FORCE_VS_SOFTWARE_NO_OPT), // (1 << 6)
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_FORCE_PS_SOFTWARE_NO_OPT), // (1 << 7)
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_NO_PRESHADER), // (1 << 8)
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_AVOID_FLOW_CONTROL), // (1 << 9)
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_PREFER_FLOW_CONTROL), // (1 << 10)
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_ENABLE_STRICTNESS), // (1 << 11)
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY), // (1 << 12)
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_IEEE_STRICTNESS), // (1 << 13)
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_OPTIMIZATION_LEVEL0), // (1 << 14)
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_OPTIMIZATION_LEVEL1), // 0
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_OPTIMIZATION_LEVEL2), // ((1 << 14) | (1 << 15))
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_OPTIMIZATION_LEVEL3), // (1 << 15)
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_RESERVED16), // (1 << 16)
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_RESERVED17), // (1 << 17)
- CREATE_COMPILER_FLAG_INFO(D3DCOMPILE_WARNINGS_ARE_ERRORS) // (1 << 18)
-};
-
-#undef CREATE_COMPILER_FLAG_INFO
-
-bool IsCompilerFlagSet(UINT mask, UINT flag)
-{
- bool isFlagSet = IsMaskFlagSet(mask, flag);
-
- switch(flag)
- {
- case D3DCOMPILE_OPTIMIZATION_LEVEL0:
- return isFlagSet && !IsMaskFlagSet(mask, UINT(D3DCOMPILE_OPTIMIZATION_LEVEL3));
-
- case D3DCOMPILE_OPTIMIZATION_LEVEL1:
- return (mask & D3DCOMPILE_OPTIMIZATION_LEVEL2) == UINT(0);
-
- case D3DCOMPILE_OPTIMIZATION_LEVEL3:
- return isFlagSet && !IsMaskFlagSet(mask, UINT(D3DCOMPILE_OPTIMIZATION_LEVEL0));
-
- default:
- return isFlagSet;
- }
-}
-} // anonymous namespace
-#endif // ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO == ANGLE_ENABLED
-
-namespace rx
-{
-
-CompileConfig::CompileConfig()
- : flags(0),
- name()
-{
-}
-
-CompileConfig::CompileConfig(UINT flags, const std::string &name)
- : flags(flags),
- name(name)
-{
-}
-
-HLSLCompiler::HLSLCompiler()
- : mInitialized(false),
- mD3DCompilerModule(nullptr),
- mD3DCompileFunc(nullptr),
- mD3DDisassembleFunc(nullptr)
-{
-}
-
-HLSLCompiler::~HLSLCompiler()
-{
- release();
-}
-
-gl::Error HLSLCompiler::ensureInitialized()
-{
- if (mInitialized)
- {
- return gl::NoError();
- }
-
- TRACE_EVENT0("gpu.angle", "HLSLCompiler::initialize");
-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
-#if defined(ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES)
- // Find a D3DCompiler module that had already been loaded based on a predefined list of versions.
- static const char *d3dCompilerNames[] = ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES;
-
- for (size_t i = 0; i < ArraySize(d3dCompilerNames); ++i)
- {
- if (GetModuleHandleExA(0, d3dCompilerNames[i], &mD3DCompilerModule))
- {
- break;
- }
- }
-#endif // ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES
-
- // Load the compiler DLL specified by the environment, or default to QT_D3DCOMPILER_DLL
- const wchar_t *defaultCompiler = _wgetenv(L"QT_D3DCOMPILER_DLL");
- if (!defaultCompiler)
- defaultCompiler = QT_D3DCOMPILER_DLL;
-
- const wchar_t *compilerDlls[] = {
- defaultCompiler,
- L"d3dcompiler_47.dll",
- L"d3dcompiler_46.dll",
- L"d3dcompiler_43.dll",
- 0
- };
-
- // Load the first available known compiler DLL
- for (int i = 0; compilerDlls[i]; ++i)
- {
- mD3DCompilerModule = LoadLibrary(compilerDlls[i]);
- if (mD3DCompilerModule)
- break;
- }
-
- if (!mD3DCompilerModule)
- {
- // Load the version of the D3DCompiler DLL associated with the Direct3D version ANGLE was built with.
- mD3DCompilerModule = LoadLibrary(D3DCOMPILER_DLL);
- }
-
- if (!mD3DCompilerModule)
- {
- ERR() << "D3D compiler module not found.";
- return gl::OutOfMemory() << "D3D compiler module not found.";
- }
-
- mD3DCompileFunc = reinterpret_cast<pD3DCompile>(GetProcAddress(mD3DCompilerModule, "D3DCompile"));
- ASSERT(mD3DCompileFunc);
-
- mD3DDisassembleFunc = reinterpret_cast<pD3DDisassemble>(GetProcAddress(mD3DCompilerModule, "D3DDisassemble"));
- ASSERT(mD3DDisassembleFunc);
-
-#else
- // D3D Shader compiler is linked already into this module, so the export
- // can be directly assigned.
- mD3DCompilerModule = nullptr;
- mD3DCompileFunc = reinterpret_cast<pD3DCompile>(D3DCompile);
- mD3DDisassembleFunc = reinterpret_cast<pD3DDisassemble>(D3DDisassemble);
-#endif
-
- if (mD3DCompileFunc == nullptr)
- {
- return gl::OutOfMemory() << "Error finding D3DCompile entry point.";
- }
-
- mInitialized = true;
- return gl::NoError();
-}
-
-void HLSLCompiler::release()
-{
- if (mInitialized)
- {
- FreeLibrary(mD3DCompilerModule);
- mD3DCompilerModule = nullptr;
- mD3DCompileFunc = nullptr;
- mD3DDisassembleFunc = nullptr;
- mInitialized = false;
- }
-}
-
-gl::Error HLSLCompiler::compileToBinary(gl::InfoLog &infoLog, const std::string &hlsl, const std::string &profile,
- const std::vector<CompileConfig> &configs, const D3D_SHADER_MACRO *overrideMacros,
- ID3DBlob **outCompiledBlob, std::string *outDebugInfo)
-{
- ASSERT(mInitialized);
-
-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
- ASSERT(mD3DCompilerModule);
-#endif
- ASSERT(mD3DCompileFunc);
-
-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
- if (gl::DebugAnnotationsActive())
- {
- std::string sourcePath = getTempPath();
- std::ostringstream stream;
- stream << "#line 2 \"" << sourcePath << "\"\n\n" << hlsl;
- std::string sourceText = stream.str();
- writeFile(sourcePath.c_str(), sourceText.c_str(), sourceText.size());
- }
-#endif
-
- const D3D_SHADER_MACRO *macros = overrideMacros ? overrideMacros : nullptr;
-
- for (size_t i = 0; i < configs.size(); ++i)
- {
- ID3DBlob *errorMessage = nullptr;
- ID3DBlob *binary = nullptr;
- HRESULT result = S_OK;
-
- {
- TRACE_EVENT0("gpu.angle", "D3DCompile");
- SCOPED_ANGLE_HISTOGRAM_TIMER("GPU.ANGLE.D3DCompileMS");
- result = mD3DCompileFunc(hlsl.c_str(), hlsl.length(), gl::g_fakepath, macros, nullptr,
- "main", profile.c_str(), configs[i].flags, 0, &binary,
- &errorMessage);
- }
-
- if (errorMessage)
- {
- std::string message = reinterpret_cast<const char*>(errorMessage->GetBufferPointer());
- SafeRelease(errorMessage);
-
- infoLog.appendSanitized(message.c_str());
-
- // This produces unbelievable amounts of spam in about:gpu.
- // WARN() << std::endl << hlsl;
-
- WARN() << std::endl << message;
-
- if ((message.find("error X3531:") != std::string::npos || // "can't unroll loops marked with loop attribute"
- message.find("error X4014:") != std::string::npos) && // "cannot have gradient operations inside loops with divergent flow control",
- // even though it is counter-intuitive to disable unrolling for this error,
- // some very long shaders have trouble deciding which loops to unroll and
- // turning off forced unrolls allows them to compile properly.
- macros != nullptr)
- {
- macros = nullptr; // Disable [loop] and [flatten]
-
- // Retry without changing compiler flags
- i--;
- continue;
- }
- }
-
- if (SUCCEEDED(result))
- {
- *outCompiledBlob = binary;
-
- (*outDebugInfo) += "// COMPILER INPUT HLSL BEGIN\n\n" + hlsl + "\n// COMPILER INPUT HLSL END\n";
-
-#if ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO == ANGLE_ENABLED
- (*outDebugInfo) += "\n\n// ASSEMBLY BEGIN\n\n";
- (*outDebugInfo) += "// Compiler configuration: " + configs[i].name + "\n// Flags:\n";
- for (size_t fIx = 0; fIx < ArraySize(CompilerFlagInfos); ++fIx)
- {
- if (IsCompilerFlagSet(configs[i].flags, CompilerFlagInfos[fIx].mFlag))
- {
- (*outDebugInfo) += std::string("// ") + CompilerFlagInfos[fIx].mName + "\n";
- }
- }
-
- (*outDebugInfo) += "// Macros:\n";
- if (macros == nullptr)
- {
- (*outDebugInfo) += "// - : -\n";
- }
- else
- {
- for (const D3D_SHADER_MACRO *mIt = macros; mIt->Name != nullptr; ++mIt)
- {
- (*outDebugInfo) += std::string("// ") + mIt->Name + " : " + mIt->Definition + "\n";
- }
- }
-
- std::string disassembly;
- ANGLE_TRY(disassembleBinary(binary, &disassembly));
- (*outDebugInfo) += "\n" + disassembly + "\n// ASSEMBLY END\n";
-#endif // ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO == ANGLE_ENABLED
- return gl::NoError();
- }
-
- if (result == E_OUTOFMEMORY)
- {
- *outCompiledBlob = nullptr;
- return gl::OutOfMemory()
- << "HLSL compiler had an unexpected failure, " << gl::FmtHR(result);
- }
-
- infoLog << "Warning: D3D shader compilation failed with " << configs[i].name << " flags. ("
- << profile << ")";
-
- if (i + 1 < configs.size())
- {
- infoLog << " Retrying with " << configs[i + 1].name;
- }
- }
-
- // None of the configurations succeeded in compiling this shader but the compiler is still intact
- *outCompiledBlob = nullptr;
- return gl::NoError();
-}
-
-gl::Error HLSLCompiler::disassembleBinary(ID3DBlob *shaderBinary, std::string *disassemblyOut)
-{
- ANGLE_TRY(ensureInitialized());
-
- // Retrieve disassembly
- UINT flags = D3D_DISASM_ENABLE_DEFAULT_VALUE_PRINTS | D3D_DISASM_ENABLE_INSTRUCTION_NUMBERING;
- ID3DBlob *disassembly = nullptr;
- pD3DDisassemble disassembleFunc = reinterpret_cast<pD3DDisassemble>(mD3DDisassembleFunc);
- LPCVOID buffer = shaderBinary->GetBufferPointer();
- SIZE_T bufSize = shaderBinary->GetBufferSize();
- HRESULT result = disassembleFunc(buffer, bufSize, flags, "", &disassembly);
-
- if (SUCCEEDED(result))
- {
- *disassemblyOut = std::string(reinterpret_cast<const char*>(disassembly->GetBufferPointer()));
- }
- else
- {
- *disassemblyOut = "";
- }
-
- SafeRelease(disassembly);
-
- return gl::NoError();
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/HLSLCompiler.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/HLSLCompiler.h
deleted file mode 100644
index c8f9eac290..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/HLSLCompiler.h
+++ /dev/null
@@ -1,64 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// HLSLCompiler: Wrapper for the D3DCompiler DLL.
-//
-
-#ifndef LIBANGLE_RENDERER_D3D_HLSLCOMPILER_H_
-#define LIBANGLE_RENDERER_D3D_HLSLCOMPILER_H_
-
-#include "libANGLE/Error.h"
-
-#include "common/angleutils.h"
-#include "common/platform.h"
-
-#include <vector>
-#include <string>
-
-namespace gl
-{
-class InfoLog;
-}
-
-namespace rx
-{
-
-struct CompileConfig
-{
- UINT flags;
- std::string name;
-
- CompileConfig();
- CompileConfig(UINT flags, const std::string &name);
-};
-
-class HLSLCompiler : angle::NonCopyable
-{
- public:
- HLSLCompiler();
- ~HLSLCompiler();
-
- void release();
-
- // Attempt to compile a HLSL shader using the supplied configurations, may output a NULL compiled blob
- // even if no GL errors are returned.
- gl::Error compileToBinary(gl::InfoLog &infoLog, const std::string &hlsl, const std::string &profile,
- const std::vector<CompileConfig> &configs, const D3D_SHADER_MACRO *overrideMacros,
- ID3DBlob **outCompiledBlob, std::string *outDebugInfo);
-
- gl::Error disassembleBinary(ID3DBlob *shaderBinary, std::string *disassemblyOut);
- gl::Error ensureInitialized();
-
- private:
-
- bool mInitialized;
- HMODULE mD3DCompilerModule;
- pD3DCompile mD3DCompileFunc;
- pD3DDisassemble mD3DDisassembleFunc;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_HLSLCOMPILER_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ImageD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/ImageD3D.cpp
deleted file mode 100644
index dbbcbbed2a..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ImageD3D.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-// Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Image.h: Implements the rx::Image class, an abstract base class for the
-// renderer-specific classes which will define the interface to the underlying
-// surfaces or resources.
-
-#include "libANGLE/renderer/d3d/ImageD3D.h"
-
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/renderer/d3d/FramebufferD3D.h"
-#include "libANGLE/renderer/d3d/RenderTargetD3D.h"
-
-namespace rx
-{
-
-ImageD3D::ImageD3D()
- : mWidth(0),
- mHeight(0),
- mDepth(0),
- mInternalFormat(GL_NONE),
- mRenderable(false),
- mTarget(GL_NONE),
- mDirty(false)
-{
-}
-
-gl::Error ImageD3D::setManagedSurface2D(const gl::Context *context,
- TextureStorage *storage,
- int level)
-{
- return gl::NoError();
-}
-
-gl::Error ImageD3D::setManagedSurfaceCube(const gl::Context *context,
- TextureStorage *storage,
- int face,
- int level)
-{
- return gl::NoError();
-}
-
-gl::Error ImageD3D::setManagedSurface3D(const gl::Context *context,
- TextureStorage *storage,
- int level)
-{
- return gl::NoError();
-}
-
-gl::Error ImageD3D::setManagedSurface2DArray(const gl::Context *context,
- TextureStorage *storage,
- int layer,
- int level)
-{
- return gl::NoError();
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ImageD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/ImageD3D.h
deleted file mode 100644
index 1b7235fbaa..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ImageD3D.h
+++ /dev/null
@@ -1,105 +0,0 @@
-//
-// Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ImageD3D.h: Defines the rx::ImageD3D class, an abstract base class for the
-// renderer-specific classes which will define the interface to the underlying
-// surfaces or resources.
-
-#ifndef LIBANGLE_RENDERER_D3D_IMAGED3D_H_
-#define LIBANGLE_RENDERER_D3D_IMAGED3D_H_
-
-#include "common/debug.h"
-
-#include "libANGLE/Error.h"
-
-namespace gl
-{
-class Context;
-class Framebuffer;
-struct ImageIndex;
-struct Box;
-struct Extents;
-struct Offset;
-struct Rectangle;
-struct PixelUnpackState;
-}
-
-namespace rx
-{
-class TextureStorage;
-class RendererD3D;
-class RenderTargetD3D;
-
-class ImageD3D : angle::NonCopyable
-{
- public:
- ImageD3D();
- virtual ~ImageD3D() {};
-
- GLsizei getWidth() const { return mWidth; }
- GLsizei getHeight() const { return mHeight; }
- GLsizei getDepth() const { return mDepth; }
- GLenum getInternalFormat() const { return mInternalFormat; }
- GLenum getTarget() const { return mTarget; }
- bool isRenderableFormat() const { return mRenderable; }
-
- void markDirty() { mDirty = true; }
- void markClean() { mDirty = false; }
- virtual bool isDirty() const = 0;
-
- virtual bool redefine(GLenum target, GLenum internalformat, const gl::Extents &size, bool forceRelease) = 0;
-
- virtual gl::Error loadData(const gl::Context *context,
- const gl::Box &area,
- const gl::PixelUnpackState &unpack,
- GLenum type,
- const void *input,
- bool applySkipImages) = 0;
- virtual gl::Error loadCompressedData(const gl::Context *context,
- const gl::Box &area,
- const void *input) = 0;
-
- virtual gl::Error setManagedSurface2D(const gl::Context *context,
- TextureStorage *storage,
- int level);
- virtual gl::Error setManagedSurfaceCube(const gl::Context *context,
- TextureStorage *storage,
- int face,
- int level);
- virtual gl::Error setManagedSurface3D(const gl::Context *context,
- TextureStorage *storage,
- int level);
- virtual gl::Error setManagedSurface2DArray(const gl::Context *context,
- TextureStorage *storage,
- int layer,
- int level);
- virtual gl::Error copyToStorage(const gl::Context *context,
- TextureStorage *storage,
- const gl::ImageIndex &index,
- const gl::Box &region) = 0;
-
- virtual gl::Error copyFromTexStorage(const gl::Context *context,
- const gl::ImageIndex &imageIndex,
- TextureStorage *source) = 0;
- virtual gl::Error copyFromFramebuffer(const gl::Context *context,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- const gl::Framebuffer *source) = 0;
-
- protected:
- GLsizei mWidth;
- GLsizei mHeight;
- GLsizei mDepth;
- GLenum mInternalFormat;
- bool mRenderable;
- GLenum mTarget;
-
- bool mDirty;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_IMAGED3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexBuffer.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexBuffer.cpp
deleted file mode 100644
index 937512a96a..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexBuffer.cpp
+++ /dev/null
@@ -1,189 +0,0 @@
-//
-// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// IndexBuffer.cpp: Defines the abstract IndexBuffer class and IndexBufferInterface
-// class with derivations, classes that perform graphics API agnostic index buffer operations.
-
-#include "libANGLE/renderer/d3d/IndexBuffer.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-
-namespace rx
-{
-
-unsigned int IndexBuffer::mNextSerial = 1;
-
-IndexBuffer::IndexBuffer()
-{
- updateSerial();
-}
-
-IndexBuffer::~IndexBuffer()
-{
-}
-
-unsigned int IndexBuffer::getSerial() const
-{
- return mSerial;
-}
-
-void IndexBuffer::updateSerial()
-{
- mSerial = mNextSerial++;
-}
-
-
-IndexBufferInterface::IndexBufferInterface(BufferFactoryD3D *factory, bool dynamic)
-{
- mIndexBuffer = factory->createIndexBuffer();
-
- mDynamic = dynamic;
- mWritePosition = 0;
-}
-
-IndexBufferInterface::~IndexBufferInterface()
-{
- if (mIndexBuffer)
- {
- delete mIndexBuffer;
- }
-}
-
-GLenum IndexBufferInterface::getIndexType() const
-{
- return mIndexBuffer->getIndexType();
-}
-
-unsigned int IndexBufferInterface::getBufferSize() const
-{
- return mIndexBuffer->getBufferSize();
-}
-
-unsigned int IndexBufferInterface::getSerial() const
-{
- return mIndexBuffer->getSerial();
-}
-
-gl::Error IndexBufferInterface::mapBuffer(unsigned int size, void **outMappedMemory, unsigned int *streamOffset)
-{
- // Protect against integer overflow
- if (mWritePosition + size < mWritePosition)
- {
- return gl::OutOfMemory()
- << "Mapping of internal index buffer would cause an integer overflow.";
- }
-
- gl::Error error = mIndexBuffer->mapBuffer(mWritePosition, size, outMappedMemory);
- if (error.isError())
- {
- if (outMappedMemory)
- {
- *outMappedMemory = nullptr;
- }
- return error;
- }
-
- if (streamOffset)
- {
- *streamOffset = mWritePosition;
- }
-
- mWritePosition += size;
- return gl::NoError();
-}
-
-gl::Error IndexBufferInterface::unmapBuffer()
-{
- return mIndexBuffer->unmapBuffer();
-}
-
-IndexBuffer * IndexBufferInterface::getIndexBuffer() const
-{
- return mIndexBuffer;
-}
-
-unsigned int IndexBufferInterface::getWritePosition() const
-{
- return mWritePosition;
-}
-
-void IndexBufferInterface::setWritePosition(unsigned int writePosition)
-{
- mWritePosition = writePosition;
-}
-
-gl::Error IndexBufferInterface::discard()
-{
- return mIndexBuffer->discard();
-}
-
-gl::Error IndexBufferInterface::setBufferSize(unsigned int bufferSize, GLenum indexType)
-{
- if (mIndexBuffer->getBufferSize() == 0)
- {
- return mIndexBuffer->initialize(bufferSize, indexType, mDynamic);
- }
- else
- {
- return mIndexBuffer->setSize(bufferSize, indexType);
- }
-}
-
-StreamingIndexBufferInterface::StreamingIndexBufferInterface(BufferFactoryD3D *factory)
- : IndexBufferInterface(factory, true)
-{
-}
-
-StreamingIndexBufferInterface::~StreamingIndexBufferInterface()
-{
-}
-
-gl::Error StreamingIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType)
-{
- unsigned int curBufferSize = getBufferSize();
- unsigned int writePos = getWritePosition();
- if (size > curBufferSize)
- {
- ANGLE_TRY(setBufferSize(std::max(size, 2 * curBufferSize), indexType));
- setWritePosition(0);
- }
- else if (writePos + size > curBufferSize || writePos + size < writePos)
- {
- ANGLE_TRY(discard());
- setWritePosition(0);
- }
-
- return gl::NoError();
-}
-
-
-StaticIndexBufferInterface::StaticIndexBufferInterface(BufferFactoryD3D *factory)
- : IndexBufferInterface(factory, false)
-{
-}
-
-StaticIndexBufferInterface::~StaticIndexBufferInterface()
-{
-}
-
-gl::Error StaticIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType)
-{
- unsigned int curSize = getBufferSize();
- if (curSize == 0)
- {
- return setBufferSize(size, indexType);
- }
- else if (curSize >= size && indexType == getIndexType())
- {
- return gl::NoError();
- }
- else
- {
- UNREACHABLE();
- return gl::InternalError() << "Internal static index buffers can't be resized";
- }
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexBuffer.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexBuffer.h
deleted file mode 100644
index 969cf6ae63..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexBuffer.h
+++ /dev/null
@@ -1,100 +0,0 @@
-//
-// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// IndexBuffer.h: Defines the abstract IndexBuffer class and IndexBufferInterface
-// class with derivations, classes that perform graphics API agnostic index buffer operations.
-
-#ifndef LIBANGLE_RENDERER_D3D_INDEXBUFFER_H_
-#define LIBANGLE_RENDERER_D3D_INDEXBUFFER_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/Error.h"
-
-namespace rx
-{
-class BufferFactoryD3D;
-
-class IndexBuffer : angle::NonCopyable
-{
- public:
- IndexBuffer();
- virtual ~IndexBuffer();
-
- virtual gl::Error initialize(unsigned int bufferSize, GLenum indexType, bool dynamic) = 0;
-
- virtual gl::Error mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory) = 0;
- virtual gl::Error unmapBuffer() = 0;
-
- virtual gl::Error discard() = 0;
-
- virtual GLenum getIndexType() const = 0;
- virtual unsigned int getBufferSize() const = 0;
- virtual gl::Error setSize(unsigned int bufferSize, GLenum indexType) = 0;
-
- unsigned int getSerial() const;
-
- protected:
- void updateSerial();
-
- private:
- unsigned int mSerial;
- static unsigned int mNextSerial;
-};
-
-class IndexBufferInterface : angle::NonCopyable
-{
- public:
- IndexBufferInterface(BufferFactoryD3D *factory, bool dynamic);
- virtual ~IndexBufferInterface();
-
- virtual gl::Error reserveBufferSpace(unsigned int size, GLenum indexType) = 0;
-
- GLenum getIndexType() const;
- unsigned int getBufferSize() const;
-
- unsigned int getSerial() const;
-
- gl::Error mapBuffer(unsigned int size, void** outMappedMemory, unsigned int *streamOffset);
- gl::Error unmapBuffer();
-
- IndexBuffer *getIndexBuffer() const;
-
- protected:
- unsigned int getWritePosition() const;
- void setWritePosition(unsigned int writePosition);
-
- gl::Error discard();
-
- gl::Error setBufferSize(unsigned int bufferSize, GLenum indexType);
-
- private:
- IndexBuffer *mIndexBuffer;
-
- unsigned int mWritePosition;
- bool mDynamic;
-};
-
-class StreamingIndexBufferInterface : public IndexBufferInterface
-{
- public:
- explicit StreamingIndexBufferInterface(BufferFactoryD3D *factory);
- ~StreamingIndexBufferInterface() override;
-
- gl::Error reserveBufferSpace(unsigned int size, GLenum indexType) override;
-};
-
-class StaticIndexBufferInterface : public IndexBufferInterface
-{
- public:
- explicit StaticIndexBufferInterface(BufferFactoryD3D *factory);
- ~StaticIndexBufferInterface() override;
-
- gl::Error reserveBufferSpace(unsigned int size, GLenum indexType) override;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_INDEXBUFFER_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexDataManager.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexDataManager.cpp
deleted file mode 100644
index e974097b45..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexDataManager.cpp
+++ /dev/null
@@ -1,320 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// IndexDataManager.cpp: Defines the IndexDataManager, a class that
-// runs the Buffer translation process for index buffers.
-
-#include "libANGLE/renderer/d3d/IndexDataManager.h"
-
-#include "common/utilities.h"
-#include "libANGLE/Buffer.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/VertexArray.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/d3d/BufferD3D.h"
-#include "libANGLE/renderer/d3d/IndexBuffer.h"
-
-namespace rx
-{
-
-namespace
-{
-
-template <typename InputT, typename DestT>
-void ConvertIndexArray(const void *input,
- GLenum sourceType,
- void *output,
- GLenum destinationType,
- GLsizei count,
- bool usePrimitiveRestartFixedIndex)
-{
- const InputT *in = static_cast<const InputT *>(input);
- DestT *out = static_cast<DestT *>(output);
-
- if (usePrimitiveRestartFixedIndex)
- {
- InputT srcRestartIndex = static_cast<InputT>(gl::GetPrimitiveRestartIndex(sourceType));
- DestT destRestartIndex = static_cast<DestT>(gl::GetPrimitiveRestartIndex(destinationType));
- for (GLsizei i = 0; i < count; i++)
- {
- out[i] = (in[i] == srcRestartIndex ? destRestartIndex : static_cast<DestT>(in[i]));
- }
- }
- else
- {
- for (GLsizei i = 0; i < count; i++)
- {
- out[i] = static_cast<DestT>(in[i]);
- }
- }
-}
-
-void ConvertIndices(GLenum sourceType,
- GLenum destinationType,
- const void *input,
- GLsizei count,
- void *output,
- bool usePrimitiveRestartFixedIndex)
-{
- if (sourceType == destinationType)
- {
- const gl::Type &typeInfo = gl::GetTypeInfo(destinationType);
- memcpy(output, input, count * typeInfo.bytes);
- return;
- }
-
- if (sourceType == GL_UNSIGNED_BYTE)
- {
- ASSERT(destinationType == GL_UNSIGNED_SHORT);
- ConvertIndexArray<GLubyte, GLushort>(input, sourceType, output, destinationType, count,
- usePrimitiveRestartFixedIndex);
- }
- else if (sourceType == GL_UNSIGNED_SHORT)
- {
- ASSERT(destinationType == GL_UNSIGNED_INT);
- ConvertIndexArray<GLushort, GLuint>(input, sourceType, output, destinationType, count,
- usePrimitiveRestartFixedIndex);
- }
- else
- UNREACHABLE();
-}
-
-gl::Error StreamInIndexBuffer(IndexBufferInterface *buffer,
- const void *data,
- unsigned int count,
- GLenum srcType,
- GLenum dstType,
- bool usePrimitiveRestartFixedIndex,
- unsigned int *offset)
-{
- const gl::Type &dstTypeInfo = gl::GetTypeInfo(dstType);
-
- if (count > (std::numeric_limits<unsigned int>::max() >> dstTypeInfo.bytesShift))
- {
- return gl::OutOfMemory() << "Reserving " << count << " indices of " << dstTypeInfo.bytes
- << " bytes each exceeds the maximum buffer size.";
- }
-
- unsigned int bufferSizeRequired = count << dstTypeInfo.bytesShift;
- ANGLE_TRY(buffer->reserveBufferSpace(bufferSizeRequired, dstType));
-
- void *output = nullptr;
- ANGLE_TRY(buffer->mapBuffer(bufferSizeRequired, &output, offset));
-
- ConvertIndices(srcType, dstType, data, count, output, usePrimitiveRestartFixedIndex);
-
- ANGLE_TRY(buffer->unmapBuffer());
- return gl::NoError();
-}
-
-unsigned int ElementTypeSize(GLenum elementType)
-{
- switch (elementType)
- {
- case GL_UNSIGNED_BYTE:
- return sizeof(GLubyte);
- case GL_UNSIGNED_SHORT:
- return sizeof(GLushort);
- case GL_UNSIGNED_INT:
- return sizeof(GLuint);
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-} // anonymous namespace
-
-bool IsOffsetAligned(GLenum elementType, unsigned int offset)
-{
- return (offset % ElementTypeSize(elementType) == 0);
-}
-
-// IndexDataManager implementation.
-IndexDataManager::IndexDataManager(BufferFactoryD3D *factory)
- : mFactory(factory), mStreamingBufferShort(), mStreamingBufferInt()
-{
-}
-
-IndexDataManager::~IndexDataManager()
-{
-}
-
-void IndexDataManager::deinitialize()
-{
- mStreamingBufferShort.reset();
- mStreamingBufferInt.reset();
-}
-
-// This function translates a GL-style indices into DX-style indices, with their description
-// returned in translated.
-// GL can specify vertex data in immediate mode (pointer to CPU array of indices), which is not
-// possible in DX and requires streaming (Case 1). If the GL indices are specified with a buffer
-// (Case 2), in a format supported by DX (subcase a) then all is good.
-// When we have a buffer with an unsupported format (subcase b) then we need to do some translation:
-// we will start by falling back to streaming, and after a while will start using a static
-// translated copy of the index buffer.
-gl::Error IndexDataManager::prepareIndexData(const gl::Context *context,
- GLenum srcType,
- GLenum dstType,
- GLsizei count,
- gl::Buffer *glBuffer,
- const void *indices,
- TranslatedIndexData *translated)
-{
- const gl::Type &srcTypeInfo = gl::GetTypeInfo(srcType);
- const gl::Type &dstTypeInfo = gl::GetTypeInfo(dstType);
-
- BufferD3D *buffer = glBuffer ? GetImplAs<BufferD3D>(glBuffer) : nullptr;
-
- translated->indexType = dstType;
- translated->srcIndexData.srcBuffer = buffer;
- translated->srcIndexData.srcIndices = indices;
- translated->srcIndexData.srcIndexType = srcType;
- translated->srcIndexData.srcCount = count;
-
- // Context can be nullptr in perf tests.
- bool primitiveRestartFixedIndexEnabled =
- context ? context->getGLState().isPrimitiveRestartEnabled() : false;
-
- // Case 1: the indices are passed by pointer, which forces the streaming of index data
- if (glBuffer == nullptr)
- {
- translated->storage = nullptr;
- return streamIndexData(indices, count, srcType, dstType, primitiveRestartFixedIndexEnabled,
- translated);
- }
-
- // Case 2: the indices are already in a buffer
- unsigned int offset = static_cast<unsigned int>(reinterpret_cast<uintptr_t>(indices));
- ASSERT(srcTypeInfo.bytes * static_cast<unsigned int>(count) + offset <= buffer->getSize());
-
- bool offsetAligned = IsOffsetAligned(srcType, offset);
-
- // Case 2a: the buffer can be used directly
- if (offsetAligned && buffer->supportsDirectBinding() && dstType == srcType)
- {
- translated->storage = buffer;
- translated->indexBuffer = nullptr;
- translated->serial = buffer->getSerial();
- translated->startIndex = (offset >> srcTypeInfo.bytesShift);
- translated->startOffset = offset;
- return gl::NoError();
- }
-
- translated->storage = nullptr;
-
- // Case 2b: use a static translated copy or fall back to streaming
- StaticIndexBufferInterface *staticBuffer = buffer->getStaticIndexBuffer();
-
- bool staticBufferInitialized = staticBuffer && staticBuffer->getBufferSize() != 0;
- bool staticBufferUsable =
- staticBuffer && offsetAligned && staticBuffer->getIndexType() == dstType;
-
- if (staticBufferInitialized && !staticBufferUsable)
- {
- buffer->invalidateStaticData(context);
- staticBuffer = nullptr;
- }
-
- if (staticBuffer == nullptr || !offsetAligned)
- {
- const uint8_t *bufferData = nullptr;
- ANGLE_TRY(buffer->getData(context, &bufferData));
- ASSERT(bufferData != nullptr);
-
- ANGLE_TRY(streamIndexData(bufferData + offset, count, srcType, dstType,
- primitiveRestartFixedIndexEnabled, translated));
- buffer->promoteStaticUsage(context, count << srcTypeInfo.bytesShift);
- }
- else
- {
- if (!staticBufferInitialized)
- {
- const uint8_t *bufferData = nullptr;
- ANGLE_TRY(buffer->getData(context, &bufferData));
- ASSERT(bufferData != nullptr);
-
- unsigned int convertCount =
- static_cast<unsigned int>(buffer->getSize()) >> srcTypeInfo.bytesShift;
- ANGLE_TRY(StreamInIndexBuffer(staticBuffer, bufferData, convertCount, srcType, dstType,
- primitiveRestartFixedIndexEnabled, nullptr));
- }
- ASSERT(offsetAligned && staticBuffer->getIndexType() == dstType);
-
- translated->indexBuffer = staticBuffer->getIndexBuffer();
- translated->serial = staticBuffer->getSerial();
- translated->startIndex = (offset >> srcTypeInfo.bytesShift);
- translated->startOffset = (offset >> srcTypeInfo.bytesShift) << dstTypeInfo.bytesShift;
- }
-
- return gl::NoError();
-}
-
-gl::Error IndexDataManager::streamIndexData(const void *data,
- unsigned int count,
- GLenum srcType,
- GLenum dstType,
- bool usePrimitiveRestartFixedIndex,
- TranslatedIndexData *translated)
-{
- const gl::Type &dstTypeInfo = gl::GetTypeInfo(dstType);
-
- IndexBufferInterface *indexBuffer = nullptr;
- ANGLE_TRY(getStreamingIndexBuffer(dstType, &indexBuffer));
- ASSERT(indexBuffer != nullptr);
-
- unsigned int offset;
- ANGLE_TRY(StreamInIndexBuffer(indexBuffer, data, count, srcType, dstType,
- usePrimitiveRestartFixedIndex, &offset));
-
- translated->indexBuffer = indexBuffer->getIndexBuffer();
- translated->serial = indexBuffer->getSerial();
- translated->startIndex = (offset >> dstTypeInfo.bytesShift);
- translated->startOffset = offset;
-
- return gl::NoError();
-}
-
-gl::Error IndexDataManager::getStreamingIndexBuffer(GLenum destinationIndexType,
- IndexBufferInterface **outBuffer)
-{
- ASSERT(outBuffer);
- ASSERT(destinationIndexType == GL_UNSIGNED_SHORT || destinationIndexType == GL_UNSIGNED_INT);
-
- auto &streamingBuffer =
- (destinationIndexType == GL_UNSIGNED_INT) ? mStreamingBufferInt : mStreamingBufferShort;
-
- if (!streamingBuffer)
- {
- StreamingBuffer newBuffer(new StreamingIndexBufferInterface(mFactory));
- ANGLE_TRY(newBuffer->reserveBufferSpace(INITIAL_INDEX_BUFFER_SIZE, destinationIndexType));
- streamingBuffer = std::move(newBuffer);
- }
-
- *outBuffer = streamingBuffer.get();
- return gl::NoError();
-}
-
-GLenum GetIndexTranslationDestType(GLenum srcType,
- const gl::HasIndexRange &lazyIndexRange,
- bool usePrimitiveRestartWorkaround)
-{
- // Avoid D3D11's primitive restart index value
- // see http://msdn.microsoft.com/en-us/library/windows/desktop/bb205124(v=vs.85).aspx
- if (usePrimitiveRestartWorkaround)
- {
- const gl::IndexRange &indexRange = lazyIndexRange.getIndexRange().value();
- if (indexRange.end == gl::GetPrimitiveRestartIndex(srcType))
- {
- return GL_UNSIGNED_INT;
- }
- }
-
- return (srcType == GL_UNSIGNED_INT) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexDataManager.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexDataManager.h
deleted file mode 100644
index 77f05df92d..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/IndexDataManager.h
+++ /dev/null
@@ -1,105 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// IndexDataManager.h: Defines the IndexDataManager, a class that
-// runs the Buffer translation process for index buffers.
-
-#ifndef LIBANGLE_INDEXDATAMANAGER_H_
-#define LIBANGLE_INDEXDATAMANAGER_H_
-
-#include <GLES2/gl2.h>
-
-#include "common/angleutils.h"
-#include "common/mathutil.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-
-namespace
-{
-enum
-{
- INITIAL_INDEX_BUFFER_SIZE = 4096 * sizeof(GLuint)
-};
-}
-
-namespace gl
-{
-class Buffer;
-}
-
-namespace rx
-{
-class IndexBufferInterface;
-class StaticIndexBufferInterface;
-class StreamingIndexBufferInterface;
-class IndexBuffer;
-class BufferD3D;
-class RendererD3D;
-
-struct SourceIndexData
-{
- BufferD3D *srcBuffer;
- const void *srcIndices;
- unsigned int srcCount;
- GLenum srcIndexType;
- bool srcIndicesChanged;
-};
-
-struct TranslatedIndexData
-{
- unsigned int startIndex;
- unsigned int startOffset; // In bytes
-
- IndexBuffer *indexBuffer;
- BufferD3D *storage;
- GLenum indexType;
- unsigned int serial;
-
- SourceIndexData srcIndexData;
-};
-
-class IndexDataManager : angle::NonCopyable
-{
- public:
- explicit IndexDataManager(BufferFactoryD3D *factory);
- virtual ~IndexDataManager();
-
- void deinitialize();
-
- gl::Error prepareIndexData(const gl::Context *context,
- GLenum srcType,
- GLenum dstType,
- GLsizei count,
- gl::Buffer *glBuffer,
- const void *indices,
- TranslatedIndexData *translated);
-
- private:
- gl::Error streamIndexData(const void *data,
- unsigned int count,
- GLenum srcType,
- GLenum dstType,
- bool usePrimitiveRestartFixedIndex,
- TranslatedIndexData *translated);
- gl::Error getStreamingIndexBuffer(GLenum destinationIndexType,
- IndexBufferInterface **outBuffer);
-
- using StreamingBuffer = std::unique_ptr<StreamingIndexBufferInterface>;
-
- BufferFactoryD3D *const mFactory;
- std::unique_ptr<StreamingIndexBufferInterface> mStreamingBufferShort;
- std::unique_ptr<StreamingIndexBufferInterface> mStreamingBufferInt;
-};
-
-GLenum GetIndexTranslationDestType(GLenum srcType,
- const gl::HasIndexRange &lazyIndexRange,
- bool usePrimitiveRestartWorkaround);
-
-bool IsOffsetAligned(GLenum elementType, unsigned int offset);
-
-} // namespace rx
-
-#endif // LIBANGLE_INDEXDATAMANAGER_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/NativeWindowD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/NativeWindowD3D.cpp
deleted file mode 100644
index 113bad647c..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/NativeWindowD3D.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// NativeWindowD3D.cpp: Defines NativeWindowD3D, a class for managing and performing operations on
-// an EGLNativeWindowType for the D3D renderers.
-
-#include "libANGLE/renderer/d3d/NativeWindowD3D.h"
-
-namespace rx
-{
-
-NativeWindowD3D::NativeWindowD3D(EGLNativeWindowType window) : mWindow(window)
-{
-}
-
-NativeWindowD3D::~NativeWindowD3D()
-{
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/NativeWindowD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/NativeWindowD3D.h
deleted file mode 100644
index 365448488d..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/NativeWindowD3D.h
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// NativeWindowD3D.h: Defines NativeWindowD3D, a class for managing and performing operations on an
-// EGLNativeWindowType for the D3D renderers.
-
-#ifndef LIBANGLE_RENDERER_D3D_NATIVEWINDOWD3D_H_
-#define LIBANGLE_RENDERER_D3D_NATIVEWINDOWD3D_H_
-
-#include "common/debug.h"
-#include "common/platform.h"
-
-#include <EGL/eglplatform.h>
-#include "libANGLE/Config.h"
-
-namespace rx
-{
-class NativeWindowD3D : angle::NonCopyable
-{
- public:
- NativeWindowD3D(EGLNativeWindowType window);
- virtual ~NativeWindowD3D();
-
- virtual bool initialize() = 0;
- virtual bool getClientRect(LPRECT rect) const = 0;
- virtual bool isIconic() const = 0;
-
- inline EGLNativeWindowType getNativeWindow() const { return mWindow; }
-
- private:
- EGLNativeWindowType mWindow;
-};
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_NATIVEWINDOWD3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp
deleted file mode 100644
index afc318d9fa..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ /dev/null
@@ -1,2867 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ProgramD3D.cpp: Defines the rx::ProgramD3D class which implements rx::ProgramImpl.
-
-#include "libANGLE/renderer/d3d/ProgramD3D.h"
-
-#include "common/bitset_utils.h"
-#include "common/string_utils.h"
-#include "common/utilities.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/ProgramLinkedResources.h"
-#include "libANGLE/Uniform.h"
-#include "libANGLE/VertexArray.h"
-#include "libANGLE/features.h"
-#include "libANGLE/queryconversions.h"
-#include "libANGLE/renderer/ContextImpl.h"
-#include "libANGLE/renderer/d3d/DynamicHLSL.h"
-#include "libANGLE/renderer/d3d/FramebufferD3D.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-#include "libANGLE/renderer/d3d/ShaderD3D.h"
-#include "libANGLE/renderer/d3d/ShaderExecutableD3D.h"
-#include "libANGLE/renderer/d3d/VertexDataManager.h"
-
-using namespace angle;
-
-namespace rx
-{
-
-namespace
-{
-
-void GetDefaultInputLayoutFromShader(const gl::Context *context,
- gl::Shader *vertexShader,
- gl::InputLayout *inputLayoutOut)
-{
- inputLayoutOut->clear();
-
- for (const sh::Attribute &shaderAttr : vertexShader->getActiveAttributes(context))
- {
- if (shaderAttr.type != GL_NONE)
- {
- GLenum transposedType = gl::TransposeMatrixType(shaderAttr.type);
-
- for (size_t rowIndex = 0;
- static_cast<int>(rowIndex) < gl::VariableRowCount(transposedType); ++rowIndex)
- {
- GLenum componentType = gl::VariableComponentType(transposedType);
- GLuint components = static_cast<GLuint>(gl::VariableColumnCount(transposedType));
- bool pureInt = (componentType != GL_FLOAT);
- gl::VertexFormatType defaultType =
- gl::GetVertexFormatType(componentType, GL_FALSE, components, pureInt);
-
- inputLayoutOut->push_back(defaultType);
- }
- }
- }
-}
-
-void GetDefaultOutputLayoutFromShader(
- const std::vector<PixelShaderOutputVariable> &shaderOutputVars,
- std::vector<GLenum> *outputLayoutOut)
-{
- outputLayoutOut->clear();
-
- if (!shaderOutputVars.empty())
- {
- outputLayoutOut->push_back(GL_COLOR_ATTACHMENT0 +
- static_cast<unsigned int>(shaderOutputVars[0].outputIndex));
- }
-}
-
-template <typename T, int cols, int rows>
-bool TransposeExpandMatrix(T *target, const GLfloat *value)
-{
- constexpr int targetWidth = 4;
- constexpr int targetHeight = rows;
- constexpr int srcWidth = rows;
- constexpr int srcHeight = cols;
-
- constexpr int copyWidth = std::min(targetHeight, srcWidth);
- constexpr int copyHeight = std::min(targetWidth, srcHeight);
-
- T staging[targetWidth * targetHeight] = {0};
-
- for (int x = 0; x < copyWidth; x++)
- {
- for (int y = 0; y < copyHeight; y++)
- {
- staging[x * targetWidth + y] = static_cast<T>(value[y * srcWidth + x]);
- }
- }
-
- if (memcmp(target, staging, targetWidth * targetHeight * sizeof(T)) == 0)
- {
- return false;
- }
-
- memcpy(target, staging, targetWidth * targetHeight * sizeof(T));
- return true;
-}
-
-template <typename T, int cols, int rows>
-bool ExpandMatrix(T *target, const GLfloat *value)
-{
- constexpr int targetWidth = 4;
- constexpr int targetHeight = rows;
- constexpr int srcWidth = cols;
- constexpr int srcHeight = rows;
-
- constexpr int copyWidth = std::min(targetWidth, srcWidth);
- constexpr int copyHeight = std::min(targetHeight, srcHeight);
-
- T staging[targetWidth * targetHeight] = {0};
-
- for (int y = 0; y < copyHeight; y++)
- {
- for (int x = 0; x < copyWidth; x++)
- {
- staging[y * targetWidth + x] = static_cast<T>(value[y * srcWidth + x]);
- }
- }
-
- if (memcmp(target, staging, targetWidth * targetHeight * sizeof(T)) == 0)
- {
- return false;
- }
-
- memcpy(target, staging, targetWidth * targetHeight * sizeof(T));
- return true;
-}
-
-gl::PrimitiveType GetGeometryShaderTypeFromDrawMode(GLenum drawMode)
-{
- switch (drawMode)
- {
- // Uses the point sprite geometry shader.
- case GL_POINTS:
- return gl::PRIMITIVE_POINTS;
-
- // All line drawing uses the same geometry shader.
- case GL_LINES:
- case GL_LINE_STRIP:
- case GL_LINE_LOOP:
- return gl::PRIMITIVE_LINES;
-
- // The triangle fan primitive is emulated with strips in D3D11.
- case GL_TRIANGLES:
- case GL_TRIANGLE_FAN:
- return gl::PRIMITIVE_TRIANGLES;
-
- // Special case for triangle strips.
- case GL_TRIANGLE_STRIP:
- return gl::PRIMITIVE_TRIANGLE_STRIP;
-
- default:
- UNREACHABLE();
- return gl::PRIMITIVE_TYPE_MAX;
- }
-}
-
-bool FindFlatInterpolationVarying(const std::vector<sh::Varying> &varyings)
-{
- // Note: this assumes nested structs can only be packed with one interpolation.
- for (const auto &varying : varyings)
- {
- if (varying.interpolation == sh::INTERPOLATION_FLAT)
- {
- return true;
- }
- }
-
- return false;
-}
-
-// Helper method to de-tranpose a matrix uniform for an API query.
-void GetMatrixUniform(GLint columns, GLint rows, GLfloat *dataOut, const GLfloat *source)
-{
- for (GLint col = 0; col < columns; ++col)
- {
- for (GLint row = 0; row < rows; ++row)
- {
- GLfloat *outptr = dataOut + ((col * rows) + row);
- const GLfloat *inptr = source + ((row * 4) + col);
- *outptr = *inptr;
- }
- }
-}
-
-template <typename NonFloatT>
-void GetMatrixUniform(GLint columns, GLint rows, NonFloatT *dataOut, const NonFloatT *source)
-{
- UNREACHABLE();
-}
-
-class UniformBlockInfo final : angle::NonCopyable
-{
- public:
- UniformBlockInfo() {}
-
- void getShaderBlockInfo(const gl::Context *context, gl::Shader *shader);
-
- bool getBlockSize(const std::string &name, const std::string &mappedName, size_t *sizeOut);
- bool getBlockMemberInfo(const std::string &name,
- const std::string &mappedName,
- sh::BlockMemberInfo *infoOut);
-
- private:
- size_t getBlockInfo(const sh::InterfaceBlock &interfaceBlock);
-
- std::map<std::string, size_t> mBlockSizes;
- sh::BlockLayoutMap mBlockLayout;
-};
-
-void UniformBlockInfo::getShaderBlockInfo(const gl::Context *context, gl::Shader *shader)
-{
- for (const sh::InterfaceBlock &interfaceBlock : shader->getUniformBlocks(context))
- {
- if (!interfaceBlock.staticUse && interfaceBlock.layout == sh::BLOCKLAYOUT_PACKED)
- continue;
-
- if (mBlockSizes.count(interfaceBlock.name) > 0)
- continue;
-
- size_t dataSize = getBlockInfo(interfaceBlock);
- mBlockSizes[interfaceBlock.name] = dataSize;
- }
-}
-
-size_t UniformBlockInfo::getBlockInfo(const sh::InterfaceBlock &interfaceBlock)
-{
- ASSERT(interfaceBlock.staticUse || interfaceBlock.layout != sh::BLOCKLAYOUT_PACKED);
-
- // define member uniforms
- sh::Std140BlockEncoder std140Encoder;
- sh::HLSLBlockEncoder hlslEncoder(sh::HLSLBlockEncoder::ENCODE_PACKED, false);
- sh::BlockLayoutEncoder *encoder = nullptr;
-
- if (interfaceBlock.layout == sh::BLOCKLAYOUT_STD140)
- {
- encoder = &std140Encoder;
- }
- else
- {
- encoder = &hlslEncoder;
- }
-
- sh::GetUniformBlockInfo(interfaceBlock.fields, interfaceBlock.fieldPrefix(), encoder,
- interfaceBlock.isRowMajorLayout, &mBlockLayout);
-
- return encoder->getBlockSize();
-}
-
-bool UniformBlockInfo::getBlockSize(const std::string &name,
- const std::string &mappedName,
- size_t *sizeOut)
-{
- size_t nameLengthWithoutArrayIndex;
- gl::ParseArrayIndex(name, &nameLengthWithoutArrayIndex);
- std::string baseName = name.substr(0u, nameLengthWithoutArrayIndex);
- auto sizeIter = mBlockSizes.find(baseName);
- if (sizeIter == mBlockSizes.end())
- {
- *sizeOut = 0;
- return false;
- }
-
- *sizeOut = sizeIter->second;
- return true;
-};
-
-bool UniformBlockInfo::getBlockMemberInfo(const std::string &name,
- const std::string &mappedName,
- sh::BlockMemberInfo *infoOut)
-{
- auto infoIter = mBlockLayout.find(name);
- if (infoIter == mBlockLayout.end())
- {
- *infoOut = sh::BlockMemberInfo::getDefaultBlockInfo();
- return false;
- }
-
- *infoOut = infoIter->second;
- return true;
-};
-
-} // anonymous namespace
-
-// D3DUniform Implementation
-
-D3DUniform::D3DUniform(GLenum type,
- const std::string &nameIn,
- const std::vector<unsigned int> &arraySizesIn,
- bool defaultBlock)
- : typeInfo(gl::GetUniformTypeInfo(type)),
- name(nameIn),
- arraySizes(arraySizesIn),
- vsData(nullptr),
- psData(nullptr),
- csData(nullptr),
- vsRegisterIndex(GL_INVALID_INDEX),
- psRegisterIndex(GL_INVALID_INDEX),
- csRegisterIndex(GL_INVALID_INDEX),
- registerCount(0),
- registerElement(0)
-{
- // We use data storage for default block uniforms to cache values that are sent to D3D during
- // rendering
- // Uniform blocks/buffers are treated separately by the Renderer (ES3 path only)
- if (defaultBlock)
- {
- // Use the row count as register count, will work for non-square matrices.
- registerCount = typeInfo.rowCount * getArraySizeProduct();
- }
-}
-
-D3DUniform::~D3DUniform()
-{
-}
-
-unsigned int D3DUniform::getArraySizeProduct() const
-{
- return gl::ArraySizeProduct(arraySizes);
-}
-
-const uint8_t *D3DUniform::getDataPtrToElement(size_t elementIndex) const
-{
- ASSERT((!isArray() && elementIndex == 0) ||
- (isArray() && elementIndex < getArraySizeProduct()));
-
- if (isSampler())
- {
- return reinterpret_cast<const uint8_t *>(&mSamplerData[elementIndex]);
- }
-
- return firstNonNullData() + (elementIndex > 0 ? (typeInfo.internalSize * elementIndex) : 0u);
-}
-
-bool D3DUniform::isSampler() const
-{
- return typeInfo.isSampler;
-}
-
-bool D3DUniform::isReferencedByVertexShader() const
-{
- return vsRegisterIndex != GL_INVALID_INDEX;
-}
-
-bool D3DUniform::isReferencedByFragmentShader() const
-{
- return psRegisterIndex != GL_INVALID_INDEX;
-}
-
-bool D3DUniform::isReferencedByComputeShader() const
-{
- return csRegisterIndex != GL_INVALID_INDEX;
-}
-
-const uint8_t *D3DUniform::firstNonNullData() const
-{
- ASSERT(vsData || psData || csData || !mSamplerData.empty());
-
- if (!mSamplerData.empty())
- {
- return reinterpret_cast<const uint8_t *>(mSamplerData.data());
- }
-
- return vsData ? vsData : (psData ? psData : csData);
-}
-
-// D3DVarying Implementation
-
-D3DVarying::D3DVarying() : semanticIndex(0), componentCount(0), outputSlot(0)
-{
-}
-
-D3DVarying::D3DVarying(const std::string &semanticNameIn,
- unsigned int semanticIndexIn,
- unsigned int componentCountIn,
- unsigned int outputSlotIn)
- : semanticName(semanticNameIn),
- semanticIndex(semanticIndexIn),
- componentCount(componentCountIn),
- outputSlot(outputSlotIn)
-{
-}
-
-// ProgramD3DMetadata Implementation
-
-ProgramD3DMetadata::ProgramD3DMetadata(RendererD3D *renderer,
- const ShaderD3D *vertexShader,
- const ShaderD3D *fragmentShader)
- : mRendererMajorShaderModel(renderer->getMajorShaderModel()),
- mShaderModelSuffix(renderer->getShaderModelSuffix()),
- mUsesInstancedPointSpriteEmulation(
- renderer->getWorkarounds().useInstancedPointSpriteEmulation),
- mUsesViewScale(renderer->presentPathFastEnabled()),
- mHasANGLEMultiviewEnabled(vertexShader->hasANGLEMultiviewEnabled()),
- mUsesViewID(fragmentShader->usesViewID()),
- mCanSelectViewInVertexShader(renderer->canSelectViewInVertexShader()),
- mVertexShader(vertexShader),
- mFragmentShader(fragmentShader)
-{
-}
-
-int ProgramD3DMetadata::getRendererMajorShaderModel() const
-{
- return mRendererMajorShaderModel;
-}
-
-bool ProgramD3DMetadata::usesBroadcast(const gl::ContextState &data) const
-{
- return (mFragmentShader->usesFragColor() && mFragmentShader->usesMultipleRenderTargets() &&
- data.getClientMajorVersion() < 3);
-}
-
-bool ProgramD3DMetadata::usesFragDepth() const
-{
- return mFragmentShader->usesFragDepth();
-}
-
-bool ProgramD3DMetadata::usesPointCoord() const
-{
- return mFragmentShader->usesPointCoord();
-}
-
-bool ProgramD3DMetadata::usesFragCoord() const
-{
- return mFragmentShader->usesFragCoord();
-}
-
-bool ProgramD3DMetadata::usesPointSize() const
-{
- return mVertexShader->usesPointSize();
-}
-
-bool ProgramD3DMetadata::usesInsertedPointCoordValue() const
-{
- return (!usesPointSize() || !mUsesInstancedPointSpriteEmulation) && usesPointCoord() &&
- mRendererMajorShaderModel >= 4;
-}
-
-bool ProgramD3DMetadata::usesViewScale() const
-{
- return mUsesViewScale;
-}
-
-bool ProgramD3DMetadata::hasANGLEMultiviewEnabled() const
-{
- return mHasANGLEMultiviewEnabled;
-}
-
-bool ProgramD3DMetadata::usesViewID() const
-{
- return mUsesViewID;
-}
-
-bool ProgramD3DMetadata::canSelectViewInVertexShader() const
-{
- return mCanSelectViewInVertexShader;
-}
-
-bool ProgramD3DMetadata::addsPointCoordToVertexShader() const
-{
- // PointSprite emulation requiress that gl_PointCoord is present in the vertex shader
- // VS_OUTPUT structure to ensure compatibility with the generated PS_INPUT of the pixel shader.
- // Even with a geometry shader, the app can render triangles or lines and reference
- // gl_PointCoord in the fragment shader, requiring us to provide a dummy value. For
- // simplicity, we always add this to the vertex shader when the fragment shader
- // references gl_PointCoord, even if we could skip it in the geometry shader.
- return (mUsesInstancedPointSpriteEmulation && usesPointCoord()) ||
- usesInsertedPointCoordValue();
-}
-
-bool ProgramD3DMetadata::usesTransformFeedbackGLPosition() const
-{
- // gl_Position only needs to be outputted from the vertex shader if transform feedback is
- // active. This isn't supported on D3D11 Feature Level 9_3, so we don't output gl_Position from
- // the vertex shader in this case. This saves us 1 output vector.
- return !(mRendererMajorShaderModel >= 4 && mShaderModelSuffix != "");
-}
-
-bool ProgramD3DMetadata::usesSystemValuePointSize() const
-{
- return !mUsesInstancedPointSpriteEmulation && usesPointSize();
-}
-
-bool ProgramD3DMetadata::usesMultipleFragmentOuts() const
-{
- return mFragmentShader->usesMultipleRenderTargets();
-}
-
-GLint ProgramD3DMetadata::getMajorShaderVersion() const
-{
- return mVertexShader->getData().getShaderVersion();
-}
-
-const ShaderD3D *ProgramD3DMetadata::getFragmentShader() const
-{
- return mFragmentShader;
-}
-
-// ProgramD3D Implementation
-
-ProgramD3D::VertexExecutable::VertexExecutable(const gl::InputLayout &inputLayout,
- const Signature &signature,
- ShaderExecutableD3D *shaderExecutable)
- : mInputs(inputLayout), mSignature(signature), mShaderExecutable(shaderExecutable)
-{
-}
-
-ProgramD3D::VertexExecutable::~VertexExecutable()
-{
- SafeDelete(mShaderExecutable);
-}
-
-// static
-ProgramD3D::VertexExecutable::HLSLAttribType ProgramD3D::VertexExecutable::GetAttribType(
- GLenum type)
-{
- switch (type)
- {
- case GL_INT:
- return HLSLAttribType::SIGNED_INT;
- case GL_UNSIGNED_INT:
- return HLSLAttribType::UNSIGNED_INT;
- case GL_SIGNED_NORMALIZED:
- case GL_UNSIGNED_NORMALIZED:
- case GL_FLOAT:
- return HLSLAttribType::FLOAT;
- default:
- UNREACHABLE();
- return HLSLAttribType::FLOAT;
- }
-}
-
-// static
-void ProgramD3D::VertexExecutable::getSignature(RendererD3D *renderer,
- const gl::InputLayout &inputLayout,
- Signature *signatureOut)
-{
- signatureOut->assign(inputLayout.size(), HLSLAttribType::FLOAT);
-
- for (size_t index = 0; index < inputLayout.size(); ++index)
- {
- gl::VertexFormatType vertexFormatType = inputLayout[index];
- if (vertexFormatType == gl::VERTEX_FORMAT_INVALID)
- continue;
-
- VertexConversionType conversionType = renderer->getVertexConversionType(vertexFormatType);
- if ((conversionType & VERTEX_CONVERT_GPU) == 0)
- continue;
-
- GLenum componentType = renderer->getVertexComponentType(vertexFormatType);
- (*signatureOut)[index] = GetAttribType(componentType);
- }
-}
-
-bool ProgramD3D::VertexExecutable::matchesSignature(const Signature &signature) const
-{
- size_t limit = std::max(mSignature.size(), signature.size());
- for (size_t index = 0; index < limit; ++index)
- {
- // treat undefined indexes as FLOAT
- auto a = index < signature.size() ? signature[index] : HLSLAttribType::FLOAT;
- auto b = index < mSignature.size() ? mSignature[index] : HLSLAttribType::FLOAT;
- if (a != b)
- return false;
- }
-
- return true;
-}
-
-ProgramD3D::PixelExecutable::PixelExecutable(const std::vector<GLenum> &outputSignature,
- ShaderExecutableD3D *shaderExecutable)
- : mOutputSignature(outputSignature), mShaderExecutable(shaderExecutable)
-{
-}
-
-ProgramD3D::PixelExecutable::~PixelExecutable()
-{
- SafeDelete(mShaderExecutable);
-}
-
-ProgramD3D::Sampler::Sampler() : active(false), logicalTextureUnit(0), textureType(GL_TEXTURE_2D)
-{
-}
-
-unsigned int ProgramD3D::mCurrentSerial = 1;
-
-ProgramD3D::ProgramD3D(const gl::ProgramState &state, RendererD3D *renderer)
- : ProgramImpl(state),
- mRenderer(renderer),
- mDynamicHLSL(nullptr),
- mGeometryExecutables(gl::PRIMITIVE_TYPE_MAX),
- mComputeExecutable(nullptr),
- mUsesPointSize(false),
- mUsesFlatInterpolation(false),
- mVertexUniformStorage(nullptr),
- mFragmentUniformStorage(nullptr),
- mComputeUniformStorage(nullptr),
- mUsedVertexSamplerRange(0),
- mUsedPixelSamplerRange(0),
- mUsedComputeSamplerRange(0),
- mDirtySamplerMapping(true),
- mSerial(issueSerial()),
- mVertexUniformsDirty(true),
- mFragmentUniformsDirty(true),
- mComputeUniformsDirty(true)
-{
- mDynamicHLSL = new DynamicHLSL(renderer);
-}
-
-ProgramD3D::~ProgramD3D()
-{
- reset();
- SafeDelete(mDynamicHLSL);
-}
-
-bool ProgramD3D::usesPointSpriteEmulation() const
-{
- return mUsesPointSize && mRenderer->getMajorShaderModel() >= 4;
-}
-
-bool ProgramD3D::usesGeometryShaderForPointSpriteEmulation() const
-{
- return usesPointSpriteEmulation() && !usesInstancedPointSpriteEmulation();
-}
-
-bool ProgramD3D::usesGeometryShader(GLenum drawMode) const
-{
- if (mHasANGLEMultiviewEnabled && !mRenderer->canSelectViewInVertexShader())
- {
- return true;
- }
- if (drawMode != GL_POINTS)
- {
- return mUsesFlatInterpolation;
- }
- return usesGeometryShaderForPointSpriteEmulation();
-}
-
-bool ProgramD3D::usesInstancedPointSpriteEmulation() const
-{
- return mRenderer->getWorkarounds().useInstancedPointSpriteEmulation;
-}
-
-GLint ProgramD3D::getSamplerMapping(gl::SamplerType type,
- unsigned int samplerIndex,
- const gl::Caps &caps) const
-{
- GLint logicalTextureUnit = -1;
-
- switch (type)
- {
- case gl::SAMPLER_PIXEL:
- ASSERT(samplerIndex < caps.maxTextureImageUnits);
- if (samplerIndex < mSamplersPS.size() && mSamplersPS[samplerIndex].active)
- {
- logicalTextureUnit = mSamplersPS[samplerIndex].logicalTextureUnit;
- }
- break;
- case gl::SAMPLER_VERTEX:
- ASSERT(samplerIndex < caps.maxVertexTextureImageUnits);
- if (samplerIndex < mSamplersVS.size() && mSamplersVS[samplerIndex].active)
- {
- logicalTextureUnit = mSamplersVS[samplerIndex].logicalTextureUnit;
- }
- break;
- case gl::SAMPLER_COMPUTE:
- ASSERT(samplerIndex < caps.maxComputeTextureImageUnits);
- if (samplerIndex < mSamplersCS.size() && mSamplersCS[samplerIndex].active)
- {
- logicalTextureUnit = mSamplersCS[samplerIndex].logicalTextureUnit;
- }
- break;
- default:
- UNREACHABLE();
- }
-
- if (logicalTextureUnit >= 0 &&
- logicalTextureUnit < static_cast<GLint>(caps.maxCombinedTextureImageUnits))
- {
- return logicalTextureUnit;
- }
-
- return -1;
-}
-
-// Returns the texture type for a given Direct3D 9 sampler type and
-// index (0-15 for the pixel shader and 0-3 for the vertex shader).
-GLenum ProgramD3D::getSamplerTextureType(gl::SamplerType type, unsigned int samplerIndex) const
-{
- switch (type)
- {
- case gl::SAMPLER_PIXEL:
- ASSERT(samplerIndex < mSamplersPS.size());
- ASSERT(mSamplersPS[samplerIndex].active);
- return mSamplersPS[samplerIndex].textureType;
- case gl::SAMPLER_VERTEX:
- ASSERT(samplerIndex < mSamplersVS.size());
- ASSERT(mSamplersVS[samplerIndex].active);
- return mSamplersVS[samplerIndex].textureType;
- case gl::SAMPLER_COMPUTE:
- ASSERT(samplerIndex < mSamplersCS.size());
- ASSERT(mSamplersCS[samplerIndex].active);
- return mSamplersCS[samplerIndex].textureType;
- default:
- UNREACHABLE();
- }
-
- return GL_TEXTURE_2D;
-}
-
-GLuint ProgramD3D::getUsedSamplerRange(gl::SamplerType type) const
-{
- switch (type)
- {
- case gl::SAMPLER_PIXEL:
- return mUsedPixelSamplerRange;
- case gl::SAMPLER_VERTEX:
- return mUsedVertexSamplerRange;
- case gl::SAMPLER_COMPUTE:
- return mUsedComputeSamplerRange;
- default:
- UNREACHABLE();
- return 0u;
- }
-}
-
-ProgramD3D::SamplerMapping ProgramD3D::updateSamplerMapping()
-{
- if (!mDirtySamplerMapping)
- {
- return SamplerMapping::WasClean;
- }
-
- mDirtySamplerMapping = false;
-
- // Retrieve sampler uniform values
- for (const D3DUniform *d3dUniform : mD3DUniforms)
- {
- if (!d3dUniform->isSampler())
- continue;
-
- int count = d3dUniform->getArraySizeProduct();
-
- if (d3dUniform->isReferencedByFragmentShader())
- {
- unsigned int firstIndex = d3dUniform->psRegisterIndex;
-
- for (int i = 0; i < count; i++)
- {
- unsigned int samplerIndex = firstIndex + i;
-
- if (samplerIndex < mSamplersPS.size())
- {
- ASSERT(mSamplersPS[samplerIndex].active);
- mSamplersPS[samplerIndex].logicalTextureUnit = d3dUniform->mSamplerData[i];
- }
- }
- }
-
- if (d3dUniform->isReferencedByVertexShader())
- {
- unsigned int firstIndex = d3dUniform->vsRegisterIndex;
-
- for (int i = 0; i < count; i++)
- {
- unsigned int samplerIndex = firstIndex + i;
-
- if (samplerIndex < mSamplersVS.size())
- {
- ASSERT(mSamplersVS[samplerIndex].active);
- mSamplersVS[samplerIndex].logicalTextureUnit = d3dUniform->mSamplerData[i];
- }
- }
- }
-
- if (d3dUniform->isReferencedByComputeShader())
- {
- unsigned int firstIndex = d3dUniform->csRegisterIndex;
-
- for (int i = 0; i < count; i++)
- {
- unsigned int samplerIndex = firstIndex + i;
-
- if (samplerIndex < mSamplersCS.size())
- {
- ASSERT(mSamplersCS[samplerIndex].active);
- mSamplersCS[samplerIndex].logicalTextureUnit = d3dUniform->mSamplerData[i];
- }
- }
- }
- }
-
- return SamplerMapping::WasDirty;
-}
-
-gl::LinkResult ProgramD3D::load(const gl::Context *context,
- gl::InfoLog &infoLog,
- gl::BinaryInputStream *stream)
-{
- // TODO(jmadill): Use Renderer from contextImpl.
-
- reset();
-
- DeviceIdentifier binaryDeviceIdentifier = {0};
- stream->readBytes(reinterpret_cast<unsigned char *>(&binaryDeviceIdentifier),
- sizeof(DeviceIdentifier));
-
- DeviceIdentifier identifier = mRenderer->getAdapterIdentifier();
- if (memcmp(&identifier, &binaryDeviceIdentifier, sizeof(DeviceIdentifier)) != 0)
- {
- infoLog << "Invalid program binary, device configuration has changed.";
- return false;
- }
-
- int compileFlags = stream->readInt<int>();
- if (compileFlags != ANGLE_COMPILE_OPTIMIZATION_LEVEL)
- {
- infoLog << "Mismatched compilation flags.";
- return false;
- }
-
- for (int &index : mAttribLocationToD3DSemantic)
- {
- stream->readInt(&index);
- }
-
- const unsigned int psSamplerCount = stream->readInt<unsigned int>();
- for (unsigned int i = 0; i < psSamplerCount; ++i)
- {
- Sampler sampler;
- stream->readBool(&sampler.active);
- stream->readInt(&sampler.logicalTextureUnit);
- stream->readInt(&sampler.textureType);
- mSamplersPS.push_back(sampler);
- }
- const unsigned int vsSamplerCount = stream->readInt<unsigned int>();
- for (unsigned int i = 0; i < vsSamplerCount; ++i)
- {
- Sampler sampler;
- stream->readBool(&sampler.active);
- stream->readInt(&sampler.logicalTextureUnit);
- stream->readInt(&sampler.textureType);
- mSamplersVS.push_back(sampler);
- }
-
- const unsigned int csSamplerCount = stream->readInt<unsigned int>();
- for (unsigned int i = 0; i < csSamplerCount; ++i)
- {
- Sampler sampler;
- stream->readBool(&sampler.active);
- stream->readInt(&sampler.logicalTextureUnit);
- stream->readInt(&sampler.textureType);
- mSamplersCS.push_back(sampler);
- }
-
- stream->readInt(&mUsedVertexSamplerRange);
- stream->readInt(&mUsedPixelSamplerRange);
- stream->readInt(&mUsedComputeSamplerRange);
-
- const unsigned int uniformCount = stream->readInt<unsigned int>();
- if (stream->error())
- {
- infoLog << "Invalid program binary.";
- return false;
- }
-
- const auto &linkedUniforms = mState.getUniforms();
- ASSERT(mD3DUniforms.empty());
- for (unsigned int uniformIndex = 0; uniformIndex < uniformCount; uniformIndex++)
- {
- const gl::LinkedUniform &linkedUniform = linkedUniforms[uniformIndex];
-
- D3DUniform *d3dUniform =
- new D3DUniform(linkedUniform.type, linkedUniform.name, linkedUniform.arraySizes,
- linkedUniform.isInDefaultBlock());
- stream->readInt(&d3dUniform->psRegisterIndex);
- stream->readInt(&d3dUniform->vsRegisterIndex);
- stream->readInt(&d3dUniform->csRegisterIndex);
- stream->readInt(&d3dUniform->registerCount);
- stream->readInt(&d3dUniform->registerElement);
-
- mD3DUniforms.push_back(d3dUniform);
- }
-
- const unsigned int blockCount = stream->readInt<unsigned int>();
- if (stream->error())
- {
- infoLog << "Invalid program binary.";
- return false;
- }
-
- ASSERT(mD3DUniformBlocks.empty());
- for (unsigned int blockIndex = 0; blockIndex < blockCount; ++blockIndex)
- {
- D3DUniformBlock uniformBlock;
- stream->readInt(&uniformBlock.psRegisterIndex);
- stream->readInt(&uniformBlock.vsRegisterIndex);
- stream->readInt(&uniformBlock.csRegisterIndex);
- mD3DUniformBlocks.push_back(uniformBlock);
- }
-
- const unsigned int streamOutVaryingCount = stream->readInt<unsigned int>();
- mStreamOutVaryings.resize(streamOutVaryingCount);
- for (unsigned int varyingIndex = 0; varyingIndex < streamOutVaryingCount; ++varyingIndex)
- {
- D3DVarying *varying = &mStreamOutVaryings[varyingIndex];
-
- stream->readString(&varying->semanticName);
- stream->readInt(&varying->semanticIndex);
- stream->readInt(&varying->componentCount);
- stream->readInt(&varying->outputSlot);
- }
-
- stream->readString(&mVertexHLSL);
- stream->readBytes(reinterpret_cast<unsigned char *>(&mVertexWorkarounds),
- sizeof(angle::CompilerWorkaroundsD3D));
- stream->readString(&mPixelHLSL);
- stream->readBytes(reinterpret_cast<unsigned char *>(&mPixelWorkarounds),
- sizeof(angle::CompilerWorkaroundsD3D));
- stream->readBool(&mUsesFragDepth);
- stream->readBool(&mHasANGLEMultiviewEnabled);
- stream->readBool(&mUsesViewID);
- stream->readBool(&mUsesPointSize);
- stream->readBool(&mUsesFlatInterpolation);
-
- const size_t pixelShaderKeySize = stream->readInt<unsigned int>();
- mPixelShaderKey.resize(pixelShaderKeySize);
- for (size_t pixelShaderKeyIndex = 0; pixelShaderKeyIndex < pixelShaderKeySize;
- pixelShaderKeyIndex++)
- {
- stream->readInt(&mPixelShaderKey[pixelShaderKeyIndex].type);
- stream->readString(&mPixelShaderKey[pixelShaderKeyIndex].name);
- stream->readString(&mPixelShaderKey[pixelShaderKeyIndex].source);
- stream->readInt(&mPixelShaderKey[pixelShaderKeyIndex].outputIndex);
- }
-
- stream->readString(&mGeometryShaderPreamble);
-
- const unsigned char *binary = reinterpret_cast<const unsigned char *>(stream->data());
-
- bool separateAttribs = (mState.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS);
-
- const unsigned int vertexShaderCount = stream->readInt<unsigned int>();
- for (unsigned int vertexShaderIndex = 0; vertexShaderIndex < vertexShaderCount;
- vertexShaderIndex++)
- {
- size_t inputLayoutSize = stream->readInt<size_t>();
- gl::InputLayout inputLayout(inputLayoutSize, gl::VERTEX_FORMAT_INVALID);
-
- for (size_t inputIndex = 0; inputIndex < inputLayoutSize; inputIndex++)
- {
- inputLayout[inputIndex] = stream->readInt<gl::VertexFormatType>();
- }
-
- unsigned int vertexShaderSize = stream->readInt<unsigned int>();
- const unsigned char *vertexShaderFunction = binary + stream->offset();
-
- ShaderExecutableD3D *shaderExecutable = nullptr;
-
- ANGLE_TRY(mRenderer->loadExecutable(vertexShaderFunction, vertexShaderSize,
- gl::SHADER_VERTEX, mStreamOutVaryings, separateAttribs,
- &shaderExecutable));
-
- if (!shaderExecutable)
- {
- infoLog << "Could not create vertex shader.";
- return false;
- }
-
- // generated converted input layout
- VertexExecutable::Signature signature;
- VertexExecutable::getSignature(mRenderer, inputLayout, &signature);
-
- // add new binary
- mVertexExecutables.push_back(std::unique_ptr<VertexExecutable>(
- new VertexExecutable(inputLayout, signature, shaderExecutable)));
-
- stream->skip(vertexShaderSize);
- }
-
- const size_t pixelShaderCount = stream->readInt<unsigned int>();
- for (size_t pixelShaderIndex = 0; pixelShaderIndex < pixelShaderCount; pixelShaderIndex++)
- {
- const size_t outputCount = stream->readInt<unsigned int>();
- std::vector<GLenum> outputs(outputCount);
- for (size_t outputIndex = 0; outputIndex < outputCount; outputIndex++)
- {
- stream->readInt(&outputs[outputIndex]);
- }
-
- const size_t pixelShaderSize = stream->readInt<unsigned int>();
- const unsigned char *pixelShaderFunction = binary + stream->offset();
- ShaderExecutableD3D *shaderExecutable = nullptr;
-
- ANGLE_TRY(mRenderer->loadExecutable(pixelShaderFunction, pixelShaderSize,
- gl::SHADER_FRAGMENT, mStreamOutVaryings,
- separateAttribs, &shaderExecutable));
-
- if (!shaderExecutable)
- {
- infoLog << "Could not create pixel shader.";
- return false;
- }
-
- // add new binary
- mPixelExecutables.push_back(
- std::unique_ptr<PixelExecutable>(new PixelExecutable(outputs, shaderExecutable)));
-
- stream->skip(pixelShaderSize);
- }
-
- for (unsigned int geometryExeIndex = 0; geometryExeIndex < gl::PRIMITIVE_TYPE_MAX;
- ++geometryExeIndex)
- {
- unsigned int geometryShaderSize = stream->readInt<unsigned int>();
- if (geometryShaderSize == 0)
- {
- continue;
- }
-
- const unsigned char *geometryShaderFunction = binary + stream->offset();
-
- ShaderExecutableD3D *geometryExecutable = nullptr;
- ANGLE_TRY(mRenderer->loadExecutable(geometryShaderFunction, geometryShaderSize,
- gl::SHADER_GEOMETRY, mStreamOutVaryings,
- separateAttribs, &geometryExecutable));
-
- if (!geometryExecutable)
- {
- infoLog << "Could not create geometry shader.";
- return false;
- }
-
- mGeometryExecutables[geometryExeIndex].reset(geometryExecutable);
-
- stream->skip(geometryShaderSize);
- }
-
- unsigned int computeShaderSize = stream->readInt<unsigned int>();
- if (computeShaderSize > 0)
- {
- const unsigned char *computeShaderFunction = binary + stream->offset();
-
- ShaderExecutableD3D *computeExecutable = nullptr;
- ANGLE_TRY(mRenderer->loadExecutable(computeShaderFunction, computeShaderSize,
- gl::SHADER_COMPUTE, std::vector<D3DVarying>(), false,
- &computeExecutable));
-
- if (!computeExecutable)
- {
- infoLog << "Could not create compute shader.";
- return false;
- }
-
- mComputeExecutable.reset(computeExecutable);
- }
-
- initializeUniformStorage();
-
- return true;
-}
-
-void ProgramD3D::save(const gl::Context *context, gl::BinaryOutputStream *stream)
-{
- // Output the DeviceIdentifier before we output any shader code
- // When we load the binary again later, we can validate the device identifier before trying to
- // compile any HLSL
- DeviceIdentifier binaryIdentifier = mRenderer->getAdapterIdentifier();
- stream->writeBytes(reinterpret_cast<unsigned char *>(&binaryIdentifier),
- sizeof(DeviceIdentifier));
-
- stream->writeInt(ANGLE_COMPILE_OPTIMIZATION_LEVEL);
-
- for (int d3dSemantic : mAttribLocationToD3DSemantic)
- {
- stream->writeInt(d3dSemantic);
- }
-
- stream->writeInt(mSamplersPS.size());
- for (unsigned int i = 0; i < mSamplersPS.size(); ++i)
- {
- stream->writeInt(mSamplersPS[i].active);
- stream->writeInt(mSamplersPS[i].logicalTextureUnit);
- stream->writeInt(mSamplersPS[i].textureType);
- }
-
- stream->writeInt(mSamplersVS.size());
- for (unsigned int i = 0; i < mSamplersVS.size(); ++i)
- {
- stream->writeInt(mSamplersVS[i].active);
- stream->writeInt(mSamplersVS[i].logicalTextureUnit);
- stream->writeInt(mSamplersVS[i].textureType);
- }
-
- stream->writeInt(mSamplersCS.size());
- for (unsigned int i = 0; i < mSamplersCS.size(); ++i)
- {
- stream->writeInt(mSamplersCS[i].active);
- stream->writeInt(mSamplersCS[i].logicalTextureUnit);
- stream->writeInt(mSamplersCS[i].textureType);
- }
-
- stream->writeInt(mUsedVertexSamplerRange);
- stream->writeInt(mUsedPixelSamplerRange);
- stream->writeInt(mUsedComputeSamplerRange);
-
- stream->writeInt(mD3DUniforms.size());
- for (const D3DUniform *uniform : mD3DUniforms)
- {
- // Type, name and arraySize are redundant, so aren't stored in the binary.
- stream->writeIntOrNegOne(uniform->psRegisterIndex);
- stream->writeIntOrNegOne(uniform->vsRegisterIndex);
- stream->writeIntOrNegOne(uniform->csRegisterIndex);
- stream->writeInt(uniform->registerCount);
- stream->writeInt(uniform->registerElement);
- }
-
- stream->writeInt(mD3DUniformBlocks.size());
- for (const D3DUniformBlock &uniformBlock : mD3DUniformBlocks)
- {
- stream->writeIntOrNegOne(uniformBlock.psRegisterIndex);
- stream->writeIntOrNegOne(uniformBlock.vsRegisterIndex);
- stream->writeIntOrNegOne(uniformBlock.csRegisterIndex);
- }
-
- stream->writeInt(mStreamOutVaryings.size());
- for (const auto &varying : mStreamOutVaryings)
- {
- stream->writeString(varying.semanticName);
- stream->writeInt(varying.semanticIndex);
- stream->writeInt(varying.componentCount);
- stream->writeInt(varying.outputSlot);
- }
-
- stream->writeString(mVertexHLSL);
- stream->writeBytes(reinterpret_cast<unsigned char *>(&mVertexWorkarounds),
- sizeof(angle::CompilerWorkaroundsD3D));
- stream->writeString(mPixelHLSL);
- stream->writeBytes(reinterpret_cast<unsigned char *>(&mPixelWorkarounds),
- sizeof(angle::CompilerWorkaroundsD3D));
- stream->writeInt(mUsesFragDepth);
- stream->writeInt(mHasANGLEMultiviewEnabled);
- stream->writeInt(mUsesViewID);
- stream->writeInt(mUsesPointSize);
- stream->writeInt(mUsesFlatInterpolation);
-
- const std::vector<PixelShaderOutputVariable> &pixelShaderKey = mPixelShaderKey;
- stream->writeInt(pixelShaderKey.size());
- for (size_t pixelShaderKeyIndex = 0; pixelShaderKeyIndex < pixelShaderKey.size();
- pixelShaderKeyIndex++)
- {
- const PixelShaderOutputVariable &variable = pixelShaderKey[pixelShaderKeyIndex];
- stream->writeInt(variable.type);
- stream->writeString(variable.name);
- stream->writeString(variable.source);
- stream->writeInt(variable.outputIndex);
- }
-
- stream->writeString(mGeometryShaderPreamble);
-
- stream->writeInt(mVertexExecutables.size());
- for (size_t vertexExecutableIndex = 0; vertexExecutableIndex < mVertexExecutables.size();
- vertexExecutableIndex++)
- {
- VertexExecutable *vertexExecutable = mVertexExecutables[vertexExecutableIndex].get();
-
- const auto &inputLayout = vertexExecutable->inputs();
- stream->writeInt(inputLayout.size());
-
- for (size_t inputIndex = 0; inputIndex < inputLayout.size(); inputIndex++)
- {
- stream->writeInt(static_cast<unsigned int>(inputLayout[inputIndex]));
- }
-
- size_t vertexShaderSize = vertexExecutable->shaderExecutable()->getLength();
- stream->writeInt(vertexShaderSize);
-
- const uint8_t *vertexBlob = vertexExecutable->shaderExecutable()->getFunction();
- stream->writeBytes(vertexBlob, vertexShaderSize);
- }
-
- stream->writeInt(mPixelExecutables.size());
- for (size_t pixelExecutableIndex = 0; pixelExecutableIndex < mPixelExecutables.size();
- pixelExecutableIndex++)
- {
- PixelExecutable *pixelExecutable = mPixelExecutables[pixelExecutableIndex].get();
-
- const std::vector<GLenum> outputs = pixelExecutable->outputSignature();
- stream->writeInt(outputs.size());
- for (size_t outputIndex = 0; outputIndex < outputs.size(); outputIndex++)
- {
- stream->writeInt(outputs[outputIndex]);
- }
-
- size_t pixelShaderSize = pixelExecutable->shaderExecutable()->getLength();
- stream->writeInt(pixelShaderSize);
-
- const uint8_t *pixelBlob = pixelExecutable->shaderExecutable()->getFunction();
- stream->writeBytes(pixelBlob, pixelShaderSize);
- }
-
- for (auto const &geometryExecutable : mGeometryExecutables)
- {
- if (!geometryExecutable)
- {
- stream->writeInt(0);
- continue;
- }
-
- size_t geometryShaderSize = geometryExecutable->getLength();
- stream->writeInt(geometryShaderSize);
- stream->writeBytes(geometryExecutable->getFunction(), geometryShaderSize);
- }
-
- if (mComputeExecutable)
- {
- size_t computeShaderSize = mComputeExecutable->getLength();
- stream->writeInt(computeShaderSize);
- stream->writeBytes(mComputeExecutable->getFunction(), computeShaderSize);
- }
- else
- {
- stream->writeInt(0);
- }
-}
-
-void ProgramD3D::setBinaryRetrievableHint(bool /* retrievable */)
-{
-}
-
-void ProgramD3D::setSeparable(bool /* separable */)
-{
-}
-
-gl::Error ProgramD3D::getPixelExecutableForCachedOutputLayout(ShaderExecutableD3D **outExecutable,
- gl::InfoLog *infoLog)
-{
- if (mCachedPixelExecutableIndex.valid())
- {
- *outExecutable = mPixelExecutables[mCachedPixelExecutableIndex.value()]->shaderExecutable();
- return gl::NoError();
- }
-
- std::string finalPixelHLSL = mDynamicHLSL->generatePixelShaderForOutputSignature(
- mPixelHLSL, mPixelShaderKey, mUsesFragDepth, mPixelShaderOutputLayoutCache);
-
- // Generate new pixel executable
- ShaderExecutableD3D *pixelExecutable = nullptr;
-
- gl::InfoLog tempInfoLog;
- gl::InfoLog *currentInfoLog = infoLog ? infoLog : &tempInfoLog;
-
- ANGLE_TRY(mRenderer->compileToExecutable(
- *currentInfoLog, finalPixelHLSL, gl::SHADER_FRAGMENT, mStreamOutVaryings,
- (mState.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), mPixelWorkarounds,
- &pixelExecutable));
-
- if (pixelExecutable)
- {
- mPixelExecutables.push_back(std::unique_ptr<PixelExecutable>(
- new PixelExecutable(mPixelShaderOutputLayoutCache, pixelExecutable)));
- mCachedPixelExecutableIndex = mPixelExecutables.size() - 1;
- }
- else if (!infoLog)
- {
- ERR() << "Error compiling dynamic pixel executable:" << std::endl
- << tempInfoLog.str() << std::endl;
- }
-
- *outExecutable = pixelExecutable;
- return gl::NoError();
-}
-
-gl::Error ProgramD3D::getVertexExecutableForCachedInputLayout(ShaderExecutableD3D **outExectuable,
- gl::InfoLog *infoLog)
-{
- if (mCachedVertexExecutableIndex.valid())
- {
- *outExectuable =
- mVertexExecutables[mCachedVertexExecutableIndex.value()]->shaderExecutable();
- return gl::NoError();
- }
-
- // Generate new dynamic layout with attribute conversions
- std::string finalVertexHLSL = mDynamicHLSL->generateVertexShaderForInputLayout(
- mVertexHLSL, mCachedInputLayout, mState.getAttributes());
-
- // Generate new vertex executable
- ShaderExecutableD3D *vertexExecutable = nullptr;
-
- gl::InfoLog tempInfoLog;
- gl::InfoLog *currentInfoLog = infoLog ? infoLog : &tempInfoLog;
-
- ANGLE_TRY(mRenderer->compileToExecutable(
- *currentInfoLog, finalVertexHLSL, gl::SHADER_VERTEX, mStreamOutVaryings,
- (mState.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), mVertexWorkarounds,
- &vertexExecutable));
-
- if (vertexExecutable)
- {
- mVertexExecutables.push_back(std::unique_ptr<VertexExecutable>(
- new VertexExecutable(mCachedInputLayout, mCachedVertexSignature, vertexExecutable)));
- mCachedVertexExecutableIndex = mVertexExecutables.size() - 1;
- }
- else if (!infoLog)
- {
- ERR() << "Error compiling dynamic vertex executable:" << std::endl
- << tempInfoLog.str() << std::endl;
- }
-
- *outExectuable = vertexExecutable;
- return gl::NoError();
-}
-
-gl::Error ProgramD3D::getGeometryExecutableForPrimitiveType(const gl::Context *context,
- GLenum drawMode,
- ShaderExecutableD3D **outExecutable,
- gl::InfoLog *infoLog)
-{
- if (outExecutable)
- {
- *outExecutable = nullptr;
- }
-
- // Return a null shader if the current rendering doesn't use a geometry shader
- if (!usesGeometryShader(drawMode))
- {
- return gl::NoError();
- }
-
- gl::PrimitiveType geometryShaderType = GetGeometryShaderTypeFromDrawMode(drawMode);
-
- if (mGeometryExecutables[geometryShaderType])
- {
- if (outExecutable)
- {
- *outExecutable = mGeometryExecutables[geometryShaderType].get();
- }
- return gl::NoError();
- }
-
- std::string geometryHLSL = mDynamicHLSL->generateGeometryShaderHLSL(
- context, geometryShaderType, mState, mRenderer->presentPathFastEnabled(),
- mHasANGLEMultiviewEnabled, mRenderer->canSelectViewInVertexShader(),
- usesGeometryShaderForPointSpriteEmulation(), mGeometryShaderPreamble);
-
- gl::InfoLog tempInfoLog;
- gl::InfoLog *currentInfoLog = infoLog ? infoLog : &tempInfoLog;
-
- ShaderExecutableD3D *geometryExecutable = nullptr;
- gl::Error error = mRenderer->compileToExecutable(
- *currentInfoLog, geometryHLSL, gl::SHADER_GEOMETRY, mStreamOutVaryings,
- (mState.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS),
- angle::CompilerWorkaroundsD3D(), &geometryExecutable);
-
- if (!infoLog && error.isError())
- {
- ERR() << "Error compiling dynamic geometry executable:" << std::endl
- << tempInfoLog.str() << std::endl;
- }
-
- if (geometryExecutable != nullptr)
- {
- mGeometryExecutables[geometryShaderType].reset(geometryExecutable);
- }
-
- if (outExecutable)
- {
- *outExecutable = mGeometryExecutables[geometryShaderType].get();
- }
- return error;
-}
-
-class ProgramD3D::GetExecutableTask : public Closure
-{
- public:
- GetExecutableTask(ProgramD3D *program)
- : mProgram(program), mError(gl::NoError()), mInfoLog(), mResult(nullptr)
- {
- }
-
- virtual gl::Error run() = 0;
-
- void operator()() override { mError = run(); }
-
- const gl::Error &getError() const { return mError; }
- const gl::InfoLog &getInfoLog() const { return mInfoLog; }
- ShaderExecutableD3D *getResult() { return mResult; }
-
- protected:
- ProgramD3D *mProgram;
- gl::Error mError;
- gl::InfoLog mInfoLog;
- ShaderExecutableD3D *mResult;
-};
-
-class ProgramD3D::GetVertexExecutableTask : public ProgramD3D::GetExecutableTask
-{
- public:
- GetVertexExecutableTask(ProgramD3D *program, const gl::Context *context)
- : GetExecutableTask(program), mContext(context)
- {
- }
- gl::Error run() override
- {
- mProgram->updateCachedInputLayoutFromShader(mContext);
-
- ANGLE_TRY(mProgram->getVertexExecutableForCachedInputLayout(&mResult, &mInfoLog));
-
- return gl::NoError();
- }
-
- private:
- const gl::Context *mContext;
-};
-
-void ProgramD3D::updateCachedInputLayoutFromShader(const gl::Context *context)
-{
- GetDefaultInputLayoutFromShader(context, mState.getAttachedVertexShader(), &mCachedInputLayout);
- VertexExecutable::getSignature(mRenderer, mCachedInputLayout, &mCachedVertexSignature);
- updateCachedVertexExecutableIndex();
-}
-
-class ProgramD3D::GetPixelExecutableTask : public ProgramD3D::GetExecutableTask
-{
- public:
- GetPixelExecutableTask(ProgramD3D *program) : GetExecutableTask(program) {}
- gl::Error run() override
- {
- mProgram->updateCachedOutputLayoutFromShader();
-
- ANGLE_TRY(mProgram->getPixelExecutableForCachedOutputLayout(&mResult, &mInfoLog));
-
- return gl::NoError();
- }
-};
-
-void ProgramD3D::updateCachedOutputLayoutFromShader()
-{
- GetDefaultOutputLayoutFromShader(mPixelShaderKey, &mPixelShaderOutputLayoutCache);
- updateCachedPixelExecutableIndex();
-}
-
-class ProgramD3D::GetGeometryExecutableTask : public ProgramD3D::GetExecutableTask
-{
- public:
- GetGeometryExecutableTask(ProgramD3D *program, const gl::Context *context)
- : GetExecutableTask(program), mContext(context)
- {
- }
-
- gl::Error run() override
- {
- // Auto-generate the geometry shader here, if we expect to be using point rendering in
- // D3D11.
- if (mProgram->usesGeometryShader(GL_POINTS))
- {
- ANGLE_TRY(mProgram->getGeometryExecutableForPrimitiveType(mContext, GL_POINTS, &mResult,
- &mInfoLog));
- }
-
- return gl::NoError();
- }
-
- private:
- const gl::Context *mContext;
-};
-
-gl::Error ProgramD3D::getComputeExecutable(ShaderExecutableD3D **outExecutable)
-{
- if (outExecutable)
- {
- *outExecutable = mComputeExecutable.get();
- }
-
- return gl::NoError();
-}
-
-gl::LinkResult ProgramD3D::compileProgramExecutables(const gl::Context *context,
- gl::InfoLog &infoLog)
-{
- // Ensure the compiler is initialized to avoid race conditions.
- ANGLE_TRY(mRenderer->ensureHLSLCompilerInitialized());
-
- WorkerThreadPool *workerPool = mRenderer->getWorkerThreadPool();
-
- GetVertexExecutableTask vertexTask(this, context);
- GetPixelExecutableTask pixelTask(this);
- GetGeometryExecutableTask geometryTask(this, context);
-
- std::array<WaitableEvent, 3> waitEvents = {{workerPool->postWorkerTask(&vertexTask),
- workerPool->postWorkerTask(&pixelTask),
- workerPool->postWorkerTask(&geometryTask)}};
-
- WaitableEvent::WaitMany(&waitEvents);
-
- infoLog << vertexTask.getInfoLog().str();
- infoLog << pixelTask.getInfoLog().str();
- infoLog << geometryTask.getInfoLog().str();
-
- ANGLE_TRY(vertexTask.getError());
- ANGLE_TRY(pixelTask.getError());
- ANGLE_TRY(geometryTask.getError());
-
- ShaderExecutableD3D *defaultVertexExecutable = vertexTask.getResult();
- ShaderExecutableD3D *defaultPixelExecutable = pixelTask.getResult();
- ShaderExecutableD3D *pointGS = geometryTask.getResult();
-
- const ShaderD3D *vertexShaderD3D = GetImplAs<ShaderD3D>(mState.getAttachedVertexShader());
-
- if (usesGeometryShader(GL_POINTS) && pointGS)
- {
- // Geometry shaders are currently only used internally, so there is no corresponding shader
- // object at the interface level. For now the geometry shader debug info is prepended to
- // the vertex shader.
- vertexShaderD3D->appendDebugInfo("// GEOMETRY SHADER BEGIN\n\n");
- vertexShaderD3D->appendDebugInfo(pointGS->getDebugInfo());
- vertexShaderD3D->appendDebugInfo("\nGEOMETRY SHADER END\n\n\n");
- }
-
- if (defaultVertexExecutable)
- {
- vertexShaderD3D->appendDebugInfo(defaultVertexExecutable->getDebugInfo());
- }
-
- if (defaultPixelExecutable)
- {
- const ShaderD3D *fragmentShaderD3D =
- GetImplAs<ShaderD3D>(mState.getAttachedFragmentShader());
- fragmentShaderD3D->appendDebugInfo(defaultPixelExecutable->getDebugInfo());
- }
-
- return (defaultVertexExecutable && defaultPixelExecutable &&
- (!usesGeometryShader(GL_POINTS) || pointGS));
-}
-
-gl::LinkResult ProgramD3D::compileComputeExecutable(const gl::Context *context,
- gl::InfoLog &infoLog)
-{
- // Ensure the compiler is initialized to avoid race conditions.
- ANGLE_TRY(mRenderer->ensureHLSLCompilerInitialized());
-
- std::string computeShader = mDynamicHLSL->generateComputeShaderLinkHLSL(context, mState);
-
- ShaderExecutableD3D *computeExecutable = nullptr;
- ANGLE_TRY(mRenderer->compileToExecutable(infoLog, computeShader, gl::SHADER_COMPUTE,
- std::vector<D3DVarying>(), false,
- angle::CompilerWorkaroundsD3D(), &computeExecutable));
-
- if (computeExecutable == nullptr)
- {
- ERR() << "Error compiling dynamic compute executable:" << std::endl
- << infoLog.str() << std::endl;
- }
- else
- {
- const ShaderD3D *computeShaderD3D = GetImplAs<ShaderD3D>(mState.getAttachedComputeShader());
- computeShaderD3D->appendDebugInfo(computeExecutable->getDebugInfo());
- mComputeExecutable.reset(computeExecutable);
- }
-
- return mComputeExecutable.get() != nullptr;
-}
-
-gl::LinkResult ProgramD3D::link(const gl::Context *context,
- const gl::ProgramLinkedResources &resources,
- gl::InfoLog &infoLog)
-{
- const auto &data = context->getContextState();
-
- reset();
-
- gl::Shader *computeShader = mState.getAttachedComputeShader();
- if (computeShader)
- {
- mSamplersCS.resize(data.getCaps().maxComputeTextureImageUnits);
-
- defineUniformsAndAssignRegisters(context);
-
- gl::LinkResult result = compileComputeExecutable(context, infoLog);
- if (result.isError())
- {
- infoLog << result.getError().getMessage();
- return result;
- }
- else if (!result.getResult())
- {
- infoLog << "Failed to create D3D compute shader.";
- return result;
- }
- }
- else
- {
- gl::Shader *vertexShader = mState.getAttachedVertexShader();
- gl::Shader *fragmentShader = mState.getAttachedFragmentShader();
-
- const ShaderD3D *vertexShaderD3D = GetImplAs<ShaderD3D>(vertexShader);
- const ShaderD3D *fragmentShaderD3D = GetImplAs<ShaderD3D>(fragmentShader);
-
- mSamplersVS.resize(data.getCaps().maxVertexTextureImageUnits);
- mSamplersPS.resize(data.getCaps().maxTextureImageUnits);
-
- vertexShaderD3D->generateWorkarounds(&mVertexWorkarounds);
- fragmentShaderD3D->generateWorkarounds(&mPixelWorkarounds);
-
- if (mRenderer->getNativeLimitations().noFrontFacingSupport)
- {
- if (fragmentShaderD3D->usesFrontFacing())
- {
- infoLog << "The current renderer doesn't support gl_FrontFacing";
- return false;
- }
- }
-
- // TODO(jmadill): Implement more sophisticated component packing in D3D9.
- // We can fail here because we use one semantic per GLSL varying. D3D11 can pack varyings
- // intelligently, but D3D9 assumes one semantic per register.
- if (mRenderer->getRendererClass() == RENDERER_D3D9 &&
- resources.varyingPacking.getMaxSemanticIndex() > data.getCaps().maxVaryingVectors)
- {
- infoLog << "Cannot pack these varyings on D3D9.";
- return false;
- }
-
- ProgramD3DMetadata metadata(mRenderer, vertexShaderD3D, fragmentShaderD3D);
- BuiltinVaryingsD3D builtins(metadata, resources.varyingPacking);
-
- mDynamicHLSL->generateShaderLinkHLSL(context, mState, metadata, resources.varyingPacking,
- builtins, &mPixelHLSL, &mVertexHLSL);
-
- mUsesPointSize = vertexShaderD3D->usesPointSize();
- mDynamicHLSL->getPixelShaderOutputKey(data, mState, metadata, &mPixelShaderKey);
- mUsesFragDepth = metadata.usesFragDepth();
- mUsesViewID = metadata.usesViewID();
- mHasANGLEMultiviewEnabled = metadata.hasANGLEMultiviewEnabled();
-
- // Cache if we use flat shading
- mUsesFlatInterpolation =
- (FindFlatInterpolationVarying(fragmentShader->getInputVaryings(context)) ||
- FindFlatInterpolationVarying(vertexShader->getOutputVaryings(context)));
-
- if (mRenderer->getMajorShaderModel() >= 4)
- {
- mGeometryShaderPreamble = mDynamicHLSL->generateGeometryShaderPreamble(
- resources.varyingPacking, builtins, mHasANGLEMultiviewEnabled,
- metadata.canSelectViewInVertexShader());
- }
-
- initAttribLocationsToD3DSemantic(context);
-
- defineUniformsAndAssignRegisters(context);
-
- gatherTransformFeedbackVaryings(resources.varyingPacking, builtins[gl::SHADER_VERTEX]);
-
- gl::LinkResult result = compileProgramExecutables(context, infoLog);
- if (result.isError())
- {
- infoLog << result.getError().getMessage();
- return result;
- }
- else if (!result.getResult())
- {
- infoLog << "Failed to create D3D shaders.";
- return result;
- }
- }
-
- linkResources(context, resources);
-
- return true;
-}
-
-GLboolean ProgramD3D::validate(const gl::Caps & /*caps*/, gl::InfoLog * /*infoLog*/)
-{
- // TODO(jmadill): Do something useful here?
- return GL_TRUE;
-}
-
-void ProgramD3D::initializeUniformBlocks()
-{
- if (mState.getUniformBlocks().empty())
- {
- return;
- }
-
- ASSERT(mD3DUniformBlocks.empty());
-
- // Assign registers and update sizes.
- const ShaderD3D *vertexShaderD3D = SafeGetImplAs<ShaderD3D>(mState.getAttachedVertexShader());
- const ShaderD3D *fragmentShaderD3D =
- SafeGetImplAs<ShaderD3D>(mState.getAttachedFragmentShader());
- const ShaderD3D *computeShaderD3D = SafeGetImplAs<ShaderD3D>(mState.getAttachedComputeShader());
-
- for (const gl::InterfaceBlock &uniformBlock : mState.getUniformBlocks())
- {
- unsigned int uniformBlockElement = uniformBlock.isArray ? uniformBlock.arrayElement : 0;
-
- D3DUniformBlock d3dUniformBlock;
-
- if (uniformBlock.vertexStaticUse)
- {
- ASSERT(vertexShaderD3D != nullptr);
- unsigned int baseRegister = vertexShaderD3D->getUniformBlockRegister(uniformBlock.name);
- d3dUniformBlock.vsRegisterIndex = baseRegister + uniformBlockElement;
- }
-
- if (uniformBlock.fragmentStaticUse)
- {
- ASSERT(fragmentShaderD3D != nullptr);
- unsigned int baseRegister =
- fragmentShaderD3D->getUniformBlockRegister(uniformBlock.name);
- d3dUniformBlock.psRegisterIndex = baseRegister + uniformBlockElement;
- }
-
- if (uniformBlock.computeStaticUse)
- {
- ASSERT(computeShaderD3D != nullptr);
- unsigned int baseRegister =
- computeShaderD3D->getUniformBlockRegister(uniformBlock.name);
- d3dUniformBlock.csRegisterIndex = baseRegister + uniformBlockElement;
- }
-
- mD3DUniformBlocks.push_back(d3dUniformBlock);
- }
-}
-
-void ProgramD3D::initializeUniformStorage()
-{
- // Compute total default block size
- unsigned int vertexRegisters = 0;
- unsigned int fragmentRegisters = 0;
- unsigned int computeRegisters = 0;
- for (const D3DUniform *d3dUniform : mD3DUniforms)
- {
- if (!d3dUniform->isSampler())
- {
- if (d3dUniform->isReferencedByVertexShader())
- {
- vertexRegisters = std::max(vertexRegisters,
- d3dUniform->vsRegisterIndex + d3dUniform->registerCount);
- }
- if (d3dUniform->isReferencedByFragmentShader())
- {
- fragmentRegisters = std::max(
- fragmentRegisters, d3dUniform->psRegisterIndex + d3dUniform->registerCount);
- }
- if (d3dUniform->isReferencedByComputeShader())
- {
- computeRegisters = std::max(
- computeRegisters, d3dUniform->csRegisterIndex + d3dUniform->registerCount);
- }
- }
- }
-
- mVertexUniformStorage =
- std::unique_ptr<UniformStorageD3D>(mRenderer->createUniformStorage(vertexRegisters * 16u));
- mFragmentUniformStorage = std::unique_ptr<UniformStorageD3D>(
- mRenderer->createUniformStorage(fragmentRegisters * 16u));
- mComputeUniformStorage =
- std::unique_ptr<UniformStorageD3D>(mRenderer->createUniformStorage(computeRegisters * 16u));
-
- // Iterate the uniforms again to assign data pointers to default block uniforms.
- for (D3DUniform *d3dUniform : mD3DUniforms)
- {
- if (d3dUniform->isSampler())
- {
- d3dUniform->mSamplerData.resize(d3dUniform->getArraySizeProduct(), 0);
- continue;
- }
-
- if (d3dUniform->isReferencedByVertexShader())
- {
- d3dUniform->vsData = mVertexUniformStorage->getDataPointer(d3dUniform->vsRegisterIndex,
- d3dUniform->registerElement);
- }
-
- if (d3dUniform->isReferencedByFragmentShader())
- {
- d3dUniform->psData = mFragmentUniformStorage->getDataPointer(
- d3dUniform->psRegisterIndex, d3dUniform->registerElement);
- }
-
- if (d3dUniform->isReferencedByComputeShader())
- {
- d3dUniform->csData = mComputeUniformStorage->getDataPointer(
- d3dUniform->csRegisterIndex, d3dUniform->registerElement);
- }
- }
-}
-
-void ProgramD3D::updateUniformBufferCache(const gl::Caps &caps,
- unsigned int reservedVertex,
- unsigned int reservedFragment)
-{
- if (mState.getUniformBlocks().empty())
- {
- return;
- }
-
- mVertexUBOCache.clear();
- mFragmentUBOCache.clear();
-
- for (unsigned int uniformBlockIndex = 0; uniformBlockIndex < mD3DUniformBlocks.size();
- uniformBlockIndex++)
- {
- const D3DUniformBlock &uniformBlock = mD3DUniformBlocks[uniformBlockIndex];
- GLuint blockBinding = mState.getUniformBlockBinding(uniformBlockIndex);
-
- // Unnecessary to apply an unreferenced standard or shared UBO
- if (!uniformBlock.vertexStaticUse() && !uniformBlock.fragmentStaticUse())
- {
- continue;
- }
-
- if (uniformBlock.vertexStaticUse())
- {
- unsigned int registerIndex = uniformBlock.vsRegisterIndex - reservedVertex;
- ASSERT(registerIndex < caps.maxVertexUniformBlocks);
-
- if (mVertexUBOCache.size() <= registerIndex)
- {
- mVertexUBOCache.resize(registerIndex + 1, -1);
- }
-
- ASSERT(mVertexUBOCache[registerIndex] == -1);
- mVertexUBOCache[registerIndex] = blockBinding;
- }
-
- if (uniformBlock.fragmentStaticUse())
- {
- unsigned int registerIndex = uniformBlock.psRegisterIndex - reservedFragment;
- ASSERT(registerIndex < caps.maxFragmentUniformBlocks);
-
- if (mFragmentUBOCache.size() <= registerIndex)
- {
- mFragmentUBOCache.resize(registerIndex + 1, -1);
- }
-
- ASSERT(mFragmentUBOCache[registerIndex] == -1);
- mFragmentUBOCache[registerIndex] = blockBinding;
- }
- }
-}
-
-const std::vector<GLint> &ProgramD3D::getVertexUniformBufferCache() const
-{
- return mVertexUBOCache;
-}
-
-const std::vector<GLint> &ProgramD3D::getFragmentUniformBufferCache() const
-{
- return mFragmentUBOCache;
-}
-
-void ProgramD3D::dirtyAllUniforms()
-{
- mVertexUniformsDirty = true;
- mFragmentUniformsDirty = true;
- mComputeUniformsDirty = true;
-}
-
-void ProgramD3D::markUniformsClean()
-{
- mVertexUniformsDirty = false;
- mFragmentUniformsDirty = false;
- mComputeUniformsDirty = false;
-}
-
-void ProgramD3D::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
-{
- setUniformInternal(location, count, v, GL_FLOAT);
-}
-
-void ProgramD3D::setUniform2fv(GLint location, GLsizei count, const GLfloat *v)
-{
- setUniformInternal(location, count, v, GL_FLOAT_VEC2);
-}
-
-void ProgramD3D::setUniform3fv(GLint location, GLsizei count, const GLfloat *v)
-{
- setUniformInternal(location, count, v, GL_FLOAT_VEC3);
-}
-
-void ProgramD3D::setUniform4fv(GLint location, GLsizei count, const GLfloat *v)
-{
- setUniformInternal(location, count, v, GL_FLOAT_VEC4);
-}
-
-void ProgramD3D::setUniformMatrix2fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- setUniformMatrixfvInternal<2, 2>(location, count, transpose, value, GL_FLOAT_MAT2);
-}
-
-void ProgramD3D::setUniformMatrix3fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- setUniformMatrixfvInternal<3, 3>(location, count, transpose, value, GL_FLOAT_MAT3);
-}
-
-void ProgramD3D::setUniformMatrix4fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- setUniformMatrixfvInternal<4, 4>(location, count, transpose, value, GL_FLOAT_MAT4);
-}
-
-void ProgramD3D::setUniformMatrix2x3fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- setUniformMatrixfvInternal<2, 3>(location, count, transpose, value, GL_FLOAT_MAT2x3);
-}
-
-void ProgramD3D::setUniformMatrix3x2fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- setUniformMatrixfvInternal<3, 2>(location, count, transpose, value, GL_FLOAT_MAT3x2);
-}
-
-void ProgramD3D::setUniformMatrix2x4fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- setUniformMatrixfvInternal<2, 4>(location, count, transpose, value, GL_FLOAT_MAT2x4);
-}
-
-void ProgramD3D::setUniformMatrix4x2fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- setUniformMatrixfvInternal<4, 2>(location, count, transpose, value, GL_FLOAT_MAT4x2);
-}
-
-void ProgramD3D::setUniformMatrix3x4fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- setUniformMatrixfvInternal<3, 4>(location, count, transpose, value, GL_FLOAT_MAT3x4);
-}
-
-void ProgramD3D::setUniformMatrix4x3fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- setUniformMatrixfvInternal<4, 3>(location, count, transpose, value, GL_FLOAT_MAT4x3);
-}
-
-void ProgramD3D::setUniform1iv(GLint location, GLsizei count, const GLint *v)
-{
- setUniformInternal(location, count, v, GL_INT);
-}
-
-void ProgramD3D::setUniform2iv(GLint location, GLsizei count, const GLint *v)
-{
- setUniformInternal(location, count, v, GL_INT_VEC2);
-}
-
-void ProgramD3D::setUniform3iv(GLint location, GLsizei count, const GLint *v)
-{
- setUniformInternal(location, count, v, GL_INT_VEC3);
-}
-
-void ProgramD3D::setUniform4iv(GLint location, GLsizei count, const GLint *v)
-{
- setUniformInternal(location, count, v, GL_INT_VEC4);
-}
-
-void ProgramD3D::setUniform1uiv(GLint location, GLsizei count, const GLuint *v)
-{
- setUniformInternal(location, count, v, GL_UNSIGNED_INT);
-}
-
-void ProgramD3D::setUniform2uiv(GLint location, GLsizei count, const GLuint *v)
-{
- setUniformInternal(location, count, v, GL_UNSIGNED_INT_VEC2);
-}
-
-void ProgramD3D::setUniform3uiv(GLint location, GLsizei count, const GLuint *v)
-{
- setUniformInternal(location, count, v, GL_UNSIGNED_INT_VEC3);
-}
-
-void ProgramD3D::setUniform4uiv(GLint location, GLsizei count, const GLuint *v)
-{
- setUniformInternal(location, count, v, GL_UNSIGNED_INT_VEC4);
-}
-
-void ProgramD3D::setUniformBlockBinding(GLuint /*uniformBlockIndex*/,
- GLuint /*uniformBlockBinding*/)
-{
-}
-
-void ProgramD3D::defineUniformsAndAssignRegisters(const gl::Context *context)
-{
- D3DUniformMap uniformMap;
- gl::Shader *computeShader = mState.getAttachedComputeShader();
- if (computeShader)
- {
- for (const sh::Uniform &computeUniform : computeShader->getUniforms(context))
- {
- if (computeUniform.staticUse)
- {
- defineUniformBase(computeShader, computeUniform, &uniformMap);
- }
- }
- }
- else
- {
- gl::Shader *vertexShader = mState.getAttachedVertexShader();
- for (const sh::Uniform &vertexUniform : vertexShader->getUniforms(context))
- {
- if (vertexUniform.staticUse)
- {
- defineUniformBase(vertexShader, vertexUniform, &uniformMap);
- }
- }
-
- gl::Shader *fragmentShader = mState.getAttachedFragmentShader();
- for (const sh::Uniform &fragmentUniform : fragmentShader->getUniforms(context))
- {
- if (fragmentUniform.staticUse)
- {
- defineUniformBase(fragmentShader, fragmentUniform, &uniformMap);
- }
- }
- }
-
- // Initialize the D3DUniform list to mirror the indexing of the GL layer.
- for (const gl::LinkedUniform &glUniform : mState.getUniforms())
- {
- if (!glUniform.isInDefaultBlock())
- continue;
-
- std::string name = glUniform.name;
- if (glUniform.isArray())
- {
- // In the program state, array uniform names include [0] as in the program resource
- // spec. Here we don't include it.
- // TODO(oetuaho@nvidia.com): consider using the same uniform naming here as in the GL
- // layer.
- ASSERT(angle::EndsWith(name, "[0]"));
- name.resize(name.length() - 3);
- }
- auto mapEntry = uniformMap.find(name);
- ASSERT(mapEntry != uniformMap.end());
- mD3DUniforms.push_back(mapEntry->second);
- }
-
- assignAllSamplerRegisters();
- initializeUniformStorage();
-}
-
-void ProgramD3D::defineUniformBase(const gl::Shader *shader,
- const sh::Uniform &uniform,
- D3DUniformMap *uniformMap)
-{
- // Samplers get their registers assigned in assignAllSamplerRegisters.
- if (uniform.isBuiltIn() || gl::IsSamplerType(uniform.type))
- {
- defineUniform(shader->getType(), uniform, uniform.name, nullptr, uniformMap);
- return;
- }
-
- const ShaderD3D *shaderD3D = GetImplAs<ShaderD3D>(shader);
-
- unsigned int startRegister = shaderD3D->getUniformRegister(uniform.name);
- ShShaderOutput outputType = shaderD3D->getCompilerOutputType();
- sh::HLSLBlockEncoder encoder(sh::HLSLBlockEncoder::GetStrategyFor(outputType), true);
- encoder.skipRegisters(startRegister);
-
- defineUniform(shader->getType(), uniform, uniform.name, &encoder, uniformMap);
-}
-
-D3DUniform *ProgramD3D::getD3DUniformByName(const std::string &name)
-{
- for (D3DUniform *d3dUniform : mD3DUniforms)
- {
- if (d3dUniform->name == name)
- {
- return d3dUniform;
- }
- }
-
- return nullptr;
-}
-
-void ProgramD3D::defineStructUniformFields(GLenum shaderType,
- const std::vector<sh::ShaderVariable> &fields,
- const std::string &namePrefix,
- sh::HLSLBlockEncoder *encoder,
- D3DUniformMap *uniformMap)
-{
- if (encoder)
- encoder->enterAggregateType();
-
- for (size_t fieldIndex = 0; fieldIndex < fields.size(); fieldIndex++)
- {
- const sh::ShaderVariable &field = fields[fieldIndex];
- const std::string &fieldFullName = (namePrefix + "." + field.name);
-
- // Samplers get their registers assigned in assignAllSamplerRegisters.
- // Also they couldn't use the same encoder as the rest of the struct, since they are
- // extracted out of the struct by the shader translator.
- if (gl::IsSamplerType(field.type))
- {
- defineUniform(shaderType, field, fieldFullName, nullptr, uniformMap);
- }
- else
- {
- defineUniform(shaderType, field, fieldFullName, encoder, uniformMap);
- }
- }
-
- if (encoder)
- encoder->exitAggregateType();
-}
-
-void ProgramD3D::defineArrayOfStructsUniformFields(GLenum shaderType,
- const sh::ShaderVariable &uniform,
- unsigned int arrayNestingIndex,
- const std::string &prefix,
- sh::HLSLBlockEncoder *encoder,
- D3DUniformMap *uniformMap)
-{
- // Nested arrays are processed starting from outermost (arrayNestingIndex 0u) and ending at the
- // innermost.
- const unsigned int currentArraySize = uniform.getNestedArraySize(arrayNestingIndex);
- for (unsigned int arrayElement = 0u; arrayElement < currentArraySize; ++arrayElement)
- {
- const std::string &elementString = prefix + ArrayString(arrayElement);
- if (arrayNestingIndex + 1u < uniform.arraySizes.size())
- {
- defineArrayOfStructsUniformFields(shaderType, uniform, arrayNestingIndex + 1u,
- elementString, encoder, uniformMap);
- }
- else
- {
- defineStructUniformFields(shaderType, uniform.fields, elementString, encoder,
- uniformMap);
- }
- }
-}
-
-void ProgramD3D::defineArrayUniformElements(GLenum shaderType,
- const sh::ShaderVariable &uniform,
- const std::string &fullName,
- sh::HLSLBlockEncoder *encoder,
- D3DUniformMap *uniformMap)
-{
- if (encoder)
- encoder->enterAggregateType();
-
- sh::ShaderVariable uniformElement = uniform;
- uniformElement.arraySizes.pop_back();
- for (unsigned int arrayIndex = 0u; arrayIndex < uniform.getOutermostArraySize(); ++arrayIndex)
- {
- std::string elementFullName = fullName + ArrayString(arrayIndex);
- defineUniform(shaderType, uniformElement, elementFullName, encoder, uniformMap);
- }
-
- if (encoder)
- encoder->exitAggregateType();
-}
-
-void ProgramD3D::defineUniform(GLenum shaderType,
- const sh::ShaderVariable &uniform,
- const std::string &fullName,
- sh::HLSLBlockEncoder *encoder,
- D3DUniformMap *uniformMap)
-{
- if (uniform.isStruct())
- {
- if (uniform.isArray())
- {
- defineArrayOfStructsUniformFields(shaderType, uniform, 0u, fullName, encoder,
- uniformMap);
- }
- else
- {
- defineStructUniformFields(shaderType, uniform.fields, fullName, encoder, uniformMap);
- }
- return;
- }
- if (uniform.isArrayOfArrays())
- {
- defineArrayUniformElements(shaderType, uniform, fullName, encoder, uniformMap);
- return;
- }
-
- // Not a struct. Arrays are treated as aggregate types.
- if (uniform.isArray() && encoder)
- {
- encoder->enterAggregateType();
- }
-
- // Advance the uniform offset, to track registers allocation for structs
- sh::BlockMemberInfo blockInfo =
- encoder ? encoder->encodeType(uniform.type, uniform.arraySizes, false)
- : sh::BlockMemberInfo::getDefaultBlockInfo();
-
- auto uniformMapEntry = uniformMap->find(fullName);
- D3DUniform *d3dUniform = nullptr;
-
- if (uniformMapEntry != uniformMap->end())
- {
- d3dUniform = uniformMapEntry->second;
- }
- else
- {
- d3dUniform = new D3DUniform(uniform.type, fullName, uniform.arraySizes, true);
- (*uniformMap)[fullName] = d3dUniform;
- }
-
- if (encoder)
- {
- d3dUniform->registerElement =
- static_cast<unsigned int>(sh::HLSLBlockEncoder::getBlockRegisterElement(blockInfo));
- unsigned int reg =
- static_cast<unsigned int>(sh::HLSLBlockEncoder::getBlockRegister(blockInfo));
- if (shaderType == GL_FRAGMENT_SHADER)
- {
- d3dUniform->psRegisterIndex = reg;
- }
- else if (shaderType == GL_VERTEX_SHADER)
- {
- d3dUniform->vsRegisterIndex = reg;
- }
- else
- {
- ASSERT(shaderType == GL_COMPUTE_SHADER);
- d3dUniform->csRegisterIndex = reg;
- }
-
- // Arrays are treated as aggregate types
- if (uniform.isArray())
- {
- encoder->exitAggregateType();
- }
- }
-}
-
-// Assume count is already clamped.
-template <typename T>
-void ProgramD3D::setUniformImpl(const gl::VariableLocation &locationInfo,
- GLsizei count,
- const T *v,
- uint8_t *targetData,
- GLenum uniformType)
-{
- D3DUniform *targetUniform = mD3DUniforms[locationInfo.index];
- const int components = targetUniform->typeInfo.componentCount;
- const unsigned int arrayElementOffset = locationInfo.arrayIndex;
-
- if (targetUniform->typeInfo.type == uniformType)
- {
- T *dest = reinterpret_cast<T *>(targetData) + arrayElementOffset * 4;
- const T *source = v;
-
- for (GLint i = 0; i < count; i++, dest += 4, source += components)
- {
- memcpy(dest, source, components * sizeof(T));
- }
- }
- else
- {
- ASSERT(targetUniform->typeInfo.type == gl::VariableBoolVectorType(uniformType));
- GLint *boolParams = reinterpret_cast<GLint *>(targetData) + arrayElementOffset * 4;
-
- for (GLint i = 0; i < count; i++)
- {
- GLint *dest = boolParams + (i * 4);
- const T *source = v + (i * components);
-
- for (int c = 0; c < components; c++)
- {
- dest[c] = (source[c] == static_cast<T>(0)) ? GL_FALSE : GL_TRUE;
- }
- }
- }
-}
-
-template <typename T>
-void ProgramD3D::setUniformInternal(GLint location, GLsizei count, const T *v, GLenum uniformType)
-{
- const gl::VariableLocation &locationInfo = mState.getUniformLocations()[location];
- D3DUniform *targetUniform = mD3DUniforms[locationInfo.index];
-
- if (targetUniform->typeInfo.isSampler)
- {
- ASSERT(uniformType == GL_INT);
- size_t size = count * sizeof(T);
- GLint *dest = &targetUniform->mSamplerData[locationInfo.arrayIndex];
- if (memcmp(dest, v, size) != 0)
- {
- memcpy(dest, v, size);
- mDirtySamplerMapping = true;
- }
- return;
- }
-
- if (targetUniform->vsData)
- {
- setUniformImpl(locationInfo, count, v, targetUniform->vsData, uniformType);
- mVertexUniformsDirty = true;
- }
-
- if (targetUniform->psData)
- {
- setUniformImpl(locationInfo, count, v, targetUniform->psData, uniformType);
- mFragmentUniformsDirty = true;
- }
-
- if (targetUniform->csData)
- {
- setUniformImpl(locationInfo, count, v, targetUniform->csData, uniformType);
- mComputeUniformsDirty = true;
- }
-}
-
-template <int cols, int rows>
-bool ProgramD3D::setUniformMatrixfvImpl(GLint location,
- GLsizei countIn,
- GLboolean transpose,
- const GLfloat *value,
- uint8_t *targetData,
- GLenum targetUniformType)
-{
- D3DUniform *targetUniform = getD3DUniformFromLocation(location);
-
- unsigned int elementCount = targetUniform->getArraySizeProduct();
- unsigned int arrayElementOffset = mState.getUniformLocations()[location].arrayIndex;
- unsigned int count =
- std::min(elementCount - arrayElementOffset, static_cast<unsigned int>(countIn));
-
- const unsigned int targetMatrixStride = (4 * rows);
- GLfloat *target = reinterpret_cast<GLfloat *>(
- targetData + arrayElementOffset * sizeof(GLfloat) * targetMatrixStride);
-
- bool dirty = false;
-
- for (unsigned int i = 0; i < count; i++)
- {
- // Internally store matrices as transposed versions to accomodate HLSL matrix indexing
- if (transpose == GL_FALSE)
- {
- dirty = TransposeExpandMatrix<GLfloat, cols, rows>(target, value) || dirty;
- }
- else
- {
- dirty = ExpandMatrix<GLfloat, cols, rows>(target, value) || dirty;
- }
- target += targetMatrixStride;
- value += cols * rows;
- }
-
- return dirty;
-}
-
-template <int cols, int rows>
-void ProgramD3D::setUniformMatrixfvInternal(GLint location,
- GLsizei countIn,
- GLboolean transpose,
- const GLfloat *value,
- GLenum targetUniformType)
-{
- D3DUniform *targetUniform = getD3DUniformFromLocation(location);
-
- if (targetUniform->vsData)
- {
- if (setUniformMatrixfvImpl<cols, rows>(location, countIn, transpose, value,
- targetUniform->vsData, targetUniformType))
- {
- mVertexUniformsDirty = true;
- }
- }
-
- if (targetUniform->psData)
- {
- if (setUniformMatrixfvImpl<cols, rows>(location, countIn, transpose, value,
- targetUniform->psData, targetUniformType))
- {
- mFragmentUniformsDirty = true;
- }
- }
-
- if (targetUniform->csData)
- {
- if (setUniformMatrixfvImpl<cols, rows>(location, countIn, transpose, value,
- targetUniform->csData, targetUniformType))
- {
- mComputeUniformsDirty = true;
- }
- }
-}
-
-void ProgramD3D::assignAllSamplerRegisters()
-{
- for (size_t uniformIndex = 0; uniformIndex < mD3DUniforms.size(); ++uniformIndex)
- {
- if (mD3DUniforms[uniformIndex]->isSampler())
- {
- assignSamplerRegisters(uniformIndex);
- }
- }
-}
-
-void ProgramD3D::assignSamplerRegisters(size_t uniformIndex)
-{
- D3DUniform *d3dUniform = mD3DUniforms[uniformIndex];
- ASSERT(d3dUniform->isSampler());
- // If the uniform is an array of arrays, then we have separate entries for each inner array in
- // mD3DUniforms. However, the sampler register info is stored in the shader only for the
- // outermost array.
- std::vector<unsigned int> subscripts;
- const std::string baseName = gl::ParseResourceName(d3dUniform->name, &subscripts);
- unsigned int registerOffset = mState.getUniforms()[uniformIndex].flattenedOffsetInParentArrays *
- d3dUniform->getArraySizeProduct();
-
- const gl::Shader *computeShader = mState.getAttachedComputeShader();
- if (computeShader)
- {
- const ShaderD3D *computeShaderD3D = GetImplAs<ShaderD3D>(mState.getAttachedComputeShader());
- ASSERT(computeShaderD3D->hasUniform(baseName));
- d3dUniform->csRegisterIndex =
- computeShaderD3D->getUniformRegister(baseName) + registerOffset;
- ASSERT(d3dUniform->csRegisterIndex != GL_INVALID_INDEX);
- AssignSamplers(d3dUniform->csRegisterIndex, d3dUniform->typeInfo,
- d3dUniform->getArraySizeProduct(), mSamplersCS, &mUsedComputeSamplerRange);
- }
- else
- {
- const ShaderD3D *vertexShaderD3D = GetImplAs<ShaderD3D>(mState.getAttachedVertexShader());
- const ShaderD3D *fragmentShaderD3D =
- GetImplAs<ShaderD3D>(mState.getAttachedFragmentShader());
- ASSERT(vertexShaderD3D->hasUniform(baseName) || fragmentShaderD3D->hasUniform(baseName));
- if (vertexShaderD3D->hasUniform(baseName))
- {
- d3dUniform->vsRegisterIndex =
- vertexShaderD3D->getUniformRegister(baseName) + registerOffset;
- ASSERT(d3dUniform->vsRegisterIndex != GL_INVALID_INDEX);
- AssignSamplers(d3dUniform->vsRegisterIndex, d3dUniform->typeInfo,
- d3dUniform->getArraySizeProduct(), mSamplersVS,
- &mUsedVertexSamplerRange);
- }
- if (fragmentShaderD3D->hasUniform(baseName))
- {
- d3dUniform->psRegisterIndex =
- fragmentShaderD3D->getUniformRegister(baseName) + registerOffset;
- ASSERT(d3dUniform->psRegisterIndex != GL_INVALID_INDEX);
- AssignSamplers(d3dUniform->psRegisterIndex, d3dUniform->typeInfo,
- d3dUniform->getArraySizeProduct(), mSamplersPS, &mUsedPixelSamplerRange);
- }
- }
-}
-
-// static
-void ProgramD3D::AssignSamplers(unsigned int startSamplerIndex,
- const gl::UniformTypeInfo &typeInfo,
- unsigned int samplerCount,
- std::vector<Sampler> &outSamplers,
- GLuint *outUsedRange)
-{
- unsigned int samplerIndex = startSamplerIndex;
-
- do
- {
- ASSERT(samplerIndex < outSamplers.size());
- Sampler *sampler = &outSamplers[samplerIndex];
- sampler->active = true;
- sampler->textureType = typeInfo.samplerTextureType;
- sampler->logicalTextureUnit = 0;
- *outUsedRange = std::max(samplerIndex + 1, *outUsedRange);
- samplerIndex++;
- } while (samplerIndex < startSamplerIndex + samplerCount);
-}
-
-void ProgramD3D::reset()
-{
- mVertexExecutables.clear();
- mPixelExecutables.clear();
-
- for (auto &geometryExecutable : mGeometryExecutables)
- {
- geometryExecutable.reset(nullptr);
- }
-
- mComputeExecutable.reset(nullptr);
-
- mVertexHLSL.clear();
- mVertexWorkarounds = angle::CompilerWorkaroundsD3D();
-
- mPixelHLSL.clear();
- mPixelWorkarounds = angle::CompilerWorkaroundsD3D();
- mUsesFragDepth = false;
- mHasANGLEMultiviewEnabled = false;
- mUsesViewID = false;
- mPixelShaderKey.clear();
- mUsesPointSize = false;
- mUsesFlatInterpolation = false;
-
- SafeDeleteContainer(mD3DUniforms);
- mD3DUniformBlocks.clear();
-
- mVertexUniformStorage.reset(nullptr);
- mFragmentUniformStorage.reset(nullptr);
- mComputeUniformStorage.reset(nullptr);
-
- mSamplersPS.clear();
- mSamplersVS.clear();
- mSamplersCS.clear();
-
- mUsedVertexSamplerRange = 0;
- mUsedPixelSamplerRange = 0;
- mUsedComputeSamplerRange = 0;
- mDirtySamplerMapping = true;
-
- mAttribLocationToD3DSemantic.fill(-1);
-
- mStreamOutVaryings.clear();
-
- mGeometryShaderPreamble.clear();
-
- dirtyAllUniforms();
-
- mCachedPixelExecutableIndex.reset();
- mCachedVertexExecutableIndex.reset();
-}
-
-unsigned int ProgramD3D::getSerial() const
-{
- return mSerial;
-}
-
-unsigned int ProgramD3D::issueSerial()
-{
- return mCurrentSerial++;
-}
-
-void ProgramD3D::initAttribLocationsToD3DSemantic(const gl::Context *context)
-{
- gl::Shader *vertexShader = mState.getAttachedVertexShader();
- ASSERT(vertexShader != nullptr);
-
- // Init semantic index
- int semanticIndex = 0;
- for (const sh::Attribute &attribute : vertexShader->getActiveAttributes(context))
- {
- int regCount = gl::VariableRegisterCount(attribute.type);
- GLuint location = mState.getAttributeLocation(attribute.name);
- ASSERT(location != std::numeric_limits<GLuint>::max());
-
- for (int reg = 0; reg < regCount; ++reg)
- {
- mAttribLocationToD3DSemantic[location + reg] = semanticIndex++;
- }
- }
-}
-
-void ProgramD3D::updateCachedInputLayout(Serial associatedSerial, const gl::State &state)
-{
- if (mCurrentVertexArrayStateSerial == associatedSerial)
- {
- return;
- }
-
- mCurrentVertexArrayStateSerial = associatedSerial;
- mCachedInputLayout.clear();
-
- const auto &vertexAttributes = state.getVertexArray()->getVertexAttributes();
-
- for (size_t locationIndex : mState.getActiveAttribLocationsMask())
- {
- int d3dSemantic = mAttribLocationToD3DSemantic[locationIndex];
-
- if (d3dSemantic != -1)
- {
- if (mCachedInputLayout.size() < static_cast<size_t>(d3dSemantic + 1))
- {
- mCachedInputLayout.resize(d3dSemantic + 1, gl::VERTEX_FORMAT_INVALID);
- }
- mCachedInputLayout[d3dSemantic] =
- GetVertexFormatType(vertexAttributes[locationIndex],
- state.getVertexAttribCurrentValue(locationIndex).Type);
- }
- }
-
- VertexExecutable::getSignature(mRenderer, mCachedInputLayout, &mCachedVertexSignature);
-
- updateCachedVertexExecutableIndex();
-}
-
-void ProgramD3D::updateCachedOutputLayout(const gl::Context *context,
- const gl::Framebuffer *framebuffer)
-{
- mPixelShaderOutputLayoutCache.clear();
-
- FramebufferD3D *fboD3D = GetImplAs<FramebufferD3D>(framebuffer);
- const auto &colorbuffers = fboD3D->getColorAttachmentsForRender(context);
-
- for (size_t colorAttachment = 0; colorAttachment < colorbuffers.size(); ++colorAttachment)
- {
- const gl::FramebufferAttachment *colorbuffer = colorbuffers[colorAttachment];
-
- if (colorbuffer)
- {
- auto binding = colorbuffer->getBinding() == GL_BACK ? GL_COLOR_ATTACHMENT0
- : colorbuffer->getBinding();
- mPixelShaderOutputLayoutCache.push_back(binding);
- }
- else
- {
- mPixelShaderOutputLayoutCache.push_back(GL_NONE);
- }
- }
-
- updateCachedPixelExecutableIndex();
-}
-
-void ProgramD3D::gatherTransformFeedbackVaryings(const gl::VaryingPacking &varyingPacking,
- const BuiltinInfo &builtins)
-{
- const std::string &varyingSemantic =
- GetVaryingSemantic(mRenderer->getMajorShaderModel(), usesPointSize());
-
- // Gather the linked varyings that are used for transform feedback, they should all exist.
- mStreamOutVaryings.clear();
-
- const auto &tfVaryingNames = mState.getTransformFeedbackVaryingNames();
- for (unsigned int outputSlot = 0; outputSlot < static_cast<unsigned int>(tfVaryingNames.size());
- ++outputSlot)
- {
- const auto &tfVaryingName = tfVaryingNames[outputSlot];
- if (tfVaryingName == "gl_Position")
- {
- if (builtins.glPosition.enabled)
- {
- mStreamOutVaryings.push_back(D3DVarying(builtins.glPosition.semantic,
- builtins.glPosition.index, 4, outputSlot));
- }
- }
- else if (tfVaryingName == "gl_FragCoord")
- {
- if (builtins.glFragCoord.enabled)
- {
- mStreamOutVaryings.push_back(D3DVarying(builtins.glFragCoord.semantic,
- builtins.glFragCoord.index, 4, outputSlot));
- }
- }
- else if (tfVaryingName == "gl_PointSize")
- {
- if (builtins.glPointSize.enabled)
- {
- mStreamOutVaryings.push_back(D3DVarying("PSIZE", 0, 1, outputSlot));
- }
- }
- else
- {
- std::vector<unsigned int> subscripts;
- std::string baseName = gl::ParseResourceName(tfVaryingName, &subscripts);
- size_t subscript = GL_INVALID_INDEX;
- if (!subscripts.empty())
- {
- subscript = subscripts.back();
- }
- for (const auto &registerInfo : varyingPacking.getRegisterList())
- {
- const auto &varying = *registerInfo.packedVarying->varying;
- GLenum transposedType = gl::TransposeMatrixType(varying.type);
- int componentCount = gl::VariableColumnCount(transposedType);
- ASSERT(!varying.isBuiltIn());
-
- // Transform feedback for varying structs is underspecified.
- // See Khronos bug 9856.
- // TODO(jmadill): Figure out how to be spec-compliant here.
- if (registerInfo.packedVarying->isStructField() || varying.isStruct())
- continue;
-
- // There can be more than one register assigned to a particular varying, and each
- // register needs its own stream out entry.
- if (baseName == registerInfo.packedVarying->varying->name &&
- (subscript == GL_INVALID_INDEX || subscript == registerInfo.varyingArrayIndex))
- {
- mStreamOutVaryings.push_back(D3DVarying(
- varyingSemantic, registerInfo.semanticIndex, componentCount, outputSlot));
- }
- }
- }
- }
-}
-
-D3DUniform *ProgramD3D::getD3DUniformFromLocation(GLint location)
-{
- return mD3DUniforms[mState.getUniformLocations()[location].index];
-}
-
-const D3DUniform *ProgramD3D::getD3DUniformFromLocation(GLint location) const
-{
- return mD3DUniforms[mState.getUniformLocations()[location].index];
-}
-
-void ProgramD3D::setPathFragmentInputGen(const std::string &inputName,
- GLenum genMode,
- GLint components,
- const GLfloat *coeffs)
-{
- UNREACHABLE();
-}
-
-bool ProgramD3D::hasVertexExecutableForCachedInputLayout()
-{
- return mCachedVertexExecutableIndex.valid();
-}
-
-bool ProgramD3D::hasGeometryExecutableForPrimitiveType(GLenum drawMode)
-{
- if (!usesGeometryShader(drawMode))
- {
- // No shader necessary mean we have the required (null) executable.
- return true;
- }
-
- gl::PrimitiveType geometryShaderType = GetGeometryShaderTypeFromDrawMode(drawMode);
- return mGeometryExecutables[geometryShaderType].get() != nullptr;
-}
-
-bool ProgramD3D::hasPixelExecutableForCachedOutputLayout()
-{
- return mCachedPixelExecutableIndex.valid();
-}
-
-template <typename DestT>
-void ProgramD3D::getUniformInternal(GLint location, DestT *dataOut) const
-{
- const gl::VariableLocation &locationInfo = mState.getUniformLocations()[location];
- const gl::LinkedUniform &uniform = mState.getUniforms()[locationInfo.index];
-
- const D3DUniform *targetUniform = getD3DUniformFromLocation(location);
- const uint8_t *srcPointer = targetUniform->getDataPtrToElement(locationInfo.arrayIndex);
-
- if (gl::IsMatrixType(uniform.type))
- {
- GetMatrixUniform(gl::VariableColumnCount(uniform.type), gl::VariableRowCount(uniform.type),
- dataOut, reinterpret_cast<const DestT *>(srcPointer));
- }
- else
- {
- memcpy(dataOut, srcPointer, uniform.getElementSize());
- }
-}
-
-void ProgramD3D::getUniformfv(const gl::Context *context, GLint location, GLfloat *params) const
-{
- getUniformInternal(location, params);
-}
-
-void ProgramD3D::getUniformiv(const gl::Context *context, GLint location, GLint *params) const
-{
- getUniformInternal(location, params);
-}
-
-void ProgramD3D::getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const
-{
- getUniformInternal(location, params);
-}
-
-void ProgramD3D::updateCachedVertexExecutableIndex()
-{
- mCachedVertexExecutableIndex.reset();
- for (size_t executableIndex = 0; executableIndex < mVertexExecutables.size(); executableIndex++)
- {
- if (mVertexExecutables[executableIndex]->matchesSignature(mCachedVertexSignature))
- {
- mCachedVertexExecutableIndex = executableIndex;
- break;
- }
- }
-}
-
-void ProgramD3D::updateCachedPixelExecutableIndex()
-{
- mCachedPixelExecutableIndex.reset();
- for (size_t executableIndex = 0; executableIndex < mPixelExecutables.size(); executableIndex++)
- {
- if (mPixelExecutables[executableIndex]->matchesSignature(mPixelShaderOutputLayoutCache))
- {
- mCachedPixelExecutableIndex = executableIndex;
- break;
- }
- }
-}
-
-void ProgramD3D::linkResources(const gl::Context *context,
- const gl::ProgramLinkedResources &resources)
-{
- UniformBlockInfo uniformBlockInfo;
-
- if (mState.getAttachedVertexShader())
- {
- uniformBlockInfo.getShaderBlockInfo(context, mState.getAttachedVertexShader());
- }
-
- if (mState.getAttachedFragmentShader())
- {
- uniformBlockInfo.getShaderBlockInfo(context, mState.getAttachedFragmentShader());
- }
-
- if (mState.getAttachedComputeShader())
- {
- uniformBlockInfo.getShaderBlockInfo(context, mState.getAttachedComputeShader());
- }
-
- // Gather interface block info.
- auto getUniformBlockSize = [&uniformBlockInfo](const std::string &name,
- const std::string &mappedName, size_t *sizeOut) {
- return uniformBlockInfo.getBlockSize(name, mappedName, sizeOut);
- };
-
- auto getUniformBlockMemberInfo = [&uniformBlockInfo](const std::string &name,
- const std::string &mappedName,
- sh::BlockMemberInfo *infoOut) {
- return uniformBlockInfo.getBlockMemberInfo(name, mappedName, infoOut);
- };
-
- resources.uniformBlockLinker.linkBlocks(getUniformBlockSize, getUniformBlockMemberInfo);
- initializeUniformBlocks();
-
- // TODO(jiajia.qin@intel.com): Determine correct shader storage block info.
- auto getShaderStorageBlockSize = [](const std::string &name, const std::string &mappedName,
- size_t *sizeOut) {
- *sizeOut = 0;
- return true;
- };
-
- auto getShaderStorageBlockMemberInfo =
- [](const std::string &name, const std::string &mappedName, sh::BlockMemberInfo *infoOut) {
- *infoOut = sh::BlockMemberInfo::getDefaultBlockInfo();
- return true;
- };
-
- resources.shaderStorageBlockLinker.linkBlocks(getShaderStorageBlockSize,
- getShaderStorageBlockMemberInfo);
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ProgramD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/ProgramD3D.h
deleted file mode 100644
index 829757a73e..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ProgramD3D.h
+++ /dev/null
@@ -1,523 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ProgramD3D.h: Defines the rx::ProgramD3D class which implements rx::ProgramImpl.
-
-#ifndef LIBANGLE_RENDERER_D3D_PROGRAMD3D_H_
-#define LIBANGLE_RENDERER_D3D_PROGRAMD3D_H_
-
-#include <string>
-#include <vector>
-
-#include "compiler/translator/blocklayoutHLSL.h"
-#include "libANGLE/Constants.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/ProgramImpl.h"
-#include "libANGLE/renderer/d3d/DynamicHLSL.h"
-#include "platform/WorkaroundsD3D.h"
-
-namespace rx
-{
-class RendererD3D;
-class UniformStorageD3D;
-class ShaderExecutableD3D;
-
-#if !defined(ANGLE_COMPILE_OPTIMIZATION_LEVEL)
-// WARNING: D3DCOMPILE_OPTIMIZATION_LEVEL3 may lead to a DX9 shader compiler hang.
-// It should only be used selectively to work around specific bugs.
-#define ANGLE_COMPILE_OPTIMIZATION_LEVEL D3DCOMPILE_OPTIMIZATION_LEVEL1
-#endif
-
-// Helper struct representing a single shader uniform
-// TODO(jmadill): Make uniform blocks shared between all programs, so we don't need separate
-// register indices.
-struct D3DUniform : private angle::NonCopyable
-{
- D3DUniform(GLenum type,
- const std::string &nameIn,
- const std::vector<unsigned int> &arraySizesIn,
- bool defaultBlock);
- ~D3DUniform();
-
- bool isSampler() const;
-
- bool isArray() const { return !arraySizes.empty(); }
- unsigned int getArraySizeProduct() const;
-
- bool isReferencedByVertexShader() const;
- bool isReferencedByFragmentShader() const;
- bool isReferencedByComputeShader() const;
-
- const uint8_t *firstNonNullData() const;
- const uint8_t *getDataPtrToElement(size_t elementIndex) const;
-
- // Duplicated from the GL layer
- const gl::UniformTypeInfo &typeInfo;
- std::string name; // Names of arrays don't include [0], unlike at the GL layer.
- std::vector<unsigned int> arraySizes;
-
- // Pointer to a system copies of the data. Separate pointers for each uniform storage type.
- uint8_t *vsData;
- uint8_t *psData;
- uint8_t *csData;
-
- // Register information.
- unsigned int vsRegisterIndex;
- unsigned int psRegisterIndex;
- unsigned int csRegisterIndex;
- unsigned int registerCount;
-
- // Register "elements" are used for uniform structs in ES3, to appropriately identify single
- // uniforms
- // inside aggregate types, which are packed according C-like structure rules.
- unsigned int registerElement;
-
- // Special buffer for sampler values.
- std::vector<GLint> mSamplerData;
-};
-
-struct D3DUniformBlock
-{
- D3DUniformBlock()
- : vsRegisterIndex(GL_INVALID_INDEX),
- psRegisterIndex(GL_INVALID_INDEX),
- csRegisterIndex(GL_INVALID_INDEX)
- {
- }
-
- bool vertexStaticUse() const { return vsRegisterIndex != GL_INVALID_INDEX; }
-
- bool fragmentStaticUse() const { return psRegisterIndex != GL_INVALID_INDEX; }
-
- bool computeStaticUse() const { return csRegisterIndex != GL_INVALID_INDEX; }
-
- unsigned int vsRegisterIndex;
- unsigned int psRegisterIndex;
- unsigned int csRegisterIndex;
-};
-
-struct D3DVarying final
-{
- D3DVarying();
- D3DVarying(const std::string &semanticNameIn,
- unsigned int semanticIndexIn,
- unsigned int componentCountIn,
- unsigned int outputSlotIn);
-
- D3DVarying(const D3DVarying &) = default;
- D3DVarying &operator=(const D3DVarying &) = default;
-
- std::string semanticName;
- unsigned int semanticIndex;
- unsigned int componentCount;
- unsigned int outputSlot;
-};
-
-class ProgramD3DMetadata final : angle::NonCopyable
-{
- public:
- ProgramD3DMetadata(RendererD3D *renderer,
- const ShaderD3D *vertexShader,
- const ShaderD3D *fragmentShader);
-
- int getRendererMajorShaderModel() const;
- bool usesBroadcast(const gl::ContextState &data) const;
- bool usesFragDepth() const;
- bool usesPointCoord() const;
- bool usesFragCoord() const;
- bool usesPointSize() const;
- bool usesInsertedPointCoordValue() const;
- bool usesViewScale() const;
- bool hasANGLEMultiviewEnabled() const;
- bool usesViewID() const;
- bool canSelectViewInVertexShader() const;
- bool addsPointCoordToVertexShader() const;
- bool usesTransformFeedbackGLPosition() const;
- bool usesSystemValuePointSize() const;
- bool usesMultipleFragmentOuts() const;
- GLint getMajorShaderVersion() const;
- const ShaderD3D *getFragmentShader() const;
-
- private:
- const int mRendererMajorShaderModel;
- const std::string mShaderModelSuffix;
- const bool mUsesInstancedPointSpriteEmulation;
- const bool mUsesViewScale;
- const bool mHasANGLEMultiviewEnabled;
- const bool mUsesViewID;
- const bool mCanSelectViewInVertexShader;
- const ShaderD3D *mVertexShader;
- const ShaderD3D *mFragmentShader;
-};
-
-class ProgramD3D : public ProgramImpl
-{
- public:
- ProgramD3D(const gl::ProgramState &data, RendererD3D *renderer);
- ~ProgramD3D() override;
-
- const std::vector<PixelShaderOutputVariable> &getPixelShaderKey() { return mPixelShaderKey; }
-
- GLint getSamplerMapping(gl::SamplerType type,
- unsigned int samplerIndex,
- const gl::Caps &caps) const;
- GLenum getSamplerTextureType(gl::SamplerType type, unsigned int samplerIndex) const;
- GLuint getUsedSamplerRange(gl::SamplerType type) const;
-
- enum SamplerMapping
- {
- WasDirty,
- WasClean,
- };
-
- SamplerMapping updateSamplerMapping();
-
- bool usesPointSize() const { return mUsesPointSize; }
- bool usesPointSpriteEmulation() const;
- bool usesGeometryShader(GLenum drawMode) const;
- bool usesGeometryShaderForPointSpriteEmulation() const;
- bool usesInstancedPointSpriteEmulation() const;
-
- gl::LinkResult load(const gl::Context *context,
- gl::InfoLog &infoLog,
- gl::BinaryInputStream *stream) override;
- void save(const gl::Context *context, gl::BinaryOutputStream *stream) override;
- void setBinaryRetrievableHint(bool retrievable) override;
- void setSeparable(bool separable) override;
-
- gl::Error getVertexExecutableForCachedInputLayout(ShaderExecutableD3D **outExectuable,
- gl::InfoLog *infoLog);
- gl::Error getGeometryExecutableForPrimitiveType(const gl::Context *context,
- GLenum drawMode,
- ShaderExecutableD3D **outExecutable,
- gl::InfoLog *infoLog);
- gl::Error getPixelExecutableForCachedOutputLayout(ShaderExecutableD3D **outExectuable,
- gl::InfoLog *infoLog);
- gl::Error getComputeExecutable(ShaderExecutableD3D **outExecutable);
- gl::LinkResult link(const gl::Context *context,
- const gl::ProgramLinkedResources &resources,
- gl::InfoLog &infoLog) override;
- GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
-
- void setPathFragmentInputGen(const std::string &inputName,
- GLenum genMode,
- GLint components,
- const GLfloat *coeffs) override;
-
- void initializeUniformStorage();
- void updateUniformBufferCache(const gl::Caps &caps,
- unsigned int reservedVertex,
- unsigned int reservedFragment);
- const std::vector<GLint> &getVertexUniformBufferCache() const;
- const std::vector<GLint> &getFragmentUniformBufferCache() const;
-
- void dirtyAllUniforms();
-
- void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override;
- void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) override;
- void setUniform3fv(GLint location, GLsizei count, const GLfloat *v) override;
- void setUniform4fv(GLint location, GLsizei count, const GLfloat *v) override;
- void setUniform1iv(GLint location, GLsizei count, const GLint *v) override;
- void setUniform2iv(GLint location, GLsizei count, const GLint *v) override;
- void setUniform3iv(GLint location, GLsizei count, const GLint *v) override;
- void setUniform4iv(GLint location, GLsizei count, const GLint *v) override;
- void setUniform1uiv(GLint location, GLsizei count, const GLuint *v) override;
- void setUniform2uiv(GLint location, GLsizei count, const GLuint *v) override;
- void setUniform3uiv(GLint location, GLsizei count, const GLuint *v) override;
- void setUniform4uiv(GLint location, GLsizei count, const GLuint *v) override;
- void setUniformMatrix2fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value) override;
- void setUniformMatrix3fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value) override;
- void setUniformMatrix4fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value) override;
- void setUniformMatrix2x3fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value) override;
- void setUniformMatrix3x2fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value) override;
- void setUniformMatrix2x4fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value) override;
- void setUniformMatrix4x2fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value) override;
- void setUniformMatrix3x4fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value) override;
- void setUniformMatrix4x3fv(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value) override;
-
- void getUniformfv(const gl::Context *context, GLint location, GLfloat *params) const override;
- void getUniformiv(const gl::Context *context, GLint location, GLint *params) const override;
- void getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const override;
-
- void setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding) override;
-
- UniformStorageD3D &getVertexUniformStorage() const { return *mVertexUniformStorage.get(); }
- UniformStorageD3D &getFragmentUniformStorage() const { return *mFragmentUniformStorage.get(); }
- UniformStorageD3D &getComputeUniformStorage() const { return *mComputeUniformStorage.get(); }
-
- unsigned int getSerial() const;
-
- const AttribIndexArray &getAttribLocationToD3DSemantics() const
- {
- return mAttribLocationToD3DSemantic;
- }
-
- void updateCachedInputLayout(Serial associatedSerial, const gl::State &state);
- void updateCachedOutputLayout(const gl::Context *context, const gl::Framebuffer *framebuffer);
-
- bool isSamplerMappingDirty() { return mDirtySamplerMapping; }
-
- // Checks if we need to recompile certain shaders.
- bool hasVertexExecutableForCachedInputLayout();
- bool hasGeometryExecutableForPrimitiveType(GLenum drawMode);
- bool hasPixelExecutableForCachedOutputLayout();
-
- bool areVertexUniformsDirty() const { return mVertexUniformsDirty; }
- bool areFragmentUniformsDirty() const { return mFragmentUniformsDirty; }
- bool areComputeUniformsDirty() const { return mComputeUniformsDirty; }
- const std::vector<D3DUniform *> &getD3DUniforms() const { return mD3DUniforms; }
- void markUniformsClean();
-
- private:
- // These forward-declared tasks are used for multi-thread shader compiles.
- class GetExecutableTask;
- class GetVertexExecutableTask;
- class GetPixelExecutableTask;
- class GetGeometryExecutableTask;
-
- class VertexExecutable
- {
- public:
- enum HLSLAttribType
- {
- FLOAT,
- UNSIGNED_INT,
- SIGNED_INT,
- };
-
- typedef std::vector<HLSLAttribType> Signature;
-
- VertexExecutable(const gl::InputLayout &inputLayout,
- const Signature &signature,
- ShaderExecutableD3D *shaderExecutable);
- ~VertexExecutable();
-
- bool matchesSignature(const Signature &signature) const;
- static void getSignature(RendererD3D *renderer,
- const gl::InputLayout &inputLayout,
- Signature *signatureOut);
-
- const gl::InputLayout &inputs() const { return mInputs; }
- const Signature &signature() const { return mSignature; }
- ShaderExecutableD3D *shaderExecutable() const { return mShaderExecutable; }
-
- private:
- static HLSLAttribType GetAttribType(GLenum type);
-
- gl::InputLayout mInputs;
- Signature mSignature;
- ShaderExecutableD3D *mShaderExecutable;
- };
-
- class PixelExecutable
- {
- public:
- PixelExecutable(const std::vector<GLenum> &outputSignature,
- ShaderExecutableD3D *shaderExecutable);
- ~PixelExecutable();
-
- bool matchesSignature(const std::vector<GLenum> &signature) const
- {
- return mOutputSignature == signature;
- }
-
- const std::vector<GLenum> &outputSignature() const { return mOutputSignature; }
- ShaderExecutableD3D *shaderExecutable() const { return mShaderExecutable; }
-
- private:
- std::vector<GLenum> mOutputSignature;
- ShaderExecutableD3D *mShaderExecutable;
- };
-
- struct Sampler
- {
- Sampler();
-
- bool active;
- GLint logicalTextureUnit;
- GLenum textureType;
- };
-
- typedef std::map<std::string, D3DUniform *> D3DUniformMap;
-
- void defineUniformsAndAssignRegisters(const gl::Context *context);
- void defineUniformBase(const gl::Shader *shader,
- const sh::Uniform &uniform,
- D3DUniformMap *uniformMap);
- void defineStructUniformFields(GLenum shaderType,
- const std::vector<sh::ShaderVariable> &fields,
- const std::string &namePrefix,
- sh::HLSLBlockEncoder *encoder,
- D3DUniformMap *uniformMap);
- void defineArrayOfStructsUniformFields(GLenum shaderType,
- const sh::ShaderVariable &uniform,
- unsigned int arrayNestingIndex,
- const std::string &prefix,
- sh::HLSLBlockEncoder *encoder,
- D3DUniformMap *uniformMap);
- void defineArrayUniformElements(GLenum shaderType,
- const sh::ShaderVariable &uniform,
- const std::string &fullName,
- sh::HLSLBlockEncoder *encoder,
- D3DUniformMap *uniformMap);
- void defineUniform(GLenum shaderType,
- const sh::ShaderVariable &uniform,
- const std::string &fullName,
- sh::HLSLBlockEncoder *encoder,
- D3DUniformMap *uniformMap);
- void assignAllSamplerRegisters();
- void assignSamplerRegisters(size_t uniformIndex);
-
- static void AssignSamplers(unsigned int startSamplerIndex,
- const gl::UniformTypeInfo &typeInfo,
- unsigned int samplerCount,
- std::vector<Sampler> &outSamplers,
- GLuint *outUsedRange);
-
- template <typename DestT>
- void getUniformInternal(GLint location, DestT *dataOut) const;
-
- template <typename T>
- void setUniformImpl(const gl::VariableLocation &locationInfo,
- GLsizei count,
- const T *v,
- uint8_t *targetData,
- GLenum uniformType);
-
- template <typename T>
- void setUniformInternal(GLint location, GLsizei count, const T *v, GLenum uniformType);
-
- template <int cols, int rows>
- bool setUniformMatrixfvImpl(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value,
- uint8_t *targetData,
- GLenum targetUniformType);
-
- template <int cols, int rows>
- void setUniformMatrixfvInternal(GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value,
- GLenum targetUniformType);
-
- gl::LinkResult compileProgramExecutables(const gl::Context *context, gl::InfoLog &infoLog);
- gl::LinkResult compileComputeExecutable(const gl::Context *context, gl::InfoLog &infoLog);
-
- void gatherTransformFeedbackVaryings(const gl::VaryingPacking &varyings,
- const BuiltinInfo &builtins);
- D3DUniform *getD3DUniformByName(const std::string &name);
- D3DUniform *getD3DUniformFromLocation(GLint location);
- const D3DUniform *getD3DUniformFromLocation(GLint location) const;
-
- void initAttribLocationsToD3DSemantic(const gl::Context *context);
-
- void reset();
- void initializeUniformBlocks();
-
- void updateCachedInputLayoutFromShader(const gl::Context *context);
- void updateCachedOutputLayoutFromShader();
- void updateCachedVertexExecutableIndex();
- void updateCachedPixelExecutableIndex();
-
- void linkResources(const gl::Context *context, const gl::ProgramLinkedResources &resources);
-
- RendererD3D *mRenderer;
- DynamicHLSL *mDynamicHLSL;
-
- std::vector<std::unique_ptr<VertexExecutable>> mVertexExecutables;
- std::vector<std::unique_ptr<PixelExecutable>> mPixelExecutables;
- std::vector<std::unique_ptr<ShaderExecutableD3D>> mGeometryExecutables;
- std::unique_ptr<ShaderExecutableD3D> mComputeExecutable;
-
- std::string mVertexHLSL;
- angle::CompilerWorkaroundsD3D mVertexWorkarounds;
-
- std::string mPixelHLSL;
- angle::CompilerWorkaroundsD3D mPixelWorkarounds;
- bool mUsesFragDepth;
- bool mHasANGLEMultiviewEnabled;
- bool mUsesViewID;
- std::vector<PixelShaderOutputVariable> mPixelShaderKey;
-
- // Common code for all dynamic geometry shaders. Consists mainly of the GS input and output
- // structures, built from the linked varying info. We store the string itself instead of the
- // packed varyings for simplicity.
- std::string mGeometryShaderPreamble;
-
- bool mUsesPointSize;
- bool mUsesFlatInterpolation;
-
- std::unique_ptr<UniformStorageD3D> mVertexUniformStorage;
- std::unique_ptr<UniformStorageD3D> mFragmentUniformStorage;
- std::unique_ptr<UniformStorageD3D> mComputeUniformStorage;
-
- std::vector<Sampler> mSamplersPS;
- std::vector<Sampler> mSamplersVS;
- std::vector<Sampler> mSamplersCS;
- GLuint mUsedVertexSamplerRange;
- GLuint mUsedPixelSamplerRange;
- GLuint mUsedComputeSamplerRange;
- bool mDirtySamplerMapping;
-
- // Cache for pixel shader output layout to save reallocations.
- std::vector<GLenum> mPixelShaderOutputLayoutCache;
- Optional<size_t> mCachedPixelExecutableIndex;
-
- AttribIndexArray mAttribLocationToD3DSemantic;
-
- unsigned int mSerial;
-
- std::vector<GLint> mVertexUBOCache;
- std::vector<GLint> mFragmentUBOCache;
- VertexExecutable::Signature mCachedVertexSignature;
- gl::InputLayout mCachedInputLayout;
- Optional<size_t> mCachedVertexExecutableIndex;
-
- std::vector<D3DVarying> mStreamOutVaryings;
- std::vector<D3DUniform *> mD3DUniforms;
- std::vector<D3DUniformBlock> mD3DUniformBlocks;
-
- bool mVertexUniformsDirty;
- bool mFragmentUniformsDirty;
- bool mComputeUniformsDirty;
-
- static unsigned int issueSerial();
- static unsigned int mCurrentSerial;
-
- Serial mCurrentVertexArrayStateSerial;
-};
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_PROGRAMD3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderTargetD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderTargetD3D.cpp
deleted file mode 100644
index 84b30aa106..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderTargetD3D.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-//
-// Copyright (c) 2012-2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// RenderTargetD3D.cpp: Implements serial handling for rx::RenderTargetD3D
-
-#include "libANGLE/renderer/d3d/RenderTargetD3D.h"
-
-namespace rx
-{
-unsigned int RenderTargetD3D::mCurrentSerial = 1;
-
-RenderTargetD3D::RenderTargetD3D()
- : mSerial(issueSerials(1))
-{
-}
-
-RenderTargetD3D::~RenderTargetD3D()
-{
-}
-
-unsigned int RenderTargetD3D::getSerial() const
-{
- return mSerial;
-}
-
-unsigned int RenderTargetD3D::issueSerials(unsigned int count)
-{
- unsigned int firstSerial = mCurrentSerial;
- mCurrentSerial += count;
- return firstSerial;
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderTargetD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderTargetD3D.h
deleted file mode 100644
index fde96133b0..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderTargetD3D.h
+++ /dev/null
@@ -1,47 +0,0 @@
-//
-// Copyright (c) 2012-2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// RenderTargetD3D.h: Defines an abstract wrapper class to manage IDirect3DSurface9
-// and ID3D11View objects belonging to renderbuffers and renderable textures.
-
-#ifndef LIBANGLE_RENDERER_D3D_RENDERTARGETD3D_H_
-#define LIBANGLE_RENDERER_D3D_RENDERTARGETD3D_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/FramebufferAttachment.h"
-
-namespace rx
-{
-
-class RenderTargetD3D : public FramebufferAttachmentRenderTarget
-{
- public:
- RenderTargetD3D();
- ~RenderTargetD3D() override;
-
- virtual GLsizei getWidth() const = 0;
- virtual GLsizei getHeight() const = 0;
- virtual GLsizei getDepth() const = 0;
- virtual GLenum getInternalFormat() const = 0;
- virtual GLsizei getSamples() const = 0;
- gl::Extents getExtents() const { return gl::Extents(getWidth(), getHeight(), getDepth()); }
- bool isMultisampled() const { return getSamples() > 0; }
-
- virtual unsigned int getSerial() const;
- static unsigned int issueSerials(unsigned int count);
-
- // Only currently applies to D3D11.
- virtual void signalDirty(const gl::Context *context) {}
-
- private:
- const unsigned int mSerial;
- static unsigned int mCurrentSerial;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_RENDERTARGETD3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.cpp
deleted file mode 100644
index d799e0b992..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.cpp
+++ /dev/null
@@ -1,130 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// RenderbufferD3d.cpp: Implements the RenderbufferD3D class, a specialization of RenderbufferImpl
-
-
-#include "libANGLE/renderer/d3d/RenderbufferD3D.h"
-
-#include "libANGLE/Image.h"
-#include "libANGLE/renderer/d3d/EGLImageD3D.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-#include "libANGLE/renderer/d3d/RenderTargetD3D.h"
-
-namespace rx
-{
-RenderbufferD3D::RenderbufferD3D(RendererD3D *renderer)
- : mRenderer(renderer), mRenderTarget(nullptr), mImage(nullptr)
-{
-}
-
-RenderbufferD3D::~RenderbufferD3D()
-{
- SafeDelete(mRenderTarget);
- mImage = nullptr;
-}
-
-gl::Error RenderbufferD3D::onDestroy(const gl::Context *context)
-{
- deleteRenderTarget(context);
- return gl::NoError();
-}
-
-gl::Error RenderbufferD3D::setStorage(const gl::Context *context,
- GLenum internalformat,
- size_t width,
- size_t height)
-{
- return setStorageMultisample(context, 0, internalformat, width, height);
-}
-
-gl::Error RenderbufferD3D::setStorageMultisample(const gl::Context *context,
- size_t samples,
- GLenum internalformat,
- size_t width,
- size_t height)
-{
- // If the renderbuffer parameters are queried, the calling function
- // will expect one of the valid renderbuffer formats for use in
- // glRenderbufferStorage, but we should create depth and stencil buffers
- // as DEPTH24_STENCIL8
- GLenum creationFormat = internalformat;
- if (internalformat == GL_DEPTH_COMPONENT16 || internalformat == GL_STENCIL_INDEX8)
- {
- creationFormat = GL_DEPTH24_STENCIL8_OES;
- }
-
- // ANGLE_framebuffer_multisample states GL_OUT_OF_MEMORY is generated on a failure to create
- // the specified storage.
- // Because ES 3.0 already knows the exact number of supported samples, it would already have been
- // validated and generated GL_INVALID_VALUE.
- const gl::TextureCaps &formatCaps = mRenderer->getNativeTextureCaps().get(creationFormat);
- if (samples > formatCaps.getMaxSamples())
- {
- return gl::OutOfMemory() << "Renderbuffer format does not support " << samples
- << " samples, " << formatCaps.getMaxSamples()
- << " is the maximum.";
- }
-
- RenderTargetD3D *newRT = nullptr;
- ANGLE_TRY(mRenderer->createRenderTarget(static_cast<int>(width), static_cast<int>(height),
- creationFormat, static_cast<GLsizei>(samples), &newRT));
-
- deleteRenderTarget(context);
- mImage = nullptr;
- mRenderTarget = newRT;
-
- return gl::NoError();
-}
-
-gl::Error RenderbufferD3D::setStorageEGLImageTarget(const gl::Context *context, egl::Image *image)
-{
- mImage = GetImplAs<EGLImageD3D>(image);
- deleteRenderTarget(context);
-
- return gl::NoError();
-}
-
-gl::Error RenderbufferD3D::getRenderTarget(const gl::Context *context,
- RenderTargetD3D **outRenderTarget)
-{
- if (mImage)
- {
- return mImage->getRenderTarget(context, outRenderTarget);
- }
- else
- {
- *outRenderTarget = mRenderTarget;
- return gl::NoError();
- }
-}
-
-gl::Error RenderbufferD3D::getAttachmentRenderTarget(const gl::Context *context,
- GLenum /*binding*/,
- const gl::ImageIndex & /*imageIndex*/,
- FramebufferAttachmentRenderTarget **rtOut)
-{
- return getRenderTarget(context, reinterpret_cast<RenderTargetD3D **>(rtOut));
-}
-
-void RenderbufferD3D::deleteRenderTarget(const gl::Context *context)
-{
- if (mRenderTarget)
- {
- mRenderTarget->signalDirty(context);
- SafeDelete(mRenderTarget);
- }
-}
-
-gl::Error RenderbufferD3D::initializeContents(const gl::Context *context,
- const gl::ImageIndex &imageIndex)
-{
- RenderTargetD3D *renderTarget = nullptr;
- ANGLE_TRY(getRenderTarget(context, &renderTarget));
- return mRenderer->initRenderTarget(renderTarget);
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.h
deleted file mode 100644
index b50eff7db7..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.h
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// RenderbufferD3d.h: Defines the RenderbufferD3D class which implements RenderbufferImpl.
-
-#ifndef LIBANGLE_RENDERER_D3D_RENDERBUFFERD3D_H_
-#define LIBANGLE_RENDERER_D3D_RENDERBUFFERD3D_H_
-
-#include "angle_gl.h"
-
-#include "common/angleutils.h"
-#include "libANGLE/renderer/RenderbufferImpl.h"
-
-namespace rx
-{
-class EGLImageD3D;
-class RendererD3D;
-class RenderTargetD3D;
-class SwapChainD3D;
-
-class RenderbufferD3D : public RenderbufferImpl
-{
- public:
- RenderbufferD3D(RendererD3D *renderer);
- ~RenderbufferD3D() override;
-
- gl::Error onDestroy(const gl::Context *context) override;
-
- gl::Error setStorage(const gl::Context *context,
- GLenum internalformat,
- size_t width,
- size_t height) override;
- gl::Error setStorageMultisample(const gl::Context *context,
- size_t samples,
- GLenum internalformat,
- size_t width,
- size_t height) override;
- gl::Error setStorageEGLImageTarget(const gl::Context *context, egl::Image *image) override;
-
- gl::Error getRenderTarget(const gl::Context *context, RenderTargetD3D **outRenderTarget);
- gl::Error getAttachmentRenderTarget(const gl::Context *context,
- GLenum binding,
- const gl::ImageIndex &imageIndex,
- FramebufferAttachmentRenderTarget **rtOut) override;
-
- gl::Error initializeContents(const gl::Context *context,
- const gl::ImageIndex &imageIndex) override;
-
- private:
- void deleteRenderTarget(const gl::Context *context);
-
- RendererD3D *mRenderer;
- RenderTargetD3D *mRenderTarget;
- EGLImageD3D *mImage;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_RENDERBUFFERD3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RendererD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/RendererD3D.cpp
deleted file mode 100644
index 2167200a91..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RendererD3D.cpp
+++ /dev/null
@@ -1,260 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// RendererD3D.cpp: Implementation of the base D3D Renderer.
-
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-
-#include "common/MemoryBuffer.h"
-#include "common/debug.h"
-#include "common/utilities.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Display.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/ImageIndex.h"
-#include "libANGLE/ResourceManager.h"
-#include "libANGLE/State.h"
-#include "libANGLE/VertexArray.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/ContextImpl.h"
-#include "libANGLE/renderer/TextureImpl.h"
-#include "libANGLE/renderer/d3d/BufferD3D.h"
-#include "libANGLE/renderer/d3d/DeviceD3D.h"
-#include "libANGLE/renderer/d3d/DisplayD3D.h"
-#include "libANGLE/renderer/d3d/IndexDataManager.h"
-#include "libANGLE/renderer/d3d/ProgramD3D.h"
-#include "libANGLE/renderer/d3d/SamplerD3D.h"
-#include "libANGLE/renderer/d3d/TextureD3D.h"
-
-namespace rx
-{
-
-RendererD3D::RendererD3D(egl::Display *display)
- : mDisplay(display),
- mPresentPathFastEnabled(false),
- mCapsInitialized(false),
- mWorkaroundsInitialized(false),
- mDisjoint(false),
- mDeviceLost(false),
- mWorkerThreadPool(4)
-{
-}
-
-RendererD3D::~RendererD3D()
-{
- cleanup();
-}
-
-void RendererD3D::cleanup()
-{
- mIncompleteTextures.onDestroy(mDisplay->getProxyContext());
-}
-
-bool RendererD3D::skipDraw(const gl::State &glState, GLenum drawMode)
-{
- if (drawMode == GL_POINTS)
- {
- bool usesPointSize = GetImplAs<ProgramD3D>(glState.getProgram())->usesPointSize();
-
- // ProgramBinary assumes non-point rendering if gl_PointSize isn't written,
- // which affects varying interpolation. Since the value of gl_PointSize is
- // undefined when not written, just skip drawing to avoid unexpected results.
- if (!usesPointSize && !glState.isTransformFeedbackActiveUnpaused())
- {
- // Notify developers of risking undefined behavior.
- WARN() << "Point rendering without writing to gl_PointSize.";
- return true;
- }
- }
- else if (gl::IsTriangleMode(drawMode))
- {
- if (glState.getRasterizerState().cullFace &&
- glState.getRasterizerState().cullMode == gl::CullFaceMode::FrontAndBack)
- {
- return true;
- }
- }
-
- return false;
-}
-
-gl::Error RendererD3D::getIncompleteTexture(const gl::Context *context,
- GLenum type,
- gl::Texture **textureOut)
-{
- return mIncompleteTextures.getIncompleteTexture(context, type, this, textureOut);
-}
-
-GLenum RendererD3D::getResetStatus()
-{
- if (!mDeviceLost)
- {
- if (testDeviceLost())
- {
- mDeviceLost = true;
- notifyDeviceLost();
- return GL_UNKNOWN_CONTEXT_RESET_EXT;
- }
- return GL_NO_ERROR;
- }
-
- if (testDeviceResettable())
- {
- return GL_NO_ERROR;
- }
-
- return GL_UNKNOWN_CONTEXT_RESET_EXT;
-}
-
-void RendererD3D::notifyDeviceLost()
-{
- mDisplay->notifyDeviceLost();
-}
-
-std::string RendererD3D::getVendorString() const
-{
- LUID adapterLuid = {0};
-
- if (getLUID(&adapterLuid))
- {
- char adapterLuidString[64];
- sprintf_s(adapterLuidString, sizeof(adapterLuidString), "(adapter LUID: %08x%08x)",
- adapterLuid.HighPart, adapterLuid.LowPart);
- return std::string(adapterLuidString);
- }
-
- return std::string("");
-}
-
-void RendererD3D::setGPUDisjoint()
-{
- mDisjoint = true;
-}
-
-GLint RendererD3D::getGPUDisjoint()
-{
- bool disjoint = mDisjoint;
-
- // Disjoint flag is cleared when read
- mDisjoint = false;
-
- return disjoint;
-}
-
-GLint64 RendererD3D::getTimestamp()
-{
- // D3D has no way to get an actual timestamp reliably so 0 is returned
- return 0;
-}
-
-void RendererD3D::ensureCapsInitialized() const
-{
- if (!mCapsInitialized)
- {
- generateCaps(&mNativeCaps, &mNativeTextureCaps, &mNativeExtensions, &mNativeLimitations);
- mCapsInitialized = true;
- }
-}
-
-const gl::Caps &RendererD3D::getNativeCaps() const
-{
- ensureCapsInitialized();
- return mNativeCaps;
-}
-
-const gl::TextureCapsMap &RendererD3D::getNativeTextureCaps() const
-{
- ensureCapsInitialized();
- return mNativeTextureCaps;
-}
-
-const gl::Extensions &RendererD3D::getNativeExtensions() const
-{
- ensureCapsInitialized();
- return mNativeExtensions;
-}
-
-const gl::Limitations &RendererD3D::getNativeLimitations() const
-{
- ensureCapsInitialized();
- return mNativeLimitations;
-}
-
-angle::WorkerThreadPool *RendererD3D::getWorkerThreadPool()
-{
- return &mWorkerThreadPool;
-}
-
-Serial RendererD3D::generateSerial()
-{
- return mSerialFactory.generate();
-}
-
-bool InstancedPointSpritesActive(ProgramD3D *programD3D, GLenum mode)
-{
- return programD3D->usesPointSize() && programD3D->usesInstancedPointSpriteEmulation() &&
- mode == GL_POINTS;
-}
-
-gl::Error RendererD3D::initRenderTarget(RenderTargetD3D *renderTarget)
-{
- return clearRenderTarget(renderTarget, gl::ColorF(0, 0, 0, 0), 1, 0);
-}
-
-gl::Error RendererD3D::initializeMultisampleTextureToBlack(const gl::Context *context,
- gl::Texture *glTexture)
-{
- ASSERT(glTexture->getTarget() == GL_TEXTURE_2D_MULTISAMPLE);
- TextureD3D *textureD3D = GetImplAs<TextureD3D>(glTexture);
- gl::ImageIndex index = gl::ImageIndex::Make2DMultisample();
- RenderTargetD3D *renderTarget = nullptr;
- ANGLE_TRY(textureD3D->getRenderTarget(context, index, &renderTarget));
- return clearRenderTarget(renderTarget, gl::ColorF(0.0f, 0.0f, 0.0f, 1.0f), 1.0f, 0);
-}
-
-unsigned int GetBlendSampleMask(const gl::State &glState, int samples)
-{
- unsigned int mask = 0;
- if (glState.isSampleCoverageEnabled())
- {
- GLfloat coverageValue = glState.getSampleCoverageValue();
- if (coverageValue != 0)
- {
- float threshold = 0.5f;
-
- for (int i = 0; i < samples; ++i)
- {
- mask <<= 1;
-
- if ((i + 1) * coverageValue >= threshold)
- {
- threshold += 1.0f;
- mask |= 1;
- }
- }
- }
-
- bool coverageInvert = glState.getSampleCoverageInvert();
- if (coverageInvert)
- {
- mask = ~mask;
- }
- }
- else
- {
- mask = 0xFFFFFFFF;
- }
-
- if (glState.isSampleMaskEnabled())
- {
- mask &= glState.getSampleMaskWord(0);
- }
-
- return mask;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RendererD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/RendererD3D.h
deleted file mode 100644
index dcc98f2ec6..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/RendererD3D.h
+++ /dev/null
@@ -1,359 +0,0 @@
-
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// RendererD3D.h: Defines a back-end specific class for the DirectX renderer.
-
-#ifndef LIBANGLE_RENDERER_D3D_RENDERERD3D_H_
-#define LIBANGLE_RENDERER_D3D_RENDERERD3D_H_
-
-#include <array>
-
-#include "common/Color.h"
-#include "common/MemoryBuffer.h"
-#include "common/debug.h"
-#include "libANGLE/ContextState.h"
-#include "libANGLE/Device.h"
-#include "libANGLE/Version.h"
-#include "libANGLE/WorkerThread.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/d3d/VertexDataManager.h"
-#include "libANGLE/renderer/d3d/formatutilsD3D.h"
-#include "libANGLE/renderer/renderer_utils.h"
-#include "platform/WorkaroundsD3D.h"
-
-namespace egl
-{
-class ConfigSet;
-}
-
-namespace gl
-{
-class FramebufferState;
-class InfoLog;
-class Texture;
-struct LinkedVarying;
-}
-
-namespace rx
-{
-class ContextImpl;
-struct D3DUniform;
-struct D3DVarying;
-class DeviceD3D;
-class EGLImageD3D;
-class FramebufferImpl;
-class ImageD3D;
-class IndexBuffer;
-class NativeWindowD3D;
-class ProgramD3D;
-class RenderTargetD3D;
-class ShaderExecutableD3D;
-class SwapChainD3D;
-class TextureStorage;
-struct TranslatedIndexData;
-class UniformStorageD3D;
-class VertexBuffer;
-
-struct DeviceIdentifier
-{
- UINT VendorId;
- UINT DeviceId;
- UINT SubSysId;
- UINT Revision;
- UINT FeatureLevel;
-};
-
-enum RendererClass
-{
- RENDERER_D3D11,
- RENDERER_D3D9
-};
-
-// Useful for unit testing
-class BufferFactoryD3D : angle::NonCopyable
-{
- public:
- BufferFactoryD3D() {}
- virtual ~BufferFactoryD3D() {}
-
- virtual VertexBuffer *createVertexBuffer() = 0;
- virtual IndexBuffer *createIndexBuffer() = 0;
-
- // TODO(jmadill): add VertexFormatCaps
- virtual VertexConversionType getVertexConversionType(gl::VertexFormatType vertexFormatType) const = 0;
- virtual GLenum getVertexComponentType(gl::VertexFormatType vertexFormatType) const = 0;
-
- // Warning: you should ensure binding really matches attrib.bindingIndex before using this
- // function.
- virtual gl::ErrorOrResult<unsigned int> getVertexSpaceRequired(
- const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding,
- GLsizei count,
- GLsizei instances) const = 0;
-};
-
-using AttribIndexArray = std::array<int, gl::MAX_VERTEX_ATTRIBS>;
-
-class RendererD3D : public BufferFactoryD3D, public MultisampleTextureInitializer
-{
- public:
- explicit RendererD3D(egl::Display *display);
- ~RendererD3D() override;
-
- virtual egl::Error initialize() = 0;
-
- virtual egl::ConfigSet generateConfigs() = 0;
- virtual void generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const = 0;
-
- virtual ContextImpl *createContext(const gl::ContextState &state) = 0;
-
- std::string getVendorString() const;
-
- virtual int getMinorShaderModel() const = 0;
- virtual std::string getShaderModelSuffix() const = 0;
-
- // Direct3D Specific methods
- virtual DeviceIdentifier getAdapterIdentifier() const = 0;
-
- virtual bool isValidNativeWindow(EGLNativeWindowType window) const = 0;
- virtual NativeWindowD3D *createNativeWindow(EGLNativeWindowType window,
- const egl::Config *config,
- const egl::AttributeMap &attribs) const = 0;
-
- virtual SwapChainD3D *createSwapChain(NativeWindowD3D *nativeWindow,
- HANDLE shareHandle,
- IUnknown *d3dTexture,
- GLenum backBufferFormat,
- GLenum depthBufferFormat,
- EGLint orientation,
- EGLint samples) = 0;
- virtual egl::Error getD3DTextureInfo(const egl::Config *configuration,
- IUnknown *d3dTexture,
- EGLint *width,
- EGLint *height,
- GLenum *fboFormat) const = 0;
- virtual egl::Error validateShareHandle(const egl::Config *config,
- HANDLE shareHandle,
- const egl::AttributeMap &attribs) const = 0;
-
- virtual int getMajorShaderModel() const = 0;
-
- const angle::WorkaroundsD3D &getWorkarounds() const;
-
- // Pixel operations
- virtual gl::Error copyImage2D(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLint level) = 0;
- virtual gl::Error copyImageCube(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLenum target,
- GLint level) = 0;
- virtual gl::Error copyImage3D(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLint level) = 0;
- virtual gl::Error copyImage2DArray(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLint level) = 0;
-
- virtual gl::Error copyTexture(const gl::Context *context,
- const gl::Texture *source,
- GLint sourceLevel,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLenum destTarget,
- GLint destLevel,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha) = 0;
- virtual gl::Error copyCompressedTexture(const gl::Context *context,
- const gl::Texture *source,
- GLint sourceLevel,
- TextureStorage *storage,
- GLint destLevel) = 0;
-
- // RenderTarget creation
- virtual gl::Error createRenderTarget(int width, int height, GLenum format, GLsizei samples, RenderTargetD3D **outRT) = 0;
- virtual gl::Error createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) = 0;
-
- // Shader operations
- virtual gl::Error loadExecutable(const uint8_t *function,
- size_t length,
- gl::ShaderType type,
- const std::vector<D3DVarying> &streamOutVaryings,
- bool separatedOutputBuffers,
- ShaderExecutableD3D **outExecutable) = 0;
- virtual gl::Error compileToExecutable(gl::InfoLog &infoLog,
- const std::string &shaderHLSL,
- gl::ShaderType type,
- const std::vector<D3DVarying> &streamOutVaryings,
- bool separatedOutputBuffers,
- const angle::CompilerWorkaroundsD3D &workarounds,
- ShaderExecutableD3D **outExectuable) = 0;
- virtual gl::Error ensureHLSLCompilerInitialized() = 0;
-
- virtual UniformStorageD3D *createUniformStorage(size_t storageSize) = 0;
-
- // Image operations
- virtual ImageD3D *createImage() = 0;
- virtual gl::Error generateMipmap(const gl::Context *context,
- ImageD3D *dest,
- ImageD3D *source) = 0;
- virtual gl::Error generateMipmapUsingD3D(const gl::Context *context,
- TextureStorage *storage,
- const gl::TextureState &textureState) = 0;
- virtual gl::Error copyImage(const gl::Context *context,
- ImageD3D *dest,
- ImageD3D *source,
- const gl::Rectangle &sourceRect,
- const gl::Offset &destOffset,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha) = 0;
- virtual TextureStorage *createTextureStorage2D(SwapChainD3D *swapChain) = 0;
- virtual TextureStorage *createTextureStorageEGLImage(EGLImageD3D *eglImage,
- RenderTargetD3D *renderTargetD3D) = 0;
- virtual TextureStorage *createTextureStorageExternal(
- egl::Stream *stream,
- const egl::Stream::GLTextureDescription &desc) = 0;
- virtual TextureStorage *createTextureStorage2D(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels, bool hintLevelZeroOnly) = 0;
- virtual TextureStorage *createTextureStorageCube(GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly) = 0;
- virtual TextureStorage *createTextureStorage3D(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth, int levels) = 0;
- virtual TextureStorage *createTextureStorage2DArray(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth, int levels) = 0;
- virtual TextureStorage *createTextureStorage2DMultisample(GLenum internalformat,
- GLsizei width,
- GLsizei height,
- int levels,
- int samples,
- bool fixedSampleLocations) = 0;
-
- // Buffer-to-texture and Texture-to-buffer copies
- virtual bool supportsFastCopyBufferToTexture(GLenum internalFormat) const = 0;
- virtual gl::Error fastCopyBufferToTexture(const gl::Context *context,
- const gl::PixelUnpackState &unpack,
- unsigned int offset,
- RenderTargetD3D *destRenderTarget,
- GLenum destinationFormat,
- GLenum sourcePixelsType,
- const gl::Box &destArea) = 0;
-
- // Device lost
- GLenum getResetStatus();
- void notifyDeviceLost();
- virtual bool resetDevice() = 0;
- virtual bool testDeviceLost() = 0;
- virtual bool testDeviceResettable() = 0;
-
- virtual RendererClass getRendererClass() const = 0;
- virtual void *getD3DDevice() = 0;
-
- void setGPUDisjoint();
-
- GLint getGPUDisjoint();
- GLint64 getTimestamp();
-
- virtual gl::Error clearRenderTarget(RenderTargetD3D *renderTarget,
- const gl::ColorF &clearColorValue,
- const float clearDepthValue,
- const unsigned int clearStencilValue) = 0;
-
- virtual egl::Error getEGLDevice(DeviceImpl **device) = 0;
-
- bool presentPathFastEnabled() const { return mPresentPathFastEnabled; }
-
- // Stream creation
- virtual StreamProducerImpl *createStreamProducerD3DTextureNV12(
- egl::Stream::ConsumerType consumerType,
- const egl::AttributeMap &attribs) = 0;
-
- const gl::Caps &getNativeCaps() const;
- const gl::TextureCapsMap &getNativeTextureCaps() const;
- const gl::Extensions &getNativeExtensions() const;
- const gl::Limitations &getNativeLimitations() const;
-
- // Necessary hack for default framebuffers in D3D.
- virtual FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) = 0;
-
- virtual gl::Version getMaxSupportedESVersion() const = 0;
-
- gl::Error initRenderTarget(RenderTargetD3D *renderTarget);
-
- angle::WorkerThreadPool *getWorkerThreadPool();
-
- gl::Error getIncompleteTexture(const gl::Context *context,
- GLenum type,
- gl::Texture **textureOut);
-
- Serial generateSerial();
-
- virtual bool canSelectViewInVertexShader() const = 0;
-
- gl::Error initializeMultisampleTextureToBlack(const gl::Context *context,
- gl::Texture *glTexture) override;
-
- protected:
- virtual bool getLUID(LUID *adapterLuid) const = 0;
- virtual void generateCaps(gl::Caps *outCaps,
- gl::TextureCapsMap *outTextureCaps,
- gl::Extensions *outExtensions,
- gl::Limitations *outLimitations) const = 0;
-
- void cleanup();
-
- bool skipDraw(const gl::State &glState, GLenum drawMode);
-
- egl::Display *mDisplay;
-
- bool mPresentPathFastEnabled;
-
- private:
- void ensureCapsInitialized() const;
-
- virtual angle::WorkaroundsD3D generateWorkarounds() const = 0;
-
- mutable bool mCapsInitialized;
- mutable gl::Caps mNativeCaps;
- mutable gl::TextureCapsMap mNativeTextureCaps;
- mutable gl::Extensions mNativeExtensions;
- mutable gl::Limitations mNativeLimitations;
-
- IncompleteTextureSet mIncompleteTextures;
-
- mutable bool mWorkaroundsInitialized;
- mutable angle::WorkaroundsD3D mWorkarounds;
-
- bool mDisjoint;
- bool mDeviceLost;
-
- angle::WorkerThreadPool mWorkerThreadPool;
-
- SerialFactory mSerialFactory;
-};
-
-unsigned int GetBlendSampleMask(const gl::State &glState, int samples);
-bool InstancedPointSpritesActive(ProgramD3D *programD3D, GLenum mode);
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_RENDERERD3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SamplerD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/SamplerD3D.h
deleted file mode 100644
index 3f8f5b9d8d..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SamplerD3D.h
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// SamplerD3D.h: Defines the rx::SamplerD3D class, an implementation of SamplerImpl.
-
-#ifndef LIBANGLE_RENDERER_D3D_SAMPLERD3D_H_
-#define LIBANGLE_RENDERER_D3D_SAMPLERD3D_H_
-
-#include "libANGLE/renderer/SamplerImpl.h"
-
-namespace rx
-{
-
-class SamplerD3D : public SamplerImpl
-{
- public:
- SamplerD3D(const gl::SamplerState &state) : SamplerImpl(state) {}
- ~SamplerD3D() override {}
-};
-}
-
-#endif // LIBANGLE_RENDERER_D3D_SAMPLERD3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderD3D.cpp
deleted file mode 100644
index 2a8f1fb11c..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderD3D.cpp
+++ /dev/null
@@ -1,247 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ShaderD3D.cpp: Defines the rx::ShaderD3D class which implements rx::ShaderImpl.
-
-#include "libANGLE/renderer/d3d/ShaderD3D.h"
-
-#include "common/utilities.h"
-#include "libANGLE/Caps.h"
-#include "libANGLE/Compiler.h"
-#include "libANGLE/Shader.h"
-#include "libANGLE/features.h"
-#include "libANGLE/renderer/d3d/ProgramD3D.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-
-// Definitions local to the translation unit
-namespace
-{
-
-const char *GetShaderTypeString(GLenum type)
-{
- switch (type)
- {
- case GL_VERTEX_SHADER:
- return "VERTEX";
-
- case GL_FRAGMENT_SHADER:
- return "FRAGMENT";
-
- case GL_COMPUTE_SHADER:
- return "COMPUTE";
-
- default:
- UNREACHABLE();
- return "";
- }
-}
-
-} // anonymous namespace
-
-namespace rx
-{
-
-ShaderD3D::ShaderD3D(const gl::ShaderState &data,
- const angle::WorkaroundsD3D &workarounds,
- const gl::Extensions &extensions)
- : ShaderImpl(data), mAdditionalOptions(0)
-{
- uncompile();
-
- if (workarounds.expandIntegerPowExpressions)
- {
- mAdditionalOptions |= SH_EXPAND_SELECT_HLSL_INTEGER_POW_EXPRESSIONS;
- }
-
- if (workarounds.getDimensionsIgnoresBaseLevel)
- {
- mAdditionalOptions |= SH_HLSL_GET_DIMENSIONS_IGNORES_BASE_LEVEL;
- }
-
- if (workarounds.preAddTexelFetchOffsets)
- {
- mAdditionalOptions |= SH_REWRITE_TEXELFETCHOFFSET_TO_TEXELFETCH;
- }
- if (workarounds.rewriteUnaryMinusOperator)
- {
- mAdditionalOptions |= SH_REWRITE_INTEGER_UNARY_MINUS_OPERATOR;
- }
- if (workarounds.emulateIsnanFloat)
- {
- mAdditionalOptions |= SH_EMULATE_ISNAN_FLOAT_FUNCTION;
- }
- if (extensions.multiview)
- {
- mAdditionalOptions |= SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW;
- }
-}
-
-ShaderD3D::~ShaderD3D()
-{
-}
-
-std::string ShaderD3D::getDebugInfo() const
-{
- if (mDebugInfo.empty())
- {
- return "";
- }
-
- return mDebugInfo + std::string("\n// ") + GetShaderTypeString(mData.getShaderType()) +
- " SHADER END\n";
-}
-
-// initialize/clean up previous state
-void ShaderD3D::uncompile()
-{
- // set by compileToHLSL
- mCompilerOutputType = SH_ESSL_OUTPUT;
-
- mUsesMultipleRenderTargets = false;
- mUsesFragColor = false;
- mUsesFragData = false;
- mUsesFragCoord = false;
- mUsesFrontFacing = false;
- mUsesPointSize = false;
- mUsesPointCoord = false;
- mUsesDepthRange = false;
- mUsesFragDepth = false;
- mHasANGLEMultiviewEnabled = false;
- mUsesViewID = false;
- mUsesDiscardRewriting = false;
- mUsesNestedBreak = false;
- mRequiresIEEEStrictCompiling = false;
-
- mDebugInfo.clear();
-}
-
-void ShaderD3D::generateWorkarounds(angle::CompilerWorkaroundsD3D *workarounds) const
-{
- if (mUsesDiscardRewriting)
- {
- // ANGLE issue 486:
- // Work-around a D3D9 compiler bug that presents itself when using conditional discard, by disabling optimization
- workarounds->skipOptimization = true;
- }
- else if (mUsesNestedBreak)
- {
- // ANGLE issue 603:
- // Work-around a D3D9 compiler bug that presents itself when using break in a nested loop, by maximizing optimization
- // We want to keep the use of ANGLE_D3D_WORKAROUND_MAX_OPTIMIZATION minimal to prevent hangs, so usesDiscard takes precedence
- workarounds->useMaxOptimization = true;
- }
-
- if (mRequiresIEEEStrictCompiling)
- {
- // IEEE Strictness for D3D compiler needs to be enabled for NaNs to work.
- workarounds->enableIEEEStrictness = true;
- }
-}
-
-unsigned int ShaderD3D::getUniformRegister(const std::string &uniformName) const
-{
- ASSERT(mUniformRegisterMap.count(uniformName) > 0);
- return mUniformRegisterMap.find(uniformName)->second;
-}
-
-unsigned int ShaderD3D::getUniformBlockRegister(const std::string &blockName) const
-{
- ASSERT(mUniformBlockRegisterMap.count(blockName) > 0);
- return mUniformBlockRegisterMap.find(blockName)->second;
-}
-
-ShShaderOutput ShaderD3D::getCompilerOutputType() const
-{
- return mCompilerOutputType;
-}
-
-ShCompileOptions ShaderD3D::prepareSourceAndReturnOptions(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)
-{
- ASSERT(uniformRegisterMap);
- return *uniformRegisterMap;
-}
-
-bool ShaderD3D::postTranslateCompile(gl::Compiler *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;
- 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->getCompilerHandle(mData.getShaderType());
-
- mUniformRegisterMap = GetUniformRegisterMap(sh::GetUniformRegisterMap(compilerHandle));
-
- for (const sh::InterfaceBlock &interfaceBlock : mData.getUniformBlocks())
- {
- if (interfaceBlock.staticUse)
- {
- unsigned int index = static_cast<unsigned int>(-1);
- bool blockRegisterResult =
- sh::GetUniformBlockRegister(compilerHandle, interfaceBlock.name, &index);
- ASSERT(blockRegisterResult);
-
- mUniformBlockRegisterMap[interfaceBlock.name] = index;
- }
- }
-
- mDebugInfo +=
- std::string("// ") + 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;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderD3D.h
deleted file mode 100644
index f7b0b20db4..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderD3D.h
+++ /dev/null
@@ -1,99 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ShaderD3D.h: Defines the rx::ShaderD3D class which implements rx::ShaderImpl.
-
-#ifndef LIBANGLE_RENDERER_D3D_SHADERD3D_H_
-#define LIBANGLE_RENDERER_D3D_SHADERD3D_H_
-
-#include "libANGLE/renderer/ShaderImpl.h"
-
-#include <map>
-
-namespace angle
-{
-struct CompilerWorkaroundsD3D;
-struct WorkaroundsD3D;
-}
-
-namespace gl
-{
-struct Extensions;
-}
-
-namespace rx
-{
-class DynamicHLSL;
-class RendererD3D;
-struct D3DUniform;
-
-class ShaderD3D : public ShaderImpl
-{
- public:
- ShaderD3D(const gl::ShaderState &data,
- const angle::WorkaroundsD3D &workarounds,
- const gl::Extensions &extensions);
- ~ShaderD3D() override;
-
- // ShaderImpl implementation
- ShCompileOptions prepareSourceAndReturnOptions(std::stringstream *sourceStream,
- std::string *sourcePath) override;
- bool postTranslateCompile(gl::Compiler *compiler, std::string *infoLog) override;
- std::string getDebugInfo() const override;
-
- // D3D-specific methods
- void uncompile();
-
- bool hasUniform(const std::string &name) const;
-
- // Query regular uniforms with their name. Query sampler fields of structs with field selection
- // using dot (.) operator.
- unsigned int getUniformRegister(const std::string &uniformName) const;
-
- unsigned int getUniformBlockRegister(const std::string &blockName) const;
- void appendDebugInfo(const std::string &info) const { mDebugInfo += info; }
-
- void generateWorkarounds(angle::CompilerWorkaroundsD3D *workarounds) const;
-
- bool usesMultipleRenderTargets() const { return mUsesMultipleRenderTargets; }
- bool usesFragColor() const { return mUsesFragColor; }
- bool usesFragData() const { return mUsesFragData; }
- bool usesFragCoord() const { return mUsesFragCoord; }
- bool usesFrontFacing() const { return mUsesFrontFacing; }
- bool usesPointSize() const { return mUsesPointSize; }
- bool usesPointCoord() const { return mUsesPointCoord; }
- bool usesDepthRange() const { return mUsesDepthRange; }
- bool usesFragDepth() const { return mUsesFragDepth; }
- bool usesViewID() const { return mUsesViewID; }
- bool hasANGLEMultiviewEnabled() const { return mHasANGLEMultiviewEnabled; }
-
- ShShaderOutput getCompilerOutputType() const;
-
- private:
- bool mUsesMultipleRenderTargets;
- bool mUsesFragColor;
- bool mUsesFragData;
- bool mUsesFragCoord;
- bool mUsesFrontFacing;
- bool mUsesPointSize;
- bool mUsesPointCoord;
- bool mUsesDepthRange;
- bool mUsesFragDepth;
- bool mHasANGLEMultiviewEnabled;
- bool mUsesViewID;
- bool mUsesDiscardRewriting;
- bool mUsesNestedBreak;
- bool mRequiresIEEEStrictCompiling;
-
- ShShaderOutput mCompilerOutputType;
- mutable std::string mDebugInfo;
- std::map<std::string, unsigned int> mUniformRegisterMap;
- std::map<std::string, unsigned int> mUniformBlockRegisterMap;
- ShCompileOptions mAdditionalOptions;
-};
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_SHADERD3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderExecutableD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderExecutableD3D.cpp
deleted file mode 100644
index 83a66bd1a5..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderExecutableD3D.cpp
+++ /dev/null
@@ -1,71 +0,0 @@
-//
-// Copyright (c) 2012-2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ShaderExecutable.cpp: Implements a class to contain D3D shader executable
-// implementation details.
-
-#include "libANGLE/renderer/d3d/ShaderExecutableD3D.h"
-
-#include "common/angleutils.h"
-
-namespace rx
-{
-
-ShaderExecutableD3D::ShaderExecutableD3D(const void *function, size_t length)
- : mFunctionBuffer(length)
-{
- memcpy(mFunctionBuffer.data(), function, length);
-}
-
-ShaderExecutableD3D::~ShaderExecutableD3D()
-{
-}
-
-const uint8_t *ShaderExecutableD3D::getFunction() const
-{
- return mFunctionBuffer.data();
-}
-
-size_t ShaderExecutableD3D::getLength() const
-{
- return mFunctionBuffer.size();
-}
-
-const std::string &ShaderExecutableD3D::getDebugInfo() const
-{
- return mDebugInfo;
-}
-
-void ShaderExecutableD3D::appendDebugInfo(const std::string &info)
-{
- mDebugInfo += info;
-}
-
-UniformStorageD3D::UniformStorageD3D(size_t initialSize) : mUniformData()
-{
- bool result = mUniformData.resize(initialSize);
- ASSERT(result);
-
- // Uniform data is zero-initialized by default.
- mUniformData.fill(0);
-}
-
-UniformStorageD3D::~UniformStorageD3D()
-{
-}
-
-size_t UniformStorageD3D::size() const
-{
- return mUniformData.size();
-}
-
-uint8_t *UniformStorageD3D::getDataPointer(unsigned int registerIndex, unsigned int registerElement)
-{
- size_t offset = ((registerIndex * 4 + registerElement) * sizeof(float));
- return mUniformData.data() + offset;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderExecutableD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderExecutableD3D.h
deleted file mode 100644
index b8097710e2..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/ShaderExecutableD3D.h
+++ /dev/null
@@ -1,57 +0,0 @@
-//
-// Copyright (c) 2012-2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ShaderExecutable.h: Defines a class to contain D3D shader executable
-// implementation details.
-
-#ifndef LIBANGLE_RENDERER_D3D_SHADEREXECUTABLED3D_H_
-#define LIBANGLE_RENDERER_D3D_SHADEREXECUTABLED3D_H_
-
-#include "common/MemoryBuffer.h"
-#include "common/debug.h"
-
-#include <vector>
-#include <cstdint>
-
-namespace rx
-{
-
-class ShaderExecutableD3D : angle::NonCopyable
-{
- public:
- ShaderExecutableD3D(const void *function, size_t length);
- virtual ~ShaderExecutableD3D();
-
- const uint8_t *getFunction() const;
-
- size_t getLength() const;
-
- const std::string &getDebugInfo() const;
-
- void appendDebugInfo(const std::string &info);
-
- private:
- std::vector<uint8_t> mFunctionBuffer;
- std::string mDebugInfo;
-};
-
-class UniformStorageD3D : angle::NonCopyable
-{
- public:
- UniformStorageD3D(size_t initialSize);
- virtual ~UniformStorageD3D();
-
- size_t size() const;
-
- uint8_t *getDataPointer(unsigned int registerIndex, unsigned int registerElement);
-
- private:
- angle::MemoryBuffer mUniformData;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_SHADEREXECUTABLED3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp
deleted file mode 100644
index 7657aef79e..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp
+++ /dev/null
@@ -1,509 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// SurfaceD3D.cpp: D3D implementation of an EGL surface
-
-#include "libANGLE/renderer/d3d/SurfaceD3D.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Display.h"
-#include "libANGLE/Surface.h"
-#include "libANGLE/renderer/d3d/RenderTargetD3D.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-#include "libANGLE/renderer/d3d/SwapChainD3D.h"
-
-#include <tchar.h>
-#include <EGL/eglext.h>
-#include <algorithm>
-
-namespace rx
-{
-
-SurfaceD3D::SurfaceD3D(const egl::SurfaceState &state,
- RendererD3D *renderer,
- egl::Display *display,
- EGLNativeWindowType window,
- EGLenum buftype,
- EGLClientBuffer clientBuffer,
- const egl::AttributeMap &attribs)
- : SurfaceImpl(state),
- mRenderer(renderer),
- mDisplay(display),
- mFixedSize(window == nullptr || attribs.get(EGL_FIXED_SIZE_ANGLE, EGL_FALSE) == EGL_TRUE),
- mOrientation(static_cast<EGLint>(attribs.get(EGL_SURFACE_ORIENTATION_ANGLE, 0))),
- mRenderTargetFormat(state.config->renderTargetFormat),
- mDepthStencilFormat(state.config->depthStencilFormat),
- mSwapChain(nullptr),
- mSwapIntervalDirty(true),
- mWindowSubclassed(false),
- mNativeWindow(renderer->createNativeWindow(window, state.config, attribs)),
- mWidth(static_cast<EGLint>(attribs.get(EGL_WIDTH, 0))),
- mHeight(static_cast<EGLint>(attribs.get(EGL_HEIGHT, 0))),
- mSwapInterval(1),
- mShareHandle(0),
- mD3DTexture(nullptr)
-{
- subclassWindow();
- if (window != nullptr && !mFixedSize)
- {
- mWidth = -1;
- mHeight = -1;
- }
-
- switch (buftype)
- {
- case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE:
- mShareHandle = static_cast<HANDLE>(clientBuffer);
- break;
-
- case EGL_D3D_TEXTURE_ANGLE:
- mD3DTexture = static_cast<IUnknown *>(clientBuffer);
- ASSERT(mD3DTexture != nullptr);
- mD3DTexture->AddRef();
- ANGLE_SWALLOW_ERR(mRenderer->getD3DTextureInfo(state.config, mD3DTexture, &mWidth,
- &mHeight, &mRenderTargetFormat));
- break;
-
- default:
- break;
- }
-}
-
-SurfaceD3D::~SurfaceD3D()
-{
- unsubclassWindow();
- releaseSwapChain();
- SafeDelete(mNativeWindow);
- SafeRelease(mD3DTexture);
-}
-
-void SurfaceD3D::releaseSwapChain()
-{
- SafeDelete(mSwapChain);
-}
-
-egl::Error SurfaceD3D::initialize(const egl::Display *display)
-{
- if (mNativeWindow->getNativeWindow())
- {
- if (!mNativeWindow->initialize())
- {
- return egl::EglBadSurface();
- }
- }
-
- ANGLE_TRY(resetSwapChain(display));
- return egl::NoError();
-}
-
-FramebufferImpl *SurfaceD3D::createDefaultFramebuffer(const gl::FramebufferState &data)
-{
- return mRenderer->createDefaultFramebuffer(data);
-}
-
-egl::Error SurfaceD3D::bindTexImage(gl::Texture *, EGLint)
-{
- return egl::NoError();
-}
-
-egl::Error SurfaceD3D::releaseTexImage(EGLint)
-{
- return egl::NoError();
-}
-
-egl::Error SurfaceD3D::getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc)
-{
- return mSwapChain->getSyncValues(ust, msc, sbc);
-}
-
-egl::Error SurfaceD3D::resetSwapChain(const egl::Display *display)
-{
- ASSERT(!mSwapChain);
-
- int width;
- int height;
-
- if (!mFixedSize)
- {
- RECT windowRect;
- if (!mNativeWindow->getClientRect(&windowRect))
- {
- ASSERT(false);
-
- return egl::EglBadSurface() << "Could not retrieve the window dimensions";
- }
-
- width = windowRect.right - windowRect.left;
- height = windowRect.bottom - windowRect.top;
- }
- else
- {
- // non-window surface - size is determined at creation
- width = mWidth;
- height = mHeight;
- }
-
- mSwapChain =
- mRenderer->createSwapChain(mNativeWindow, mShareHandle, mD3DTexture, mRenderTargetFormat,
- mDepthStencilFormat, mOrientation, mState.config->samples);
- if (!mSwapChain)
- {
- return egl::EglBadAlloc();
- }
-
- // This is a bit risky to pass the proxy context here, but it can happen at almost any time.
- egl::Error error = resetSwapChain(display->getProxyContext(), width, height);
- if (error.isError())
- {
- SafeDelete(mSwapChain);
- return error;
- }
-
- return egl::NoError();
-}
-
-egl::Error SurfaceD3D::resizeSwapChain(const gl::Context *context,
- int backbufferWidth,
- int backbufferHeight)
-{
- ASSERT(backbufferWidth >= 0 && backbufferHeight >= 0);
- ASSERT(mSwapChain);
-
- EGLint status =
- mSwapChain->resize(context, std::max(1, backbufferWidth), std::max(1, backbufferHeight));
-
- if (status == EGL_CONTEXT_LOST)
- {
- mDisplay->notifyDeviceLost();
- return egl::Error(status);
- }
- else if (status != EGL_SUCCESS)
- {
- return egl::Error(status);
- }
-
- mWidth = backbufferWidth;
- mHeight = backbufferHeight;
-
- return egl::NoError();
-}
-
-egl::Error SurfaceD3D::resetSwapChain(const gl::Context *context,
- int backbufferWidth,
- int backbufferHeight)
-{
- ASSERT(backbufferWidth >= 0 && backbufferHeight >= 0);
- ASSERT(mSwapChain);
-
- EGLint status = mSwapChain->reset(context, std::max(1, backbufferWidth),
- std::max(1, backbufferHeight), mSwapInterval);
-
- if (status == EGL_CONTEXT_LOST)
- {
- mRenderer->notifyDeviceLost();
- return egl::Error(status);
- }
- else if (status != EGL_SUCCESS)
- {
- return egl::Error(status);
- }
-
- mWidth = backbufferWidth;
- mHeight = backbufferHeight;
- mSwapIntervalDirty = false;
-
- return egl::NoError();
-}
-
-egl::Error SurfaceD3D::swapRect(const gl::Context *context,
- EGLint x,
- EGLint y,
- EGLint width,
- EGLint height)
-{
- if (!mSwapChain)
- {
- return egl::NoError();
- }
-
- if (x + width > mWidth)
- {
- width = mWidth - x;
- }
-
- if (y + height > mHeight)
- {
- height = mHeight - y;
- }
-
- if (width != 0 && height != 0)
- {
- EGLint status = mSwapChain->swapRect(context, x, y, width, height);
-
- if (status == EGL_CONTEXT_LOST)
- {
- mRenderer->notifyDeviceLost();
- return egl::Error(status);
- }
- else if (status != EGL_SUCCESS)
- {
- return egl::Error(status);
- }
- }
-
- ANGLE_TRY(checkForOutOfDateSwapChain(context));
-
- return egl::NoError();
-}
-
-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
-#define kSurfaceProperty _TEXT("Egl::SurfaceOwner")
-#define kParentWndProc _TEXT("Egl::SurfaceParentWndProc")
-#define kDisplayProperty _TEXT("Egl::Display")
-
-static LRESULT CALLBACK SurfaceWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
-{
- if (message == WM_SIZE)
- {
- SurfaceD3D* surf = reinterpret_cast<SurfaceD3D*>(GetProp(hwnd, kSurfaceProperty));
- if(surf)
- {
- egl::Display *display = reinterpret_cast<egl::Display *>(GetProp(hwnd, kDisplayProperty));
- surf->checkForOutOfDateSwapChain(display->getProxyContext());
- }
- }
- WNDPROC prevWndFunc = reinterpret_cast<WNDPROC >(GetProp(hwnd, kParentWndProc));
- return CallWindowProc(prevWndFunc, hwnd, message, wparam, lparam);
-}
-#endif
-
-void SurfaceD3D::subclassWindow()
-{
-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
- HWND window = mNativeWindow->getNativeWindow();
- if (!window)
- {
- return;
- }
-
- DWORD processId;
- DWORD threadId = GetWindowThreadProcessId(window, &processId);
- if (processId != GetCurrentProcessId() || threadId != GetCurrentThreadId())
- {
- return;
- }
-
- SetLastError(0);
- LONG_PTR oldWndProc = SetWindowLongPtr(window, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(SurfaceWindowProc));
- if(oldWndProc == 0 && GetLastError() != ERROR_SUCCESS)
- {
- mWindowSubclassed = false;
- return;
- }
-
- SetProp(window, kSurfaceProperty, reinterpret_cast<HANDLE>(this));
- SetProp(window, kParentWndProc, reinterpret_cast<HANDLE>(oldWndProc));
- SetProp(window, kDisplayProperty, reinterpret_cast<HANDLE>(mDisplay));
- mWindowSubclassed = true;
-#endif
-}
-
-void SurfaceD3D::unsubclassWindow()
-{
- if (!mWindowSubclassed)
- {
- return;
- }
-
-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
- HWND window = mNativeWindow->getNativeWindow();
- if (!window)
- {
- return;
- }
-
- // un-subclass
- LONG_PTR parentWndFunc = reinterpret_cast<LONG_PTR>(GetProp(window, kParentWndProc));
-
- // Check the windowproc is still SurfaceWindowProc.
- // If this assert fails, then it is likely the application has subclassed the
- // hwnd as well and did not unsubclass before destroying its EGL context. The
- // application should be modified to either subclass before initializing the
- // EGL context, or to unsubclass before destroying the EGL context.
- if(parentWndFunc)
- {
- LONG_PTR prevWndFunc = SetWindowLongPtr(window, GWLP_WNDPROC, parentWndFunc);
- ASSERT(prevWndFunc == reinterpret_cast<LONG_PTR>(SurfaceWindowProc));
- }
-
- RemoveProp(window, kSurfaceProperty);
- RemoveProp(window, kParentWndProc);
- RemoveProp(window, kDisplayProperty);
-#endif
- mWindowSubclassed = false;
-}
-
-
-egl::Error SurfaceD3D::checkForOutOfDateSwapChain(const gl::Context *context)
-{
- RECT client;
- int clientWidth = getWidth();
- int clientHeight = getHeight();
- bool sizeDirty = false;
- if (!mFixedSize && !mNativeWindow->isIconic())
- {
- // The window is automatically resized to 150x22 when it's minimized, but the swapchain shouldn't be resized
- // because that's not a useful size to render to.
- if (!mNativeWindow->getClientRect(&client))
- {
- UNREACHABLE();
- return egl::NoError();
- }
-
- // Grow the buffer now, if the window has grown. We need to grow now to avoid losing information.
- clientWidth = client.right - client.left;
- clientHeight = client.bottom - client.top;
- sizeDirty = clientWidth != getWidth() || clientHeight != getHeight();
- }
-
- if (mSwapIntervalDirty)
- {
- ANGLE_TRY(resetSwapChain(context, clientWidth, clientHeight));
- }
- else if (sizeDirty)
- {
- ANGLE_TRY(resizeSwapChain(context, clientWidth, clientHeight));
- }
-
- return egl::NoError();
-}
-
-egl::Error SurfaceD3D::swap(const gl::Context *context)
-{
- return swapRect(context, 0, 0, mWidth, mHeight);
-}
-
-egl::Error SurfaceD3D::postSubBuffer(const gl::Context *context,
- EGLint x,
- EGLint y,
- EGLint width,
- EGLint height)
-{
- return swapRect(context, x, y, width, height);
-}
-
-rx::SwapChainD3D *SurfaceD3D::getSwapChain() const
-{
- return mSwapChain;
-}
-
-void SurfaceD3D::setSwapInterval(EGLint interval)
-{
- if (mSwapInterval == interval)
- {
- return;
- }
-
- mSwapInterval = interval;
- mSwapIntervalDirty = true;
-}
-
-EGLint SurfaceD3D::getWidth() const
-{
- return mWidth;
-}
-
-EGLint SurfaceD3D::getHeight() const
-{
- return mHeight;
-}
-
-EGLint SurfaceD3D::isPostSubBufferSupported() const
-{
- // post sub buffer is always possible on D3D surfaces
- return EGL_TRUE;
-}
-
-EGLint SurfaceD3D::getSwapBehavior() const
-{
- return EGL_BUFFER_PRESERVED;
-}
-
-egl::Error SurfaceD3D::querySurfacePointerANGLE(EGLint attribute, void **value)
-{
- if (attribute == EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE)
- {
- *value = mSwapChain->getShareHandle();
- }
- else if (attribute == EGL_DXGI_KEYED_MUTEX_ANGLE)
- {
- *value = mSwapChain->getKeyedMutex();
- }
- else if (attribute == EGL_DEVICE_EXT)
- {
- *value = mSwapChain->getDevice();
- }
- else UNREACHABLE();
-
- return egl::NoError();
-}
-
-gl::Error SurfaceD3D::getAttachmentRenderTarget(const gl::Context *context,
- GLenum binding,
- const gl::ImageIndex &imageIndex,
- FramebufferAttachmentRenderTarget **rtOut)
-{
- if (binding == GL_BACK)
- {
- *rtOut = mSwapChain->getColorRenderTarget();
- }
- else
- {
- *rtOut = mSwapChain->getDepthStencilRenderTarget();
- }
- return gl::NoError();
-}
-
-WindowSurfaceD3D::WindowSurfaceD3D(const egl::SurfaceState &state,
- RendererD3D *renderer,
- egl::Display *display,
- EGLNativeWindowType window,
- const egl::AttributeMap &attribs)
- : SurfaceD3D(state,
- renderer,
- display,
- window,
- 0,
- static_cast<EGLClientBuffer>(0),
- attribs)
-{
-}
-
-WindowSurfaceD3D::~WindowSurfaceD3D()
-{
-}
-
-PbufferSurfaceD3D::PbufferSurfaceD3D(const egl::SurfaceState &state,
- RendererD3D *renderer,
- egl::Display *display,
- EGLenum buftype,
- EGLClientBuffer clientBuffer,
- const egl::AttributeMap &attribs)
- : SurfaceD3D(state,
- renderer,
- display,
- static_cast<EGLNativeWindowType>(0),
- buftype,
- clientBuffer,
- attribs)
-{
-}
-
-PbufferSurfaceD3D::~PbufferSurfaceD3D()
-{
-}
-
-} // namespace rc
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.h
deleted file mode 100644
index 01d2573244..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.h
+++ /dev/null
@@ -1,136 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// SurfaceD3D.h: D3D implementation of an EGL surface
-
-#ifndef LIBANGLE_RENDERER_D3D_SURFACED3D_H_
-#define LIBANGLE_RENDERER_D3D_SURFACED3D_H_
-
-#include "libANGLE/renderer/SurfaceImpl.h"
-#include "libANGLE/renderer/d3d/NativeWindowD3D.h"
-
-namespace egl
-{
-class Surface;
-}
-
-namespace rx
-{
-class SwapChainD3D;
-class RendererD3D;
-
-class SurfaceD3D : public SurfaceImpl
-{
- public:
- ~SurfaceD3D() override;
- void releaseSwapChain();
-
- egl::Error initialize(const egl::Display *display) override;
- FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override;
-
- egl::Error swap(const gl::Context *context) override;
- egl::Error postSubBuffer(const gl::Context *context,
- EGLint x,
- EGLint y,
- EGLint width,
- EGLint height) override;
- egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
- egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
- egl::Error releaseTexImage(EGLint buffer) override;
- egl::Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc) override;
- void setSwapInterval(EGLint interval) override;
-
- EGLint getWidth() const override;
- EGLint getHeight() const override;
-
- EGLint isPostSubBufferSupported() const override;
- EGLint getSwapBehavior() const override;
-
- // D3D implementations
- SwapChainD3D *getSwapChain() const;
-
- egl::Error resetSwapChain(const egl::Display *display);
-
- egl::Error checkForOutOfDateSwapChain(const gl::Context *context);
-
- gl::Error getAttachmentRenderTarget(const gl::Context *context,
- GLenum binding,
- const gl::ImageIndex &imageIndex,
- FramebufferAttachmentRenderTarget **rtOut) override;
-
- protected:
- SurfaceD3D(const egl::SurfaceState &state,
- RendererD3D *renderer,
- egl::Display *display,
- EGLNativeWindowType window,
- EGLenum buftype,
- EGLClientBuffer clientBuffer,
- const egl::AttributeMap &attribs);
-
- egl::Error swapRect(const gl::Context *context,
- EGLint x,
- EGLint y,
- EGLint width,
- EGLint height);
- egl::Error resetSwapChain(const gl::Context *context,
- int backbufferWidth,
- int backbufferHeight);
- egl::Error resizeSwapChain(const gl::Context *context,
- int backbufferWidth,
- int backbufferHeight);
-
- void subclassWindow();
- void unsubclassWindow();
-
- RendererD3D *mRenderer;
- egl::Display *mDisplay;
-
- bool mFixedSize;
- GLint mOrientation;
-
- GLenum mRenderTargetFormat;
- GLenum mDepthStencilFormat;
-
- SwapChainD3D *mSwapChain;
- bool mSwapIntervalDirty;
- bool mWindowSubclassed; // Indicates whether we successfully subclassed mWindow for WM_RESIZE hooking
-
- NativeWindowD3D *mNativeWindow; // Handler for the Window that the surface is created for.
- EGLint mWidth;
- EGLint mHeight;
-
- EGLint mSwapInterval;
-
- HANDLE mShareHandle;
- IUnknown *mD3DTexture;
-};
-
-class WindowSurfaceD3D : public SurfaceD3D
-{
- public:
- WindowSurfaceD3D(const egl::SurfaceState &state,
- RendererD3D *renderer,
- egl::Display *display,
- EGLNativeWindowType window,
- const egl::AttributeMap &attribs);
- ~WindowSurfaceD3D() override;
-};
-
-class PbufferSurfaceD3D : public SurfaceD3D
-{
- public:
- PbufferSurfaceD3D(const egl::SurfaceState &state,
- RendererD3D *renderer,
- egl::Display *display,
- EGLenum buftype,
- EGLClientBuffer clientBuffer,
- const egl::AttributeMap &attribs);
- ~PbufferSurfaceD3D() override;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_SURFACED3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.cpp
deleted file mode 100644
index de8534c3da..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// SwapChainD3D.cpp: Defines a back-end specific class that hides the details of the
-// implementation-specific swapchain.
-
-#include "libANGLE/renderer/d3d/SwapChainD3D.h"
-
-namespace rx
-{
-
-SwapChainD3D::SwapChainD3D(HANDLE shareHandle,
- IUnknown *d3dTexture,
- GLenum backBufferFormat,
- GLenum depthBufferFormat)
- : mOffscreenRenderTargetFormat(backBufferFormat),
- mDepthBufferFormat(depthBufferFormat),
- mShareHandle(shareHandle),
- mD3DTexture(d3dTexture)
-{
- if (mD3DTexture)
- {
- mD3DTexture->AddRef();
- }
-}
-
-SwapChainD3D::~SwapChainD3D()
-{
- SafeRelease(mD3DTexture);
-}
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.h
deleted file mode 100644
index 017737b878..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.h
+++ /dev/null
@@ -1,83 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// SwapChainD3D.h: Defines a back-end specific class that hides the details of the
-// implementation-specific swapchain.
-
-#ifndef LIBANGLE_RENDERER_D3D_SWAPCHAIND3D_H_
-#define LIBANGLE_RENDERER_D3D_SWAPCHAIND3D_H_
-
-#include <GLES2/gl2.h>
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-
-#include "common/angleutils.h"
-#include "common/platform.h"
-#include "libANGLE/Error.h"
-
-#if !defined(ANGLE_FORCE_VSYNC_OFF)
-#define ANGLE_FORCE_VSYNC_OFF 0
-#endif
-
-namespace gl
-{
-class Context;
-} // namespace gl
-
-namespace egl
-{
-class Display;
-} // namespace egl
-
-namespace rx
-{
-class RenderTargetD3D;
-
-class SwapChainD3D : angle::NonCopyable
-{
- public:
- SwapChainD3D(HANDLE shareHandle,
- IUnknown *d3dTexture,
- GLenum backBufferFormat,
- GLenum depthBufferFormat);
- virtual ~SwapChainD3D();
-
- virtual EGLint resize(const gl::Context *context,
- EGLint backbufferWidth,
- EGLint backbufferSize) = 0;
- virtual EGLint reset(const gl::Context *context,
- EGLint backbufferWidth,
- EGLint backbufferHeight,
- EGLint swapInterval) = 0;
- virtual EGLint swapRect(const gl::Context *context,
- EGLint x,
- EGLint y,
- EGLint width,
- EGLint height) = 0;
- virtual void recreate() = 0;
- virtual void *getDevice() { return nullptr; }
-
- virtual RenderTargetD3D *getColorRenderTarget() = 0;
- virtual RenderTargetD3D *getDepthStencilRenderTarget() = 0;
-
- GLenum getRenderTargetInternalFormat() const { return mOffscreenRenderTargetFormat; }
- GLenum getDepthBufferInternalFormat() const { return mDepthBufferFormat; }
-
- HANDLE getShareHandle() { return mShareHandle; }
- virtual void *getKeyedMutex() = 0;
-
- virtual egl::Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc) = 0;
-
- protected:
- const GLenum mOffscreenRenderTargetFormat;
- const GLenum mDepthBufferFormat;
-
- HANDLE mShareHandle;
- IUnknown *mD3DTexture;
-};
-
-} // namespace rx
-#endif // LIBANGLE_RENDERER_D3D_SWAPCHAIND3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureD3D.cpp
deleted file mode 100644
index bf44cbb5d2..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureD3D.cpp
+++ /dev/null
@@ -1,3974 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// TextureD3D.cpp: Implementations of the Texture interfaces shared betweeen the D3D backends.
-
-#include "libANGLE/renderer/d3d/TextureD3D.h"
-
-#include "common/mathutil.h"
-#include "common/utilities.h"
-#include "libANGLE/Buffer.h"
-#include "libANGLE/Config.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/Image.h"
-#include "libANGLE/Surface.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/BufferImpl.h"
-#include "libANGLE/renderer/d3d/BufferD3D.h"
-#include "libANGLE/renderer/d3d/EGLImageD3D.h"
-#include "libANGLE/renderer/d3d/ImageD3D.h"
-#include "libANGLE/renderer/d3d/RenderTargetD3D.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-#include "libANGLE/renderer/d3d/SurfaceD3D.h"
-#include "libANGLE/renderer/d3d/TextureStorage.h"
-
-namespace rx
-{
-
-namespace
-{
-
-gl::Error GetUnpackPointer(const gl::Context *context,
- const gl::PixelUnpackState &unpack,
- gl::Buffer *unpackBuffer,
- const uint8_t *pixels,
- ptrdiff_t layerOffset,
- const uint8_t **pointerOut)
-{
- if (unpackBuffer)
- {
- // Do a CPU readback here, if we have an unpack buffer bound and the fast GPU path is not supported
- ptrdiff_t offset = reinterpret_cast<ptrdiff_t>(pixels);
-
- // TODO: this is the only place outside of renderer that asks for a buffers raw data.
- // This functionality should be moved into renderer and the getData method of BufferImpl removed.
- BufferD3D *bufferD3D = GetImplAs<BufferD3D>(unpackBuffer);
- ASSERT(bufferD3D);
- const uint8_t *bufferData = nullptr;
- ANGLE_TRY(bufferD3D->getData(context, &bufferData));
- *pointerOut = bufferData + offset;
- }
- else
- {
- *pointerOut = pixels;
- }
-
- // Offset the pointer for 2D array layer (if it's valid)
- if (*pointerOut != nullptr)
- {
- *pointerOut += layerOffset;
- }
-
- return gl::NoError();
-}
-
-bool IsRenderTargetUsage(GLenum usage)
-{
- return (usage == GL_FRAMEBUFFER_ATTACHMENT_ANGLE);
-}
-
-}
-
-TextureD3D::TextureD3D(const gl::TextureState &state, RendererD3D *renderer)
- : TextureImpl(state),
- mRenderer(renderer),
- mDirtyImages(true),
- mImmutable(false),
- mTexStorage(nullptr),
- mBaseLevel(0)
-{
-}
-
-TextureD3D::~TextureD3D()
-{
- ASSERT(!mTexStorage);
-}
-
-gl::Error TextureD3D::getNativeTexture(const gl::Context *context, TextureStorage **outStorage)
-{
- // ensure the underlying texture is created
- ANGLE_TRY(initializeStorage(context, false));
-
- if (mTexStorage)
- {
- ANGLE_TRY(updateStorage(context));
- }
-
- ASSERT(outStorage);
-
- *outStorage = mTexStorage;
- return gl::NoError();
-}
-
-gl::Error TextureD3D::getImageAndSyncFromStorage(const gl::Context *context,
- const gl::ImageIndex &index,
- ImageD3D **outImage)
-{
- ImageD3D *image = getImage(index);
- if (mTexStorage && mTexStorage->isRenderTarget())
- {
- ANGLE_TRY(image->copyFromTexStorage(context, index, mTexStorage));
- mDirtyImages = true;
- }
- *outImage = image;
- return gl::NoError();
-}
-
-GLint TextureD3D::getLevelZeroWidth() const
-{
- ASSERT(gl::CountLeadingZeros(static_cast<uint32_t>(getBaseLevelWidth())) > getBaseLevel());
- return getBaseLevelWidth() << mBaseLevel;
-}
-
-GLint TextureD3D::getLevelZeroHeight() const
-{
- ASSERT(gl::CountLeadingZeros(static_cast<uint32_t>(getBaseLevelHeight())) > getBaseLevel());
- return getBaseLevelHeight() << mBaseLevel;
-}
-
-GLint TextureD3D::getLevelZeroDepth() const
-{
- return getBaseLevelDepth();
-}
-
-GLint TextureD3D::getBaseLevelWidth() const
-{
- const ImageD3D *baseImage = getBaseLevelImage();
- return (baseImage ? baseImage->getWidth() : 0);
-}
-
-GLint TextureD3D::getBaseLevelHeight() const
-{
- const ImageD3D *baseImage = getBaseLevelImage();
- return (baseImage ? baseImage->getHeight() : 0);
-}
-
-GLint TextureD3D::getBaseLevelDepth() const
-{
- const ImageD3D *baseImage = getBaseLevelImage();
- return (baseImage ? baseImage->getDepth() : 0);
-}
-
-// Note: "base level image" is loosely defined to be any image from the base level,
-// where in the base of 2D array textures and cube maps there are several. Don't use
-// the base level image for anything except querying texture format and size.
-GLenum TextureD3D::getBaseLevelInternalFormat() const
-{
- const ImageD3D *baseImage = getBaseLevelImage();
- return (baseImage ? baseImage->getInternalFormat() : GL_NONE);
-}
-
-gl::Error TextureD3D::setStorage(const gl::Context *context,
- GLenum target,
- size_t levels,
- GLenum internalFormat,
- const gl::Extents &size)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D::setStorageMultisample(const gl::Context *context,
- GLenum target,
- GLsizei samples,
- GLint internalFormat,
- const gl::Extents &size,
- bool fixedSampleLocations)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-bool TextureD3D::shouldUseSetData(const ImageD3D *image) const
-{
- if (!mRenderer->getWorkarounds().setDataFasterThanImageUpload)
- {
- return false;
- }
-
- if (image->isDirty())
- {
- return false;
- }
-
- gl::InternalFormat internalFormat = gl::GetSizedInternalFormatInfo(image->getInternalFormat());
-
- // We can only handle full updates for depth-stencil textures, so to avoid complications
- // disable them entirely.
- if (internalFormat.depthBits > 0 || internalFormat.stencilBits > 0)
- {
- return false;
- }
-
- // TODO(jmadill): Handle compressed internal formats
- return (mTexStorage && !internalFormat.compressed);
-}
-
-gl::Error TextureD3D::setImageImpl(const gl::Context *context,
- const gl::ImageIndex &index,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels,
- ptrdiff_t layerOffset)
-{
- ImageD3D *image = getImage(index);
- gl::Buffer *unpackBuffer =
- context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack);
- ASSERT(image);
-
- // No-op
- if (image->getWidth() == 0 || image->getHeight() == 0 || image->getDepth() == 0)
- {
- return gl::NoError();
- }
-
- // We no longer need the "GLenum format" parameter to TexImage to determine what data format "pixels" contains.
- // From our image internal format we know how many channels to expect, and "type" gives the format of pixel's components.
- const uint8_t *pixelData = nullptr;
- ANGLE_TRY(GetUnpackPointer(context, unpack, unpackBuffer, pixels, layerOffset, &pixelData));
-
- if (pixelData != nullptr)
- {
- if (shouldUseSetData(image))
- {
- ANGLE_TRY(
- mTexStorage->setData(context, index, image, nullptr, type, unpack, pixelData));
- }
- else
- {
- gl::Box fullImageArea(0, 0, 0, image->getWidth(), image->getHeight(), image->getDepth());
- ANGLE_TRY(
- image->loadData(context, fullImageArea, unpack, type, pixelData, index.is3D()));
- }
-
- mDirtyImages = true;
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D::subImage(const gl::Context *context,
- const gl::ImageIndex &index,
- const gl::Box &area,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels,
- ptrdiff_t layerOffset)
-{
- // CPU readback & copy where direct GPU copy is not supported
- const uint8_t *pixelData = nullptr;
- gl::Buffer *unpackBuffer =
- context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack);
- ANGLE_TRY(GetUnpackPointer(context, unpack, unpackBuffer, pixels, layerOffset, &pixelData));
-
- if (pixelData != nullptr)
- {
- ImageD3D *image = getImage(index);
- ASSERT(image);
-
- if (shouldUseSetData(image))
- {
- return mTexStorage->setData(context, index, image, &area, type, unpack, pixelData);
- }
-
- ANGLE_TRY(image->loadData(context, area, unpack, type, pixelData, index.is3D()));
- ANGLE_TRY(commitRegion(context, index, area));
- mDirtyImages = true;
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D::setCompressedImageImpl(const gl::Context *context,
- const gl::ImageIndex &index,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels,
- ptrdiff_t layerOffset)
-{
- ImageD3D *image = getImage(index);
- ASSERT(image);
-
- if (image->getWidth() == 0 || image->getHeight() == 0 || image->getDepth() == 0)
- {
- return gl::NoError();
- }
-
- // We no longer need the "GLenum format" parameter to TexImage to determine what data format "pixels" contains.
- // From our image internal format we know how many channels to expect, and "type" gives the format of pixel's components.
- const uint8_t *pixelData = nullptr;
- gl::Buffer *unpackBuffer =
- context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack);
- ANGLE_TRY(GetUnpackPointer(context, unpack, unpackBuffer, pixels, layerOffset, &pixelData));
-
- if (pixelData != nullptr)
- {
- gl::Box fullImageArea(0, 0, 0, image->getWidth(), image->getHeight(), image->getDepth());
- ANGLE_TRY(image->loadCompressedData(context, fullImageArea, pixelData));
-
- mDirtyImages = true;
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D::subImageCompressed(const gl::Context *context,
- const gl::ImageIndex &index,
- const gl::Box &area,
- GLenum format,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels,
- ptrdiff_t layerOffset)
-{
- const uint8_t *pixelData = nullptr;
- gl::Buffer *unpackBuffer =
- context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack);
- ANGLE_TRY(GetUnpackPointer(context, unpack, unpackBuffer, pixels, layerOffset, &pixelData));
-
- if (pixelData != nullptr)
- {
- ImageD3D *image = getImage(index);
- ASSERT(image);
-
- ANGLE_TRY(image->loadCompressedData(context, area, pixelData));
-
- mDirtyImages = true;
- }
-
- return gl::NoError();
-}
-
-bool TextureD3D::isFastUnpackable(const gl::Buffer *unpackBuffer, GLenum sizedInternalFormat)
-{
- return unpackBuffer != nullptr &&
- mRenderer->supportsFastCopyBufferToTexture(sizedInternalFormat);
-}
-
-gl::Error TextureD3D::fastUnpackPixels(const gl::Context *context,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels,
- const gl::Box &destArea,
- GLenum sizedInternalFormat,
- GLenum type,
- RenderTargetD3D *destRenderTarget)
-{
- if (unpack.skipRows != 0 || unpack.skipPixels != 0 || unpack.imageHeight != 0 ||
- unpack.skipImages != 0)
- {
- // TODO(jmadill): additional unpack parameters
- UNIMPLEMENTED();
- return gl::InternalError() << "Unimplemented pixel store parameters in fastUnpackPixels";
- }
-
- // No-op
- if (destArea.width <= 0 && destArea.height <= 0 && destArea.depth <= 0)
- {
- return gl::NoError();
- }
-
- // In order to perform the fast copy through the shader, we must have the right format, and be able
- // to create a render target.
- ASSERT(mRenderer->supportsFastCopyBufferToTexture(sizedInternalFormat));
-
- uintptr_t offset = reinterpret_cast<uintptr_t>(pixels);
-
- ANGLE_TRY(mRenderer->fastCopyBufferToTexture(context, unpack, static_cast<unsigned int>(offset),
- destRenderTarget, sizedInternalFormat, type,
- destArea));
-
- return gl::NoError();
-}
-
-GLint TextureD3D::creationLevels(GLsizei width, GLsizei height, GLsizei depth) const
-{
- if ((gl::isPow2(width) && gl::isPow2(height) && gl::isPow2(depth)) ||
- mRenderer->getNativeExtensions().textureNPOT)
- {
- // Maximum number of levels
- return gl::log2(std::max(std::max(width, height), depth)) + 1;
- }
- else
- {
- // OpenGL ES 2.0 without GL_OES_texture_npot does not permit NPOT mipmaps.
- return 1;
- }
-}
-
-TextureStorage *TextureD3D::getStorage()
-{
- ASSERT(mTexStorage);
- return mTexStorage;
-}
-
-ImageD3D *TextureD3D::getBaseLevelImage() const
-{
- if (mBaseLevel >= gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
- {
- return nullptr;
- }
- return getImage(getImageIndex(mBaseLevel, 0));
-}
-
-gl::Error TextureD3D::setImageExternal(const gl::Context *context,
- GLenum target,
- egl::Stream *stream,
- const egl::Stream::GLTextureDescription &desc)
-{
- // Only external images can accept external textures
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D::generateMipmap(const gl::Context *context)
-{
- const GLuint baseLevel = mState.getEffectiveBaseLevel();
- const GLuint maxLevel = mState.getMipmapMaxLevel();
- ASSERT(maxLevel > baseLevel); // Should be checked before calling this.
-
- if (mTexStorage && mRenderer->getWorkarounds().zeroMaxLodWorkaround)
- {
- // Switch to using the mipmapped texture.
- TextureStorage *textureStorage = nullptr;
- ANGLE_TRY(getNativeTexture(context, &textureStorage));
- ANGLE_TRY(textureStorage->useLevelZeroWorkaroundTexture(context, false));
- }
-
- // Set up proper mipmap chain in our Image array.
- ANGLE_TRY(initMipmapImages(context));
-
- if (mTexStorage && mTexStorage->supportsNativeMipmapFunction())
- {
- ANGLE_TRY(updateStorage(context));
-
- // Generate the mipmap chain using the ad-hoc DirectX function.
- ANGLE_TRY(mRenderer->generateMipmapUsingD3D(context, mTexStorage, mState));
- }
- else
- {
- // Generate the mipmap chain, one level at a time.
- ANGLE_TRY(generateMipmapUsingImages(context, maxLevel));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D::generateMipmapUsingImages(const gl::Context *context, const GLuint maxLevel)
-{
- // We know that all layers have the same dimension, for the texture to be complete
- GLint layerCount = static_cast<GLint>(getLayerCount(mBaseLevel));
-
- // When making mipmaps with the setData workaround enabled, the texture storage has
- // the image data already. For non-render-target storage, we have to pull it out into
- // an image layer.
- if (mRenderer->getWorkarounds().setDataFasterThanImageUpload && mTexStorage)
- {
- if (!mTexStorage->isRenderTarget())
- {
- // Copy from the storage mip 0 to Image mip 0
- for (GLint layer = 0; layer < layerCount; ++layer)
- {
- gl::ImageIndex srcIndex = getImageIndex(mBaseLevel, layer);
-
- ImageD3D *image = getImage(srcIndex);
- ANGLE_TRY(image->copyFromTexStorage(context, srcIndex, mTexStorage));
- }
- }
- else
- {
- ANGLE_TRY(updateStorage(context));
- }
- }
-
- // TODO: Decouple this from zeroMaxLodWorkaround. This is a 9_3 restriction, unrelated to zeroMaxLodWorkaround.
- // The restriction is because Feature Level 9_3 can't create SRVs on individual levels of the texture.
- // As a result, even if the storage is a rendertarget, we can't use the GPU to generate the mipmaps without further work.
- // The D3D9 renderer works around this by copying each level of the texture into its own single-layer GPU texture (in Blit9::boxFilter).
- // Feature Level 9_3 could do something similar, or it could continue to use CPU-side mipmap generation, or something else.
- bool renderableStorage = (mTexStorage && mTexStorage->isRenderTarget() && !(mRenderer->getWorkarounds().zeroMaxLodWorkaround));
-
- for (GLint layer = 0; layer < layerCount; ++layer)
- {
- for (GLuint mip = mBaseLevel + 1; mip <= maxLevel; ++mip)
- {
- ASSERT(getLayerCount(mip) == layerCount);
-
- gl::ImageIndex sourceIndex = getImageIndex(mip - 1, layer);
- gl::ImageIndex destIndex = getImageIndex(mip, layer);
-
- if (renderableStorage)
- {
- // GPU-side mipmapping
- ANGLE_TRY(mTexStorage->generateMipmap(context, sourceIndex, destIndex));
- }
- else
- {
- // CPU-side mipmapping
- ANGLE_TRY(
- mRenderer->generateMipmap(context, getImage(destIndex), getImage(sourceIndex)));
- }
- }
- }
-
- mDirtyImages = true;
-
- if (mTexStorage)
- {
- ANGLE_TRY(updateStorage(context));
- }
-
- return gl::NoError();
-}
-
-bool TextureD3D::isBaseImageZeroSize() const
-{
- ImageD3D *baseImage = getBaseLevelImage();
-
- if (!baseImage || baseImage->getWidth() <= 0)
- {
- return true;
- }
-
- if (!gl::IsCubeMapTextureTarget(baseImage->getTarget()) && baseImage->getHeight() <= 0)
- {
- return true;
- }
-
- if (baseImage->getTarget() == GL_TEXTURE_3D && baseImage->getDepth() <= 0)
- {
- return true;
- }
-
- if (baseImage->getTarget() == GL_TEXTURE_2D_ARRAY && getLayerCount(getBaseLevel()) <= 0)
- {
- return true;
- }
-
- return false;
-}
-
-gl::Error TextureD3D::ensureRenderTarget(const gl::Context *context)
-{
- ANGLE_TRY(initializeStorage(context, true));
-
- // initializeStorage can fail with NoError if the texture is not complete. This is not
- // an error for incomplete sampling, but it is a big problem for rendering.
- if (!mTexStorage)
- {
- UNREACHABLE();
- return gl::InternalError() << "Cannot render to incomplete texture.";
- }
-
- if (!isBaseImageZeroSize())
- {
- ASSERT(mTexStorage);
- if (!mTexStorage->isRenderTarget())
- {
- TexStoragePointer newRenderTargetStorage(context);
- ANGLE_TRY(createCompleteStorage(true, &newRenderTargetStorage));
-
- ANGLE_TRY(mTexStorage->copyToStorage(context, newRenderTargetStorage.get()));
- ANGLE_TRY(setCompleteTexStorage(context, newRenderTargetStorage.get()));
- newRenderTargetStorage.release();
- }
- }
-
- return gl::NoError();
-}
-
-bool TextureD3D::canCreateRenderTargetForImage(const gl::ImageIndex &index) const
-{
- if (index.type == GL_TEXTURE_2D_MULTISAMPLE)
- return true;
-
- ImageD3D *image = getImage(index);
- ASSERT(image);
- bool levelsComplete = (isImageComplete(index) && isImageComplete(getImageIndex(0, 0)));
- return (image->isRenderableFormat() && levelsComplete);
-}
-
-gl::Error TextureD3D::commitRegion(const gl::Context *context,
- const gl::ImageIndex &index,
- const gl::Box &region)
-{
- if (mTexStorage)
- {
- ASSERT(isValidIndex(index));
- ImageD3D *image = getImage(index);
- ANGLE_TRY(image->copyToStorage(context, mTexStorage, index, region));
- image->markClean();
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D::getAttachmentRenderTarget(const gl::Context *context,
- GLenum /*binding*/,
- const gl::ImageIndex &imageIndex,
- FramebufferAttachmentRenderTarget **rtOut)
-{
- RenderTargetD3D *rtD3D = nullptr;
- gl::Error error = getRenderTarget(context, imageIndex, &rtD3D);
- *rtOut = static_cast<FramebufferAttachmentRenderTarget *>(rtD3D);
- return error;
-}
-
-gl::Error TextureD3D::setBaseLevel(const gl::Context *context, GLuint baseLevel)
-{
- const int oldStorageWidth = std::max(1, getLevelZeroWidth());
- const int oldStorageHeight = std::max(1, getLevelZeroHeight());
- const int oldStorageDepth = std::max(1, getLevelZeroDepth());
- const int oldStorageFormat = getBaseLevelInternalFormat();
- mBaseLevel = baseLevel;
-
- // When the base level changes, the texture storage might not be valid anymore, since it could
- // have been created based on the dimensions of the previous specified level range.
- const int newStorageWidth = std::max(1, getLevelZeroWidth());
- const int newStorageHeight = std::max(1, getLevelZeroHeight());
- const int newStorageDepth = std::max(1, getLevelZeroDepth());
- const int newStorageFormat = getBaseLevelInternalFormat();
- if (mTexStorage &&
- (newStorageWidth != oldStorageWidth || newStorageHeight != oldStorageHeight ||
- newStorageDepth != oldStorageDepth || newStorageFormat != oldStorageFormat))
- {
- markAllImagesDirty();
- ANGLE_TRY(releaseTexStorage(context));
- }
-
- return gl::NoError();
-}
-
-void TextureD3D::syncState(const gl::Texture::DirtyBits &dirtyBits)
-{
- // TODO(geofflang): Use dirty bits
-}
-
-gl::Error TextureD3D::releaseTexStorage(const gl::Context *context)
-{
- if (!mTexStorage)
- {
- return gl::NoError();
- }
- auto err = mTexStorage->onDestroy(context);
- SafeDelete(mTexStorage);
- return err;
-}
-
-gl::Error TextureD3D::onDestroy(const gl::Context *context)
-{
- return releaseTexStorage(context);
-}
-
-gl::Error TextureD3D::initializeContents(const gl::Context *context,
- const gl::ImageIndex &imageIndexIn)
-{
- gl::ImageIndex imageIndex = imageIndexIn;
-
- // Special case for D3D11 3D textures. We can't create render targets for individual layers of a
- // 3D texture, so force the clear to the entire mip. There shouldn't ever be a case where we
- // would lose existing data.
- if (imageIndex.type == GL_TEXTURE_3D)
- {
- imageIndex.layerIndex = gl::ImageIndex::ENTIRE_LEVEL;
- }
- else if (imageIndex.type == GL_TEXTURE_2D_ARRAY &&
- imageIndex.layerIndex == gl::ImageIndex::ENTIRE_LEVEL)
- {
- GLsizei layerCount = getLayerCount(imageIndex.mipIndex);
- for (imageIndex.layerIndex = 0; imageIndex.layerIndex < layerCount; ++imageIndex.layerIndex)
- {
- ANGLE_TRY(initializeContents(context, imageIndex));
- }
- return gl::NoError();
- }
-
- // Force image clean.
- ImageD3D *image = getImage(imageIndex);
- if (image)
- {
- image->markClean();
- }
-
- // Fast path: can use a render target clear.
- if (canCreateRenderTargetForImage(imageIndex))
- {
- ANGLE_TRY(ensureRenderTarget(context));
- ASSERT(mTexStorage);
- RenderTargetD3D *renderTarget = nullptr;
- ANGLE_TRY(mTexStorage->getRenderTarget(context, imageIndex, &renderTarget));
- ANGLE_TRY(mRenderer->initRenderTarget(renderTarget));
- return gl::NoError();
- }
-
- // Slow path: non-renderable texture or the texture levels aren't set up.
- const auto &formatInfo = gl::GetSizedInternalFormatInfo(image->getInternalFormat());
-
- size_t imageBytes = 0;
- ANGLE_TRY_RESULT(formatInfo.computeRowPitch(formatInfo.type, image->getWidth(), 1, 0),
- imageBytes);
- imageBytes *= image->getHeight() * image->getDepth();
-
- gl::PixelUnpackState defaultUnpackState;
-
- angle::MemoryBuffer *zeroBuffer = nullptr;
- ANGLE_TRY(context->getZeroFilledBuffer(imageBytes, &zeroBuffer));
- if (shouldUseSetData(image))
- {
- ANGLE_TRY(mTexStorage->setData(context, imageIndex, image, nullptr, formatInfo.type,
- defaultUnpackState, zeroBuffer->data()));
- }
- else
- {
- gl::Box fullImageArea(0, 0, 0, image->getWidth(), image->getHeight(), image->getDepth());
- ANGLE_TRY(image->loadData(context, fullImageArea, defaultUnpackState, formatInfo.type,
- zeroBuffer->data(), false));
-
- // Force an update to the tex storage so we avoid problems with subImage and dirty regions.
- if (mTexStorage)
- {
- ANGLE_TRY(commitRegion(context, imageIndex, fullImageArea));
- image->markClean();
- }
- else
- {
- mDirtyImages = true;
- }
- }
- return gl::NoError();
-}
-
-TextureD3D_2D::TextureD3D_2D(const gl::TextureState &state, RendererD3D *renderer)
- : TextureD3D(state, renderer)
-{
- mEGLImageTarget = false;
- for (auto &image : mImageArray)
- {
- image.reset(renderer->createImage());
- }
-}
-
-gl::Error TextureD3D_2D::onDestroy(const gl::Context *context)
-{
- // Delete the Images before the TextureStorage. Images might be relying on the TextureStorage
- // for some of their data. If TextureStorage is deleted before the Images, then their data will
- // be wastefully copied back from the GPU before we delete the Images.
- for (auto &image : mImageArray)
- {
- image.reset();
- }
- return TextureD3D::onDestroy(context);
-}
-
-TextureD3D_2D::~TextureD3D_2D()
-{
-}
-
-ImageD3D *TextureD3D_2D::getImage(int level, int layer) const
-{
- ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- ASSERT(layer == 0);
- return mImageArray[level].get();
-}
-
-ImageD3D *TextureD3D_2D::getImage(const gl::ImageIndex &index) const
-{
- ASSERT(index.mipIndex < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- ASSERT(!index.hasLayer());
- ASSERT(index.type == GL_TEXTURE_2D);
- return mImageArray[index.mipIndex].get();
-}
-
-GLsizei TextureD3D_2D::getLayerCount(int level) const
-{
- ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- return 1;
-}
-
-GLsizei TextureD3D_2D::getWidth(GLint level) const
-{
- if (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
- return mImageArray[level]->getWidth();
- else
- return 0;
-}
-
-GLsizei TextureD3D_2D::getHeight(GLint level) const
-{
- if (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
- return mImageArray[level]->getHeight();
- else
- return 0;
-}
-
-GLenum TextureD3D_2D::getInternalFormat(GLint level) const
-{
- if (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
- return mImageArray[level]->getInternalFormat();
- else
- return GL_NONE;
-}
-
-bool TextureD3D_2D::isDepth(GLint level) const
-{
- return gl::GetSizedInternalFormatInfo(getInternalFormat(level)).depthBits > 0;
-}
-
-bool TextureD3D_2D::isSRGB(GLint level) const
-{
- return gl::GetSizedInternalFormatInfo(getInternalFormat(level)).colorEncoding == GL_SRGB;
-}
-
-gl::Error TextureD3D_2D::setImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- GLenum internalFormat,
- const gl::Extents &size,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels)
-{
- ASSERT(target == GL_TEXTURE_2D && size.depth == 1);
-
- const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat, type);
-
- bool fastUnpacked = false;
- GLint level = static_cast<GLint>(imageLevel);
-
- ANGLE_TRY(redefineImage(context, level, internalFormatInfo.sizedInternalFormat, size, false));
-
- gl::ImageIndex index = gl::ImageIndex::Make2D(level);
-
- // Attempt a fast gpu copy of the pixel data to the surface
- gl::Buffer *unpackBuffer =
- context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack);
- if (isFastUnpackable(unpackBuffer, internalFormatInfo.sizedInternalFormat) &&
- isLevelComplete(level))
- {
- // Will try to create RT storage if it does not exist
- RenderTargetD3D *destRenderTarget = nullptr;
- ANGLE_TRY(getRenderTarget(context, index, &destRenderTarget));
-
- gl::Box destArea(0, 0, 0, getWidth(level), getHeight(level), 1);
-
- ANGLE_TRY(fastUnpackPixels(context, unpack, pixels, destArea,
- internalFormatInfo.sizedInternalFormat, type, destRenderTarget));
-
- // Ensure we don't overwrite our newly initialized data
- mImageArray[level]->markClean();
-
- fastUnpacked = true;
- }
-
- if (!fastUnpacked)
- {
- ANGLE_TRY(setImageImpl(context, index, type, unpack, pixels, 0));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2D::setSubImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- const gl::Box &area,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels)
-{
- ASSERT(target == GL_TEXTURE_2D && area.depth == 1 && area.z == 0);
-
- GLint level = static_cast<GLint>(imageLevel);
- gl::ImageIndex index = gl::ImageIndex::Make2D(level);
-
- gl::Buffer *unpackBuffer =
- context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack);
- if (isFastUnpackable(unpackBuffer, getInternalFormat(level)) && isLevelComplete(level))
- {
- RenderTargetD3D *renderTarget = nullptr;
- ANGLE_TRY(getRenderTarget(context, index, &renderTarget));
- ASSERT(!mImageArray[level]->isDirty());
-
- return fastUnpackPixels(context, unpack, pixels, area, getInternalFormat(level), type,
- renderTarget);
- }
- else
- {
- return TextureD3D::subImage(context, index, area, format, type, unpack, pixels, 0);
- }
-}
-
-gl::Error TextureD3D_2D::setCompressedImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- GLenum internalFormat,
- const gl::Extents &size,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels)
-{
- ASSERT(target == GL_TEXTURE_2D && size.depth == 1);
- GLint level = static_cast<GLint>(imageLevel);
-
- // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly
- ANGLE_TRY(redefineImage(context, level, internalFormat, size, false));
-
- return setCompressedImageImpl(context, gl::ImageIndex::Make2D(level), unpack, pixels, 0);
-}
-
-gl::Error TextureD3D_2D::setCompressedSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels)
-{
- ASSERT(target == GL_TEXTURE_2D && area.depth == 1 && area.z == 0);
-
- gl::ImageIndex index = gl::ImageIndex::Make2D(static_cast<GLint>(level));
- ANGLE_TRY(TextureD3D::subImageCompressed(context, index, area, format, unpack, pixels, 0));
-
- return commitRegion(context, index, area);
-}
-
-gl::Error TextureD3D_2D::copyImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- const gl::Rectangle &origSourceArea,
- GLenum internalFormat,
- const gl::Framebuffer *source)
-{
- ASSERT(target == GL_TEXTURE_2D);
-
- GLint level = static_cast<GLint>(imageLevel);
- const gl::InternalFormat &internalFormatInfo =
- gl::GetInternalFormatInfo(internalFormat, GL_UNSIGNED_BYTE);
- gl::Extents sourceExtents(origSourceArea.width, origSourceArea.height, 1);
- ANGLE_TRY(redefineImage(context, level, internalFormatInfo.sizedInternalFormat, sourceExtents,
- false));
-
- gl::Extents fbSize = source->getReadColorbuffer()->getSize();
-
- // Does the read area extend beyond the framebuffer?
- bool outside = origSourceArea.x < 0 || origSourceArea.y < 0 ||
- origSourceArea.x + origSourceArea.width > fbSize.width ||
- origSourceArea.y + origSourceArea.height > fbSize.height;
-
- // In WebGL mode we need to zero the texture outside the framebuffer.
- // If we have robust resource init, it was already zeroed by redefineImage() above, otherwise
- // zero it explicitly.
- // TODO(fjhenigman): When robust resource is fully implemented look into making it a
- // prerequisite for WebGL and deleting this code.
- if (outside &&
- (context->getExtensions().webglCompatibility || context->isRobustResourceInitEnabled()))
- {
- angle::MemoryBuffer *zero;
- ANGLE_TRY(context->getZeroFilledBuffer(
- origSourceArea.width * origSourceArea.height * internalFormatInfo.pixelBytes, &zero));
- gl::PixelUnpackState unpack;
- unpack.alignment = 1;
- ANGLE_TRY(setImage(context, target, imageLevel, internalFormat, sourceExtents,
- internalFormatInfo.format, internalFormatInfo.type, unpack,
- zero->data()));
- }
-
- gl::Rectangle sourceArea;
- if (!ClipRectangle(origSourceArea, gl::Rectangle(0, 0, fbSize.width, fbSize.height),
- &sourceArea))
- {
- // Empty source area, nothing to do.
- return gl::NoError();
- }
-
- gl::ImageIndex index = gl::ImageIndex::Make2D(level);
- gl::Offset destOffset(sourceArea.x - origSourceArea.x, sourceArea.y - origSourceArea.y, 0);
-
- // If the zero max LOD workaround is active, then we can't sample from individual layers of the framebuffer in shaders,
- // so we should use the non-rendering copy path.
- if (!canCreateRenderTargetForImage(index) || mRenderer->getWorkarounds().zeroMaxLodWorkaround)
- {
- ANGLE_TRY(mImageArray[level]->copyFromFramebuffer(context, destOffset, sourceArea, source));
- mDirtyImages = true;
- }
- else
- {
- ANGLE_TRY(ensureRenderTarget(context));
-
- if (sourceArea.width != 0 && sourceArea.height != 0 && isValidLevel(level))
- {
- ANGLE_TRY(updateStorageLevel(context, level));
- ANGLE_TRY(mRenderer->copyImage2D(context, source, sourceArea, internalFormat,
- destOffset, mTexStorage, level));
- }
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2D::copySubImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- const gl::Offset &origDestOffset,
- const gl::Rectangle &origSourceArea,
- const gl::Framebuffer *source)
-{
- ASSERT(target == GL_TEXTURE_2D && origDestOffset.z == 0);
-
- gl::Extents fbSize = source->getReadColorbuffer()->getSize();
- gl::Rectangle sourceArea;
- if (!ClipRectangle(origSourceArea, gl::Rectangle(0, 0, fbSize.width, fbSize.height),
- &sourceArea))
- {
- return gl::NoError();
- }
- const gl::Offset destOffset(origDestOffset.x + sourceArea.x - origSourceArea.x,
- origDestOffset.y + sourceArea.y - origSourceArea.y, 0);
-
- // can only make our texture storage to a render target if level 0 is defined (with a width & height) and
- // the current level we're copying to is defined (with appropriate format, width & height)
-
- GLint level = static_cast<GLint>(imageLevel);
- gl::ImageIndex index = gl::ImageIndex::Make2D(level);
-
- // If the zero max LOD workaround is active, then we can't sample from individual layers of the framebuffer in shaders,
- // so we should use the non-rendering copy path.
- if (!canCreateRenderTargetForImage(index) || mRenderer->getWorkarounds().zeroMaxLodWorkaround)
- {
- ANGLE_TRY(mImageArray[level]->copyFromFramebuffer(context, destOffset, sourceArea, source));
- mDirtyImages = true;
- }
- else
- {
- ANGLE_TRY(ensureRenderTarget(context));
-
- if (isValidLevel(level))
- {
- ANGLE_TRY(updateStorageLevel(context, level));
- ANGLE_TRY(mRenderer->copyImage2D(context, source, sourceArea,
- gl::GetUnsizedFormat(getBaseLevelInternalFormat()),
- destOffset, mTexStorage, level));
- }
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2D::copyTexture(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- GLenum type,
- size_t sourceLevel,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- const gl::Texture *source)
-{
- ASSERT(target == GL_TEXTURE_2D);
-
- GLenum sourceTarget = source->getTarget();
-
- GLint destLevel = static_cast<GLint>(level);
-
- const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat, type);
- gl::Extents size(static_cast<int>(source->getWidth(sourceTarget, sourceLevel)),
- static_cast<int>(source->getHeight(sourceTarget, sourceLevel)), 1);
- ANGLE_TRY(
- redefineImage(context, destLevel, internalFormatInfo.sizedInternalFormat, size, false));
-
- gl::Rectangle sourceRect(0, 0, size.width, size.height);
- gl::Offset destOffset(0, 0, 0);
-
- if (!isSRGB(destLevel) && canCreateRenderTargetForImage(gl::ImageIndex::Make2D(destLevel)))
- {
- ANGLE_TRY(ensureRenderTarget(context));
- ASSERT(isValidLevel(destLevel));
- ANGLE_TRY(updateStorageLevel(context, destLevel));
-
- ANGLE_TRY(mRenderer->copyTexture(context, source, static_cast<GLint>(sourceLevel),
- sourceRect, internalFormatInfo.format, destOffset,
- mTexStorage, target, destLevel, unpackFlipY,
- unpackPremultiplyAlpha, unpackUnmultiplyAlpha));
- }
- else
- {
- gl::ImageIndex sourceImageIndex = gl::ImageIndex::Make2D(static_cast<GLint>(sourceLevel));
- TextureD3D *sourceD3D = GetImplAs<TextureD3D>(source);
- ImageD3D *sourceImage = nullptr;
- ANGLE_TRY(sourceD3D->getImageAndSyncFromStorage(context, sourceImageIndex, &sourceImage));
-
- gl::ImageIndex destImageIndex = gl::ImageIndex::Make2D(static_cast<GLint>(destLevel));
- ImageD3D *destImage = nullptr;
- ANGLE_TRY(getImageAndSyncFromStorage(context, destImageIndex, &destImage));
-
- ANGLE_TRY(mRenderer->copyImage(context, destImage, sourceImage, sourceRect, destOffset,
- unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha));
-
- mDirtyImages = true;
-
- gl::Box destRegion(destOffset, size);
- ANGLE_TRY(commitRegion(context, destImageIndex, destRegion));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2D::copySubTexture(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Offset &destOffset,
- size_t sourceLevel,
- const gl::Rectangle &sourceArea,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- const gl::Texture *source)
-{
- ASSERT(target == GL_TEXTURE_2D);
-
- GLint destLevel = static_cast<GLint>(level);
-
- if (!isSRGB(destLevel) && canCreateRenderTargetForImage(gl::ImageIndex::Make2D(destLevel)))
- {
- ANGLE_TRY(ensureRenderTarget(context));
- ASSERT(isValidLevel(destLevel));
- ANGLE_TRY(updateStorageLevel(context, destLevel));
-
- ANGLE_TRY(mRenderer->copyTexture(
- context, source, static_cast<GLint>(sourceLevel), sourceArea,
- gl::GetUnsizedFormat(getInternalFormat(destLevel)), destOffset, mTexStorage, target,
- destLevel, unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha));
- }
- else
- {
- gl::ImageIndex sourceImageIndex = gl::ImageIndex::Make2D(static_cast<GLint>(sourceLevel));
- TextureD3D *sourceD3D = GetImplAs<TextureD3D>(source);
- ImageD3D *sourceImage = nullptr;
- ANGLE_TRY(sourceD3D->getImageAndSyncFromStorage(context, sourceImageIndex, &sourceImage));
-
- gl::ImageIndex destImageIndex = gl::ImageIndex::Make2D(static_cast<GLint>(destLevel));
- ImageD3D *destImage = nullptr;
- ANGLE_TRY(getImageAndSyncFromStorage(context, destImageIndex, &destImage));
-
- ANGLE_TRY(mRenderer->copyImage(context, destImage, sourceImage, sourceArea, destOffset,
- unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha));
-
- mDirtyImages = true;
-
- gl::Box destRegion(destOffset.x, destOffset.y, 0, sourceArea.width, sourceArea.height, 1);
- ANGLE_TRY(commitRegion(context, destImageIndex, destRegion));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2D::copyCompressedTexture(const gl::Context *context,
- const gl::Texture *source)
-{
- GLenum sourceTarget = source->getTarget();
- GLint sourceLevel = 0;
-
- GLint destLevel = 0;
-
- GLenum sizedInternalFormat =
- source->getFormat(sourceTarget, sourceLevel).info->sizedInternalFormat;
- gl::Extents size(static_cast<int>(source->getWidth(sourceTarget, sourceLevel)),
- static_cast<int>(source->getHeight(sourceTarget, sourceLevel)), 1);
- ANGLE_TRY(redefineImage(context, destLevel, sizedInternalFormat, size, false));
-
- ANGLE_TRY(initializeStorage(context, false));
- ASSERT(mTexStorage);
-
- ANGLE_TRY(
- mRenderer->copyCompressedTexture(context, source, sourceLevel, mTexStorage, destLevel));
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2D::setStorage(const gl::Context *context,
- GLenum target,
- size_t levels,
- GLenum internalFormat,
- const gl::Extents &size)
-{
- ASSERT(GL_TEXTURE_2D && size.depth == 1);
-
- for (size_t level = 0; level < levels; level++)
- {
- gl::Extents levelSize(std::max(1, size.width >> level),
- std::max(1, size.height >> level),
- 1);
- ANGLE_TRY(redefineImage(context, level, internalFormat, levelSize, true));
- }
-
- for (size_t level = levels; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
- {
- ANGLE_TRY(redefineImage(context, level, GL_NONE, gl::Extents(0, 0, 1), true));
- }
-
- // TODO(geofflang): Verify storage creation had no errors
- bool renderTarget = IsRenderTargetUsage(mState.getUsage());
- TexStoragePointer storage(context);
- storage.reset(mRenderer->createTextureStorage2D(internalFormat, renderTarget, size.width,
- size.height, static_cast<int>(levels), false));
-
- ANGLE_TRY(setCompleteTexStorage(context, storage.get()));
- storage.release();
-
- ANGLE_TRY(updateStorage(context));
-
- mImmutable = true;
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2D::bindTexImage(const gl::Context *context, egl::Surface *surface)
-{
- GLenum internalformat = surface->getConfig()->renderTargetFormat;
-
- gl::Extents size(surface->getWidth(), surface->getHeight(), 1);
- ANGLE_TRY(redefineImage(context, 0, internalformat, size, true));
-
- ANGLE_TRY(releaseTexStorage(context));
-
- SurfaceD3D *surfaceD3D = GetImplAs<SurfaceD3D>(surface);
- ASSERT(surfaceD3D);
-
- mTexStorage = mRenderer->createTextureStorage2D(surfaceD3D->getSwapChain());
- mEGLImageTarget = false;
-
- mDirtyImages = false;
- mImageArray[0]->markClean();
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2D::releaseTexImage(const gl::Context *context)
-{
- if (mTexStorage)
- {
- ANGLE_TRY(releaseTexStorage(context));
- }
-
- for (int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
- {
- ANGLE_TRY(redefineImage(context, i, GL_NONE, gl::Extents(0, 0, 1), true));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2D::setEGLImageTarget(const gl::Context *context,
- GLenum target,
- egl::Image *image)
-{
- EGLImageD3D *eglImaged3d = GetImplAs<EGLImageD3D>(image);
-
- // Set the properties of the base mip level from the EGL image
- const auto &format = image->getFormat();
- gl::Extents size(static_cast<int>(image->getWidth()), static_cast<int>(image->getHeight()), 1);
- ANGLE_TRY(redefineImage(context, 0, format.info->sizedInternalFormat, size, true));
-
- // Clear all other images.
- for (size_t level = 1; level < mImageArray.size(); level++)
- {
- ANGLE_TRY(redefineImage(context, level, GL_NONE, gl::Extents(0, 0, 1), true));
- }
-
- ANGLE_TRY(releaseTexStorage(context));
- mImageArray[0]->markClean();
-
- // Pass in the RenderTargetD3D here: createTextureStorage can't generate an error.
- RenderTargetD3D *renderTargetD3D = nullptr;
- ANGLE_TRY(eglImaged3d->getRenderTarget(context, &renderTargetD3D));
-
- mTexStorage = mRenderer->createTextureStorageEGLImage(eglImaged3d, renderTargetD3D);
- mEGLImageTarget = true;
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2D::initMipmapImages(const gl::Context *context)
-{
- const GLuint baseLevel = mState.getEffectiveBaseLevel();
- const GLuint maxLevel = mState.getMipmapMaxLevel();
- // Purge array levels baseLevel + 1 through q and reset them to represent the generated mipmap
- // levels.
- for (GLuint level = baseLevel + 1; level <= maxLevel; level++)
- {
- gl::Extents levelSize(std::max(getLevelZeroWidth() >> level, 1),
- std::max(getLevelZeroHeight() >> level, 1), 1);
-
- ANGLE_TRY(redefineImage(context, level, getBaseLevelInternalFormat(), levelSize, false));
- }
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2D::getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT)
-{
- ASSERT(!index.hasLayer());
-
- // ensure the underlying texture is created
- ANGLE_TRY(ensureRenderTarget(context));
- ANGLE_TRY(updateStorageLevel(context, index.mipIndex));
-
- return mTexStorage->getRenderTarget(context, index, outRT);
-}
-
-bool TextureD3D_2D::isValidLevel(int level) const
-{
- return (mTexStorage ? (level >= 0 && level < mTexStorage->getLevelCount()) : false);
-}
-
-bool TextureD3D_2D::isLevelComplete(int level) const
-{
- if (isImmutable())
- {
- return true;
- }
-
- GLsizei width = getLevelZeroWidth();
- GLsizei height = getLevelZeroHeight();
-
- if (width <= 0 || height <= 0)
- {
- return false;
- }
-
- // The base image level is complete if the width and height are positive
- if (level == static_cast<int>(getBaseLevel()))
- {
- return true;
- }
-
- ASSERT(level >= 0 && level <= static_cast<int>(mImageArray.size()) &&
- mImageArray[level] != nullptr);
- ImageD3D *image = mImageArray[level].get();
-
- if (image->getInternalFormat() != getBaseLevelInternalFormat())
- {
- return false;
- }
-
- if (image->getWidth() != std::max(1, width >> level))
- {
- return false;
- }
-
- if (image->getHeight() != std::max(1, height >> level))
- {
- return false;
- }
-
- return true;
-}
-
-bool TextureD3D_2D::isImageComplete(const gl::ImageIndex &index) const
-{
- return isLevelComplete(index.mipIndex);
-}
-
-// Constructs a native texture resource from the texture images
-gl::Error TextureD3D_2D::initializeStorage(const gl::Context *context, bool renderTarget)
-{
- // Only initialize the first time this texture is used as a render target or shader resource
- if (mTexStorage)
- {
- return gl::NoError();
- }
-
- // do not attempt to create storage for nonexistant data
- if (!isLevelComplete(getBaseLevel()))
- {
- return gl::NoError();
- }
-
- bool createRenderTarget = (renderTarget || IsRenderTargetUsage(mState.getUsage()));
-
- TexStoragePointer storage(context);
- ANGLE_TRY(createCompleteStorage(createRenderTarget, &storage));
-
- ANGLE_TRY(setCompleteTexStorage(context, storage.get()));
- storage.release();
-
- ASSERT(mTexStorage);
-
- // flush image data to the storage
- ANGLE_TRY(updateStorage(context));
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2D::createCompleteStorage(bool renderTarget,
- TexStoragePointer *outStorage) const
-{
- GLsizei width = getLevelZeroWidth();
- GLsizei height = getLevelZeroHeight();
- GLenum internalFormat = getBaseLevelInternalFormat();
-
- ASSERT(width > 0 && height > 0);
-
- // use existing storage level count, when previously specified by TexStorage*D
- GLint levels = (mTexStorage ? mTexStorage->getLevelCount() : creationLevels(width, height, 1));
-
- bool hintLevelZeroOnly = false;
- if (mRenderer->getWorkarounds().zeroMaxLodWorkaround)
- {
- // If any of the CPU images (levels >= 1) are dirty, then the textureStorage2D should use the mipped texture to begin with.
- // Otherwise, it should use the level-zero-only texture.
- hintLevelZeroOnly = true;
- for (int level = 1; level < levels && hintLevelZeroOnly; level++)
- {
- hintLevelZeroOnly = !(mImageArray[level]->isDirty() && isLevelComplete(level));
- }
- }
-
- // TODO(geofflang): Determine if the texture creation succeeded
- outStorage->reset(mRenderer->createTextureStorage2D(internalFormat, renderTarget, width, height,
- levels, hintLevelZeroOnly));
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2D::setCompleteTexStorage(const gl::Context *context,
- TextureStorage *newCompleteTexStorage)
-{
- if (newCompleteTexStorage && newCompleteTexStorage->isManaged())
- {
- for (int level = 0; level < newCompleteTexStorage->getLevelCount(); level++)
- {
- ANGLE_TRY(
- mImageArray[level]->setManagedSurface2D(context, newCompleteTexStorage, level));
- }
- }
-
- ANGLE_TRY(releaseTexStorage(context));
- mTexStorage = newCompleteTexStorage;
-
- mDirtyImages = true;
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2D::updateStorage(const gl::Context *context)
-{
- if (!mDirtyImages)
- {
- return gl::NoError();
- }
-
- ASSERT(mTexStorage != nullptr);
- GLint storageLevels = mTexStorage->getLevelCount();
- for (int level = 0; level < storageLevels; level++)
- {
- if (mImageArray[level]->isDirty() && isLevelComplete(level))
- {
- ANGLE_TRY(updateStorageLevel(context, level));
- }
- }
-
- mDirtyImages = false;
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2D::updateStorageLevel(const gl::Context *context, int level)
-{
- ASSERT(level <= static_cast<int>(mImageArray.size()) && mImageArray[level] != nullptr);
- ASSERT(isLevelComplete(level));
-
- if (mImageArray[level]->isDirty())
- {
- gl::ImageIndex index = gl::ImageIndex::Make2D(level);
- gl::Box region(0, 0, 0, getWidth(level), getHeight(level), 1);
- ANGLE_TRY(commitRegion(context, index, region));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2D::redefineImage(const gl::Context *context,
- size_t level,
- GLenum internalformat,
- const gl::Extents &size,
- bool forceRelease)
-{
- ASSERT(size.depth == 1);
-
- // If there currently is a corresponding storage texture image, it has these parameters
- const int storageWidth = std::max(1, getLevelZeroWidth() >> level);
- const int storageHeight = std::max(1, getLevelZeroHeight() >> level);
- const GLenum storageFormat = getBaseLevelInternalFormat();
-
- mImageArray[level]->redefine(GL_TEXTURE_2D, internalformat, size, forceRelease);
- mDirtyImages = mDirtyImages || mImageArray[level]->isDirty();
-
- if (mTexStorage)
- {
- const size_t storageLevels = mTexStorage->getLevelCount();
-
- // If the storage was from an EGL image, copy it back into local images to preserve it
- // while orphaning
- if (level != 0 && mEGLImageTarget)
- {
- ANGLE_TRY(mImageArray[0]->copyFromTexStorage(context, gl::ImageIndex::Make2D(0),
- mTexStorage));
- }
-
- if ((level >= storageLevels && storageLevels != 0) || size.width != storageWidth ||
- size.height != storageHeight ||
- internalformat != storageFormat) // Discard mismatched storage
- {
- ANGLE_TRY(releaseTexStorage(context));
- markAllImagesDirty();
- }
- }
-
- // Can't be an EGL image target after being redefined
- mEGLImageTarget = false;
-
- return gl::NoError();
-}
-
-gl::ImageIndexIterator TextureD3D_2D::imageIterator() const
-{
- return gl::ImageIndexIterator::Make2D(0, mTexStorage->getLevelCount());
-}
-
-gl::ImageIndex TextureD3D_2D::getImageIndex(GLint mip, GLint /*layer*/) const
-{
- // "layer" does not apply to 2D Textures.
- return gl::ImageIndex::Make2D(mip);
-}
-
-bool TextureD3D_2D::isValidIndex(const gl::ImageIndex &index) const
-{
- return (mTexStorage && index.type == GL_TEXTURE_2D &&
- index.mipIndex >= 0 && index.mipIndex < mTexStorage->getLevelCount());
-}
-
-void TextureD3D_2D::markAllImagesDirty()
-{
- for (size_t i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
- {
- mImageArray[i]->markDirty();
- }
- mDirtyImages = true;
-}
-
-TextureD3D_Cube::TextureD3D_Cube(const gl::TextureState &state, RendererD3D *renderer)
- : TextureD3D(state, renderer)
-{
- for (auto &face : mImageArray)
- {
- for (auto &image : face)
- {
- image.reset(renderer->createImage());
- }
- }
-}
-
-gl::Error TextureD3D_Cube::onDestroy(const gl::Context *context)
-{
- // Delete the Images before the TextureStorage. Images might be relying on the TextureStorage
- // for some of their data. If TextureStorage is deleted before the Images, then their data will
- // be wastefully copied back from the GPU before we delete the Images.
- for (auto &face : mImageArray)
- {
- for (auto &image : face)
- {
- image.reset();
- }
- }
- return TextureD3D::onDestroy(context);
-}
-
-TextureD3D_Cube::~TextureD3D_Cube()
-{
-}
-
-ImageD3D *TextureD3D_Cube::getImage(int level, int layer) const
-{
- ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- ASSERT(layer >= 0 && layer < 6);
- return mImageArray[layer][level].get();
-}
-
-ImageD3D *TextureD3D_Cube::getImage(const gl::ImageIndex &index) const
-{
- ASSERT(index.mipIndex < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- ASSERT(index.layerIndex >= 0 && index.layerIndex < 6);
- return mImageArray[index.layerIndex][index.mipIndex].get();
-}
-
-GLsizei TextureD3D_Cube::getLayerCount(int level) const
-{
- ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- return 6;
-}
-
-GLenum TextureD3D_Cube::getInternalFormat(GLint level, GLint layer) const
-{
- if (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
- return mImageArray[layer][level]->getInternalFormat();
- else
- return GL_NONE;
-}
-
-bool TextureD3D_Cube::isDepth(GLint level, GLint layer) const
-{
- return gl::GetSizedInternalFormatInfo(getInternalFormat(level, layer)).depthBits > 0;
-}
-
-bool TextureD3D_Cube::isSRGB(GLint level, GLint layer) const
-{
- return gl::GetSizedInternalFormatInfo(getInternalFormat(level, layer)).colorEncoding == GL_SRGB;
-}
-
-gl::Error TextureD3D_Cube::setEGLImageTarget(const gl::Context *context,
- GLenum target,
- egl::Image *image)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_Cube::setImage(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels)
-{
- ASSERT(size.depth == 1);
-
- const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat, type);
- gl::ImageIndex index = gl::ImageIndex::MakeCube(target, static_cast<GLint>(level));
-
- ANGLE_TRY(redefineImage(context, index.layerIndex, static_cast<GLint>(level),
- internalFormatInfo.sizedInternalFormat, size, false));
-
- return setImageImpl(context, index, type, unpack, pixels, 0);
-}
-
-gl::Error TextureD3D_Cube::setSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels)
-{
- ASSERT(area.depth == 1 && area.z == 0);
-
- gl::ImageIndex index = gl::ImageIndex::MakeCube(target, static_cast<GLint>(level));
- return TextureD3D::subImage(context, index, area, format, type, unpack, pixels, 0);
-}
-
-gl::Error TextureD3D_Cube::setCompressedImage(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels)
-{
- ASSERT(size.depth == 1);
-
- // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly
- size_t faceIndex = gl::CubeMapTextureTargetToLayerIndex(target);
-
- ANGLE_TRY(redefineImage(context, static_cast<int>(faceIndex), static_cast<GLint>(level),
- internalFormat, size, false));
-
- gl::ImageIndex index = gl::ImageIndex::MakeCube(target, static_cast<GLint>(level));
- return setCompressedImageImpl(context, index, unpack, pixels, 0);
-}
-
-gl::Error TextureD3D_Cube::setCompressedSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels)
-{
- ASSERT(area.depth == 1 && area.z == 0);
-
- gl::ImageIndex index = gl::ImageIndex::MakeCube(target, static_cast<GLint>(level));
-
- ANGLE_TRY(TextureD3D::subImageCompressed(context, index, area, format, unpack, pixels, 0));
- return commitRegion(context, index, area);
-}
-
-gl::Error TextureD3D_Cube::copyImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- const gl::Rectangle &origSourceArea,
- GLenum internalFormat,
- const gl::Framebuffer *source)
-{
- int faceIndex = static_cast<int>(gl::CubeMapTextureTargetToLayerIndex(target));
- const gl::InternalFormat &internalFormatInfo =
- gl::GetInternalFormatInfo(internalFormat, GL_UNSIGNED_BYTE);
-
- GLint level = static_cast<GLint>(imageLevel);
-
- gl::Extents size(origSourceArea.width, origSourceArea.height, 1);
- ANGLE_TRY(redefineImage(context, static_cast<int>(faceIndex), level,
- internalFormatInfo.sizedInternalFormat, size, false));
-
- gl::Extents fbSize = source->getReadColorbuffer()->getSize();
-
- // Does the read area extend beyond the framebuffer?
- bool outside = origSourceArea.x < 0 || origSourceArea.y < 0 ||
- origSourceArea.x + origSourceArea.width > fbSize.width ||
- origSourceArea.y + origSourceArea.height > fbSize.height;
-
- // In WebGL mode we need to zero the texture outside the framebuffer.
- // If we have robust resource init, it was already zeroed by redefineImage() above, otherwise
- // zero it explicitly.
- // TODO(fjhenigman): When robust resource is fully implemented look into making it a
- // prerequisite for WebGL and deleting this code.
- if (outside && context->getExtensions().webglCompatibility &&
- !context->isRobustResourceInitEnabled())
- {
- angle::MemoryBuffer *zero;
- ANGLE_TRY(context->getZeroFilledBuffer(
- origSourceArea.width * origSourceArea.height * internalFormatInfo.pixelBytes, &zero));
- gl::PixelUnpackState unpack;
- unpack.alignment = 1;
- ANGLE_TRY(setImage(context, target, imageLevel, internalFormat, size,
- internalFormatInfo.format, internalFormatInfo.type, unpack,
- zero->data()));
- }
-
- gl::Rectangle sourceArea;
- if (!ClipRectangle(origSourceArea, gl::Rectangle(0, 0, fbSize.width, fbSize.height),
- &sourceArea))
- {
- // Empty source area, nothing to do.
- return gl::NoError();
- }
-
- gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level);
- gl::Offset destOffset(sourceArea.x - origSourceArea.x, sourceArea.y - origSourceArea.y, 0);
-
- // If the zero max LOD workaround is active, then we can't sample from individual layers of the framebuffer in shaders,
- // so we should use the non-rendering copy path.
- if (!canCreateRenderTargetForImage(index) || mRenderer->getWorkarounds().zeroMaxLodWorkaround)
- {
- ANGLE_TRY(mImageArray[faceIndex][level]->copyFromFramebuffer(context, destOffset,
- sourceArea, source));
- mDirtyImages = true;
- }
- else
- {
- ANGLE_TRY(ensureRenderTarget(context));
-
- ASSERT(size.width == size.height);
-
- if (size.width > 0 && isValidFaceLevel(faceIndex, level))
- {
- ANGLE_TRY(updateStorageFaceLevel(context, faceIndex, level));
- ANGLE_TRY(mRenderer->copyImageCube(context, source, sourceArea, internalFormat,
- destOffset, mTexStorage, target, level));
- }
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_Cube::copySubImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- const gl::Offset &origDestOffset,
- const gl::Rectangle &origSourceArea,
- const gl::Framebuffer *source)
-{
- gl::Extents fbSize = source->getReadColorbuffer()->getSize();
- gl::Rectangle sourceArea;
- if (!ClipRectangle(origSourceArea, gl::Rectangle(0, 0, fbSize.width, fbSize.height),
- &sourceArea))
- {
- return gl::NoError();
- }
- const gl::Offset destOffset(origDestOffset.x + sourceArea.x - origSourceArea.x,
- origDestOffset.y + sourceArea.y - origSourceArea.y, 0);
-
- int faceIndex = static_cast<int>(gl::CubeMapTextureTargetToLayerIndex(target));
-
- GLint level = static_cast<GLint>(imageLevel);
- gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level);
-
- // If the zero max LOD workaround is active, then we can't sample from individual layers of the framebuffer in shaders,
- // so we should use the non-rendering copy path.
- if (!canCreateRenderTargetForImage(index) || mRenderer->getWorkarounds().zeroMaxLodWorkaround)
- {
- ANGLE_TRY(mImageArray[faceIndex][level]->copyFromFramebuffer(context, destOffset,
- sourceArea, source));
- mDirtyImages = true;
- }
- else
- {
- ANGLE_TRY(ensureRenderTarget(context));
- if (isValidFaceLevel(faceIndex, level))
- {
- ANGLE_TRY(updateStorageFaceLevel(context, faceIndex, level));
- ANGLE_TRY(mRenderer->copyImageCube(context, source, sourceArea,
- gl::GetUnsizedFormat(getBaseLevelInternalFormat()),
- destOffset, mTexStorage, target, level));
- }
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_Cube::copyTexture(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- GLenum type,
- size_t sourceLevel,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- const gl::Texture *source)
-{
- ASSERT(gl::IsCubeMapTextureTarget(target));
-
- GLenum sourceTarget = source->getTarget();
-
- GLint destLevel = static_cast<GLint>(level);
- int faceIndex = static_cast<int>(gl::CubeMapTextureTargetToLayerIndex(target));
-
- const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat, type);
- gl::Extents size(static_cast<int>(source->getWidth(sourceTarget, sourceLevel)),
- static_cast<int>(source->getHeight(sourceTarget, sourceLevel)), 1);
- ANGLE_TRY(redefineImage(context, faceIndex, destLevel, internalFormatInfo.sizedInternalFormat,
- size, false));
-
- gl::Rectangle sourceRect(0, 0, size.width, size.height);
- gl::Offset destOffset(0, 0, 0);
-
- if (!isSRGB(destLevel, faceIndex) &&
- canCreateRenderTargetForImage(gl::ImageIndex::MakeCube(target, destLevel)))
- {
- ANGLE_TRY(ensureRenderTarget(context));
- ASSERT(isValidFaceLevel(faceIndex, destLevel));
- ANGLE_TRY(updateStorageFaceLevel(context, faceIndex, destLevel));
-
- ANGLE_TRY(mRenderer->copyTexture(context, source, static_cast<GLint>(sourceLevel),
- sourceRect, internalFormatInfo.format, destOffset,
- mTexStorage, target, destLevel, unpackFlipY,
- unpackPremultiplyAlpha, unpackUnmultiplyAlpha));
- }
- else
- {
- gl::ImageIndex sourceImageIndex = gl::ImageIndex::Make2D(static_cast<GLint>(sourceLevel));
- TextureD3D *sourceD3D = GetImplAs<TextureD3D>(source);
- ImageD3D *sourceImage = nullptr;
- ANGLE_TRY(sourceD3D->getImageAndSyncFromStorage(context, sourceImageIndex, &sourceImage));
-
- gl::ImageIndex destImageIndex =
- gl::ImageIndex::MakeCube(target, static_cast<GLint>(destLevel));
- ImageD3D *destImage = nullptr;
- ANGLE_TRY(getImageAndSyncFromStorage(context, destImageIndex, &destImage));
-
- ANGLE_TRY(mRenderer->copyImage(context, destImage, sourceImage, sourceRect, destOffset,
- unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha));
-
- mDirtyImages = true;
-
- gl::Box destRegion(destOffset, size);
- ANGLE_TRY(commitRegion(context, destImageIndex, destRegion));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_Cube::copySubTexture(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Offset &destOffset,
- size_t sourceLevel,
- const gl::Rectangle &sourceArea,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- const gl::Texture *source)
-{
- ASSERT(gl::IsCubeMapTextureTarget(target));
-
- GLint destLevel = static_cast<GLint>(level);
- int faceIndex = static_cast<int>(gl::CubeMapTextureTargetToLayerIndex(target));
-
- if (!isSRGB(destLevel, faceIndex) &&
- canCreateRenderTargetForImage(gl::ImageIndex::MakeCube(target, destLevel)))
- {
- ANGLE_TRY(ensureRenderTarget(context));
- ASSERT(isValidFaceLevel(faceIndex, destLevel));
- ANGLE_TRY(updateStorageFaceLevel(context, faceIndex, destLevel));
-
- ANGLE_TRY(mRenderer->copyTexture(
- context, source, static_cast<GLint>(sourceLevel), sourceArea,
- gl::GetUnsizedFormat(getInternalFormat(destLevel, faceIndex)), destOffset, mTexStorage,
- target, destLevel, unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha));
- }
- else
- {
- gl::ImageIndex sourceImageIndex = gl::ImageIndex::Make2D(static_cast<GLint>(sourceLevel));
- TextureD3D *sourceD3D = GetImplAs<TextureD3D>(source);
- ImageD3D *sourceImage = nullptr;
- ANGLE_TRY(sourceD3D->getImageAndSyncFromStorage(context, sourceImageIndex, &sourceImage));
-
- gl::ImageIndex destImageIndex =
- gl::ImageIndex::MakeCube(target, static_cast<GLint>(destLevel));
- ImageD3D *destImage = nullptr;
- ANGLE_TRY(getImageAndSyncFromStorage(context, destImageIndex, &destImage));
-
- ANGLE_TRY(mRenderer->copyImage(context, destImage, sourceImage, sourceArea, destOffset,
- unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha));
-
- mDirtyImages = true;
-
- gl::Box destRegion(destOffset.x, destOffset.y, 0, sourceArea.width, sourceArea.height, 1);
- ANGLE_TRY(commitRegion(context, destImageIndex, destRegion));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_Cube::setStorage(const gl::Context *context,
- GLenum target,
- size_t levels,
- GLenum internalFormat,
- const gl::Extents &size)
-{
- ASSERT(size.width == size.height);
- ASSERT(size.depth == 1);
-
- for (size_t level = 0; level < levels; level++)
- {
- GLsizei mipSize = std::max(1, size.width >> level);
- for (int faceIndex = 0; faceIndex < 6; faceIndex++)
- {
- mImageArray[faceIndex][level]->redefine(GL_TEXTURE_CUBE_MAP, internalFormat, gl::Extents(mipSize, mipSize, 1), true);
- }
- }
-
- for (size_t level = levels; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
- {
- for (int faceIndex = 0; faceIndex < 6; faceIndex++)
- {
- mImageArray[faceIndex][level]->redefine(GL_TEXTURE_CUBE_MAP, GL_NONE, gl::Extents(0, 0, 0), true);
- }
- }
-
- // TODO(geofflang): Verify storage creation had no errors
- bool renderTarget = IsRenderTargetUsage(mState.getUsage());
-
- TexStoragePointer storage(context);
- storage.reset(mRenderer->createTextureStorageCube(internalFormat, renderTarget, size.width,
- static_cast<int>(levels), false));
-
- ANGLE_TRY(setCompleteTexStorage(context, storage.get()));
- storage.release();
-
- ANGLE_TRY(updateStorage(context));
-
- mImmutable = true;
-
- return gl::NoError();
-}
-
-// Tests for cube texture completeness. [OpenGL ES 2.0.24] section 3.7.10 page 81.
-bool TextureD3D_Cube::isCubeComplete() const
-{
- int baseWidth = getBaseLevelWidth();
- int baseHeight = getBaseLevelHeight();
- GLenum baseFormat = getBaseLevelInternalFormat();
-
- if (baseWidth <= 0 || baseWidth != baseHeight)
- {
- return false;
- }
-
- for (int faceIndex = 1; faceIndex < 6; faceIndex++)
- {
- const ImageD3D &faceBaseImage = *mImageArray[faceIndex][getBaseLevel()];
-
- if (faceBaseImage.getWidth() != baseWidth ||
- faceBaseImage.getHeight() != baseHeight ||
- faceBaseImage.getInternalFormat() != baseFormat )
- {
- return false;
- }
- }
-
- return true;
-}
-
-gl::Error TextureD3D_Cube::bindTexImage(const gl::Context *context, egl::Surface *surface)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_Cube::releaseTexImage(const gl::Context *context)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_Cube::initMipmapImages(const gl::Context *context)
-{
- const GLuint baseLevel = mState.getEffectiveBaseLevel();
- const GLuint maxLevel = mState.getMipmapMaxLevel();
- // Purge array levels baseLevel + 1 through q and reset them to represent the generated mipmap
- // levels.
- for (int faceIndex = 0; faceIndex < 6; faceIndex++)
- {
- for (GLuint level = baseLevel + 1; level <= maxLevel; level++)
- {
- int faceLevelSize =
- (std::max(mImageArray[faceIndex][baseLevel]->getWidth() >> (level - baseLevel), 1));
- ANGLE_TRY(redefineImage(context, faceIndex, level,
- mImageArray[faceIndex][baseLevel]->getInternalFormat(),
- gl::Extents(faceLevelSize, faceLevelSize, 1), false));
- }
- }
- return gl::NoError();
-}
-
-gl::Error TextureD3D_Cube::getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT)
-{
- ASSERT(gl::IsCubeMapTextureTarget(index.type));
-
- // ensure the underlying texture is created
- ANGLE_TRY(ensureRenderTarget(context));
- ANGLE_TRY(updateStorageFaceLevel(context, index.layerIndex, index.mipIndex));
-
- return mTexStorage->getRenderTarget(context, index, outRT);
-}
-
-gl::Error TextureD3D_Cube::initializeStorage(const gl::Context *context, bool renderTarget)
-{
- // Only initialize the first time this texture is used as a render target or shader resource
- if (mTexStorage)
- {
- return gl::NoError();
- }
-
- // do not attempt to create storage for nonexistant data
- if (!isFaceLevelComplete(0, getBaseLevel()))
- {
- return gl::NoError();
- }
-
- bool createRenderTarget = (renderTarget || IsRenderTargetUsage(mState.getUsage()));
-
- TexStoragePointer storage(context);
- ANGLE_TRY(createCompleteStorage(createRenderTarget, &storage));
-
- ANGLE_TRY(setCompleteTexStorage(context, storage.get()));
- storage.release();
-
- ASSERT(mTexStorage);
-
- // flush image data to the storage
- ANGLE_TRY(updateStorage(context));
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_Cube::createCompleteStorage(bool renderTarget,
- TexStoragePointer *outStorage) const
-{
- GLsizei size = getLevelZeroWidth();
-
- ASSERT(size > 0);
-
- // use existing storage level count, when previously specified by TexStorage*D
- GLint levels = (mTexStorage ? mTexStorage->getLevelCount() : creationLevels(size, size, 1));
-
- bool hintLevelZeroOnly = false;
- if (mRenderer->getWorkarounds().zeroMaxLodWorkaround)
- {
- // If any of the CPU images (levels >= 1) are dirty, then the textureStorage should use the mipped texture to begin with.
- // Otherwise, it should use the level-zero-only texture.
- hintLevelZeroOnly = true;
- for (int faceIndex = 0; faceIndex < 6 && hintLevelZeroOnly; faceIndex++)
- {
- for (int level = 1; level < levels && hintLevelZeroOnly; level++)
- {
- hintLevelZeroOnly = !(mImageArray[faceIndex][level]->isDirty() && isFaceLevelComplete(faceIndex, level));
- }
- }
- }
-
- // TODO (geofflang): detect if storage creation succeeded
- outStorage->reset(mRenderer->createTextureStorageCube(
- getBaseLevelInternalFormat(), renderTarget, size, levels, hintLevelZeroOnly));
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_Cube::setCompleteTexStorage(const gl::Context *context,
- TextureStorage *newCompleteTexStorage)
-{
- if (newCompleteTexStorage && newCompleteTexStorage->isManaged())
- {
- for (int faceIndex = 0; faceIndex < 6; faceIndex++)
- {
- for (int level = 0; level < newCompleteTexStorage->getLevelCount(); level++)
- {
- ANGLE_TRY(mImageArray[faceIndex][level]->setManagedSurfaceCube(
- context, newCompleteTexStorage, faceIndex, level));
- }
- }
- }
-
- ANGLE_TRY(releaseTexStorage(context));
- mTexStorage = newCompleteTexStorage;
-
- mDirtyImages = true;
- return gl::NoError();
-}
-
-gl::Error TextureD3D_Cube::updateStorage(const gl::Context *context)
-{
- if (!mDirtyImages)
- {
- return gl::NoError();
- }
-
- ASSERT(mTexStorage != nullptr);
- GLint storageLevels = mTexStorage->getLevelCount();
- for (int face = 0; face < 6; face++)
- {
- for (int level = 0; level < storageLevels; level++)
- {
- if (mImageArray[face][level]->isDirty() && isFaceLevelComplete(face, level))
- {
- ANGLE_TRY(updateStorageFaceLevel(context, face, level));
- }
- }
- }
-
- mDirtyImages = false;
- return gl::NoError();
-}
-
-bool TextureD3D_Cube::isValidFaceLevel(int faceIndex, int level) const
-{
- return (mTexStorage ? (level >= 0 && level < mTexStorage->getLevelCount()) : 0);
-}
-
-bool TextureD3D_Cube::isFaceLevelComplete(int faceIndex, int level) const
-{
- if (getBaseLevel() >= gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
- {
- return false;
- }
- ASSERT(level >= 0 && faceIndex < 6 && level < static_cast<int>(mImageArray[faceIndex].size()) &&
- mImageArray[faceIndex][level] != nullptr);
-
- if (isImmutable())
- {
- return true;
- }
-
- int levelZeroSize = getLevelZeroWidth();
-
- if (levelZeroSize <= 0)
- {
- return false;
- }
-
- // "isCubeComplete" checks for base level completeness and we must call that
- // to determine if any face at level 0 is complete. We omit that check here
- // to avoid re-checking cube-completeness for every face at level 0.
- if (level == 0)
- {
- return true;
- }
-
- // Check that non-zero levels are consistent with the base level.
- const ImageD3D *faceLevelImage = mImageArray[faceIndex][level].get();
-
- if (faceLevelImage->getInternalFormat() != getBaseLevelInternalFormat())
- {
- return false;
- }
-
- if (faceLevelImage->getWidth() != std::max(1, levelZeroSize >> level))
- {
- return false;
- }
-
- return true;
-}
-
-bool TextureD3D_Cube::isImageComplete(const gl::ImageIndex &index) const
-{
- return isFaceLevelComplete(index.layerIndex, index.mipIndex);
-}
-
-gl::Error TextureD3D_Cube::updateStorageFaceLevel(const gl::Context *context,
- int faceIndex,
- int level)
-{
- ASSERT(level >= 0 && faceIndex < 6 && level < static_cast<int>(mImageArray[faceIndex].size()) &&
- mImageArray[faceIndex][level] != nullptr);
- ImageD3D *image = mImageArray[faceIndex][level].get();
-
- if (image->isDirty())
- {
- GLenum faceTarget = gl::LayerIndexToCubeMapTextureTarget(faceIndex);
- gl::ImageIndex index = gl::ImageIndex::MakeCube(faceTarget, level);
- gl::Box region(0, 0, 0, image->getWidth(), image->getHeight(), 1);
- ANGLE_TRY(commitRegion(context, index, region));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_Cube::redefineImage(const gl::Context *context,
- int faceIndex,
- GLint level,
- GLenum internalformat,
- const gl::Extents &size,
- bool forceRelease)
-{
- // If there currently is a corresponding storage texture image, it has these parameters
- const int storageWidth = std::max(1, getLevelZeroWidth() >> level);
- const int storageHeight = std::max(1, getLevelZeroHeight() >> level);
- const GLenum storageFormat = getBaseLevelInternalFormat();
-
- mImageArray[faceIndex][level]->redefine(GL_TEXTURE_CUBE_MAP, internalformat, size,
- forceRelease);
- mDirtyImages = mDirtyImages || mImageArray[faceIndex][level]->isDirty();
-
- if (mTexStorage)
- {
- const int storageLevels = mTexStorage->getLevelCount();
-
- if ((level >= storageLevels && storageLevels != 0) || size.width != storageWidth ||
- size.height != storageHeight ||
- internalformat != storageFormat) // Discard mismatched storage
- {
- markAllImagesDirty();
- ANGLE_TRY(releaseTexStorage(context));
- }
- }
-
- return gl::NoError();
-}
-
-gl::ImageIndexIterator TextureD3D_Cube::imageIterator() const
-{
- return gl::ImageIndexIterator::MakeCube(0, mTexStorage->getLevelCount());
-}
-
-gl::ImageIndex TextureD3D_Cube::getImageIndex(GLint mip, GLint layer) const
-{
- // The "layer" of the image index corresponds to the cube face
- return gl::ImageIndex::MakeCube(gl::LayerIndexToCubeMapTextureTarget(layer), mip);
-}
-
-bool TextureD3D_Cube::isValidIndex(const gl::ImageIndex &index) const
-{
- return (mTexStorage && gl::IsCubeMapTextureTarget(index.type) &&
- index.mipIndex >= 0 && index.mipIndex < mTexStorage->getLevelCount());
-}
-
-void TextureD3D_Cube::markAllImagesDirty()
-{
- for (int dirtyLevel = 0; dirtyLevel < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; dirtyLevel++)
- {
- for (int dirtyFace = 0; dirtyFace < 6; dirtyFace++)
- {
- mImageArray[dirtyFace][dirtyLevel]->markDirty();
- }
- }
- mDirtyImages = true;
-}
-
-TextureD3D_3D::TextureD3D_3D(const gl::TextureState &state, RendererD3D *renderer)
- : TextureD3D(state, renderer)
-{
- for (int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; ++i)
- {
- mImageArray[i].reset(renderer->createImage());
- }
-}
-
-gl::Error TextureD3D_3D::onDestroy(const gl::Context *context)
-{
- // Delete the Images before the TextureStorage. Images might be relying on the TextureStorage
- // for some of their data. If TextureStorage is deleted before the Images, then their data will
- // be wastefully copied back from the GPU before we delete the Images.
- for (auto &image : mImageArray)
- {
- image.reset();
- }
- return TextureD3D::onDestroy(context);
-}
-
-TextureD3D_3D::~TextureD3D_3D()
-{
-}
-
-ImageD3D *TextureD3D_3D::getImage(int level, int layer) const
-{
- ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- ASSERT(layer == 0);
- return mImageArray[level].get();
-}
-
-ImageD3D *TextureD3D_3D::getImage(const gl::ImageIndex &index) const
-{
- ASSERT(index.mipIndex < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- ASSERT(!index.hasLayer());
- ASSERT(index.type == GL_TEXTURE_3D);
- return mImageArray[index.mipIndex].get();
-}
-
-GLsizei TextureD3D_3D::getLayerCount(int level) const
-{
- ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- return 1;
-}
-
-GLsizei TextureD3D_3D::getWidth(GLint level) const
-{
- if (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
- return mImageArray[level]->getWidth();
- else
- return 0;
-}
-
-GLsizei TextureD3D_3D::getHeight(GLint level) const
-{
- if (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
- return mImageArray[level]->getHeight();
- else
- return 0;
-}
-
-GLsizei TextureD3D_3D::getDepth(GLint level) const
-{
- if (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
- return mImageArray[level]->getDepth();
- else
- return 0;
-}
-
-GLenum TextureD3D_3D::getInternalFormat(GLint level) const
-{
- if (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
- return mImageArray[level]->getInternalFormat();
- else
- return GL_NONE;
-}
-
-bool TextureD3D_3D::isDepth(GLint level) const
-{
- return gl::GetSizedInternalFormatInfo(getInternalFormat(level)).depthBits > 0;
-}
-
-gl::Error TextureD3D_3D::setEGLImageTarget(const gl::Context *context,
- GLenum target,
- egl::Image *image)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_3D::setImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- GLenum internalFormat,
- const gl::Extents &size,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels)
-{
- ASSERT(target == GL_TEXTURE_3D);
- const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat, type);
-
- GLint level = static_cast<GLint>(imageLevel);
- ANGLE_TRY(redefineImage(context, level, internalFormatInfo.sizedInternalFormat, size, false));
-
- bool fastUnpacked = false;
-
- gl::ImageIndex index = gl::ImageIndex::Make3D(level);
-
- // Attempt a fast gpu copy of the pixel data to the surface if the app bound an unpack buffer
- gl::Buffer *unpackBuffer =
- context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack);
- if (isFastUnpackable(unpackBuffer, internalFormatInfo.sizedInternalFormat) && !size.empty() &&
- isLevelComplete(level))
- {
- // Will try to create RT storage if it does not exist
- RenderTargetD3D *destRenderTarget = nullptr;
- ANGLE_TRY(getRenderTarget(context, index, &destRenderTarget));
-
- gl::Box destArea(0, 0, 0, getWidth(level), getHeight(level), getDepth(level));
-
- ANGLE_TRY(fastUnpackPixels(context, unpack, pixels, destArea,
- internalFormatInfo.sizedInternalFormat, type, destRenderTarget));
-
- // Ensure we don't overwrite our newly initialized data
- mImageArray[level]->markClean();
-
- fastUnpacked = true;
- }
-
- if (!fastUnpacked)
- {
- ANGLE_TRY(setImageImpl(context, index, type, unpack, pixels, 0));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_3D::setSubImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- const gl::Box &area,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels)
-{
- ASSERT(target == GL_TEXTURE_3D);
-
- GLint level = static_cast<GLint>(imageLevel);
- gl::ImageIndex index = gl::ImageIndex::Make3D(level);
-
- // Attempt a fast gpu copy of the pixel data to the surface if the app bound an unpack buffer
- gl::Buffer *unpackBuffer =
- context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack);
- if (isFastUnpackable(unpackBuffer, getInternalFormat(level)) && isLevelComplete(level))
- {
- RenderTargetD3D *destRenderTarget = nullptr;
- ANGLE_TRY(getRenderTarget(context, index, &destRenderTarget));
- ASSERT(!mImageArray[level]->isDirty());
-
- return fastUnpackPixels(context, unpack, pixels, area, getInternalFormat(level), type,
- destRenderTarget);
- }
- else
- {
- return TextureD3D::subImage(context, index, area, format, type, unpack, pixels, 0);
- }
-}
-
-gl::Error TextureD3D_3D::setCompressedImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- GLenum internalFormat,
- const gl::Extents &size,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels)
-{
- ASSERT(target == GL_TEXTURE_3D);
-
- GLint level = static_cast<GLint>(imageLevel);
- // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly
- ANGLE_TRY(redefineImage(context, level, internalFormat, size, false));
-
- gl::ImageIndex index = gl::ImageIndex::Make3D(level);
- return setCompressedImageImpl(context, index, unpack, pixels, 0);
-}
-
-gl::Error TextureD3D_3D::setCompressedSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels)
-{
- ASSERT(target == GL_TEXTURE_3D);
-
- gl::ImageIndex index = gl::ImageIndex::Make3D(static_cast<GLint>(level));
- ANGLE_TRY(TextureD3D::subImageCompressed(context, index, area, format, unpack, pixels, 0));
- return commitRegion(context, index, area);
-}
-
-gl::Error TextureD3D_3D::copyImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Rectangle &sourceArea,
- GLenum internalFormat,
- const gl::Framebuffer *source)
-{
- UNIMPLEMENTED();
- return gl::InternalError() << "Copying 3D textures is unimplemented.";
-}
-
-gl::Error TextureD3D_3D::copySubImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- const gl::Framebuffer *source)
-{
- ASSERT(target == GL_TEXTURE_3D);
-
- GLint level = static_cast<GLint>(imageLevel);
-
- gl::Extents fbSize = source->getReadColorbuffer()->getSize();
- gl::Rectangle clippedSourceArea;
- if (!ClipRectangle(sourceArea, gl::Rectangle(0, 0, fbSize.width, fbSize.height),
- &clippedSourceArea))
- {
- return gl::NoError();
- }
- const gl::Offset clippedDestOffset(destOffset.x + clippedSourceArea.x - sourceArea.x,
- destOffset.y + clippedSourceArea.y - sourceArea.y,
- destOffset.z);
-
- // Currently, copying directly to the storage is not possible because it's not possible to
- // create an SRV from a single layer of a 3D texture. Instead, make sure the image is up to
- // date before the copy and then copy back to the storage afterwards if needed.
- // TODO: Investigate 3D blits in D3D11.
-
- bool syncTexStorage = mTexStorage && isLevelComplete(level);
- if (syncTexStorage)
- {
- gl::ImageIndex index = gl::ImageIndex::Make3D(level);
- ANGLE_TRY(mImageArray[level]->copyFromTexStorage(context, index, mTexStorage));
- }
- ANGLE_TRY(mImageArray[level]->copyFromFramebuffer(context, clippedDestOffset, clippedSourceArea,
- source));
- mDirtyImages = true;
-
- if (syncTexStorage)
- {
- ANGLE_TRY(updateStorageLevel(context, level));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_3D::setStorage(const gl::Context *context,
- GLenum target,
- size_t levels,
- GLenum internalFormat,
- const gl::Extents &size)
-{
- ASSERT(target == GL_TEXTURE_3D);
-
- for (size_t level = 0; level < levels; level++)
- {
- gl::Extents levelSize(std::max(1, size.width >> level),
- std::max(1, size.height >> level),
- std::max(1, size.depth >> level));
- mImageArray[level]->redefine(GL_TEXTURE_3D, internalFormat, levelSize, true);
- }
-
- for (size_t level = levels; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
- {
- mImageArray[level]->redefine(GL_TEXTURE_3D, GL_NONE, gl::Extents(0, 0, 0), true);
- }
-
- // TODO(geofflang): Verify storage creation had no errors
- bool renderTarget = IsRenderTargetUsage(mState.getUsage());
- TexStoragePointer storage(context);
- storage.reset(mRenderer->createTextureStorage3D(internalFormat, renderTarget, size.width,
- size.height, size.depth,
- static_cast<int>(levels)));
-
- ANGLE_TRY(setCompleteTexStorage(context, storage.get()));
- storage.release();
-
- ANGLE_TRY(updateStorage(context));
-
- mImmutable = true;
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_3D::bindTexImage(const gl::Context *context, egl::Surface *surface)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_3D::releaseTexImage(const gl::Context *context)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_3D::initMipmapImages(const gl::Context *context)
-{
- const GLuint baseLevel = mState.getEffectiveBaseLevel();
- const GLuint maxLevel = mState.getMipmapMaxLevel();
- // Purge array levels baseLevel + 1 through q and reset them to represent the generated mipmap
- // levels.
- for (GLuint level = baseLevel + 1; level <= maxLevel; level++)
- {
- gl::Extents levelSize(std::max(getLevelZeroWidth() >> level, 1),
- std::max(getLevelZeroHeight() >> level, 1),
- std::max(getLevelZeroDepth() >> level, 1));
- ANGLE_TRY(redefineImage(context, level, getBaseLevelInternalFormat(), levelSize, false));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_3D::getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT)
-{
- // ensure the underlying texture is created
- ANGLE_TRY(ensureRenderTarget(context));
-
- if (index.hasLayer())
- {
- ANGLE_TRY(updateStorage(context));
- }
- else
- {
- ANGLE_TRY(updateStorageLevel(context, index.mipIndex));
- }
-
- return mTexStorage->getRenderTarget(context, index, outRT);
-}
-
-gl::Error TextureD3D_3D::initializeStorage(const gl::Context *context, bool renderTarget)
-{
- // Only initialize the first time this texture is used as a render target or shader resource
- if (mTexStorage)
- {
- return gl::NoError();
- }
-
- // do not attempt to create storage for nonexistant data
- if (!isLevelComplete(getBaseLevel()))
- {
- return gl::NoError();
- }
-
- bool createRenderTarget = (renderTarget || IsRenderTargetUsage(mState.getUsage()));
-
- TexStoragePointer storage(context);
- ANGLE_TRY(createCompleteStorage(createRenderTarget, &storage));
-
- ANGLE_TRY(setCompleteTexStorage(context, storage.get()));
- storage.release();
-
- ASSERT(mTexStorage);
-
- // flush image data to the storage
- ANGLE_TRY(updateStorage(context));
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_3D::createCompleteStorage(bool renderTarget,
- TexStoragePointer *outStorage) const
-{
- GLsizei width = getLevelZeroWidth();
- GLsizei height = getLevelZeroHeight();
- GLsizei depth = getLevelZeroDepth();
- GLenum internalFormat = getBaseLevelInternalFormat();
-
- ASSERT(width > 0 && height > 0 && depth > 0);
-
- // use existing storage level count, when previously specified by TexStorage*D
- GLint levels = (mTexStorage ? mTexStorage->getLevelCount() : creationLevels(width, height, depth));
-
- // TODO: Verify creation of the storage succeeded
- outStorage->reset(mRenderer->createTextureStorage3D(internalFormat, renderTarget, width, height,
- depth, levels));
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_3D::setCompleteTexStorage(const gl::Context *context,
- TextureStorage *newCompleteTexStorage)
-{
- ANGLE_TRY(releaseTexStorage(context));
- mTexStorage = newCompleteTexStorage;
- mDirtyImages = true;
-
- // We do not support managed 3D storage, as that is D3D9/ES2-only
- ASSERT(!mTexStorage->isManaged());
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_3D::updateStorage(const gl::Context *context)
-{
- if (!mDirtyImages)
- {
- return gl::NoError();
- }
-
- ASSERT(mTexStorage != nullptr);
- GLint storageLevels = mTexStorage->getLevelCount();
- for (int level = 0; level < storageLevels; level++)
- {
- if (mImageArray[level]->isDirty() && isLevelComplete(level))
- {
- ANGLE_TRY(updateStorageLevel(context, level));
- }
- }
-
- mDirtyImages = false;
- return gl::NoError();
-}
-
-bool TextureD3D_3D::isValidLevel(int level) const
-{
- return (mTexStorage ? (level >= 0 && level < mTexStorage->getLevelCount()) : 0);
-}
-
-bool TextureD3D_3D::isLevelComplete(int level) const
-{
- ASSERT(level >= 0 && level < static_cast<int>(mImageArray.size()) &&
- mImageArray[level] != nullptr);
-
- if (isImmutable())
- {
- return true;
- }
-
- GLsizei width = getLevelZeroWidth();
- GLsizei height = getLevelZeroHeight();
- GLsizei depth = getLevelZeroDepth();
-
- if (width <= 0 || height <= 0 || depth <= 0)
- {
- return false;
- }
-
- if (level == static_cast<int>(getBaseLevel()))
- {
- return true;
- }
-
- ImageD3D *levelImage = mImageArray[level].get();
-
- if (levelImage->getInternalFormat() != getBaseLevelInternalFormat())
- {
- return false;
- }
-
- if (levelImage->getWidth() != std::max(1, width >> level))
- {
- return false;
- }
-
- if (levelImage->getHeight() != std::max(1, height >> level))
- {
- return false;
- }
-
- if (levelImage->getDepth() != std::max(1, depth >> level))
- {
- return false;
- }
-
- return true;
-}
-
-bool TextureD3D_3D::isImageComplete(const gl::ImageIndex &index) const
-{
- return isLevelComplete(index.mipIndex);
-}
-
-gl::Error TextureD3D_3D::updateStorageLevel(const gl::Context *context, int level)
-{
- ASSERT(level >= 0 && level < static_cast<int>(mImageArray.size()) &&
- mImageArray[level] != nullptr);
- ASSERT(isLevelComplete(level));
-
- if (mImageArray[level]->isDirty())
- {
- gl::ImageIndex index = gl::ImageIndex::Make3D(level);
- gl::Box region(0, 0, 0, getWidth(level), getHeight(level), getDepth(level));
- ANGLE_TRY(commitRegion(context, index, region));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_3D::redefineImage(const gl::Context *context,
- GLint level,
- GLenum internalformat,
- const gl::Extents &size,
- bool forceRelease)
-{
- // If there currently is a corresponding storage texture image, it has these parameters
- const int storageWidth = std::max(1, getLevelZeroWidth() >> level);
- const int storageHeight = std::max(1, getLevelZeroHeight() >> level);
- const int storageDepth = std::max(1, getLevelZeroDepth() >> level);
- const GLenum storageFormat = getBaseLevelInternalFormat();
-
- mImageArray[level]->redefine(GL_TEXTURE_3D, internalformat, size, forceRelease);
- mDirtyImages = mDirtyImages || mImageArray[level]->isDirty();
-
- if (mTexStorage)
- {
- const int storageLevels = mTexStorage->getLevelCount();
-
- if ((level >= storageLevels && storageLevels != 0) || size.width != storageWidth ||
- size.height != storageHeight || size.depth != storageDepth ||
- internalformat != storageFormat) // Discard mismatched storage
- {
- markAllImagesDirty();
- ANGLE_TRY(releaseTexStorage(context));
- }
- }
-
- return gl::NoError();
-}
-
-gl::ImageIndexIterator TextureD3D_3D::imageIterator() const
-{
- return gl::ImageIndexIterator::Make3D(0, mTexStorage->getLevelCount(),
- gl::ImageIndex::ENTIRE_LEVEL, gl::ImageIndex::ENTIRE_LEVEL);
-}
-
-gl::ImageIndex TextureD3D_3D::getImageIndex(GLint mip, GLint /*layer*/) const
-{
- // The "layer" here does not apply to 3D images. We use one Image per mip.
- return gl::ImageIndex::Make3D(mip);
-}
-
-bool TextureD3D_3D::isValidIndex(const gl::ImageIndex &index) const
-{
- return (mTexStorage && index.type == GL_TEXTURE_3D &&
- index.mipIndex >= 0 && index.mipIndex < mTexStorage->getLevelCount());
-}
-
-void TextureD3D_3D::markAllImagesDirty()
-{
- for (int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
- {
- mImageArray[i]->markDirty();
- }
- mDirtyImages = true;
-}
-
-GLint TextureD3D_3D::getLevelZeroDepth() const
-{
- ASSERT(gl::CountLeadingZeros(static_cast<uint32_t>(getBaseLevelDepth())) > getBaseLevel());
- return getBaseLevelDepth() << getBaseLevel();
-}
-
-TextureD3D_2DArray::TextureD3D_2DArray(const gl::TextureState &state, RendererD3D *renderer)
- : TextureD3D(state, renderer)
-{
- for (int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; ++level)
- {
- mLayerCounts[level] = 0;
- mImageArray[level] = nullptr;
- }
-}
-
-gl::Error TextureD3D_2DArray::onDestroy(const gl::Context *context)
-{
- // Delete the Images before the TextureStorage. Images might be relying on the TextureStorage
- // for some of their data. If TextureStorage is deleted before the Images, then their data will
- // be wastefully copied back from the GPU before we delete the Images.
- deleteImages();
- return TextureD3D::onDestroy(context);
-}
-
-TextureD3D_2DArray::~TextureD3D_2DArray()
-{
-}
-
-ImageD3D *TextureD3D_2DArray::getImage(int level, int layer) const
-{
- ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- ASSERT((layer == 0 && mLayerCounts[level] == 0) ||
- layer < mLayerCounts[level]);
- return (mImageArray[level] ? mImageArray[level][layer] : nullptr);
-}
-
-ImageD3D *TextureD3D_2DArray::getImage(const gl::ImageIndex &index) const
-{
- ASSERT(index.mipIndex < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- ASSERT(index.layerIndex != gl::ImageIndex::ENTIRE_LEVEL);
- ASSERT((index.layerIndex == 0 && mLayerCounts[index.mipIndex] == 0) ||
- index.layerIndex < mLayerCounts[index.mipIndex]);
- ASSERT(index.type == GL_TEXTURE_2D_ARRAY);
- return (mImageArray[index.mipIndex] ? mImageArray[index.mipIndex][index.layerIndex] : nullptr);
-}
-
-GLsizei TextureD3D_2DArray::getLayerCount(int level) const
-{
- ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- return mLayerCounts[level];
-}
-
-GLsizei TextureD3D_2DArray::getWidth(GLint level) const
-{
- return (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS && mLayerCounts[level] > 0) ? mImageArray[level][0]->getWidth() : 0;
-}
-
-GLsizei TextureD3D_2DArray::getHeight(GLint level) const
-{
- return (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS && mLayerCounts[level] > 0) ? mImageArray[level][0]->getHeight() : 0;
-}
-
-GLenum TextureD3D_2DArray::getInternalFormat(GLint level) const
-{
- return (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS && mLayerCounts[level] > 0) ? mImageArray[level][0]->getInternalFormat() : GL_NONE;
-}
-
-bool TextureD3D_2DArray::isDepth(GLint level) const
-{
- return gl::GetSizedInternalFormatInfo(getInternalFormat(level)).depthBits > 0;
-}
-
-gl::Error TextureD3D_2DArray::setEGLImageTarget(const gl::Context *context,
- GLenum target,
- egl::Image *image)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_2DArray::setImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- GLenum internalFormat,
- const gl::Extents &size,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels)
-{
- ASSERT(target == GL_TEXTURE_2D_ARRAY);
-
- const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalFormat, type);
-
- GLint level = static_cast<GLint>(imageLevel);
- ANGLE_TRY(redefineImage(context, level, formatInfo.sizedInternalFormat, size, false));
-
- GLsizei inputDepthPitch = 0;
- ANGLE_TRY_RESULT(formatInfo.computeDepthPitch(type, size.width, size.height, unpack.alignment,
- unpack.rowLength, unpack.imageHeight),
- inputDepthPitch);
-
- for (int i = 0; i < size.depth; i++)
- {
- const ptrdiff_t layerOffset = (inputDepthPitch * i);
- gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, i);
- ANGLE_TRY(setImageImpl(context, index, type, unpack, pixels, layerOffset));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2DArray::setSubImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- const gl::Box &area,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels)
-{
- ASSERT(target == GL_TEXTURE_2D_ARRAY);
- GLint level = static_cast<GLint>(imageLevel);
- const gl::InternalFormat &formatInfo =
- gl::GetInternalFormatInfo(getInternalFormat(level), type);
- GLsizei inputDepthPitch = 0;
- ANGLE_TRY_RESULT(formatInfo.computeDepthPitch(type, area.width, area.height, unpack.alignment,
- unpack.rowLength, unpack.imageHeight),
- inputDepthPitch);
-
- for (int i = 0; i < area.depth; i++)
- {
- int layer = area.z + i;
- const ptrdiff_t layerOffset = (inputDepthPitch * i);
-
- gl::Box layerArea(area.x, area.y, 0, area.width, area.height, 1);
-
- gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, layer);
- ANGLE_TRY(TextureD3D::subImage(context, index, layerArea, format, type, unpack, pixels,
- layerOffset));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2DArray::setCompressedImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- GLenum internalFormat,
- const gl::Extents &size,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels)
-{
- ASSERT(target == GL_TEXTURE_2D_ARRAY);
-
- GLint level = static_cast<GLint>(imageLevel);
- // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly
- ANGLE_TRY(redefineImage(context, level, internalFormat, size, false));
-
- const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(internalFormat);
- GLsizei inputDepthPitch = 0;
- ANGLE_TRY_RESULT(
- formatInfo.computeDepthPitch(GL_UNSIGNED_BYTE, size.width, size.height, 1, 0, 0),
- inputDepthPitch);
-
- for (int i = 0; i < size.depth; i++)
- {
- const ptrdiff_t layerOffset = (inputDepthPitch * i);
-
- gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, i);
- ANGLE_TRY(setCompressedImageImpl(context, index, unpack, pixels, layerOffset));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2DArray::setCompressedSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels)
-{
- ASSERT(target == GL_TEXTURE_2D_ARRAY);
-
- const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(format);
- GLsizei inputDepthPitch = 0;
- ANGLE_TRY_RESULT(
- formatInfo.computeDepthPitch(GL_UNSIGNED_BYTE, area.width, area.height, 1, 0, 0),
- inputDepthPitch);
-
- for (int i = 0; i < area.depth; i++)
- {
- int layer = area.z + i;
- const ptrdiff_t layerOffset = (inputDepthPitch * i);
-
- gl::Box layerArea(area.x, area.y, 0, area.width, area.height, 1);
-
- gl::ImageIndex index = gl::ImageIndex::Make2DArray(static_cast<GLint>(level), layer);
- ANGLE_TRY(TextureD3D::subImageCompressed(context, index, layerArea, format, unpack, pixels,
- layerOffset));
- ANGLE_TRY(commitRegion(context, index, layerArea));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2DArray::copyImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Rectangle &sourceArea,
- GLenum internalFormat,
- const gl::Framebuffer *source)
-{
- UNIMPLEMENTED();
- return gl::InternalError() << "Copying 2D array textures is unimplemented.";
-}
-
-gl::Error TextureD3D_2DArray::copySubImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- const gl::Framebuffer *source)
-{
- ASSERT(target == GL_TEXTURE_2D_ARRAY);
-
- GLint level = static_cast<GLint>(imageLevel);
- gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, destOffset.z);
-
- gl::Extents fbSize = source->getReadColorbuffer()->getSize();
- gl::Rectangle clippedSourceArea;
- if (!ClipRectangle(sourceArea, gl::Rectangle(0, 0, fbSize.width, fbSize.height),
- &clippedSourceArea))
- {
- return gl::NoError();
- }
- const gl::Offset clippedDestOffset(destOffset.x + clippedSourceArea.x - sourceArea.x,
- destOffset.y + clippedSourceArea.y - sourceArea.y,
- destOffset.z);
-
- if (!canCreateRenderTargetForImage(index))
- {
- gl::Offset destLayerOffset(clippedDestOffset.x, clippedDestOffset.y, 0);
- ANGLE_TRY(mImageArray[level][clippedDestOffset.z]->copyFromFramebuffer(
- context, destLayerOffset, clippedSourceArea, source));
- mDirtyImages = true;
- }
- else
- {
- ANGLE_TRY(ensureRenderTarget(context));
-
- if (isValidLevel(level))
- {
- ANGLE_TRY(updateStorageLevel(context, level));
- ANGLE_TRY(
- mRenderer->copyImage2DArray(context, source, clippedSourceArea,
- gl::GetUnsizedFormat(getInternalFormat(getBaseLevel())),
- clippedDestOffset, mTexStorage, level));
- }
- }
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2DArray::setStorage(const gl::Context *context,
- GLenum target,
- size_t levels,
- GLenum internalFormat,
- const gl::Extents &size)
-{
- ASSERT(target == GL_TEXTURE_2D_ARRAY);
-
- deleteImages();
-
- for (size_t level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
- {
- gl::Extents levelLayerSize(std::max(1, size.width >> level),
- std::max(1, size.height >> level),
- 1);
-
- mLayerCounts[level] = (level < levels ? size.depth : 0);
-
- if (mLayerCounts[level] > 0)
- {
- // Create new images for this level
- mImageArray[level] = new ImageD3D*[mLayerCounts[level]];
-
- for (int layer = 0; layer < mLayerCounts[level]; layer++)
- {
- mImageArray[level][layer] = mRenderer->createImage();
- mImageArray[level][layer]->redefine(GL_TEXTURE_2D_ARRAY, internalFormat, levelLayerSize, true);
- }
- }
- }
-
- // TODO(geofflang): Verify storage creation had no errors
- bool renderTarget = IsRenderTargetUsage(mState.getUsage());
- TexStoragePointer storage(context);
- storage.reset(mRenderer->createTextureStorage2DArray(internalFormat, renderTarget, size.width,
- size.height, size.depth,
- static_cast<int>(levels)));
-
- ANGLE_TRY(setCompleteTexStorage(context, storage.get()));
- storage.release();
-
- ANGLE_TRY(updateStorage(context));
-
- mImmutable = true;
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2DArray::bindTexImage(const gl::Context *context, egl::Surface *surface)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_2DArray::releaseTexImage(const gl::Context *context)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_2DArray::initMipmapImages(const gl::Context *context)
-{
- const GLuint baseLevel = mState.getEffectiveBaseLevel();
- const GLuint maxLevel = mState.getMipmapMaxLevel();
- int baseWidth = getLevelZeroWidth();
- int baseHeight = getLevelZeroHeight();
- int baseDepth = getLayerCount(getBaseLevel());
- GLenum baseFormat = getBaseLevelInternalFormat();
-
- // Purge array levels baseLevel + 1 through q and reset them to represent the generated mipmap
- // levels.
- for (GLuint level = baseLevel + 1u; level <= maxLevel; level++)
- {
- ASSERT((baseWidth >> level) > 0 || (baseHeight >> level) > 0);
- gl::Extents levelLayerSize(std::max(baseWidth >> level, 1),
- std::max(baseHeight >> level, 1),
- baseDepth);
- ANGLE_TRY(redefineImage(context, level, baseFormat, levelLayerSize, false));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2DArray::getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT)
-{
- // ensure the underlying texture is created
- ANGLE_TRY(ensureRenderTarget(context));
- ANGLE_TRY(updateStorageLevel(context, index.mipIndex));
- return mTexStorage->getRenderTarget(context, index, outRT);
-}
-
-gl::Error TextureD3D_2DArray::initializeStorage(const gl::Context *context, bool renderTarget)
-{
- // Only initialize the first time this texture is used as a render target or shader resource
- if (mTexStorage)
- {
- return gl::NoError();
- }
-
- // do not attempt to create storage for nonexistant data
- if (!isLevelComplete(getBaseLevel()))
- {
- return gl::NoError();
- }
-
- bool createRenderTarget = (renderTarget || IsRenderTargetUsage(mState.getUsage()));
-
- TexStoragePointer storage(context);
- ANGLE_TRY(createCompleteStorage(createRenderTarget, &storage));
-
- ANGLE_TRY(setCompleteTexStorage(context, storage.get()));
- storage.release();
-
- ASSERT(mTexStorage);
-
- // flush image data to the storage
- ANGLE_TRY(updateStorage(context));
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2DArray::createCompleteStorage(bool renderTarget,
- TexStoragePointer *outStorage) const
-{
- GLsizei width = getLevelZeroWidth();
- GLsizei height = getLevelZeroHeight();
- GLsizei depth = getLayerCount(getBaseLevel());
- GLenum internalFormat = getBaseLevelInternalFormat();
-
- ASSERT(width > 0 && height > 0 && depth > 0);
-
- // use existing storage level count, when previously specified by TexStorage*D
- GLint levels = (mTexStorage ? mTexStorage->getLevelCount() : creationLevels(width, height, 1));
-
- // TODO(geofflang): Verify storage creation succeeds
- outStorage->reset(mRenderer->createTextureStorage2DArray(internalFormat, renderTarget, width,
- height, depth, levels));
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2DArray::setCompleteTexStorage(const gl::Context *context,
- TextureStorage *newCompleteTexStorage)
-{
- ANGLE_TRY(releaseTexStorage(context));
- mTexStorage = newCompleteTexStorage;
- mDirtyImages = true;
-
- // We do not support managed 2D array storage, as managed storage is ES2/D3D9 only
- ASSERT(!mTexStorage->isManaged());
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2DArray::updateStorage(const gl::Context *context)
-{
- if (!mDirtyImages)
- {
- return gl::NoError();
- }
-
- ASSERT(mTexStorage != nullptr);
- GLint storageLevels = mTexStorage->getLevelCount();
- for (int level = 0; level < storageLevels; level++)
- {
- if (isLevelComplete(level))
- {
- ANGLE_TRY(updateStorageLevel(context, level));
- }
- }
-
- mDirtyImages = false;
- return gl::NoError();
-}
-
-bool TextureD3D_2DArray::isValidLevel(int level) const
-{
- return (mTexStorage ? (level >= 0 && level < mTexStorage->getLevelCount()) : 0);
-}
-
-bool TextureD3D_2DArray::isLevelComplete(int level) const
-{
- ASSERT(level >= 0 && level < (int)ArraySize(mImageArray));
-
- if (isImmutable())
- {
- return true;
- }
-
- GLsizei width = getLevelZeroWidth();
- GLsizei height = getLevelZeroHeight();
-
- if (width <= 0 || height <= 0)
- {
- return false;
- }
-
- // Layers check needs to happen after the above checks, otherwise out-of-range base level may be
- // queried.
- GLsizei layers = getLayerCount(getBaseLevel());
-
- if (layers <= 0)
- {
- return false;
- }
-
- if (level == static_cast<int>(getBaseLevel()))
- {
- return true;
- }
-
- if (getInternalFormat(level) != getInternalFormat(getBaseLevel()))
- {
- return false;
- }
-
- if (getWidth(level) != std::max(1, width >> level))
- {
- return false;
- }
-
- if (getHeight(level) != std::max(1, height >> level))
- {
- return false;
- }
-
- if (getLayerCount(level) != layers)
- {
- return false;
- }
-
- return true;
-}
-
-bool TextureD3D_2DArray::isImageComplete(const gl::ImageIndex &index) const
-{
- return isLevelComplete(index.mipIndex);
-}
-
-gl::Error TextureD3D_2DArray::updateStorageLevel(const gl::Context *context, int level)
-{
- ASSERT(level >= 0 && level < static_cast<int>(ArraySize(mLayerCounts)));
- ASSERT(isLevelComplete(level));
-
- for (int layer = 0; layer < mLayerCounts[level]; layer++)
- {
- ASSERT(mImageArray[level] != nullptr && mImageArray[level][layer] != nullptr);
- if (mImageArray[level][layer]->isDirty())
- {
- gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, layer);
- gl::Box region(0, 0, 0, getWidth(level), getHeight(level), 1);
- ANGLE_TRY(commitRegion(context, index, region));
- }
- }
-
- return gl::NoError();
-}
-
-void TextureD3D_2DArray::deleteImages()
-{
- for (int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; ++level)
- {
- for (int layer = 0; layer < mLayerCounts[level]; ++layer)
- {
- delete mImageArray[level][layer];
- }
- delete[] mImageArray[level];
- mImageArray[level] = nullptr;
- mLayerCounts[level] = 0;
- }
-}
-
-gl::Error TextureD3D_2DArray::redefineImage(const gl::Context *context,
- GLint level,
- GLenum internalformat,
- const gl::Extents &size,
- bool forceRelease)
-{
- // If there currently is a corresponding storage texture image, it has these parameters
- const int storageWidth = std::max(1, getLevelZeroWidth() >> level);
- const int storageHeight = std::max(1, getLevelZeroHeight() >> level);
- const GLuint baseLevel = getBaseLevel();
- int storageDepth = 0;
- if (baseLevel < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
- {
- storageDepth = getLayerCount(baseLevel);
- }
-
- // Only reallocate the layers if the size doesn't match
- if (size.depth != mLayerCounts[level])
- {
- for (int layer = 0; layer < mLayerCounts[level]; layer++)
- {
- SafeDelete(mImageArray[level][layer]);
- }
- SafeDeleteArray(mImageArray[level]);
- mLayerCounts[level] = size.depth;
-
- if (size.depth > 0)
- {
- mImageArray[level] = new ImageD3D*[size.depth];
- for (int layer = 0; layer < mLayerCounts[level]; layer++)
- {
- mImageArray[level][layer] = mRenderer->createImage();
- }
- }
- }
-
- if (size.depth > 0)
- {
- for (int layer = 0; layer < mLayerCounts[level]; layer++)
- {
- mImageArray[level][layer]->redefine(GL_TEXTURE_2D_ARRAY, internalformat,
- gl::Extents(size.width, size.height, 1),
- forceRelease);
- mDirtyImages = mDirtyImages || mImageArray[level][layer]->isDirty();
- }
- }
-
- if (mTexStorage)
- {
- const GLenum storageFormat = getBaseLevelInternalFormat();
- const int storageLevels = mTexStorage->getLevelCount();
-
- if ((level >= storageLevels && storageLevels != 0) || size.width != storageWidth ||
- size.height != storageHeight || size.depth != storageDepth ||
- internalformat != storageFormat) // Discard mismatched storage
- {
- markAllImagesDirty();
- ANGLE_TRY(releaseTexStorage(context));
- }
- }
-
- return gl::NoError();
-}
-
-gl::ImageIndexIterator TextureD3D_2DArray::imageIterator() const
-{
- return gl::ImageIndexIterator::Make2DArray(0, mTexStorage->getLevelCount(), mLayerCounts);
-}
-
-gl::ImageIndex TextureD3D_2DArray::getImageIndex(GLint mip, GLint layer) const
-{
- return gl::ImageIndex::Make2DArray(mip, layer);
-}
-
-bool TextureD3D_2DArray::isValidIndex(const gl::ImageIndex &index) const
-{
- // Check for having a storage and the right type of index
- if (!mTexStorage || index.type != GL_TEXTURE_2D_ARRAY)
- {
- return false;
- }
-
- // Check the mip index
- if (index.mipIndex < 0 || index.mipIndex >= mTexStorage->getLevelCount())
- {
- return false;
- }
-
- // Check the layer index
- return (!index.hasLayer() || (index.layerIndex >= 0 && index.layerIndex < mLayerCounts[index.mipIndex]));
-}
-
-void TextureD3D_2DArray::markAllImagesDirty()
-{
- for (int dirtyLevel = 0; dirtyLevel < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; dirtyLevel++)
- {
- for (int dirtyLayer = 0; dirtyLayer < mLayerCounts[dirtyLevel]; dirtyLayer++)
- {
- mImageArray[dirtyLevel][dirtyLayer]->markDirty();
- }
- }
- mDirtyImages = true;
-}
-
-TextureD3D_External::TextureD3D_External(const gl::TextureState &state, RendererD3D *renderer)
- : TextureD3D(state, renderer)
-{
-}
-
-TextureD3D_External::~TextureD3D_External()
-{
-}
-
-ImageD3D *TextureD3D_External::getImage(const gl::ImageIndex &index) const
-{
- UNREACHABLE();
- return nullptr;
-}
-
-GLsizei TextureD3D_External::getLayerCount(int level) const
-{
- return 1;
-}
-
-gl::Error TextureD3D_External::setImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- GLenum internalFormat,
- const gl::Extents &size,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels)
-{
- // Image setting is not supported for external images
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_External::setSubImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- const gl::Box &area,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_External::setCompressedImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- GLenum internalFormat,
- const gl::Extents &size,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_External::setCompressedSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_External::copyImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- const gl::Rectangle &sourceArea,
- GLenum internalFormat,
- const gl::Framebuffer *source)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_External::copySubImage(const gl::Context *context,
- GLenum target,
- size_t imageLevel,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- const gl::Framebuffer *source)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_External::setStorage(const gl::Context *context,
- GLenum target,
- size_t levels,
- GLenum internalFormat,
- const gl::Extents &size)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_External::setImageExternal(const gl::Context *context,
- GLenum target,
- egl::Stream *stream,
- const egl::Stream::GLTextureDescription &desc)
-{
- ASSERT(target == GL_TEXTURE_EXTERNAL_OES);
-
- ANGLE_TRY(releaseTexStorage(context));
-
- // If the stream is null, the external image is unbound and we release the storage
- if (stream != nullptr)
- {
- mTexStorage = mRenderer->createTextureStorageExternal(stream, desc);
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_External::bindTexImage(const gl::Context *context, egl::Surface *surface)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_External::releaseTexImage(const gl::Context *context)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_External::setEGLImageTarget(const gl::Context *context,
- GLenum target,
- egl::Image *image)
-{
- EGLImageD3D *eglImaged3d = GetImplAs<EGLImageD3D>(image);
-
- // Pass in the RenderTargetD3D here: createTextureStorage can't generate an error.
- RenderTargetD3D *renderTargetD3D = nullptr;
- ANGLE_TRY(eglImaged3d->getRenderTarget(context, &renderTargetD3D));
-
- ANGLE_TRY(releaseTexStorage(context));
- mTexStorage = mRenderer->createTextureStorageEGLImage(eglImaged3d, renderTargetD3D);
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_External::initMipmapImages(const gl::Context *context)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_External::getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-bool TextureD3D_External::isImageComplete(const gl::ImageIndex &index) const
-{
- return (index.mipIndex == 0) ? (mTexStorage != nullptr) : false;
-}
-
-gl::Error TextureD3D_External::initializeStorage(const gl::Context *context, bool renderTarget)
-{
- // Texture storage is created when an external image is bound
- ASSERT(mTexStorage);
- return gl::NoError();
-}
-
-gl::Error TextureD3D_External::createCompleteStorage(bool renderTarget,
- TexStoragePointer *outStorage) const
-{
- UNREACHABLE();
- return gl::NoError();
-}
-
-gl::Error TextureD3D_External::setCompleteTexStorage(const gl::Context *context,
- TextureStorage *newCompleteTexStorage)
-{
- UNREACHABLE();
- return gl::NoError();
-}
-
-gl::Error TextureD3D_External::updateStorage(const gl::Context *context)
-{
- // Texture storage does not need to be updated since it is already loaded with the latest
- // external image
- ASSERT(mTexStorage);
- return gl::NoError();
-}
-
-gl::ImageIndexIterator TextureD3D_External::imageIterator() const
-{
- return gl::ImageIndexIterator::Make2D(0, mTexStorage->getLevelCount());
-}
-
-gl::ImageIndex TextureD3D_External::getImageIndex(GLint mip, GLint /*layer*/) const
-{
- // "layer" does not apply to 2D Textures.
- return gl::ImageIndex::Make2D(mip);
-}
-
-bool TextureD3D_External::isValidIndex(const gl::ImageIndex &index) const
-{
- return (mTexStorage && index.type == GL_TEXTURE_EXTERNAL_OES && index.mipIndex == 0);
-}
-
-void TextureD3D_External::markAllImagesDirty()
-{
- UNREACHABLE();
-}
-
-TextureD3D_2DMultisample::TextureD3D_2DMultisample(const gl::TextureState &state,
- RendererD3D *renderer)
- : TextureD3D(state, renderer)
-{
-}
-
-TextureD3D_2DMultisample::~TextureD3D_2DMultisample()
-{
-}
-
-ImageD3D *TextureD3D_2DMultisample::getImage(const gl::ImageIndex &index) const
-{
- return nullptr;
-}
-
-gl::Error TextureD3D_2DMultisample::setImage(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_2DMultisample::setSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_2DMultisample::setCompressedImage(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_2DMultisample::setCompressedSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_2DMultisample::copyImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Rectangle &sourceArea,
- GLenum internalFormat,
- const gl::Framebuffer *source)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_2DMultisample::copySubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- const gl::Framebuffer *source)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_2DMultisample::setStorageMultisample(const gl::Context *context,
- GLenum target,
- GLsizei samples,
- GLint internalFormat,
- const gl::Extents &size,
- bool fixedSampleLocations)
-{
- ASSERT(target == GL_TEXTURE_2D_MULTISAMPLE && size.depth == 1);
-
- TexStoragePointer storage(context);
- storage.reset(mRenderer->createTextureStorage2DMultisample(internalFormat, size.width,
- size.height, static_cast<int>(0),
- samples, fixedSampleLocations));
-
- ANGLE_TRY(setCompleteTexStorage(context, storage.get()));
- storage.release();
-
- ANGLE_TRY(updateStorage(context));
-
- mImmutable = false;
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2DMultisample::bindTexImage(const gl::Context *context, egl::Surface *surface)
-{
- UNREACHABLE();
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2DMultisample::releaseTexImage(const gl::Context *context)
-{
- UNREACHABLE();
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2DMultisample::setEGLImageTarget(const gl::Context *context,
- GLenum target,
- egl::Image *image)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_2DMultisample::getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT)
-{
- ASSERT(!index.hasLayer());
-
- // ensure the underlying texture is created
- ANGLE_TRY(ensureRenderTarget(context));
-
- return mTexStorage->getRenderTarget(context, index, outRT);
-}
-
-gl::ImageIndexIterator TextureD3D_2DMultisample::imageIterator() const
-{
- return gl::ImageIndexIterator::Make2DMultisample();
-}
-
-gl::ImageIndex TextureD3D_2DMultisample::getImageIndex(GLint mip, GLint layer) const
-{
- return gl::ImageIndex::Make2DMultisample();
-}
-
-bool TextureD3D_2DMultisample::isValidIndex(const gl::ImageIndex &index) const
-{
- return (mTexStorage && index.type == GL_TEXTURE_2D_MULTISAMPLE && index.mipIndex == 0);
-}
-
-GLsizei TextureD3D_2DMultisample::getLayerCount(int level) const
-{
- return 1;
-}
-
-void TextureD3D_2DMultisample::markAllImagesDirty()
-{
-}
-
-gl::Error TextureD3D_2DMultisample::initializeStorage(const gl::Context *context, bool renderTarget)
-{
- // Only initialize the first time this texture is used as a render target or shader resource
- if (mTexStorage)
- {
- return gl::NoError();
- }
-
- bool createRenderTarget = (renderTarget || IsRenderTargetUsage(mState.getUsage()));
-
- TexStoragePointer storage(context);
- ANGLE_TRY(createCompleteStorage(createRenderTarget, &storage));
-
- ANGLE_TRY(setCompleteTexStorage(context, storage.get()));
- storage.release();
-
- ASSERT(mTexStorage);
-
- // flush image data to the storage
- ANGLE_TRY(updateStorage(context));
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2DMultisample::createCompleteStorage(bool renderTarget,
- TexStoragePointer *outStorage) const
-{
- outStorage->reset(mTexStorage);
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2DMultisample::setCompleteTexStorage(const gl::Context *context,
- TextureStorage *newCompleteTexStorage)
-{
- ANGLE_TRY(releaseTexStorage(context));
- mTexStorage = newCompleteTexStorage;
-
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2DMultisample::updateStorage(const gl::Context *context)
-{
- return gl::NoError();
-}
-
-gl::Error TextureD3D_2DMultisample::initMipmapImages(const gl::Context *context)
-{
- UNIMPLEMENTED();
- return gl::NoError();
-}
-
-bool TextureD3D_2DMultisample::isImageComplete(const gl::ImageIndex &index) const
-{
- return true;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureD3D.h
deleted file mode 100644
index eb206a6ccc..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureD3D.h
+++ /dev/null
@@ -1,891 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// TextureD3D.h: Implementations of the Texture interfaces shared betweeen the D3D backends.
-
-#ifndef LIBANGLE_RENDERER_D3D_TEXTURED3D_H_
-#define LIBANGLE_RENDERER_D3D_TEXTURED3D_H_
-
-#include "common/Color.h"
-#include "libANGLE/Constants.h"
-#include "libANGLE/Stream.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/renderer/TextureImpl.h"
-#include "libANGLE/renderer/d3d/TextureStorage.h"
-
-namespace gl
-{
-class Framebuffer;
-}
-
-namespace rx
-{
-class EGLImageD3D;
-class ImageD3D;
-class RendererD3D;
-class RenderTargetD3D;
-class TextureStorage;
-
-template <typename T>
-using TexLevelsArray = std::array<T, gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS>;
-
-class TextureD3D : public TextureImpl
-{
- public:
- TextureD3D(const gl::TextureState &data, RendererD3D *renderer);
- ~TextureD3D() override;
-
- gl::Error onDestroy(const gl::Context *context) override;
-
- gl::Error getNativeTexture(const gl::Context *context, TextureStorage **outStorage);
-
- bool hasDirtyImages() const { return mDirtyImages; }
- void resetDirty() { mDirtyImages = false; }
-
- virtual ImageD3D *getImage(const gl::ImageIndex &index) const = 0;
- virtual GLsizei getLayerCount(int level) const = 0;
-
- gl::Error getImageAndSyncFromStorage(const gl::Context *context,
- const gl::ImageIndex &index,
- ImageD3D **outImage);
-
- GLint getBaseLevelWidth() const;
- GLint getBaseLevelHeight() const;
- GLenum getBaseLevelInternalFormat() const;
-
- gl::Error setStorage(const gl::Context *context,
- GLenum target,
- size_t levels,
- GLenum internalFormat,
- const gl::Extents &size) override;
-
- gl::Error setStorageMultisample(const gl::Context *context,
- GLenum target,
- GLsizei samples,
- GLint internalFormat,
- const gl::Extents &size,
- bool fixedSampleLocations) override;
-
- bool isImmutable() const { return mImmutable; }
-
- virtual gl::Error getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT) = 0;
-
- // Returns an iterator over all "Images" for this particular Texture.
- virtual gl::ImageIndexIterator imageIterator() const = 0;
-
- // Returns an ImageIndex for a particular "Image". 3D Textures do not have images for
- // slices of their depth texures, so 3D textures ignore the layer parameter.
- virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const = 0;
- virtual bool isValidIndex(const gl::ImageIndex &index) const = 0;
-
- gl::Error setImageExternal(const gl::Context *context,
- GLenum target,
- egl::Stream *stream,
- const egl::Stream::GLTextureDescription &desc) override;
- gl::Error generateMipmap(const gl::Context *context) override;
- TextureStorage *getStorage();
- ImageD3D *getBaseLevelImage() const;
-
- gl::Error getAttachmentRenderTarget(const gl::Context *context,
- GLenum binding,
- const gl::ImageIndex &imageIndex,
- FramebufferAttachmentRenderTarget **rtOut) override;
-
- gl::Error setBaseLevel(const gl::Context *context, GLuint baseLevel) override;
-
- void syncState(const gl::Texture::DirtyBits &dirtyBits) override;
-
- gl::Error initializeContents(const gl::Context *context,
- const gl::ImageIndex &imageIndex) override;
-
- protected:
- gl::Error setImageImpl(const gl::Context *context,
- const gl::ImageIndex &index,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels,
- ptrdiff_t layerOffset);
- gl::Error subImage(const gl::Context *context,
- const gl::ImageIndex &index,
- const gl::Box &area,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels,
- ptrdiff_t layerOffset);
- gl::Error setCompressedImageImpl(const gl::Context *context,
- const gl::ImageIndex &index,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels,
- ptrdiff_t layerOffset);
- gl::Error subImageCompressed(const gl::Context *context,
- const gl::ImageIndex &index,
- const gl::Box &area,
- GLenum format,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels,
- ptrdiff_t layerOffset);
- bool isFastUnpackable(const gl::Buffer *unpackBuffer, GLenum sizedInternalFormat);
- gl::Error fastUnpackPixels(const gl::Context *context,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels,
- const gl::Box &destArea,
- GLenum sizedInternalFormat,
- GLenum type,
- RenderTargetD3D *destRenderTarget);
-
- GLint getLevelZeroWidth() const;
- GLint getLevelZeroHeight() const;
- virtual GLint getLevelZeroDepth() const;
-
- GLint creationLevels(GLsizei width, GLsizei height, GLsizei depth) const;
- virtual gl::Error initMipmapImages(const gl::Context *context) = 0;
- bool isBaseImageZeroSize() const;
- virtual bool isImageComplete(const gl::ImageIndex &index) const = 0;
-
- bool canCreateRenderTargetForImage(const gl::ImageIndex &index) const;
- gl::Error ensureRenderTarget(const gl::Context *context);
-
- virtual gl::Error createCompleteStorage(bool renderTarget,
- TexStoragePointer *outTexStorage) const = 0;
- virtual gl::Error setCompleteTexStorage(const gl::Context *context,
- TextureStorage *newCompleteTexStorage) = 0;
- gl::Error commitRegion(const gl::Context *context,
- const gl::ImageIndex &index,
- const gl::Box &region);
-
- gl::Error releaseTexStorage(const gl::Context *context);
-
- GLuint getBaseLevel() const { return mBaseLevel; };
-
- virtual void markAllImagesDirty() = 0;
-
- GLint getBaseLevelDepth() const;
-
- RendererD3D *mRenderer;
-
- bool mDirtyImages;
-
- bool mImmutable;
- TextureStorage *mTexStorage;
-
- private:
- virtual gl::Error initializeStorage(const gl::Context *context, bool renderTarget) = 0;
-
- virtual gl::Error updateStorage(const gl::Context *context) = 0;
-
- bool shouldUseSetData(const ImageD3D *image) const;
-
- gl::Error generateMipmapUsingImages(const gl::Context *context, const GLuint maxLevel);
-
- GLuint mBaseLevel;
-};
-
-class TextureD3D_2D : public TextureD3D
-{
- public:
- TextureD3D_2D(const gl::TextureState &data, RendererD3D *renderer);
- ~TextureD3D_2D() override;
-
- gl::Error onDestroy(const gl::Context *context) override;
-
- ImageD3D *getImage(int level, int layer) const;
- ImageD3D *getImage(const gl::ImageIndex &index) const override;
- GLsizei getLayerCount(int level) const override;
-
- GLsizei getWidth(GLint level) const;
- GLsizei getHeight(GLint level) const;
- GLenum getInternalFormat(GLint level) const;
- bool isDepth(GLint level) const;
- bool isSRGB(GLint level) const;
-
- gl::Error setImage(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels) override;
- gl::Error setSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels) override;
-
- gl::Error setCompressedImage(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels) override;
- gl::Error setCompressedSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels) override;
-
- gl::Error copyImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Rectangle &sourceArea,
- GLenum internalFormat,
- const gl::Framebuffer *source) override;
- gl::Error copySubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- const gl::Framebuffer *source) override;
-
- gl::Error copyTexture(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- GLenum type,
- size_t sourceLevel,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- const gl::Texture *source) override;
- gl::Error copySubTexture(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Offset &destOffset,
- size_t sourceLevel,
- const gl::Rectangle &sourceArea,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- const gl::Texture *source) override;
- gl::Error copyCompressedTexture(const gl::Context *context, const gl::Texture *source) override;
-
- gl::Error setStorage(const gl::Context *context,
- GLenum target,
- size_t levels,
- GLenum internalFormat,
- const gl::Extents &size) override;
-
- gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
- gl::Error releaseTexImage(const gl::Context *context) override;
-
- gl::Error setEGLImageTarget(const gl::Context *context,
- GLenum target,
- egl::Image *image) override;
-
- gl::Error getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT) override;
-
- gl::ImageIndexIterator imageIterator() const override;
- gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override;
- bool isValidIndex(const gl::ImageIndex &index) const override;
-
- protected:
- void markAllImagesDirty() override;
-
- private:
- gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override;
- gl::Error createCompleteStorage(bool renderTarget,
- TexStoragePointer *outTexStorage) const override;
- gl::Error setCompleteTexStorage(const gl::Context *context,
- TextureStorage *newCompleteTexStorage) override;
-
- gl::Error updateStorage(const gl::Context *context) override;
- gl::Error initMipmapImages(const gl::Context *context) override;
-
- bool isValidLevel(int level) const;
- bool isLevelComplete(int level) const;
- bool isImageComplete(const gl::ImageIndex &index) const override;
-
- gl::Error updateStorageLevel(const gl::Context *context, int level);
-
- gl::Error redefineImage(const gl::Context *context,
- size_t level,
- GLenum internalformat,
- const gl::Extents &size,
- bool forceRelease);
-
- bool mEGLImageTarget;
- TexLevelsArray<std::unique_ptr<ImageD3D>> mImageArray;
-};
-
-class TextureD3D_Cube : public TextureD3D
-{
- public:
- TextureD3D_Cube(const gl::TextureState &data, RendererD3D *renderer);
- ~TextureD3D_Cube() override;
-
- gl::Error onDestroy(const gl::Context *context) override;
-
- ImageD3D *getImage(int level, int layer) const;
- ImageD3D *getImage(const gl::ImageIndex &index) const override;
- GLsizei getLayerCount(int level) const override;
-
- GLenum getInternalFormat(GLint level, GLint layer) const;
- bool isDepth(GLint level, GLint layer) const;
- bool isSRGB(GLint level, GLint layer) const;
-
- gl::Error setImage(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels) override;
- gl::Error setSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels) override;
-
- gl::Error setCompressedImage(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels) override;
- gl::Error setCompressedSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels) override;
-
- gl::Error copyImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Rectangle &sourceArea,
- GLenum internalFormat,
- const gl::Framebuffer *source) override;
- gl::Error copySubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- const gl::Framebuffer *source) override;
-
- gl::Error copyTexture(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- GLenum type,
- size_t sourceLevel,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- const gl::Texture *source) override;
- gl::Error copySubTexture(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Offset &destOffset,
- size_t sourceLevel,
- const gl::Rectangle &sourceArea,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- const gl::Texture *source) override;
-
- gl::Error setStorage(const gl::Context *context,
- GLenum target,
- size_t levels,
- GLenum internalFormat,
- const gl::Extents &size) override;
-
- gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
- gl::Error releaseTexImage(const gl::Context *context) override;
-
- gl::Error setEGLImageTarget(const gl::Context *context,
- GLenum target,
- egl::Image *image) override;
-
- gl::Error getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT) override;
-
- gl::ImageIndexIterator imageIterator() const override;
- gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override;
- bool isValidIndex(const gl::ImageIndex &index) const override;
-
- protected:
- void markAllImagesDirty() override;
-
- private:
- gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override;
- gl::Error createCompleteStorage(bool renderTarget,
- TexStoragePointer *outTexStorage) const override;
- gl::Error setCompleteTexStorage(const gl::Context *context,
- TextureStorage *newCompleteTexStorage) override;
-
- gl::Error updateStorage(const gl::Context *context) override;
- gl::Error initMipmapImages(const gl::Context *context) override;
-
- bool isValidFaceLevel(int faceIndex, int level) const;
- bool isFaceLevelComplete(int faceIndex, int level) const;
- bool isCubeComplete() const;
- bool isImageComplete(const gl::ImageIndex &index) const override;
- gl::Error updateStorageFaceLevel(const gl::Context *context, int faceIndex, int level);
-
- gl::Error redefineImage(const gl::Context *context,
- int faceIndex,
- GLint level,
- GLenum internalformat,
- const gl::Extents &size,
- bool forceRelease);
-
- std::array<TexLevelsArray<std::unique_ptr<ImageD3D>>, 6> mImageArray;
-};
-
-class TextureD3D_3D : public TextureD3D
-{
- public:
- TextureD3D_3D(const gl::TextureState &data, RendererD3D *renderer);
- ~TextureD3D_3D() override;
-
- gl::Error onDestroy(const gl::Context *context) override;
-
- ImageD3D *getImage(int level, int layer) const;
- ImageD3D *getImage(const gl::ImageIndex &index) const override;
- GLsizei getLayerCount(int level) const override;
-
- GLsizei getWidth(GLint level) const;
- GLsizei getHeight(GLint level) const;
- GLsizei getDepth(GLint level) const;
- GLenum getInternalFormat(GLint level) const;
- bool isDepth(GLint level) const;
-
- gl::Error setImage(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels) override;
- gl::Error setSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels) override;
-
- gl::Error setCompressedImage(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels) override;
- gl::Error setCompressedSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels) override;
-
- gl::Error copyImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Rectangle &sourceArea,
- GLenum internalFormat,
- const gl::Framebuffer *source) override;
- gl::Error copySubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- const gl::Framebuffer *source) override;
-
- gl::Error setStorage(const gl::Context *context,
- GLenum target,
- size_t levels,
- GLenum internalFormat,
- const gl::Extents &size) override;
-
- gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
- gl::Error releaseTexImage(const gl::Context *context) override;
-
- gl::Error setEGLImageTarget(const gl::Context *context,
- GLenum target,
- egl::Image *image) override;
-
- gl::Error getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT) override;
-
- gl::ImageIndexIterator imageIterator() const override;
- gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override;
- bool isValidIndex(const gl::ImageIndex &index) const override;
-
- protected:
- void markAllImagesDirty() override;
- GLint getLevelZeroDepth() const override;
-
- private:
- gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override;
- gl::Error createCompleteStorage(bool renderTarget,
- TexStoragePointer *outStorage) const override;
- gl::Error setCompleteTexStorage(const gl::Context *context,
- TextureStorage *newCompleteTexStorage) override;
-
- gl::Error updateStorage(const gl::Context *context) override;
- gl::Error initMipmapImages(const gl::Context *context) override;
-
- bool isValidLevel(int level) const;
- bool isLevelComplete(int level) const;
- bool isImageComplete(const gl::ImageIndex &index) const override;
- gl::Error updateStorageLevel(const gl::Context *context, int level);
-
- gl::Error redefineImage(const gl::Context *context,
- GLint level,
- GLenum internalformat,
- const gl::Extents &size,
- bool forceRelease);
-
- TexLevelsArray<std::unique_ptr<ImageD3D>> mImageArray;
-};
-
-class TextureD3D_2DArray : public TextureD3D
-{
- public:
- TextureD3D_2DArray(const gl::TextureState &data, RendererD3D *renderer);
- ~TextureD3D_2DArray() override;
-
- gl::Error onDestroy(const gl::Context *context) override;
-
- virtual ImageD3D *getImage(int level, int layer) const;
- ImageD3D *getImage(const gl::ImageIndex &index) const override;
- GLsizei getLayerCount(int level) const override;
-
- GLsizei getWidth(GLint level) const;
- GLsizei getHeight(GLint level) const;
- GLenum getInternalFormat(GLint level) const;
- bool isDepth(GLint level) const;
-
- gl::Error setImage(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels) override;
- gl::Error setSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels) override;
-
- gl::Error setCompressedImage(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels) override;
- gl::Error setCompressedSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels) override;
-
- gl::Error copyImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Rectangle &sourceArea,
- GLenum internalFormat,
- const gl::Framebuffer *source) override;
- gl::Error copySubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- const gl::Framebuffer *source) override;
-
- gl::Error setStorage(const gl::Context *context,
- GLenum target,
- size_t levels,
- GLenum internalFormat,
- const gl::Extents &size) override;
-
- gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
- gl::Error releaseTexImage(const gl::Context *context) override;
-
- gl::Error setEGLImageTarget(const gl::Context *context,
- GLenum target,
- egl::Image *image) override;
-
- gl::Error getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT) override;
-
- gl::ImageIndexIterator imageIterator() const override;
- gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override;
- bool isValidIndex(const gl::ImageIndex &index) const override;
-
- protected:
- void markAllImagesDirty() override;
-
- private:
- gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override;
- gl::Error createCompleteStorage(bool renderTarget,
- TexStoragePointer *outStorage) const override;
- gl::Error setCompleteTexStorage(const gl::Context *context,
- TextureStorage *newCompleteTexStorage) override;
-
- gl::Error updateStorage(const gl::Context *context) override;
- gl::Error initMipmapImages(const gl::Context *context) override;
-
- bool isValidLevel(int level) const;
- bool isLevelComplete(int level) const;
- bool isImageComplete(const gl::ImageIndex &index) const override;
- gl::Error updateStorageLevel(const gl::Context *context, int level);
-
- void deleteImages();
- gl::Error redefineImage(const gl::Context *context,
- GLint level,
- GLenum internalformat,
- const gl::Extents &size,
- bool forceRelease);
-
- // Storing images as an array of single depth textures since D3D11 treats each array level of a
- // Texture2D object as a separate subresource. Each layer would have to be looped over
- // to update all the texture layers since they cannot all be updated at once and it makes the most
- // sense for the Image class to not have to worry about layer subresource as well as mip subresources.
- GLsizei mLayerCounts[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
- ImageD3D **mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
-};
-
-class TextureD3D_External : public TextureD3D
-{
- public:
- TextureD3D_External(const gl::TextureState &data, RendererD3D *renderer);
- ~TextureD3D_External() override;
-
- ImageD3D *getImage(const gl::ImageIndex &index) const override;
- GLsizei getLayerCount(int level) const override;
-
- gl::Error setImage(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels) override;
- gl::Error setSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels) override;
-
- gl::Error setCompressedImage(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels) override;
- gl::Error setCompressedSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels) override;
-
- gl::Error copyImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Rectangle &sourceArea,
- GLenum internalFormat,
- const gl::Framebuffer *source) override;
- gl::Error copySubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- const gl::Framebuffer *source) override;
-
- gl::Error setStorage(const gl::Context *context,
- GLenum target,
- size_t levels,
- GLenum internalFormat,
- const gl::Extents &size) override;
-
- gl::Error setImageExternal(const gl::Context *context,
- GLenum target,
- egl::Stream *stream,
- const egl::Stream::GLTextureDescription &desc) override;
-
- gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
- gl::Error releaseTexImage(const gl::Context *context) override;
-
- gl::Error setEGLImageTarget(const gl::Context *context,
- GLenum target,
- egl::Image *image) override;
-
- gl::Error getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT) override;
-
- gl::ImageIndexIterator imageIterator() const override;
- gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override;
- bool isValidIndex(const gl::ImageIndex &index) const override;
-
- protected:
- void markAllImagesDirty() override;
-
- private:
- gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override;
- gl::Error createCompleteStorage(bool renderTarget,
- TexStoragePointer *outTexStorage) const override;
- gl::Error setCompleteTexStorage(const gl::Context *context,
- TextureStorage *newCompleteTexStorage) override;
-
- gl::Error updateStorage(const gl::Context *context) override;
- gl::Error initMipmapImages(const gl::Context *context) override;
-
- bool isImageComplete(const gl::ImageIndex &index) const override;
-};
-
-class TextureD3D_2DMultisample : public TextureD3D
-{
- public:
- TextureD3D_2DMultisample(const gl::TextureState &data, RendererD3D *renderer);
- ~TextureD3D_2DMultisample() override;
-
- ImageD3D *getImage(const gl::ImageIndex &index) const override;
- gl::Error setImage(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels) override;
- gl::Error setSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels) override;
-
- gl::Error setCompressedImage(const gl::Context *context,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels) override;
- gl::Error setCompressedSubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels) override;
-
- gl::Error copyImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Rectangle &sourceArea,
- GLenum internalFormat,
- const gl::Framebuffer *source) override;
- gl::Error copySubImage(const gl::Context *context,
- GLenum target,
- size_t level,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- const gl::Framebuffer *source) override;
-
- gl::Error setStorageMultisample(const gl::Context *context,
- GLenum target,
- GLsizei samples,
- GLint internalFormat,
- const gl::Extents &size,
- bool fixedSampleLocations) override;
-
- gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
- gl::Error releaseTexImage(const gl::Context *context) override;
-
- gl::Error setEGLImageTarget(const gl::Context *context,
- GLenum target,
- egl::Image *image) override;
-
- gl::Error getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT) override;
-
- gl::ImageIndexIterator imageIterator() const override;
- gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override;
- bool isValidIndex(const gl::ImageIndex &index) const override;
-
- GLsizei getLayerCount(int level) const override;
-
- protected:
- void markAllImagesDirty() override;
-
- private:
- gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override;
- gl::Error createCompleteStorage(bool renderTarget,
- TexStoragePointer *outTexStorage) const override;
- gl::Error setCompleteTexStorage(const gl::Context *context,
- TextureStorage *newCompleteTexStorage) override;
-
- gl::Error updateStorage(const gl::Context *context) override;
- gl::Error initMipmapImages(const gl::Context *context) override;
-
- bool isImageComplete(const gl::ImageIndex &index) const override;
-};
-}
-
-#endif // LIBANGLE_RENDERER_D3D_TEXTURED3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureStorage.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureStorage.h
deleted file mode 100644
index 383fbc2141..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/TextureStorage.h
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// TextureStorage.h: Defines the abstract rx::TextureStorage class.
-
-#ifndef LIBANGLE_RENDERER_D3D_TEXTURESTORAGE_H_
-#define LIBANGLE_RENDERER_D3D_TEXTURESTORAGE_H_
-
-#include "common/debug.h"
-#include "libANGLE/angletypes.h"
-
-#include <GLES2/gl2.h>
-#include <stdint.h>
-
-namespace gl
-{
-class Context;
-struct ImageIndex;
-struct Box;
-struct PixelUnpackState;
-} // namespace gl
-
-namespace rx
-{
-class SwapChainD3D;
-class RenderTargetD3D;
-class ImageD3D;
-
-class TextureStorage : angle::NonCopyable
-{
- public:
- TextureStorage() {}
- virtual ~TextureStorage() {}
-
- virtual gl::Error onDestroy(const gl::Context *context);
-
- virtual int getTopLevel() const = 0;
- virtual bool isRenderTarget() const = 0;
- virtual bool isManaged() const = 0;
- virtual bool supportsNativeMipmapFunction() const = 0;
- virtual int getLevelCount() const = 0;
-
- virtual gl::Error getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT) = 0;
- virtual gl::Error generateMipmap(const gl::Context *context,
- const gl::ImageIndex &sourceIndex,
- const gl::ImageIndex &destIndex) = 0;
-
- virtual gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) = 0;
- virtual gl::Error setData(const gl::Context *context,
- const gl::ImageIndex &index,
- ImageD3D *image,
- const gl::Box *destBox,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixelData) = 0;
-
- // This is a no-op for most implementations of TextureStorage. Some (e.g. TextureStorage11_2D) might override it.
- virtual gl::Error useLevelZeroWorkaroundTexture(const gl::Context *context,
- bool useLevelZeroTexture);
-};
-
-inline gl::Error TextureStorage::onDestroy(const gl::Context *context)
-{
- return gl::NoError();
-}
-
-inline gl::Error TextureStorage::useLevelZeroWorkaroundTexture(const gl::Context *context,
- bool useLevelZeroTexture)
-{
- return gl::NoError();
-}
-
-using TexStoragePointer = angle::UniqueObjectPointer<TextureStorage, gl::Context>;
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_TEXTURESTORAGE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp
deleted file mode 100644
index 7c2d5aec70..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp
+++ /dev/null
@@ -1,293 +0,0 @@
-//
-// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// VertexBuffer.cpp: Defines the abstract VertexBuffer class and VertexBufferInterface
-// class with derivations, classes that perform graphics API agnostic vertex buffer operations.
-
-#include "libANGLE/renderer/d3d/VertexBuffer.h"
-
-#include "common/mathutil.h"
-#include "libANGLE/renderer/d3d/BufferD3D.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-#include "libANGLE/VertexAttribute.h"
-
-namespace rx
-{
-
-// VertexBuffer Implementation
-unsigned int VertexBuffer::mNextSerial = 1;
-
-VertexBuffer::VertexBuffer() : mRefCount(1)
-{
- updateSerial();
-}
-
-VertexBuffer::~VertexBuffer()
-{
-}
-
-void VertexBuffer::updateSerial()
-{
- mSerial = mNextSerial++;
-}
-
-unsigned int VertexBuffer::getSerial() const
-{
- return mSerial;
-}
-
-void VertexBuffer::addRef()
-{
- mRefCount++;
-}
-
-void VertexBuffer::release()
-{
- ASSERT(mRefCount > 0);
- mRefCount--;
-
- if (mRefCount == 0)
- {
- delete this;
- }
-}
-
-// VertexBufferInterface Implementation
-VertexBufferInterface::VertexBufferInterface(BufferFactoryD3D *factory, bool dynamic)
- : mFactory(factory), mVertexBuffer(factory->createVertexBuffer()), mDynamic(dynamic)
-{
-}
-
-VertexBufferInterface::~VertexBufferInterface()
-{
- if (mVertexBuffer)
- {
- mVertexBuffer->release();
- }
-}
-
-unsigned int VertexBufferInterface::getSerial() const
-{
- return mVertexBuffer->getSerial();
-}
-
-unsigned int VertexBufferInterface::getBufferSize() const
-{
- return mVertexBuffer->getBufferSize();
-}
-
-gl::Error VertexBufferInterface::setBufferSize(unsigned int size)
-{
- if (mVertexBuffer->getBufferSize() == 0)
- {
- return mVertexBuffer->initialize(size, mDynamic);
- }
-
- return mVertexBuffer->setBufferSize(size);
-}
-
-gl::ErrorOrResult<unsigned int> VertexBufferInterface::getSpaceRequired(
- const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding,
- GLsizei count,
- GLsizei instances) const
-{
- unsigned int spaceRequired = 0;
- ANGLE_TRY_RESULT(mFactory->getVertexSpaceRequired(attrib, binding, count, instances),
- spaceRequired);
-
- // Align to 16-byte boundary
- unsigned int alignedSpaceRequired = roundUp(spaceRequired, 16u);
-
- if (alignedSpaceRequired < spaceRequired)
- {
- return gl::OutOfMemory()
- << "Vertex buffer overflow in VertexBufferInterface::getSpaceRequired.";
- }
-
- return alignedSpaceRequired;
-}
-
-gl::Error VertexBufferInterface::discard()
-{
- return mVertexBuffer->discard();
-}
-
-VertexBuffer *VertexBufferInterface::getVertexBuffer() const
-{
- return mVertexBuffer;
-}
-
-// StreamingVertexBufferInterface Implementation
-StreamingVertexBufferInterface::StreamingVertexBufferInterface(BufferFactoryD3D *factory,
- std::size_t initialSize)
- : VertexBufferInterface(factory, true), mWritePosition(0), mReservedSpace(0)
-{
- // TODO(jmadill): Make an initialize method that can return an error.
- ANGLE_SWALLOW_ERR(setBufferSize(static_cast<unsigned int>(initialSize)));
-}
-
-StreamingVertexBufferInterface::~StreamingVertexBufferInterface()
-{
-}
-
-gl::Error StreamingVertexBufferInterface::reserveSpace(unsigned int size)
-{
- unsigned int curBufferSize = getBufferSize();
- if (size > curBufferSize)
- {
- ANGLE_TRY(setBufferSize(std::max(size, 3 * curBufferSize / 2)));
- mWritePosition = 0;
- }
- else if (mWritePosition + size > curBufferSize)
- {
- ANGLE_TRY(discard());
- mWritePosition = 0;
- }
-
- return gl::NoError();
-}
-
-gl::Error StreamingVertexBufferInterface::storeDynamicAttribute(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding,
- GLenum currentValueType,
- GLint start,
- GLsizei count,
- GLsizei instances,
- unsigned int *outStreamOffset,
- const uint8_t *sourceData)
-{
- unsigned int spaceRequired = 0;
- ANGLE_TRY_RESULT(getSpaceRequired(attrib, binding, count, instances), spaceRequired);
-
- // Protect against integer overflow
- angle::CheckedNumeric<unsigned int> checkedPosition(mWritePosition);
- checkedPosition += spaceRequired;
- if (!checkedPosition.IsValid())
- {
- return gl::OutOfMemory()
- << "Internal error, new vertex buffer write position would overflow.";
- }
-
- ANGLE_TRY(reserveSpace(mReservedSpace));
- mReservedSpace = 0;
-
- ANGLE_TRY(mVertexBuffer->storeVertexAttributes(attrib, binding, currentValueType, start, count,
- instances, mWritePosition, sourceData));
-
- if (outStreamOffset)
- {
- *outStreamOffset = mWritePosition;
- }
-
- mWritePosition += spaceRequired;
-
- return gl::NoError();
-}
-
-gl::Error StreamingVertexBufferInterface::reserveVertexSpace(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding,
- GLsizei count,
- GLsizei instances)
-{
- unsigned int requiredSpace = 0;
- ANGLE_TRY_RESULT(mFactory->getVertexSpaceRequired(attrib, binding, count, instances),
- requiredSpace);
-
- // Align to 16-byte boundary
- auto alignedRequiredSpace = rx::CheckedRoundUp(requiredSpace, 16u);
- alignedRequiredSpace += mReservedSpace;
-
- // Protect against integer overflow
- if (!alignedRequiredSpace.IsValid())
- {
- return gl::OutOfMemory()
- << "Unable to reserve " << requiredSpace
- << " extra bytes in internal vertex buffer, it would result in an overflow.";
- }
-
- mReservedSpace = alignedRequiredSpace.ValueOrDie();
-
- return gl::NoError();
-}
-
-// StaticVertexBufferInterface Implementation
-StaticVertexBufferInterface::AttributeSignature::AttributeSignature()
- : type(GL_NONE), size(0), stride(0), normalized(false), pureInteger(false), offset(0)
-{
-}
-
-bool StaticVertexBufferInterface::AttributeSignature::matchesAttribute(
- const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding) const
-{
- size_t attribStride = ComputeVertexAttributeStride(attrib, binding);
-
- if (type != attrib.type || size != attrib.size || static_cast<GLuint>(stride) != attribStride ||
- normalized != attrib.normalized || pureInteger != attrib.pureInteger)
- {
- return false;
- }
-
- size_t attribOffset =
- (static_cast<size_t>(ComputeVertexAttributeOffset(attrib, binding)) % attribStride);
- return (offset == attribOffset);
-}
-
-void StaticVertexBufferInterface::AttributeSignature::set(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding)
-{
- type = attrib.type;
- size = attrib.size;
- normalized = attrib.normalized;
- pureInteger = attrib.pureInteger;
- offset = stride = static_cast<GLuint>(ComputeVertexAttributeStride(attrib, binding));
- offset = static_cast<size_t>(ComputeVertexAttributeOffset(attrib, binding)) %
- ComputeVertexAttributeStride(attrib, binding);
-}
-
-StaticVertexBufferInterface::StaticVertexBufferInterface(BufferFactoryD3D *factory)
- : VertexBufferInterface(factory, false)
-{
-}
-
-StaticVertexBufferInterface::~StaticVertexBufferInterface()
-{
-}
-
-bool StaticVertexBufferInterface::matchesAttribute(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding) const
-{
- return mSignature.matchesAttribute(attrib, binding);
-}
-
-void StaticVertexBufferInterface::setAttribute(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding)
-{
- return mSignature.set(attrib, binding);
-}
-
-gl::Error StaticVertexBufferInterface::storeStaticAttribute(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding,
- GLint start,
- GLsizei count,
- GLsizei instances,
- const uint8_t *sourceData)
-{
- unsigned int spaceRequired = 0;
- ANGLE_TRY_RESULT(getSpaceRequired(attrib, binding, count, instances), spaceRequired);
- ANGLE_TRY(setBufferSize(spaceRequired));
-
- ASSERT(attrib.enabled);
- ANGLE_TRY(mVertexBuffer->storeVertexAttributes(attrib, binding, GL_NONE, start, count,
- instances, 0, sourceData));
-
- mSignature.set(attrib, binding);
- mVertexBuffer->hintUnmapResource();
- return gl::NoError();
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexBuffer.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexBuffer.h
deleted file mode 100644
index df8085d3cb..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexBuffer.h
+++ /dev/null
@@ -1,175 +0,0 @@
-//
-// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// VertexBuffer.h: Defines the abstract VertexBuffer class and VertexBufferInterface
-// class with derivations, classes that perform graphics API agnostic vertex buffer operations.
-
-#ifndef LIBANGLE_RENDERER_D3D_VERTEXBUFFER_H_
-#define LIBANGLE_RENDERER_D3D_VERTEXBUFFER_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/Error.h"
-
-#include <GLES2/gl2.h>
-
-#include <cstddef>
-#include <cstdint>
-#include <vector>
-
-namespace gl
-{
-struct VertexAttribute;
-class VertexBinding;
-struct VertexAttribCurrentValueData;
-}
-
-namespace rx
-{
-class BufferFactoryD3D;
-
-// Use a ref-counting scheme with self-deletion on release. We do this so that we can more
-// easily manage the static buffer cache, without deleting currently bound buffers.
-class VertexBuffer : angle::NonCopyable
-{
- public:
- VertexBuffer();
-
- virtual gl::Error initialize(unsigned int size, bool dynamicUsage) = 0;
-
- // Warning: you should ensure binding really matches attrib.bindingIndex before using this
- // function.
- virtual gl::Error storeVertexAttributes(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding,
- GLenum currentValueType,
- GLint start,
- GLsizei count,
- GLsizei instances,
- unsigned int offset,
- const uint8_t *sourceData) = 0;
-
- virtual unsigned int getBufferSize() const = 0;
- virtual gl::Error setBufferSize(unsigned int size) = 0;
- virtual gl::Error discard() = 0;
-
- unsigned int getSerial() const;
-
- // This may be overridden (e.g. by VertexBuffer11) if necessary.
- virtual void hintUnmapResource() { };
-
- // Reference counting.
- void addRef();
- void release();
-
- protected:
- void updateSerial();
- virtual ~VertexBuffer();
-
- private:
- unsigned int mSerial;
- static unsigned int mNextSerial;
- unsigned int mRefCount;
-};
-
-class VertexBufferInterface : angle::NonCopyable
-{
- public:
- VertexBufferInterface(BufferFactoryD3D *factory, bool dynamic);
- virtual ~VertexBufferInterface();
-
- unsigned int getBufferSize() const;
- bool empty() const { return getBufferSize() == 0; }
-
- unsigned int getSerial() const;
-
- VertexBuffer *getVertexBuffer() const;
-
- protected:
- gl::Error discard();
-
- gl::Error setBufferSize(unsigned int size);
-
- gl::ErrorOrResult<unsigned int> getSpaceRequired(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding,
- GLsizei count,
- GLsizei instances) const;
- BufferFactoryD3D *const mFactory;
- VertexBuffer *mVertexBuffer;
- bool mDynamic;
-};
-
-class StreamingVertexBufferInterface : public VertexBufferInterface
-{
- public:
- StreamingVertexBufferInterface(BufferFactoryD3D *factory, std::size_t initialSize);
- ~StreamingVertexBufferInterface() override;
-
- gl::Error storeDynamicAttribute(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding,
- GLenum currentValueType,
- GLint start,
- GLsizei count,
- GLsizei instances,
- unsigned int *outStreamOffset,
- const uint8_t *sourceData);
-
- gl::Error reserveVertexSpace(const gl::VertexAttribute &attribute,
- const gl::VertexBinding &binding,
- GLsizei count,
- GLsizei instances);
-
- private:
- gl::Error reserveSpace(unsigned int size);
-
- unsigned int mWritePosition;
- unsigned int mReservedSpace;
-};
-
-class StaticVertexBufferInterface : public VertexBufferInterface
-{
- public:
- explicit StaticVertexBufferInterface(BufferFactoryD3D *factory);
- ~StaticVertexBufferInterface() override;
-
- // Warning: you should ensure binding really matches attrib.bindingIndex before using these
- // functions.
- gl::Error storeStaticAttribute(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding,
- GLint start,
- GLsizei count,
- GLsizei instances,
- const uint8_t *sourceData);
-
- bool matchesAttribute(const gl::VertexAttribute &attribute,
- const gl::VertexBinding &binding) const;
-
- void setAttribute(const gl::VertexAttribute &attribute, const gl::VertexBinding &binding);
-
- private:
- class AttributeSignature final : angle::NonCopyable
- {
- public:
- AttributeSignature();
-
- bool matchesAttribute(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding) const;
-
- void set(const gl::VertexAttribute &attrib, const gl::VertexBinding &binding);
-
- private:
- GLenum type;
- GLuint size;
- GLuint stride;
- bool normalized;
- bool pureInteger;
- size_t offset;
- };
-
- AttributeSignature mSignature;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_VERTEXBUFFER_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexDataManager.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexDataManager.cpp
deleted file mode 100644
index 54ad5e54f5..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexDataManager.cpp
+++ /dev/null
@@ -1,646 +0,0 @@
-//
-// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// VertexDataManager.h: Defines the VertexDataManager, a class that
-// runs the Buffer translation process.
-
-#include "libANGLE/renderer/d3d/VertexDataManager.h"
-
-#include "common/bitset_utils.h"
-#include "libANGLE/Buffer.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/State.h"
-#include "libANGLE/VertexArray.h"
-#include "libANGLE/VertexAttribute.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/d3d/BufferD3D.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-#include "libANGLE/renderer/d3d/VertexBuffer.h"
-
-using namespace angle;
-
-namespace rx
-{
-namespace
-{
-enum
-{
- INITIAL_STREAM_BUFFER_SIZE = 1024 * 1024
-};
-// This has to be at least 4k or else it fails on ATI cards.
-enum
-{
- CONSTANT_VERTEX_BUFFER_SIZE = 4096
-};
-
-// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
-int ElementsInBuffer(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding,
- unsigned int size)
-{
- // Size cannot be larger than a GLsizei
- if (size > static_cast<unsigned int>(std::numeric_limits<int>::max()))
- {
- size = static_cast<unsigned int>(std::numeric_limits<int>::max());
- }
-
- GLsizei stride = static_cast<GLsizei>(ComputeVertexAttributeStride(attrib, binding));
- GLsizei offset = static_cast<GLsizei>(ComputeVertexAttributeOffset(attrib, binding));
- return (size - offset % stride +
- (stride - static_cast<GLsizei>(ComputeVertexAttributeTypeSize(attrib)))) /
- stride;
-}
-
-// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
-bool DirectStoragePossible(const gl::VertexAttribute &attrib, const gl::VertexBinding &binding)
-{
- // Current value attribs may not use direct storage.
- if (!attrib.enabled)
- {
- return false;
- }
-
- gl::Buffer *buffer = binding.getBuffer().get();
- if (!buffer)
- {
- return false;
- }
-
- BufferD3D *bufferD3D = GetImplAs<BufferD3D>(buffer);
- ASSERT(bufferD3D);
- if (!bufferD3D->supportsDirectBinding())
- {
- return false;
- }
-
- // Alignment restrictions: In D3D, vertex data must be aligned to the format stride, or to a
- // 4-byte boundary, whichever is smaller. (Undocumented, and experimentally confirmed)
- size_t alignment = 4;
-
- // TODO(jmadill): add VertexFormatCaps
- BufferFactoryD3D *factory = bufferD3D->getFactory();
-
- gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib);
-
- // CPU-converted vertex data must be converted (naturally).
- if ((factory->getVertexConversionType(vertexFormatType) & VERTEX_CONVERT_CPU) != 0)
- {
- return false;
- }
-
- if (attrib.type != GL_FLOAT)
- {
- auto errorOrElementSize = factory->getVertexSpaceRequired(attrib, binding, 1, 0);
- if (errorOrElementSize.isError())
- {
- ERR() << "Unlogged error in DirectStoragePossible.";
- return false;
- }
-
- alignment = std::min<size_t>(errorOrElementSize.getResult(), 4);
- }
-
- GLintptr offset = ComputeVertexAttributeOffset(attrib, binding);
- // Final alignment check - unaligned data must be converted.
- return (static_cast<size_t>(ComputeVertexAttributeStride(attrib, binding)) % alignment == 0) &&
- (static_cast<size_t>(offset) % alignment == 0);
-}
-} // anonymous namespace
-
-TranslatedAttribute::TranslatedAttribute()
- : active(false),
- attribute(nullptr),
- binding(nullptr),
- currentValueType(GL_NONE),
- baseOffset(0),
- usesFirstVertexOffset(false),
- stride(0),
- vertexBuffer(),
- storage(nullptr),
- serial(0),
- divisor(0)
-{
-}
-
-TranslatedAttribute::TranslatedAttribute(const TranslatedAttribute &other) = default;
-
-gl::ErrorOrResult<unsigned int> TranslatedAttribute::computeOffset(GLint startVertex) const
-{
- if (!usesFirstVertexOffset)
- {
- return baseOffset;
- }
-
- CheckedNumeric<unsigned int> offset;
-
- offset = baseOffset + stride * static_cast<unsigned int>(startVertex);
- ANGLE_TRY_CHECKED_MATH(offset);
- return offset.ValueOrDie();
-}
-
-// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
-VertexStorageType ClassifyAttributeStorage(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding)
-{
- // If attribute is disabled, we use the current value.
- if (!attrib.enabled)
- {
- return VertexStorageType::CURRENT_VALUE;
- }
-
- // If specified with immediate data, we must use dynamic storage.
- auto *buffer = binding.getBuffer().get();
- if (!buffer)
- {
- return VertexStorageType::DYNAMIC;
- }
-
- // Check if the buffer supports direct storage.
- if (DirectStoragePossible(attrib, binding))
- {
- return VertexStorageType::DIRECT;
- }
-
- // Otherwise the storage is static or dynamic.
- BufferD3D *bufferD3D = GetImplAs<BufferD3D>(buffer);
- ASSERT(bufferD3D);
- switch (bufferD3D->getUsage())
- {
- case D3DBufferUsage::DYNAMIC:
- return VertexStorageType::DYNAMIC;
- case D3DBufferUsage::STATIC:
- return VertexStorageType::STATIC;
- default:
- UNREACHABLE();
- return VertexStorageType::UNKNOWN;
- }
-}
-
-VertexDataManager::CurrentValueState::CurrentValueState() : buffer(), offset(0)
-{
- data.FloatValues[0] = std::numeric_limits<float>::quiet_NaN();
- data.FloatValues[1] = std::numeric_limits<float>::quiet_NaN();
- data.FloatValues[2] = std::numeric_limits<float>::quiet_NaN();
- data.FloatValues[3] = std::numeric_limits<float>::quiet_NaN();
- data.Type = GL_FLOAT;
-}
-
-VertexDataManager::CurrentValueState::~CurrentValueState()
-{
-}
-
-VertexDataManager::VertexDataManager(BufferFactoryD3D *factory)
- : mFactory(factory), mStreamingBuffer(), mCurrentValueCache(gl::MAX_VERTEX_ATTRIBS)
-{
-}
-
-VertexDataManager::~VertexDataManager()
-{
-}
-
-gl::Error VertexDataManager::initialize()
-{
- mStreamingBuffer.reset(
- new StreamingVertexBufferInterface(mFactory, INITIAL_STREAM_BUFFER_SIZE));
- if (!mStreamingBuffer)
- {
- return gl::OutOfMemory() << "Failed to allocate the streaming vertex buffer.";
- }
-
- return gl::NoError();
-}
-
-void VertexDataManager::deinitialize()
-{
- mStreamingBuffer.reset();
- mCurrentValueCache.clear();
-}
-
-gl::Error VertexDataManager::prepareVertexData(const gl::Context *context,
- GLint start,
- GLsizei count,
- std::vector<TranslatedAttribute> *translatedAttribs,
- GLsizei instances)
-{
- ASSERT(mStreamingBuffer);
-
- const gl::State &state = context->getGLState();
- const gl::VertexArray *vertexArray = state.getVertexArray();
- const auto &vertexAttributes = vertexArray->getVertexAttributes();
- const auto &vertexBindings = vertexArray->getVertexBindings();
-
- mDynamicAttribsMaskCache.reset();
- const gl::Program *program = state.getProgram();
-
- translatedAttribs->clear();
-
- for (size_t attribIndex = 0; attribIndex < vertexAttributes.size(); ++attribIndex)
- {
- // Skip attrib locations the program doesn't use.
- if (!program->isAttribLocationActive(attribIndex))
- continue;
-
- const auto &attrib = vertexAttributes[attribIndex];
- const auto &binding = vertexBindings[attrib.bindingIndex];
-
- // Resize automatically puts in empty attribs
- translatedAttribs->resize(attribIndex + 1);
-
- TranslatedAttribute *translated = &(*translatedAttribs)[attribIndex];
- auto currentValueData = state.getVertexAttribCurrentValue(attribIndex);
-
- // Record the attribute now
- translated->active = true;
- translated->attribute = &attrib;
- translated->binding = &binding;
- translated->currentValueType = currentValueData.Type;
- translated->divisor = binding.getDivisor();
-
- switch (ClassifyAttributeStorage(attrib, binding))
- {
- case VertexStorageType::STATIC:
- {
- // Store static attribute.
- ANGLE_TRY(StoreStaticAttrib(context, translated));
- break;
- }
- case VertexStorageType::DYNAMIC:
- // Dynamic attributes must be handled together.
- mDynamicAttribsMaskCache.set(attribIndex);
- break;
- case VertexStorageType::DIRECT:
- // Update translated data for direct attributes.
- StoreDirectAttrib(translated);
- break;
- case VertexStorageType::CURRENT_VALUE:
- {
- ANGLE_TRY(storeCurrentValue(currentValueData, translated, attribIndex));
- break;
- }
- default:
- UNREACHABLE();
- break;
- }
- }
-
- if (mDynamicAttribsMaskCache.none())
- {
- return gl::NoError();
- }
-
- ANGLE_TRY(storeDynamicAttribs(context, translatedAttribs, mDynamicAttribsMaskCache, start,
- count, instances));
-
- PromoteDynamicAttribs(context, *translatedAttribs, mDynamicAttribsMaskCache, count);
-
- return gl::NoError();
-}
-
-// static
-void VertexDataManager::StoreDirectAttrib(TranslatedAttribute *directAttrib)
-{
- ASSERT(directAttrib->attribute && directAttrib->binding);
- const auto &attrib = *directAttrib->attribute;
- const auto &binding = *directAttrib->binding;
-
- gl::Buffer *buffer = binding.getBuffer().get();
- ASSERT(buffer);
- BufferD3D *bufferD3D = GetImplAs<BufferD3D>(buffer);
-
- ASSERT(DirectStoragePossible(attrib, binding));
- directAttrib->vertexBuffer.set(nullptr);
- directAttrib->storage = bufferD3D;
- directAttrib->serial = bufferD3D->getSerial();
- directAttrib->stride = static_cast<unsigned int>(ComputeVertexAttributeStride(attrib, binding));
- directAttrib->baseOffset =
- static_cast<unsigned int>(ComputeVertexAttributeOffset(attrib, binding));
-
- // Instanced vertices do not apply the 'start' offset
- directAttrib->usesFirstVertexOffset = (binding.getDivisor() == 0);
-}
-
-// static
-gl::Error VertexDataManager::StoreStaticAttrib(const gl::Context *context,
- TranslatedAttribute *translated)
-{
- ASSERT(translated->attribute && translated->binding);
- const auto &attrib = *translated->attribute;
- const auto &binding = *translated->binding;
-
- gl::Buffer *buffer = binding.getBuffer().get();
- ASSERT(buffer && attrib.enabled && !DirectStoragePossible(attrib, binding));
- BufferD3D *bufferD3D = GetImplAs<BufferD3D>(buffer);
-
- // Compute source data pointer
- const uint8_t *sourceData = nullptr;
- const int offset = static_cast<int>(ComputeVertexAttributeOffset(attrib, binding));
-
- ANGLE_TRY(bufferD3D->getData(context, &sourceData));
- sourceData += offset;
-
- unsigned int streamOffset = 0;
-
- translated->storage = nullptr;
- ANGLE_TRY_RESULT(bufferD3D->getFactory()->getVertexSpaceRequired(attrib, binding, 1, 0),
- translated->stride);
-
- auto *staticBuffer = bufferD3D->getStaticVertexBuffer(attrib, binding);
- ASSERT(staticBuffer);
-
- if (staticBuffer->empty())
- {
- // Convert the entire buffer
- int totalCount =
- ElementsInBuffer(attrib, binding, static_cast<unsigned int>(bufferD3D->getSize()));
- int startIndex = offset / static_cast<int>(ComputeVertexAttributeStride(attrib, binding));
-
- ANGLE_TRY(staticBuffer->storeStaticAttribute(attrib, binding, -startIndex, totalCount, 0,
- sourceData));
- }
-
- unsigned int firstElementOffset =
- (static_cast<unsigned int>(offset) /
- static_cast<unsigned int>(ComputeVertexAttributeStride(attrib, binding))) *
- translated->stride;
-
- VertexBuffer *vertexBuffer = staticBuffer->getVertexBuffer();
-
- CheckedNumeric<unsigned int> checkedOffset(streamOffset);
- checkedOffset += firstElementOffset;
-
- if (!checkedOffset.IsValid())
- {
- return gl::InternalError() << "Integer overflow in VertexDataManager::StoreStaticAttrib";
- }
-
- translated->vertexBuffer.set(vertexBuffer);
- translated->serial = vertexBuffer->getSerial();
- translated->baseOffset = streamOffset + firstElementOffset;
-
- // Instanced vertices do not apply the 'start' offset
- translated->usesFirstVertexOffset = (binding.getDivisor() == 0);
-
- return gl::NoError();
-}
-
-gl::Error VertexDataManager::storeDynamicAttribs(
- const gl::Context *context,
- std::vector<TranslatedAttribute> *translatedAttribs,
- const gl::AttributesMask &dynamicAttribsMask,
- GLint start,
- GLsizei count,
- GLsizei instances)
-{
- // Instantiating this class will ensure the streaming buffer is never left mapped.
- class StreamingBufferUnmapper final : NonCopyable
- {
- public:
- StreamingBufferUnmapper(StreamingVertexBufferInterface *streamingBuffer)
- : mStreamingBuffer(streamingBuffer)
- {
- ASSERT(mStreamingBuffer);
- }
- ~StreamingBufferUnmapper() { mStreamingBuffer->getVertexBuffer()->hintUnmapResource(); }
-
- private:
- StreamingVertexBufferInterface *mStreamingBuffer;
- };
-
- // Will trigger unmapping on return.
- StreamingBufferUnmapper localUnmapper(mStreamingBuffer.get());
-
- // Reserve the required space for the dynamic buffers.
- for (auto attribIndex : dynamicAttribsMask)
- {
- const auto &dynamicAttrib = (*translatedAttribs)[attribIndex];
- ANGLE_TRY(reserveSpaceForAttrib(dynamicAttrib, start, count, instances));
- }
-
- // Store dynamic attributes
- for (auto attribIndex : dynamicAttribsMask)
- {
- auto *dynamicAttrib = &(*translatedAttribs)[attribIndex];
- ANGLE_TRY(storeDynamicAttrib(context, dynamicAttrib, start, count, instances));
- }
-
- return gl::NoError();
-}
-
-void VertexDataManager::PromoteDynamicAttribs(
- const gl::Context *context,
- const std::vector<TranslatedAttribute> &translatedAttribs,
- const gl::AttributesMask &dynamicAttribsMask,
- GLsizei count)
-{
- for (auto attribIndex : dynamicAttribsMask)
- {
- const auto &dynamicAttrib = translatedAttribs[attribIndex];
- ASSERT(dynamicAttrib.attribute && dynamicAttrib.binding);
- const auto &binding = *dynamicAttrib.binding;
-
- gl::Buffer *buffer = binding.getBuffer().get();
- if (buffer)
- {
- BufferD3D *bufferD3D = GetImplAs<BufferD3D>(buffer);
- size_t typeSize = ComputeVertexAttributeTypeSize(*dynamicAttrib.attribute);
- bufferD3D->promoteStaticUsage(context, count * static_cast<int>(typeSize));
- }
- }
-}
-
-gl::Error VertexDataManager::reserveSpaceForAttrib(const TranslatedAttribute &translatedAttrib,
- GLint start,
- GLsizei count,
- GLsizei instances) const
-{
- ASSERT(translatedAttrib.attribute && translatedAttrib.binding);
- const auto &attrib = *translatedAttrib.attribute;
- const auto &binding = *translatedAttrib.binding;
-
- ASSERT(!DirectStoragePossible(attrib, binding));
-
- gl::Buffer *buffer = binding.getBuffer().get();
- BufferD3D *bufferD3D = buffer ? GetImplAs<BufferD3D>(buffer) : nullptr;
- ASSERT(!bufferD3D || bufferD3D->getStaticVertexBuffer(attrib, binding) == nullptr);
-
- size_t totalCount = gl::ComputeVertexBindingElementCount(
- binding.getDivisor(), static_cast<size_t>(count), static_cast<size_t>(instances));
- // TODO(jiajia.qin@intel.com): force the index buffer to clamp any out of range indices instead
- // of invalid operation here.
- if (bufferD3D)
- {
- // Vertices do not apply the 'start' offset when the divisor is non-zero even when doing
- // a non-instanced draw call
- GLint firstVertexIndex = binding.getDivisor() > 0 ? 0 : start;
- int64_t maxVertexCount =
- static_cast<int64_t>(firstVertexIndex) + static_cast<int64_t>(totalCount);
- int elementsInBuffer =
- ElementsInBuffer(attrib, binding, static_cast<unsigned int>(bufferD3D->getSize()));
-
- if (maxVertexCount > elementsInBuffer)
- {
- return gl::InvalidOperation() << "Vertex buffer is not big enough for the draw call.";
- }
- }
- return mStreamingBuffer->reserveVertexSpace(attrib, binding, static_cast<GLsizei>(totalCount),
- instances);
-}
-
-gl::Error VertexDataManager::storeDynamicAttrib(const gl::Context *context,
- TranslatedAttribute *translated,
- GLint start,
- GLsizei count,
- GLsizei instances)
-{
- ASSERT(translated->attribute && translated->binding);
- const auto &attrib = *translated->attribute;
- const auto &binding = *translated->binding;
-
- gl::Buffer *buffer = binding.getBuffer().get();
- ASSERT(buffer || attrib.pointer);
- ASSERT(attrib.enabled);
-
- BufferD3D *storage = buffer ? GetImplAs<BufferD3D>(buffer) : nullptr;
-
- // Instanced vertices do not apply the 'start' offset
- GLint firstVertexIndex = (binding.getDivisor() > 0 ? 0 : start);
-
- // Compute source data pointer
- const uint8_t *sourceData = nullptr;
-
- if (buffer)
- {
- ANGLE_TRY(storage->getData(context, &sourceData));
- sourceData += static_cast<int>(ComputeVertexAttributeOffset(attrib, binding));
- }
- else
- {
- // Attributes using client memory ignore the VERTEX_ATTRIB_BINDING state.
- // https://www.opengl.org/registry/specs/ARB/vertex_attrib_binding.txt
- sourceData = static_cast<const uint8_t*>(attrib.pointer);
- }
-
- unsigned int streamOffset = 0;
-
- translated->storage = nullptr;
- ANGLE_TRY_RESULT(mFactory->getVertexSpaceRequired(attrib, binding, 1, 0), translated->stride);
-
- size_t totalCount = gl::ComputeVertexBindingElementCount(
- binding.getDivisor(), static_cast<size_t>(count), static_cast<size_t>(instances));
-
- ANGLE_TRY(mStreamingBuffer->storeDynamicAttribute(
- attrib, binding, translated->currentValueType, firstVertexIndex,
- static_cast<GLsizei>(totalCount), instances, &streamOffset, sourceData));
-
- VertexBuffer *vertexBuffer = mStreamingBuffer->getVertexBuffer();
-
- translated->vertexBuffer.set(vertexBuffer);
- translated->serial = vertexBuffer->getSerial();
- translated->baseOffset = streamOffset;
- translated->usesFirstVertexOffset = false;
-
- return gl::NoError();
-}
-
-gl::Error VertexDataManager::storeCurrentValue(const gl::VertexAttribCurrentValueData &currentValue,
- TranslatedAttribute *translated,
- size_t attribIndex)
-{
- CurrentValueState *cachedState = &mCurrentValueCache[attribIndex];
- auto &buffer = cachedState->buffer;
-
- if (!buffer)
- {
- buffer.reset(new StreamingVertexBufferInterface(mFactory, CONSTANT_VERTEX_BUFFER_SIZE));
- }
-
- if (cachedState->data != currentValue)
- {
- ASSERT(translated->attribute && translated->binding);
- const auto &attrib = *translated->attribute;
- const auto &binding = *translated->binding;
-
- ANGLE_TRY(buffer->reserveVertexSpace(attrib, binding, 1, 0));
-
- const uint8_t *sourceData = reinterpret_cast<const uint8_t*>(currentValue.FloatValues);
- unsigned int streamOffset;
- ANGLE_TRY(buffer->storeDynamicAttribute(attrib, binding, currentValue.Type, 0, 1, 0,
- &streamOffset, sourceData));
-
- buffer->getVertexBuffer()->hintUnmapResource();
-
- cachedState->data = currentValue;
- cachedState->offset = streamOffset;
- }
-
- translated->vertexBuffer.set(buffer->getVertexBuffer());
-
- translated->storage = nullptr;
- translated->serial = buffer->getSerial();
- translated->divisor = 0;
- translated->stride = 0;
- translated->baseOffset = static_cast<unsigned int>(cachedState->offset);
- translated->usesFirstVertexOffset = false;
-
- return gl::NoError();
-}
-
-// VertexBufferBinding implementation
-VertexBufferBinding::VertexBufferBinding() : mBoundVertexBuffer(nullptr)
-{
-}
-
-VertexBufferBinding::VertexBufferBinding(const VertexBufferBinding &other)
- : mBoundVertexBuffer(other.mBoundVertexBuffer)
-{
- if (mBoundVertexBuffer)
- {
- mBoundVertexBuffer->addRef();
- }
-}
-
-VertexBufferBinding::~VertexBufferBinding()
-{
- if (mBoundVertexBuffer)
- {
- mBoundVertexBuffer->release();
- }
-}
-
-VertexBufferBinding &VertexBufferBinding::operator=(const VertexBufferBinding &other)
-{
- mBoundVertexBuffer = other.mBoundVertexBuffer;
- if (mBoundVertexBuffer)
- {
- mBoundVertexBuffer->addRef();
- }
- return *this;
-}
-
-void VertexBufferBinding::set(VertexBuffer *vertexBuffer)
-{
- if (mBoundVertexBuffer == vertexBuffer)
- return;
-
- if (mBoundVertexBuffer)
- {
- mBoundVertexBuffer->release();
- }
- if (vertexBuffer)
- {
- vertexBuffer->addRef();
- }
-
- mBoundVertexBuffer = vertexBuffer;
-}
-
-VertexBuffer *VertexBufferBinding::get() const
-{
- return mBoundVertexBuffer;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexDataManager.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexDataManager.h
deleted file mode 100644
index 694366deb7..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/VertexDataManager.h
+++ /dev/null
@@ -1,152 +0,0 @@
-//
-// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// VertexDataManager.h: Defines the VertexDataManager, a class that
-// runs the Buffer translation process.
-
-#ifndef LIBANGLE_RENDERER_D3D_VERTEXDATAMANAGER_H_
-#define LIBANGLE_RENDERER_D3D_VERTEXDATAMANAGER_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/Constants.h"
-#include "libANGLE/VertexAttribute.h"
-
-namespace gl
-{
-class State;
-struct VertexAttribute;
-class VertexBinding;
-struct VertexAttribCurrentValueData;
-}
-
-namespace rx
-{
-class BufferD3D;
-class BufferFactoryD3D;
-class StreamingVertexBufferInterface;
-class VertexBuffer;
-
-class VertexBufferBinding final
-{
- public:
- VertexBufferBinding();
- VertexBufferBinding(const VertexBufferBinding &other);
- ~VertexBufferBinding();
-
- void set(VertexBuffer *vertexBuffer);
- VertexBuffer *get() const;
- VertexBufferBinding &operator=(const VertexBufferBinding &other);
-
- private:
- VertexBuffer *mBoundVertexBuffer;
-};
-
-struct TranslatedAttribute
-{
- TranslatedAttribute();
- TranslatedAttribute(const TranslatedAttribute &other);
-
- // Computes the correct offset from baseOffset, usesFirstVertexOffset, stride and startVertex.
- // Can throw an error on integer overflow.
- gl::ErrorOrResult<unsigned int> computeOffset(GLint startVertex) const;
-
- bool active;
-
- const gl::VertexAttribute *attribute;
- const gl::VertexBinding *binding;
- GLenum currentValueType;
- unsigned int baseOffset;
- bool usesFirstVertexOffset;
- unsigned int stride; // 0 means not to advance the read pointer at all
-
- VertexBufferBinding vertexBuffer;
- BufferD3D *storage;
- unsigned int serial;
- unsigned int divisor;
-};
-
-enum class VertexStorageType
-{
- UNKNOWN,
- STATIC, // Translate the vertex data once and re-use it.
- DYNAMIC, // Translate the data every frame into a ring buffer.
- DIRECT, // Bind a D3D buffer directly without any translation.
- CURRENT_VALUE, // Use a single value for the attribute.
-};
-
-// Given a vertex attribute, return the type of storage it will use.
-VertexStorageType ClassifyAttributeStorage(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding);
-
-class VertexDataManager : angle::NonCopyable
-{
- public:
- VertexDataManager(BufferFactoryD3D *factory);
- virtual ~VertexDataManager();
-
- gl::Error initialize();
- void deinitialize();
-
- gl::Error prepareVertexData(const gl::Context *context,
- GLint start,
- GLsizei count,
- std::vector<TranslatedAttribute> *translatedAttribs,
- GLsizei instances);
-
- static void StoreDirectAttrib(TranslatedAttribute *directAttrib);
-
- static gl::Error StoreStaticAttrib(const gl::Context *context, TranslatedAttribute *translated);
-
- gl::Error storeDynamicAttribs(const gl::Context *context,
- std::vector<TranslatedAttribute> *translatedAttribs,
- const gl::AttributesMask &dynamicAttribsMask,
- GLint start,
- GLsizei count,
- GLsizei instances);
-
- // Promote static usage of dynamic buffers.
- static void PromoteDynamicAttribs(const gl::Context *context,
- const std::vector<TranslatedAttribute> &translatedAttribs,
- const gl::AttributesMask &dynamicAttribsMask,
- GLsizei count);
-
- gl::Error storeCurrentValue(const gl::VertexAttribCurrentValueData &currentValue,
- TranslatedAttribute *translated,
- size_t attribIndex);
-
- private:
- struct CurrentValueState
- {
- CurrentValueState();
- ~CurrentValueState();
-
- std::unique_ptr<StreamingVertexBufferInterface> buffer;
- gl::VertexAttribCurrentValueData data;
- size_t offset;
- };
-
- gl::Error reserveSpaceForAttrib(const TranslatedAttribute &translatedAttrib,
- GLsizei count,
- GLint start,
- GLsizei instances) const;
-
- gl::Error storeDynamicAttrib(const gl::Context *context,
- TranslatedAttribute *translated,
- GLint start,
- GLsizei count,
- GLsizei instances);
-
- BufferFactoryD3D *const mFactory;
-
- std::unique_ptr<StreamingVertexBufferInterface> mStreamingBuffer;
- std::vector<CurrentValueState> mCurrentValueCache;
- gl::AttributesMask mDynamicAttribsMaskCache;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_VERTEXDATAMANAGER_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp
deleted file mode 100644
index f032e888f1..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp
+++ /dev/null
@@ -1,2153 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Blit11.cpp: Texture copy utility class.
-
-#include "libANGLE/renderer/d3d/d3d11/Blit11.h"
-
-#include <float.h>
-
-#include "common/utilities.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h"
-#include "third_party/trace_event/trace_event.h"
-
-namespace rx
-{
-
-namespace
-{
-
-// Include inline shaders in the anonymous namespace to make sure no symbols are exported
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough2d11vs.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrougha2d11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughdepth2d11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum2d11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha2d11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2d11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2di11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2dui11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2d11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2di11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2dui11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2d11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2di11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2dui11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2di11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dui11ps.h"
-
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_luma_ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_lumaalpha_ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_luma_ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_lumaalpha_ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgb_ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgba_ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgb_ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgba_ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgb_ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgba_ps.h"
-
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11gs.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11vs.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum3d11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha3d11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3d11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3di11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3dui11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3d11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3di11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3dui11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3d11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3di11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3dui11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3d11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3di11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3dui11ps.h"
-
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepth11_ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepthstencil11_ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepthstencil11_vs.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvestencil11_ps.h"
-
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2darrayps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2dps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef3dps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2darrayps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2dps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei3dps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2darrayps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2dps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui3dps.h"
-
-void StretchedBlitNearest_RowByRow(const gl::Box &sourceArea,
- const gl::Box &destArea,
- const gl::Rectangle &clippedDestArea,
- const gl::Extents &sourceSize,
- unsigned int sourceRowPitch,
- unsigned int destRowPitch,
- size_t pixelSize,
- const uint8_t *sourceData,
- uint8_t *destData)
-{
- int srcHeightSubOne = (sourceArea.height - 1);
- size_t copySize = pixelSize * destArea.width;
- size_t srcOffset = sourceArea.x * pixelSize;
- size_t destOffset = destArea.x * pixelSize;
-
- for (int y = clippedDestArea.y; y < clippedDestArea.y + clippedDestArea.height; y++)
- {
- float yPerc = static_cast<float>(y - destArea.y) / (destArea.height - 1);
-
- // Interpolate using the original source rectangle to determine which row to sample from
- // while clamping to the edges
- unsigned int readRow = static_cast<unsigned int>(
- gl::clamp(sourceArea.y + floor(yPerc * srcHeightSubOne + 0.5f), 0, srcHeightSubOne));
- unsigned int writeRow = y;
-
- const uint8_t *sourceRow = sourceData + readRow * sourceRowPitch + srcOffset;
- uint8_t *destRow = destData + writeRow * destRowPitch + destOffset;
- memcpy(destRow, sourceRow, copySize);
- }
-}
-
-void StretchedBlitNearest_PixelByPixel(const gl::Box &sourceArea,
- const gl::Box &destArea,
- const gl::Rectangle &clippedDestArea,
- const gl::Extents &sourceSize,
- unsigned int sourceRowPitch,
- unsigned int destRowPitch,
- ptrdiff_t readOffset,
- ptrdiff_t writeOffset,
- size_t copySize,
- size_t srcPixelStride,
- size_t destPixelStride,
- const uint8_t *sourceData,
- uint8_t *destData)
-{
- auto xMax = clippedDestArea.x + clippedDestArea.width;
- auto yMax = clippedDestArea.y + clippedDestArea.height;
-
- for (int writeRow = clippedDestArea.y; writeRow < yMax; writeRow++)
- {
- // Interpolate using the original source rectangle to determine which row to sample from
- // while clamping to the edges
- float yPerc = static_cast<float>(writeRow - destArea.y) / (destArea.height - 1);
- float yRounded = floor(yPerc * (sourceArea.height - 1) + 0.5f);
- unsigned int readRow =
- static_cast<unsigned int>(gl::clamp(sourceArea.y + yRounded, 0, sourceSize.height - 1));
-
- for (int writeColumn = clippedDestArea.x; writeColumn < xMax; writeColumn++)
- {
- // Interpolate the original source rectangle to determine which column to sample
- // from while clamping to the edges
- float xPerc = static_cast<float>(writeColumn - destArea.x) / (destArea.width - 1);
- float xRounded = floor(xPerc * (sourceArea.width - 1) + 0.5f);
- unsigned int readColumn = static_cast<unsigned int>(
- gl::clamp(sourceArea.x + xRounded, 0, sourceSize.height - 1));
-
- const uint8_t *sourcePixel =
- sourceData + readRow * sourceRowPitch + readColumn * srcPixelStride + readOffset;
-
- uint8_t *destPixel =
- destData + writeRow * destRowPitch + writeColumn * destPixelStride + writeOffset;
-
- memcpy(destPixel, sourcePixel, copySize);
- }
- }
-}
-
-void StretchedBlitNearest(const gl::Box &sourceArea,
- const gl::Box &destArea,
- const gl::Rectangle &clipRect,
- const gl::Extents &sourceSize,
- unsigned int sourceRowPitch,
- unsigned int destRowPitch,
- ptrdiff_t readOffset,
- ptrdiff_t writeOffset,
- size_t copySize,
- size_t srcPixelStride,
- size_t destPixelStride,
- const uint8_t *sourceData,
- uint8_t *destData)
-{
- gl::Rectangle clippedDestArea(destArea.x, destArea.y, destArea.width, destArea.height);
- gl::ClipRectangle(clippedDestArea, clipRect, &clippedDestArea);
-
- // Determine if entire rows can be copied at once instead of each individual pixel. There
- // must be no out of bounds lookups, whole rows copies, and no scale.
- if (sourceArea.width == clippedDestArea.width && sourceArea.x >= 0 &&
- sourceArea.x + sourceArea.width <= sourceSize.width && copySize == srcPixelStride &&
- copySize == destPixelStride)
- {
- StretchedBlitNearest_RowByRow(sourceArea, destArea, clippedDestArea, sourceSize,
- sourceRowPitch, destRowPitch, srcPixelStride, sourceData,
- destData);
- }
- else
- {
- StretchedBlitNearest_PixelByPixel(sourceArea, destArea, clippedDestArea, sourceSize,
- sourceRowPitch, destRowPitch, readOffset, writeOffset,
- copySize, srcPixelStride, destPixelStride, sourceData,
- destData);
- }
-}
-
-using DepthStencilLoader = void(const float *, uint8_t *);
-
-void LoadDepth16(const float *source, uint8_t *dest)
-{
- uint32_t convertedDepth = gl::floatToNormalized<16, uint32_t>(source[0]);
- memcpy(dest, &convertedDepth, 2u);
-}
-
-void LoadDepth24(const float *source, uint8_t *dest)
-{
- uint32_t convertedDepth = gl::floatToNormalized<24, uint32_t>(source[0]);
- memcpy(dest, &convertedDepth, 3u);
-}
-
-void LoadStencilHelper(const float *source, uint8_t *dest)
-{
- uint32_t convertedStencil = gl::getShiftedData<8, 0>(static_cast<uint32_t>(source[1]));
- memcpy(dest, &convertedStencil, 1u);
-}
-
-void LoadStencil8(const float *source, uint8_t *dest)
-{
- // STENCIL_INDEX8 is implemented with D24S8, with the depth bits unused. Writes zero for safety.
- float zero = 0.0f;
- LoadDepth24(&zero, &dest[0]);
- LoadStencilHelper(source, &dest[3]);
-}
-
-void LoadDepth24Stencil8(const float *source, uint8_t *dest)
-{
- LoadDepth24(source, &dest[0]);
- LoadStencilHelper(source, &dest[3]);
-}
-
-void LoadDepth32F(const float *source, uint8_t *dest)
-{
- memcpy(dest, source, sizeof(float));
-}
-
-void LoadDepth32FStencil8(const float *source, uint8_t *dest)
-{
- LoadDepth32F(source, &dest[0]);
- LoadStencilHelper(source, &dest[4]);
-}
-
-template <DepthStencilLoader loader>
-void CopyDepthStencil(const gl::Box &sourceArea,
- const gl::Box &destArea,
- const gl::Rectangle &clippedDestArea,
- const gl::Extents &sourceSize,
- unsigned int sourceRowPitch,
- unsigned int destRowPitch,
- ptrdiff_t readOffset,
- ptrdiff_t writeOffset,
- size_t copySize,
- size_t srcPixelStride,
- size_t destPixelStride,
- const uint8_t *sourceData,
- uint8_t *destData)
-{
- // No stretching or subregions are supported, only full blits.
- ASSERT(sourceArea == destArea);
- ASSERT(sourceSize.width == sourceArea.width && sourceSize.height == sourceArea.height &&
- sourceSize.depth == 1);
- ASSERT(clippedDestArea.width == sourceSize.width &&
- clippedDestArea.height == sourceSize.height);
- ASSERT(readOffset == 0 && writeOffset == 0);
- ASSERT(destArea.x == 0 && destArea.y == 0);
-
- for (int row = 0; row < destArea.height; ++row)
- {
- for (int column = 0; column < destArea.width; ++column)
- {
- ptrdiff_t offset = row * sourceRowPitch + column * srcPixelStride;
- const float *sourcePixel = reinterpret_cast<const float *>(sourceData + offset);
-
- uint8_t *destPixel = destData + row * destRowPitch + column * destPixelStride;
-
- loader(sourcePixel, destPixel);
- }
- }
-}
-
-void Depth32FStencil8ToDepth32F(const float *source, float *dest)
-{
- *dest = *source;
-}
-
-void Depth24Stencil8ToDepth32F(const uint32_t *source, float *dest)
-{
- uint32_t normDepth = source[0] & 0x00FFFFFF;
- float floatDepth = gl::normalizedToFloat<24>(normDepth);
- *dest = floatDepth;
-}
-
-void BlitD24S8ToD32F(const gl::Box &sourceArea,
- const gl::Box &destArea,
- const gl::Rectangle &clippedDestArea,
- const gl::Extents &sourceSize,
- unsigned int sourceRowPitch,
- unsigned int destRowPitch,
- ptrdiff_t readOffset,
- ptrdiff_t writeOffset,
- size_t copySize,
- size_t srcPixelStride,
- size_t destPixelStride,
- const uint8_t *sourceData,
- uint8_t *destData)
-{
- // No stretching or subregions are supported, only full blits.
- ASSERT(sourceArea == destArea);
- ASSERT(sourceSize.width == sourceArea.width && sourceSize.height == sourceArea.height &&
- sourceSize.depth == 1);
- ASSERT(clippedDestArea.width == sourceSize.width &&
- clippedDestArea.height == sourceSize.height);
- ASSERT(readOffset == 0 && writeOffset == 0);
- ASSERT(destArea.x == 0 && destArea.y == 0);
-
- for (int row = 0; row < destArea.height; ++row)
- {
- for (int column = 0; column < destArea.width; ++column)
- {
- ptrdiff_t offset = row * sourceRowPitch + column * srcPixelStride;
- const uint32_t *sourcePixel = reinterpret_cast<const uint32_t *>(sourceData + offset);
-
- float *destPixel =
- reinterpret_cast<float *>(destData + row * destRowPitch + column * destPixelStride);
-
- Depth24Stencil8ToDepth32F(sourcePixel, destPixel);
- }
- }
-}
-
-void BlitD32FS8ToD32F(const gl::Box &sourceArea,
- const gl::Box &destArea,
- const gl::Rectangle &clippedDestArea,
- const gl::Extents &sourceSize,
- unsigned int sourceRowPitch,
- unsigned int destRowPitch,
- ptrdiff_t readOffset,
- ptrdiff_t writeOffset,
- size_t copySize,
- size_t srcPixelStride,
- size_t destPixelStride,
- const uint8_t *sourceData,
- uint8_t *destData)
-{
- // No stretching or subregions are supported, only full blits.
- ASSERT(sourceArea == destArea);
- ASSERT(sourceSize.width == sourceArea.width && sourceSize.height == sourceArea.height &&
- sourceSize.depth == 1);
- ASSERT(clippedDestArea.width == sourceSize.width &&
- clippedDestArea.height == sourceSize.height);
- ASSERT(readOffset == 0 && writeOffset == 0);
- ASSERT(destArea.x == 0 && destArea.y == 0);
-
- for (int row = 0; row < destArea.height; ++row)
- {
- for (int column = 0; column < destArea.width; ++column)
- {
- ptrdiff_t offset = row * sourceRowPitch + column * srcPixelStride;
- const float *sourcePixel = reinterpret_cast<const float *>(sourceData + offset);
- float *destPixel =
- reinterpret_cast<float *>(destData + row * destRowPitch + column * destPixelStride);
-
- Depth32FStencil8ToDepth32F(sourcePixel, destPixel);
- }
- }
-}
-
-Blit11::BlitConvertFunction *GetCopyDepthStencilFunction(GLenum internalFormat)
-{
- switch (internalFormat)
- {
- case GL_DEPTH_COMPONENT16:
- return &CopyDepthStencil<LoadDepth16>;
- case GL_DEPTH_COMPONENT24:
- return &CopyDepthStencil<LoadDepth24>;
- case GL_DEPTH_COMPONENT32F:
- return &CopyDepthStencil<LoadDepth32F>;
- case GL_STENCIL_INDEX8:
- return &CopyDepthStencil<LoadStencil8>;
- case GL_DEPTH24_STENCIL8:
- return &CopyDepthStencil<LoadDepth24Stencil8>;
- case GL_DEPTH32F_STENCIL8:
- return &CopyDepthStencil<LoadDepth32FStencil8>;
- default:
- UNREACHABLE();
- return nullptr;
- }
-}
-
-inline void GenerateVertexCoords(const gl::Box &sourceArea,
- const gl::Extents &sourceSize,
- const gl::Box &destArea,
- const gl::Extents &destSize,
- float *x1,
- float *y1,
- float *x2,
- float *y2,
- float *u1,
- float *v1,
- float *u2,
- float *v2)
-{
- *x1 = (destArea.x / float(destSize.width)) * 2.0f - 1.0f;
- *y1 = ((destSize.height - destArea.y - destArea.height) / float(destSize.height)) * 2.0f - 1.0f;
- *x2 = ((destArea.x + destArea.width) / float(destSize.width)) * 2.0f - 1.0f;
- *y2 = ((destSize.height - destArea.y) / float(destSize.height)) * 2.0f - 1.0f;
-
- *u1 = sourceArea.x / float(sourceSize.width);
- *v1 = sourceArea.y / float(sourceSize.height);
- *u2 = (sourceArea.x + sourceArea.width) / float(sourceSize.width);
- *v2 = (sourceArea.y + sourceArea.height) / float(sourceSize.height);
-}
-
-void Write2DVertices(const gl::Box &sourceArea,
- const gl::Extents &sourceSize,
- const gl::Box &destArea,
- const gl::Extents &destSize,
- void *outVertices,
- unsigned int *outStride,
- unsigned int *outVertexCount,
- D3D11_PRIMITIVE_TOPOLOGY *outTopology)
-{
- float x1, y1, x2, y2, u1, v1, u2, v2;
- GenerateVertexCoords(sourceArea, sourceSize, destArea, destSize, &x1, &y1, &x2, &y2, &u1, &v1,
- &u2, &v2);
-
- d3d11::PositionTexCoordVertex *vertices =
- static_cast<d3d11::PositionTexCoordVertex *>(outVertices);
-
- d3d11::SetPositionTexCoordVertex(&vertices[0], x1, y1, u1, v2);
- d3d11::SetPositionTexCoordVertex(&vertices[1], x1, y2, u1, v1);
- d3d11::SetPositionTexCoordVertex(&vertices[2], x2, y1, u2, v2);
- d3d11::SetPositionTexCoordVertex(&vertices[3], x2, y2, u2, v1);
-
- *outStride = sizeof(d3d11::PositionTexCoordVertex);
- *outVertexCount = 4;
- *outTopology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP;
-}
-
-void Write3DVertices(const gl::Box &sourceArea,
- const gl::Extents &sourceSize,
- const gl::Box &destArea,
- const gl::Extents &destSize,
- void *outVertices,
- unsigned int *outStride,
- unsigned int *outVertexCount,
- D3D11_PRIMITIVE_TOPOLOGY *outTopology)
-{
- ASSERT(sourceSize.depth > 0 && destSize.depth > 0);
-
- float x1, y1, x2, y2, u1, v1, u2, v2;
- GenerateVertexCoords(sourceArea, sourceSize, destArea, destSize, &x1, &y1, &x2, &y2, &u1, &v1,
- &u2, &v2);
-
- d3d11::PositionLayerTexCoord3DVertex *vertices =
- static_cast<d3d11::PositionLayerTexCoord3DVertex *>(outVertices);
-
- for (int i = 0; i < destSize.depth; i++)
- {
- float readDepth = (float)i / std::max(destSize.depth - 1, 1);
-
- d3d11::SetPositionLayerTexCoord3DVertex(&vertices[i * 6 + 0], x1, y1, i, u1, v2, readDepth);
- d3d11::SetPositionLayerTexCoord3DVertex(&vertices[i * 6 + 1], x1, y2, i, u1, v1, readDepth);
- d3d11::SetPositionLayerTexCoord3DVertex(&vertices[i * 6 + 2], x2, y1, i, u2, v2, readDepth);
-
- d3d11::SetPositionLayerTexCoord3DVertex(&vertices[i * 6 + 3], x1, y2, i, u1, v1, readDepth);
- d3d11::SetPositionLayerTexCoord3DVertex(&vertices[i * 6 + 4], x2, y2, i, u2, v1, readDepth);
- d3d11::SetPositionLayerTexCoord3DVertex(&vertices[i * 6 + 5], x2, y1, i, u2, v2, readDepth);
- }
-
- *outStride = sizeof(d3d11::PositionLayerTexCoord3DVertex);
- *outVertexCount = destSize.depth * 6;
- *outTopology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
-}
-
-unsigned int GetSwizzleIndex(GLenum swizzle)
-{
- unsigned int colorIndex = 0;
-
- switch (swizzle)
- {
- case GL_RED:
- colorIndex = 0;
- break;
- case GL_GREEN:
- colorIndex = 1;
- break;
- case GL_BLUE:
- colorIndex = 2;
- break;
- case GL_ALPHA:
- colorIndex = 3;
- break;
- case GL_ZERO:
- colorIndex = 4;
- break;
- case GL_ONE:
- colorIndex = 5;
- break;
- default:
- UNREACHABLE();
- break;
- }
-
- return colorIndex;
-}
-
-D3D11_BLEND_DESC GetAlphaMaskBlendStateDesc()
-{
- D3D11_BLEND_DESC desc;
- memset(&desc, 0, sizeof(desc));
- desc.RenderTarget[0].BlendEnable = TRUE;
- desc.RenderTarget[0].SrcBlend = D3D11_BLEND_ONE;
- desc.RenderTarget[0].DestBlend = D3D11_BLEND_ZERO;
- desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
- desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ZERO;
- desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
- desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
- desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_RED |
- D3D11_COLOR_WRITE_ENABLE_GREEN |
- D3D11_COLOR_WRITE_ENABLE_BLUE;
- return desc;
-}
-
-D3D11_INPUT_ELEMENT_DESC quad2DLayout[] = {
- {"POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
- {"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 8, D3D11_INPUT_PER_VERTEX_DATA, 0},
-};
-
-D3D11_INPUT_ELEMENT_DESC quad3DLayout[] = {
- {"POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
- {"LAYER", 0, DXGI_FORMAT_R32_UINT, 0, 8, D3D11_INPUT_PER_VERTEX_DATA, 0},
- {"TEXCOORD", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0},
-};
-
-DXGI_FORMAT GetStencilSRVFormat(const d3d11::Format &formatSet)
-{
- switch (formatSet.texFormat)
- {
- case DXGI_FORMAT_R32G8X24_TYPELESS:
- return DXGI_FORMAT_X32_TYPELESS_G8X24_UINT;
- case DXGI_FORMAT_R24G8_TYPELESS:
- return DXGI_FORMAT_X24_TYPELESS_G8_UINT;
- default:
- UNREACHABLE();
- return DXGI_FORMAT_UNKNOWN;
- }
-}
-
-} // namespace
-
-Blit11::Shader::Shader() = default;
-
-Blit11::Shader::Shader(Shader &&other) = default;
-
-Blit11::Shader::~Shader() = default;
-
-Blit11::Shader &Blit11::Shader::operator=(Blit11::Shader &&other) = default;
-
-Blit11::Blit11(Renderer11 *renderer)
- : mRenderer(renderer),
- mResourcesInitialized(false),
- mVertexBuffer(),
- mPointSampler(),
- mLinearSampler(),
- mScissorEnabledRasterizerState(),
- mScissorDisabledRasterizerState(),
- mDepthStencilState(),
- mQuad2DIL(quad2DLayout,
- ArraySize(quad2DLayout),
- g_VS_Passthrough2D,
- ArraySize(g_VS_Passthrough2D),
- "Blit11 2D input layout"),
- mQuad2DVS(g_VS_Passthrough2D, ArraySize(g_VS_Passthrough2D), "Blit11 2D vertex shader"),
- mDepthPS(g_PS_PassthroughDepth2D,
- ArraySize(g_PS_PassthroughDepth2D),
- "Blit11 2D depth pixel shader"),
- mQuad3DIL(quad3DLayout,
- ArraySize(quad3DLayout),
- g_VS_Passthrough3D,
- ArraySize(g_VS_Passthrough3D),
- "Blit11 3D input layout"),
- mQuad3DVS(g_VS_Passthrough3D, ArraySize(g_VS_Passthrough3D), "Blit11 3D vertex shader"),
- mQuad3DGS(g_GS_Passthrough3D, ArraySize(g_GS_Passthrough3D), "Blit11 3D geometry shader"),
- mAlphaMaskBlendState(GetAlphaMaskBlendStateDesc(), "Blit11 Alpha Mask Blend"),
- mSwizzleCB(),
- mResolveDepthStencilVS(g_VS_ResolveDepthStencil,
- ArraySize(g_VS_ResolveDepthStencil),
- "Blit11::mResolveDepthStencilVS"),
- mResolveDepthPS(g_PS_ResolveDepth, ArraySize(g_PS_ResolveDepth), "Blit11::mResolveDepthPS"),
- mResolveDepthStencilPS(g_PS_ResolveDepthStencil,
- ArraySize(g_PS_ResolveDepthStencil),
- "Blit11::mResolveDepthStencilPS"),
- mResolveStencilPS(g_PS_ResolveStencil,
- ArraySize(g_PS_ResolveStencil),
- "Blit11::mResolveStencilPS"),
- mStencilSRV(),
- mResolvedDepthStencilRTView()
-{
-}
-
-Blit11::~Blit11()
-{
-}
-
-gl::Error Blit11::initResources()
-{
- if (mResourcesInitialized)
- {
- return gl::NoError();
- }
-
- TRACE_EVENT0("gpu.angle", "Blit11::initResources");
-
- D3D11_BUFFER_DESC vbDesc;
- vbDesc.ByteWidth =
- static_cast<unsigned int>(std::max(sizeof(d3d11::PositionLayerTexCoord3DVertex),
- sizeof(d3d11::PositionTexCoordVertex)) *
- 6 * mRenderer->getNativeCaps().max3DTextureSize);
- vbDesc.Usage = D3D11_USAGE_DYNAMIC;
- vbDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
- vbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- vbDesc.MiscFlags = 0;
- vbDesc.StructureByteStride = 0;
-
- ANGLE_TRY(mRenderer->allocateResource(vbDesc, &mVertexBuffer));
- mVertexBuffer.setDebugName("Blit11 vertex buffer");
-
- D3D11_SAMPLER_DESC pointSamplerDesc;
- pointSamplerDesc.Filter = D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR;
- pointSamplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
- pointSamplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
- pointSamplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
- pointSamplerDesc.MipLODBias = 0.0f;
- pointSamplerDesc.MaxAnisotropy = 0;
- pointSamplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
- pointSamplerDesc.BorderColor[0] = 0.0f;
- pointSamplerDesc.BorderColor[1] = 0.0f;
- pointSamplerDesc.BorderColor[2] = 0.0f;
- pointSamplerDesc.BorderColor[3] = 0.0f;
- pointSamplerDesc.MinLOD = 0.0f;
- pointSamplerDesc.MaxLOD = FLT_MAX;
-
- ANGLE_TRY(mRenderer->allocateResource(pointSamplerDesc, &mPointSampler));
- mPointSampler.setDebugName("Blit11 point sampler");
-
- D3D11_SAMPLER_DESC linearSamplerDesc;
- linearSamplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
- linearSamplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
- linearSamplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
- linearSamplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
- linearSamplerDesc.MipLODBias = 0.0f;
- linearSamplerDesc.MaxAnisotropy = 0;
- linearSamplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
- linearSamplerDesc.BorderColor[0] = 0.0f;
- linearSamplerDesc.BorderColor[1] = 0.0f;
- linearSamplerDesc.BorderColor[2] = 0.0f;
- linearSamplerDesc.BorderColor[3] = 0.0f;
- linearSamplerDesc.MinLOD = 0.0f;
- linearSamplerDesc.MaxLOD = FLT_MAX;
-
- ANGLE_TRY(mRenderer->allocateResource(linearSamplerDesc, &mLinearSampler));
- mLinearSampler.setDebugName("Blit11 linear sampler");
-
- // Use a rasterizer state that will not cull so that inverted quads will not be culled
- D3D11_RASTERIZER_DESC rasterDesc;
- rasterDesc.FillMode = D3D11_FILL_SOLID;
- rasterDesc.CullMode = D3D11_CULL_NONE;
- rasterDesc.FrontCounterClockwise = FALSE;
- rasterDesc.DepthBias = 0;
- rasterDesc.SlopeScaledDepthBias = 0.0f;
- rasterDesc.DepthBiasClamp = 0.0f;
- rasterDesc.DepthClipEnable = TRUE;
- rasterDesc.MultisampleEnable = FALSE;
- rasterDesc.AntialiasedLineEnable = FALSE;
-
- rasterDesc.ScissorEnable = TRUE;
- ANGLE_TRY(mRenderer->allocateResource(rasterDesc, &mScissorEnabledRasterizerState));
- mScissorEnabledRasterizerState.setDebugName("Blit11 scissoring rasterizer state");
-
- rasterDesc.ScissorEnable = FALSE;
- ANGLE_TRY(mRenderer->allocateResource(rasterDesc, &mScissorDisabledRasterizerState));
- mScissorDisabledRasterizerState.setDebugName("Blit11 no scissoring rasterizer state");
-
- D3D11_DEPTH_STENCIL_DESC depthStencilDesc;
- depthStencilDesc.DepthEnable = TRUE;
- depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
- depthStencilDesc.DepthFunc = D3D11_COMPARISON_ALWAYS;
- depthStencilDesc.StencilEnable = FALSE;
- depthStencilDesc.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK;
- depthStencilDesc.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK;
- depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
- depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
- depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
- depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
- depthStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
- depthStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
- depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
- depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
-
- ANGLE_TRY(mRenderer->allocateResource(depthStencilDesc, &mDepthStencilState));
- mDepthStencilState.setDebugName("Blit11 depth stencil state");
-
- D3D11_BUFFER_DESC swizzleBufferDesc;
- swizzleBufferDesc.ByteWidth = sizeof(unsigned int) * 4;
- swizzleBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
- swizzleBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
- swizzleBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- swizzleBufferDesc.MiscFlags = 0;
- swizzleBufferDesc.StructureByteStride = 0;
-
- ANGLE_TRY(mRenderer->allocateResource(swizzleBufferDesc, &mSwizzleCB));
- mSwizzleCB.setDebugName("Blit11 swizzle constant buffer");
-
- mResourcesInitialized = true;
-
- return gl::NoError();
-}
-
-// static
-Blit11::BlitShaderType Blit11::GetBlitShaderType(GLenum destinationFormat,
- GLenum sourceFormat,
- bool isSigned,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- ShaderDimension dimension)
-{
- if (dimension == SHADER_3D)
- {
- ASSERT(!unpackPremultiplyAlpha && !unpackUnmultiplyAlpha);
-
- if (isSigned)
- {
- switch (destinationFormat)
- {
- case GL_RGBA_INTEGER:
- return BLITSHADER_3D_RGBAI;
- case GL_RGB_INTEGER:
- return BLITSHADER_3D_RGBI;
- case GL_RG_INTEGER:
- return BLITSHADER_3D_RGI;
- case GL_RED_INTEGER:
- return BLITSHADER_3D_RI;
- default:
- UNREACHABLE();
- return BLITSHADER_INVALID;
- }
- }
- else
- {
- switch (destinationFormat)
- {
- case GL_RGBA:
- return BLITSHADER_3D_RGBAF;
- case GL_RGBA_INTEGER:
- return BLITSHADER_3D_RGBAUI;
- case GL_BGRA_EXT:
- return BLITSHADER_3D_BGRAF;
- case GL_RGB:
- return BLITSHADER_3D_RGBF;
- case GL_RGB_INTEGER:
- return BLITSHADER_3D_RGBUI;
- case GL_RG:
- return BLITSHADER_3D_RGF;
- case GL_RG_INTEGER:
- return BLITSHADER_3D_RGUI;
- case GL_RED:
- return BLITSHADER_3D_RF;
- case GL_RED_INTEGER:
- return BLITSHADER_3D_RUI;
- case GL_ALPHA:
- return BLITSHADER_3D_ALPHA;
- case GL_LUMINANCE:
- return BLITSHADER_3D_LUMA;
- case GL_LUMINANCE_ALPHA:
- return BLITSHADER_3D_LUMAALPHA;
- default:
- UNREACHABLE();
- return BLITSHADER_INVALID;
- }
- }
- }
- else if (isSigned)
- {
- ASSERT(!unpackPremultiplyAlpha && !unpackUnmultiplyAlpha);
-
- switch (destinationFormat)
- {
- case GL_RGBA_INTEGER:
- return BLITSHADER_2D_RGBAI;
- case GL_RGB_INTEGER:
- return BLITSHADER_2D_RGBI;
- case GL_RG_INTEGER:
- return BLITSHADER_2D_RGI;
- case GL_RED_INTEGER:
- return BLITSHADER_2D_RI;
- default:
- UNREACHABLE();
- return BLITSHADER_INVALID;
- }
- }
- else
- {
- bool floatToIntBlit =
- !gl::IsIntegerFormat(sourceFormat) && gl::IsIntegerFormat(destinationFormat);
- if (unpackPremultiplyAlpha != unpackUnmultiplyAlpha || floatToIntBlit)
- {
- switch (destinationFormat)
- {
- case GL_RGBA:
- case GL_BGRA_EXT:
- ASSERT(!floatToIntBlit);
- return unpackPremultiplyAlpha ? BLITSHADER_2D_RGBAF_PREMULTIPLY
- : BLITSHADER_2D_RGBAF_UNMULTIPLY;
-
- case GL_RGB:
- case GL_RG:
- case GL_RED:
- ASSERT(!floatToIntBlit);
- return unpackPremultiplyAlpha ? BLITSHADER_2D_RGBF_PREMULTIPLY
- : BLITSHADER_2D_RGBF_UNMULTIPLY;
-
- case GL_RGBA_INTEGER:
- if (unpackPremultiplyAlpha == unpackUnmultiplyAlpha)
- {
- return BLITSHADER_2D_RGBAF_TOUI;
- }
- else
- {
- return unpackPremultiplyAlpha ? BLITSHADER_2D_RGBAF_TOUI_PREMULTIPLY
- : BLITSHADER_2D_RGBAF_TOUI_UNMULTIPLY;
- }
-
- case GL_RGB_INTEGER:
- case GL_RG_INTEGER:
- case GL_RED_INTEGER:
- if (unpackPremultiplyAlpha == unpackUnmultiplyAlpha)
- {
- return BLITSHADER_2D_RGBF_TOUI;
- }
- else
- {
- return unpackPremultiplyAlpha ? BLITSHADER_2D_RGBF_TOUI_PREMULTIPLY
- : BLITSHADER_2D_RGBF_TOUI_UNMULTIPLY;
- }
- case GL_LUMINANCE:
- ASSERT(!floatToIntBlit);
- return unpackPremultiplyAlpha ? BLITSHADER_2D_LUMAF_PREMULTIPLY
- : BLITSHADER_2D_LUMAF_UNMULTIPLY;
- case GL_LUMINANCE_ALPHA:
- ASSERT(!floatToIntBlit);
- return unpackPremultiplyAlpha ? BLITSHADER_2D_LUMAALPHAF_PREMULTIPLY
- : BLITSHADER_2D_LUMAALPHAF_UNMULTIPLY;
- case GL_ALPHA:
- ASSERT(!floatToIntBlit);
- return BLITSHADER_2D_ALPHA;
- default:
- UNREACHABLE();
- return BLITSHADER_INVALID;
- }
- }
- else
- {
- switch (destinationFormat)
- {
- case GL_RGBA:
- return BLITSHADER_2D_RGBAF;
- case GL_RGBA_INTEGER:
- return BLITSHADER_2D_RGBAUI;
- case GL_BGRA_EXT:
- return BLITSHADER_2D_BGRAF;
- case GL_RGB:
- return BLITSHADER_2D_RGBF;
- case GL_RGB_INTEGER:
- return BLITSHADER_2D_RGBUI;
- case GL_RG:
- return BLITSHADER_2D_RGF;
- case GL_RG_INTEGER:
- return BLITSHADER_2D_RGUI;
- case GL_RED:
- return BLITSHADER_2D_RF;
- case GL_RED_INTEGER:
- return BLITSHADER_2D_RUI;
- case GL_ALPHA:
- return BLITSHADER_2D_ALPHA;
- case GL_LUMINANCE:
- return BLITSHADER_2D_LUMA;
- case GL_LUMINANCE_ALPHA:
- return BLITSHADER_2D_LUMAALPHA;
- default:
- UNREACHABLE();
- return BLITSHADER_INVALID;
- }
- }
- }
-}
-
-// static
-Blit11::SwizzleShaderType Blit11::GetSwizzleShaderType(GLenum type,
- D3D11_SRV_DIMENSION dimensionality)
-{
- switch (dimensionality)
- {
- case D3D11_SRV_DIMENSION_TEXTURE2D:
- switch (type)
- {
- case GL_FLOAT:
- return SWIZZLESHADER_2D_FLOAT;
- case GL_UNSIGNED_INT:
- return SWIZZLESHADER_2D_UINT;
- case GL_INT:
- return SWIZZLESHADER_2D_INT;
- default:
- UNREACHABLE();
- return SWIZZLESHADER_INVALID;
- }
- case D3D11_SRV_DIMENSION_TEXTURECUBE:
- switch (type)
- {
- case GL_FLOAT:
- return SWIZZLESHADER_CUBE_FLOAT;
- case GL_UNSIGNED_INT:
- return SWIZZLESHADER_CUBE_UINT;
- case GL_INT:
- return SWIZZLESHADER_CUBE_INT;
- default:
- UNREACHABLE();
- return SWIZZLESHADER_INVALID;
- }
- case D3D11_SRV_DIMENSION_TEXTURE3D:
- switch (type)
- {
- case GL_FLOAT:
- return SWIZZLESHADER_3D_FLOAT;
- case GL_UNSIGNED_INT:
- return SWIZZLESHADER_3D_UINT;
- case GL_INT:
- return SWIZZLESHADER_3D_INT;
- default:
- UNREACHABLE();
- return SWIZZLESHADER_INVALID;
- }
- case D3D11_SRV_DIMENSION_TEXTURE2DARRAY:
- switch (type)
- {
- case GL_FLOAT:
- return SWIZZLESHADER_ARRAY_FLOAT;
- case GL_UNSIGNED_INT:
- return SWIZZLESHADER_ARRAY_UINT;
- case GL_INT:
- return SWIZZLESHADER_ARRAY_INT;
- default:
- UNREACHABLE();
- return SWIZZLESHADER_INVALID;
- }
- default:
- UNREACHABLE();
- return SWIZZLESHADER_INVALID;
- }
-}
-
-gl::Error Blit11::getShaderSupport(const Shader &shader, Blit11::ShaderSupport *supportOut)
-{
- if (shader.dimension == SHADER_2D)
- {
- ANGLE_TRY(mQuad2DIL.resolve(mRenderer));
- ANGLE_TRY(mQuad2DVS.resolve(mRenderer));
- supportOut->inputLayout = &mQuad2DIL.getObj();
- supportOut->vertexShader = &mQuad2DVS.getObj();
- supportOut->geometryShader = nullptr;
- supportOut->vertexWriteFunction = Write2DVertices;
- }
- else
- {
- ASSERT(shader.dimension == SHADER_3D);
- ANGLE_TRY(mQuad3DIL.resolve(mRenderer));
- ANGLE_TRY(mQuad3DVS.resolve(mRenderer));
- ANGLE_TRY(mQuad3DGS.resolve(mRenderer));
- supportOut->inputLayout = &mQuad2DIL.getObj();
- supportOut->vertexShader = &mQuad3DVS.getObj();
- supportOut->geometryShader = &mQuad3DGS.getObj();
- supportOut->vertexWriteFunction = Write3DVertices;
- }
-
- return gl::NoError();
-}
-
-gl::Error Blit11::swizzleTexture(const gl::Context *context,
- const d3d11::SharedSRV &source,
- const d3d11::RenderTargetView &dest,
- const gl::Extents &size,
- const gl::SwizzleState &swizzleTarget)
-{
- ANGLE_TRY(initResources());
-
- HRESULT result;
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- D3D11_SHADER_RESOURCE_VIEW_DESC sourceSRVDesc;
- source.get()->GetDesc(&sourceSRVDesc);
-
- GLenum componentType = d3d11::GetComponentType(sourceSRVDesc.Format);
- if (componentType == GL_NONE)
- {
- // We're swizzling the depth component of a depth-stencil texture.
- switch (sourceSRVDesc.Format)
- {
- case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
- componentType = GL_UNSIGNED_NORMALIZED;
- break;
- case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
- componentType = GL_FLOAT;
- break;
- default:
- UNREACHABLE();
- break;
- }
- }
-
- GLenum shaderType = GL_NONE;
- switch (componentType)
- {
- case GL_UNSIGNED_NORMALIZED:
- case GL_SIGNED_NORMALIZED:
- case GL_FLOAT:
- shaderType = GL_FLOAT;
- break;
- case GL_INT:
- shaderType = GL_INT;
- break;
- case GL_UNSIGNED_INT:
- shaderType = GL_UNSIGNED_INT;
- break;
- default:
- UNREACHABLE();
- break;
- }
-
- const Shader *shader = nullptr;
- ANGLE_TRY(getSwizzleShader(shaderType, sourceSRVDesc.ViewDimension, &shader));
-
- // Set vertices
- D3D11_MAPPED_SUBRESOURCE mappedResource;
- result =
- deviceContext->Map(mVertexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to map internal vertex buffer for swizzle, "
- << gl::FmtHR(result);
- }
-
- ShaderSupport support;
- ANGLE_TRY(getShaderSupport(*shader, &support));
-
- UINT stride = 0;
- UINT drawCount = 0;
- D3D11_PRIMITIVE_TOPOLOGY topology;
-
- gl::Box area(0, 0, 0, size.width, size.height, size.depth);
- support.vertexWriteFunction(area, size, area, size, mappedResource.pData, &stride, &drawCount,
- &topology);
-
- deviceContext->Unmap(mVertexBuffer.get(), 0);
-
- // Set constant buffer
- result = deviceContext->Map(mSwizzleCB.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to map internal constant buffer for swizzle, "
- << gl::FmtHR(result);
- }
-
- unsigned int *swizzleIndices = reinterpret_cast<unsigned int *>(mappedResource.pData);
- swizzleIndices[0] = GetSwizzleIndex(swizzleTarget.swizzleRed);
- swizzleIndices[1] = GetSwizzleIndex(swizzleTarget.swizzleGreen);
- swizzleIndices[2] = GetSwizzleIndex(swizzleTarget.swizzleBlue);
- swizzleIndices[3] = GetSwizzleIndex(swizzleTarget.swizzleAlpha);
-
- deviceContext->Unmap(mSwizzleCB.get(), 0);
-
- StateManager11 *stateManager = mRenderer->getStateManager();
-
- // Apply vertex buffer
- stateManager->setSingleVertexBuffer(&mVertexBuffer, stride, 0);
-
- // Apply constant buffer
- stateManager->setPixelConstantBuffer(0, &mSwizzleCB);
-
- // Apply state
- stateManager->setSimpleBlendState(nullptr);
- stateManager->setDepthStencilState(nullptr, 0xFFFFFFFF);
- stateManager->setRasterizerState(&mScissorDisabledRasterizerState);
-
- // Apply shaders
- stateManager->setInputLayout(support.inputLayout);
- stateManager->setPrimitiveTopology(topology);
-
- stateManager->setDrawShaders(support.vertexShader, support.geometryShader,
- &shader->pixelShader);
-
- // Apply render target
- stateManager->setRenderTarget(dest.get(), nullptr);
-
- // Set the viewport
- stateManager->setSimpleViewport(size);
-
- // Apply textures and sampler
- stateManager->setSimplePixelTextureAndSampler(source, mPointSampler);
-
- // Draw the quad
- deviceContext->Draw(drawCount, 0);
-
- return gl::NoError();
-}
-
-gl::Error Blit11::copyTexture(const gl::Context *context,
- const d3d11::SharedSRV &source,
- const gl::Box &sourceArea,
- const gl::Extents &sourceSize,
- GLenum sourceFormat,
- const d3d11::RenderTargetView &dest,
- const gl::Box &destArea,
- const gl::Extents &destSize,
- const gl::Rectangle *scissor,
- GLenum destFormat,
- GLenum filter,
- bool maskOffAlpha,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha)
-{
- ANGLE_TRY(initResources());
-
- HRESULT result;
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- // Determine if the source format is a signed integer format, the destFormat will already
- // be GL_XXXX_INTEGER but it does not tell us if it is signed or unsigned.
- D3D11_SHADER_RESOURCE_VIEW_DESC sourceSRVDesc;
- source.get()->GetDesc(&sourceSRVDesc);
-
- GLenum componentType = d3d11::GetComponentType(sourceSRVDesc.Format);
-
- ASSERT(componentType != GL_NONE);
- ASSERT(componentType != GL_SIGNED_NORMALIZED);
- bool isSigned = (componentType == GL_INT);
-
- ShaderDimension dimension =
- (sourceSRVDesc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE3D) ? SHADER_3D : SHADER_2D;
-
- const Shader *shader = nullptr;
- ANGLE_TRY(getBlitShader(destFormat, sourceFormat, isSigned, unpackPremultiplyAlpha,
- unpackUnmultiplyAlpha, dimension, &shader));
-
- ShaderSupport support;
- ANGLE_TRY(getShaderSupport(*shader, &support));
-
- // Set vertices
- D3D11_MAPPED_SUBRESOURCE mappedResource;
- result =
- deviceContext->Map(mVertexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to map internal vertex buffer for texture copy, "
- << gl::FmtHR(result);
- }
-
- UINT stride = 0;
- UINT drawCount = 0;
- D3D11_PRIMITIVE_TOPOLOGY topology;
-
- support.vertexWriteFunction(sourceArea, sourceSize, destArea, destSize, mappedResource.pData,
- &stride, &drawCount, &topology);
-
- deviceContext->Unmap(mVertexBuffer.get(), 0);
-
- StateManager11 *stateManager = mRenderer->getStateManager();
-
- // Apply vertex buffer
- stateManager->setSingleVertexBuffer(&mVertexBuffer, stride, 0);
-
- // Apply state
- if (maskOffAlpha)
- {
- ANGLE_TRY(mAlphaMaskBlendState.resolve(mRenderer));
- stateManager->setSimpleBlendState(&mAlphaMaskBlendState.getObj());
- }
- else
- {
- stateManager->setSimpleBlendState(nullptr);
- }
- stateManager->setDepthStencilState(nullptr, 0xFFFFFFFF);
-
- if (scissor)
- {
- stateManager->setSimpleScissorRect(*scissor);
- stateManager->setRasterizerState(&mScissorEnabledRasterizerState);
- }
- else
- {
- stateManager->setRasterizerState(&mScissorDisabledRasterizerState);
- }
-
- // Apply shaders
- stateManager->setInputLayout(support.inputLayout);
- stateManager->setPrimitiveTopology(topology);
-
- stateManager->setDrawShaders(support.vertexShader, support.geometryShader,
- &shader->pixelShader);
-
- // Apply render target
- stateManager->setRenderTarget(dest.get(), nullptr);
-
- // Set the viewport
- stateManager->setSimpleViewport(destSize);
-
- // Apply texture and sampler
- switch (filter)
- {
- case GL_NEAREST:
- stateManager->setSimplePixelTextureAndSampler(source, mPointSampler);
- break;
- case GL_LINEAR:
- stateManager->setSimplePixelTextureAndSampler(source, mLinearSampler);
- break;
-
- default:
- UNREACHABLE();
- return gl::InternalError() << "Internal error, unknown blit filter mode.";
- }
-
- // Draw the quad
- deviceContext->Draw(drawCount, 0);
-
- return gl::NoError();
-}
-
-gl::Error Blit11::copyStencil(const gl::Context *context,
- const TextureHelper11 &source,
- unsigned int sourceSubresource,
- const gl::Box &sourceArea,
- const gl::Extents &sourceSize,
- const TextureHelper11 &dest,
- unsigned int destSubresource,
- const gl::Box &destArea,
- const gl::Extents &destSize,
- const gl::Rectangle *scissor)
-{
- return copyDepthStencilImpl(source, sourceSubresource, sourceArea, sourceSize, dest,
- destSubresource, destArea, destSize, scissor, true);
-}
-
-gl::Error Blit11::copyDepth(const gl::Context *context,
- const d3d11::SharedSRV &source,
- const gl::Box &sourceArea,
- const gl::Extents &sourceSize,
- const d3d11::DepthStencilView &dest,
- const gl::Box &destArea,
- const gl::Extents &destSize,
- const gl::Rectangle *scissor)
-{
- ANGLE_TRY(initResources());
-
- HRESULT result;
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- // Set vertices
- D3D11_MAPPED_SUBRESOURCE mappedResource;
- result =
- deviceContext->Map(mVertexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to map internal vertex buffer for texture copy, "
- << gl::FmtHR(result);
- }
-
- UINT stride = 0;
- UINT drawCount = 0;
- D3D11_PRIMITIVE_TOPOLOGY topology;
-
- Write2DVertices(sourceArea, sourceSize, destArea, destSize, mappedResource.pData, &stride,
- &drawCount, &topology);
-
- deviceContext->Unmap(mVertexBuffer.get(), 0);
-
- StateManager11 *stateManager = mRenderer->getStateManager();
-
- // Apply vertex buffer
- stateManager->setSingleVertexBuffer(&mVertexBuffer, stride, 0);
-
- // Apply state
- stateManager->setSimpleBlendState(nullptr);
- stateManager->setDepthStencilState(&mDepthStencilState, 0xFFFFFFFF);
-
- if (scissor)
- {
- stateManager->setSimpleScissorRect(*scissor);
- stateManager->setRasterizerState(&mScissorEnabledRasterizerState);
- }
- else
- {
- stateManager->setRasterizerState(&mScissorDisabledRasterizerState);
- }
-
- ANGLE_TRY(mQuad2DIL.resolve(mRenderer));
- ANGLE_TRY(mQuad2DVS.resolve(mRenderer));
- ANGLE_TRY(mDepthPS.resolve(mRenderer));
-
- // Apply shaders
- stateManager->setInputLayout(&mQuad2DIL.getObj());
- stateManager->setPrimitiveTopology(topology);
-
- stateManager->setDrawShaders(&mQuad2DVS.getObj(), nullptr, &mDepthPS.getObj());
-
- // Apply render target
- stateManager->setRenderTarget(nullptr, dest.get());
-
- // Set the viewport
- stateManager->setSimpleViewport(destSize);
-
- // Apply texture and sampler
- stateManager->setSimplePixelTextureAndSampler(source, mPointSampler);
-
- // Draw the quad
- deviceContext->Draw(drawCount, 0);
-
- return gl::NoError();
-}
-
-gl::Error Blit11::copyDepthStencil(const TextureHelper11 &source,
- unsigned int sourceSubresource,
- const gl::Box &sourceArea,
- const gl::Extents &sourceSize,
- const TextureHelper11 &dest,
- unsigned int destSubresource,
- const gl::Box &destArea,
- const gl::Extents &destSize,
- const gl::Rectangle *scissor)
-{
- return copyDepthStencilImpl(source, sourceSubresource, sourceArea, sourceSize, dest,
- destSubresource, destArea, destSize, scissor, false);
-}
-
-gl::Error Blit11::copyDepthStencilImpl(const TextureHelper11 &source,
- unsigned int sourceSubresource,
- const gl::Box &sourceArea,
- const gl::Extents &sourceSize,
- const TextureHelper11 &dest,
- unsigned int destSubresource,
- const gl::Box &destArea,
- const gl::Extents &destSize,
- const gl::Rectangle *scissor,
- bool stencilOnly)
-{
- auto srcDXGIFormat = source.getFormat();
- const auto &srcSizeInfo = d3d11::GetDXGIFormatSizeInfo(srcDXGIFormat);
- unsigned int srcPixelSize = srcSizeInfo.pixelBytes;
- unsigned int copyOffset = 0;
- unsigned int copySize = srcPixelSize;
- auto destDXGIFormat = dest.getFormat();
- const auto &destSizeInfo = d3d11::GetDXGIFormatSizeInfo(destDXGIFormat);
- unsigned int destPixelSize = destSizeInfo.pixelBytes;
-
- ASSERT(srcDXGIFormat == destDXGIFormat || destDXGIFormat == DXGI_FORMAT_R32_TYPELESS);
-
- if (stencilOnly)
- {
- const auto &srcFormat = source.getFormatSet().format();
-
- // Stencil channel should be right after the depth channel. Some views to depth/stencil
- // resources have red channel for depth, in which case the depth channel bit width is in
- // redBits.
- ASSERT((srcFormat.redBits != 0) != (srcFormat.depthBits != 0));
- GLuint depthBits = srcFormat.redBits + srcFormat.depthBits;
- // Known formats have either 24 or 32 bits of depth.
- ASSERT(depthBits == 24 || depthBits == 32);
- copyOffset = depthBits / 8;
-
- // Stencil is assumed to be 8-bit - currently this is true for all possible formats.
- copySize = 1;
- }
-
- if (srcDXGIFormat != destDXGIFormat)
- {
- if (srcDXGIFormat == DXGI_FORMAT_R24G8_TYPELESS)
- {
- ASSERT(sourceArea == destArea && sourceSize == destSize && scissor == nullptr);
- return copyAndConvert(source, sourceSubresource, sourceArea, sourceSize, dest,
- destSubresource, destArea, destSize, scissor, copyOffset,
- copyOffset, copySize, srcPixelSize, destPixelSize,
- BlitD24S8ToD32F);
- }
- ASSERT(srcDXGIFormat == DXGI_FORMAT_R32G8X24_TYPELESS);
- return copyAndConvert(source, sourceSubresource, sourceArea, sourceSize, dest,
- destSubresource, destArea, destSize, scissor, copyOffset, copyOffset,
- copySize, srcPixelSize, destPixelSize, BlitD32FS8ToD32F);
- }
-
- return copyAndConvert(source, sourceSubresource, sourceArea, sourceSize, dest, destSubresource,
- destArea, destSize, scissor, copyOffset, copyOffset, copySize,
- srcPixelSize, destPixelSize, StretchedBlitNearest);
-}
-
-gl::Error Blit11::copyAndConvertImpl(const TextureHelper11 &source,
- unsigned int sourceSubresource,
- const gl::Box &sourceArea,
- const gl::Extents &sourceSize,
- const TextureHelper11 &destStaging,
- const gl::Box &destArea,
- const gl::Extents &destSize,
- const gl::Rectangle *scissor,
- size_t readOffset,
- size_t writeOffset,
- size_t copySize,
- size_t srcPixelStride,
- size_t destPixelStride,
- BlitConvertFunction *convertFunction)
-{
- ANGLE_TRY(initResources());
-
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- TextureHelper11 sourceStaging;
- ANGLE_TRY_RESULT(mRenderer->createStagingTexture(ResourceType::Texture2D, source.getFormatSet(),
- sourceSize, StagingAccess::READ),
- sourceStaging);
-
- deviceContext->CopySubresourceRegion(sourceStaging.get(), 0, 0, 0, 0, source.get(),
- sourceSubresource, nullptr);
-
- D3D11_MAPPED_SUBRESOURCE sourceMapping;
- HRESULT result = deviceContext->Map(sourceStaging.get(), 0, D3D11_MAP_READ, 0, &sourceMapping);
- if (FAILED(result))
- {
- return gl::OutOfMemory()
- << "Failed to map internal source staging texture for depth stencil blit, "
- << gl::FmtHR(result);
- }
-
- D3D11_MAPPED_SUBRESOURCE destMapping;
- result = deviceContext->Map(destStaging.get(), 0, D3D11_MAP_WRITE, 0, &destMapping);
- if (FAILED(result))
- {
- deviceContext->Unmap(sourceStaging.get(), 0);
- return gl::OutOfMemory()
- << "Failed to map internal destination staging texture for depth stencil blit, "
- << gl::FmtHR(result);
- }
-
- // Clip dest area to the destination size
- gl::Rectangle clipRect = gl::Rectangle(0, 0, destSize.width, destSize.height);
-
- // Clip dest area to the scissor
- if (scissor)
- {
- gl::ClipRectangle(clipRect, *scissor, &clipRect);
- }
-
- convertFunction(sourceArea, destArea, clipRect, sourceSize, sourceMapping.RowPitch,
- destMapping.RowPitch, readOffset, writeOffset, copySize, srcPixelStride,
- destPixelStride, static_cast<const uint8_t *>(sourceMapping.pData),
- static_cast<uint8_t *>(destMapping.pData));
-
- deviceContext->Unmap(sourceStaging.get(), 0);
- deviceContext->Unmap(destStaging.get(), 0);
-
- return gl::NoError();
-}
-
-gl::Error Blit11::copyAndConvert(const TextureHelper11 &source,
- unsigned int sourceSubresource,
- const gl::Box &sourceArea,
- const gl::Extents &sourceSize,
- const TextureHelper11 &dest,
- unsigned int destSubresource,
- const gl::Box &destArea,
- const gl::Extents &destSize,
- const gl::Rectangle *scissor,
- size_t readOffset,
- size_t writeOffset,
- size_t copySize,
- size_t srcPixelStride,
- size_t destPixelStride,
- BlitConvertFunction *convertFunction)
-{
- ANGLE_TRY(initResources());
-
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- // HACK: Create the destination staging buffer as a read/write texture so
- // ID3D11DevicContext::UpdateSubresource can be called
- // using it's mapped data as a source
- TextureHelper11 destStaging;
- ANGLE_TRY_RESULT(mRenderer->createStagingTexture(ResourceType::Texture2D, dest.getFormatSet(),
- destSize, StagingAccess::READ_WRITE),
- destStaging);
-
- deviceContext->CopySubresourceRegion(destStaging.get(), 0, 0, 0, 0, dest.get(), destSubresource,
- nullptr);
-
- ANGLE_TRY(copyAndConvertImpl(source, sourceSubresource, sourceArea, sourceSize, destStaging,
- destArea, destSize, scissor, readOffset, writeOffset, copySize,
- srcPixelStride, destPixelStride, convertFunction));
-
- // Work around timeouts/TDRs in older NVIDIA drivers.
- if (mRenderer->getWorkarounds().depthStencilBlitExtraCopy)
- {
- D3D11_MAPPED_SUBRESOURCE mapped;
- deviceContext->Map(destStaging.get(), 0, D3D11_MAP_READ, 0, &mapped);
- deviceContext->UpdateSubresource(dest.get(), destSubresource, nullptr, mapped.pData,
- mapped.RowPitch, mapped.DepthPitch);
- deviceContext->Unmap(destStaging.get(), 0);
- }
- else
- {
- deviceContext->CopySubresourceRegion(dest.get(), destSubresource, 0, 0, 0,
- destStaging.get(), 0, nullptr);
- }
-
- return gl::NoError();
-}
-
-gl::Error Blit11::addBlitShaderToMap(BlitShaderType blitShaderType,
- ShaderDimension dimension,
- const ShaderData &shaderData,
- const char *name)
-{
- ASSERT(mBlitShaderMap.find(blitShaderType) == mBlitShaderMap.end());
-
- d3d11::PixelShader ps;
- ANGLE_TRY(mRenderer->allocateResource(shaderData, &ps));
- ps.setDebugName(name);
-
- Shader shader;
- shader.dimension = dimension;
- shader.pixelShader = std::move(ps);
-
- mBlitShaderMap[blitShaderType] = std::move(shader);
- return gl::NoError();
-}
-
-gl::Error Blit11::addSwizzleShaderToMap(SwizzleShaderType swizzleShaderType,
- ShaderDimension dimension,
- const ShaderData &shaderData,
- const char *name)
-{
- ASSERT(mSwizzleShaderMap.find(swizzleShaderType) == mSwizzleShaderMap.end());
-
- d3d11::PixelShader ps;
- ANGLE_TRY(mRenderer->allocateResource(shaderData, &ps));
- ps.setDebugName(name);
-
- Shader shader;
- shader.dimension = dimension;
- shader.pixelShader = std::move(ps);
-
- mSwizzleShaderMap[swizzleShaderType] = std::move(shader);
- return gl::NoError();
-}
-
-void Blit11::clearShaderMap()
-{
- mBlitShaderMap.clear();
- mSwizzleShaderMap.clear();
-}
-
-gl::Error Blit11::getBlitShader(GLenum destFormat,
- GLenum sourceFormat,
- bool isSigned,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- ShaderDimension dimension,
- const Shader **shader)
-{
- BlitShaderType blitShaderType =
- GetBlitShaderType(destFormat, sourceFormat, isSigned, unpackPremultiplyAlpha,
- unpackUnmultiplyAlpha, dimension);
-
- if (blitShaderType == BLITSHADER_INVALID)
- {
- return gl::InternalError() << "Internal blit shader type mismatch";
- }
-
- auto blitShaderIt = mBlitShaderMap.find(blitShaderType);
- if (blitShaderIt != mBlitShaderMap.end())
- {
- *shader = &blitShaderIt->second;
- return gl::NoError();
- }
-
- ASSERT(dimension == SHADER_2D || mRenderer->isES3Capable());
-
- switch (blitShaderType)
- {
- case BLITSHADER_2D_RGBAF:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
- ShaderData(g_PS_PassthroughRGBA2D),
- "Blit11 2D RGBA pixel shader"));
- break;
- case BLITSHADER_2D_BGRAF:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
- ShaderData(g_PS_PassthroughRGBA2D),
- "Blit11 2D BGRA pixel shader"));
- break;
- case BLITSHADER_2D_RGBF:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
- ShaderData(g_PS_PassthroughRGB2D),
- "Blit11 2D RGB pixel shader"));
- break;
- case BLITSHADER_2D_RGF:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
- ShaderData(g_PS_PassthroughRG2D),
- "Blit11 2D RG pixel shader"));
- break;
- case BLITSHADER_2D_RF:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_PassthroughR2D),
- "Blit11 2D R pixel shader"));
- break;
- case BLITSHADER_2D_ALPHA:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_PassthroughA2D),
- "Blit11 2D alpha pixel shader"));
- break;
- case BLITSHADER_2D_LUMA:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
- ShaderData(g_PS_PassthroughLum2D),
- "Blit11 2D lum pixel shader"));
- break;
- case BLITSHADER_2D_LUMAALPHA:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
- ShaderData(g_PS_PassthroughLumAlpha2D),
- "Blit11 2D luminance alpha pixel shader"));
- break;
- case BLITSHADER_2D_RGBAUI:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
- ShaderData(g_PS_PassthroughRGBA2DUI),
- "Blit11 2D RGBA UI pixel shader"));
- break;
- case BLITSHADER_2D_RGBAI:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
- ShaderData(g_PS_PassthroughRGBA2DI),
- "Blit11 2D RGBA I pixel shader"));
- break;
- case BLITSHADER_2D_RGBUI:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
- ShaderData(g_PS_PassthroughRGB2DUI),
- "Blit11 2D RGB UI pixel shader"));
- break;
- case BLITSHADER_2D_RGBI:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
- ShaderData(g_PS_PassthroughRGB2DI),
- "Blit11 2D RGB I pixel shader"));
- break;
- case BLITSHADER_2D_RGUI:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
- ShaderData(g_PS_PassthroughRG2DUI),
- "Blit11 2D RG UI pixel shader"));
- break;
- case BLITSHADER_2D_RGI:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
- ShaderData(g_PS_PassthroughRG2DI),
- "Blit11 2D RG I pixel shader"));
- break;
- case BLITSHADER_2D_RUI:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
- ShaderData(g_PS_PassthroughR2DUI),
- "Blit11 2D R UI pixel shader"));
- break;
- case BLITSHADER_2D_RI:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
- ShaderData(g_PS_PassthroughR2DI),
- "Blit11 2D R I pixel shader"));
- break;
- case BLITSHADER_3D_RGBAF:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
- ShaderData(g_PS_PassthroughRGBA3D),
- "Blit11 3D RGBA pixel shader"));
- break;
- case BLITSHADER_3D_RGBAUI:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
- ShaderData(g_PS_PassthroughRGBA3DUI),
- "Blit11 3D UI RGBA pixel shader"));
- break;
- case BLITSHADER_3D_RGBAI:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
- ShaderData(g_PS_PassthroughRGBA3DI),
- "Blit11 3D I RGBA pixel shader"));
- break;
- case BLITSHADER_3D_BGRAF:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
- ShaderData(g_PS_PassthroughRGBA3D),
- "Blit11 3D BGRA pixel shader"));
- break;
- case BLITSHADER_3D_RGBF:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
- ShaderData(g_PS_PassthroughRGB3D),
- "Blit11 3D RGB pixel shader"));
- break;
- case BLITSHADER_3D_RGBUI:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
- ShaderData(g_PS_PassthroughRGB3DUI),
- "Blit11 3D RGB UI pixel shader"));
- break;
- case BLITSHADER_3D_RGBI:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
- ShaderData(g_PS_PassthroughRGB3DI),
- "Blit11 3D RGB I pixel shader"));
- break;
- case BLITSHADER_3D_RGF:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
- ShaderData(g_PS_PassthroughRG3D),
- "Blit11 3D RG pixel shader"));
- break;
- case BLITSHADER_3D_RGUI:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
- ShaderData(g_PS_PassthroughRG3DUI),
- "Blit11 3D RG UI pixel shader"));
- break;
- case BLITSHADER_3D_RGI:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
- ShaderData(g_PS_PassthroughRG3DI),
- "Blit11 3D RG I pixel shader"));
- break;
- case BLITSHADER_3D_RF:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D, ShaderData(g_PS_PassthroughR3D),
- "Blit11 3D R pixel shader"));
- break;
- case BLITSHADER_3D_RUI:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
- ShaderData(g_PS_PassthroughR3DUI),
- "Blit11 3D R UI pixel shader"));
- break;
- case BLITSHADER_3D_RI:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
- ShaderData(g_PS_PassthroughR3DI),
- "Blit11 3D R I pixel shader"));
- break;
- case BLITSHADER_3D_ALPHA:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
- ShaderData(g_PS_PassthroughRGBA3D),
- "Blit11 3D alpha pixel shader"));
- break;
- case BLITSHADER_3D_LUMA:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
- ShaderData(g_PS_PassthroughLum3D),
- "Blit11 3D luminance pixel shader"));
- break;
- case BLITSHADER_3D_LUMAALPHA:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
- ShaderData(g_PS_PassthroughLumAlpha3D),
- "Blit11 3D luminance alpha pixel shader"));
- break;
-
- case BLITSHADER_2D_RGBAF_PREMULTIPLY:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoF_PM_RGBA),
- "Blit11 2D RGBA premultiply pixel shader"));
- break;
-
- case BLITSHADER_2D_RGBAF_UNMULTIPLY:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoF_UM_RGBA),
- "Blit11 2D RGBA unmultiply pixel shader"));
- break;
-
- case BLITSHADER_2D_RGBF_PREMULTIPLY:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoF_PM_RGB),
- "Blit11 2D RGB premultiply pixel shader"));
- break;
-
- case BLITSHADER_2D_RGBF_UNMULTIPLY:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoF_UM_RGB),
- "Blit11 2D RGB unmultiply pixel shader"));
- break;
-
- case BLITSHADER_2D_RGBAF_TOUI:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoU_PT_RGBA),
- "Blit11 2D RGBA to uint pixel shader"));
- break;
-
- case BLITSHADER_2D_RGBAF_TOUI_PREMULTIPLY:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoU_PM_RGBA),
- "Blit11 2D RGBA to uint premultiply pixel shader"));
- break;
-
- case BLITSHADER_2D_RGBAF_TOUI_UNMULTIPLY:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoU_UM_RGBA),
- "Blit11 2D RGBA to uint unmultiply pixel shader"));
- break;
-
- case BLITSHADER_2D_RGBF_TOUI:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoU_PT_RGB),
- "Blit11 2D RGB to uint pixel shader"));
- break;
-
- case BLITSHADER_2D_RGBF_TOUI_PREMULTIPLY:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoU_PM_RGB),
- "Blit11 2D RGB to uint premultiply pixel shader"));
- break;
-
- case BLITSHADER_2D_RGBF_TOUI_UNMULTIPLY:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoU_UM_RGB),
- "Blit11 2D RGB to uint unmultiply pixel shader"));
- break;
- case BLITSHADER_2D_LUMAF_PREMULTIPLY:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoF_PM_LUMA),
- "Blit11 2D LUMA premultiply pixel shader"));
- break;
- case BLITSHADER_2D_LUMAF_UNMULTIPLY:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoF_UM_LUMA),
- "Blit11 2D LUMA unmultiply pixel shader"));
- break;
- case BLITSHADER_2D_LUMAALPHAF_PREMULTIPLY:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
- ShaderData(g_PS_FtoF_PM_LUMAALPHA),
- "Blit11 2D LUMAALPHA premultiply pixel shader"));
- break;
- case BLITSHADER_2D_LUMAALPHAF_UNMULTIPLY:
- ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
- ShaderData(g_PS_FtoF_UM_LUMAALPHA),
- "Blit11 2D LUMAALPHA unmultiply pixel shader"));
- break;
-
- default:
- UNREACHABLE();
- return gl::InternalError() << "Internal error";
- }
-
- blitShaderIt = mBlitShaderMap.find(blitShaderType);
- ASSERT(blitShaderIt != mBlitShaderMap.end());
- *shader = &blitShaderIt->second;
- return gl::NoError();
-}
-
-gl::Error Blit11::getSwizzleShader(GLenum type,
- D3D11_SRV_DIMENSION viewDimension,
- const Shader **shader)
-{
- SwizzleShaderType swizzleShaderType = GetSwizzleShaderType(type, viewDimension);
-
- if (swizzleShaderType == SWIZZLESHADER_INVALID)
- {
- return gl::InternalError() << "Swizzle shader type not found";
- }
-
- auto swizzleShaderIt = mSwizzleShaderMap.find(swizzleShaderType);
- if (swizzleShaderIt != mSwizzleShaderMap.end())
- {
- *shader = &swizzleShaderIt->second;
- return gl::NoError();
- }
-
- // Swizzling shaders (OpenGL ES 3+)
- ASSERT(mRenderer->isES3Capable());
-
- switch (swizzleShaderType)
- {
- case SWIZZLESHADER_2D_FLOAT:
- ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_2D,
- ShaderData(g_PS_SwizzleF2D),
- "Blit11 2D F swizzle pixel shader"));
- break;
- case SWIZZLESHADER_2D_UINT:
- ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_2D,
- ShaderData(g_PS_SwizzleUI2D),
- "Blit11 2D UI swizzle pixel shader"));
- break;
- case SWIZZLESHADER_2D_INT:
- ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_2D,
- ShaderData(g_PS_SwizzleI2D),
- "Blit11 2D I swizzle pixel shader"));
- break;
- case SWIZZLESHADER_CUBE_FLOAT:
- ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
- ShaderData(g_PS_SwizzleF2DArray),
- "Blit11 2D Cube F swizzle pixel shader"));
- break;
- case SWIZZLESHADER_CUBE_UINT:
- ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
- ShaderData(g_PS_SwizzleUI2DArray),
- "Blit11 2D Cube UI swizzle pixel shader"));
- break;
- case SWIZZLESHADER_CUBE_INT:
- ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
- ShaderData(g_PS_SwizzleI2DArray),
- "Blit11 2D Cube I swizzle pixel shader"));
- break;
- case SWIZZLESHADER_3D_FLOAT:
- ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
- ShaderData(g_PS_SwizzleF3D),
- "Blit11 3D F swizzle pixel shader"));
- break;
- case SWIZZLESHADER_3D_UINT:
- ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
- ShaderData(g_PS_SwizzleUI3D),
- "Blit11 3D UI swizzle pixel shader"));
- break;
- case SWIZZLESHADER_3D_INT:
- ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
- ShaderData(g_PS_SwizzleI3D),
- "Blit11 3D I swizzle pixel shader"));
- break;
- case SWIZZLESHADER_ARRAY_FLOAT:
- ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
- ShaderData(g_PS_SwizzleF2DArray),
- "Blit11 2D Array F swizzle pixel shader"));
- break;
- case SWIZZLESHADER_ARRAY_UINT:
- ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
- ShaderData(g_PS_SwizzleUI2DArray),
- "Blit11 2D Array UI swizzle pixel shader"));
- break;
- case SWIZZLESHADER_ARRAY_INT:
- ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
- ShaderData(g_PS_SwizzleI2DArray),
- "Blit11 2D Array I swizzle pixel shader"));
- break;
- default:
- UNREACHABLE();
- return gl::InternalError() << "Internal error";
- }
-
- swizzleShaderIt = mSwizzleShaderMap.find(swizzleShaderType);
- ASSERT(swizzleShaderIt != mSwizzleShaderMap.end());
- *shader = &swizzleShaderIt->second;
- return gl::NoError();
-}
-
-gl::ErrorOrResult<TextureHelper11> Blit11::resolveDepth(const gl::Context *context,
- RenderTarget11 *depth)
-{
- ANGLE_TRY(initResources());
-
- // Multisampled depth stencil SRVs are not available in feature level 10.0
- ASSERT(mRenderer->getRenderer11DeviceCaps().featureLevel > D3D_FEATURE_LEVEL_10_0);
-
- const auto &extents = depth->getExtents();
- auto *deviceContext = mRenderer->getDeviceContext();
- auto *stateManager = mRenderer->getStateManager();
-
- ANGLE_TRY(initResolveDepthOnly(depth->getFormatSet(), extents));
-
- ANGLE_TRY(mResolveDepthStencilVS.resolve(mRenderer));
- ANGLE_TRY(mResolveDepthPS.resolve(mRenderer));
-
- // Apply the necessary state changes to the D3D11 immediate device context.
- stateManager->setInputLayout(nullptr);
- stateManager->setPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
- stateManager->setDrawShaders(&mResolveDepthStencilVS.getObj(), nullptr,
- &mResolveDepthPS.getObj());
- stateManager->setRasterizerState(nullptr);
- stateManager->setDepthStencilState(&mDepthStencilState, 0xFFFFFFFF);
- stateManager->setRenderTargets(nullptr, 0, mResolvedDepthDSView.get());
- stateManager->setSimpleBlendState(nullptr);
- stateManager->setSimpleViewport(extents);
-
- // Set the viewport
- stateManager->setShaderResourceShared(gl::SAMPLER_PIXEL, 0, &depth->getShaderResourceView());
-
- // Trigger the blit on the GPU.
- deviceContext->Draw(6, 0);
-
- return mResolvedDepth;
-}
-
-gl::Error Blit11::initResolveDepthOnly(const d3d11::Format &format, const gl::Extents &extents)
-{
- if (mResolvedDepth.valid() && extents == mResolvedDepth.getExtents() &&
- format.texFormat == mResolvedDepth.getFormat())
- {
- return gl::NoError();
- }
-
- D3D11_TEXTURE2D_DESC textureDesc;
- textureDesc.Width = extents.width;
- textureDesc.Height = extents.height;
- textureDesc.MipLevels = 1;
- textureDesc.ArraySize = 1;
- textureDesc.Format = format.texFormat;
- textureDesc.SampleDesc.Count = 1;
- textureDesc.SampleDesc.Quality = 0;
- textureDesc.Usage = D3D11_USAGE_DEFAULT;
- textureDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE;
- textureDesc.CPUAccessFlags = 0;
- textureDesc.MiscFlags = 0;
-
- ANGLE_TRY(mRenderer->allocateTexture(textureDesc, format, &mResolvedDepth));
- mResolvedDepth.setDebugName("Blit11::mResolvedDepth");
-
- D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
- dsvDesc.Flags = 0;
- dsvDesc.Format = format.dsvFormat;
- dsvDesc.Texture2D.MipSlice = 0;
- dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
-
- ANGLE_TRY(mRenderer->allocateResource(dsvDesc, mResolvedDepth.get(), &mResolvedDepthDSView));
- mResolvedDepthDSView.setDebugName("Blit11::mResolvedDepthDSView");
-
- // Possibly D3D11 bug or undefined behaviour: Clear the DSV so that our first render
- // works as expected. Otherwise the results of the first use seem to be incorrect.
- ID3D11DeviceContext *context = mRenderer->getDeviceContext();
- context->ClearDepthStencilView(mResolvedDepthDSView.get(), D3D11_CLEAR_DEPTH, 1.0f, 0);
-
- return gl::NoError();
-}
-
-gl::Error Blit11::initResolveDepthStencil(const gl::Extents &extents)
-{
- // Check if we need to recreate depth stencil view
- if (mResolvedDepthStencil.valid() && extents == mResolvedDepthStencil.getExtents())
- {
- ASSERT(mResolvedDepthStencil.getFormat() == DXGI_FORMAT_R32G32_FLOAT);
- return gl::NoError();
- }
-
- if (mResolvedDepthStencil.valid())
- {
- releaseResolveDepthStencilResources();
- }
-
- const auto &formatSet = d3d11::Format::Get(GL_RG32F, mRenderer->getRenderer11DeviceCaps());
-
- D3D11_TEXTURE2D_DESC textureDesc;
- textureDesc.Width = extents.width;
- textureDesc.Height = extents.height;
- textureDesc.MipLevels = 1;
- textureDesc.ArraySize = 1;
- textureDesc.Format = formatSet.texFormat;
- textureDesc.SampleDesc.Count = 1;
- textureDesc.SampleDesc.Quality = 0;
- textureDesc.Usage = D3D11_USAGE_DEFAULT;
- textureDesc.BindFlags = D3D11_BIND_RENDER_TARGET;
- textureDesc.CPUAccessFlags = 0;
- textureDesc.MiscFlags = 0;
-
- ANGLE_TRY(mRenderer->allocateTexture(textureDesc, formatSet, &mResolvedDepthStencil));
- mResolvedDepthStencil.setDebugName("Blit11::mResolvedDepthStencil");
-
- ANGLE_TRY(mRenderer->allocateResourceNoDesc(mResolvedDepthStencil.get(),
- &mResolvedDepthStencilRTView));
- mResolvedDepthStencilRTView.setDebugName("Blit11::mResolvedDepthStencilRTView");
-
- return gl::NoError();
-}
-
-gl::ErrorOrResult<TextureHelper11> Blit11::resolveStencil(const gl::Context *context,
- RenderTarget11 *depthStencil,
- bool alsoDepth)
-{
- ANGLE_TRY(initResources());
-
- // Multisampled depth stencil SRVs are not available in feature level 10.0
- ASSERT(mRenderer->getRenderer11DeviceCaps().featureLevel > D3D_FEATURE_LEVEL_10_0);
-
- const auto &extents = depthStencil->getExtents();
-
- ANGLE_TRY(initResolveDepthStencil(extents));
-
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- auto *stateManager = mRenderer->getStateManager();
- ID3D11Resource *stencilResource = depthStencil->getTexture().get();
-
- // Check if we need to re-create the stencil SRV.
- if (mStencilSRV.valid())
- {
- ID3D11Resource *priorResource = nullptr;
- mStencilSRV.get()->GetResource(&priorResource);
-
- if (stencilResource != priorResource)
- {
- mStencilSRV.reset();
- }
-
- SafeRelease(priorResource);
- }
-
- if (!mStencilSRV.valid())
- {
- D3D11_SHADER_RESOURCE_VIEW_DESC srViewDesc;
- srViewDesc.Format = GetStencilSRVFormat(depthStencil->getFormatSet());
- srViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DMS;
-
- ANGLE_TRY(mRenderer->allocateResource(srViewDesc, stencilResource, &mStencilSRV));
- mStencilSRV.setDebugName("Blit11::mStencilSRV");
- }
-
- // Notify the Renderer that all state should be invalidated.
- ANGLE_TRY(mResolveDepthStencilVS.resolve(mRenderer));
-
- // Resolving the depth buffer works by sampling the depth in the shader using a SRV, then
- // writing to the resolved depth buffer using SV_Depth. We can't use this method for stencil
- // because SV_StencilRef isn't supported until HLSL 5.1/D3D11.3.
- const d3d11::PixelShader *pixelShader = nullptr;
- if (alsoDepth)
- {
- ANGLE_TRY(mResolveDepthStencilPS.resolve(mRenderer));
- pixelShader = &mResolveDepthStencilPS.getObj();
- }
- else
- {
- ANGLE_TRY(mResolveStencilPS.resolve(mRenderer));
- pixelShader = &mResolveStencilPS.getObj();
- }
-
- // Apply the necessary state changes to the D3D11 immediate device context.
- stateManager->setInputLayout(nullptr);
- stateManager->setPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
- stateManager->setDrawShaders(&mResolveDepthStencilVS.getObj(), nullptr, pixelShader);
- stateManager->setRasterizerState(nullptr);
- stateManager->setDepthStencilState(nullptr, 0xFFFFFFFF);
- stateManager->setRenderTarget(mResolvedDepthStencilRTView.get(), nullptr);
- stateManager->setSimpleBlendState(nullptr);
-
- // Set the viewport
- stateManager->setSimpleViewport(extents);
- stateManager->setShaderResourceShared(gl::SAMPLER_PIXEL, 0,
- &depthStencil->getShaderResourceView());
- stateManager->setShaderResource(gl::SAMPLER_PIXEL, 1, &mStencilSRV);
-
- // Trigger the blit on the GPU.
- deviceContext->Draw(6, 0);
-
- gl::Box copyBox(0, 0, 0, extents.width, extents.height, 1);
-
- TextureHelper11 dest;
- ANGLE_TRY_RESULT(
- mRenderer->createStagingTexture(ResourceType::Texture2D, depthStencil->getFormatSet(),
- extents, StagingAccess::READ_WRITE),
- dest);
-
- const auto &copyFunction = GetCopyDepthStencilFunction(depthStencil->getInternalFormat());
- const auto &dsFormatSet = depthStencil->getFormatSet();
- const auto &dsDxgiInfo = d3d11::GetDXGIFormatSizeInfo(dsFormatSet.texFormat);
-
- ANGLE_TRY(copyAndConvertImpl(mResolvedDepthStencil, 0, copyBox, extents, dest, copyBox, extents,
- nullptr, 0, 0, 0, 8u, dsDxgiInfo.pixelBytes, copyFunction));
-
- // Return the resolved depth texture, which the caller must Release.
- return dest;
-}
-
-void Blit11::releaseResolveDepthStencilResources()
-{
- mStencilSRV.reset();
- mResolvedDepthStencilRTView.reset();
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.h
deleted file mode 100644
index 14078f9db8..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.h
+++ /dev/null
@@ -1,332 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Blit11.cpp: Texture copy utility class.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_BLIT11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_BLIT11_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-
-#include <map>
-
-namespace rx
-{
-class Renderer11;
-
-class Blit11 : angle::NonCopyable
-{
- public:
- explicit Blit11(Renderer11 *renderer);
- ~Blit11();
-
- gl::Error swizzleTexture(const gl::Context *context,
- const d3d11::SharedSRV &source,
- const d3d11::RenderTargetView &dest,
- const gl::Extents &size,
- const gl::SwizzleState &swizzleTarget);
-
- gl::Error copyTexture(const gl::Context *context,
- const d3d11::SharedSRV &source,
- const gl::Box &sourceArea,
- const gl::Extents &sourceSize,
- GLenum sourceFormat,
- const d3d11::RenderTargetView &dest,
- const gl::Box &destArea,
- const gl::Extents &destSize,
- const gl::Rectangle *scissor,
- GLenum destFormat,
- GLenum filter,
- bool maskOffAlpha,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha);
-
- gl::Error copyStencil(const gl::Context *context,
- const TextureHelper11 &source,
- unsigned int sourceSubresource,
- const gl::Box &sourceArea,
- const gl::Extents &sourceSize,
- const TextureHelper11 &dest,
- unsigned int destSubresource,
- const gl::Box &destArea,
- const gl::Extents &destSize,
- const gl::Rectangle *scissor);
-
- gl::Error copyDepth(const gl::Context *context,
- const d3d11::SharedSRV &source,
- const gl::Box &sourceArea,
- const gl::Extents &sourceSize,
- const d3d11::DepthStencilView &dest,
- const gl::Box &destArea,
- const gl::Extents &destSize,
- const gl::Rectangle *scissor);
-
- gl::Error copyDepthStencil(const TextureHelper11 &source,
- unsigned int sourceSubresource,
- const gl::Box &sourceArea,
- const gl::Extents &sourceSize,
- const TextureHelper11 &dest,
- unsigned int destSubresource,
- const gl::Box &destArea,
- const gl::Extents &destSize,
- const gl::Rectangle *scissor);
-
- gl::ErrorOrResult<TextureHelper11> resolveDepth(const gl::Context *context,
- RenderTarget11 *depth);
-
- gl::ErrorOrResult<TextureHelper11> resolveStencil(const gl::Context *context,
- RenderTarget11 *depthStencil,
- bool alsoDepth);
-
- using BlitConvertFunction = void(const gl::Box &sourceArea,
- const gl::Box &destArea,
- const gl::Rectangle &clipRect,
- const gl::Extents &sourceSize,
- unsigned int sourceRowPitch,
- unsigned int destRowPitch,
- ptrdiff_t readOffset,
- ptrdiff_t writeOffset,
- size_t copySize,
- size_t srcPixelStride,
- size_t destPixelStride,
- const uint8_t *sourceData,
- uint8_t *destData);
-
- private:
- enum BlitShaderType
- {
- BLITSHADER_INVALID,
-
- // Passthrough shaders
- BLITSHADER_2D_RGBAF,
- BLITSHADER_2D_BGRAF,
- BLITSHADER_2D_RGBF,
- BLITSHADER_2D_RGF,
- BLITSHADER_2D_RF,
- BLITSHADER_2D_ALPHA,
- BLITSHADER_2D_LUMA,
- BLITSHADER_2D_LUMAALPHA,
- BLITSHADER_2D_RGBAUI,
- BLITSHADER_2D_RGBAI,
- BLITSHADER_2D_RGBUI,
- BLITSHADER_2D_RGBI,
- BLITSHADER_2D_RGUI,
- BLITSHADER_2D_RGI,
- BLITSHADER_2D_RUI,
- BLITSHADER_2D_RI,
- BLITSHADER_3D_RGBAF,
- BLITSHADER_3D_RGBAUI,
- BLITSHADER_3D_RGBAI,
- BLITSHADER_3D_BGRAF,
- BLITSHADER_3D_RGBF,
- BLITSHADER_3D_RGBUI,
- BLITSHADER_3D_RGBI,
- BLITSHADER_3D_RGF,
- BLITSHADER_3D_RGUI,
- BLITSHADER_3D_RGI,
- BLITSHADER_3D_RF,
- BLITSHADER_3D_RUI,
- BLITSHADER_3D_RI,
- BLITSHADER_3D_ALPHA,
- BLITSHADER_3D_LUMA,
- BLITSHADER_3D_LUMAALPHA,
-
- // Multiply alpha shaders
- BLITSHADER_2D_RGBAF_PREMULTIPLY,
- BLITSHADER_2D_RGBAF_UNMULTIPLY,
-
- BLITSHADER_2D_RGBF_PREMULTIPLY,
- BLITSHADER_2D_RGBF_UNMULTIPLY,
-
- BLITSHADER_2D_RGBAF_TOUI,
- BLITSHADER_2D_RGBAF_TOUI_PREMULTIPLY,
- BLITSHADER_2D_RGBAF_TOUI_UNMULTIPLY,
-
- BLITSHADER_2D_RGBF_TOUI,
- BLITSHADER_2D_RGBF_TOUI_PREMULTIPLY,
- BLITSHADER_2D_RGBF_TOUI_UNMULTIPLY,
-
- BLITSHADER_2D_LUMAF_PREMULTIPLY,
- BLITSHADER_2D_LUMAF_UNMULTIPLY,
-
- BLITSHADER_2D_LUMAALPHAF_PREMULTIPLY,
- BLITSHADER_2D_LUMAALPHAF_UNMULTIPLY
- };
-
- enum SwizzleShaderType
- {
- SWIZZLESHADER_INVALID,
- SWIZZLESHADER_2D_FLOAT,
- SWIZZLESHADER_2D_UINT,
- SWIZZLESHADER_2D_INT,
- SWIZZLESHADER_CUBE_FLOAT,
- SWIZZLESHADER_CUBE_UINT,
- SWIZZLESHADER_CUBE_INT,
- SWIZZLESHADER_3D_FLOAT,
- SWIZZLESHADER_3D_UINT,
- SWIZZLESHADER_3D_INT,
- SWIZZLESHADER_ARRAY_FLOAT,
- SWIZZLESHADER_ARRAY_UINT,
- SWIZZLESHADER_ARRAY_INT,
- };
-
- typedef void (*WriteVertexFunction)(const gl::Box &sourceArea,
- const gl::Extents &sourceSize,
- const gl::Box &destArea,
- const gl::Extents &destSize,
- void *outVertices,
- unsigned int *outStride,
- unsigned int *outVertexCount,
- D3D11_PRIMITIVE_TOPOLOGY *outTopology);
-
- enum ShaderDimension
- {
- SHADER_2D,
- SHADER_3D,
- };
-
- struct Shader
- {
- Shader();
- Shader(Shader &&other);
- ~Shader();
- Shader &operator=(Shader &&other);
-
- ShaderDimension dimension;
- d3d11::PixelShader pixelShader;
- };
-
- struct ShaderSupport
- {
- const d3d11::InputLayout *inputLayout;
- const d3d11::VertexShader *vertexShader;
- const d3d11::GeometryShader *geometryShader;
- WriteVertexFunction vertexWriteFunction;
- };
-
- gl::Error initResources();
-
- gl::Error getShaderSupport(const Shader &shader, ShaderSupport *supportOut);
-
- static BlitShaderType GetBlitShaderType(GLenum destinationFormat,
- GLenum sourceFormat,
- bool isSigned,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- ShaderDimension dimension);
- static SwizzleShaderType GetSwizzleShaderType(GLenum type, D3D11_SRV_DIMENSION dimensionality);
-
- gl::Error copyDepthStencilImpl(const TextureHelper11 &source,
- unsigned int sourceSubresource,
- const gl::Box &sourceArea,
- const gl::Extents &sourceSize,
- const TextureHelper11 &dest,
- unsigned int destSubresource,
- const gl::Box &destArea,
- const gl::Extents &destSize,
- const gl::Rectangle *scissor,
- bool stencilOnly);
-
- gl::Error copyAndConvertImpl(const TextureHelper11 &source,
- unsigned int sourceSubresource,
- const gl::Box &sourceArea,
- const gl::Extents &sourceSize,
- const TextureHelper11 &destStaging,
- const gl::Box &destArea,
- const gl::Extents &destSize,
- const gl::Rectangle *scissor,
- size_t readOffset,
- size_t writeOffset,
- size_t copySize,
- size_t srcPixelStride,
- size_t destPixelStride,
- BlitConvertFunction *convertFunction);
-
- gl::Error copyAndConvert(const TextureHelper11 &source,
- unsigned int sourceSubresource,
- const gl::Box &sourceArea,
- const gl::Extents &sourceSize,
- const TextureHelper11 &dest,
- unsigned int destSubresource,
- const gl::Box &destArea,
- const gl::Extents &destSize,
- const gl::Rectangle *scissor,
- size_t readOffset,
- size_t writeOffset,
- size_t copySize,
- size_t srcPixelStride,
- size_t destPixelStride,
- BlitConvertFunction *convertFunction);
-
- gl::Error addBlitShaderToMap(BlitShaderType blitShaderType,
- ShaderDimension dimension,
- const ShaderData &shaderData,
- const char *name);
-
- gl::Error getBlitShader(GLenum destFormat,
- GLenum sourceFormat,
- bool isSigned,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- ShaderDimension dimension,
- const Shader **shaderOut);
- gl::Error getSwizzleShader(GLenum type,
- D3D11_SRV_DIMENSION viewDimension,
- const Shader **shaderOut);
-
- gl::Error addSwizzleShaderToMap(SwizzleShaderType swizzleShaderType,
- ShaderDimension dimension,
- const ShaderData &shaderData,
- const char *name);
-
- void clearShaderMap();
- void releaseResolveDepthStencilResources();
- gl::Error initResolveDepthOnly(const d3d11::Format &format, const gl::Extents &extents);
- gl::Error initResolveDepthStencil(const gl::Extents &extents);
-
- Renderer11 *mRenderer;
-
- std::map<BlitShaderType, Shader> mBlitShaderMap;
- std::map<SwizzleShaderType, Shader> mSwizzleShaderMap;
-
- bool mResourcesInitialized;
- d3d11::Buffer mVertexBuffer;
- d3d11::SamplerState mPointSampler;
- d3d11::SamplerState mLinearSampler;
- d3d11::RasterizerState mScissorEnabledRasterizerState;
- d3d11::RasterizerState mScissorDisabledRasterizerState;
- d3d11::DepthStencilState mDepthStencilState;
-
- d3d11::LazyInputLayout mQuad2DIL;
- d3d11::LazyShader<ID3D11VertexShader> mQuad2DVS;
- d3d11::LazyShader<ID3D11PixelShader> mDepthPS;
-
- d3d11::LazyInputLayout mQuad3DIL;
- d3d11::LazyShader<ID3D11VertexShader> mQuad3DVS;
- d3d11::LazyShader<ID3D11GeometryShader> mQuad3DGS;
-
- d3d11::LazyBlendState mAlphaMaskBlendState;
-
- d3d11::Buffer mSwizzleCB;
-
- d3d11::LazyShader<ID3D11VertexShader> mResolveDepthStencilVS;
- d3d11::LazyShader<ID3D11PixelShader> mResolveDepthPS;
- d3d11::LazyShader<ID3D11PixelShader> mResolveDepthStencilPS;
- d3d11::LazyShader<ID3D11PixelShader> mResolveStencilPS;
- d3d11::ShaderResourceView mStencilSRV;
- TextureHelper11 mResolvedDepthStencil;
- d3d11::RenderTargetView mResolvedDepthStencilRTView;
- TextureHelper11 mResolvedDepth;
- d3d11::DepthStencilView mResolvedDepthDSView;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_BLIT11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
deleted file mode 100644
index 2317c9abdb..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
+++ /dev/null
@@ -1,1600 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Buffer11.cpp Defines the Buffer11 class.
-
-#include "libANGLE/renderer/d3d/d3d11/Buffer11.h"
-
-#include <memory>
-
-#include "common/MemoryBuffer.h"
-#include "libANGLE/renderer/d3d/IndexDataManager.h"
-#include "libANGLE/renderer/d3d/VertexDataManager.h"
-#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-#include "libANGLE/renderer/renderer_utils.h"
-
-namespace rx
-{
-
-namespace
-{
-
-template <typename T>
-GLuint ReadIndexValueFromIndices(const uint8_t *data, size_t index)
-{
- return reinterpret_cast<const T *>(data)[index];
-}
-typedef GLuint (*ReadIndexValueFunction)(const uint8_t *data, size_t index);
-
-enum class CopyResult
-{
- RECREATED,
- NOT_RECREATED,
-};
-
-void CalculateConstantBufferParams(GLintptr offset,
- GLsizeiptr size,
- UINT *outFirstConstant,
- UINT *outNumConstants)
-{
- // The offset must be aligned to 256 bytes (should have been enforced by glBindBufferRange).
- ASSERT(offset % 256 == 0);
-
- // firstConstant and numConstants are expressed in constants of 16-bytes. Furthermore they must
- // be a multiple of 16 constants.
- *outFirstConstant = static_cast<UINT>(offset / 16);
-
- // The GL size is not required to be aligned to a 256 bytes boundary.
- // Round the size up to a 256 bytes boundary then express the results in constants of 16-bytes.
- *outNumConstants = static_cast<UINT>(rx::roundUp(size, static_cast<GLsizeiptr>(256)) / 16);
-
- // Since the size is rounded up, firstConstant + numConstants may be bigger than the actual size
- // of the buffer. This behaviour is explictly allowed according to the documentation on
- // ID3D11DeviceContext1::PSSetConstantBuffers1
- // https://msdn.microsoft.com/en-us/library/windows/desktop/hh404649%28v=vs.85%29.aspx
-}
-
-} // anonymous namespace
-
-namespace gl_d3d11
-{
-
-D3D11_MAP GetD3DMapTypeFromBits(BufferUsage usage, GLbitfield access)
-{
- bool readBit = ((access & GL_MAP_READ_BIT) != 0);
- bool writeBit = ((access & GL_MAP_WRITE_BIT) != 0);
-
- ASSERT(readBit || writeBit);
-
- // Note : we ignore the discard bit, because in D3D11, staging buffers
- // don't accept the map-discard flag (discard only works for DYNAMIC usage)
-
- if (readBit && !writeBit)
- {
- return D3D11_MAP_READ;
- }
- else if (writeBit && !readBit)
- {
- // Special case for uniform storage - we only allow full buffer updates.
- return usage == BUFFER_USAGE_UNIFORM ? D3D11_MAP_WRITE_DISCARD : D3D11_MAP_WRITE;
- }
- else if (writeBit && readBit)
- {
- return D3D11_MAP_READ_WRITE;
- }
- else
- {
- UNREACHABLE();
- return D3D11_MAP_READ;
- }
-}
-} // namespace gl_d3d11
-
-// Each instance of Buffer11::BufferStorage is specialized for a class of D3D binding points
-// - vertex/transform feedback buffers
-// - index buffers
-// - pixel unpack buffers
-// - uniform buffers
-class Buffer11::BufferStorage : angle::NonCopyable
-{
- public:
- virtual ~BufferStorage() {}
-
- DataRevision getDataRevision() const { return mRevision; }
- BufferUsage getUsage() const { return mUsage; }
- size_t getSize() const { return mBufferSize; }
- void setDataRevision(DataRevision rev) { mRevision = rev; }
-
- virtual bool isCPUAccessible(GLbitfield access) const = 0;
-
- virtual bool isGPUAccessible() const = 0;
-
- virtual gl::ErrorOrResult<CopyResult> copyFromStorage(const gl::Context *context,
- BufferStorage *source,
- size_t sourceOffset,
- size_t size,
- size_t destOffset) = 0;
- virtual gl::Error resize(const gl::Context *context, size_t size, bool preserveData) = 0;
-
- virtual gl::Error map(size_t offset,
- size_t length,
- GLbitfield access,
- uint8_t **mapPointerOut) = 0;
- virtual void unmap() = 0;
-
- gl::Error setData(const uint8_t *data, size_t offset, size_t size);
-
- protected:
- BufferStorage(Renderer11 *renderer, BufferUsage usage);
-
- Renderer11 *mRenderer;
- DataRevision mRevision;
- const BufferUsage mUsage;
- size_t mBufferSize;
-};
-
-// A native buffer storage represents an underlying D3D11 buffer for a particular
-// type of storage.
-class Buffer11::NativeStorage : public Buffer11::BufferStorage
-{
- public:
- NativeStorage(Renderer11 *renderer,
- BufferUsage usage,
- const OnBufferDataDirtyChannel *onStorageChanged);
- ~NativeStorage() override;
-
- bool isCPUAccessible(GLbitfield access) const override;
-
- bool isGPUAccessible() const override { return true; }
-
- const d3d11::Buffer &getBuffer() const { return mBuffer; }
- gl::ErrorOrResult<CopyResult> copyFromStorage(const gl::Context *context,
- BufferStorage *source,
- size_t sourceOffset,
- size_t size,
- size_t destOffset) override;
- gl::Error resize(const gl::Context *context, size_t size, bool preserveData) override;
-
- gl::Error map(size_t offset,
- size_t length,
- GLbitfield access,
- uint8_t **mapPointerOut) override;
- void unmap() override;
-
- gl::ErrorOrResult<const d3d11::ShaderResourceView *> getSRVForFormat(DXGI_FORMAT srvFormat);
-
- private:
- static void FillBufferDesc(D3D11_BUFFER_DESC *bufferDesc,
- Renderer11 *renderer,
- BufferUsage usage,
- unsigned int bufferSize);
- void clearSRVs();
-
- d3d11::Buffer mBuffer;
- const OnBufferDataDirtyChannel *mOnStorageChanged;
- std::map<DXGI_FORMAT, d3d11::ShaderResourceView> mBufferResourceViews;
-};
-
-// A emulated indexed buffer storage represents an underlying D3D11 buffer for data
-// that has been expanded to match the indices list used. This storage is only
-// used for FL9_3 pointsprite rendering emulation.
-class Buffer11::EmulatedIndexedStorage : public Buffer11::BufferStorage
-{
- public:
- EmulatedIndexedStorage(Renderer11 *renderer);
- ~EmulatedIndexedStorage() override;
-
- bool isCPUAccessible(GLbitfield access) const override { return true; }
-
- bool isGPUAccessible() const override { return false; }
-
- gl::ErrorOrResult<const d3d11::Buffer *> getBuffer(SourceIndexData *indexInfo,
- const TranslatedAttribute &attribute,
- GLint startVertex);
-
- gl::ErrorOrResult<CopyResult> copyFromStorage(const gl::Context *context,
- BufferStorage *source,
- size_t sourceOffset,
- size_t size,
- size_t destOffset) override;
-
- gl::Error resize(const gl::Context *context, size_t size, bool preserveData) override;
-
- gl::Error map(size_t offset,
- size_t length,
- GLbitfield access,
- uint8_t **mapPointerOut) override;
- void unmap() override;
-
- private:
- d3d11::Buffer mBuffer; // contains expanded data for use by D3D
- angle::MemoryBuffer mMemoryBuffer; // original data (not expanded)
- angle::MemoryBuffer mIndicesMemoryBuffer; // indices data
-};
-
-// Pack storage represents internal storage for pack buffers. We implement pack buffers
-// as CPU memory, tied to a staging texture, for asynchronous texture readback.
-class Buffer11::PackStorage : public Buffer11::BufferStorage
-{
- public:
- explicit PackStorage(Renderer11 *renderer);
- ~PackStorage() override;
-
- bool isCPUAccessible(GLbitfield access) const override { return true; }
-
- bool isGPUAccessible() const override { return false; }
-
- gl::ErrorOrResult<CopyResult> copyFromStorage(const gl::Context *context,
- BufferStorage *source,
- size_t sourceOffset,
- size_t size,
- size_t destOffset) override;
- gl::Error resize(const gl::Context *context, size_t size, bool preserveData) override;
-
- gl::Error map(size_t offset,
- size_t length,
- GLbitfield access,
- uint8_t **mapPointerOut) override;
- void unmap() override;
-
- gl::Error packPixels(const gl::Context *context,
- const gl::FramebufferAttachment &readAttachment,
- const PackPixelsParams &params);
-
- private:
- gl::Error flushQueuedPackCommand();
-
- TextureHelper11 mStagingTexture;
- angle::MemoryBuffer mMemoryBuffer;
- std::unique_ptr<PackPixelsParams> mQueuedPackCommand;
- PackPixelsParams mPackParams;
- bool mDataModified;
-};
-
-// System memory storage stores a CPU memory buffer with our buffer data.
-// For dynamic data, it's much faster to update the CPU memory buffer than
-// it is to update a D3D staging buffer and read it back later.
-class Buffer11::SystemMemoryStorage : public Buffer11::BufferStorage
-{
- public:
- explicit SystemMemoryStorage(Renderer11 *renderer);
- ~SystemMemoryStorage() override {}
-
- bool isCPUAccessible(GLbitfield access) const override { return true; }
-
- bool isGPUAccessible() const override { return false; }
-
- gl::ErrorOrResult<CopyResult> copyFromStorage(const gl::Context *context,
- BufferStorage *source,
- size_t sourceOffset,
- size_t size,
- size_t destOffset) override;
- gl::Error resize(const gl::Context *context, size_t size, bool preserveData) override;
-
- gl::Error map(size_t offset,
- size_t length,
- GLbitfield access,
- uint8_t **mapPointerOut) override;
- void unmap() override;
-
- angle::MemoryBuffer *getSystemCopy() { return &mSystemCopy; }
-
- protected:
- angle::MemoryBuffer mSystemCopy;
-};
-
-Buffer11::Buffer11(const gl::BufferState &state, Renderer11 *renderer)
- : BufferD3D(state, renderer),
- mRenderer(renderer),
- mSize(0),
- mMappedStorage(nullptr),
- mBufferStorages({}),
- mLatestBufferStorage(nullptr),
- mDeallocThresholds({}),
- mIdleness({}),
- mConstantBufferStorageAdditionalSize(0),
- mMaxConstantBufferLruCount(0)
-{
-}
-
-Buffer11::~Buffer11()
-{
- for (BufferStorage *&storage : mBufferStorages)
- {
- SafeDelete(storage);
- }
-
- for (auto &p : mConstantBufferRangeStoragesCache)
- {
- SafeDelete(p.second.storage);
- }
-
- mRenderer->onBufferDelete(this);
-}
-
-gl::Error Buffer11::setData(const gl::Context *context,
- gl::BufferBinding target,
- const void *data,
- size_t size,
- gl::BufferUsage usage)
-{
- updateD3DBufferUsage(context, usage);
- ANGLE_TRY(setSubData(context, target, data, size, 0));
- return gl::NoError();
-}
-
-gl::Error Buffer11::getData(const gl::Context *context, const uint8_t **outData)
-{
- SystemMemoryStorage *systemMemoryStorage = nullptr;
- ANGLE_TRY_RESULT(getSystemMemoryStorage(context), systemMemoryStorage);
-
- ASSERT(systemMemoryStorage->getSize() >= mSize);
-
- *outData = systemMemoryStorage->getSystemCopy()->data();
- return gl::NoError();
-}
-
-gl::ErrorOrResult<Buffer11::SystemMemoryStorage *> Buffer11::getSystemMemoryStorage(
- const gl::Context *context)
-{
- BufferStorage *storage = nullptr;
- ANGLE_TRY_RESULT(getBufferStorage(context, BUFFER_USAGE_SYSTEM_MEMORY), storage);
- return GetAs<SystemMemoryStorage>(storage);
-}
-
-gl::Error Buffer11::setSubData(const gl::Context *context,
- gl::BufferBinding target,
- const void *data,
- size_t size,
- size_t offset)
-{
- size_t requiredSize = size + offset;
-
- if (data && size > 0)
- {
- // Use system memory storage for dynamic buffers.
- // Try using a constant storage for constant buffers
- BufferStorage *writeBuffer = nullptr;
- if (target == gl::BufferBinding::Uniform)
- {
- // If we are a very large uniform buffer, keep system memory storage around so that we
- // aren't forced to read back from a constant buffer. We also check the workaround for
- // Intel - this requires us to use system memory so we don't end up having to copy from
- // a constant buffer to a staging buffer.
- // TODO(jmadill): Use Context caps.
- if (offset == 0 && size >= mSize &&
- size <= static_cast<UINT>(mRenderer->getNativeCaps().maxUniformBlockSize) &&
- !mRenderer->getWorkarounds().useSystemMemoryForConstantBuffers)
- {
- ANGLE_TRY_RESULT(getBufferStorage(context, BUFFER_USAGE_UNIFORM), writeBuffer);
- }
- else
- {
- ANGLE_TRY_RESULT(getSystemMemoryStorage(context), writeBuffer);
- }
- }
- else if (supportsDirectBinding())
- {
- ANGLE_TRY_RESULT(getStagingStorage(context), writeBuffer);
- }
- else
- {
- ANGLE_TRY_RESULT(getSystemMemoryStorage(context), writeBuffer);
- }
-
- ASSERT(writeBuffer);
-
- // Explicitly resize the staging buffer, preserving data if the new data will not
- // completely fill the buffer
- if (writeBuffer->getSize() < requiredSize)
- {
- bool preserveData = (offset > 0);
- ANGLE_TRY(writeBuffer->resize(context, requiredSize, preserveData));
- }
-
- ANGLE_TRY(writeBuffer->setData(static_cast<const uint8_t *>(data), offset, size));
- onStorageUpdate(writeBuffer);
-
- // Notify any vertex arrays that we have dirty data.
- // TODO(jmadill): Use a more fine grained notification for data updates.
- mDirectBroadcastChannel.signal(context);
- }
-
- mSize = std::max(mSize, requiredSize);
- invalidateStaticData(context);
-
- return gl::NoError();
-}
-
-gl::Error Buffer11::copySubData(const gl::Context *context,
- BufferImpl *source,
- GLintptr sourceOffset,
- GLintptr destOffset,
- GLsizeiptr size)
-{
- Buffer11 *sourceBuffer = GetAs<Buffer11>(source);
- ASSERT(sourceBuffer != nullptr);
-
- BufferStorage *copyDest = nullptr;
- ANGLE_TRY_RESULT(getLatestBufferStorage(context), copyDest);
-
- if (!copyDest)
- {
- ANGLE_TRY_RESULT(getStagingStorage(context), copyDest);
- }
-
- BufferStorage *copySource = nullptr;
- ANGLE_TRY_RESULT(sourceBuffer->getLatestBufferStorage(context), copySource);
-
- if (!copySource)
- {
- ANGLE_TRY_RESULT(sourceBuffer->getStagingStorage(context), copySource);
- }
-
- ASSERT(copySource && copyDest);
-
- // A staging buffer is needed if there is no cpu-cpu or gpu-gpu copy path avaiable.
- if (!copyDest->isGPUAccessible() && !copySource->isCPUAccessible(GL_MAP_READ_BIT))
- {
- ANGLE_TRY_RESULT(sourceBuffer->getStagingStorage(context), copySource);
- }
- else if (!copySource->isGPUAccessible() && !copyDest->isCPUAccessible(GL_MAP_WRITE_BIT))
- {
- ANGLE_TRY_RESULT(getStagingStorage(context), copyDest);
- }
-
- // D3D11 does not allow overlapped copies until 11.1, and only if the
- // device supports D3D11_FEATURE_DATA_D3D11_OPTIONS::CopyWithOverlap
- // Get around this via a different source buffer
- if (copySource == copyDest)
- {
- if (copySource->getUsage() == BUFFER_USAGE_STAGING)
- {
- ANGLE_TRY_RESULT(getBufferStorage(context, BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK),
- copySource);
- }
- else
- {
- ANGLE_TRY_RESULT(getStagingStorage(context), copySource);
- }
- }
-
- CopyResult copyResult = CopyResult::NOT_RECREATED;
- ANGLE_TRY_RESULT(copyDest->copyFromStorage(context, copySource, sourceOffset, size, destOffset),
- copyResult);
- onStorageUpdate(copyDest);
-
- mSize = std::max<size_t>(mSize, destOffset + size);
- invalidateStaticData(context);
-
- // Also notify that direct buffers are dirty.
- mDirectBroadcastChannel.signal(context);
-
- return gl::NoError();
-}
-
-gl::Error Buffer11::map(const gl::Context *context, GLenum access, void **mapPtr)
-{
- // GL_OES_mapbuffer uses an enum instead of a bitfield for it's access, convert to a bitfield
- // and call mapRange.
- ASSERT(access == GL_WRITE_ONLY_OES);
- return mapRange(context, 0, mSize, GL_MAP_WRITE_BIT, mapPtr);
-}
-
-gl::Error Buffer11::mapRange(const gl::Context *context,
- size_t offset,
- size_t length,
- GLbitfield access,
- void **mapPtr)
-{
- ASSERT(!mMappedStorage);
-
- BufferStorage *latestStorage = nullptr;
- ANGLE_TRY_RESULT(getLatestBufferStorage(context), latestStorage);
-
- if (latestStorage && (latestStorage->getUsage() == BUFFER_USAGE_PIXEL_PACK ||
- latestStorage->getUsage() == BUFFER_USAGE_STAGING))
- {
- // Latest storage is mappable.
- mMappedStorage = latestStorage;
- }
- else
- {
- // Fall back to using the staging buffer if the latest storage does not exist or is not
- // CPU-accessible.
- ANGLE_TRY_RESULT(getStagingStorage(context), mMappedStorage);
- }
-
- if (!mMappedStorage)
- {
- return gl::OutOfMemory() << "Failed to allocate mappable internal buffer.";
- }
-
- if ((access & GL_MAP_WRITE_BIT) > 0)
- {
- // Update the data revision immediately, since the data might be changed at any time
- onStorageUpdate(mMappedStorage);
- invalidateStaticData(context);
- }
-
- uint8_t *mappedBuffer = nullptr;
- ANGLE_TRY(mMappedStorage->map(offset, length, access, &mappedBuffer));
- ASSERT(mappedBuffer);
-
- *mapPtr = static_cast<void *>(mappedBuffer);
- return gl::NoError();
-}
-
-gl::Error Buffer11::unmap(const gl::Context *context, GLboolean *result)
-{
- ASSERT(mMappedStorage);
- mMappedStorage->unmap();
- mMappedStorage = nullptr;
-
- // TODO: detect if we had corruption. if so, return false.
- *result = GL_TRUE;
-
- return gl::NoError();
-}
-
-gl::Error Buffer11::markTransformFeedbackUsage(const gl::Context *context)
-{
- BufferStorage *transformFeedbackStorage = nullptr;
- ANGLE_TRY_RESULT(getBufferStorage(context, BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK),
- transformFeedbackStorage);
-
- if (transformFeedbackStorage)
- {
- onStorageUpdate(transformFeedbackStorage);
- }
-
- invalidateStaticData(context);
- return gl::NoError();
-}
-
-void Buffer11::updateDeallocThreshold(BufferUsage usage)
-{
- // The following strategy was tuned on the Oort online benchmark (http://oortonline.gl/)
- // as well as a custom microbenchmark (IndexConversionPerfTest.Run/index_range_d3d11)
-
- // First readback: 8 unmodified uses before we free buffer memory.
- // After that, double the threshold each time until we reach the max.
- if (mDeallocThresholds[usage] == 0)
- {
- mDeallocThresholds[usage] = 8;
- }
- else if (mDeallocThresholds[usage] < std::numeric_limits<unsigned int>::max() / 2u)
- {
- mDeallocThresholds[usage] *= 2u;
- }
- else
- {
- mDeallocThresholds[usage] = std::numeric_limits<unsigned int>::max();
- }
-}
-
-// Free the storage if we decide it isn't being used very often.
-gl::Error Buffer11::checkForDeallocation(const gl::Context *context, BufferUsage usage)
-{
- mIdleness[usage]++;
-
- BufferStorage *&storage = mBufferStorages[usage];
- if (storage != nullptr && mIdleness[usage] > mDeallocThresholds[usage])
- {
- BufferStorage *latestStorage = nullptr;
- ANGLE_TRY_RESULT(getLatestBufferStorage(context), latestStorage);
- if (latestStorage != storage)
- {
- SafeDelete(storage);
- }
- }
-
- return gl::NoError();
-}
-
-// Keep system memory when we are using it for the canonical version of data.
-bool Buffer11::canDeallocateSystemMemory() const
-{
- // Must keep system memory on Intel.
- if (mRenderer->getWorkarounds().useSystemMemoryForConstantBuffers)
- {
- return false;
- }
-
- return (!mBufferStorages[BUFFER_USAGE_UNIFORM] ||
- mSize <= mRenderer->getNativeCaps().maxUniformBlockSize);
-}
-
-void Buffer11::markBufferUsage(BufferUsage usage)
-{
- mIdleness[usage] = 0;
-}
-
-gl::Error Buffer11::garbageCollection(const gl::Context *context, BufferUsage currentUsage)
-{
- if (currentUsage != BUFFER_USAGE_SYSTEM_MEMORY && canDeallocateSystemMemory())
- {
- ANGLE_TRY(checkForDeallocation(context, BUFFER_USAGE_SYSTEM_MEMORY));
- }
-
- if (currentUsage != BUFFER_USAGE_STAGING)
- {
- ANGLE_TRY(checkForDeallocation(context, BUFFER_USAGE_STAGING));
- }
-
- return gl::NoError();
-}
-
-gl::ErrorOrResult<ID3D11Buffer *> Buffer11::getBuffer(const gl::Context *context, BufferUsage usage)
-{
- BufferStorage *storage = nullptr;
- ANGLE_TRY_RESULT(getBufferStorage(context, usage), storage);
- return GetAs<NativeStorage>(storage)->getBuffer().get();
-}
-
-gl::ErrorOrResult<ID3D11Buffer *> Buffer11::getEmulatedIndexedBuffer(
- const gl::Context *context,
- SourceIndexData *indexInfo,
- const TranslatedAttribute &attribute,
- GLint startVertex)
-{
- ASSERT(indexInfo);
-
- BufferStorage *untypedStorage = nullptr;
- ANGLE_TRY_RESULT(getBufferStorage(context, BUFFER_USAGE_EMULATED_INDEXED_VERTEX),
- untypedStorage);
-
- EmulatedIndexedStorage *emulatedStorage = GetAs<EmulatedIndexedStorage>(untypedStorage);
-
- const d3d11::Buffer *nativeStorage = nullptr;
- ANGLE_TRY_RESULT(emulatedStorage->getBuffer(indexInfo, attribute, startVertex), nativeStorage);
-
- return nativeStorage->get();
-}
-
-gl::Error Buffer11::getConstantBufferRange(const gl::Context *context,
- GLintptr offset,
- GLsizeiptr size,
- const d3d11::Buffer **bufferOut,
- UINT *firstConstantOut,
- UINT *numConstantsOut)
-{
- BufferStorage *bufferStorage = nullptr;
-
- if (offset == 0 || mRenderer->getRenderer11DeviceCaps().supportsConstantBufferOffsets)
- {
- ANGLE_TRY_RESULT(getBufferStorage(context, BUFFER_USAGE_UNIFORM), bufferStorage);
- CalculateConstantBufferParams(offset, size, firstConstantOut, numConstantsOut);
- }
- else
- {
- ANGLE_TRY_RESULT(getConstantBufferRangeStorage(context, offset, size), bufferStorage);
- *firstConstantOut = 0;
- *numConstantsOut = 0;
- }
-
- *bufferOut = &GetAs<NativeStorage>(bufferStorage)->getBuffer();
-
- return gl::NoError();
-}
-
-gl::ErrorOrResult<const d3d11::ShaderResourceView *> Buffer11::getSRV(const gl::Context *context,
- DXGI_FORMAT srvFormat)
-{
- BufferStorage *storage = nullptr;
- ANGLE_TRY_RESULT(getBufferStorage(context, BUFFER_USAGE_PIXEL_UNPACK), storage);
- NativeStorage *nativeStorage = GetAs<NativeStorage>(storage);
- return nativeStorage->getSRVForFormat(srvFormat);
-}
-
-gl::Error Buffer11::packPixels(const gl::Context *context,
- const gl::FramebufferAttachment &readAttachment,
- const PackPixelsParams &params)
-{
- PackStorage *packStorage = nullptr;
- ANGLE_TRY_RESULT(getPackStorage(context), packStorage);
-
- ASSERT(packStorage);
- ANGLE_TRY(packStorage->packPixels(context, readAttachment, params));
- onStorageUpdate(packStorage);
-
- return gl::NoError();
-}
-
-size_t Buffer11::getTotalCPUBufferMemoryBytes() const
-{
- size_t allocationSize = 0;
-
- BufferStorage *staging = mBufferStorages[BUFFER_USAGE_STAGING];
- allocationSize += staging ? staging->getSize() : 0;
-
- BufferStorage *sysMem = mBufferStorages[BUFFER_USAGE_SYSTEM_MEMORY];
- allocationSize += sysMem ? sysMem->getSize() : 0;
-
- return allocationSize;
-}
-
-gl::ErrorOrResult<Buffer11::BufferStorage *> Buffer11::getBufferStorage(const gl::Context *context,
- BufferUsage usage)
-{
- ASSERT(0 <= usage && usage < BUFFER_USAGE_COUNT);
- BufferStorage *&newStorage = mBufferStorages[usage];
-
- if (!newStorage)
- {
- newStorage = allocateStorage(usage);
- }
-
- markBufferUsage(usage);
-
- // resize buffer
- if (newStorage->getSize() < mSize)
- {
- ANGLE_TRY(newStorage->resize(context, mSize, true));
- }
-
- ASSERT(newStorage);
-
- ANGLE_TRY(updateBufferStorage(context, newStorage, 0, mSize));
- ANGLE_TRY(garbageCollection(context, usage));
-
- return newStorage;
-}
-
-Buffer11::BufferStorage *Buffer11::allocateStorage(BufferUsage usage)
-{
- updateDeallocThreshold(usage);
- switch (usage)
- {
- case BUFFER_USAGE_PIXEL_PACK:
- return new PackStorage(mRenderer);
- case BUFFER_USAGE_SYSTEM_MEMORY:
- return new SystemMemoryStorage(mRenderer);
- case BUFFER_USAGE_EMULATED_INDEXED_VERTEX:
- return new EmulatedIndexedStorage(mRenderer);
- case BUFFER_USAGE_INDEX:
- case BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK:
- return new NativeStorage(mRenderer, usage, &mDirectBroadcastChannel);
- default:
- return new NativeStorage(mRenderer, usage, nullptr);
- }
-}
-
-gl::ErrorOrResult<Buffer11::BufferStorage *> Buffer11::getConstantBufferRangeStorage(
- const gl::Context *context,
- GLintptr offset,
- GLsizeiptr size)
-{
- BufferStorage *newStorage;
-
- {
- // Keep the cacheEntry in a limited scope because it may be invalidated later in the code if
- // we need to reclaim some space.
- ConstantBufferCacheEntry *cacheEntry = &mConstantBufferRangeStoragesCache[offset];
-
- if (!cacheEntry->storage)
- {
- cacheEntry->storage = allocateStorage(BUFFER_USAGE_UNIFORM);
- cacheEntry->lruCount = ++mMaxConstantBufferLruCount;
- }
-
- cacheEntry->lruCount = ++mMaxConstantBufferLruCount;
- newStorage = cacheEntry->storage;
- }
-
- markBufferUsage(BUFFER_USAGE_UNIFORM);
-
- if (newStorage->getSize() < static_cast<size_t>(size))
- {
- size_t maximumAllowedAdditionalSize = 2 * getSize();
-
- size_t sizeDelta = size - newStorage->getSize();
-
- while (mConstantBufferStorageAdditionalSize + sizeDelta > maximumAllowedAdditionalSize)
- {
- auto iter = std::min_element(std::begin(mConstantBufferRangeStoragesCache),
- std::end(mConstantBufferRangeStoragesCache),
- [](const ConstantBufferCache::value_type &a,
- const ConstantBufferCache::value_type &b) {
- return a.second.lruCount < b.second.lruCount;
- });
-
- ASSERT(iter->second.storage != newStorage);
- ASSERT(mConstantBufferStorageAdditionalSize >= iter->second.storage->getSize());
-
- mConstantBufferStorageAdditionalSize -= iter->second.storage->getSize();
- SafeDelete(iter->second.storage);
- mConstantBufferRangeStoragesCache.erase(iter);
- }
-
- ANGLE_TRY(newStorage->resize(context, size, false));
- mConstantBufferStorageAdditionalSize += sizeDelta;
-
- // We don't copy the old data when resizing the constant buffer because the data may be
- // out-of-date therefore we reset the data revision and let updateBufferStorage() handle the
- // copy.
- newStorage->setDataRevision(0);
- }
-
- ANGLE_TRY(updateBufferStorage(context, newStorage, offset, size));
- ANGLE_TRY(garbageCollection(context, BUFFER_USAGE_UNIFORM));
- return newStorage;
-}
-
-gl::Error Buffer11::updateBufferStorage(const gl::Context *context,
- BufferStorage *storage,
- size_t sourceOffset,
- size_t storageSize)
-{
- BufferStorage *latestBuffer = nullptr;
- ANGLE_TRY_RESULT(getLatestBufferStorage(context), latestBuffer);
-
- ASSERT(storage);
-
- if (!latestBuffer)
- {
- onStorageUpdate(storage);
- return gl::NoError();
- }
-
- if (latestBuffer->getDataRevision() <= storage->getDataRevision())
- {
- return gl::NoError();
- }
-
- // Copy through a staging buffer if we're copying from or to a non-staging, mappable
- // buffer storage. This is because we can't map a GPU buffer, and copy CPU
- // data directly. If we're already using a staging buffer we're fine.
- if (latestBuffer->getUsage() != BUFFER_USAGE_STAGING &&
- storage->getUsage() != BUFFER_USAGE_STAGING &&
- (!latestBuffer->isCPUAccessible(GL_MAP_READ_BIT) ||
- !storage->isCPUAccessible(GL_MAP_WRITE_BIT)))
- {
- NativeStorage *stagingBuffer = nullptr;
- ANGLE_TRY_RESULT(getStagingStorage(context), stagingBuffer);
-
- CopyResult copyResult = CopyResult::NOT_RECREATED;
- ANGLE_TRY_RESULT(
- stagingBuffer->copyFromStorage(context, latestBuffer, 0, latestBuffer->getSize(), 0),
- copyResult);
- onCopyStorage(stagingBuffer, latestBuffer);
-
- latestBuffer = stagingBuffer;
- }
-
- CopyResult copyResult = CopyResult::NOT_RECREATED;
- ANGLE_TRY_RESULT(storage->copyFromStorage(context, latestBuffer, sourceOffset, storageSize, 0),
- copyResult);
- // If the D3D buffer has been recreated, we should update our serial.
- if (copyResult == CopyResult::RECREATED)
- {
- updateSerial();
- }
- onCopyStorage(storage, latestBuffer);
- return gl::NoError();
-}
-
-gl::ErrorOrResult<Buffer11::BufferStorage *> Buffer11::getLatestBufferStorage(
- const gl::Context *context) const
-{
- // resize buffer
- if (mLatestBufferStorage && mLatestBufferStorage->getSize() < mSize)
- {
- ANGLE_TRY(mLatestBufferStorage->resize(context, mSize, true));
- }
-
- return mLatestBufferStorage;
-}
-
-gl::ErrorOrResult<Buffer11::NativeStorage *> Buffer11::getStagingStorage(const gl::Context *context)
-{
- BufferStorage *stagingStorage = nullptr;
- ANGLE_TRY_RESULT(getBufferStorage(context, BUFFER_USAGE_STAGING), stagingStorage);
- return GetAs<NativeStorage>(stagingStorage);
-}
-
-gl::ErrorOrResult<Buffer11::PackStorage *> Buffer11::getPackStorage(const gl::Context *context)
-{
- BufferStorage *packStorage = nullptr;
- ANGLE_TRY_RESULT(getBufferStorage(context, BUFFER_USAGE_PIXEL_PACK), packStorage);
- return GetAs<PackStorage>(packStorage);
-}
-
-size_t Buffer11::getSize() const
-{
- return mSize;
-}
-
-bool Buffer11::supportsDirectBinding() const
-{
- // Do not support direct buffers for dynamic data. The streaming buffer
- // offers better performance for data which changes every frame.
- return (mUsage == D3DBufferUsage::STATIC);
-}
-
-void Buffer11::initializeStaticData(const gl::Context *context)
-{
- BufferD3D::initializeStaticData(context);
-
- // Notify when static data changes.
- mStaticBroadcastChannel.signal(context);
-}
-
-void Buffer11::invalidateStaticData(const gl::Context *context)
-{
- BufferD3D::invalidateStaticData(context);
-
- // Notify when static data changes.
- mStaticBroadcastChannel.signal(context);
-}
-
-OnBufferDataDirtyChannel *Buffer11::getStaticBroadcastChannel()
-{
- return &mStaticBroadcastChannel;
-}
-
-OnBufferDataDirtyChannel *Buffer11::getDirectBroadcastChannel()
-{
- return &mDirectBroadcastChannel;
-}
-
-void Buffer11::onCopyStorage(BufferStorage *dest, BufferStorage *source)
-{
- ASSERT(source && mLatestBufferStorage);
- dest->setDataRevision(source->getDataRevision());
-
- // Only update the latest buffer storage if our usage index is lower. See comment in header.
- if (dest->getUsage() < mLatestBufferStorage->getUsage())
- {
- mLatestBufferStorage = dest;
- }
-}
-
-void Buffer11::onStorageUpdate(BufferStorage *updatedStorage)
-{
- updatedStorage->setDataRevision(updatedStorage->getDataRevision() + 1);
- mLatestBufferStorage = updatedStorage;
-}
-
-// Buffer11::BufferStorage implementation
-
-Buffer11::BufferStorage::BufferStorage(Renderer11 *renderer, BufferUsage usage)
- : mRenderer(renderer), mRevision(0), mUsage(usage), mBufferSize(0)
-{
-}
-
-gl::Error Buffer11::BufferStorage::setData(const uint8_t *data, size_t offset, size_t size)
-{
- ASSERT(isCPUAccessible(GL_MAP_WRITE_BIT));
-
- // Uniform storage can have a different internal size than the buffer size. Ensure we don't
- // overflow.
- size_t mapSize = std::min(size, mBufferSize - offset);
-
- uint8_t *writePointer = nullptr;
- ANGLE_TRY(map(offset, mapSize, GL_MAP_WRITE_BIT, &writePointer));
-
- memcpy(writePointer, data, mapSize);
-
- unmap();
-
- return gl::NoError();
-}
-
-// Buffer11::NativeStorage implementation
-
-Buffer11::NativeStorage::NativeStorage(Renderer11 *renderer,
- BufferUsage usage,
- const OnBufferDataDirtyChannel *onStorageChanged)
- : BufferStorage(renderer, usage), mBuffer(), mOnStorageChanged(onStorageChanged)
-{
-}
-
-Buffer11::NativeStorage::~NativeStorage()
-{
- clearSRVs();
-}
-
-bool Buffer11::NativeStorage::isCPUAccessible(GLbitfield access) const
-{
- if ((access & GL_MAP_READ_BIT) != 0)
- {
- // Read is more exclusive than write mappability.
- return (mUsage == BUFFER_USAGE_STAGING);
- }
- ASSERT((access & GL_MAP_WRITE_BIT) != 0);
- return (mUsage == BUFFER_USAGE_STAGING || mUsage == BUFFER_USAGE_UNIFORM);
-}
-
-// Returns true if it recreates the direct buffer
-gl::ErrorOrResult<CopyResult> Buffer11::NativeStorage::copyFromStorage(const gl::Context *context,
- BufferStorage *source,
- size_t sourceOffset,
- size_t size,
- size_t destOffset)
-{
- size_t requiredSize = destOffset + size;
- bool createBuffer = !mBuffer.valid() || mBufferSize < requiredSize;
-
- // (Re)initialize D3D buffer if needed
- bool preserveData = (destOffset > 0);
- if (createBuffer)
- {
- ANGLE_TRY(resize(context, requiredSize, preserveData));
- }
-
- size_t clampedSize = size;
- if (mUsage == BUFFER_USAGE_UNIFORM)
- {
- clampedSize = std::min(clampedSize, mBufferSize - destOffset);
- }
-
- if (source->getUsage() == BUFFER_USAGE_PIXEL_PACK ||
- source->getUsage() == BUFFER_USAGE_SYSTEM_MEMORY)
- {
- ASSERT(source->isCPUAccessible(GL_MAP_READ_BIT) && isCPUAccessible(GL_MAP_WRITE_BIT));
-
- // Uniform buffers must be mapped with write/discard.
- ASSERT(!(preserveData && mUsage == BUFFER_USAGE_UNIFORM));
-
- uint8_t *sourcePointer = nullptr;
- ANGLE_TRY(source->map(sourceOffset, clampedSize, GL_MAP_READ_BIT, &sourcePointer));
-
- auto err = setData(sourcePointer, destOffset, clampedSize);
- source->unmap();
- ANGLE_TRY(err);
- }
- else
- {
- D3D11_BOX srcBox;
- srcBox.left = static_cast<unsigned int>(sourceOffset);
- srcBox.right = static_cast<unsigned int>(sourceOffset + clampedSize);
- srcBox.top = 0;
- srcBox.bottom = 1;
- srcBox.front = 0;
- srcBox.back = 1;
-
- const d3d11::Buffer *sourceBuffer = &GetAs<NativeStorage>(source)->getBuffer();
-
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- deviceContext->CopySubresourceRegion(mBuffer.get(), 0,
- static_cast<unsigned int>(destOffset), 0, 0,
- sourceBuffer->get(), 0, &srcBox);
- }
-
- return createBuffer ? CopyResult::RECREATED : CopyResult::NOT_RECREATED;
-}
-
-gl::Error Buffer11::NativeStorage::resize(const gl::Context *context,
- size_t size,
- bool preserveData)
-{
- D3D11_BUFFER_DESC bufferDesc;
- FillBufferDesc(&bufferDesc, mRenderer, mUsage, static_cast<unsigned int>(size));
-
- d3d11::Buffer newBuffer;
- ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &newBuffer));
- newBuffer.setDebugName("Buffer11::NativeStorage");
-
- if (mBuffer.valid() && preserveData)
- {
- // We don't call resize if the buffer is big enough already.
- ASSERT(mBufferSize <= size);
-
- D3D11_BOX srcBox;
- srcBox.left = 0;
- srcBox.right = static_cast<unsigned int>(mBufferSize);
- srcBox.top = 0;
- srcBox.bottom = 1;
- srcBox.front = 0;
- srcBox.back = 1;
-
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- deviceContext->CopySubresourceRegion(newBuffer.get(), 0, 0, 0, 0, mBuffer.get(), 0,
- &srcBox);
- }
-
- // No longer need the old buffer
- mBuffer = std::move(newBuffer);
-
- mBufferSize = bufferDesc.ByteWidth;
-
- // Free the SRVs.
- clearSRVs();
-
- // Notify that the storage has changed.
- if (mOnStorageChanged)
- {
- mOnStorageChanged->signal(context);
- }
-
- return gl::NoError();
-}
-
-// static
-void Buffer11::NativeStorage::FillBufferDesc(D3D11_BUFFER_DESC *bufferDesc,
- Renderer11 *renderer,
- BufferUsage usage,
- unsigned int bufferSize)
-{
- bufferDesc->ByteWidth = bufferSize;
- bufferDesc->MiscFlags = 0;
- bufferDesc->StructureByteStride = 0;
-
- switch (usage)
- {
- case BUFFER_USAGE_STAGING:
- bufferDesc->Usage = D3D11_USAGE_STAGING;
- bufferDesc->BindFlags = 0;
- bufferDesc->CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
- break;
-
- case BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK:
- bufferDesc->Usage = D3D11_USAGE_DEFAULT;
- bufferDesc->BindFlags = D3D11_BIND_VERTEX_BUFFER;
-
- if (renderer->isES3Capable())
- {
- bufferDesc->BindFlags |= D3D11_BIND_STREAM_OUTPUT;
- }
-
- bufferDesc->CPUAccessFlags = 0;
- break;
-
- case BUFFER_USAGE_INDEX:
- bufferDesc->Usage = D3D11_USAGE_DEFAULT;
- bufferDesc->BindFlags = D3D11_BIND_INDEX_BUFFER;
- bufferDesc->CPUAccessFlags = 0;
- break;
-
- case BUFFER_USAGE_INDIRECT:
- bufferDesc->MiscFlags = D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS;
- bufferDesc->Usage = D3D11_USAGE_DEFAULT;
- bufferDesc->BindFlags = 0;
- bufferDesc->CPUAccessFlags = 0;
- break;
-
- case BUFFER_USAGE_PIXEL_UNPACK:
- bufferDesc->Usage = D3D11_USAGE_DEFAULT;
- bufferDesc->BindFlags = D3D11_BIND_SHADER_RESOURCE;
- bufferDesc->CPUAccessFlags = 0;
- break;
-
- case BUFFER_USAGE_UNIFORM:
- bufferDesc->Usage = D3D11_USAGE_DYNAMIC;
- bufferDesc->BindFlags = D3D11_BIND_CONSTANT_BUFFER;
- bufferDesc->CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
-
- // Constant buffers must be of a limited size, and aligned to 16 byte boundaries
- // For our purposes we ignore any buffer data past the maximum constant buffer size
- bufferDesc->ByteWidth = roundUp(bufferDesc->ByteWidth, 16u);
-
- // Note: it seems that D3D11 allows larger buffers on some platforms, but not all.
- // (Windows 10 seems to allow larger constant buffers, but not Windows 7)
- bufferDesc->ByteWidth =
- std::min<UINT>(bufferDesc->ByteWidth,
- static_cast<UINT>(renderer->getNativeCaps().maxUniformBlockSize));
- break;
-
- default:
- UNREACHABLE();
- }
-}
-
-gl::Error Buffer11::NativeStorage::map(size_t offset,
- size_t length,
- GLbitfield access,
- uint8_t **mapPointerOut)
-{
- ASSERT(isCPUAccessible(access));
-
- D3D11_MAPPED_SUBRESOURCE mappedResource;
- ID3D11DeviceContext *context = mRenderer->getDeviceContext();
- D3D11_MAP d3dMapType = gl_d3d11::GetD3DMapTypeFromBits(mUsage, access);
- UINT d3dMapFlag = ((access & GL_MAP_UNSYNCHRONIZED_BIT) != 0 ? D3D11_MAP_FLAG_DO_NOT_WAIT : 0);
-
- HRESULT result = context->Map(mBuffer.get(), 0, d3dMapType, d3dMapFlag, &mappedResource);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to map native storage in Buffer11::NativeStorage::map";
- }
- ASSERT(mappedResource.pData);
- *mapPointerOut = static_cast<uint8_t *>(mappedResource.pData) + offset;
- return gl::NoError();
-}
-
-void Buffer11::NativeStorage::unmap()
-{
- ASSERT(isCPUAccessible(GL_MAP_WRITE_BIT) || isCPUAccessible(GL_MAP_READ_BIT));
- ID3D11DeviceContext *context = mRenderer->getDeviceContext();
- context->Unmap(mBuffer.get(), 0);
-}
-
-gl::ErrorOrResult<const d3d11::ShaderResourceView *> Buffer11::NativeStorage::getSRVForFormat(
- DXGI_FORMAT srvFormat)
-{
- auto bufferSRVIt = mBufferResourceViews.find(srvFormat);
-
- if (bufferSRVIt != mBufferResourceViews.end())
- {
- return &bufferSRVIt->second;
- }
-
- const d3d11::DXGIFormatSize &dxgiFormatInfo = d3d11::GetDXGIFormatSizeInfo(srvFormat);
-
- D3D11_SHADER_RESOURCE_VIEW_DESC bufferSRVDesc;
- bufferSRVDesc.Buffer.ElementOffset = 0;
- bufferSRVDesc.Buffer.ElementWidth = static_cast<UINT>(mBufferSize) / dxgiFormatInfo.pixelBytes;
- bufferSRVDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
- bufferSRVDesc.Format = srvFormat;
-
- ANGLE_TRY(mRenderer->allocateResource(bufferSRVDesc, mBuffer.get(),
- &mBufferResourceViews[srvFormat]));
-
- return &mBufferResourceViews[srvFormat];
-}
-
-void Buffer11::NativeStorage::clearSRVs()
-{
- mBufferResourceViews.clear();
-}
-
-// Buffer11::EmulatedIndexStorage implementation
-
-Buffer11::EmulatedIndexedStorage::EmulatedIndexedStorage(Renderer11 *renderer)
- : BufferStorage(renderer, BUFFER_USAGE_EMULATED_INDEXED_VERTEX), mBuffer()
-{
-}
-
-Buffer11::EmulatedIndexedStorage::~EmulatedIndexedStorage()
-{
-}
-
-gl::ErrorOrResult<const d3d11::Buffer *> Buffer11::EmulatedIndexedStorage::getBuffer(
- SourceIndexData *indexInfo,
- const TranslatedAttribute &attribute,
- GLint startVertex)
-{
- // If a change in the indices applied from the last draw call is detected, then the emulated
- // indexed buffer needs to be invalidated. After invalidation, the change detected flag should
- // be cleared to avoid unnecessary recreation of the buffer.
- if (!mBuffer.valid() || indexInfo->srcIndicesChanged)
- {
- mBuffer.reset();
-
- // Copy the source index data. This ensures that the lifetime of the indices pointer
- // stays with this storage until the next time we invalidate.
- size_t indicesDataSize = 0;
- switch (indexInfo->srcIndexType)
- {
- case GL_UNSIGNED_INT:
- indicesDataSize = sizeof(GLuint) * indexInfo->srcCount;
- break;
- case GL_UNSIGNED_SHORT:
- indicesDataSize = sizeof(GLushort) * indexInfo->srcCount;
- break;
- case GL_UNSIGNED_BYTE:
- indicesDataSize = sizeof(GLubyte) * indexInfo->srcCount;
- break;
- default:
- indicesDataSize = sizeof(GLushort) * indexInfo->srcCount;
- break;
- }
-
- if (!mIndicesMemoryBuffer.resize(indicesDataSize))
- {
- return gl::OutOfMemory() << "Error resizing index memory buffer in "
- "Buffer11::EmulatedIndexedStorage::getBuffer";
- }
-
- memcpy(mIndicesMemoryBuffer.data(), indexInfo->srcIndices, indicesDataSize);
-
- indexInfo->srcIndicesChanged = false;
- }
-
- if (!mBuffer.valid())
- {
- unsigned int offset = 0;
- ANGLE_TRY_RESULT(attribute.computeOffset(startVertex), offset);
-
- // Expand the memory storage upon request and cache the results.
- unsigned int expandedDataSize =
- static_cast<unsigned int>((indexInfo->srcCount * attribute.stride) + offset);
- angle::MemoryBuffer expandedData;
- if (!expandedData.resize(expandedDataSize))
- {
- return gl::OutOfMemory()
- << "Error resizing buffer in Buffer11::EmulatedIndexedStorage::getBuffer";
- }
-
- // Clear the contents of the allocated buffer
- ZeroMemory(expandedData.data(), expandedDataSize);
-
- uint8_t *curr = expandedData.data();
- const uint8_t *ptr = static_cast<const uint8_t *>(indexInfo->srcIndices);
-
- // Ensure that we start in the correct place for the emulated data copy operation to
- // maintain offset behaviors.
- curr += offset;
-
- ReadIndexValueFunction readIndexValue = ReadIndexValueFromIndices<GLushort>;
-
- switch (indexInfo->srcIndexType)
- {
- case GL_UNSIGNED_INT:
- readIndexValue = ReadIndexValueFromIndices<GLuint>;
- break;
- case GL_UNSIGNED_SHORT:
- readIndexValue = ReadIndexValueFromIndices<GLushort>;
- break;
- case GL_UNSIGNED_BYTE:
- readIndexValue = ReadIndexValueFromIndices<GLubyte>;
- break;
- }
-
- // Iterate over the cached index data and copy entries indicated into the emulated buffer.
- for (GLuint i = 0; i < indexInfo->srcCount; i++)
- {
- GLuint idx = readIndexValue(ptr, i);
- memcpy(curr, mMemoryBuffer.data() + (attribute.stride * idx), attribute.stride);
- curr += attribute.stride;
- }
-
- // Finally, initialize the emulated indexed native storage object with the newly copied data
- // and free the temporary buffers used.
- D3D11_BUFFER_DESC bufferDesc;
- bufferDesc.ByteWidth = expandedDataSize;
- bufferDesc.MiscFlags = 0;
- bufferDesc.StructureByteStride = 0;
- bufferDesc.Usage = D3D11_USAGE_DEFAULT;
- bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
- bufferDesc.CPUAccessFlags = 0;
-
- D3D11_SUBRESOURCE_DATA subResourceData = {expandedData.data(), 0, 0};
-
- ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &subResourceData, &mBuffer));
- mBuffer.setDebugName("Buffer11::EmulatedIndexedStorage");
- }
-
- return &mBuffer;
-}
-
-gl::ErrorOrResult<CopyResult> Buffer11::EmulatedIndexedStorage::copyFromStorage(
- const gl::Context *context,
- BufferStorage *source,
- size_t sourceOffset,
- size_t size,
- size_t destOffset)
-{
- ASSERT(source->isCPUAccessible(GL_MAP_READ_BIT));
- uint8_t *sourceData = nullptr;
- ANGLE_TRY(source->map(sourceOffset, size, GL_MAP_READ_BIT, &sourceData));
- ASSERT(destOffset + size <= mMemoryBuffer.size());
- memcpy(mMemoryBuffer.data() + destOffset, sourceData, size);
- source->unmap();
- return CopyResult::RECREATED;
-}
-
-gl::Error Buffer11::EmulatedIndexedStorage::resize(const gl::Context *context,
- size_t size,
- bool preserveData)
-{
- if (mMemoryBuffer.size() < size)
- {
- if (!mMemoryBuffer.resize(size))
- {
- return gl::OutOfMemory() << "Failed to resize EmulatedIndexedStorage";
- }
- mBufferSize = size;
- }
-
- return gl::NoError();
-}
-
-gl::Error Buffer11::EmulatedIndexedStorage::map(size_t offset,
- size_t length,
- GLbitfield access,
- uint8_t **mapPointerOut)
-{
- ASSERT(!mMemoryBuffer.empty() && offset + length <= mMemoryBuffer.size());
- *mapPointerOut = mMemoryBuffer.data() + offset;
- return gl::NoError();
-}
-
-void Buffer11::EmulatedIndexedStorage::unmap()
-{
- // No-op
-}
-
-// Buffer11::PackStorage implementation
-
-Buffer11::PackStorage::PackStorage(Renderer11 *renderer)
- : BufferStorage(renderer, BUFFER_USAGE_PIXEL_PACK), mStagingTexture(), mDataModified(false)
-{
-}
-
-Buffer11::PackStorage::~PackStorage()
-{
-}
-
-gl::ErrorOrResult<CopyResult> Buffer11::PackStorage::copyFromStorage(const gl::Context *context,
- BufferStorage *source,
- size_t sourceOffset,
- size_t size,
- size_t destOffset)
-{
- ANGLE_TRY(flushQueuedPackCommand());
-
- // For all use cases of pack buffers, we must copy through a readable buffer.
- ASSERT(source->isCPUAccessible(GL_MAP_READ_BIT));
- uint8_t *sourceData = nullptr;
- ANGLE_TRY(source->map(sourceOffset, size, GL_MAP_READ_BIT, &sourceData));
- ASSERT(destOffset + size <= mMemoryBuffer.size());
- memcpy(mMemoryBuffer.data() + destOffset, sourceData, size);
- source->unmap();
- return CopyResult::NOT_RECREATED;
-}
-
-gl::Error Buffer11::PackStorage::resize(const gl::Context *context, size_t size, bool preserveData)
-{
- if (size != mBufferSize)
- {
- if (!mMemoryBuffer.resize(size))
- {
- return gl::OutOfMemory() << "Failed to resize internal buffer storage.";
- }
- mBufferSize = size;
- }
-
- return gl::NoError();
-}
-
-gl::Error Buffer11::PackStorage::map(size_t offset,
- size_t length,
- GLbitfield access,
- uint8_t **mapPointerOut)
-{
- ASSERT(offset + length <= getSize());
- // TODO: fast path
- // We might be able to optimize out one or more memcpy calls by detecting when
- // and if D3D packs the staging texture memory identically to how we would fill
- // the pack buffer according to the current pack state.
-
- ANGLE_TRY(flushQueuedPackCommand());
-
- mDataModified = (mDataModified || (access & GL_MAP_WRITE_BIT) != 0);
-
- *mapPointerOut = mMemoryBuffer.data() + offset;
- return gl::NoError();
-}
-
-void Buffer11::PackStorage::unmap()
-{
- // No-op
-}
-
-gl::Error Buffer11::PackStorage::packPixels(const gl::Context *context,
- const gl::FramebufferAttachment &readAttachment,
- const PackPixelsParams &params)
-{
- ANGLE_TRY(flushQueuedPackCommand());
-
- RenderTarget11 *renderTarget = nullptr;
- ANGLE_TRY(readAttachment.getRenderTarget(context, &renderTarget));
-
- const TextureHelper11 &srcTexture = renderTarget->getTexture();
- ASSERT(srcTexture.valid());
- unsigned int srcSubresource = renderTarget->getSubresourceIndex();
-
- mQueuedPackCommand.reset(new PackPixelsParams(params));
-
- gl::Extents srcTextureSize(params.area.width, params.area.height, 1);
- if (!mStagingTexture.get() || mStagingTexture.getFormat() != srcTexture.getFormat() ||
- mStagingTexture.getExtents() != srcTextureSize)
- {
- ANGLE_TRY_RESULT(
- mRenderer->createStagingTexture(srcTexture.getTextureType(), srcTexture.getFormatSet(),
- srcTextureSize, StagingAccess::READ),
- mStagingTexture);
- }
-
- // ReadPixels from multisampled FBOs isn't supported in current GL
- ASSERT(srcTexture.getSampleCount() <= 1);
-
- ID3D11DeviceContext *immediateContext = mRenderer->getDeviceContext();
- D3D11_BOX srcBox;
- srcBox.left = params.area.x;
- srcBox.right = params.area.x + params.area.width;
- srcBox.top = params.area.y;
- srcBox.bottom = params.area.y + params.area.height;
-
- // Select the correct layer from a 3D attachment
- srcBox.front = 0;
- if (mStagingTexture.is3D())
- {
- srcBox.front = static_cast<UINT>(readAttachment.layer());
- }
- srcBox.back = srcBox.front + 1;
-
- // Asynchronous copy
- immediateContext->CopySubresourceRegion(mStagingTexture.get(), 0, 0, 0, 0, srcTexture.get(),
- srcSubresource, &srcBox);
-
- return gl::NoError();
-}
-
-gl::Error Buffer11::PackStorage::flushQueuedPackCommand()
-{
- ASSERT(mMemoryBuffer.size() > 0);
-
- if (mQueuedPackCommand)
- {
- ANGLE_TRY(
- mRenderer->packPixels(mStagingTexture, *mQueuedPackCommand, mMemoryBuffer.data()));
- mQueuedPackCommand.reset(nullptr);
- }
-
- return gl::NoError();
-}
-
-// Buffer11::SystemMemoryStorage implementation
-
-Buffer11::SystemMemoryStorage::SystemMemoryStorage(Renderer11 *renderer)
- : Buffer11::BufferStorage(renderer, BUFFER_USAGE_SYSTEM_MEMORY)
-{
-}
-
-gl::ErrorOrResult<CopyResult> Buffer11::SystemMemoryStorage::copyFromStorage(
- const gl::Context *context,
- BufferStorage *source,
- size_t sourceOffset,
- size_t size,
- size_t destOffset)
-{
- ASSERT(source->isCPUAccessible(GL_MAP_READ_BIT));
- uint8_t *sourceData = nullptr;
- ANGLE_TRY(source->map(sourceOffset, size, GL_MAP_READ_BIT, &sourceData));
- ASSERT(destOffset + size <= mSystemCopy.size());
- memcpy(mSystemCopy.data() + destOffset, sourceData, size);
- source->unmap();
- return CopyResult::RECREATED;
-}
-
-gl::Error Buffer11::SystemMemoryStorage::resize(const gl::Context *context,
- size_t size,
- bool preserveData)
-{
- if (mSystemCopy.size() < size)
- {
- if (!mSystemCopy.resize(size))
- {
- return gl::OutOfMemory() << "Failed to resize SystemMemoryStorage";
- }
- mBufferSize = size;
- }
-
- return gl::NoError();
-}
-
-gl::Error Buffer11::SystemMemoryStorage::map(size_t offset,
- size_t length,
- GLbitfield access,
- uint8_t **mapPointerOut)
-{
- ASSERT(!mSystemCopy.empty() && offset + length <= mSystemCopy.size());
- *mapPointerOut = mSystemCopy.data() + offset;
- return gl::NoError();
-}
-
-void Buffer11::SystemMemoryStorage::unmap()
-{
- // No-op
-}
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h
deleted file mode 100644
index f92a68454b..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h
+++ /dev/null
@@ -1,189 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Buffer11.h: Defines the rx::Buffer11 class which implements rx::BufferImpl via rx::BufferD3D.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_BUFFER11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_BUFFER11_H_
-
-#include <array>
-#include <map>
-
-#include "libANGLE/angletypes.h"
-#include "libANGLE/renderer/d3d/BufferD3D.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-
-namespace gl
-{
-class FramebufferAttachment;
-}
-
-namespace rx
-{
-struct PackPixelsParams;
-class Renderer11;
-struct SourceIndexData;
-struct TranslatedAttribute;
-
-// The order of this enum governs priority of 'getLatestBufferStorage'.
-enum BufferUsage
-{
- BUFFER_USAGE_STAGING,
- BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK,
- BUFFER_USAGE_INDEX,
- // TODO: possibly share this buffer type with shader storage buffers.
- BUFFER_USAGE_INDIRECT,
- BUFFER_USAGE_PIXEL_UNPACK,
- BUFFER_USAGE_PIXEL_PACK,
- BUFFER_USAGE_UNIFORM,
- BUFFER_USAGE_SYSTEM_MEMORY,
- BUFFER_USAGE_EMULATED_INDEXED_VERTEX,
-
- BUFFER_USAGE_COUNT,
-};
-
-typedef size_t DataRevision;
-
-class Buffer11 : public BufferD3D
-{
- public:
- Buffer11(const gl::BufferState &state, Renderer11 *renderer);
- ~Buffer11() override;
-
- gl::ErrorOrResult<ID3D11Buffer *> getBuffer(const gl::Context *context, BufferUsage usage);
- gl::ErrorOrResult<ID3D11Buffer *> getEmulatedIndexedBuffer(const gl::Context *context,
- SourceIndexData *indexInfo,
- const TranslatedAttribute &attribute,
- GLint startVertex);
- gl::Error getConstantBufferRange(const gl::Context *context,
- GLintptr offset,
- GLsizeiptr size,
- const d3d11::Buffer **bufferOut,
- UINT *firstConstantOut,
- UINT *numConstantsOut);
- gl::ErrorOrResult<const d3d11::ShaderResourceView *> getSRV(const gl::Context *context,
- DXGI_FORMAT srvFormat);
- bool isMapped() const { return mMappedStorage != nullptr; }
- gl::Error packPixels(const gl::Context *context,
- const gl::FramebufferAttachment &readAttachment,
- const PackPixelsParams &params);
- size_t getTotalCPUBufferMemoryBytes() const;
-
- // BufferD3D implementation
- size_t getSize() const override;
- bool supportsDirectBinding() const override;
- gl::Error getData(const gl::Context *context, const uint8_t **outData) override;
- void initializeStaticData(const gl::Context *context) override;
- void invalidateStaticData(const gl::Context *context) override;
-
- // BufferImpl implementation
- gl::Error setData(const gl::Context *context,
- gl::BufferBinding target,
- const void *data,
- size_t size,
- gl::BufferUsage usage) override;
- gl::Error setSubData(const gl::Context *context,
- gl::BufferBinding target,
- const void *data,
- size_t size,
- size_t offset) override;
- gl::Error copySubData(const gl::Context *context,
- BufferImpl *source,
- GLintptr sourceOffset,
- GLintptr destOffset,
- GLsizeiptr size) override;
- gl::Error map(const gl::Context *context, GLenum access, void **mapPtr) override;
- gl::Error mapRange(const gl::Context *context,
- size_t offset,
- size_t length,
- GLbitfield access,
- void **mapPtr) override;
- gl::Error unmap(const gl::Context *context, GLboolean *result) override;
- gl::Error markTransformFeedbackUsage(const gl::Context *context) override;
-
- // We use two set of dirty events. Static buffers are marked dirty whenever
- // data changes, because they must be re-translated. Direct buffers only need to be
- // updated when the underlying ID3D11Buffer pointer changes - hopefully far less often.
- OnBufferDataDirtyChannel *getStaticBroadcastChannel();
- OnBufferDataDirtyChannel *getDirectBroadcastChannel();
-
- private:
- class BufferStorage;
- class EmulatedIndexedStorage;
- class NativeStorage;
- class PackStorage;
- class SystemMemoryStorage;
-
- struct ConstantBufferCacheEntry
- {
- ConstantBufferCacheEntry() : storage(nullptr), lruCount(0) {}
-
- BufferStorage *storage;
- unsigned int lruCount;
- };
-
- void markBufferUsage(BufferUsage usage);
- gl::Error garbageCollection(const gl::Context *context, BufferUsage currentUsage);
- gl::ErrorOrResult<NativeStorage *> getStagingStorage(const gl::Context *context);
- gl::ErrorOrResult<PackStorage *> getPackStorage(const gl::Context *context);
- gl::ErrorOrResult<SystemMemoryStorage *> getSystemMemoryStorage(const gl::Context *context);
-
- gl::Error updateBufferStorage(const gl::Context *context,
- BufferStorage *storage,
- size_t sourceOffset,
- size_t storageSize);
- gl::ErrorOrResult<BufferStorage *> getBufferStorage(const gl::Context *context,
- BufferUsage usage);
- gl::ErrorOrResult<BufferStorage *> getLatestBufferStorage(const gl::Context *context) const;
-
- gl::ErrorOrResult<BufferStorage *> getConstantBufferRangeStorage(const gl::Context *context,
- GLintptr offset,
- GLsizeiptr size);
-
- BufferStorage *allocateStorage(BufferUsage usage);
- void updateDeallocThreshold(BufferUsage usage);
-
- // Free the storage if we decide it isn't being used very often.
- gl::Error checkForDeallocation(const gl::Context *context, BufferUsage usage);
-
- // For some cases of uniform buffer storage, we can't deallocate system memory storage.
- bool canDeallocateSystemMemory() const;
-
- // Updates data revisions and latest storage.
- void onCopyStorage(BufferStorage *dest, BufferStorage *source);
- void onStorageUpdate(BufferStorage *updatedStorage);
-
- Renderer11 *mRenderer;
- size_t mSize;
-
- BufferStorage *mMappedStorage;
-
- // Buffer storages are sorted by usage. It's important that the latest buffer storage picks
- // the lowest usage in the case where two storages are tied on data revision - this ensures
- // we never do anything dangerous like map a uniform buffer over a staging or system memory
- // copy.
- std::array<BufferStorage *, BUFFER_USAGE_COUNT> mBufferStorages;
- BufferStorage *mLatestBufferStorage;
-
- // These two arrays are used to track when to free unused storage.
- std::array<unsigned int, BUFFER_USAGE_COUNT> mDeallocThresholds;
- std::array<unsigned int, BUFFER_USAGE_COUNT> mIdleness;
-
- // Cache of D3D11 constant buffer for specific ranges of buffer data.
- // This is used to emulate UBO ranges on 11.0 devices.
- // Constant buffers are indexed by there start offset.
- typedef std::map<GLintptr /*offset*/, ConstantBufferCacheEntry> ConstantBufferCache;
- ConstantBufferCache mConstantBufferRangeStoragesCache;
- size_t mConstantBufferStorageAdditionalSize;
- unsigned int mMaxConstantBufferLruCount;
-
- OnBufferDataDirtyChannel mStaticBroadcastChannel;
- OnBufferDataDirtyChannel mDirectBroadcastChannel;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_BUFFER11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp
deleted file mode 100644
index f9dda0aeb4..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp
+++ /dev/null
@@ -1,833 +0,0 @@
-
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Clear11.cpp: Framebuffer clear utility class.
-
-#include "libANGLE/renderer/d3d/d3d11/Clear11.h"
-
-#include <algorithm>
-
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/d3d/FramebufferD3D.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h"
-#include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
-#include "third_party/trace_event/trace_event.h"
-
-// Precompiled shaders
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11_fl9vs.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11multiviewgs.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11multiviewvs.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11vs.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/cleardepth11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11_fl9ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps1.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps2.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps3.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps4.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps5.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps6.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps7.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps8.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps1.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps2.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps3.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps4.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps5.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps6.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps7.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps8.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps1.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps2.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps3.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps4.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps5.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps6.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps7.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps8.h"
-
-namespace rx
-{
-
-namespace
-{
-constexpr uint32_t g_ConstantBufferSize = sizeof(RtvDsvClearInfo<float>);
-constexpr uint32_t g_VertexSize = sizeof(d3d11::PositionVertex);
-
-// Updates color, depth and alpha components of cached CB if necessary.
-// Returns true if any constants are updated, false otherwise.
-template <typename T>
-bool UpdateDataCache(RtvDsvClearInfo<T> *dataCache,
- const gl::Color<T> &color,
- const float *zValue,
- const uint32_t numRtvs,
- const uint8_t writeMask)
-{
- bool cacheDirty = false;
-
- if (numRtvs > 0)
- {
- const bool writeRGB = (writeMask & ~D3D11_COLOR_WRITE_ENABLE_ALPHA) != 0;
- if (writeRGB && memcmp(&dataCache->r, &color.red, sizeof(T) * 3) != 0)
- {
- dataCache->r = color.red;
- dataCache->g = color.green;
- dataCache->b = color.blue;
- cacheDirty = true;
- }
-
- const bool writeAlpha = (writeMask & D3D11_COLOR_WRITE_ENABLE_ALPHA) != 0;
- if (writeAlpha && (dataCache->a != color.alpha))
- {
- dataCache->a = color.alpha;
- cacheDirty = true;
- }
- }
-
- if (zValue)
- {
- const float clampedZValue = gl::clamp01(*zValue);
-
- if (clampedZValue != dataCache->z)
- {
- dataCache->z = clampedZValue;
- cacheDirty = true;
- }
- }
-
- 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) \
- d3d11::LazyShader<ID3D11PixelShader>(g_PS_Clear##Index, ArraySize(g_PS_Clear##Index), \
- "Clear11 PS " ANGLE_STRINGIFY(Index))
-
-Clear11::ShaderManager::ShaderManager()
- : mIl9(),
- mVs9(g_VS_Clear_FL9, ArraySize(g_VS_Clear_FL9), "Clear11 VS FL9"),
- mPsFloat9(g_PS_ClearFloat_FL9, ArraySize(g_PS_ClearFloat_FL9), "Clear11 PS FloatFL9"),
- mVs(g_VS_Clear, ArraySize(g_VS_Clear), "Clear11 VS"),
- mVsMultiview(g_VS_Multiview_Clear, ArraySize(g_VS_Multiview_Clear), "Clear11 VS Multiview"),
- mGsMultiview(g_GS_Multiview_Clear, ArraySize(g_GS_Multiview_Clear), "Clear11 GS Multiview"),
- mPsDepth(g_PS_ClearDepth, ArraySize(g_PS_ClearDepth), "Clear11 PS Depth"),
- mPsFloat{{CLEARPS(Float1), CLEARPS(Float2), CLEARPS(Float3), CLEARPS(Float4), CLEARPS(Float5),
- CLEARPS(Float6), CLEARPS(Float7), CLEARPS(Float8)}},
- mPsUInt{{CLEARPS(Uint1), CLEARPS(Uint2), CLEARPS(Uint3), CLEARPS(Uint4), CLEARPS(Uint5),
- CLEARPS(Uint6), CLEARPS(Uint7), CLEARPS(Uint8)}},
- mPsSInt{{CLEARPS(Sint1), CLEARPS(Sint2), CLEARPS(Sint3), CLEARPS(Sint4), CLEARPS(Sint5),
- CLEARPS(Sint6), CLEARPS(Sint7), CLEARPS(Sint8)}}
-{
-}
-
-#undef CLEARPS
-
-Clear11::ShaderManager::~ShaderManager()
-{
-}
-
-gl::Error Clear11::ShaderManager::getShadersAndLayout(Renderer11 *renderer,
- const INT clearType,
- const uint32_t numRTs,
- const bool hasLayeredLayout,
- const d3d11::InputLayout **il,
- const d3d11::VertexShader **vs,
- const d3d11::GeometryShader **gs,
- const d3d11::PixelShader **ps)
-{
- if (renderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3)
- {
- ASSERT(clearType == GL_FLOAT);
-
- ANGLE_TRY(mVs9.resolve(renderer));
- ANGLE_TRY(mPsFloat9.resolve(renderer));
-
- if (!mIl9.valid())
- {
- const D3D11_INPUT_ELEMENT_DESC ilDesc[] = {
- {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}};
-
- InputElementArray ilDescArray(ilDesc);
- ShaderData vertexShader(g_VS_Clear_FL9);
-
- ANGLE_TRY(renderer->allocateResource(ilDescArray, &vertexShader, &mIl9));
- }
-
- *vs = &mVs9.getObj();
- *gs = nullptr;
- *il = &mIl9;
- *ps = &mPsFloat9.getObj();
- return gl::NoError();
- }
- if (!hasLayeredLayout)
- {
- ANGLE_TRY(mVs.resolve(renderer));
- *vs = &mVs.getObj();
- *gs = nullptr;
- }
- else
- {
- // For layered framebuffers we have to use the multi-view versions of the VS and GS.
- ANGLE_TRY(mVsMultiview.resolve(renderer));
- ANGLE_TRY(mGsMultiview.resolve(renderer));
- *vs = &mVsMultiview.getObj();
- *gs = &mGsMultiview.getObj();
- }
-
- *il = nullptr;
-
- if (numRTs == 0)
- {
- ANGLE_TRY(mPsDepth.resolve(renderer));
- *ps = &mPsDepth.getObj();
- return gl::NoError();
- }
-
- switch (clearType)
- {
- case GL_FLOAT:
- ANGLE_TRY(mPsFloat[numRTs - 1].resolve(renderer));
- *ps = &mPsFloat[numRTs - 1].getObj();
- break;
- case GL_UNSIGNED_INT:
- ANGLE_TRY(mPsUInt[numRTs - 1].resolve(renderer));
- *ps = &mPsUInt[numRTs - 1].getObj();
- break;
- case GL_INT:
- ANGLE_TRY(mPsSInt[numRTs - 1].resolve(renderer));
- *ps = &mPsSInt[numRTs - 1].getObj();
- break;
- default:
- UNREACHABLE();
- break;
- }
-
- return gl::NoError();
-}
-
-Clear11::Clear11(Renderer11 *renderer)
- : mRenderer(renderer),
- mResourcesInitialized(false),
- mScissorEnabledRasterizerState(),
- mScissorDisabledRasterizerState(),
- mShaderManager(),
- mConstantBuffer(),
- mVertexBuffer(),
- mShaderData({})
-{
-}
-
-Clear11::~Clear11()
-{
-}
-
-gl::Error Clear11::ensureResourcesInitialized()
-{
- if (mResourcesInitialized)
- {
- return gl::NoError();
- }
-
- TRACE_EVENT0("gpu.angle", "Clear11::ensureResourcesInitialized");
-
- static_assert((sizeof(RtvDsvClearInfo<float>) == sizeof(RtvDsvClearInfo<int>)),
- "Size of rx::RtvDsvClearInfo<float> is not equal to rx::RtvDsvClearInfo<int>");
-
- static_assert(
- (sizeof(RtvDsvClearInfo<float>) == sizeof(RtvDsvClearInfo<uint32_t>)),
- "Size of rx::RtvDsvClearInfo<float> is not equal to rx::RtvDsvClearInfo<uint32_t>");
-
- static_assert((sizeof(RtvDsvClearInfo<float>) % 16 == 0),
- "The size of RtvDsvClearInfo<float> should be a multiple of 16bytes.");
-
- // Create Rasterizer States
- D3D11_RASTERIZER_DESC rsDesc;
- rsDesc.FillMode = D3D11_FILL_SOLID;
- rsDesc.CullMode = D3D11_CULL_NONE;
- rsDesc.FrontCounterClockwise = FALSE;
- rsDesc.DepthBias = 0;
- rsDesc.DepthBiasClamp = 0.0f;
- rsDesc.SlopeScaledDepthBias = 0.0f;
- rsDesc.DepthClipEnable = TRUE;
- rsDesc.ScissorEnable = FALSE;
- rsDesc.MultisampleEnable = FALSE;
- rsDesc.AntialiasedLineEnable = FALSE;
-
- ANGLE_TRY(mRenderer->allocateResource(rsDesc, &mScissorDisabledRasterizerState));
- mScissorDisabledRasterizerState.setDebugName("Clear11 Rasterizer State with scissor disabled");
-
- rsDesc.ScissorEnable = TRUE;
- ANGLE_TRY(mRenderer->allocateResource(rsDesc, &mScissorEnabledRasterizerState));
- mScissorEnabledRasterizerState.setDebugName("Clear11 Rasterizer State with scissor enabled");
-
- // Initialize Depthstencil state with defaults
- mDepthStencilStateKey.depthTest = false;
- mDepthStencilStateKey.depthMask = false;
- mDepthStencilStateKey.depthFunc = GL_ALWAYS;
- mDepthStencilStateKey.stencilWritemask = static_cast<GLuint>(-1);
- mDepthStencilStateKey.stencilBackWritemask = static_cast<GLuint>(-1);
- mDepthStencilStateKey.stencilBackMask = 0;
- mDepthStencilStateKey.stencilTest = false;
- mDepthStencilStateKey.stencilMask = 0;
- mDepthStencilStateKey.stencilFail = GL_REPLACE;
- mDepthStencilStateKey.stencilPassDepthFail = GL_REPLACE;
- mDepthStencilStateKey.stencilPassDepthPass = GL_REPLACE;
- mDepthStencilStateKey.stencilFunc = GL_ALWAYS;
- mDepthStencilStateKey.stencilBackFail = GL_REPLACE;
- mDepthStencilStateKey.stencilBackPassDepthFail = GL_REPLACE;
- mDepthStencilStateKey.stencilBackPassDepthPass = GL_REPLACE;
- mDepthStencilStateKey.stencilBackFunc = GL_ALWAYS;
-
- // Initialize BlendStateKey with defaults
- mBlendStateKey.blendState.blend = false;
- mBlendStateKey.blendState.sourceBlendRGB = GL_ONE;
- mBlendStateKey.blendState.sourceBlendAlpha = GL_ONE;
- mBlendStateKey.blendState.destBlendRGB = GL_ZERO;
- mBlendStateKey.blendState.destBlendAlpha = GL_ZERO;
- mBlendStateKey.blendState.blendEquationRGB = GL_FUNC_ADD;
- mBlendStateKey.blendState.blendEquationAlpha = GL_FUNC_ADD;
- mBlendStateKey.blendState.sampleAlphaToCoverage = false;
- mBlendStateKey.blendState.dither = true;
-
- mResourcesInitialized = true;
- return gl::NoError();
-}
-
-bool Clear11::useVertexBuffer() const
-{
- return (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3);
-}
-
-gl::Error Clear11::ensureConstantBufferCreated()
-{
- if (mConstantBuffer.valid())
- {
- return gl::NoError();
- }
-
- // Create constant buffer for color & depth data
-
- D3D11_BUFFER_DESC bufferDesc;
- bufferDesc.ByteWidth = g_ConstantBufferSize;
- bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
- bufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
- bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- bufferDesc.MiscFlags = 0;
- bufferDesc.StructureByteStride = 0;
-
- D3D11_SUBRESOURCE_DATA initialData;
- initialData.pSysMem = &mShaderData;
- initialData.SysMemPitch = g_ConstantBufferSize;
- initialData.SysMemSlicePitch = g_ConstantBufferSize;
-
- ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &initialData, &mConstantBuffer));
- mConstantBuffer.setDebugName("Clear11 Constant Buffer");
- return gl::NoError();
-}
-
-gl::Error Clear11::ensureVertexBufferCreated()
-{
- ASSERT(useVertexBuffer());
-
- if (mVertexBuffer.valid())
- {
- return gl::NoError();
- }
-
- // Create vertex buffer with vertices for a quad covering the entire surface
-
- static_assert((sizeof(d3d11::PositionVertex) % 16) == 0,
- "d3d11::PositionVertex should be a multiple of 16 bytes");
- const d3d11::PositionVertex vbData[6] = {{-1.0f, 1.0f, 0.0f, 1.0f}, {1.0f, -1.0f, 0.0f, 1.0f},
- {-1.0f, -1.0f, 0.0f, 1.0f}, {-1.0f, 1.0f, 0.0f, 1.0f},
- {1.0f, 1.0f, 0.0f, 1.0f}, {1.0f, -1.0f, 0.0f, 1.0f}};
-
- const UINT vbSize = sizeof(vbData);
-
- D3D11_BUFFER_DESC bufferDesc;
- bufferDesc.ByteWidth = vbSize;
- bufferDesc.Usage = D3D11_USAGE_IMMUTABLE;
- bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
- bufferDesc.CPUAccessFlags = 0;
- bufferDesc.MiscFlags = 0;
- bufferDesc.StructureByteStride = 0;
-
- D3D11_SUBRESOURCE_DATA initialData;
- initialData.pSysMem = vbData;
- initialData.SysMemPitch = vbSize;
- initialData.SysMemSlicePitch = initialData.SysMemPitch;
-
- ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &initialData, &mVertexBuffer));
- mVertexBuffer.setDebugName("Clear11 Vertex Buffer");
- return gl::NoError();
-}
-
-gl::Error Clear11::clearFramebuffer(const gl::Context *context,
- const ClearParameters &clearParams,
- const gl::FramebufferState &fboData)
-{
- ANGLE_TRY(ensureResourcesInitialized());
-
- // Iterate over the color buffers which require clearing and determine if they can be
- // cleared with ID3D11DeviceContext::ClearRenderTargetView or ID3D11DeviceContext1::ClearView.
- // This requires:
- // 1) The render target is being cleared to a float value (will be cast to integer when clearing
- // integer render targets as expected but does not work the other way around)
- // 2) The format of the render target has no color channels that are currently masked out.
- // Clear the easy-to-clear buffers on the spot and accumulate the ones that require special
- // work.
- //
- // If these conditions are met, and:
- // - No scissored clear is needed, then clear using ID3D11DeviceContext::ClearRenderTargetView.
- // - A scissored clear is needed then clear using ID3D11DeviceContext1::ClearView if available.
- // Otherwise perform a shader based clear.
- //
- // Also determine if the DSV can be cleared withID3D11DeviceContext::ClearDepthStencilView by
- // checking if the stencil write mask covers the entire stencil.
- //
- // To clear the remaining buffers, a shader based clear is performed:
- // - The appropriate ShaderManagers (VS & PS) for the clearType is set
- // - A CB containing the clear color and Z values is bound
- // - An IL and VB are bound (for FL93 and below)
- // - ScissorRect/Raststate/Viewport set as required
- // - Blendstate set containing appropriate colorMasks
- // - DepthStencilState set with appropriate parameters for a z or stencil clear if required
- // - Color and/or Z buffers to be cleared are bound
- // - Primitive covering entire clear area is drawn
-
- gl::Extents framebufferSize;
-
- const auto *depthStencilAttachment = fboData.getDepthOrStencilAttachment();
- if (depthStencilAttachment != nullptr)
- {
- framebufferSize = depthStencilAttachment->getSize();
- }
- else
- {
- const gl::FramebufferAttachment *colorAttachment = fboData.getFirstColorAttachment();
-
- if (!colorAttachment)
- {
- UNREACHABLE();
- return gl::InternalError();
- }
-
- framebufferSize = colorAttachment->getSize();
- }
-
- const bool isSideBySideFBO =
- (fboData.getMultiviewLayout() == GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE);
- bool needScissoredClear = false;
- std::vector<D3D11_RECT> scissorRects;
- 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.
- // Scissor rect is outside the renderbuffer or is an empty rect.
- return gl::NoError();
- }
-
- if (isSideBySideFBO)
- {
- // 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 gl::NoError();
- }
- 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);
- }
- }
- }
-
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- ID3D11DeviceContext1 *deviceContext1 = mRenderer->getDeviceContext1IfSupported();
-
- std::array<ID3D11RenderTargetView *, D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT> rtvs;
- std::array<uint8_t, D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT> rtvMasks = {};
-
- uint32_t numRtvs = 0;
- const uint8_t colorMask =
- gl_d3d11::ConvertColorMask(clearParams.colorMaskRed, clearParams.colorMaskGreen,
- clearParams.colorMaskBlue, clearParams.colorMaskAlpha);
-
- const auto &colorAttachments = fboData.getColorAttachments();
- for (auto colorAttachmentIndex : fboData.getEnabledDrawBuffers())
- {
- const gl::FramebufferAttachment &attachment = colorAttachments[colorAttachmentIndex];
-
- if (!clearParams.clearColor[colorAttachmentIndex])
- {
- continue;
- }
-
- RenderTarget11 *renderTarget = nullptr;
- ANGLE_TRY(attachment.getRenderTarget(context, &renderTarget));
-
- const gl::InternalFormat &formatInfo = *attachment.getFormat().info;
-
- if (clearParams.colorType == GL_FLOAT &&
- !(formatInfo.componentType == GL_FLOAT ||
- formatInfo.componentType == GL_UNSIGNED_NORMALIZED ||
- formatInfo.componentType == GL_SIGNED_NORMALIZED))
- {
- ERR() << "It is undefined behaviour to clear a render buffer which is not "
- "normalized fixed point or floating-point to floating point values (color "
- "attachment "
- << colorAttachmentIndex << " has internal format " << attachment.getFormat()
- << ").";
- }
-
- if ((formatInfo.redBits == 0 || !clearParams.colorMaskRed) &&
- (formatInfo.greenBits == 0 || !clearParams.colorMaskGreen) &&
- (formatInfo.blueBits == 0 || !clearParams.colorMaskBlue) &&
- (formatInfo.alphaBits == 0 || !clearParams.colorMaskAlpha))
- {
- // Every channel either does not exist in the render target or is masked out
- continue;
- }
-
- const auto &framebufferRTV = renderTarget->getRenderTargetView();
- ASSERT(framebufferRTV.valid());
-
- if ((!(mRenderer->getRenderer11DeviceCaps().supportsClearView) && needScissoredClear) ||
- clearParams.colorType != GL_FLOAT ||
- (formatInfo.redBits > 0 && !clearParams.colorMaskRed) ||
- (formatInfo.greenBits > 0 && !clearParams.colorMaskGreen) ||
- (formatInfo.blueBits > 0 && !clearParams.colorMaskBlue) ||
- (formatInfo.alphaBits > 0 && !clearParams.colorMaskAlpha))
- {
- rtvs[numRtvs] = framebufferRTV.get();
- rtvMasks[numRtvs] = gl_d3d11::GetColorMask(formatInfo) & colorMask;
- numRtvs++;
- }
- else
- {
- // ID3D11DeviceContext::ClearRenderTargetView or ID3D11DeviceContext1::ClearView is
- // possible
-
- const auto &nativeFormat = renderTarget->getFormatSet().format();
-
- // Check if the actual format has a channel that the internal format does not and
- // set them to the default values
- float clearValues[4] = {
- ((formatInfo.redBits == 0 && nativeFormat.redBits > 0) ? 0.0f
- : clearParams.colorF.red),
- ((formatInfo.greenBits == 0 && nativeFormat.greenBits > 0)
- ? 0.0f
- : clearParams.colorF.green),
- ((formatInfo.blueBits == 0 && nativeFormat.blueBits > 0) ? 0.0f
- : clearParams.colorF.blue),
- ((formatInfo.alphaBits == 0 && nativeFormat.alphaBits > 0)
- ? 1.0f
- : clearParams.colorF.alpha),
- };
-
- if (formatInfo.alphaBits == 1)
- {
- // Some drivers do not correctly handle calling Clear() on a format with 1-bit
- // alpha. They can incorrectly round all non-zero values up to 1.0f. Note that
- // WARP does not do this. We should handle the rounding for them instead.
- clearValues[3] = (clearParams.colorF.alpha >= 0.5f) ? 1.0f : 0.0f;
- }
-
- if (needScissoredClear)
- {
- // 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()));
- if (mRenderer->getWorkarounds().callClearTwice)
- {
- deviceContext1->ClearView(framebufferRTV.get(), clearValues,
- scissorRects.data(),
- static_cast<UINT>(scissorRects.size()));
- }
- }
- else
- {
- deviceContext->ClearRenderTargetView(framebufferRTV.get(), clearValues);
- if (mRenderer->getWorkarounds().callClearTwice)
- {
- deviceContext->ClearRenderTargetView(framebufferRTV.get(), clearValues);
- }
- }
- }
- }
-
- ID3D11DepthStencilView *dsv = nullptr;
-
- if (clearParams.clearDepth || clearParams.clearStencil)
- {
- RenderTarget11 *depthStencilRenderTarget = nullptr;
-
- ASSERT(depthStencilAttachment != nullptr);
- ANGLE_TRY(depthStencilAttachment->getRenderTarget(context, &depthStencilRenderTarget));
-
- dsv = depthStencilRenderTarget->getDepthStencilView().get();
- ASSERT(dsv != nullptr);
-
- const auto &nativeFormat = depthStencilRenderTarget->getFormatSet().format();
- const auto *stencilAttachment = fboData.getStencilAttachment();
-
- uint32_t stencilUnmasked =
- (stencilAttachment != nullptr) ? (1 << nativeFormat.stencilBits) - 1 : 0;
- bool needMaskedStencilClear =
- clearParams.clearStencil &&
- (clearParams.stencilWriteMask & stencilUnmasked) != stencilUnmasked;
-
- if (!needScissoredClear && !needMaskedStencilClear)
- {
- const UINT clearFlags = (clearParams.clearDepth ? D3D11_CLEAR_DEPTH : 0) |
- (clearParams.clearStencil ? D3D11_CLEAR_STENCIL : 0);
- const FLOAT depthClear = gl::clamp01(clearParams.depthValue);
- const UINT8 stencilClear = clearParams.stencilValue & 0xFF;
-
- deviceContext->ClearDepthStencilView(dsv, clearFlags, depthClear, stencilClear);
-
- dsv = nullptr;
- }
- }
-
- if (numRtvs == 0 && dsv == nullptr)
- {
- return gl::NoError();
- }
-
- // Clear the remaining render targets and depth stencil in one pass by rendering a quad:
- //
- // IA/VS: Vertices containing position and color members are passed through to the next stage.
- // The vertex position has XY coordinates equal to clip extents and a Z component equal to the
- // Z clear value. The vertex color contains the clear color.
- //
- // Rasterizer: Viewport scales the VS output over the entire surface and depending on whether
- // or not scissoring is enabled the appropriate scissor rect and rasterizerState with or without
- // the scissor test enabled is set as well.
- //
- // DepthStencilTest: DepthTesting, DepthWrites, StencilMask and StencilWrites will be enabled or
- // disabled or set depending on what the input depthStencil clear parameters are. Since the PS
- // is not writing out depth or rejecting pixels, this should happen prior to the PS stage.
- //
- // PS: Will write out the color values passed through from the previous stage to all outputs.
- //
- // OM: BlendState will perform the required color masking and output to RTV(s).
-
- //
- // ======================================================================================
- //
- // Luckily, the gl spec (ES 3.0.2 pg 183) states that the results of clearing a render-
- // buffer that is not normalized fixed point or floating point with floating point values
- // are undefined so we can just write floats to them and D3D11 will bit cast them to
- // integers.
- //
- // Also, we don't have to worry about attempting to clear a normalized fixed/floating point
- // buffer with integer values because there is no gl API call which would allow it,
- // glClearBuffer* calls only clear a single renderbuffer at a time which is verified to
- // be a compatible clear type.
-
- ASSERT(numRtvs <= mRenderer->getNativeCaps().maxDrawBuffers);
-
- // Setup BlendStateKey parameters
- mBlendStateKey.blendState.colorMaskRed = clearParams.colorMaskRed;
- mBlendStateKey.blendState.colorMaskGreen = clearParams.colorMaskGreen;
- mBlendStateKey.blendState.colorMaskBlue = clearParams.colorMaskBlue;
- mBlendStateKey.blendState.colorMaskAlpha = clearParams.colorMaskAlpha;
- mBlendStateKey.rtvMax = numRtvs;
- memcpy(mBlendStateKey.rtvMasks, &rtvMasks[0], sizeof(mBlendStateKey.rtvMasks));
-
- // Get BlendState
- const d3d11::BlendState *blendState = nullptr;
- ANGLE_TRY(mRenderer->getBlendState(mBlendStateKey, &blendState));
-
- const d3d11::DepthStencilState *dsState = nullptr;
- const float *zValue = nullptr;
-
- if (dsv)
- {
- // Setup DepthStencilStateKey
- mDepthStencilStateKey.depthTest = clearParams.clearDepth;
- mDepthStencilStateKey.depthMask = clearParams.clearDepth;
- mDepthStencilStateKey.stencilWritemask = clearParams.stencilWriteMask;
- mDepthStencilStateKey.stencilTest = clearParams.clearStencil;
-
- // Get DepthStencilState
- ANGLE_TRY(mRenderer->getDepthStencilState(mDepthStencilStateKey, &dsState));
- zValue = clearParams.clearDepth ? &clearParams.depthValue : nullptr;
- }
-
- bool dirtyCb = false;
-
- // Compare the input color/z values against the CB cache and update it if necessary
- switch (clearParams.colorType)
- {
- case GL_FLOAT:
- dirtyCb = UpdateDataCache(reinterpret_cast<RtvDsvClearInfo<float> *>(&mShaderData),
- clearParams.colorF, zValue, numRtvs, colorMask);
- break;
- case GL_UNSIGNED_INT:
- dirtyCb = UpdateDataCache(reinterpret_cast<RtvDsvClearInfo<uint32_t> *>(&mShaderData),
- clearParams.colorUI, zValue, numRtvs, colorMask);
- break;
- case GL_INT:
- dirtyCb = UpdateDataCache(reinterpret_cast<RtvDsvClearInfo<int> *>(&mShaderData),
- clearParams.colorI, zValue, numRtvs, colorMask);
- break;
- default:
- UNREACHABLE();
- break;
- }
-
- ANGLE_TRY(ensureConstantBufferCreated());
-
- if (dirtyCb)
- {
- // Update the constant buffer with the updated cache contents
- // TODO(Shahmeer): Consider using UpdateSubresource1 D3D11_COPY_DISCARD where possible.
- D3D11_MAPPED_SUBRESOURCE mappedResource;
- HRESULT result = deviceContext->Map(mConstantBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0,
- &mappedResource);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Clear11: Failed to map CB, " << gl::FmtHR(result);
- }
-
- memcpy(mappedResource.pData, &mShaderData, g_ConstantBufferSize);
- deviceContext->Unmap(mConstantBuffer.get(), 0);
- }
-
- auto *stateManager = mRenderer->getStateManager();
-
- // Set the viewport to be the same size as the framebuffer.
- stateManager->setSimpleViewport(framebufferSize);
-
- // Apply state
- stateManager->setSimpleBlendState(blendState);
-
- const UINT stencilValue = clearParams.stencilValue & 0xFF;
- stateManager->setDepthStencilState(dsState, stencilValue);
-
- if (needScissoredClear)
- {
- stateManager->setRasterizerState(&mScissorEnabledRasterizerState);
- }
- else
- {
- stateManager->setRasterizerState(&mScissorDisabledRasterizerState);
- }
-
- // Get Shaders
- const d3d11::VertexShader *vs = nullptr;
- 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);
- ANGLE_TRY(mShaderManager.getShadersAndLayout(mRenderer, clearParams.colorType, numRtvs,
- hasLayeredLayout, &il, &vs, &gs, &ps));
-
- // Apply Shaders
- stateManager->setDrawShaders(vs, gs, ps);
- stateManager->setPixelConstantBuffer(0, &mConstantBuffer);
-
- // Bind IL & VB if needed
- stateManager->setIndexBuffer(nullptr, DXGI_FORMAT_UNKNOWN, 0);
- stateManager->setInputLayout(il);
-
- if (useVertexBuffer())
- {
- ANGLE_TRY(ensureVertexBufferCreated());
- stateManager->setSingleVertexBuffer(&mVertexBuffer, g_VertexSize, 0);
- }
- else
- {
- stateManager->setSingleVertexBuffer(nullptr, 0, 0);
- }
-
- stateManager->setPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
-
- // 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)
- {
- 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);
- }
- }
-
- return gl::NoError();
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.h
deleted file mode 100644
index a09812c42b..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.h
+++ /dev/null
@@ -1,100 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Clear11.h: Framebuffer clear utility class.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_CLEAR11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_CLEAR11_H_
-
-#include <map>
-#include <vector>
-
-#include "libANGLE/angletypes.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-
-namespace rx
-{
-class Renderer11;
-class RenderTarget11;
-struct ClearParameters;
-
-template <typename T>
-struct RtvDsvClearInfo
-{
- T r, g, b, a;
- float z;
- float c1padding[3];
-};
-
-class Clear11 : angle::NonCopyable
-{
- public:
- explicit Clear11(Renderer11 *renderer);
- ~Clear11();
-
- // Clears the framebuffer with the supplied clear parameters, assumes that the framebuffer is currently applied.
- gl::Error clearFramebuffer(const gl::Context *context,
- const ClearParameters &clearParams,
- const gl::FramebufferState &fboData);
-
- private:
- class ShaderManager final : angle::NonCopyable
- {
- public:
- ShaderManager();
- ~ShaderManager();
- gl::Error getShadersAndLayout(Renderer11 *renderer,
- const INT clearType,
- const uint32_t numRTs,
- const bool hasLayeredLayout,
- const d3d11::InputLayout **il,
- const d3d11::VertexShader **vs,
- const d3d11::GeometryShader **gs,
- const d3d11::PixelShader **ps);
-
- private:
- constexpr static size_t kNumShaders = D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT;
-
- d3d11::InputLayout mIl9;
- d3d11::LazyShader<ID3D11VertexShader> mVs9;
- d3d11::LazyShader<ID3D11PixelShader> mPsFloat9;
- d3d11::LazyShader<ID3D11VertexShader> mVs;
- d3d11::LazyShader<ID3D11VertexShader> mVsMultiview;
- d3d11::LazyShader<ID3D11GeometryShader> mGsMultiview;
- d3d11::LazyShader<ID3D11PixelShader> mPsDepth;
- std::array<d3d11::LazyShader<ID3D11PixelShader>, kNumShaders> mPsFloat;
- std::array<d3d11::LazyShader<ID3D11PixelShader>, kNumShaders> mPsUInt;
- std::array<d3d11::LazyShader<ID3D11PixelShader>, kNumShaders> mPsSInt;
- };
-
- bool useVertexBuffer() const;
- gl::Error ensureConstantBufferCreated();
- gl::Error ensureVertexBufferCreated();
- gl::Error ensureResourcesInitialized();
-
- Renderer11 *mRenderer;
- bool mResourcesInitialized;
-
- // States
- d3d11::RasterizerState mScissorEnabledRasterizerState;
- d3d11::RasterizerState mScissorDisabledRasterizerState;
- gl::DepthStencilState mDepthStencilStateKey;
- d3d11::BlendStateKey mBlendStateKey;
-
- // Shaders and shader resources
- ShaderManager mShaderManager;
- d3d11::Buffer mConstantBuffer;
- d3d11::Buffer mVertexBuffer;
-
- // Buffer data and draw parameters
- RtvDsvClearInfo<float> mShaderData;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_CLEAR11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Context11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
deleted file mode 100644
index b79dd3603a..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
+++ /dev/null
@@ -1,405 +0,0 @@
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context11:
-// D3D11-specific functionality associated with a GL Context.
-//
-
-#include "libANGLE/renderer/d3d/d3d11/Context11.h"
-
-#include "common/string_utils.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/MemoryProgramCache.h"
-#include "libANGLE/renderer/d3d/CompilerD3D.h"
-#include "libANGLE/renderer/d3d/ProgramD3D.h"
-#include "libANGLE/renderer/d3d/RenderbufferD3D.h"
-#include "libANGLE/renderer/d3d/SamplerD3D.h"
-#include "libANGLE/renderer/d3d/ShaderD3D.h"
-#include "libANGLE/renderer/d3d/TextureD3D.h"
-#include "libANGLE/renderer/d3d/d3d11/Buffer11.h"
-#include "libANGLE/renderer/d3d/d3d11/Fence11.h"
-#include "libANGLE/renderer/d3d/d3d11/Framebuffer11.h"
-#include "libANGLE/renderer/d3d/d3d11/ProgramPipeline11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/StateManager11.h"
-#include "libANGLE/renderer/d3d/d3d11/TransformFeedback11.h"
-#include "libANGLE/renderer/d3d/d3d11/VertexArray11.h"
-
-namespace rx
-{
-
-Context11::Context11(const gl::ContextState &state, Renderer11 *renderer)
- : ContextImpl(state), mRenderer(renderer)
-{
-}
-
-Context11::~Context11()
-{
-}
-
-gl::Error Context11::initialize()
-{
- return gl::NoError();
-}
-
-CompilerImpl *Context11::createCompiler()
-{
- if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3)
- {
- return new CompilerD3D(SH_HLSL_4_0_FL9_3_OUTPUT);
- }
- else
- {
- return new CompilerD3D(SH_HLSL_4_1_OUTPUT);
- }
-}
-
-ShaderImpl *Context11::createShader(const gl::ShaderState &data)
-{
- return new ShaderD3D(data, mRenderer->getWorkarounds(), mRenderer->getNativeExtensions());
-}
-
-ProgramImpl *Context11::createProgram(const gl::ProgramState &data)
-{
- return new ProgramD3D(data, mRenderer);
-}
-
-FramebufferImpl *Context11::createFramebuffer(const gl::FramebufferState &data)
-{
- return new Framebuffer11(data, mRenderer);
-}
-
-TextureImpl *Context11::createTexture(const gl::TextureState &state)
-{
- switch (state.getTarget())
- {
- case GL_TEXTURE_2D:
- return new TextureD3D_2D(state, mRenderer);
- case GL_TEXTURE_CUBE_MAP:
- return new TextureD3D_Cube(state, mRenderer);
- case GL_TEXTURE_3D:
- return new TextureD3D_3D(state, mRenderer);
- case GL_TEXTURE_2D_ARRAY:
- return new TextureD3D_2DArray(state, mRenderer);
- case GL_TEXTURE_EXTERNAL_OES:
- return new TextureD3D_External(state, mRenderer);
- case GL_TEXTURE_2D_MULTISAMPLE:
- return new TextureD3D_2DMultisample(state, mRenderer);
- break;
- default:
- UNREACHABLE();
- }
-
- return nullptr;
-}
-
-RenderbufferImpl *Context11::createRenderbuffer()
-{
- return new RenderbufferD3D(mRenderer);
-}
-
-BufferImpl *Context11::createBuffer(const gl::BufferState &state)
-{
- Buffer11 *buffer = new Buffer11(state, mRenderer);
- mRenderer->onBufferCreate(buffer);
- return buffer;
-}
-
-VertexArrayImpl *Context11::createVertexArray(const gl::VertexArrayState &data)
-{
- return new VertexArray11(data);
-}
-
-QueryImpl *Context11::createQuery(GLenum type)
-{
- return new Query11(mRenderer, type);
-}
-
-FenceNVImpl *Context11::createFenceNV()
-{
- return new FenceNV11(mRenderer);
-}
-
-SyncImpl *Context11::createSync()
-{
- return new Sync11(mRenderer);
-}
-
-TransformFeedbackImpl *Context11::createTransformFeedback(const gl::TransformFeedbackState &state)
-{
- return new TransformFeedback11(state, mRenderer);
-}
-
-SamplerImpl *Context11::createSampler(const gl::SamplerState &state)
-{
- return new SamplerD3D(state);
-}
-
-ProgramPipelineImpl *Context11::createProgramPipeline(const gl::ProgramPipelineState &data)
-{
- return new ProgramPipeline11(data);
-}
-
-std::vector<PathImpl *> Context11::createPaths(GLsizei)
-{
- return std::vector<PathImpl *>();
-}
-
-gl::Error Context11::flush(const gl::Context *context)
-{
- return mRenderer->flush();
-}
-
-gl::Error Context11::finish(const gl::Context *context)
-{
- return mRenderer->finish();
-}
-
-gl::Error Context11::drawArrays(const gl::Context *context, GLenum mode, GLint first, GLsizei count)
-{
- ANGLE_TRY(prepareForDrawCall(context, mode));
- return mRenderer->drawArrays(context, mode, first, count, 0);
-}
-
-gl::Error Context11::drawArraysInstanced(const gl::Context *context,
- GLenum mode,
- GLint first,
- GLsizei count,
- GLsizei instanceCount)
-{
- ANGLE_TRY(prepareForDrawCall(context, mode));
- return mRenderer->drawArrays(context, mode, first, count, instanceCount);
-}
-
-gl::Error Context11::drawElements(const gl::Context *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices)
-{
- ANGLE_TRY(prepareForDrawCall(context, mode));
- return mRenderer->drawElements(context, mode, count, type, indices, 0);
-}
-
-gl::Error Context11::drawElementsInstanced(const gl::Context *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei instances)
-{
- ANGLE_TRY(prepareForDrawCall(context, mode));
- return mRenderer->drawElements(context, mode, count, type, indices, instances);
-}
-
-gl::Error Context11::drawRangeElements(const gl::Context *context,
- GLenum mode,
- GLuint start,
- GLuint end,
- GLsizei count,
- GLenum type,
- const void *indices)
-{
- ANGLE_TRY(prepareForDrawCall(context, mode));
- return mRenderer->drawElements(context, mode, count, type, indices, 0);
-}
-
-gl::Error Context11::drawArraysIndirect(const gl::Context *context,
- GLenum mode,
- const void *indirect)
-{
- ANGLE_TRY(prepareForDrawCall(context, mode));
- return mRenderer->drawArraysIndirect(context, mode, indirect);
-}
-
-gl::Error Context11::drawElementsIndirect(const gl::Context *context,
- GLenum mode,
- GLenum type,
- const void *indirect)
-{
- ANGLE_TRY(prepareForDrawCall(context, mode));
- return mRenderer->drawElementsIndirect(context, mode, type, indirect);
-}
-
-GLenum Context11::getResetStatus()
-{
- return mRenderer->getResetStatus();
-}
-
-std::string Context11::getVendorString() const
-{
- return mRenderer->getVendorString();
-}
-
-std::string Context11::getRendererDescription() const
-{
- return mRenderer->getRendererDescription();
-}
-
-void Context11::insertEventMarker(GLsizei length, const char *marker)
-{
- auto optionalString = angle::WidenString(static_cast<size_t>(length), marker);
- if (optionalString.valid())
- {
- mRenderer->getAnnotator()->setMarker(optionalString.value().data());
- }
-}
-
-void Context11::pushGroupMarker(GLsizei length, const char *marker)
-{
- auto optionalString = angle::WidenString(static_cast<size_t>(length), marker);
- if (optionalString.valid())
- {
- mRenderer->getAnnotator()->beginEvent(optionalString.value().data());
- }
-}
-
-void Context11::popGroupMarker()
-{
- mRenderer->getAnnotator()->endEvent();
-}
-
-void Context11::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const char *message)
-{
- // Fall through to the EXT_debug_marker functions
- pushGroupMarker(length, message);
-}
-
-void Context11::popDebugGroup()
-{
- // Fall through to the EXT_debug_marker functions
- popGroupMarker();
-}
-
-void Context11::syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits)
-{
- mRenderer->getStateManager()->syncState(context, dirtyBits);
-}
-
-GLint Context11::getGPUDisjoint()
-{
- return mRenderer->getGPUDisjoint();
-}
-
-GLint64 Context11::getTimestamp()
-{
- return mRenderer->getTimestamp();
-}
-
-void Context11::onMakeCurrent(const gl::Context *context)
-{
- ANGLE_SWALLOW_ERR(mRenderer->getStateManager()->onMakeCurrent(context));
-}
-
-const gl::Caps &Context11::getNativeCaps() const
-{
- return mRenderer->getNativeCaps();
-}
-
-const gl::TextureCapsMap &Context11::getNativeTextureCaps() const
-{
- return mRenderer->getNativeTextureCaps();
-}
-
-const gl::Extensions &Context11::getNativeExtensions() const
-{
- return mRenderer->getNativeExtensions();
-}
-
-const gl::Limitations &Context11::getNativeLimitations() const
-{
- return mRenderer->getNativeLimitations();
-}
-
-gl::Error Context11::dispatchCompute(const gl::Context *context,
- GLuint numGroupsX,
- GLuint numGroupsY,
- GLuint numGroupsZ)
-{
- return mRenderer->dispatchCompute(context, numGroupsX, numGroupsY, numGroupsZ);
-}
-
-gl::Error Context11::triggerDrawCallProgramRecompilation(const gl::Context *context,
- GLenum drawMode)
-{
- const auto &glState = context->getGLState();
- const auto *va11 = GetImplAs<VertexArray11>(glState.getVertexArray());
- const auto *drawFBO = glState.getDrawFramebuffer();
- gl::Program *program = glState.getProgram();
- ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
-
- programD3D->updateCachedInputLayout(va11->getCurrentStateSerial(), glState);
- programD3D->updateCachedOutputLayout(context, drawFBO);
-
- bool recompileVS = !programD3D->hasVertexExecutableForCachedInputLayout();
- bool recompileGS = !programD3D->hasGeometryExecutableForPrimitiveType(drawMode);
- bool recompilePS = !programD3D->hasPixelExecutableForCachedOutputLayout();
-
- if (!recompileVS && !recompileGS && !recompilePS)
- {
- return gl::NoError();
- }
-
- // Load the compiler if necessary and recompile the programs.
- ANGLE_TRY(mRenderer->ensureHLSLCompilerInitialized());
-
- gl::InfoLog infoLog;
-
- if (recompileVS)
- {
- ShaderExecutableD3D *vertexExe = nullptr;
- ANGLE_TRY(programD3D->getVertexExecutableForCachedInputLayout(&vertexExe, &infoLog));
- if (!programD3D->hasVertexExecutableForCachedInputLayout())
- {
- ASSERT(infoLog.getLength() > 0);
- ERR() << "Dynamic recompilation error log: " << infoLog.str();
- return gl::InternalError()
- << "Error compiling dynamic vertex executable:" << infoLog.str();
- }
- }
-
- if (recompileGS)
- {
- ShaderExecutableD3D *geometryExe = nullptr;
- ANGLE_TRY(programD3D->getGeometryExecutableForPrimitiveType(context, drawMode, &geometryExe,
- &infoLog));
- if (!programD3D->hasGeometryExecutableForPrimitiveType(drawMode))
- {
- ASSERT(infoLog.getLength() > 0);
- ERR() << "Dynamic recompilation error log: " << infoLog.str();
- return gl::InternalError()
- << "Error compiling dynamic geometry executable:" << infoLog.str();
- }
- }
-
- if (recompilePS)
- {
- ShaderExecutableD3D *pixelExe = nullptr;
- ANGLE_TRY(programD3D->getPixelExecutableForCachedOutputLayout(&pixelExe, &infoLog));
- if (!programD3D->hasPixelExecutableForCachedOutputLayout())
- {
- ASSERT(infoLog.getLength() > 0);
- ERR() << "Dynamic recompilation error log: " << infoLog.str();
- return gl::InternalError()
- << "Error compiling dynamic pixel executable:" << infoLog.str();
- }
- }
-
- // Refresh the program cache entry.
- if (mMemoryProgramCache)
- {
- mMemoryProgramCache->updateProgram(context, program);
- }
-
- return gl::NoError();
-}
-
-gl::Error Context11::prepareForDrawCall(const gl::Context *context, GLenum drawMode)
-{
- ANGLE_TRY(mRenderer->getStateManager()->updateState(context, drawMode));
- return gl::NoError();
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Context11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Context11.h
deleted file mode 100644
index dd99111b19..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Context11.h
+++ /dev/null
@@ -1,155 +0,0 @@
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context11:
-// D3D11-specific functionality associated with a GL Context.
-//
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_CONTEXT11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_CONTEXT11_H_
-
-#include "libANGLE/renderer/ContextImpl.h"
-
-namespace rx
-{
-class Renderer11;
-
-class Context11 : public ContextImpl
-{
- public:
- Context11(const gl::ContextState &state, Renderer11 *renderer);
- ~Context11() override;
-
- gl::Error initialize() override;
-
- // Shader creation
- CompilerImpl *createCompiler() override;
- ShaderImpl *createShader(const gl::ShaderState &data) override;
- ProgramImpl *createProgram(const gl::ProgramState &data) override;
-
- // Framebuffer creation
- FramebufferImpl *createFramebuffer(const gl::FramebufferState &data) override;
-
- // Texture creation
- TextureImpl *createTexture(const gl::TextureState &state) override;
-
- // Renderbuffer creation
- RenderbufferImpl *createRenderbuffer() override;
-
- // Buffer creation
- BufferImpl *createBuffer(const gl::BufferState &state) override;
-
- // Vertex Array creation
- VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override;
-
- // Query and Fence creation
- QueryImpl *createQuery(GLenum type) override;
- FenceNVImpl *createFenceNV() override;
- SyncImpl *createSync() override;
-
- // Transform Feedback creation
- TransformFeedbackImpl *createTransformFeedback(
- const gl::TransformFeedbackState &state) override;
-
- // Sampler object creation
- SamplerImpl *createSampler(const gl::SamplerState &state) override;
-
- // Program Pipeline object creation
- ProgramPipelineImpl *createProgramPipeline(const gl::ProgramPipelineState &data) override;
-
- // Path object creation.
- std::vector<PathImpl *> createPaths(GLsizei) override;
-
- // Flush and finish.
- gl::Error flush(const gl::Context *context) override;
- gl::Error finish(const gl::Context *context) override;
-
- // Drawing methods.
- gl::Error drawArrays(const gl::Context *context,
- GLenum mode,
- GLint first,
- GLsizei count) override;
- gl::Error drawArraysInstanced(const gl::Context *context,
- GLenum mode,
- GLint first,
- GLsizei count,
- GLsizei instanceCount) override;
-
- gl::Error drawElements(const gl::Context *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices) override;
- gl::Error drawElementsInstanced(const gl::Context *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei instances) override;
- gl::Error drawRangeElements(const gl::Context *context,
- GLenum mode,
- GLuint start,
- GLuint end,
- GLsizei count,
- GLenum type,
- const void *indices) override;
- gl::Error drawArraysIndirect(const gl::Context *context,
- GLenum mode,
- const void *indirect) override;
- gl::Error drawElementsIndirect(const gl::Context *context,
- GLenum mode,
- GLenum type,
- const void *indirect) override;
-
- // Device loss
- GLenum getResetStatus() override;
-
- // Vendor and description strings.
- std::string getVendorString() const override;
- std::string getRendererDescription() const override;
-
- // EXT_debug_marker
- void insertEventMarker(GLsizei length, const char *marker) override;
- void pushGroupMarker(GLsizei length, const char *marker) override;
- void popGroupMarker() override;
-
- // KHR_debug
- void pushDebugGroup(GLenum source, GLuint id, GLsizei length, const char *message) override;
- void popDebugGroup() override;
-
- // State sync with dirty bits.
- void syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits) override;
-
- // Disjoint timer queries
- GLint getGPUDisjoint() override;
- GLint64 getTimestamp() override;
-
- // Context switching
- void onMakeCurrent(const gl::Context *context) override;
-
- // Caps queries
- const gl::Caps &getNativeCaps() const override;
- const gl::TextureCapsMap &getNativeTextureCaps() const override;
- const gl::Extensions &getNativeExtensions() const override;
- const gl::Limitations &getNativeLimitations() const override;
-
- Renderer11 *getRenderer() const { return mRenderer; }
-
- gl::Error dispatchCompute(const gl::Context *context,
- GLuint numGroupsX,
- GLuint numGroupsY,
- GLuint numGroupsZ) override;
-
- gl::Error triggerDrawCallProgramRecompilation(const gl::Context *context, GLenum drawMode);
-
- private:
- gl::Error prepareForDrawCall(const gl::Context *context, GLenum drawMode);
-
- Renderer11 *mRenderer;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_CONTEXT11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp
deleted file mode 100644
index 1e70363e11..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-//
-// Copyright 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// DebugAnnotator11.cpp: D3D11 helpers for adding trace annotations.
-//
-
-#include "libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h"
-
-#include "common/debug.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.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);
-
-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
- FreeLibrary(mD3d11Module);
-#endif // !ANGLE_ENABLE_WINDOWS_STORE
- }
-}
-
-void DebugAnnotator11::beginEvent(const wchar_t *eventName)
-{
- initializeDevice();
-
- if (mUserDefinedAnnotation != nullptr)
- {
- mUserDefinedAnnotation->BeginEvent(eventName);
- }
-}
-
-void DebugAnnotator11::endEvent()
-{
- initializeDevice();
-
- if (mUserDefinedAnnotation != nullptr)
- {
- mUserDefinedAnnotation->EndEvent();
- }
-}
-
-void DebugAnnotator11::setMarker(const wchar_t *markerName)
-{
- initializeDevice();
-
- if (mUserDefinedAnnotation != nullptr)
- {
- mUserDefinedAnnotation->SetMarker(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
-}
-
-void DebugAnnotator11::initializeDevice()
-{
- if (!mInitialized)
- {
-#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);
- }
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h
deleted file mode 100644
index 62662c49ae..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h
+++ /dev/null
@@ -1,37 +0,0 @@
-//
-// Copyright 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// DebugAnnotator11.h: D3D11 helpers for adding trace annotations.
-//
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_DEBUGANNOTATOR11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_DEBUGANNOTATOR11_H_
-
-#include "libANGLE/LoggingAnnotator.h"
-
-namespace rx
-{
-
-class DebugAnnotator11 : public angle::LoggingAnnotator
-{
- public:
- DebugAnnotator11();
- ~DebugAnnotator11() override;
- void beginEvent(const wchar_t *eventName) override;
- void endEvent() override;
- void setMarker(const wchar_t *markerName) override;
- bool getStatus() override;
-
- private:
- void initializeDevice();
-
- bool mInitialized;
- HMODULE mD3d11Module;
- ID3DUserDefinedAnnotation *mUserDefinedAnnotation;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_DEBUGANNOTATOR11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.cpp
deleted file mode 100644
index 082f28d794..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.cpp
+++ /dev/null
@@ -1,240 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Fence11.cpp: Defines the rx::FenceNV11 and rx::Sync11 classes which implement
-// rx::FenceNVImpl and rx::SyncImpl.
-
-#include "libANGLE/renderer/d3d/d3d11/Fence11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-
-#include "common/utilities.h"
-
-namespace rx
-{
-
-static const int kDeviceLostCheckPeriod = 64;
-
-//
-// Template helpers for set and test operations.
-//
-
-template <class FenceClass>
-gl::Error FenceSetHelper(FenceClass *fence)
-{
- if (!fence->mQuery)
- {
- D3D11_QUERY_DESC queryDesc;
- queryDesc.Query = D3D11_QUERY_EVENT;
- queryDesc.MiscFlags = 0;
-
- HRESULT result = fence->mRenderer->getDevice()->CreateQuery(&queryDesc, &fence->mQuery);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to create event query, " << gl::FmtHR(result);
- }
- }
-
- fence->mRenderer->getDeviceContext()->End(fence->mQuery);
- return gl::NoError();
-}
-
-template <class FenceClass>
-gl::Error FenceTestHelper(FenceClass *fence, bool flushCommandBuffer, GLboolean *outFinished)
-{
- ASSERT(fence->mQuery);
-
- UINT getDataFlags = (flushCommandBuffer ? 0 : D3D11_ASYNC_GETDATA_DONOTFLUSH);
- HRESULT result =
- fence->mRenderer->getDeviceContext()->GetData(fence->mQuery, nullptr, 0, getDataFlags);
-
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to get query data, " << gl::FmtHR(result);
- }
-
- ASSERT(result == S_OK || result == S_FALSE);
- *outFinished = ((result == S_OK) ? GL_TRUE : GL_FALSE);
- return gl::NoError();
-}
-
-//
-// FenceNV11
-//
-
-FenceNV11::FenceNV11(Renderer11 *renderer) : FenceNVImpl(), mRenderer(renderer), mQuery(nullptr)
-{
-}
-
-FenceNV11::~FenceNV11()
-{
- SafeRelease(mQuery);
-}
-
-gl::Error FenceNV11::set(GLenum condition)
-{
- return FenceSetHelper(this);
-}
-
-gl::Error FenceNV11::test(GLboolean *outFinished)
-{
- return FenceTestHelper(this, true, outFinished);
-}
-
-gl::Error FenceNV11::finish()
-{
- GLboolean finished = GL_FALSE;
-
- int loopCount = 0;
- while (finished != GL_TRUE)
- {
- loopCount++;
- ANGLE_TRY(FenceTestHelper(this, true, &finished));
-
- if (loopCount % kDeviceLostCheckPeriod == 0 && mRenderer->testDeviceLost())
- {
- return gl::OutOfMemory() << "Device was lost while querying result of an event query.";
- }
-
- ScheduleYield();
- }
-
- return gl::NoError();
-}
-
-//
-// Sync11
-//
-
-// Important note on accurate timers in Windows:
-//
-// QueryPerformanceCounter has a few major issues, including being 10x as expensive to call
-// as timeGetTime on laptops and "jumping" during certain hardware events.
-//
-// See the comments at the top of the Chromium source file "chromium/src/base/time/time_win.cc"
-// https://code.google.com/p/chromium/codesearch#chromium/src/base/time/time_win.cc
-//
-// We still opt to use QPC. In the present and moving forward, most newer systems will not suffer
-// from buggy implementations.
-
-Sync11::Sync11(Renderer11 *renderer) : SyncImpl(), mRenderer(renderer), mQuery(nullptr)
-{
- LARGE_INTEGER counterFreqency = {};
- BOOL success = QueryPerformanceFrequency(&counterFreqency);
- ASSERT(success);
-
- mCounterFrequency = counterFreqency.QuadPart;
-}
-
-Sync11::~Sync11()
-{
- SafeRelease(mQuery);
-}
-
-gl::Error Sync11::set(GLenum condition, GLbitfield flags)
-{
- ASSERT(condition == GL_SYNC_GPU_COMMANDS_COMPLETE && flags == 0);
- return FenceSetHelper(this);
-}
-
-gl::Error Sync11::clientWait(GLbitfield flags, GLuint64 timeout, GLenum *outResult)
-{
- ASSERT(outResult);
-
- bool flushCommandBuffer = ((flags & GL_SYNC_FLUSH_COMMANDS_BIT) != 0);
-
- GLboolean result = GL_FALSE;
- gl::Error error = FenceTestHelper(this, flushCommandBuffer, &result);
- if (error.isError())
- {
- *outResult = GL_WAIT_FAILED;
- return error;
- }
-
- if (result == GL_TRUE)
- {
- *outResult = GL_ALREADY_SIGNALED;
- return gl::NoError();
- }
-
- if (timeout == 0)
- {
- *outResult = GL_TIMEOUT_EXPIRED;
- return gl::NoError();
- }
-
- LARGE_INTEGER currentCounter = {};
- BOOL success = QueryPerformanceCounter(&currentCounter);
- ASSERT(success);
-
- LONGLONG timeoutInSeconds = static_cast<LONGLONG>(timeout / 1000000000ull);
- LONGLONG endCounter = currentCounter.QuadPart + mCounterFrequency * timeoutInSeconds;
-
- // Extremely unlikely, but if mCounterFrequency is large enough, endCounter can wrap
- if (endCounter < currentCounter.QuadPart)
- {
- endCounter = MAXLONGLONG;
- }
-
- int loopCount = 0;
- while (currentCounter.QuadPart < endCounter && !result)
- {
- loopCount++;
- ScheduleYield();
- success = QueryPerformanceCounter(&currentCounter);
- ASSERT(success);
-
- error = FenceTestHelper(this, flushCommandBuffer, &result);
- if (error.isError())
- {
- *outResult = GL_WAIT_FAILED;
- return error;
- }
-
- if ((loopCount % kDeviceLostCheckPeriod) == 0 && mRenderer->testDeviceLost())
- {
- *outResult = GL_WAIT_FAILED;
- return gl::OutOfMemory() << "Device was lost while querying result of an event query.";
- }
- }
-
- if (currentCounter.QuadPart >= endCounter)
- {
- *outResult = GL_TIMEOUT_EXPIRED;
- }
- else
- {
- *outResult = GL_CONDITION_SATISFIED;
- }
-
- return gl::NoError();
-}
-
-gl::Error Sync11::serverWait(GLbitfield flags, GLuint64 timeout)
-{
- // Because our API is currently designed to be called from a single thread, we don't need to do
- // extra work for a server-side fence. GPU commands issued after the fence is created will
- // always be processed after the fence is signaled.
- return gl::NoError();
-}
-
-gl::Error Sync11::getStatus(GLint *outResult)
-{
- GLboolean result = GL_FALSE;
- gl::Error error = FenceTestHelper(this, false, &result);
- if (error.isError())
- {
- // The spec does not specify any way to report errors during the status test (e.g. device
- // lost) so we report the fence is unblocked in case of error or signaled.
- *outResult = GL_SIGNALED;
-
- return error;
- }
-
- *outResult = (result ? GL_SIGNALED : GL_UNSIGNALED);
- return gl::NoError();
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.h
deleted file mode 100644
index 4168df5365..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Fence11.h: Defines the rx::FenceNV11 and rx::Sync11 classes which implement rx::FenceNVImpl
-// and rx::SyncImpl.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_FENCE11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_FENCE11_H_
-
-#include "libANGLE/renderer/FenceNVImpl.h"
-#include "libANGLE/renderer/SyncImpl.h"
-
-namespace rx
-{
-class Renderer11;
-
-class FenceNV11 : public FenceNVImpl
-{
- public:
- explicit FenceNV11(Renderer11 *renderer);
- ~FenceNV11() override;
-
- gl::Error set(GLenum condition) override;
- gl::Error test(GLboolean *outFinished) override;
- gl::Error finish() override;
-
- private:
- template<class T> friend gl::Error FenceSetHelper(T *fence);
- template<class T> friend gl::Error FenceTestHelper(T *fence, bool flushCommandBuffer, GLboolean *outFinished);
-
- Renderer11 *mRenderer;
- ID3D11Query *mQuery;
-};
-
-class Sync11 : public SyncImpl
-{
- public:
- explicit Sync11(Renderer11 *renderer);
- ~Sync11() override;
-
- gl::Error set(GLenum condition, GLbitfield flags) override;
- gl::Error clientWait(GLbitfield flags, GLuint64 timeout, GLenum *outResult) override;
- gl::Error serverWait(GLbitfield flags, GLuint64 timeout) override;
- gl::Error getStatus(GLint *outResult) override;
-
- private:
- template<class T> friend gl::Error FenceSetHelper(T *fence);
- template<class T> friend gl::Error FenceTestHelper(T *fence, bool flushCommandBuffer, GLboolean *outFinished);
-
- Renderer11 *mRenderer;
- ID3D11Query *mQuery;
- LONGLONG mCounterFrequency;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_FENCE11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp
deleted file mode 100644
index 02326d7b50..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp
+++ /dev/null
@@ -1,507 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Framebuffer11.cpp: Implements the Framebuffer11 class.
-
-#include "libANGLE/renderer/d3d/d3d11/Framebuffer11.h"
-
-#include "common/bitset_utils.h"
-#include "common/debug.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/renderer/d3d/TextureD3D.h"
-#include "libANGLE/renderer/d3d/d3d11/Buffer11.h"
-#include "libANGLE/renderer/d3d/d3d11/Clear11.h"
-#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/TextureStorage11.h"
-#include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-
-using namespace angle;
-
-namespace rx
-{
-
-namespace
-{
-gl::Error MarkAttachmentsDirty(const gl::Context *context,
- const gl::FramebufferAttachment *attachment)
-{
- if (attachment->type() == GL_TEXTURE)
- {
- gl::Texture *texture = attachment->getTexture();
-
- TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture);
-
- TextureStorage *texStorage = nullptr;
- ANGLE_TRY(textureD3D->getNativeTexture(context, &texStorage));
-
- if (texStorage)
- {
- TextureStorage11 *texStorage11 = GetAs<TextureStorage11>(texStorage);
- ASSERT(texStorage11);
-
- texStorage11->markLevelDirty(attachment->mipLevel());
- }
- }
-
- return gl::NoError();
-}
-
-void UpdateCachedRenderTarget(const gl::Context *context,
- const gl::FramebufferAttachment *attachment,
- RenderTarget11 *&cachedRenderTarget,
- OnRenderTargetDirtyBinding *channelBinding)
-{
- RenderTarget11 *newRenderTarget = nullptr;
- if (attachment)
- {
- // TODO(jmadill): Don't swallow this error.
- gl::Error error = attachment->getRenderTarget(context, &newRenderTarget);
- if (error.isError())
- {
- ERR() << "Internal rendertarget error: " << error;
- }
- }
- if (newRenderTarget != cachedRenderTarget)
- {
- OnRenderTargetDirtyChannel *channel =
- (newRenderTarget ? newRenderTarget->getBroadcastChannel() : nullptr);
- channelBinding->bind(channel);
- cachedRenderTarget = newRenderTarget;
- }
-}
-} // anonymous namespace
-
-Framebuffer11::Framebuffer11(const gl::FramebufferState &data, Renderer11 *renderer)
- : FramebufferD3D(data, renderer),
- mRenderer(renderer),
- mCachedDepthStencilRenderTarget(nullptr),
- mDepthStencilRenderTargetDirty(this, gl::IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS)
-{
- ASSERT(mRenderer != nullptr);
- mCachedColorRenderTargets.fill(nullptr);
- for (size_t colorIndex = 0; colorIndex < data.getColorAttachments().size(); ++colorIndex)
- {
- mColorRenderTargetsDirty.emplace_back(this, colorIndex);
- }
-}
-
-Framebuffer11::~Framebuffer11()
-{
-}
-
-gl::Error Framebuffer11::markAttachmentsDirty(const gl::Context *context) const
-{
- const auto &colorAttachments = mState.getColorAttachments();
- for (size_t drawBuffer : mState.getEnabledDrawBuffers())
- {
- const gl::FramebufferAttachment &colorAttachment = colorAttachments[drawBuffer];
- ASSERT(colorAttachment.isAttached());
- ANGLE_TRY(MarkAttachmentsDirty(context, &colorAttachment));
- }
-
- const gl::FramebufferAttachment *dsAttachment = mState.getDepthOrStencilAttachment();
- if (dsAttachment)
- {
- ANGLE_TRY(MarkAttachmentsDirty(context, dsAttachment));
- }
-
- return gl::NoError();
-}
-
-gl::Error Framebuffer11::clearImpl(const gl::Context *context, const ClearParameters &clearParams)
-{
- Clear11 *clearer = mRenderer->getClearer();
-
- const gl::FramebufferAttachment *colorAttachment = mState.getFirstColorAttachment();
- if (clearParams.scissorEnabled == true && colorAttachment != nullptr &&
- UsePresentPathFast(mRenderer, colorAttachment))
- {
- // If the current framebuffer is using the default colorbuffer, and present path fast is
- // active, and the scissor rect is enabled, then we should invert the scissor rect
- // vertically
- ClearParameters presentPathFastClearParams = clearParams;
- gl::Extents framebufferSize = colorAttachment->getSize();
- presentPathFastClearParams.scissor.y = framebufferSize.height -
- presentPathFastClearParams.scissor.y -
- presentPathFastClearParams.scissor.height;
- ANGLE_TRY(clearer->clearFramebuffer(context, presentPathFastClearParams, mState));
- }
- else
- {
- ANGLE_TRY(clearer->clearFramebuffer(context, clearParams, mState));
- }
-
- ANGLE_TRY(markAttachmentsDirty(context));
-
- return gl::NoError();
-}
-
-gl::Error Framebuffer11::invalidate(const gl::Context *context,
- size_t count,
- const GLenum *attachments)
-{
- return invalidateBase(context, count, attachments, false);
-}
-
-gl::Error Framebuffer11::discard(const gl::Context *context,
- size_t count,
- const GLenum *attachments)
-{
- return invalidateBase(context, count, attachments, true);
-}
-
-gl::Error Framebuffer11::invalidateBase(const gl::Context *context,
- size_t count,
- const GLenum *attachments,
- bool useEXTBehavior) const
-{
- ID3D11DeviceContext1 *deviceContext1 = mRenderer->getDeviceContext1IfSupported();
-
- if (!deviceContext1)
- {
- // DiscardView() is only supported on ID3D11DeviceContext1
- return gl::NoError();
- }
-
- bool foundDepth = false;
- bool foundStencil = false;
-
- for (size_t i = 0; i < count; ++i)
- {
- switch (attachments[i])
- {
- // Handle depth and stencil attachments. Defer discarding until later.
- case GL_DEPTH_STENCIL_ATTACHMENT:
- foundDepth = true;
- foundStencil = true;
- break;
- case GL_DEPTH_EXT:
- case GL_DEPTH_ATTACHMENT:
- foundDepth = true;
- break;
- case GL_STENCIL_EXT:
- case GL_STENCIL_ATTACHMENT:
- foundStencil = true;
- break;
- default:
- {
- // Handle color attachments
- ASSERT((attachments[i] >= GL_COLOR_ATTACHMENT0 && attachments[i] <= GL_COLOR_ATTACHMENT15) ||
- (attachments[i] == GL_COLOR));
-
- size_t colorIndex =
- (attachments[i] == GL_COLOR ? 0u : (attachments[i] - GL_COLOR_ATTACHMENT0));
- const gl::FramebufferAttachment *colorAttachment =
- mState.getColorAttachment(colorIndex);
- if (colorAttachment)
- {
- ANGLE_TRY(invalidateAttachment(context, colorAttachment));
- }
- break;
- }
- }
- }
-
- bool discardDepth = false;
- bool discardStencil = false;
-
- // The D3D11 renderer uses the same view for depth and stencil buffers, so we must be careful.
- if (useEXTBehavior)
- {
- // In the extension, if the app discards only one of the depth and stencil attachments, but
- // those are backed by the same packed_depth_stencil buffer, then both images become undefined.
- discardDepth = foundDepth;
-
- // Don't bother discarding the stencil buffer if the depth buffer will already do it
- discardStencil = foundStencil && (!discardDepth || mState.getDepthAttachment() == nullptr);
- }
- else
- {
- // In ES 3.0.4, if a specified attachment has base internal format DEPTH_STENCIL but the
- // attachments list does not include DEPTH_STENCIL_ATTACHMENT or both DEPTH_ATTACHMENT and
- // STENCIL_ATTACHMENT, then only the specified portion of every pixel in the subregion of pixels
- // of the DEPTH_STENCIL buffer may be invalidated, and the other portion must be preserved.
- discardDepth = (foundDepth && foundStencil) ||
- (foundDepth && (mState.getStencilAttachment() == nullptr));
- discardStencil = (foundStencil && (mState.getDepthAttachment() == nullptr));
- }
-
- if (discardDepth && mState.getDepthAttachment())
- {
- ANGLE_TRY(invalidateAttachment(context, mState.getDepthAttachment()));
- }
-
- if (discardStencil && mState.getStencilAttachment())
- {
- ANGLE_TRY(invalidateAttachment(context, mState.getStencilAttachment()));
- }
-
- return gl::NoError();
-}
-
-gl::Error Framebuffer11::invalidateSub(const gl::Context *context,
- size_t,
- const GLenum *,
- const gl::Rectangle &)
-{
- // A no-op implementation conforms to the spec, so don't call UNIMPLEMENTED()
- return gl::NoError();
-}
-
-gl::Error Framebuffer11::invalidateAttachment(const gl::Context *context,
- const gl::FramebufferAttachment *attachment) const
-{
- ID3D11DeviceContext1 *deviceContext1 = mRenderer->getDeviceContext1IfSupported();
- ASSERT(deviceContext1);
- ASSERT(attachment && attachment->isAttached());
-
- RenderTarget11 *renderTarget = nullptr;
- ANGLE_TRY(attachment->getRenderTarget(context, &renderTarget));
- const auto &rtv = renderTarget->getRenderTargetView();
-
- if (rtv.valid())
- {
- deviceContext1->DiscardView(rtv.get());
- }
-
- return gl::NoError();
-}
-
-gl::Error Framebuffer11::readPixelsImpl(const gl::Context *context,
- const gl::Rectangle &area,
- GLenum format,
- GLenum type,
- size_t outputPitch,
- const gl::PixelPackState &pack,
- uint8_t *pixels)
-{
- const gl::FramebufferAttachment *readAttachment = mState.getReadAttachment();
- ASSERT(readAttachment);
-
- gl::Buffer *packBuffer = context->getGLState().getTargetBuffer(gl::BufferBinding::PixelPack);
- if (packBuffer != nullptr)
- {
- Buffer11 *packBufferStorage = GetImplAs<Buffer11>(packBuffer);
- PackPixelsParams packParams(area, format, type, static_cast<GLuint>(outputPitch), pack,
- packBuffer, reinterpret_cast<ptrdiff_t>(pixels));
-
- return packBufferStorage->packPixels(context, *readAttachment, packParams);
- }
-
- return mRenderer->readFromAttachment(context, *readAttachment, area, format, type,
- static_cast<GLuint>(outputPitch), pack, pixels);
-}
-
-gl::Error Framebuffer11::blitImpl(const gl::Context *context,
- const gl::Rectangle &sourceArea,
- const gl::Rectangle &destArea,
- const gl::Rectangle *scissor,
- bool blitRenderTarget,
- bool blitDepth,
- bool blitStencil,
- GLenum filter,
- const gl::Framebuffer *sourceFramebuffer)
-{
- if (blitRenderTarget)
- {
- const gl::FramebufferAttachment *readBuffer = sourceFramebuffer->getReadColorbuffer();
- ASSERT(readBuffer);
-
- RenderTargetD3D *readRenderTarget = nullptr;
- ANGLE_TRY(readBuffer->getRenderTarget(context, &readRenderTarget));
- ASSERT(readRenderTarget);
-
- const auto &colorAttachments = mState.getColorAttachments();
- const auto &drawBufferStates = mState.getDrawBufferStates();
-
- for (size_t colorAttachment = 0; colorAttachment < colorAttachments.size(); colorAttachment++)
- {
- const gl::FramebufferAttachment &drawBuffer = colorAttachments[colorAttachment];
-
- if (drawBuffer.isAttached() &&
- drawBufferStates[colorAttachment] != GL_NONE)
- {
- RenderTargetD3D *drawRenderTarget = nullptr;
- ANGLE_TRY(drawBuffer.getRenderTarget(context, &drawRenderTarget));
- ASSERT(drawRenderTarget);
-
- const bool invertColorSource = UsePresentPathFast(mRenderer, readBuffer);
- gl::Rectangle actualSourceArea = sourceArea;
- if (invertColorSource)
- {
- RenderTarget11 *readRenderTarget11 = GetAs<RenderTarget11>(readRenderTarget);
- actualSourceArea.y = readRenderTarget11->getHeight() - sourceArea.y;
- actualSourceArea.height = -sourceArea.height;
- }
-
- const bool invertColorDest = UsePresentPathFast(mRenderer, &drawBuffer);
- gl::Rectangle actualDestArea = destArea;
- if (invertColorDest)
- {
- RenderTarget11 *drawRenderTarget11 = GetAs<RenderTarget11>(drawRenderTarget);
- actualDestArea.y = drawRenderTarget11->getHeight() - destArea.y;
- actualDestArea.height = -destArea.height;
- }
-
- ANGLE_TRY(mRenderer->blitRenderbufferRect(
- context, actualSourceArea, actualDestArea, readRenderTarget, drawRenderTarget,
- filter, scissor, blitRenderTarget, false, false));
- }
- }
- }
-
- if (blitDepth || blitStencil)
- {
- const gl::FramebufferAttachment *readBuffer = sourceFramebuffer->getDepthOrStencilbuffer();
- ASSERT(readBuffer);
-
- RenderTargetD3D *readRenderTarget = nullptr;
- ANGLE_TRY(readBuffer->getRenderTarget(context, &readRenderTarget));
- ASSERT(readRenderTarget);
-
- const gl::FramebufferAttachment *drawBuffer = mState.getDepthOrStencilAttachment();
- ASSERT(drawBuffer);
-
- RenderTargetD3D *drawRenderTarget = nullptr;
- ANGLE_TRY(drawBuffer->getRenderTarget(context, &drawRenderTarget));
- ASSERT(drawRenderTarget);
-
- ANGLE_TRY(mRenderer->blitRenderbufferRect(context, sourceArea, destArea, readRenderTarget,
- drawRenderTarget, filter, scissor, false,
- blitDepth, blitStencil));
- }
-
- ANGLE_TRY(markAttachmentsDirty(context));
- return gl::NoError();
-}
-
-GLenum Framebuffer11::getRenderTargetImplementationFormat(RenderTargetD3D *renderTarget) const
-{
- RenderTarget11 *renderTarget11 = GetAs<RenderTarget11>(renderTarget);
- return renderTarget11->getFormatSet().format().fboImplementationInternalFormat;
-}
-
-void Framebuffer11::updateColorRenderTarget(const gl::Context *context, size_t colorIndex)
-{
- UpdateCachedRenderTarget(context, mState.getColorAttachment(colorIndex),
- mCachedColorRenderTargets[colorIndex],
- &mColorRenderTargetsDirty[colorIndex]);
-}
-
-void Framebuffer11::updateDepthStencilRenderTarget(const gl::Context *context)
-{
- UpdateCachedRenderTarget(context, mState.getDepthOrStencilAttachment(),
- mCachedDepthStencilRenderTarget, &mDepthStencilRenderTargetDirty);
-}
-
-void Framebuffer11::syncState(const gl::Context *context,
- const gl::Framebuffer::DirtyBits &dirtyBits)
-{
- const auto &mergedDirtyBits = dirtyBits | mInternalDirtyBits;
- mInternalDirtyBits.reset();
-
- for (auto dirtyBit : mergedDirtyBits)
- {
- switch (dirtyBit)
- {
- case gl::Framebuffer::DIRTY_BIT_DEPTH_ATTACHMENT:
- case gl::Framebuffer::DIRTY_BIT_STENCIL_ATTACHMENT:
- updateDepthStencilRenderTarget(context);
- break;
- case gl::Framebuffer::DIRTY_BIT_DRAW_BUFFERS:
- case gl::Framebuffer::DIRTY_BIT_READ_BUFFER:
- break;
- case gl::Framebuffer::DIRTY_BIT_DEFAULT_WIDTH:
- case gl::Framebuffer::DIRTY_BIT_DEFAULT_HEIGHT:
- case gl::Framebuffer::DIRTY_BIT_DEFAULT_SAMPLES:
- case gl::Framebuffer::DIRTY_BIT_DEFAULT_FIXED_SAMPLE_LOCATIONS:
- break;
- default:
- {
- ASSERT(gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0 == 0 &&
- dirtyBit < gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_MAX);
- size_t colorIndex =
- static_cast<size_t>(dirtyBit - gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0);
- updateColorRenderTarget(context, colorIndex);
- break;
- }
- }
- }
-
- // We should not have dirtied any additional state during our sync.
- ASSERT(!mInternalDirtyBits.any());
-
- FramebufferD3D::syncState(context, dirtyBits);
-
- // Call this last to allow the state manager to take advantage of the cached render targets.
- mRenderer->getStateManager()->invalidateRenderTarget();
-
- // Call this to syncViewport for framebuffer default parameters.
- if (mState.getDefaultWidth() != 0 || mState.getDefaultHeight() != 0)
- {
- mRenderer->getStateManager()->invalidateViewport(context);
- }
-}
-
-void Framebuffer11::signal(size_t channelID, const gl::Context *context)
-{
- if (channelID == gl::IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS)
- {
- // Stencil is redundant in this case.
- mInternalDirtyBits.set(gl::Framebuffer::DIRTY_BIT_DEPTH_ATTACHMENT);
- mCachedDepthStencilRenderTarget = nullptr;
- }
- else
- {
- mInternalDirtyBits.set(gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0 + channelID);
- mCachedColorRenderTargets[channelID] = nullptr;
- }
-
- // Notify the context we need to re-validate the RenderTarget.
- // TODO(jmadill): Check that we're the active draw framebuffer.
- mRenderer->getStateManager()->invalidateRenderTarget();
-}
-
-gl::Error Framebuffer11::getSamplePosition(size_t index, GLfloat *xy) const
-{
- const gl::FramebufferAttachment *attachment = mState.getFirstNonNullAttachment();
- ASSERT(attachment);
- GLsizei sampleCount = attachment->getSamples();
-
- d3d11_gl::GetSamplePosition(sampleCount, index, xy);
- return gl::NoError();
-}
-
-bool Framebuffer11::hasAnyInternalDirtyBit() const
-{
- return mInternalDirtyBits.any();
-}
-
-void Framebuffer11::syncInternalState(const gl::Context *context)
-{
- syncState(context, gl::Framebuffer::DirtyBits());
-}
-
-RenderTarget11 *Framebuffer11::getFirstRenderTarget() const
-{
- ASSERT(mInternalDirtyBits.none());
- for (auto *renderTarget : mCachedColorRenderTargets)
- {
- if (renderTarget)
- {
- return renderTarget;
- }
- }
-
- return mCachedDepthStencilRenderTarget;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h
deleted file mode 100644
index afdda299b9..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h
+++ /dev/null
@@ -1,104 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Framebuffer11.h: Defines the Framebuffer11 class.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_FRAMBUFFER11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_FRAMBUFFER11_H_
-
-#include "libANGLE/renderer/d3d/FramebufferD3D.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-#include "libANGLE/signal_utils.h"
-
-namespace rx
-{
-class Renderer11;
-
-class Framebuffer11 : public FramebufferD3D, public OnRenderTargetDirtyReceiver
-{
- public:
- Framebuffer11(const gl::FramebufferState &data, Renderer11 *renderer);
- ~Framebuffer11() override;
-
- gl::Error discard(const gl::Context *context, size_t count, const GLenum *attachments) override;
- gl::Error invalidate(const gl::Context *context,
- size_t count,
- const GLenum *attachments) override;
- gl::Error invalidateSub(const gl::Context *context,
- size_t count,
- const GLenum *attachments,
- const gl::Rectangle &area) override;
-
- // Invalidate the cached swizzles of all bound texture attachments.
- gl::Error markAttachmentsDirty(const gl::Context *context) const;
-
- void syncState(const gl::Context *context,
- const gl::Framebuffer::DirtyBits &dirtyBits) override;
-
- const RenderTargetArray &getCachedColorRenderTargets() const
- {
- return mCachedColorRenderTargets;
- }
- const RenderTarget11 *getCachedDepthStencilRenderTarget() const
- {
- return mCachedDepthStencilRenderTarget;
- }
-
- RenderTarget11 *getFirstRenderTarget() const;
-
- bool hasAnyInternalDirtyBit() const;
- void syncInternalState(const gl::Context *context);
-
- void signal(size_t channelID, const gl::Context *context) override;
-
- gl::Error getSamplePosition(size_t index, GLfloat *xy) const override;
-
- private:
- gl::Error clearImpl(const gl::Context *context, const ClearParameters &clearParams) override;
-
- gl::Error readPixelsImpl(const gl::Context *context,
- const gl::Rectangle &area,
- GLenum format,
- GLenum type,
- size_t outputPitch,
- const gl::PixelPackState &pack,
- uint8_t *pixels) override;
-
- gl::Error blitImpl(const gl::Context *context,
- const gl::Rectangle &sourceArea,
- const gl::Rectangle &destArea,
- const gl::Rectangle *scissor,
- bool blitRenderTarget,
- bool blitDepth,
- bool blitStencil,
- GLenum filter,
- const gl::Framebuffer *sourceFramebuffer) override;
-
- gl::Error invalidateBase(const gl::Context *context,
- size_t count,
- const GLenum *attachments,
- bool useEXTBehavior) const;
- gl::Error invalidateAttachment(const gl::Context *context,
- const gl::FramebufferAttachment *attachment) const;
-
- GLenum getRenderTargetImplementationFormat(RenderTargetD3D *renderTarget) const override;
-
- void updateColorRenderTarget(const gl::Context *context, size_t colorIndex);
- void updateDepthStencilRenderTarget(const gl::Context *context);
-
- Renderer11 *const mRenderer;
- RenderTargetArray mCachedColorRenderTargets;
- RenderTarget11 *mCachedDepthStencilRenderTarget;
-
- std::vector<OnRenderTargetDirtyBinding> mColorRenderTargetsDirty;
- OnRenderTargetDirtyBinding mDepthStencilRenderTargetDirty;
-
- gl::Framebuffer::DirtyBits mInternalDirtyBits;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_FRAMBUFFER11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Image11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Image11.cpp
deleted file mode 100644
index bd921f1935..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Image11.cpp
+++ /dev/null
@@ -1,657 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Image11.h: Implements the rx::Image11 class, which acts as the interface to
-// the actual underlying resources of a Texture
-
-#include "libANGLE/renderer/d3d/d3d11/Image11.h"
-
-#include "common/utilities.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h"
-#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h"
-#include "libANGLE/renderer/d3d/d3d11/TextureStorage11.h"
-
-namespace rx
-{
-
-Image11::Image11(Renderer11 *renderer)
- : mRenderer(renderer),
- mDXGIFormat(DXGI_FORMAT_UNKNOWN),
- mStagingTexture(),
- mStagingSubresource(0),
- mRecoverFromStorage(false),
- mAssociatedStorage(nullptr),
- mAssociatedImageIndex(gl::ImageIndex::MakeInvalid()),
- mRecoveredFromStorageCount(0)
-{
-}
-
-Image11::~Image11()
-{
- disassociateStorage();
- releaseStagingTexture();
-}
-
-// static
-gl::Error Image11::GenerateMipmap(const gl::Context *context,
- Image11 *dest,
- Image11 *src,
- const Renderer11DeviceCaps &rendererCaps)
-{
- ASSERT(src->getDXGIFormat() == dest->getDXGIFormat());
- ASSERT(src->getWidth() == 1 || src->getWidth() / 2 == dest->getWidth());
- ASSERT(src->getHeight() == 1 || src->getHeight() / 2 == dest->getHeight());
-
- D3D11_MAPPED_SUBRESOURCE destMapped;
- ANGLE_TRY(dest->map(context, D3D11_MAP_WRITE, &destMapped));
-
- D3D11_MAPPED_SUBRESOURCE srcMapped;
- gl::Error error = src->map(context, D3D11_MAP_READ, &srcMapped);
- if (error.isError())
- {
- dest->unmap();
- return error;
- }
-
- const uint8_t *sourceData = reinterpret_cast<const uint8_t *>(srcMapped.pData);
- uint8_t *destData = reinterpret_cast<uint8_t *>(destMapped.pData);
-
- auto mipGenerationFunction =
- d3d11::Format::Get(src->getInternalFormat(), rendererCaps).format().mipGenerationFunction;
- mipGenerationFunction(src->getWidth(), src->getHeight(), src->getDepth(), sourceData,
- srcMapped.RowPitch, srcMapped.DepthPitch, destData, destMapped.RowPitch,
- destMapped.DepthPitch);
-
- dest->unmap();
- src->unmap();
-
- dest->markDirty();
-
- return gl::NoError();
-}
-
-// static
-gl::Error Image11::CopyImage(const gl::Context *context,
- Image11 *dest,
- Image11 *source,
- const gl::Rectangle &sourceRect,
- const gl::Offset &destOffset,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- const Renderer11DeviceCaps &rendererCaps)
-{
- D3D11_MAPPED_SUBRESOURCE destMapped;
- ANGLE_TRY(dest->map(context, D3D11_MAP_WRITE, &destMapped));
-
- D3D11_MAPPED_SUBRESOURCE srcMapped;
- gl::Error error = source->map(context, D3D11_MAP_READ, &srcMapped);
- if (error.isError())
- {
- dest->unmap();
- return error;
- }
-
- const auto &sourceFormat =
- d3d11::Format::Get(source->getInternalFormat(), rendererCaps).format();
- GLuint sourcePixelBytes =
- gl::GetSizedInternalFormatInfo(sourceFormat.fboImplementationInternalFormat).pixelBytes;
-
- GLenum destUnsizedFormat = gl::GetUnsizedFormat(dest->getInternalFormat());
- const auto &destFormat = d3d11::Format::Get(dest->getInternalFormat(), rendererCaps).format();
- const auto &destFormatInfo =
- gl::GetSizedInternalFormatInfo(destFormat.fboImplementationInternalFormat);
- GLuint destPixelBytes = destFormatInfo.pixelBytes;
-
- const uint8_t *sourceData = reinterpret_cast<const uint8_t *>(srcMapped.pData) +
- sourceRect.x * sourcePixelBytes + sourceRect.y * srcMapped.RowPitch;
- uint8_t *destData = reinterpret_cast<uint8_t *>(destMapped.pData) +
- destOffset.x * destPixelBytes + destOffset.y * destMapped.RowPitch;
-
- CopyImageCHROMIUM(sourceData, srcMapped.RowPitch, sourcePixelBytes,
- sourceFormat.colorReadFunction, destData, destMapped.RowPitch, destPixelBytes,
- destFormat.colorWriteFunction, destUnsizedFormat,
- destFormatInfo.componentType, sourceRect.width, sourceRect.height,
- unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha);
-
- dest->unmap();
- source->unmap();
-
- dest->markDirty();
-
- return gl::NoError();
-}
-
-bool Image11::isDirty() const
-{
- // If mDirty is true AND mStagingTexture doesn't exist AND mStagingTexture doesn't need to be
- // recovered from TextureStorage AND the texture doesn't require init data (i.e. a blank new
- // texture will suffice) AND robust resource initialization is not enabled then isDirty should
- // still return false.
- if (mDirty && !mStagingTexture.valid() && !mRecoverFromStorage)
- {
- const Renderer11DeviceCaps &deviceCaps = mRenderer->getRenderer11DeviceCaps();
- const auto &formatInfo = d3d11::Format::Get(mInternalFormat, deviceCaps);
- if (formatInfo.dataInitializerFunction == nullptr)
- {
- return false;
- }
- }
-
- return mDirty;
-}
-
-gl::Error Image11::copyToStorage(const gl::Context *context,
- TextureStorage *storage,
- const gl::ImageIndex &index,
- const gl::Box &region)
-{
- TextureStorage11 *storage11 = GetAs<TextureStorage11>(storage);
-
- // If an app's behavior results in an Image11 copying its data to/from to a TextureStorage
- // multiple times, then we should just keep the staging texture around to prevent the copying
- // from impacting perf. We allow the Image11 to copy its data to/from TextureStorage once. This
- // accounts for an app making a late call to glGenerateMipmap.
- bool attemptToReleaseStagingTexture = (mRecoveredFromStorageCount < 2);
-
- if (attemptToReleaseStagingTexture)
- {
- // If another image is relying on this Storage for its data, then we must let it recover its
- // data before we overwrite it.
- ANGLE_TRY(storage11->releaseAssociatedImage(context, index, this));
- }
-
- const TextureHelper11 *stagingTexture = nullptr;
- unsigned int stagingSubresourceIndex = 0;
- ANGLE_TRY(getStagingTexture(&stagingTexture, &stagingSubresourceIndex));
- ANGLE_TRY(storage11->updateSubresourceLevel(context, *stagingTexture, stagingSubresourceIndex,
- index, region));
-
- // Once the image data has been copied into the Storage, we can release it locally.
- if (attemptToReleaseStagingTexture)
- {
- storage11->associateImage(this, index);
- releaseStagingTexture();
- mRecoverFromStorage = true;
- mAssociatedStorage = storage11;
- mAssociatedImageIndex = index;
- }
-
- return gl::NoError();
-}
-
-void Image11::verifyAssociatedStorageValid(TextureStorage11 *textureStorage) const
-{
- ASSERT(mAssociatedStorage == textureStorage);
-}
-
-gl::Error Image11::recoverFromAssociatedStorage(const gl::Context *context)
-{
- if (mRecoverFromStorage)
- {
- ANGLE_TRY(createStagingTexture());
-
- mAssociatedStorage->verifyAssociatedImageValid(mAssociatedImageIndex, this);
-
- // CopySubResource from the Storage to the Staging texture
- gl::Box region(0, 0, 0, mWidth, mHeight, mDepth);
- ANGLE_TRY(mAssociatedStorage->copySubresourceLevel(
- context, mStagingTexture, mStagingSubresource, mAssociatedImageIndex, region));
- mRecoveredFromStorageCount += 1;
-
- // Reset all the recovery parameters, even if the texture storage association is broken.
- disassociateStorage();
- }
-
- return gl::NoError();
-}
-
-void Image11::disassociateStorage()
-{
- if (mRecoverFromStorage)
- {
- // Make the texturestorage release the Image11 too
- mAssociatedStorage->disassociateImage(mAssociatedImageIndex, this);
-
- mRecoverFromStorage = false;
- mAssociatedStorage = nullptr;
- mAssociatedImageIndex = gl::ImageIndex::MakeInvalid();
- }
-}
-
-bool Image11::redefine(GLenum target,
- GLenum internalformat,
- const gl::Extents &size,
- bool forceRelease)
-{
- if (mWidth != size.width || mHeight != size.height || mInternalFormat != internalformat ||
- forceRelease)
- {
- // End the association with the TextureStorage, since that data will be out of date.
- // Also reset mRecoveredFromStorageCount since this Image is getting completely redefined.
- disassociateStorage();
- mRecoveredFromStorageCount = 0;
-
- mWidth = size.width;
- mHeight = size.height;
- mDepth = size.depth;
- mInternalFormat = internalformat;
- mTarget = target;
-
- // compute the d3d format that will be used
- const d3d11::Format &formatInfo =
- d3d11::Format::Get(internalformat, mRenderer->getRenderer11DeviceCaps());
- mDXGIFormat = formatInfo.texFormat;
- mRenderable = (formatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN);
-
- releaseStagingTexture();
- mDirty = (formatInfo.dataInitializerFunction != nullptr);
-
- return true;
- }
-
- return false;
-}
-
-DXGI_FORMAT Image11::getDXGIFormat() const
-{
- // this should only happen if the image hasn't been redefined first
- // which would be a bug by the caller
- ASSERT(mDXGIFormat != DXGI_FORMAT_UNKNOWN);
-
- return mDXGIFormat;
-}
-
-// Store the pixel rectangle designated by xoffset,yoffset,width,height with pixels stored as
-// format/type at input
-// into the target pixel rectangle.
-gl::Error Image11::loadData(const gl::Context *context,
- const gl::Box &area,
- const gl::PixelUnpackState &unpack,
- GLenum type,
- const void *input,
- bool applySkipImages)
-{
- const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(mInternalFormat);
- GLuint inputRowPitch = 0;
- ANGLE_TRY_RESULT(
- formatInfo.computeRowPitch(type, area.width, unpack.alignment, unpack.rowLength),
- inputRowPitch);
- GLuint inputDepthPitch = 0;
- ANGLE_TRY_RESULT(formatInfo.computeDepthPitch(area.height, unpack.imageHeight, inputRowPitch),
- inputDepthPitch);
- GLuint inputSkipBytes = 0;
- ANGLE_TRY_RESULT(
- formatInfo.computeSkipBytes(inputRowPitch, inputDepthPitch, unpack, applySkipImages),
- inputSkipBytes);
-
- const d3d11::DXGIFormatSize &dxgiFormatInfo = d3d11::GetDXGIFormatSizeInfo(mDXGIFormat);
- GLuint outputPixelSize = dxgiFormatInfo.pixelBytes;
-
- const d3d11::Format &d3dFormatInfo =
- d3d11::Format::Get(mInternalFormat, mRenderer->getRenderer11DeviceCaps());
- LoadImageFunction loadFunction = d3dFormatInfo.getLoadFunctions()(type).loadFunction;
-
- D3D11_MAPPED_SUBRESOURCE mappedImage;
- ANGLE_TRY(map(context, D3D11_MAP_WRITE, &mappedImage));
-
- uint8_t *offsetMappedData = (reinterpret_cast<uint8_t *>(mappedImage.pData) +
- (area.y * mappedImage.RowPitch + area.x * outputPixelSize +
- area.z * mappedImage.DepthPitch));
- loadFunction(area.width, area.height, area.depth,
- reinterpret_cast<const uint8_t *>(input) + inputSkipBytes, inputRowPitch,
- inputDepthPitch, offsetMappedData, mappedImage.RowPitch, mappedImage.DepthPitch);
-
- unmap();
-
- return gl::NoError();
-}
-
-gl::Error Image11::loadCompressedData(const gl::Context *context,
- const gl::Box &area,
- const void *input)
-{
- const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(mInternalFormat);
- GLsizei inputRowPitch = 0;
- ANGLE_TRY_RESULT(formatInfo.computeRowPitch(GL_UNSIGNED_BYTE, area.width, 1, 0), inputRowPitch);
- GLsizei inputDepthPitch = 0;
- ANGLE_TRY_RESULT(formatInfo.computeDepthPitch(area.height, 0, inputRowPitch), inputDepthPitch);
-
- const d3d11::DXGIFormatSize &dxgiFormatInfo = d3d11::GetDXGIFormatSizeInfo(mDXGIFormat);
- GLuint outputPixelSize = dxgiFormatInfo.pixelBytes;
- GLuint outputBlockWidth = dxgiFormatInfo.blockWidth;
- GLuint outputBlockHeight = dxgiFormatInfo.blockHeight;
-
- ASSERT(area.x % outputBlockWidth == 0);
- ASSERT(area.y % outputBlockHeight == 0);
-
- const d3d11::Format &d3dFormatInfo =
- d3d11::Format::Get(mInternalFormat, mRenderer->getRenderer11DeviceCaps());
- LoadImageFunction loadFunction =
- d3dFormatInfo.getLoadFunctions()(GL_UNSIGNED_BYTE).loadFunction;
-
- D3D11_MAPPED_SUBRESOURCE mappedImage;
- ANGLE_TRY(map(context, D3D11_MAP_WRITE, &mappedImage));
-
- uint8_t *offsetMappedData =
- reinterpret_cast<uint8_t *>(mappedImage.pData) +
- ((area.y / outputBlockHeight) * mappedImage.RowPitch +
- (area.x / outputBlockWidth) * outputPixelSize + area.z * mappedImage.DepthPitch);
-
- loadFunction(area.width, area.height, area.depth, reinterpret_cast<const uint8_t *>(input),
- inputRowPitch, inputDepthPitch, offsetMappedData, mappedImage.RowPitch,
- mappedImage.DepthPitch);
-
- unmap();
-
- return gl::NoError();
-}
-
-gl::Error Image11::copyFromTexStorage(const gl::Context *context,
- const gl::ImageIndex &imageIndex,
- TextureStorage *source)
-{
- TextureStorage11 *storage11 = GetAs<TextureStorage11>(source);
-
- const TextureHelper11 *textureHelper = nullptr;
- ANGLE_TRY(storage11->getResource(context, &textureHelper));
-
- UINT subresourceIndex = storage11->getSubresourceIndex(imageIndex);
-
- gl::Box sourceBox(0, 0, 0, mWidth, mHeight, mDepth);
- return copyWithoutConversion(gl::Offset(), sourceBox, *textureHelper, subresourceIndex);
-}
-
-gl::Error Image11::copyFromFramebuffer(const gl::Context *context,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- const gl::Framebuffer *sourceFBO)
-{
- const gl::FramebufferAttachment *srcAttachment = sourceFBO->getReadColorbuffer();
- ASSERT(srcAttachment);
-
- GLenum sourceInternalFormat = srcAttachment->getFormat().info->sizedInternalFormat;
- const auto &d3d11Format =
- d3d11::Format::Get(sourceInternalFormat, mRenderer->getRenderer11DeviceCaps());
-
- if (d3d11Format.texFormat == mDXGIFormat && sourceInternalFormat == mInternalFormat)
- {
- RenderTarget11 *rt11 = nullptr;
- ANGLE_TRY(srcAttachment->getRenderTarget(context, &rt11));
- ASSERT(rt11->getTexture().get());
-
- TextureHelper11 textureHelper = rt11->getTexture();
- unsigned int sourceSubResource = rt11->getSubresourceIndex();
-
- gl::Box sourceBox(sourceArea.x, sourceArea.y, 0, sourceArea.width, sourceArea.height, 1);
- return copyWithoutConversion(destOffset, sourceBox, textureHelper, sourceSubResource);
- }
-
- // This format requires conversion, so we must copy the texture to staging and manually convert
- // via readPixels
- D3D11_MAPPED_SUBRESOURCE mappedImage;
- ANGLE_TRY(map(context, D3D11_MAP_WRITE, &mappedImage));
-
- // determine the offset coordinate into the destination buffer
- const auto &dxgiFormatInfo = d3d11::GetDXGIFormatSizeInfo(mDXGIFormat);
- GLsizei rowOffset = dxgiFormatInfo.pixelBytes * destOffset.x;
-
- uint8_t *dataOffset = static_cast<uint8_t *>(mappedImage.pData) +
- mappedImage.RowPitch * destOffset.y + rowOffset +
- destOffset.z * mappedImage.DepthPitch;
-
- const gl::InternalFormat &destFormatInfo = gl::GetSizedInternalFormatInfo(mInternalFormat);
- const auto &destD3D11Format =
- d3d11::Format::Get(mInternalFormat, mRenderer->getRenderer11DeviceCaps());
-
- auto loadFunction = destD3D11Format.getLoadFunctions()(destFormatInfo.type);
- gl::Error error = gl::NoError();
- if (loadFunction.requiresConversion)
- {
- size_t bufferSize = destFormatInfo.pixelBytes * sourceArea.width * sourceArea.height;
- angle::MemoryBuffer *memoryBuffer = nullptr;
- error = mRenderer->getScratchMemoryBuffer(bufferSize, &memoryBuffer);
-
- if (!error.isError())
- {
- GLuint memoryBufferRowPitch = destFormatInfo.pixelBytes * sourceArea.width;
-
- error = mRenderer->readFromAttachment(
- context, *srcAttachment, sourceArea, destFormatInfo.format, destFormatInfo.type,
- memoryBufferRowPitch, gl::PixelPackState(), memoryBuffer->data());
-
- loadFunction.loadFunction(sourceArea.width, sourceArea.height, 1, memoryBuffer->data(),
- memoryBufferRowPitch, 0, dataOffset, mappedImage.RowPitch,
- mappedImage.DepthPitch);
- }
- }
- else
- {
- error = mRenderer->readFromAttachment(
- context, *srcAttachment, sourceArea, destFormatInfo.format, destFormatInfo.type,
- mappedImage.RowPitch, gl::PixelPackState(), dataOffset);
- }
-
- unmap();
- mDirty = true;
-
- return error;
-}
-
-gl::Error Image11::copyWithoutConversion(const gl::Offset &destOffset,
- const gl::Box &sourceArea,
- const TextureHelper11 &textureHelper,
- UINT sourceSubResource)
-{
- // No conversion needed-- use copyback fastpath
- const TextureHelper11 *stagingTexture = nullptr;
- unsigned int stagingSubresourceIndex = 0;
- ANGLE_TRY(getStagingTexture(&stagingTexture, &stagingSubresourceIndex));
-
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- const gl::Extents &extents = textureHelper.getExtents();
-
- D3D11_BOX srcBox;
- srcBox.left = sourceArea.x;
- srcBox.right = sourceArea.x + sourceArea.width;
- srcBox.top = sourceArea.y;
- srcBox.bottom = sourceArea.y + sourceArea.height;
- srcBox.front = sourceArea.z;
- srcBox.back = sourceArea.z + sourceArea.depth;
-
- if (textureHelper.is2D() && textureHelper.getSampleCount() > 1)
- {
- D3D11_TEXTURE2D_DESC resolveDesc;
- resolveDesc.Width = extents.width;
- resolveDesc.Height = extents.height;
- resolveDesc.MipLevels = 1;
- resolveDesc.ArraySize = 1;
- resolveDesc.Format = textureHelper.getFormat();
- resolveDesc.SampleDesc.Count = 1;
- resolveDesc.SampleDesc.Quality = 0;
- resolveDesc.Usage = D3D11_USAGE_DEFAULT;
- resolveDesc.BindFlags = 0;
- resolveDesc.CPUAccessFlags = 0;
- resolveDesc.MiscFlags = 0;
-
- d3d11::Texture2D resolveTex;
- ANGLE_TRY(mRenderer->allocateResource(resolveDesc, &resolveTex));
-
- deviceContext->ResolveSubresource(resolveTex.get(), 0, textureHelper.get(),
- sourceSubResource, textureHelper.getFormat());
-
- deviceContext->CopySubresourceRegion(stagingTexture->get(), stagingSubresourceIndex,
- destOffset.x, destOffset.y, destOffset.z,
- resolveTex.get(), 0, &srcBox);
- }
- else
- {
- deviceContext->CopySubresourceRegion(stagingTexture->get(), stagingSubresourceIndex,
- destOffset.x, destOffset.y, destOffset.z,
- textureHelper.get(), sourceSubResource, &srcBox);
- }
-
- mDirty = true;
- return gl::NoError();
-}
-
-gl::Error Image11::getStagingTexture(const TextureHelper11 **outStagingTexture,
- unsigned int *outSubresourceIndex)
-{
- ANGLE_TRY(createStagingTexture());
-
- *outStagingTexture = &mStagingTexture;
- *outSubresourceIndex = mStagingSubresource;
- return gl::NoError();
-}
-
-void Image11::releaseStagingTexture()
-{
- mStagingTexture.reset();
-}
-
-gl::Error Image11::createStagingTexture()
-{
- if (mStagingTexture.valid())
- {
- return gl::NoError();
- }
-
- ASSERT(mWidth > 0 && mHeight > 0 && mDepth > 0);
-
- const DXGI_FORMAT dxgiFormat = getDXGIFormat();
- const auto &formatInfo =
- d3d11::Format::Get(mInternalFormat, mRenderer->getRenderer11DeviceCaps());
-
- int lodOffset = 1;
- GLsizei width = mWidth;
- GLsizei height = mHeight;
-
- // adjust size if needed for compressed textures
- d3d11::MakeValidSize(false, dxgiFormat, &width, &height, &lodOffset);
-
- if (mTarget == GL_TEXTURE_3D)
- {
- D3D11_TEXTURE3D_DESC desc;
- desc.Width = width;
- desc.Height = height;
- desc.Depth = mDepth;
- desc.MipLevels = lodOffset + 1;
- desc.Format = dxgiFormat;
- desc.Usage = D3D11_USAGE_STAGING;
- desc.BindFlags = 0;
- desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
- desc.MiscFlags = 0;
-
- if (formatInfo.dataInitializerFunction != nullptr)
- {
- std::vector<D3D11_SUBRESOURCE_DATA> initialData;
- std::vector<std::vector<BYTE>> textureData;
- d3d11::GenerateInitialTextureData(mInternalFormat, mRenderer->getRenderer11DeviceCaps(),
- width, height, mDepth, lodOffset + 1, &initialData,
- &textureData);
-
- ANGLE_TRY(
- mRenderer->allocateTexture(desc, formatInfo, initialData.data(), &mStagingTexture));
- }
- else
- {
- ANGLE_TRY(mRenderer->allocateTexture(desc, formatInfo, &mStagingTexture));
- }
-
- mStagingTexture.setDebugName("Image11::StagingTexture3D");
- mStagingSubresource = D3D11CalcSubresource(lodOffset, 0, lodOffset + 1);
- }
- else if (mTarget == GL_TEXTURE_2D || mTarget == GL_TEXTURE_2D_ARRAY ||
- mTarget == GL_TEXTURE_CUBE_MAP)
- {
- D3D11_TEXTURE2D_DESC desc;
- desc.Width = width;
- desc.Height = height;
- desc.MipLevels = lodOffset + 1;
- desc.ArraySize = 1;
- desc.Format = dxgiFormat;
- desc.SampleDesc.Count = 1;
- desc.SampleDesc.Quality = 0;
- desc.Usage = D3D11_USAGE_STAGING;
- desc.BindFlags = 0;
- desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
- desc.MiscFlags = 0;
-
- if (formatInfo.dataInitializerFunction != nullptr)
- {
- std::vector<D3D11_SUBRESOURCE_DATA> initialData;
- std::vector<std::vector<BYTE>> textureData;
- d3d11::GenerateInitialTextureData(mInternalFormat, mRenderer->getRenderer11DeviceCaps(),
- width, height, 1, lodOffset + 1, &initialData,
- &textureData);
-
- ANGLE_TRY(
- mRenderer->allocateTexture(desc, formatInfo, initialData.data(), &mStagingTexture));
- }
- else
- {
- ANGLE_TRY(mRenderer->allocateTexture(desc, formatInfo, &mStagingTexture));
- }
-
- mStagingTexture.setDebugName("Image11::StagingTexture2D");
- mStagingSubresource = D3D11CalcSubresource(lodOffset, 0, lodOffset + 1);
- }
- else
- {
- UNREACHABLE();
- }
-
- mDirty = false;
- return gl::NoError();
-}
-
-gl::Error Image11::map(const gl::Context *context, D3D11_MAP mapType, D3D11_MAPPED_SUBRESOURCE *map)
-{
- // We must recover from the TextureStorage if necessary, even for D3D11_MAP_WRITE.
- ANGLE_TRY(recoverFromAssociatedStorage(context));
-
- const TextureHelper11 *stagingTexture = nullptr;
- unsigned int subresourceIndex = 0;
- ANGLE_TRY(getStagingTexture(&stagingTexture, &subresourceIndex));
-
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- ASSERT(stagingTexture && stagingTexture->valid());
- HRESULT result = deviceContext->Map(stagingTexture->get(), subresourceIndex, mapType, 0, map);
-
- if (FAILED(result))
- {
- // this can fail if the device is removed (from TDR)
- if (d3d11::isDeviceLostError(result))
- {
- mRenderer->notifyDeviceLost();
- }
- return gl::OutOfMemory() << "Failed to map staging texture, " << gl::FmtHR(result);
- }
-
- mDirty = true;
-
- return gl::NoError();
-}
-
-void Image11::unmap()
-{
- if (mStagingTexture.valid())
- {
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- deviceContext->Unmap(mStagingTexture.get(), mStagingSubresource);
- }
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Image11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Image11.h
deleted file mode 100644
index 584d231b37..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Image11.h
+++ /dev/null
@@ -1,112 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Image11.h: Defines the rx::Image11 class, which acts as the interface to
-// the actual underlying resources of a Texture
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_IMAGE11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_IMAGE11_H_
-
-#include "common/debug.h"
-#include "libANGLE/ImageIndex.h"
-#include "libANGLE/renderer/d3d/ImageD3D.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-
-namespace gl
-{
-class Framebuffer;
-}
-
-namespace rx
-{
-class Renderer11;
-class TextureHelper11;
-class TextureStorage11;
-struct Renderer11DeviceCaps;
-
-class Image11 : public ImageD3D
-{
- public:
- Image11(Renderer11 *renderer);
- ~Image11() override;
-
- static gl::Error GenerateMipmap(const gl::Context *context,
- Image11 *dest,
- Image11 *src,
- const Renderer11DeviceCaps &rendererCaps);
- static gl::Error CopyImage(const gl::Context *context,
- Image11 *dest,
- Image11 *source,
- const gl::Rectangle &sourceRect,
- const gl::Offset &destOffset,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha,
- const Renderer11DeviceCaps &rendererCaps);
-
- bool isDirty() const override;
-
- gl::Error copyToStorage(const gl::Context *context,
- TextureStorage *storage,
- const gl::ImageIndex &index,
- const gl::Box &region) override;
-
- bool redefine(GLenum target, GLenum internalformat, const gl::Extents &size, bool forceRelease) override;
-
- DXGI_FORMAT getDXGIFormat() const;
-
- gl::Error loadData(const gl::Context *context,
- const gl::Box &area,
- const gl::PixelUnpackState &unpack,
- GLenum type,
- const void *input,
- bool applySkipImages) override;
- gl::Error loadCompressedData(const gl::Context *context,
- const gl::Box &area,
- const void *input) override;
-
- gl::Error copyFromTexStorage(const gl::Context *context,
- const gl::ImageIndex &imageIndex,
- TextureStorage *source) override;
- gl::Error copyFromFramebuffer(const gl::Context *context,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- const gl::Framebuffer *source) override;
-
- gl::Error recoverFromAssociatedStorage(const gl::Context *context);
- void verifyAssociatedStorageValid(TextureStorage11 *textureStorage) const;
- void disassociateStorage();
-
- protected:
- gl::Error map(const gl::Context *context, D3D11_MAP mapType, D3D11_MAPPED_SUBRESOURCE *map);
- void unmap();
-
- private:
- gl::Error copyWithoutConversion(const gl::Offset &destOffset,
- const gl::Box &sourceArea,
- const TextureHelper11 &textureHelper,
- UINT sourceSubResource);
-
- gl::Error getStagingTexture(const TextureHelper11 **outStagingTexture,
- unsigned int *outSubresourceIndex);
- gl::Error createStagingTexture();
- void releaseStagingTexture();
-
- Renderer11 *mRenderer;
-
- DXGI_FORMAT mDXGIFormat;
- TextureHelper11 mStagingTexture;
- unsigned int mStagingSubresource;
-
- bool mRecoverFromStorage;
- TextureStorage11 *mAssociatedStorage;
- gl::ImageIndex mAssociatedImageIndex;
- unsigned int mRecoveredFromStorageCount;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_IMAGE11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp
deleted file mode 100644
index a79fb71f71..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp
+++ /dev/null
@@ -1,159 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// IndexBuffer11.cpp: Defines the D3D11 IndexBuffer implementation.
-
-#include "libANGLE/renderer/d3d/d3d11/IndexBuffer11.h"
-
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-
-namespace rx
-{
-
-IndexBuffer11::IndexBuffer11(Renderer11 *const renderer)
- : mRenderer(renderer), mBuffer(), mBufferSize(0), mIndexType(GL_NONE), mDynamicUsage(false)
-{
-}
-
-IndexBuffer11::~IndexBuffer11()
-{
-}
-
-gl::Error IndexBuffer11::initialize(unsigned int bufferSize, GLenum indexType, bool dynamic)
-{
- mBuffer.reset();
-
- updateSerial();
-
- if (bufferSize > 0)
- {
- D3D11_BUFFER_DESC bufferDesc;
- bufferDesc.ByteWidth = bufferSize;
- bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
- bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
- bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- bufferDesc.MiscFlags = 0;
- bufferDesc.StructureByteStride = 0;
-
- ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &mBuffer));
-
- if (dynamic)
- {
- mBuffer.setDebugName("IndexBuffer11 (dynamic)");
- }
- else
- {
- mBuffer.setDebugName("IndexBuffer11 (static)");
- }
- }
-
- mBufferSize = bufferSize;
- mIndexType = indexType;
- mDynamicUsage = dynamic;
-
- return gl::NoError();
-}
-
-gl::Error IndexBuffer11::mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory)
-{
- if (!mBuffer.valid())
- {
- return gl::OutOfMemory() << "Internal index buffer is not initialized.";
- }
-
- // Check for integer overflows and out-out-bounds map requests
- if (offset + size < offset || offset + size > mBufferSize)
- {
- return gl::OutOfMemory() << "Index buffer map range is not inside the buffer.";
- }
-
- ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
-
- D3D11_MAPPED_SUBRESOURCE mappedResource;
- HRESULT result =
- dxContext->Map(mBuffer.get(), 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedResource);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to map internal index buffer, " << gl::FmtHR(result);
- }
-
- *outMappedMemory = reinterpret_cast<char*>(mappedResource.pData) + offset;
- return gl::NoError();
-}
-
-gl::Error IndexBuffer11::unmapBuffer()
-{
- if (!mBuffer.valid())
- {
- return gl::OutOfMemory() << "Internal index buffer is not initialized.";
- }
-
- ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
- dxContext->Unmap(mBuffer.get(), 0);
- return gl::NoError();
-}
-
-GLenum IndexBuffer11::getIndexType() const
-{
- return mIndexType;
-}
-
-unsigned int IndexBuffer11::getBufferSize() const
-{
- return mBufferSize;
-}
-
-gl::Error IndexBuffer11::setSize(unsigned int bufferSize, GLenum indexType)
-{
- if (bufferSize > mBufferSize || indexType != mIndexType)
- {
- return initialize(bufferSize, indexType, mDynamicUsage);
- }
- else
- {
- return gl::NoError();
- }
-}
-
-gl::Error IndexBuffer11::discard()
-{
- if (!mBuffer.valid())
- {
- return gl::OutOfMemory() << "Internal index buffer is not initialized.";
- }
-
- ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
-
- D3D11_MAPPED_SUBRESOURCE mappedResource;
- HRESULT result = dxContext->Map(mBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to map internal index buffer, " << gl::FmtHR(result);
- }
-
- dxContext->Unmap(mBuffer.get(), 0);
-
- return gl::NoError();
-}
-
-DXGI_FORMAT IndexBuffer11::getIndexFormat() const
-{
- switch (mIndexType)
- {
- case GL_UNSIGNED_BYTE: return DXGI_FORMAT_R16_UINT;
- case GL_UNSIGNED_SHORT: return DXGI_FORMAT_R16_UINT;
- case GL_UNSIGNED_INT: return DXGI_FORMAT_R32_UINT;
- default: UNREACHABLE(); return DXGI_FORMAT_UNKNOWN;
- }
-}
-
-const d3d11::Buffer &IndexBuffer11::getBuffer() const
-{
- return mBuffer;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.h
deleted file mode 100644
index 7b5d744c02..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.h
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// IndexBuffer11.h: Defines the D3D11 IndexBuffer implementation.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_INDEXBUFFER11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_INDEXBUFFER11_H_
-
-#include "libANGLE/renderer/d3d/IndexBuffer.h"
-#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
-
-namespace rx
-{
-class Renderer11;
-
-class IndexBuffer11 : public IndexBuffer
-{
- public:
- explicit IndexBuffer11(Renderer11 *const renderer);
- ~IndexBuffer11() override;
-
- gl::Error initialize(unsigned int bufferSize, GLenum indexType, bool dynamic) override;
-
- gl::Error mapBuffer(unsigned int offset, unsigned int size, void **outMappedMemory) override;
- gl::Error unmapBuffer() override;
-
- GLenum getIndexType() const override;
- unsigned int getBufferSize() const override;
- gl::Error setSize(unsigned int bufferSize, GLenum indexType) override;
-
- gl::Error discard() override;
-
- DXGI_FORMAT getIndexFormat() const;
- const d3d11::Buffer &getBuffer() const;
-
- private:
- Renderer11 *const mRenderer;
-
- d3d11::Buffer mBuffer;
- unsigned int mBufferSize;
- GLenum mIndexType;
- bool mDynamicUsage;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_INDEXBUFFER11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp
deleted file mode 100644
index a238f97b08..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp
+++ /dev/null
@@ -1,503 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// InputLayoutCache.cpp: Defines InputLayoutCache, a class that builds and caches
-// D3D11 input layouts.
-
-#include "libANGLE/renderer/d3d/d3d11/InputLayoutCache.h"
-
-#include "common/bitset_utils.h"
-#include "common/utilities.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/VertexArray.h"
-#include "libANGLE/VertexAttribute.h"
-#include "libANGLE/renderer/d3d/IndexDataManager.h"
-#include "libANGLE/renderer/d3d/ProgramD3D.h"
-#include "libANGLE/renderer/d3d/VertexDataManager.h"
-#include "libANGLE/renderer/d3d/d3d11/Buffer11.h"
-#include "libANGLE/renderer/d3d/d3d11/Context11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h"
-#include "libANGLE/renderer/d3d/d3d11/VertexArray11.h"
-#include "libANGLE/renderer/d3d/d3d11/VertexBuffer11.h"
-#include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
-
-namespace rx
-{
-
-namespace
-{
-
-size_t GetReservedBufferCount(bool usesPointSpriteEmulation)
-{
- return usesPointSpriteEmulation ? 1 : 0;
-}
-
-GLenum GetGLSLAttributeType(const std::vector<sh::Attribute> &shaderAttributes, size_t index)
-{
- // Count matrices differently
- for (const sh::Attribute &attrib : shaderAttributes)
- {
- if (attrib.location == -1)
- {
- continue;
- }
-
- GLenum transposedType = gl::TransposeMatrixType(attrib.type);
- int rows = gl::VariableRowCount(transposedType);
- int intIndex = static_cast<int>(index);
-
- if (intIndex >= attrib.location && intIndex < attrib.location + rows)
- {
- return transposedType;
- }
- }
-
- UNREACHABLE();
- return GL_NONE;
-}
-
-struct PackedAttribute
-{
- uint8_t attribType;
- uint8_t semanticIndex;
- uint8_t vertexFormatType;
- uint8_t divisor;
-};
-
-} // anonymous namespace
-
-PackedAttributeLayout::PackedAttributeLayout() : numAttributes(0), flags(0), attributeData({})
-{
-}
-
-PackedAttributeLayout::PackedAttributeLayout(const PackedAttributeLayout &other) = default;
-
-void PackedAttributeLayout::addAttributeData(GLenum glType,
- UINT semanticIndex,
- gl::VertexFormatType vertexFormatType,
- unsigned int divisor)
-{
- gl::AttributeType attribType = gl::GetAttributeType(glType);
-
- PackedAttribute packedAttrib;
- packedAttrib.attribType = static_cast<uint8_t>(attribType);
- packedAttrib.semanticIndex = static_cast<uint8_t>(semanticIndex);
- packedAttrib.vertexFormatType = static_cast<uint8_t>(vertexFormatType);
- packedAttrib.divisor = static_cast<uint8_t>(divisor);
-
- ASSERT(static_cast<gl::AttributeType>(packedAttrib.attribType) == attribType);
- ASSERT(static_cast<UINT>(packedAttrib.semanticIndex) == semanticIndex);
- ASSERT(static_cast<gl::VertexFormatType>(packedAttrib.vertexFormatType) == vertexFormatType);
- ASSERT(static_cast<unsigned int>(packedAttrib.divisor) == divisor);
-
- static_assert(sizeof(uint32_t) == sizeof(PackedAttribute), "PackedAttributes must be 32-bits exactly.");
-
- attributeData[numAttributes++] = gl::bitCast<uint32_t>(packedAttrib);
-}
-
-bool PackedAttributeLayout::operator==(const PackedAttributeLayout &other) const
-{
- return (numAttributes == other.numAttributes) && (flags == other.flags) &&
- (attributeData == other.attributeData);
-}
-
-InputLayoutCache::InputLayoutCache()
- : mLayoutCache(kDefaultCacheSize * 2), mPointSpriteVertexBuffer(), mPointSpriteIndexBuffer()
-{
-}
-
-InputLayoutCache::~InputLayoutCache()
-{
-}
-
-void InputLayoutCache::clear()
-{
- mLayoutCache.Clear();
- mPointSpriteVertexBuffer.reset();
- mPointSpriteIndexBuffer.reset();
-}
-
-gl::Error InputLayoutCache::applyVertexBuffers(
- const gl::Context *context,
- const std::vector<const TranslatedAttribute *> &currentAttributes,
- GLenum mode,
- GLint start,
- bool isIndexedRendering)
-{
- Renderer11 *renderer = GetImplAs<Context11>(context)->getRenderer();
- const gl::State &state = context->getGLState();
- auto *stateManager = renderer->getStateManager();
- gl::Program *program = state.getProgram();
- ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
-
- bool programUsesInstancedPointSprites = programD3D->usesPointSize() && programD3D->usesInstancedPointSpriteEmulation();
- bool instancedPointSpritesActive = programUsesInstancedPointSprites && (mode == GL_POINTS);
-
- // Note that if we use instance emulation, we reserve the first buffer slot.
- size_t reservedBuffers = GetReservedBufferCount(programUsesInstancedPointSprites);
-
- for (size_t attribIndex = 0; attribIndex < (gl::MAX_VERTEX_ATTRIBS - reservedBuffers);
- ++attribIndex)
- {
- ID3D11Buffer *buffer = nullptr;
- UINT vertexStride = 0;
- UINT vertexOffset = 0;
-
- if (attribIndex < currentAttributes.size())
- {
- const auto &attrib = *currentAttributes[attribIndex];
- Buffer11 *bufferStorage = attrib.storage ? GetAs<Buffer11>(attrib.storage) : nullptr;
-
- // If indexed pointsprite emulation is active, then we need to take a less efficent code path.
- // Emulated indexed pointsprite rendering requires that the vertex buffers match exactly to
- // the indices passed by the caller. This could expand or shrink the vertex buffer depending
- // on the number of points indicated by the index list or how many duplicates are found on the index list.
- if (bufferStorage == nullptr)
- {
- ASSERT(attrib.vertexBuffer.get());
- buffer = GetAs<VertexBuffer11>(attrib.vertexBuffer.get())->getBuffer().get();
- }
- else if (instancedPointSpritesActive && isIndexedRendering)
- {
- VertexArray11 *vao11 = GetImplAs<VertexArray11>(state.getVertexArray());
- ASSERT(vao11->isCachedIndexInfoValid());
- TranslatedIndexData *indexInfo = vao11->getCachedIndexInfo();
- if (indexInfo->srcIndexData.srcBuffer != nullptr)
- {
- const uint8_t *bufferData = nullptr;
- ANGLE_TRY(indexInfo->srcIndexData.srcBuffer->getData(context, &bufferData));
- ASSERT(bufferData != nullptr);
-
- ptrdiff_t offset =
- reinterpret_cast<ptrdiff_t>(indexInfo->srcIndexData.srcIndices);
- indexInfo->srcIndexData.srcBuffer = nullptr;
- indexInfo->srcIndexData.srcIndices = bufferData + offset;
- }
-
- ANGLE_TRY_RESULT(bufferStorage->getEmulatedIndexedBuffer(
- context, &indexInfo->srcIndexData, attrib, start),
- buffer);
- }
- else
- {
- ANGLE_TRY_RESULT(
- bufferStorage->getBuffer(context, BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK),
- buffer);
- }
-
- vertexStride = attrib.stride;
- ANGLE_TRY_RESULT(attrib.computeOffset(start), vertexOffset);
- }
-
- size_t bufferIndex = reservedBuffers + attribIndex;
-
- stateManager->queueVertexBufferChange(bufferIndex, buffer, vertexStride, vertexOffset);
- }
-
- // Instanced PointSprite emulation requires two additional ID3D11Buffers. A vertex buffer needs
- // to be created and added to the list of current buffers, strides and offsets collections.
- // This buffer contains the vertices for a single PointSprite quad.
- // An index buffer also needs to be created and applied because rendering instanced data on
- // D3D11 FL9_3 requires DrawIndexedInstanced() to be used. Shaders that contain gl_PointSize and
- // used without the GL_POINTS rendering mode require a vertex buffer because some drivers cannot
- // handle missing vertex data and will TDR the system.
- if (programUsesInstancedPointSprites)
- {
- const UINT pointSpriteVertexStride = sizeof(float) * 5;
-
- if (!mPointSpriteVertexBuffer.valid())
- {
- static const float pointSpriteVertices[] =
- {
- // Position // TexCoord
- -1.0f, -1.0f, 0.0f, 0.0f, 1.0f,
- -1.0f, 1.0f, 0.0f, 0.0f, 0.0f,
- 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
- 1.0f, -1.0f, 0.0f, 1.0f, 1.0f,
- -1.0f, -1.0f, 0.0f, 0.0f, 1.0f,
- 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
- };
-
- D3D11_SUBRESOURCE_DATA vertexBufferData = { pointSpriteVertices, 0, 0 };
- D3D11_BUFFER_DESC vertexBufferDesc;
- vertexBufferDesc.ByteWidth = sizeof(pointSpriteVertices);
- vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
- vertexBufferDesc.Usage = D3D11_USAGE_IMMUTABLE;
- vertexBufferDesc.CPUAccessFlags = 0;
- vertexBufferDesc.MiscFlags = 0;
- vertexBufferDesc.StructureByteStride = 0;
-
- ANGLE_TRY(renderer->allocateResource(vertexBufferDesc, &vertexBufferData,
- &mPointSpriteVertexBuffer));
- }
-
- // Set the stride to 0 if GL_POINTS mode is not being used to instruct the driver to avoid
- // indexing into the vertex buffer.
- UINT stride = instancedPointSpritesActive ? pointSpriteVertexStride : 0;
- stateManager->queueVertexBufferChange(0, mPointSpriteVertexBuffer.get(), stride, 0);
-
- if (!mPointSpriteIndexBuffer.valid())
- {
- // Create an index buffer and set it for pointsprite rendering
- static const unsigned short pointSpriteIndices[] =
- {
- 0, 1, 2, 3, 4, 5,
- };
-
- D3D11_SUBRESOURCE_DATA indexBufferData = { pointSpriteIndices, 0, 0 };
- D3D11_BUFFER_DESC indexBufferDesc;
- indexBufferDesc.ByteWidth = sizeof(pointSpriteIndices);
- indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
- indexBufferDesc.Usage = D3D11_USAGE_IMMUTABLE;
- indexBufferDesc.CPUAccessFlags = 0;
- indexBufferDesc.MiscFlags = 0;
- indexBufferDesc.StructureByteStride = 0;
-
- ANGLE_TRY(renderer->allocateResource(indexBufferDesc, &indexBufferData,
- &mPointSpriteIndexBuffer));
- }
-
- if (instancedPointSpritesActive)
- {
- // The index buffer is applied here because Instanced PointSprite emulation uses the a
- // non-indexed rendering path in ANGLE (DrawArrays). This means that applyIndexBuffer()
- // on the renderer will not be called and setting this buffer here ensures that the
- // rendering path will contain the correct index buffers.
- stateManager->setIndexBuffer(mPointSpriteIndexBuffer.get(), DXGI_FORMAT_R16_UINT, 0);
- }
- }
-
- stateManager->applyVertexBufferChanges();
- return gl::NoError();
-}
-
-gl::Error InputLayoutCache::updateVertexOffsetsForPointSpritesEmulation(
- Renderer11 *renderer,
- const std::vector<const TranslatedAttribute *> &currentAttributes,
- GLint startVertex,
- GLsizei emulatedInstanceId)
-{
- auto *stateManager = renderer->getStateManager();
-
- size_t reservedBuffers = GetReservedBufferCount(true);
- for (size_t attribIndex = 0; attribIndex < currentAttributes.size(); ++attribIndex)
- {
- const auto &attrib = *currentAttributes[attribIndex];
- size_t bufferIndex = reservedBuffers + attribIndex;
-
- if (attrib.divisor > 0)
- {
- unsigned int offset = 0;
- ANGLE_TRY_RESULT(attrib.computeOffset(startVertex), offset);
- offset += (attrib.stride * (emulatedInstanceId / attrib.divisor));
- stateManager->queueVertexOffsetChange(bufferIndex, offset);
- }
- }
-
- stateManager->applyVertexBufferChanges();
- return gl::NoError();
-}
-
-gl::Error InputLayoutCache::updateInputLayout(
- Renderer11 *renderer,
- const gl::State &state,
- const std::vector<const TranslatedAttribute *> &currentAttributes,
- GLenum mode,
- const AttribIndexArray &sortedSemanticIndices,
- const DrawCallVertexParams &vertexParams)
-{
- gl::Program *program = state.getProgram();
- const auto &shaderAttributes = program->getAttributes();
- PackedAttributeLayout layout;
-
- ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
- bool programUsesInstancedPointSprites =
- programD3D->usesPointSize() && programD3D->usesInstancedPointSpriteEmulation();
- bool instancedPointSpritesActive = programUsesInstancedPointSprites && (mode == GL_POINTS);
-
- if (programUsesInstancedPointSprites)
- {
- layout.flags |= PackedAttributeLayout::FLAG_USES_INSTANCED_SPRITES;
- }
-
- if (instancedPointSpritesActive)
- {
- layout.flags |= PackedAttributeLayout::FLAG_INSTANCED_SPRITES_ACTIVE;
- }
-
- if (vertexParams.instances() > 0)
- {
- layout.flags |= PackedAttributeLayout::FLAG_INSTANCED_RENDERING_ACTIVE;
- }
-
- const auto &attribs = state.getVertexArray()->getVertexAttributes();
- const auto &bindings = state.getVertexArray()->getVertexBindings();
- const auto &locationToSemantic = programD3D->getAttribLocationToD3DSemantics();
- int divisorMultiplier = program->usesMultiview() ? program->getNumViews() : 1;
-
- for (size_t attribIndex : program->getActiveAttribLocationsMask())
- {
- // Record the type of the associated vertex shader vector in our key
- // This will prevent mismatched vertex shaders from using the same input layout
- GLenum glslElementType = GetGLSLAttributeType(shaderAttributes, attribIndex);
-
- const auto &attrib = attribs[attribIndex];
- const auto &binding = bindings[attrib.bindingIndex];
- int d3dSemantic = locationToSemantic[attribIndex];
-
- const auto &currentValue =
- state.getVertexAttribCurrentValue(static_cast<unsigned int>(attribIndex));
- gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib, currentValue.Type);
-
- layout.addAttributeData(glslElementType, d3dSemantic, vertexFormatType,
- binding.getDivisor() * divisorMultiplier);
- }
-
- const d3d11::InputLayout *inputLayout = nullptr;
- if (layout.numAttributes > 0 || layout.flags != 0)
- {
- auto it = mLayoutCache.Get(layout);
- if (it != mLayoutCache.end())
- {
- inputLayout = &it->second;
- }
- else
- {
- angle::TrimCache(mLayoutCache.max_size() / 2, kGCLimit, "input layout", &mLayoutCache);
-
- d3d11::InputLayout newInputLayout;
- ANGLE_TRY(createInputLayout(renderer, sortedSemanticIndices, currentAttributes, mode,
- program, vertexParams, &newInputLayout));
-
- auto insertIt = mLayoutCache.Put(layout, std::move(newInputLayout));
- inputLayout = &insertIt->second;
- }
- }
-
- renderer->getStateManager()->setInputLayout(inputLayout);
- return gl::NoError();
-}
-
-gl::Error InputLayoutCache::createInputLayout(
- Renderer11 *renderer,
- const AttribIndexArray &sortedSemanticIndices,
- const std::vector<const TranslatedAttribute *> &currentAttributes,
- GLenum mode,
- gl::Program *program,
- const DrawCallVertexParams &vertexParams,
- d3d11::InputLayout *inputLayoutOut)
-{
- ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
- auto featureLevel = renderer->getRenderer11DeviceCaps().featureLevel;
-
- bool programUsesInstancedPointSprites =
- programD3D->usesPointSize() && programD3D->usesInstancedPointSpriteEmulation();
-
- unsigned int inputElementCount = 0;
- std::array<D3D11_INPUT_ELEMENT_DESC, gl::MAX_VERTEX_ATTRIBS> inputElements;
-
- for (size_t attribIndex = 0; attribIndex < currentAttributes.size(); ++attribIndex)
- {
- const auto &attrib = *currentAttributes[attribIndex];
- const int sortedIndex = sortedSemanticIndices[attribIndex];
-
- D3D11_INPUT_CLASSIFICATION inputClass =
- attrib.divisor > 0 ? D3D11_INPUT_PER_INSTANCE_DATA : D3D11_INPUT_PER_VERTEX_DATA;
-
- const auto &vertexFormatType =
- gl::GetVertexFormatType(*attrib.attribute, attrib.currentValueType);
- const auto &vertexFormatInfo = d3d11::GetVertexFormatInfo(vertexFormatType, featureLevel);
-
- auto *inputElement = &inputElements[inputElementCount];
-
- inputElement->SemanticName = "TEXCOORD";
- inputElement->SemanticIndex = sortedIndex;
- inputElement->Format = vertexFormatInfo.nativeFormat;
- inputElement->InputSlot = static_cast<UINT>(attribIndex);
- inputElement->AlignedByteOffset = 0;
- inputElement->InputSlotClass = inputClass;
- inputElement->InstanceDataStepRate = attrib.divisor;
-
- inputElementCount++;
- }
-
- // Instanced PointSprite emulation requires additional entries in the
- // inputlayout to support the vertices that make up the pointsprite quad.
- // We do this even if mode != GL_POINTS, since the shader signature has these inputs, and the
- // input layout must match the shader
- if (programUsesInstancedPointSprites)
- {
- // On 9_3, we must ensure that slot 0 contains non-instanced data.
- // If slot 0 currently contains instanced data then we swap it with a non-instanced element.
- // Note that instancing is only available on 9_3 via ANGLE_instanced_arrays, since 9_3
- // doesn't support OpenGL ES 3.0.
- // As per the spec for ANGLE_instanced_arrays, not all attributes can be instanced
- // simultaneously, so a non-instanced element must exist.
-
- GLsizei numIndicesPerInstance = 0;
- if (vertexParams.instances() > 0)
- {
- // This may trigger an evaluation of the index range.
- numIndicesPerInstance = vertexParams.vertexCount();
- }
-
- for (size_t elementIndex = 0; elementIndex < inputElementCount; ++elementIndex)
- {
- // If rendering points and instanced pointsprite emulation is being used, the
- // inputClass is required to be configured as per instance data
- if (mode == GL_POINTS)
- {
- inputElements[elementIndex].InputSlotClass = D3D11_INPUT_PER_INSTANCE_DATA;
- inputElements[elementIndex].InstanceDataStepRate = 1;
- if (numIndicesPerInstance > 0 && currentAttributes[elementIndex]->divisor > 0)
- {
- inputElements[elementIndex].InstanceDataStepRate = numIndicesPerInstance;
- }
- }
- inputElements[elementIndex].InputSlot++;
- }
-
- inputElements[inputElementCount].SemanticName = "SPRITEPOSITION";
- inputElements[inputElementCount].SemanticIndex = 0;
- inputElements[inputElementCount].Format = DXGI_FORMAT_R32G32B32_FLOAT;
- inputElements[inputElementCount].InputSlot = 0;
- inputElements[inputElementCount].AlignedByteOffset = 0;
- inputElements[inputElementCount].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
- inputElements[inputElementCount].InstanceDataStepRate = 0;
- inputElementCount++;
-
- inputElements[inputElementCount].SemanticName = "SPRITETEXCOORD";
- inputElements[inputElementCount].SemanticIndex = 0;
- inputElements[inputElementCount].Format = DXGI_FORMAT_R32G32_FLOAT;
- inputElements[inputElementCount].InputSlot = 0;
- inputElements[inputElementCount].AlignedByteOffset = sizeof(float) * 3;
- inputElements[inputElementCount].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
- inputElements[inputElementCount].InstanceDataStepRate = 0;
- inputElementCount++;
- }
-
- ShaderExecutableD3D *shader = nullptr;
- ANGLE_TRY(programD3D->getVertexExecutableForCachedInputLayout(&shader, nullptr));
-
- ShaderExecutableD3D *shader11 = GetAs<ShaderExecutable11>(shader);
-
- InputElementArray inputElementArray(inputElements.data(), inputElementCount);
- ShaderData vertexShaderData(shader11->getFunction(), shader11->getLength());
-
- ANGLE_TRY(renderer->allocateResource(inputElementArray, &vertexShaderData, inputLayoutOut));
- return gl::NoError();
-}
-
-void InputLayoutCache::setCacheSize(size_t newCacheSize)
-{
- // Forces a reset of the cache.
- LayoutCache newCache(newCacheSize);
- mLayoutCache.Swap(newCache);
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.h
deleted file mode 100644
index 8d7c7dd0f0..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.h
+++ /dev/null
@@ -1,135 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// InputLayoutCache.h: Defines InputLayoutCache, a class that builds and caches
-// D3D11 input layouts.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_INPUTLAYOUTCACHE_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_INPUTLAYOUTCACHE_H_
-
-#include <GLES2/gl2.h>
-
-#include <cstddef>
-
-#include <array>
-#include <map>
-
-#include "common/angleutils.h"
-#include "libANGLE/Constants.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/SizedMRUCache.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
-
-namespace rx
-{
-class DrawCallVertexParams;
-struct PackedAttributeLayout
-{
- PackedAttributeLayout();
- PackedAttributeLayout(const PackedAttributeLayout &other);
-
- void addAttributeData(GLenum glType,
- UINT semanticIndex,
- gl::VertexFormatType vertexFormatType,
- unsigned int divisor);
-
- bool operator==(const PackedAttributeLayout &other) const;
-
- enum Flags
- {
- FLAG_USES_INSTANCED_SPRITES = 0x1,
- FLAG_INSTANCED_SPRITES_ACTIVE = 0x2,
- FLAG_INSTANCED_RENDERING_ACTIVE = 0x4,
- };
-
- uint32_t numAttributes;
- uint32_t flags;
- std::array<uint32_t, gl::MAX_VERTEX_ATTRIBS> attributeData;
-};
-} // namespace rx
-
-namespace std
-{
-template <>
-struct hash<rx::PackedAttributeLayout>
-{
- size_t operator()(const rx::PackedAttributeLayout &value) const
- {
- return angle::ComputeGenericHash(value);
- }
-};
-} // namespace std
-
-namespace gl
-{
-class Program;
-} // namespace gl
-
-namespace rx
-{
-struct TranslatedAttribute;
-struct TranslatedIndexData;
-struct SourceIndexData;
-class ProgramD3D;
-class Renderer11;
-
-class InputLayoutCache : angle::NonCopyable
-{
- public:
- InputLayoutCache();
- ~InputLayoutCache();
-
- void clear();
-
- gl::Error applyVertexBuffers(const gl::Context *context,
- const std::vector<const TranslatedAttribute *> &currentAttributes,
- GLenum mode,
- GLint start,
- bool isIndexedRendering);
-
- gl::Error updateVertexOffsetsForPointSpritesEmulation(
- Renderer11 *renderer,
- const std::vector<const TranslatedAttribute *> &currentAttributes,
- GLint startVertex,
- GLsizei emulatedInstanceId);
-
- // Useful for testing
- void setCacheSize(size_t newCacheSize);
-
- gl::Error updateInputLayout(Renderer11 *renderer,
- const gl::State &state,
- const std::vector<const TranslatedAttribute *> &currentAttributes,
- GLenum mode,
- const AttribIndexArray &sortedSemanticIndices,
- const DrawCallVertexParams &vertexParams);
-
- private:
- gl::Error createInputLayout(Renderer11 *renderer,
- const AttribIndexArray &sortedSemanticIndices,
- const std::vector<const TranslatedAttribute *> &currentAttributes,
- GLenum mode,
- gl::Program *program,
- const DrawCallVertexParams &vertexParams,
- d3d11::InputLayout *inputLayoutOut);
-
- // Starting cache size.
- static constexpr size_t kDefaultCacheSize = 1024;
-
- // The cache tries to clean up this many states at once.
- static constexpr size_t kGCLimit = 128;
-
- using LayoutCache = angle::base::HashingMRUCache<PackedAttributeLayout, d3d11::InputLayout>;
- LayoutCache mLayoutCache;
-
- d3d11::Buffer mPointSpriteVertexBuffer;
- d3d11::Buffer mPointSpriteIndexBuffer;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_INPUTLAYOUTCACHE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/NativeWindow11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/NativeWindow11.h
deleted file mode 100644
index ab234d4450..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/NativeWindow11.h
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// NativeWindow11.h: Defines NativeWindow11, a class for managing and performing operations on an
-// EGLNativeWindowType for the D3D11 renderer.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_NATIVEWINDOW11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_NATIVEWINDOW11_H_
-
-#include "common/debug.h"
-#include "common/platform.h"
-
-#include "libANGLE/Config.h"
-#include "libANGLE/renderer/d3d/NativeWindowD3D.h"
-
-namespace rx
-{
-
-class NativeWindow11 : public NativeWindowD3D
-{
- public:
- NativeWindow11(EGLNativeWindowType window) : NativeWindowD3D(window) {}
-
- virtual HRESULT createSwapChain(ID3D11Device *device,
- IDXGIFactory *factory,
- DXGI_FORMAT format,
- UINT width,
- UINT height,
- UINT samples,
- IDXGISwapChain **swapChain) = 0;
- virtual void commitChange() = 0;
-};
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_NATIVEWINDOW11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp
deleted file mode 100644
index 7d7ecb0976..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp
+++ /dev/null
@@ -1,258 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// PixelTransfer11.cpp:
-// Implementation for buffer-to-texture and texture-to-buffer copies.
-// Used to implement pixel transfers from unpack and to pack buffers.
-//
-
-#include "libANGLE/renderer/d3d/d3d11/PixelTransfer11.h"
-
-#include "libANGLE/Buffer.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/d3d/d3d11/Buffer11.h"
-#include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h"
-#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h"
-#include "libANGLE/renderer/d3d/d3d11/TextureStorage11.h"
-#include "libANGLE/Texture.h"
-
-// Precompiled shaders
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_gs.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4f.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4i.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4ui.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_vs.h"
-
-namespace rx
-{
-
-PixelTransfer11::PixelTransfer11(Renderer11 *renderer)
- : mRenderer(renderer),
- mResourcesLoaded(false),
- mBufferToTextureVS(),
- mBufferToTextureGS(),
- mParamsConstantBuffer(),
- mCopyRasterizerState(),
- mCopyDepthStencilState()
-{
-}
-
-PixelTransfer11::~PixelTransfer11()
-{
-}
-
-gl::Error PixelTransfer11::loadResources()
-{
- if (mResourcesLoaded)
- {
- return gl::NoError();
- }
-
- D3D11_RASTERIZER_DESC rasterDesc;
- rasterDesc.FillMode = D3D11_FILL_SOLID;
- rasterDesc.CullMode = D3D11_CULL_NONE;
- rasterDesc.FrontCounterClockwise = FALSE;
- rasterDesc.DepthBias = 0;
- rasterDesc.SlopeScaledDepthBias = 0.0f;
- rasterDesc.DepthBiasClamp = 0.0f;
- rasterDesc.DepthClipEnable = TRUE;
- rasterDesc.ScissorEnable = FALSE;
- rasterDesc.MultisampleEnable = FALSE;
- rasterDesc.AntialiasedLineEnable = FALSE;
-
- ANGLE_TRY(mRenderer->allocateResource(rasterDesc, &mCopyRasterizerState));
-
- D3D11_DEPTH_STENCIL_DESC depthStencilDesc;
- depthStencilDesc.DepthEnable = true;
- depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
- depthStencilDesc.DepthFunc = D3D11_COMPARISON_ALWAYS;
- depthStencilDesc.StencilEnable = FALSE;
- depthStencilDesc.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK;
- depthStencilDesc.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK;
- depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
- depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
- depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
- depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
- depthStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
- depthStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
- depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
- depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
-
- ANGLE_TRY(mRenderer->allocateResource(depthStencilDesc, &mCopyDepthStencilState));
-
- D3D11_BUFFER_DESC constantBufferDesc = { 0 };
- constantBufferDesc.ByteWidth = roundUp<UINT>(sizeof(CopyShaderParams), 32u);
- constantBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
- constantBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
- constantBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- constantBufferDesc.MiscFlags = 0;
- constantBufferDesc.StructureByteStride = 0;
-
- ANGLE_TRY(mRenderer->allocateResource(constantBufferDesc, &mParamsConstantBuffer));
- mParamsConstantBuffer.setDebugName("PixelTransfer11 constant buffer");
-
- // init shaders
- ANGLE_TRY(mRenderer->allocateResource(ShaderData(g_VS_BufferToTexture), &mBufferToTextureVS));
- mBufferToTextureVS.setDebugName("BufferToTexture VS");
-
- ANGLE_TRY(mRenderer->allocateResource(ShaderData(g_GS_BufferToTexture), &mBufferToTextureGS));
- mBufferToTextureGS.setDebugName("BufferToTexture GS");
-
- ANGLE_TRY(buildShaderMap());
-
- StructZero(&mParamsData);
-
- mResourcesLoaded = true;
-
- return gl::NoError();
-}
-
-void PixelTransfer11::setBufferToTextureCopyParams(const gl::Box &destArea, const gl::Extents &destSize, GLenum internalFormat,
- const gl::PixelUnpackState &unpack, unsigned int offset, CopyShaderParams *parametersOut)
-{
- StructZero(parametersOut);
-
- float texelCenterX = 0.5f / static_cast<float>(destSize.width - 1);
- float texelCenterY = 0.5f / static_cast<float>(destSize.height - 1);
-
- unsigned int bytesPerPixel = gl::GetSizedInternalFormatInfo(internalFormat).pixelBytes;
- unsigned int alignmentBytes = static_cast<unsigned int>(unpack.alignment);
- unsigned int alignmentPixels = (alignmentBytes <= bytesPerPixel ? 1 : alignmentBytes / bytesPerPixel);
-
- parametersOut->FirstPixelOffset = offset / bytesPerPixel;
- parametersOut->PixelsPerRow = static_cast<unsigned int>((unpack.rowLength > 0) ? unpack.rowLength : destArea.width);
- parametersOut->RowStride = roundUp(parametersOut->PixelsPerRow, alignmentPixels);
- parametersOut->RowsPerSlice = static_cast<unsigned int>(destArea.height);
- parametersOut->PositionOffset[0] = texelCenterX + (destArea.x / float(destSize.width)) * 2.0f - 1.0f;
- parametersOut->PositionOffset[1] = texelCenterY + ((destSize.height - destArea.y - 1) / float(destSize.height)) * 2.0f - 1.0f;
- parametersOut->PositionScale[0] = 2.0f / static_cast<float>(destSize.width);
- parametersOut->PositionScale[1] = -2.0f / static_cast<float>(destSize.height);
- parametersOut->FirstSlice = destArea.z;
-}
-
-gl::Error PixelTransfer11::copyBufferToTexture(const gl::Context *context,
- const gl::PixelUnpackState &unpack,
- unsigned int offset,
- RenderTargetD3D *destRenderTarget,
- GLenum destinationFormat,
- GLenum sourcePixelsType,
- const gl::Box &destArea)
-{
- ANGLE_TRY(loadResources());
-
- gl::Extents destSize = destRenderTarget->getExtents();
-
- ASSERT(destArea.x >= 0 && destArea.x + destArea.width <= destSize.width &&
- destArea.y >= 0 && destArea.y + destArea.height <= destSize.height &&
- destArea.z >= 0 && destArea.z + destArea.depth <= destSize.depth );
-
- const gl::Buffer &sourceBuffer =
- *context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack);
-
- ASSERT(mRenderer->supportsFastCopyBufferToTexture(destinationFormat));
-
- const d3d11::PixelShader *pixelShader = findBufferToTexturePS(destinationFormat);
- ASSERT(pixelShader);
-
- // The SRV must be in the proper read format, which may be different from the destination format
- // EG: for half float data, we can load full precision floats with implicit conversion
- GLenum unsizedFormat = gl::GetUnsizedFormat(destinationFormat);
- const gl::InternalFormat &sourceglFormatInfo =
- gl::GetInternalFormatInfo(unsizedFormat, sourcePixelsType);
-
- const d3d11::Format &sourceFormatInfo = d3d11::Format::Get(
- sourceglFormatInfo.sizedInternalFormat, mRenderer->getRenderer11DeviceCaps());
- DXGI_FORMAT srvFormat = sourceFormatInfo.srvFormat;
- ASSERT(srvFormat != DXGI_FORMAT_UNKNOWN);
- Buffer11 *bufferStorage11 = GetAs<Buffer11>(sourceBuffer.getImplementation());
- const d3d11::ShaderResourceView *bufferSRV = nullptr;
- ANGLE_TRY_RESULT(bufferStorage11->getSRV(context, srvFormat), bufferSRV);
- ASSERT(bufferSRV != nullptr);
-
- const d3d11::RenderTargetView &textureRTV =
- GetAs<RenderTarget11>(destRenderTarget)->getRenderTargetView();
- ASSERT(textureRTV.valid());
-
- CopyShaderParams shaderParams;
- setBufferToTextureCopyParams(destArea, destSize, sourceglFormatInfo.sizedInternalFormat, unpack,
- offset, &shaderParams);
-
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- // Are we doing a 2D or 3D copy?
- const auto *geometryShader = ((destSize.depth > 1) ? &mBufferToTextureGS : nullptr);
- StateManager11 *stateManager = mRenderer->getStateManager();
-
- stateManager->setDrawShaders(&mBufferToTextureVS, geometryShader, pixelShader);
- stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, bufferSRV);
- stateManager->setInputLayout(nullptr);
- stateManager->setPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST);
-
- stateManager->setSingleVertexBuffer(nullptr, 0, 0);
- stateManager->setSimpleBlendState(nullptr);
- stateManager->setDepthStencilState(&mCopyDepthStencilState, 0xFFFFFFFF);
- stateManager->setRasterizerState(&mCopyRasterizerState);
-
- stateManager->setRenderTarget(textureRTV.get(), nullptr);
-
- if (!StructEquals(mParamsData, shaderParams))
- {
- d3d11::SetBufferData(deviceContext, mParamsConstantBuffer.get(), shaderParams);
- mParamsData = shaderParams;
- }
-
- stateManager->setVertexConstantBuffer(0, &mParamsConstantBuffer);
-
- // Set the viewport
- stateManager->setSimpleViewport(destSize);
-
- UINT numPixels = (destArea.width * destArea.height * destArea.depth);
- deviceContext->Draw(numPixels, 0);
-
- return gl::NoError();
-}
-
-gl::Error PixelTransfer11::buildShaderMap()
-{
- d3d11::PixelShader bufferToTextureFloat;
- d3d11::PixelShader bufferToTextureInt;
- d3d11::PixelShader bufferToTextureUint;
-
- ANGLE_TRY(
- mRenderer->allocateResource(ShaderData(g_PS_BufferToTexture_4F), &bufferToTextureFloat));
- ANGLE_TRY(
- mRenderer->allocateResource(ShaderData(g_PS_BufferToTexture_4I), &bufferToTextureInt));
- ANGLE_TRY(
- mRenderer->allocateResource(ShaderData(g_PS_BufferToTexture_4UI), &bufferToTextureUint));
-
- bufferToTextureFloat.setDebugName("BufferToTexture RGBA ps");
- bufferToTextureInt.setDebugName("BufferToTexture RGBA-I ps");
- bufferToTextureUint.setDebugName("BufferToTexture RGBA-UI ps");
-
- mBufferToTexturePSMap[GL_FLOAT] = std::move(bufferToTextureFloat);
- mBufferToTexturePSMap[GL_INT] = std::move(bufferToTextureInt);
- mBufferToTexturePSMap[GL_UNSIGNED_INT] = std::move(bufferToTextureUint);
-
- return gl::NoError();
-}
-
-const d3d11::PixelShader *PixelTransfer11::findBufferToTexturePS(GLenum internalFormat) const
-{
- GLenum componentType = gl::GetSizedInternalFormatInfo(internalFormat).componentType;
- if (componentType == GL_SIGNED_NORMALIZED || componentType == GL_UNSIGNED_NORMALIZED)
- {
- componentType = GL_FLOAT;
- }
-
- auto shaderMapIt = mBufferToTexturePSMap.find(componentType);
- return (shaderMapIt == mBufferToTexturePSMap.end() ? nullptr : &shaderMapIt->second);
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.h
deleted file mode 100644
index a93544247e..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.h
+++ /dev/null
@@ -1,93 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// PixelTransfer11.h:
-// Buffer-to-Texture and Texture-to-Buffer data transfers.
-// Used to implement pixel unpack and pixel pack buffers in ES3.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_PIXELTRANSFER11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_PIXELTRANSFER11_H_
-
-#include <GLES2/gl2.h>
-
-#include <map>
-
-#include "common/platform.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
-
-namespace gl
-{
-
-class Buffer;
-struct Box;
-struct Extents;
-struct PixelUnpackState;
-
-}
-
-namespace rx
-{
-class Renderer11;
-class RenderTargetD3D;
-
-class PixelTransfer11
-{
- public:
- explicit PixelTransfer11(Renderer11 *renderer);
- ~PixelTransfer11();
-
- // unpack: the source buffer is stored in the unpack state, and buffer strides
- // offset: the start of the data within the unpack buffer
- // destRenderTarget: individual slice/layer of a target texture
- // destinationFormat/sourcePixelsType: determines shaders + shader parameters
- // destArea: the sub-section of destRenderTarget to copy to
- gl::Error copyBufferToTexture(const gl::Context *context,
- const gl::PixelUnpackState &unpack,
- unsigned int offset,
- RenderTargetD3D *destRenderTarget,
- GLenum destinationFormat,
- GLenum sourcePixelsType,
- const gl::Box &destArea);
-
- private:
-
- struct CopyShaderParams
- {
- unsigned int FirstPixelOffset;
- unsigned int PixelsPerRow;
- unsigned int RowStride;
- unsigned int RowsPerSlice;
- float PositionOffset[2];
- float PositionScale[2];
- int TexLocationOffset[2];
- int TexLocationScale[2];
- unsigned int FirstSlice;
- };
-
- static void setBufferToTextureCopyParams(const gl::Box &destArea, const gl::Extents &destSize, GLenum internalFormat,
- const gl::PixelUnpackState &unpack, unsigned int offset, CopyShaderParams *parametersOut);
-
- gl::Error loadResources();
- gl::Error buildShaderMap();
- const d3d11::PixelShader *findBufferToTexturePS(GLenum internalFormat) const;
-
- Renderer11 *mRenderer;
-
- bool mResourcesLoaded;
- std::map<GLenum, d3d11::PixelShader> mBufferToTexturePSMap;
- d3d11::VertexShader mBufferToTextureVS;
- d3d11::GeometryShader mBufferToTextureGS;
- d3d11::Buffer mParamsConstantBuffer;
- CopyShaderParams mParamsData;
-
- d3d11::RasterizerState mCopyRasterizerState;
- d3d11::DepthStencilState mCopyDepthStencilState;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_PIXELTRANSFER11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.cpp
deleted file mode 100644
index c9554431e5..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// ProgramPipelineNULL.cpp:
-// Implements the class methods for ProgramPipeline11.
-//
-
-#include "libANGLE/renderer/d3d/d3d11/ProgramPipeline11.h"
-
-namespace rx
-{
-
-ProgramPipeline11::ProgramPipeline11(const gl::ProgramPipelineState &state)
- : ProgramPipelineImpl(state)
-{
-}
-
-ProgramPipeline11::~ProgramPipeline11()
-{
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.h
deleted file mode 100644
index cf838eec05..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.h
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// ProgramPipeline11.h:
-// Defines the class interface for ProgramPipeline11, implementing ProgramPipelineImpl.
-//
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_PROGRAMPIPELINE11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_PROGRAMPIPELINE11_H_
-
-#include "libANGLE/renderer/ProgramPipelineImpl.h"
-
-namespace rx
-{
-
-class ProgramPipeline11 : public ProgramPipelineImpl
-{
- public:
- ProgramPipeline11(const gl::ProgramPipelineState &state);
- ~ProgramPipeline11() override;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_PROGRAMPIPELINE11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Query11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Query11.cpp
deleted file mode 100644
index 66b9476e7f..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Query11.cpp
+++ /dev/null
@@ -1,375 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Query11.cpp: Defines the rx::Query11 class which implements rx::QueryImpl.
-
-#include "libANGLE/renderer/d3d/d3d11/Query11.h"
-
-#include <GLES2/gl2ext.h>
-
-#include "common/utilities.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-
-namespace
-{
-
-GLuint64 MergeQueryResults(GLenum type, GLuint64 currentResult, GLuint64 newResult)
-{
- switch (type)
- {
- case GL_ANY_SAMPLES_PASSED:
- case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
- return (currentResult == GL_TRUE || newResult == GL_TRUE) ? GL_TRUE : GL_FALSE;
-
- case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
- return currentResult + newResult;
-
- case GL_TIME_ELAPSED_EXT:
- return currentResult + newResult;
-
- case GL_TIMESTAMP_EXT:
- return newResult;
-
- case GL_COMMANDS_COMPLETED_CHROMIUM:
- return newResult;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-} // anonymous namespace
-
-namespace rx
-{
-
-Query11::QueryState::QueryState() : query(), beginTimestamp(), endTimestamp(), finished(false)
-{
-}
-
-Query11::QueryState::~QueryState()
-{
-}
-
-Query11::Query11(Renderer11 *renderer, GLenum type)
- : QueryImpl(type), mResult(0), mResultSum(0), mRenderer(renderer)
-{
- mActiveQuery = std::unique_ptr<QueryState>(new QueryState());
-}
-
-Query11::~Query11()
-{
- mRenderer->getStateManager()->onDeleteQueryObject(this);
-}
-
-gl::Error Query11::begin()
-{
- mResultSum = 0;
- mRenderer->getStateManager()->onBeginQuery(this);
- return resume();
-}
-
-gl::Error Query11::end()
-{
- return pause();
-}
-
-gl::Error Query11::queryCounter()
-{
- // This doesn't do anything for D3D11 as we don't support timestamps
- ASSERT(getType() == GL_TIMESTAMP_EXT);
- mResultSum = 0;
- mPendingQueries.push_back(std::unique_ptr<QueryState>(new QueryState()));
- return gl::NoError();
-}
-
-template <typename T>
-gl::Error Query11::getResultBase(T *params)
-{
- ASSERT(!mActiveQuery->query.valid());
- ANGLE_TRY(flush(true));
- ASSERT(mPendingQueries.empty());
- *params = static_cast<T>(mResultSum);
-
- return gl::NoError();
-}
-
-gl::Error Query11::getResult(GLint *params)
-{
- return getResultBase(params);
-}
-
-gl::Error Query11::getResult(GLuint *params)
-{
- return getResultBase(params);
-}
-
-gl::Error Query11::getResult(GLint64 *params)
-{
- return getResultBase(params);
-}
-
-gl::Error Query11::getResult(GLuint64 *params)
-{
- return getResultBase(params);
-}
-
-gl::Error Query11::isResultAvailable(bool *available)
-{
- ANGLE_TRY(flush(false));
-
- *available = mPendingQueries.empty();
- return gl::NoError();
-}
-
-gl::Error Query11::pause()
-{
- if (mActiveQuery->query.valid())
- {
- ID3D11DeviceContext *context = mRenderer->getDeviceContext();
- GLenum queryType = getType();
-
- // If we are doing time elapsed query the end timestamp
- if (queryType == GL_TIME_ELAPSED_EXT)
- {
- context->End(mActiveQuery->endTimestamp.get());
- }
-
- context->End(mActiveQuery->query.get());
-
- mPendingQueries.push_back(std::move(mActiveQuery));
- mActiveQuery = std::unique_ptr<QueryState>(new QueryState());
- }
-
- return flush(false);
-}
-
-gl::Error Query11::resume()
-{
- if (!mActiveQuery->query.valid())
- {
- ANGLE_TRY(flush(false));
-
- GLenum queryType = getType();
- D3D11_QUERY d3dQueryType = gl_d3d11::ConvertQueryType(queryType);
-
- D3D11_QUERY_DESC queryDesc;
- queryDesc.Query = d3dQueryType;
- queryDesc.MiscFlags = 0;
-
- ANGLE_TRY(mRenderer->allocateResource(queryDesc, &mActiveQuery->query));
-
- // If we are doing time elapsed we also need a query to actually query the timestamp
- if (queryType == GL_TIME_ELAPSED_EXT)
- {
- D3D11_QUERY_DESC desc;
- desc.Query = D3D11_QUERY_TIMESTAMP;
- desc.MiscFlags = 0;
-
- ANGLE_TRY(mRenderer->allocateResource(desc, &mActiveQuery->beginTimestamp));
- ANGLE_TRY(mRenderer->allocateResource(desc, &mActiveQuery->endTimestamp));
- }
-
- ID3D11DeviceContext *context = mRenderer->getDeviceContext();
-
- if (d3dQueryType != D3D11_QUERY_EVENT)
- {
- context->Begin(mActiveQuery->query.get());
- }
-
- // If we are doing time elapsed, query the begin timestamp
- if (queryType == GL_TIME_ELAPSED_EXT)
- {
- context->End(mActiveQuery->beginTimestamp.get());
- }
- }
-
- return gl::NoError();
-}
-
-gl::Error Query11::flush(bool force)
-{
- while (!mPendingQueries.empty())
- {
- QueryState *query = mPendingQueries.front().get();
-
- do
- {
- ANGLE_TRY(testQuery(query));
- if (!query->finished && !force)
- {
- return gl::NoError();
- }
- } while (!query->finished);
-
- mResultSum = MergeQueryResults(getType(), mResultSum, mResult);
- mPendingQueries.pop_front();
- }
-
- return gl::NoError();
-}
-
-gl::Error Query11::testQuery(QueryState *queryState)
-{
- if (!queryState->finished)
- {
- ID3D11DeviceContext *context = mRenderer->getDeviceContext();
- switch (getType())
- {
- case GL_ANY_SAMPLES_PASSED_EXT:
- case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
- {
- ASSERT(queryState->query.valid());
- UINT64 numPixels = 0;
- HRESULT result =
- context->GetData(queryState->query.get(), &numPixels, sizeof(numPixels), 0);
- if (FAILED(result))
- {
- return gl::OutOfMemory()
- << "Failed to get the data of an internal query, " << gl::FmtHR(result);
- }
-
- if (result == S_OK)
- {
- queryState->finished = true;
- mResult = (numPixels > 0) ? GL_TRUE : GL_FALSE;
- }
- }
- break;
-
- case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
- {
- ASSERT(queryState->query.valid());
- D3D11_QUERY_DATA_SO_STATISTICS soStats = {0};
- HRESULT result =
- context->GetData(queryState->query.get(), &soStats, sizeof(soStats), 0);
- if (FAILED(result))
- {
- return gl::OutOfMemory()
- << "Failed to get the data of an internal query, " << gl::FmtHR(result);
- }
-
- if (result == S_OK)
- {
- queryState->finished = true;
- mResult = static_cast<GLuint64>(soStats.NumPrimitivesWritten);
- }
- }
- break;
-
- case GL_TIME_ELAPSED_EXT:
- {
- ASSERT(queryState->query.valid());
- ASSERT(queryState->beginTimestamp.valid());
- ASSERT(queryState->endTimestamp.valid());
- D3D11_QUERY_DATA_TIMESTAMP_DISJOINT timeStats = {0};
- HRESULT result =
- context->GetData(queryState->query.get(), &timeStats, sizeof(timeStats), 0);
- if (FAILED(result))
- {
- return gl::OutOfMemory()
- << "Failed to get the data of an internal query, " << gl::FmtHR(result);
- }
-
- if (result == S_OK)
- {
- UINT64 beginTime = 0;
- HRESULT beginRes = context->GetData(queryState->beginTimestamp.get(),
- &beginTime, sizeof(UINT64), 0);
- if (FAILED(beginRes))
- {
- return gl::OutOfMemory() << "Failed to get the data of an internal query, "
- << gl::FmtHR(beginRes);
- }
- UINT64 endTime = 0;
- HRESULT endRes = context->GetData(queryState->endTimestamp.get(), &endTime,
- sizeof(UINT64), 0);
- if (FAILED(endRes))
- {
- return gl::OutOfMemory() << "Failed to get the data of an internal query, "
- << gl::FmtHR(endRes);
- }
-
- if (beginRes == S_OK && endRes == S_OK)
- {
- queryState->finished = true;
- if (timeStats.Disjoint)
- {
- mRenderer->setGPUDisjoint();
- }
- static_assert(sizeof(UINT64) == sizeof(unsigned long long),
- "D3D UINT64 isn't 64 bits");
-
- angle::CheckedNumeric<UINT64> checkedTime(endTime);
- checkedTime -= beginTime;
- checkedTime *= 1000000000ull;
- checkedTime /= timeStats.Frequency;
- if (checkedTime.IsValid())
- {
- mResult = checkedTime.ValueOrDie();
- }
- else
- {
- mResult = std::numeric_limits<GLuint64>::max() / timeStats.Frequency;
- // If an overflow does somehow occur, there is no way the elapsed time
- // is accurate, so we generate a disjoint event
- mRenderer->setGPUDisjoint();
- }
- }
- }
- }
- break;
-
- case GL_TIMESTAMP_EXT:
- {
- // D3D11 doesn't support GL timestamp queries as D3D timestamps are not guaranteed
- // to have any sort of continuity outside of a disjoint timestamp query block, which
- // GL depends on
- ASSERT(!queryState->query.valid());
- mResult = 0;
- queryState->finished = true;
- }
- break;
-
- case GL_COMMANDS_COMPLETED_CHROMIUM:
- {
- ASSERT(queryState->query.valid());
- BOOL completed = 0;
- HRESULT result =
- context->GetData(queryState->query.get(), &completed, sizeof(completed), 0);
- if (FAILED(result))
- {
- return gl::OutOfMemory()
- << "Failed to get the data of an internal query, " << gl::FmtHR(result);
- }
-
- if (result == S_OK)
- {
- queryState->finished = true;
- ASSERT(completed == TRUE);
- mResult = (completed == TRUE) ? GL_TRUE : GL_FALSE;
- }
- }
- break;
-
- default:
- UNREACHABLE();
- break;
- }
-
- if (!queryState->finished && mRenderer->testDeviceLost())
- {
- mRenderer->notifyDeviceLost();
- return gl::OutOfMemory() << "Failed to test get query result, device is lost.";
- }
- }
-
- return gl::NoError();
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Query11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Query11.h
deleted file mode 100644
index a88a8892aa..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Query11.h
+++ /dev/null
@@ -1,68 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Query11.h: Defines the rx::Query11 class which implements rx::QueryImpl.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_QUERY11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_QUERY11_H_
-
-#include <deque>
-
-#include "libANGLE/renderer/QueryImpl.h"
-#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
-
-namespace rx
-{
-class Renderer11;
-
-class Query11 : public QueryImpl
-{
- public:
- Query11(Renderer11 *renderer, GLenum type);
- ~Query11() override;
-
- gl::Error begin() override;
- gl::Error end() override;
- gl::Error queryCounter() override;
- gl::Error getResult(GLint *params) override;
- gl::Error getResult(GLuint *params) override;
- gl::Error getResult(GLint64 *params) override;
- gl::Error getResult(GLuint64 *params) override;
- gl::Error isResultAvailable(bool *available) override;
-
- gl::Error pause();
- gl::Error resume();
-
- private:
- struct QueryState final : private angle::NonCopyable
- {
- QueryState();
- ~QueryState();
-
- d3d11::Query query;
- d3d11::Query beginTimestamp;
- d3d11::Query endTimestamp;
- bool finished;
- };
-
- gl::Error flush(bool force);
- gl::Error testQuery(QueryState *queryState);
-
- template <typename T>
- gl::Error getResultBase(T *params);
-
- GLuint64 mResult;
- GLuint64 mResultSum;
-
- Renderer11 *mRenderer;
-
- std::unique_ptr<QueryState> mActiveQuery;
- std::deque<std::unique_ptr<QueryState>> mPendingQueries;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_QUERY11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp
deleted file mode 100644
index 5b85196c2e..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp
+++ /dev/null
@@ -1,273 +0,0 @@
-//
-// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// RenderStateCache.cpp: Defines rx::RenderStateCache, a cache of Direct3D render
-// state objects.
-
-#include "libANGLE/renderer/d3d/d3d11/RenderStateCache.h"
-
-#include <float.h>
-
-#include "common/debug.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/renderer/d3d/FramebufferD3D.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-
-namespace rx
-{
-using namespace gl_d3d11;
-
-RenderStateCache::RenderStateCache()
- : mBlendStateCache(kMaxStates),
- mRasterizerStateCache(kMaxStates),
- mDepthStencilStateCache(kMaxStates),
- mSamplerStateCache(kMaxStates)
-{
-}
-
-RenderStateCache::~RenderStateCache()
-{
-}
-
-void RenderStateCache::clear()
-{
- mBlendStateCache.Clear();
- mRasterizerStateCache.Clear();
- mDepthStencilStateCache.Clear();
- mSamplerStateCache.Clear();
-}
-
-// static
-d3d11::BlendStateKey RenderStateCache::GetBlendStateKey(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::BlendState &blendState)
-{
- d3d11::BlendStateKey key;
- FramebufferD3D *framebufferD3D = GetImplAs<FramebufferD3D>(framebuffer);
- const gl::AttachmentList &colorbuffers = framebufferD3D->getColorAttachmentsForRender(context);
- const UINT8 blendStateMask =
- gl_d3d11::ConvertColorMask(blendState.colorMaskRed, blendState.colorMaskGreen,
- blendState.colorMaskBlue, blendState.colorMaskAlpha);
-
- key.blendState = blendState;
-
- for (size_t i = 0; i < colorbuffers.size(); i++)
- {
- const gl::FramebufferAttachment *attachment = colorbuffers[i];
-
- if (attachment)
- {
- key.rtvMax = static_cast<uint32_t>(i) + 1;
- key.rtvMasks[i] =
- (gl_d3d11::GetColorMask(*attachment->getFormat().info)) & blendStateMask;
- }
- }
-
- return key;
-}
-
-gl::Error RenderStateCache::getBlendState(Renderer11 *renderer,
- const d3d11::BlendStateKey &key,
- const d3d11::BlendState **outBlendState)
-{
- auto keyIter = mBlendStateCache.Get(key);
- if (keyIter != mBlendStateCache.end())
- {
- *outBlendState = &keyIter->second;
- return gl::NoError();
- }
-
- TrimCache(kMaxStates, kGCLimit, "blend state", &mBlendStateCache);
-
- // Create a new blend state and insert it into the cache
- D3D11_BLEND_DESC blendDesc;
- D3D11_RENDER_TARGET_BLEND_DESC &rtDesc0 = blendDesc.RenderTarget[0];
- const gl::BlendState &blendState = key.blendState;
-
- blendDesc.AlphaToCoverageEnable = blendState.sampleAlphaToCoverage;
- blendDesc.IndependentBlendEnable = key.rtvMax > 1 ? TRUE : FALSE;
-
- rtDesc0 = {};
-
- if (blendState.blend)
- {
- rtDesc0.BlendEnable = true;
- rtDesc0.SrcBlend = gl_d3d11::ConvertBlendFunc(blendState.sourceBlendRGB, false);
- rtDesc0.DestBlend = gl_d3d11::ConvertBlendFunc(blendState.destBlendRGB, false);
- rtDesc0.BlendOp = gl_d3d11::ConvertBlendOp(blendState.blendEquationRGB);
- rtDesc0.SrcBlendAlpha = gl_d3d11::ConvertBlendFunc(blendState.sourceBlendAlpha, true);
- rtDesc0.DestBlendAlpha = gl_d3d11::ConvertBlendFunc(blendState.destBlendAlpha, true);
- rtDesc0.BlendOpAlpha = gl_d3d11::ConvertBlendOp(blendState.blendEquationAlpha);
- }
-
- rtDesc0.RenderTargetWriteMask = key.rtvMasks[0];
-
- for (unsigned int i = 1; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; i++)
- {
- blendDesc.RenderTarget[i] = rtDesc0;
- blendDesc.RenderTarget[i].RenderTargetWriteMask = key.rtvMasks[i];
- }
-
- d3d11::BlendState d3dBlendState;
- ANGLE_TRY(renderer->allocateResource(blendDesc, &d3dBlendState));
- const auto &iter = mBlendStateCache.Put(key, std::move(d3dBlendState));
-
- *outBlendState = &iter->second;
-
- return gl::NoError();
-}
-
-gl::Error RenderStateCache::getRasterizerState(Renderer11 *renderer,
- const gl::RasterizerState &rasterState,
- bool scissorEnabled,
- ID3D11RasterizerState **outRasterizerState)
-{
- d3d11::RasterizerStateKey key;
- key.rasterizerState = rasterState;
- key.scissorEnabled = scissorEnabled ? 1 : 0;
-
- auto keyIter = mRasterizerStateCache.Get(key);
- if (keyIter != mRasterizerStateCache.end())
- {
- *outRasterizerState = keyIter->second.get();
- return gl::NoError();
- }
-
- TrimCache(kMaxStates, kGCLimit, "rasterizer state", &mRasterizerStateCache);
-
- D3D11_CULL_MODE cullMode =
- gl_d3d11::ConvertCullMode(rasterState.cullFace, rasterState.cullMode);
-
- // Disable culling if drawing points
- if (rasterState.pointDrawMode)
- {
- cullMode = D3D11_CULL_NONE;
- }
-
- D3D11_RASTERIZER_DESC rasterDesc;
- rasterDesc.FillMode = D3D11_FILL_SOLID;
- rasterDesc.CullMode = cullMode;
- rasterDesc.FrontCounterClockwise = (rasterState.frontFace == GL_CCW) ? FALSE : TRUE;
- rasterDesc.DepthBiasClamp = 0.0f; // MSDN documentation of DepthBiasClamp implies a value of
- // zero will preform no clamping, must be tested though.
- rasterDesc.DepthClipEnable = TRUE;
- rasterDesc.ScissorEnable = scissorEnabled ? TRUE : FALSE;
- rasterDesc.MultisampleEnable = rasterState.multiSample;
- rasterDesc.AntialiasedLineEnable = FALSE;
-
- if (rasterState.polygonOffsetFill)
- {
- rasterDesc.SlopeScaledDepthBias = rasterState.polygonOffsetFactor;
- rasterDesc.DepthBias = (INT)rasterState.polygonOffsetUnits;
- }
- else
- {
- rasterDesc.SlopeScaledDepthBias = 0.0f;
- rasterDesc.DepthBias = 0;
- }
-
- d3d11::RasterizerState dx11RasterizerState;
- ANGLE_TRY(renderer->allocateResource(rasterDesc, &dx11RasterizerState));
- *outRasterizerState = dx11RasterizerState.get();
- mRasterizerStateCache.Put(key, std::move(dx11RasterizerState));
-
- return gl::NoError();
-}
-
-gl::Error RenderStateCache::getDepthStencilState(Renderer11 *renderer,
- const gl::DepthStencilState &glState,
- const d3d11::DepthStencilState **outDSState)
-{
- auto keyIter = mDepthStencilStateCache.Get(glState);
- if (keyIter != mDepthStencilStateCache.end())
- {
- *outDSState = &keyIter->second;
- return gl::NoError();
- }
-
- TrimCache(kMaxStates, kGCLimit, "depth stencil state", &mDepthStencilStateCache);
-
- D3D11_DEPTH_STENCIL_DESC dsDesc = {0};
- dsDesc.DepthEnable = glState.depthTest ? TRUE : FALSE;
- dsDesc.DepthWriteMask = ConvertDepthMask(glState.depthMask);
- dsDesc.DepthFunc = ConvertComparison(glState.depthFunc);
- dsDesc.StencilEnable = glState.stencilTest ? TRUE : FALSE;
- dsDesc.StencilReadMask = ConvertStencilMask(glState.stencilMask);
- dsDesc.StencilWriteMask = ConvertStencilMask(glState.stencilWritemask);
- dsDesc.FrontFace.StencilFailOp = ConvertStencilOp(glState.stencilFail);
- dsDesc.FrontFace.StencilDepthFailOp = ConvertStencilOp(glState.stencilPassDepthFail);
- dsDesc.FrontFace.StencilPassOp = ConvertStencilOp(glState.stencilPassDepthPass);
- dsDesc.FrontFace.StencilFunc = ConvertComparison(glState.stencilFunc);
- dsDesc.BackFace.StencilFailOp = ConvertStencilOp(glState.stencilBackFail);
- dsDesc.BackFace.StencilDepthFailOp = ConvertStencilOp(glState.stencilBackPassDepthFail);
- dsDesc.BackFace.StencilPassOp = ConvertStencilOp(glState.stencilBackPassDepthPass);
- dsDesc.BackFace.StencilFunc = ConvertComparison(glState.stencilBackFunc);
-
- d3d11::DepthStencilState dx11DepthStencilState;
- ANGLE_TRY(renderer->allocateResource(dsDesc, &dx11DepthStencilState));
- const auto &iter = mDepthStencilStateCache.Put(glState, std::move(dx11DepthStencilState));
-
- *outDSState = &iter->second;
-
- return gl::NoError();
-}
-
-gl::Error RenderStateCache::getSamplerState(Renderer11 *renderer,
- const gl::SamplerState &samplerState,
- ID3D11SamplerState **outSamplerState)
-{
- auto keyIter = mSamplerStateCache.Get(samplerState);
- if (keyIter != mSamplerStateCache.end())
- {
- *outSamplerState = keyIter->second.get();
- return gl::NoError();
- }
-
- TrimCache(kMaxStates, kGCLimit, "sampler state", &mSamplerStateCache);
-
- const auto &featureLevel = renderer->getRenderer11DeviceCaps().featureLevel;
-
- D3D11_SAMPLER_DESC samplerDesc;
- samplerDesc.Filter =
- gl_d3d11::ConvertFilter(samplerState.minFilter, samplerState.magFilter,
- samplerState.maxAnisotropy, samplerState.compareMode);
- samplerDesc.AddressU = gl_d3d11::ConvertTextureWrap(samplerState.wrapS);
- samplerDesc.AddressV = gl_d3d11::ConvertTextureWrap(samplerState.wrapT);
- samplerDesc.AddressW = gl_d3d11::ConvertTextureWrap(samplerState.wrapR);
- samplerDesc.MipLODBias = 0;
- samplerDesc.MaxAnisotropy =
- gl_d3d11::ConvertMaxAnisotropy(samplerState.maxAnisotropy, featureLevel);
- samplerDesc.ComparisonFunc = gl_d3d11::ConvertComparison(samplerState.compareFunc);
- samplerDesc.BorderColor[0] = 0.0f;
- samplerDesc.BorderColor[1] = 0.0f;
- samplerDesc.BorderColor[2] = 0.0f;
- samplerDesc.BorderColor[3] = 0.0f;
- samplerDesc.MinLOD = samplerState.minLod;
- samplerDesc.MaxLOD = samplerState.maxLod;
-
- if (featureLevel <= D3D_FEATURE_LEVEL_9_3)
- {
- // Check that maxLOD is nearly FLT_MAX (1000.0f is the default), since 9_3 doesn't support
- // anything other than FLT_MAX. Note that Feature Level 9_* only supports GL ES 2.0, so the
- // consumer of ANGLE can't modify the Max LOD themselves.
- ASSERT(samplerState.maxLod >= 999.9f);
-
- // Now just set MaxLOD to FLT_MAX. Other parts of the renderer (e.g. the non-zero max LOD
- // workaround) should take account of this.
- samplerDesc.MaxLOD = FLT_MAX;
- }
-
- d3d11::SamplerState dx11SamplerState;
- ANGLE_TRY(renderer->allocateResource(samplerDesc, &dx11SamplerState));
- *outSamplerState = dx11SamplerState.get();
- mSamplerStateCache.Put(samplerState, std::move(dx11SamplerState));
-
- return gl::NoError();
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.h
deleted file mode 100644
index 7501e83fc4..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.h
+++ /dev/null
@@ -1,123 +0,0 @@
-//
-// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// RenderStateCache.h: Defines rx::RenderStateCache, a cache of Direct3D render
-// state objects.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_RENDERSTATECACHE_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_RENDERSTATECACHE_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/SizedMRUCache.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-
-#include <unordered_map>
-
-namespace gl
-{
-class Framebuffer;
-}
-
-namespace std
-{
-template <>
-struct hash<rx::d3d11::BlendStateKey>
-{
- size_t operator()(const rx::d3d11::BlendStateKey &key) const
- {
- return angle::ComputeGenericHash(key);
- }
-};
-
-template <>
-struct hash<rx::d3d11::RasterizerStateKey>
-{
- size_t operator()(const rx::d3d11::RasterizerStateKey &key) const
- {
- return angle::ComputeGenericHash(key);
- }
-};
-
-template <>
-struct hash<gl::DepthStencilState>
-{
- size_t operator()(const gl::DepthStencilState &key) const
- {
- return angle::ComputeGenericHash(key);
- }
-};
-
-template <>
-struct hash<gl::SamplerState>
-{
- size_t operator()(const gl::SamplerState &key) const { return angle::ComputeGenericHash(key); }
-};
-} // namespace std
-
-namespace rx
-{
-class Renderer11;
-
-class RenderStateCache : angle::NonCopyable
-{
- public:
- RenderStateCache();
- virtual ~RenderStateCache();
-
- void clear();
-
- static d3d11::BlendStateKey GetBlendStateKey(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::BlendState &blendState);
- gl::Error getBlendState(Renderer11 *renderer,
- const d3d11::BlendStateKey &key,
- const d3d11::BlendState **outBlendState);
- gl::Error getRasterizerState(Renderer11 *renderer,
- const gl::RasterizerState &rasterState,
- bool scissorEnabled,
- ID3D11RasterizerState **outRasterizerState);
- gl::Error getDepthStencilState(Renderer11 *renderer,
- const gl::DepthStencilState &dsState,
- const d3d11::DepthStencilState **outDSState);
- gl::Error getSamplerState(Renderer11 *renderer,
- const gl::SamplerState &samplerState,
- ID3D11SamplerState **outSamplerState);
-
- private:
- // MSDN's documentation of ID3D11Device::CreateBlendState, ID3D11Device::CreateRasterizerState,
- // ID3D11Device::CreateDepthStencilState and ID3D11Device::CreateSamplerState claims the maximum
- // number of unique states of each type an application can create is 4096
- // TODO(ShahmeerEsmail): Revisit the cache sizes to make sure they are appropriate for most
- // scenarios.
- static constexpr unsigned int kMaxStates = 4096;
-
- // The cache tries to clean up this many states at once.
- static constexpr unsigned int kGCLimit = 128;
-
- // Blend state cache
- using BlendStateMap = angle::base::HashingMRUCache<d3d11::BlendStateKey, d3d11::BlendState>;
- BlendStateMap mBlendStateCache;
-
- // Rasterizer state cache
- using RasterizerStateMap =
- angle::base::HashingMRUCache<d3d11::RasterizerStateKey, d3d11::RasterizerState>;
- RasterizerStateMap mRasterizerStateCache;
-
- // Depth stencil state cache
- using DepthStencilStateMap =
- angle::base::HashingMRUCache<gl::DepthStencilState, d3d11::DepthStencilState>;
- DepthStencilStateMap mDepthStencilStateCache;
-
- // Sample state cache
- using SamplerStateMap = angle::base::HashingMRUCache<gl::SamplerState, d3d11::SamplerState>;
- SamplerStateMap mSamplerStateCache;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_RENDERSTATECACHE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp
deleted file mode 100644
index 594a382a72..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp
+++ /dev/null
@@ -1,405 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// RenderTarget11.cpp: Implements a DX11-specific wrapper for ID3D11View pointers
-// retained by Renderbuffers.
-
-#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h"
-
-#include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-#include "libANGLE/renderer/d3d/d3d11/SwapChain11.h"
-#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h"
-
-namespace rx
-{
-
-namespace
-{
-bool GetTextureProperties(ID3D11Resource *resource, unsigned int *mipLevels, unsigned int *samples)
-{
- ID3D11Texture1D *texture1D = d3d11::DynamicCastComObject<ID3D11Texture1D>(resource);
- if (texture1D)
- {
- D3D11_TEXTURE1D_DESC texDesc;
- texture1D->GetDesc(&texDesc);
- SafeRelease(texture1D);
-
- *mipLevels = texDesc.MipLevels;
- *samples = 0;
-
- return true;
- }
-
- ID3D11Texture2D *texture2D = d3d11::DynamicCastComObject<ID3D11Texture2D>(resource);
- if (texture2D)
- {
- D3D11_TEXTURE2D_DESC texDesc;
- texture2D->GetDesc(&texDesc);
- SafeRelease(texture2D);
-
- *mipLevels = texDesc.MipLevels;
- *samples = texDesc.SampleDesc.Count > 1 ? texDesc.SampleDesc.Count : 0;
-
- return true;
- }
-
- ID3D11Texture3D *texture3D = d3d11::DynamicCastComObject<ID3D11Texture3D>(resource);
- if (texture3D)
- {
- D3D11_TEXTURE3D_DESC texDesc;
- texture3D->GetDesc(&texDesc);
- SafeRelease(texture3D);
-
- *mipLevels = texDesc.MipLevels;
- *samples = 0;
-
- return true;
- }
-
- return false;
-}
-
-unsigned int GetRTVSubresourceIndex(ID3D11Resource *resource, ID3D11RenderTargetView *view)
-{
- D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
- view->GetDesc(&rtvDesc);
-
- unsigned int mipSlice = 0;
- unsigned int arraySlice = 0;
-
- switch (rtvDesc.ViewDimension)
- {
- case D3D11_RTV_DIMENSION_TEXTURE1D:
- mipSlice = rtvDesc.Texture1D.MipSlice;
- arraySlice = 0;
- break;
-
- case D3D11_RTV_DIMENSION_TEXTURE1DARRAY:
- mipSlice = rtvDesc.Texture1DArray.MipSlice;
- arraySlice = rtvDesc.Texture1DArray.FirstArraySlice;
- break;
-
- case D3D11_RTV_DIMENSION_TEXTURE2D:
- mipSlice = rtvDesc.Texture2D.MipSlice;
- arraySlice = 0;
- break;
-
- case D3D11_RTV_DIMENSION_TEXTURE2DARRAY:
- mipSlice = rtvDesc.Texture2DArray.MipSlice;
- arraySlice = rtvDesc.Texture2DArray.FirstArraySlice;
- break;
-
- case D3D11_RTV_DIMENSION_TEXTURE2DMS:
- mipSlice = 0;
- arraySlice = 0;
- break;
-
- case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY:
- mipSlice = 0;
- arraySlice = rtvDesc.Texture2DMSArray.FirstArraySlice;
- break;
-
- case D3D11_RTV_DIMENSION_TEXTURE3D:
- mipSlice = rtvDesc.Texture3D.MipSlice;
- arraySlice = 0;
- break;
-
- case D3D11_RTV_DIMENSION_UNKNOWN:
- case D3D11_RTV_DIMENSION_BUFFER:
- UNIMPLEMENTED();
- break;
-
- default:
- UNREACHABLE();
- break;
- }
-
- unsigned int mipLevels, samples;
- GetTextureProperties(resource, &mipLevels, &samples);
-
- return D3D11CalcSubresource(mipSlice, arraySlice, mipLevels);
-}
-
-unsigned int GetDSVSubresourceIndex(ID3D11Resource *resource, ID3D11DepthStencilView *view)
-{
- D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
- view->GetDesc(&dsvDesc);
-
- unsigned int mipSlice = 0;
- unsigned int arraySlice = 0;
-
- switch (dsvDesc.ViewDimension)
- {
- case D3D11_DSV_DIMENSION_TEXTURE1D:
- mipSlice = dsvDesc.Texture1D.MipSlice;
- arraySlice = 0;
- break;
-
- case D3D11_DSV_DIMENSION_TEXTURE1DARRAY:
- mipSlice = dsvDesc.Texture1DArray.MipSlice;
- arraySlice = dsvDesc.Texture1DArray.FirstArraySlice;
- break;
-
- case D3D11_DSV_DIMENSION_TEXTURE2D:
- mipSlice = dsvDesc.Texture2D.MipSlice;
- arraySlice = 0;
- break;
-
- case D3D11_DSV_DIMENSION_TEXTURE2DARRAY:
- mipSlice = dsvDesc.Texture2DArray.MipSlice;
- arraySlice = dsvDesc.Texture2DArray.FirstArraySlice;
- break;
-
- case D3D11_DSV_DIMENSION_TEXTURE2DMS:
- mipSlice = 0;
- arraySlice = 0;
- break;
-
- case D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY:
- mipSlice = 0;
- arraySlice = dsvDesc.Texture2DMSArray.FirstArraySlice;
- break;
-
- case D3D11_DSV_DIMENSION_UNKNOWN:
- UNIMPLEMENTED();
- break;
-
- default:
- UNREACHABLE();
- break;
- }
-
- unsigned int mipLevels, samples;
- GetTextureProperties(resource, &mipLevels, &samples);
-
- return D3D11CalcSubresource(mipSlice, arraySlice, mipLevels);
-}
-
-GLenum GetSurfaceRTFormat(bool depth, SwapChain11 *swapChain)
-{
- return (depth ? swapChain->getDepthBufferInternalFormat()
- : swapChain->getRenderTargetInternalFormat());
-}
-
-const d3d11::Format &GetSurfaceFormatSet(bool depth, SwapChain11 *swapChain, Renderer11 *renderer)
-{
- return d3d11::Format::Get(GetSurfaceRTFormat(depth, swapChain),
- renderer->getRenderer11DeviceCaps());
-}
-
-} // anonymous namespace
-
-RenderTarget11::RenderTarget11(const d3d11::Format &formatSet) : mFormatSet(formatSet)
-{
-}
-
-RenderTarget11::~RenderTarget11()
-{
- ASSERT(mBroadcastChannel.empty());
-}
-
-void RenderTarget11::signalDirty(const gl::Context *context)
-{
- mBroadcastChannel.signal(context);
-
- // Clear the list. We can't do this in the receiver because it would mutate during iteration.
- mBroadcastChannel.reset();
-}
-
-TextureRenderTarget11::TextureRenderTarget11(d3d11::RenderTargetView &&rtv,
- const TextureHelper11 &resource,
- const d3d11::SharedSRV &srv,
- const d3d11::SharedSRV &blitSRV,
- GLenum internalFormat,
- const d3d11::Format &formatSet,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLsizei samples)
- : RenderTarget11(formatSet),
- mWidth(width),
- mHeight(height),
- mDepth(depth),
- mInternalFormat(internalFormat),
- mSamples(samples),
- mSubresourceIndex(0),
- mTexture(resource),
- mRenderTarget(std::move(rtv)),
- mDepthStencil(),
- mShaderResource(srv.makeCopy()),
- mBlitShaderResource(blitSRV.makeCopy())
-{
- if (mRenderTarget.valid() && mTexture.valid())
- {
- mSubresourceIndex = GetRTVSubresourceIndex(mTexture.get(), mRenderTarget.get());
- }
- ASSERT(mFormatSet.formatID != angle::Format::ID::NONE || mWidth == 0 || mHeight == 0);
-}
-
-TextureRenderTarget11::TextureRenderTarget11(d3d11::DepthStencilView &&dsv,
- const TextureHelper11 &resource,
- const d3d11::SharedSRV &srv,
- GLenum internalFormat,
- const d3d11::Format &formatSet,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLsizei samples)
- : RenderTarget11(formatSet),
- mWidth(width),
- mHeight(height),
- mDepth(depth),
- mInternalFormat(internalFormat),
- mSamples(samples),
- mSubresourceIndex(0),
- mTexture(resource),
- mRenderTarget(),
- mDepthStencil(std::move(dsv)),
- mShaderResource(srv.makeCopy()),
- mBlitShaderResource()
-{
- if (mDepthStencil.valid() && mTexture.valid())
- {
- mSubresourceIndex = GetDSVSubresourceIndex(mTexture.get(), mDepthStencil.get());
- }
- ASSERT(mFormatSet.formatID != angle::Format::ID::NONE || mWidth == 0 || mHeight == 0);
-}
-
-TextureRenderTarget11::~TextureRenderTarget11()
-{
-}
-
-const TextureHelper11 &TextureRenderTarget11::getTexture() const
-{
- return mTexture;
-}
-
-const d3d11::RenderTargetView &TextureRenderTarget11::getRenderTargetView() const
-{
- return mRenderTarget;
-}
-
-const d3d11::DepthStencilView &TextureRenderTarget11::getDepthStencilView() const
-{
- return mDepthStencil;
-}
-
-const d3d11::SharedSRV &TextureRenderTarget11::getShaderResourceView() const
-{
- return mShaderResource;
-}
-
-const d3d11::SharedSRV &TextureRenderTarget11::getBlitShaderResourceView() const
-{
- return mBlitShaderResource;
-}
-
-GLsizei TextureRenderTarget11::getWidth() const
-{
- return mWidth;
-}
-
-GLsizei TextureRenderTarget11::getHeight() const
-{
- return mHeight;
-}
-
-GLsizei TextureRenderTarget11::getDepth() const
-{
- return mDepth;
-}
-
-GLenum TextureRenderTarget11::getInternalFormat() const
-{
- return mInternalFormat;
-}
-
-GLsizei TextureRenderTarget11::getSamples() const
-{
- return mSamples;
-}
-
-unsigned int TextureRenderTarget11::getSubresourceIndex() const
-{
- return mSubresourceIndex;
-}
-
-SurfaceRenderTarget11::SurfaceRenderTarget11(SwapChain11 *swapChain,
- Renderer11 *renderer,
- bool depth)
- : RenderTarget11(GetSurfaceFormatSet(depth, swapChain, renderer)),
- mSwapChain(swapChain),
- mDepth(depth)
-{
- ASSERT(mSwapChain);
-}
-
-SurfaceRenderTarget11::~SurfaceRenderTarget11()
-{
-}
-
-GLsizei SurfaceRenderTarget11::getWidth() const
-{
- return mSwapChain->getWidth();
-}
-
-GLsizei SurfaceRenderTarget11::getHeight() const
-{
- return mSwapChain->getHeight();
-}
-
-GLsizei SurfaceRenderTarget11::getDepth() const
-{
- return 1;
-}
-
-GLenum SurfaceRenderTarget11::getInternalFormat() const
-{
- return GetSurfaceRTFormat(mDepth, mSwapChain);
-}
-
-GLsizei SurfaceRenderTarget11::getSamples() const
-{
- return mSwapChain->getSamples();
-}
-
-const TextureHelper11 &SurfaceRenderTarget11::getTexture() const
-{
- return (mDepth ? mSwapChain->getDepthStencilTexture() : mSwapChain->getOffscreenTexture());
-}
-
-const d3d11::RenderTargetView &SurfaceRenderTarget11::getRenderTargetView() const
-{
- ASSERT(!mDepth);
- return mSwapChain->getRenderTarget();
-}
-
-const d3d11::DepthStencilView &SurfaceRenderTarget11::getDepthStencilView() const
-{
- ASSERT(mDepth);
- return mSwapChain->getDepthStencil();
-}
-
-const d3d11::SharedSRV &SurfaceRenderTarget11::getShaderResourceView() const
-{
- return (mDepth ? mSwapChain->getDepthStencilShaderResource()
- : mSwapChain->getRenderTargetShaderResource());
-}
-
-const d3d11::SharedSRV &SurfaceRenderTarget11::getBlitShaderResourceView() const
-{
- // The SurfaceRenderTargetView format should always be such that the normal SRV works for blits.
- return getShaderResourceView();
-}
-
-unsigned int SurfaceRenderTarget11::getSubresourceIndex() const
-{
- return 0;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.h
deleted file mode 100644
index db49cac9f5..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.h
+++ /dev/null
@@ -1,131 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// RenderTarget11.h: Defines a DX11-specific wrapper for ID3D11View pointers
-// retained by Renderbuffers.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_RENDERTARGET11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_RENDERTARGET11_H_
-
-#include "libANGLE/renderer/d3d/RenderTargetD3D.h"
-#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h"
-
-namespace rx
-{
-class SwapChain11;
-class Renderer11;
-
-class RenderTarget11 : public RenderTargetD3D
-{
- public:
- RenderTarget11(const d3d11::Format &formatSet);
- ~RenderTarget11() override;
-
- virtual const TextureHelper11 &getTexture() const = 0;
- virtual const d3d11::RenderTargetView &getRenderTargetView() const = 0;
- virtual const d3d11::DepthStencilView &getDepthStencilView() const = 0;
- virtual const d3d11::SharedSRV &getShaderResourceView() const = 0;
- virtual const d3d11::SharedSRV &getBlitShaderResourceView() const = 0;
-
- virtual unsigned int getSubresourceIndex() const = 0;
-
- void signalDirty(const gl::Context *context) override;
- OnRenderTargetDirtyChannel *getBroadcastChannel() { return &mBroadcastChannel; }
-
- const d3d11::Format &getFormatSet() const { return mFormatSet; }
-
- protected:
- OnRenderTargetDirtyChannel mBroadcastChannel;
- const d3d11::Format &mFormatSet;
-};
-
-class TextureRenderTarget11 : public RenderTarget11
-{
- public:
- // TextureRenderTarget11 takes ownership of any D3D11 resources it is given and will AddRef them
- TextureRenderTarget11(d3d11::RenderTargetView &&rtv,
- const TextureHelper11 &resource,
- const d3d11::SharedSRV &srv,
- const d3d11::SharedSRV &blitSRV,
- GLenum internalFormat,
- const d3d11::Format &formatSet,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLsizei samples);
- TextureRenderTarget11(d3d11::DepthStencilView &&dsv,
- const TextureHelper11 &resource,
- const d3d11::SharedSRV &srv,
- GLenum internalFormat,
- const d3d11::Format &formatSet,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLsizei samples);
- ~TextureRenderTarget11() override;
-
- GLsizei getWidth() const override;
- GLsizei getHeight() const override;
- GLsizei getDepth() const override;
- GLenum getInternalFormat() const override;
- GLsizei getSamples() const override;
-
- const TextureHelper11 &getTexture() const override;
- const d3d11::RenderTargetView &getRenderTargetView() const override;
- const d3d11::DepthStencilView &getDepthStencilView() const override;
- const d3d11::SharedSRV &getShaderResourceView() const override;
- const d3d11::SharedSRV &getBlitShaderResourceView() const override;
-
- unsigned int getSubresourceIndex() const override;
-
- private:
- GLsizei mWidth;
- GLsizei mHeight;
- GLsizei mDepth;
- GLenum mInternalFormat;
- GLsizei mSamples;
-
- unsigned int mSubresourceIndex;
- TextureHelper11 mTexture;
- d3d11::RenderTargetView mRenderTarget;
- d3d11::DepthStencilView mDepthStencil;
- d3d11::SharedSRV mShaderResource;
-
- // Shader resource view to use with internal blit shaders. Not set for depth/stencil render
- // targets.
- d3d11::SharedSRV mBlitShaderResource;
-};
-
-class SurfaceRenderTarget11 : public RenderTarget11
-{
- public:
- SurfaceRenderTarget11(SwapChain11 *swapChain, Renderer11 *renderer, bool depth);
- ~SurfaceRenderTarget11() override;
-
- GLsizei getWidth() const override;
- GLsizei getHeight() const override;
- GLsizei getDepth() const override;
- GLenum getInternalFormat() const override;
- GLsizei getSamples() const override;
-
- const TextureHelper11 &getTexture() const override;
- const d3d11::RenderTargetView &getRenderTargetView() const override;
- const d3d11::DepthStencilView &getDepthStencilView() const override;
- const d3d11::SharedSRV &getShaderResourceView() const override;
- const d3d11::SharedSRV &getBlitShaderResourceView() const override;
-
- unsigned int getSubresourceIndex() const override;
-
- private:
- SwapChain11 *mSwapChain;
- bool mDepth;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_RENDERTARGET11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
deleted file mode 100644
index b0ef9abddc..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
+++ /dev/null
@@ -1,4089 +0,0 @@
-//
-// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Renderer11.cpp: Implements a back-end specific class for the D3D11 renderer.
-
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-
-#include <EGL/eglext.h>
-#include <versionhelpers.h>
-#include <sstream>
-
-#include "common/tls.h"
-#include "common/utilities.h"
-#include "libANGLE/Buffer.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Display.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/State.h"
-#include "libANGLE/Surface.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/histogram_macros.h"
-#include "libANGLE/renderer/d3d/CompilerD3D.h"
-#include "libANGLE/renderer/d3d/DeviceD3D.h"
-#include "libANGLE/renderer/d3d/DisplayD3D.h"
-#include "libANGLE/renderer/d3d/FramebufferD3D.h"
-#include "libANGLE/renderer/d3d/IndexDataManager.h"
-#include "libANGLE/renderer/d3d/ProgramD3D.h"
-#include "libANGLE/renderer/d3d/RenderbufferD3D.h"
-#include "libANGLE/renderer/d3d/ShaderD3D.h"
-#include "libANGLE/renderer/d3d/SurfaceD3D.h"
-#include "libANGLE/renderer/d3d/TextureD3D.h"
-#include "libANGLE/renderer/d3d/VertexDataManager.h"
-#include "libANGLE/renderer/d3d/d3d11/Blit11.h"
-#include "libANGLE/renderer/d3d/d3d11/Buffer11.h"
-#include "libANGLE/renderer/d3d/d3d11/Clear11.h"
-#include "libANGLE/renderer/d3d/d3d11/Context11.h"
-#include "libANGLE/renderer/d3d/d3d11/Fence11.h"
-#include "libANGLE/renderer/d3d/d3d11/Framebuffer11.h"
-#include "libANGLE/renderer/d3d/d3d11/Image11.h"
-#include "libANGLE/renderer/d3d/d3d11/IndexBuffer11.h"
-#include "libANGLE/renderer/d3d/d3d11/PixelTransfer11.h"
-#include "libANGLE/renderer/d3d/d3d11/Query11.h"
-#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h"
-#include "libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h"
-#include "libANGLE/renderer/d3d/d3d11/StreamProducerNV12.h"
-#include "libANGLE/renderer/d3d/d3d11/SwapChain11.h"
-#include "libANGLE/renderer/d3d/d3d11/TextureStorage11.h"
-#include "libANGLE/renderer/d3d/d3d11/TransformFeedback11.h"
-#include "libANGLE/renderer/d3d/d3d11/Trim11.h"
-#include "libANGLE/renderer/d3d/d3d11/VertexArray11.h"
-#include "libANGLE/renderer/d3d/d3d11/VertexBuffer11.h"
-#include "libANGLE/renderer/d3d/d3d11/dxgi_support_table.h"
-#include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h"
-#include "libANGLE/renderer/renderer_utils.h"
-#include "third_party/trace_event/trace_event.h"
-
-#ifdef ANGLE_ENABLE_WINDOWS_STORE
-#include "libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h"
-#else
-#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
-#define ANGLE_SKIP_DXGI_1_2_CHECK 0
-#endif
-
-namespace rx
-{
-
-namespace
-{
-
-enum
-{
- MAX_TEXTURE_IMAGE_UNITS_VTF_SM4 = 16
-};
-
-enum ANGLEFeatureLevel
-{
- ANGLE_FEATURE_LEVEL_INVALID,
- ANGLE_FEATURE_LEVEL_9_3,
- ANGLE_FEATURE_LEVEL_10_0,
- ANGLE_FEATURE_LEVEL_10_1,
- ANGLE_FEATURE_LEVEL_11_0,
- ANGLE_FEATURE_LEVEL_11_1,
- NUM_ANGLE_FEATURE_LEVELS
-};
-
-ANGLEFeatureLevel GetANGLEFeatureLevel(D3D_FEATURE_LEVEL d3dFeatureLevel)
-{
- switch (d3dFeatureLevel)
- {
- case D3D_FEATURE_LEVEL_9_3:
- return ANGLE_FEATURE_LEVEL_9_3;
- case D3D_FEATURE_LEVEL_10_0:
- return ANGLE_FEATURE_LEVEL_10_0;
- case D3D_FEATURE_LEVEL_10_1:
- return ANGLE_FEATURE_LEVEL_10_1;
- case D3D_FEATURE_LEVEL_11_0:
- return ANGLE_FEATURE_LEVEL_11_0;
- case D3D_FEATURE_LEVEL_11_1:
- return ANGLE_FEATURE_LEVEL_11_1;
- default:
- return ANGLE_FEATURE_LEVEL_INVALID;
- }
-}
-
-void SetLineLoopIndices(GLuint *dest, size_t count)
-{
- for (size_t i = 0; i < count; i++)
- {
- dest[i] = static_cast<GLuint>(i);
- }
- dest[count] = 0;
-}
-
-template <typename T>
-void CopyLineLoopIndices(const void *indices, GLuint *dest, size_t count)
-{
- const T *srcPtr = static_cast<const T *>(indices);
- for (size_t i = 0; i < count; ++i)
- {
- dest[i] = static_cast<GLuint>(srcPtr[i]);
- }
- dest[count] = static_cast<GLuint>(srcPtr[0]);
-}
-
-void SetTriangleFanIndices(GLuint *destPtr, size_t numTris)
-{
- for (size_t i = 0; i < numTris; i++)
- {
- destPtr[i * 3 + 0] = 0;
- destPtr[i * 3 + 1] = static_cast<GLuint>(i) + 1;
- destPtr[i * 3 + 2] = static_cast<GLuint>(i) + 2;
- }
-}
-
-template <typename T>
-void CopyLineLoopIndicesWithRestart(const void *indices,
- size_t count,
- GLenum indexType,
- std::vector<GLuint> *bufferOut)
-{
- GLuint restartIndex = gl::GetPrimitiveRestartIndex(indexType);
- GLuint d3dRestartIndex = static_cast<GLuint>(d3d11::GetPrimitiveRestartIndex());
- const T *srcPtr = static_cast<const T *>(indices);
- Optional<GLuint> currentLoopStart;
-
- bufferOut->clear();
-
- for (size_t indexIdx = 0; indexIdx < count; ++indexIdx)
- {
- GLuint value = static_cast<GLuint>(srcPtr[indexIdx]);
-
- if (value == restartIndex)
- {
- if (currentLoopStart.valid())
- {
- bufferOut->push_back(currentLoopStart.value());
- bufferOut->push_back(d3dRestartIndex);
- currentLoopStart.reset();
- }
- }
- else
- {
- bufferOut->push_back(value);
- if (!currentLoopStart.valid())
- {
- currentLoopStart = value;
- }
- }
- }
-
- if (currentLoopStart.valid())
- {
- bufferOut->push_back(currentLoopStart.value());
- }
-}
-
-void GetLineLoopIndices(const void *indices,
- GLenum indexType,
- GLuint count,
- bool usePrimitiveRestartFixedIndex,
- std::vector<GLuint> *bufferOut)
-{
- if (indexType != GL_NONE && usePrimitiveRestartFixedIndex)
- {
- switch (indexType)
- {
- case GL_UNSIGNED_BYTE:
- CopyLineLoopIndicesWithRestart<GLubyte>(indices, count, indexType, bufferOut);
- break;
- case GL_UNSIGNED_SHORT:
- CopyLineLoopIndicesWithRestart<GLushort>(indices, count, indexType, bufferOut);
- break;
- case GL_UNSIGNED_INT:
- CopyLineLoopIndicesWithRestart<GLuint>(indices, count, indexType, bufferOut);
- break;
- default:
- UNREACHABLE();
- break;
- }
- return;
- }
-
- // For non-primitive-restart draws, the index count is static.
- bufferOut->resize(static_cast<size_t>(count) + 1);
-
- switch (indexType)
- {
- // Non-indexed draw
- case GL_NONE:
- SetLineLoopIndices(&(*bufferOut)[0], count);
- break;
- case GL_UNSIGNED_BYTE:
- CopyLineLoopIndices<GLubyte>(indices, &(*bufferOut)[0], count);
- break;
- case GL_UNSIGNED_SHORT:
- CopyLineLoopIndices<GLushort>(indices, &(*bufferOut)[0], count);
- break;
- case GL_UNSIGNED_INT:
- CopyLineLoopIndices<GLuint>(indices, &(*bufferOut)[0], count);
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-template <typename T>
-void CopyTriangleFanIndices(const void *indices, GLuint *destPtr, size_t numTris)
-{
- const T *srcPtr = static_cast<const T *>(indices);
-
- for (size_t i = 0; i < numTris; i++)
- {
- destPtr[i * 3 + 0] = static_cast<GLuint>(srcPtr[0]);
- destPtr[i * 3 + 1] = static_cast<GLuint>(srcPtr[i + 1]);
- destPtr[i * 3 + 2] = static_cast<GLuint>(srcPtr[i + 2]);
- }
-}
-
-template <typename T>
-void CopyTriangleFanIndicesWithRestart(const void *indices,
- GLuint indexCount,
- GLenum indexType,
- std::vector<GLuint> *bufferOut)
-{
- GLuint restartIndex = gl::GetPrimitiveRestartIndex(indexType);
- GLuint d3dRestartIndex = gl::GetPrimitiveRestartIndex(GL_UNSIGNED_INT);
- const T *srcPtr = static_cast<const T *>(indices);
- Optional<GLuint> vertexA;
- Optional<GLuint> vertexB;
-
- bufferOut->clear();
-
- for (size_t indexIdx = 0; indexIdx < indexCount; ++indexIdx)
- {
- GLuint value = static_cast<GLuint>(srcPtr[indexIdx]);
-
- if (value == restartIndex)
- {
- bufferOut->push_back(d3dRestartIndex);
- vertexA.reset();
- vertexB.reset();
- }
- else
- {
- if (!vertexA.valid())
- {
- vertexA = value;
- }
- else if (!vertexB.valid())
- {
- vertexB = value;
- }
- else
- {
- bufferOut->push_back(vertexA.value());
- bufferOut->push_back(vertexB.value());
- bufferOut->push_back(value);
- vertexB = value;
- }
- }
- }
-}
-
-void GetTriFanIndices(const void *indices,
- GLenum indexType,
- GLuint count,
- bool usePrimitiveRestartFixedIndex,
- std::vector<GLuint> *bufferOut)
-{
- if (indexType != GL_NONE && usePrimitiveRestartFixedIndex)
- {
- switch (indexType)
- {
- case GL_UNSIGNED_BYTE:
- CopyTriangleFanIndicesWithRestart<GLubyte>(indices, count, indexType, bufferOut);
- break;
- case GL_UNSIGNED_SHORT:
- CopyTriangleFanIndicesWithRestart<GLushort>(indices, count, indexType, bufferOut);
- break;
- case GL_UNSIGNED_INT:
- CopyTriangleFanIndicesWithRestart<GLuint>(indices, count, indexType, bufferOut);
- break;
- default:
- UNREACHABLE();
- break;
- }
- return;
- }
-
- // For non-primitive-restart draws, the index count is static.
- GLuint numTris = count - 2;
- bufferOut->resize(numTris * 3);
-
- switch (indexType)
- {
- // Non-indexed draw
- case GL_NONE:
- SetTriangleFanIndices(&(*bufferOut)[0], numTris);
- break;
- case GL_UNSIGNED_BYTE:
- CopyTriangleFanIndices<GLubyte>(indices, &(*bufferOut)[0], numTris);
- break;
- case GL_UNSIGNED_SHORT:
- CopyTriangleFanIndices<GLushort>(indices, &(*bufferOut)[0], numTris);
- break;
- case GL_UNSIGNED_INT:
- CopyTriangleFanIndices<GLuint>(indices, &(*bufferOut)[0], numTris);
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-bool DrawCallNeedsTranslation(const gl::Context *context, GLenum mode)
-{
- const auto &glState = context->getGLState();
- const gl::VertexArray *vertexArray = glState.getVertexArray();
- VertexArray11 *vertexArray11 = GetImplAs<VertexArray11>(vertexArray);
- // Direct drawing doesn't support dynamic attribute storage since it needs the first and count
- // to translate when applyVertexBuffer. GL_LINE_LOOP and GL_TRIANGLE_FAN are not supported
- // either since we need to simulate them in D3D.
- if (vertexArray11->hasActiveDynamicAttrib(context) || mode == GL_LINE_LOOP ||
- mode == GL_TRIANGLE_FAN)
- {
- return true;
- }
-
- ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
- if (InstancedPointSpritesActive(programD3D, mode))
- {
- return true;
- }
-
- return false;
-}
-
-bool IsArrayRTV(ID3D11RenderTargetView *rtv)
-{
- D3D11_RENDER_TARGET_VIEW_DESC desc;
- rtv->GetDesc(&desc);
- if (desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE1DARRAY &&
- desc.Texture1DArray.ArraySize > 1)
- return true;
- if (desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE2DARRAY &&
- desc.Texture2DArray.ArraySize > 1)
- return true;
- if (desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY &&
- desc.Texture2DMSArray.ArraySize > 1)
- return true;
- return false;
-}
-
-int GetAdjustedInstanceCount(const gl::Program *program, int instanceCount)
-{
- if (!program->usesMultiview())
- {
- return instanceCount;
- }
- if (instanceCount == 0)
- {
- return program->getNumViews();
- }
- return program->getNumViews() * instanceCount;
-}
-
-const uint32_t ScratchMemoryBufferLifetime = 1000;
-
-void PopulateFormatDeviceCaps(ID3D11Device *device,
- DXGI_FORMAT format,
- UINT *outSupport,
- UINT *outMaxSamples)
-{
- if (FAILED(device->CheckFormatSupport(format, outSupport)))
- {
- *outSupport = 0;
- }
-
- *outMaxSamples = 0;
- for (UINT sampleCount = 2; sampleCount <= D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT; sampleCount *= 2)
- {
- UINT qualityCount = 0;
- if (FAILED(device->CheckMultisampleQualityLevels(format, sampleCount, &qualityCount)) ||
- qualityCount == 0)
- {
- break;
- }
-
- *outMaxSamples = sampleCount;
- }
-}
-
-bool CullsEverything(const gl::State &glState)
-{
- return (glState.getRasterizerState().cullFace &&
- glState.getRasterizerState().cullMode == gl::CullFaceMode::FrontAndBack);
-}
-
-} // anonymous namespace
-
-Renderer11DeviceCaps::Renderer11DeviceCaps() = default;
-
-Renderer11::Renderer11(egl::Display *display)
- : RendererD3D(display),
- mCreateDebugDevice(false),
- mStateCache(),
- mStateManager(this),
- mLastHistogramUpdateTime(
- ANGLEPlatformCurrent()->monotonicallyIncreasingTime(ANGLEPlatformCurrent())),
- mDebug(nullptr),
- mScratchMemoryBuffer(ScratchMemoryBufferLifetime),
- mAnnotator(nullptr)
-{
- mLineLoopIB = nullptr;
- mTriangleFanIB = nullptr;
-
- mBlit = nullptr;
- mPixelTransfer = nullptr;
-
- mClear = nullptr;
-
- mTrim = nullptr;
-
- mRenderer11DeviceCaps.supportsClearView = false;
- mRenderer11DeviceCaps.supportsConstantBufferOffsets = false;
- mRenderer11DeviceCaps.supportsVpRtIndexWriteFromVertexShader = false;
- mRenderer11DeviceCaps.supportsDXGI1_2 = false;
- mRenderer11DeviceCaps.B5G6R5support = 0;
- mRenderer11DeviceCaps.B4G4R4A4support = 0;
- mRenderer11DeviceCaps.B5G5R5A1support = 0;
-
- mD3d11Module = nullptr;
- mDxgiModule = nullptr;
- mDCompModule = nullptr;
- mCreatedWithDeviceEXT = false;
- mEGLDevice = nullptr;
-
- mDevice = nullptr;
- mDeviceContext = nullptr;
- mDeviceContext1 = nullptr;
- mDeviceContext3 = nullptr;
- mDxgiAdapter = nullptr;
- mDxgiFactory = nullptr;
-
- ZeroMemory(&mAdapterDescription, sizeof(mAdapterDescription));
-
- if (mDisplay->getPlatform() == EGL_PLATFORM_ANGLE_ANGLE)
- {
- const auto &attributes = mDisplay->getAttributeMap();
-
- EGLint requestedMajorVersion = static_cast<EGLint>(
- attributes.get(EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, EGL_DONT_CARE));
- EGLint requestedMinorVersion = static_cast<EGLint>(
- attributes.get(EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, EGL_DONT_CARE));
-
- if (requestedMajorVersion == EGL_DONT_CARE || requestedMajorVersion >= 11)
- {
- if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion >= 1)
- {
- // This could potentially lead to failed context creation if done on a system
- // without the platform update which installs DXGI 1.2. Currently, for Chrome users
- // D3D11 contexts are only created if the platform update is available, so this
- // should not cause any issues.
- mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_11_1);
- }
- if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion >= 0)
- {
- mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_11_0);
- }
- }
-
- if (requestedMajorVersion == EGL_DONT_CARE || requestedMajorVersion >= 10)
- {
- if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion >= 1)
- {
- mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_10_1);
- }
- if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion >= 0)
- {
- mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_10_0);
- }
- }
-
- if (requestedMajorVersion == 9 && requestedMinorVersion == 3)
- {
- if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion >= 3)
- {
- mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_9_3);
- }
-#if defined(ANGLE_ENABLE_WINDOWS_STORE)
- if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion >= 2)
- {
- mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_9_2);
- }
- if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion >= 1)
- {
- mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_9_1);
- }
-#endif
- }
-
- EGLint requestedDeviceType = static_cast<EGLint>(attributes.get(
- EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE));
- switch (requestedDeviceType)
- {
- case EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE:
- mRequestedDriverType = D3D_DRIVER_TYPE_HARDWARE;
- break;
-
- case EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE:
- mRequestedDriverType = D3D_DRIVER_TYPE_WARP;
- break;
-
- case EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE:
- mRequestedDriverType = D3D_DRIVER_TYPE_REFERENCE;
- break;
-
- case EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE:
- mRequestedDriverType = D3D_DRIVER_TYPE_NULL;
- break;
-
- default:
- UNREACHABLE();
- }
-
- 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);
-
- mCreateDebugDevice = ShouldUseDebugLayers(attributes);
- }
- else if (display->getPlatform() == EGL_PLATFORM_DEVICE_EXT)
- {
- mEGLDevice = GetImplAs<DeviceD3D>(display->getDevice());
- ASSERT(mEGLDevice != nullptr);
- mCreatedWithDeviceEXT = true;
-
- // Also set EGL_PLATFORM_ANGLE_ANGLE variables, in case they're used elsewhere in ANGLE
- // mAvailableFeatureLevels defaults to empty
- mRequestedDriverType = D3D_DRIVER_TYPE_UNKNOWN;
- mPresentPathFastEnabled = false;
- }
-
-// 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()
-{
- release();
-}
-
-#ifndef __d3d11_1_h__
-#define D3D11_MESSAGE_ID_DEVICE_DRAW_RENDERTARGETVIEW_NOT_SET ((D3D11_MESSAGE_ID)3146081)
-#endif
-
-egl::Error Renderer11::initialize()
-{
- HRESULT result = S_OK;
-
- ANGLE_TRY(initializeD3DDevice());
-
-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
-#if !ANGLE_SKIP_DXGI_1_2_CHECK
- {
- TRACE_EVENT0("gpu.angle", "Renderer11::initialize (DXGICheck)");
- // In order to create a swap chain for an HWND owned by another process, DXGI 1.2 is
- // required.
- // The easiest way to check is to query for a IDXGIDevice2.
- bool requireDXGI1_2 = false;
- HWND hwnd = WindowFromDC(mDisplay->getNativeDisplayId());
- if (hwnd)
- {
- DWORD currentProcessId = GetCurrentProcessId();
- DWORD wndProcessId;
- GetWindowThreadProcessId(hwnd, &wndProcessId);
- requireDXGI1_2 = (currentProcessId != wndProcessId);
- }
- else
- {
- requireDXGI1_2 = true;
- }
-
- if (requireDXGI1_2)
- {
- IDXGIDevice2 *dxgiDevice2 = nullptr;
- result = mDevice->QueryInterface(__uuidof(IDXGIDevice2), (void **)&dxgiDevice2);
- if (FAILED(result))
- {
- return egl::EglNotInitialized(D3D11_INIT_INCOMPATIBLE_DXGI)
- << "DXGI 1.2 required to present to HWNDs owned by another process.";
- }
- SafeRelease(dxgiDevice2);
- }
- }
-#endif
-#endif
-
- {
- TRACE_EVENT0("gpu.angle", "Renderer11::initialize (ComQueries)");
- // Cast the DeviceContext to a DeviceContext1 and DeviceContext3.
- // This could fail on Windows 7 without the Platform Update.
- // Don't error in this case- just don't use mDeviceContext1 or mDeviceContext3.
- mDeviceContext1 = d3d11::DynamicCastComObject<ID3D11DeviceContext1>(mDeviceContext);
- mDeviceContext3 = d3d11::DynamicCastComObject<ID3D11DeviceContext3>(mDeviceContext);
-
- IDXGIDevice *dxgiDevice = nullptr;
- result = mDevice->QueryInterface(__uuidof(IDXGIDevice), (void **)&dxgiDevice);
-
- if (FAILED(result))
- {
- return egl::EglNotInitialized(D3D11_INIT_OTHER_ERROR) << "Could not query DXGI device.";
- }
-
- result = dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void **)&mDxgiAdapter);
-
- if (FAILED(result))
- {
- return egl::EglNotInitialized(D3D11_INIT_OTHER_ERROR)
- << "Could not retrieve DXGI adapter";
- }
-
- SafeRelease(dxgiDevice);
-
- IDXGIAdapter2 *dxgiAdapter2 = d3d11::DynamicCastComObject<IDXGIAdapter2>(mDxgiAdapter);
-
- // On D3D_FEATURE_LEVEL_9_*, IDXGIAdapter::GetDesc returns "Software Adapter" for the
- // description string.
- // If DXGI1.2 is available then IDXGIAdapter2::GetDesc2 can be used to get the actual
- // hardware values.
- if (mRenderer11DeviceCaps.featureLevel <= D3D_FEATURE_LEVEL_9_3 && dxgiAdapter2 != nullptr)
- {
- DXGI_ADAPTER_DESC2 adapterDesc2 = {};
- result = dxgiAdapter2->GetDesc2(&adapterDesc2);
- if (SUCCEEDED(result))
- {
- // Copy the contents of the DXGI_ADAPTER_DESC2 into mAdapterDescription (a
- // DXGI_ADAPTER_DESC).
- memcpy(mAdapterDescription.Description, adapterDesc2.Description,
- sizeof(mAdapterDescription.Description));
- mAdapterDescription.VendorId = adapterDesc2.VendorId;
- mAdapterDescription.DeviceId = adapterDesc2.DeviceId;
- mAdapterDescription.SubSysId = adapterDesc2.SubSysId;
- mAdapterDescription.Revision = adapterDesc2.Revision;
- mAdapterDescription.DedicatedVideoMemory = adapterDesc2.DedicatedVideoMemory;
- mAdapterDescription.DedicatedSystemMemory = adapterDesc2.DedicatedSystemMemory;
- mAdapterDescription.SharedSystemMemory = adapterDesc2.SharedSystemMemory;
- mAdapterDescription.AdapterLuid = adapterDesc2.AdapterLuid;
- }
- }
- else
- {
- result = mDxgiAdapter->GetDesc(&mAdapterDescription);
- }
-
- SafeRelease(dxgiAdapter2);
-
- if (FAILED(result))
- {
- return egl::EglNotInitialized(D3D11_INIT_OTHER_ERROR)
- << "Could not read DXGI adaptor description.";
- }
-
- memset(mDescription, 0, sizeof(mDescription));
- wcstombs(mDescription, mAdapterDescription.Description, sizeof(mDescription) - 1);
-
- result = mDxgiAdapter->GetParent(__uuidof(IDXGIFactory), (void **)&mDxgiFactory);
-
- if (!mDxgiFactory || FAILED(result))
- {
- return egl::EglNotInitialized(D3D11_INIT_OTHER_ERROR)
- << "Could not create DXGI factory.";
- }
- }
-
- // Disable some spurious D3D11 debug warnings to prevent them from flooding the output log
- if (mCreateDebugDevice)
- {
- TRACE_EVENT0("gpu.angle", "Renderer11::initialize (HideWarnings)");
- ID3D11InfoQueue *infoQueue;
- result = mDevice->QueryInterface(__uuidof(ID3D11InfoQueue), (void **)&infoQueue);
-
- if (SUCCEEDED(result))
- {
- D3D11_MESSAGE_ID hideMessages[] = {
- D3D11_MESSAGE_ID_DEVICE_DRAW_RENDERTARGETVIEW_NOT_SET};
-
- D3D11_INFO_QUEUE_FILTER filter = {};
- filter.DenyList.NumIDs = static_cast<unsigned int>(ArraySize(hideMessages));
- filter.DenyList.pIDList = hideMessages;
-
- infoQueue->AddStorageFilterEntries(&filter);
- SafeRelease(infoQueue);
- }
- }
-
-#if !defined(NDEBUG)
- mDebug = d3d11::DynamicCastComObject<ID3D11Debug>(mDevice);
-#endif
-
- ANGLE_TRY(initializeDevice());
-
- return egl::NoError();
-}
-
-HRESULT Renderer11::callD3D11CreateDevice(PFN_D3D11_CREATE_DEVICE createDevice, bool debug)
-{
- return createDevice(
- nullptr, mRequestedDriverType, nullptr, debug ? D3D11_CREATE_DEVICE_DEBUG : 0,
- mAvailableFeatureLevels.data(), static_cast<unsigned int>(mAvailableFeatureLevels.size()),
- D3D11_SDK_VERSION, &mDevice, &(mRenderer11DeviceCaps.featureLevel), &mDeviceContext);
-}
-
-egl::Error Renderer11::initializeD3DDevice()
-{
- HRESULT result = S_OK;
-
- if (!mCreatedWithDeviceEXT)
- {
-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
- PFN_D3D11_CREATE_DEVICE D3D11CreateDevice = nullptr;
- {
- SCOPED_ANGLE_HISTOGRAM_TIMER("GPU.ANGLE.Renderer11InitializeDLLsMS");
- TRACE_EVENT0("gpu.angle", "Renderer11::initialize (Load DLLs)");
- mDxgiModule = LoadLibrary(TEXT("dxgi.dll"));
- mD3d11Module = LoadLibrary(TEXT("d3d11.dll"));
- mDCompModule = LoadLibrary(TEXT("dcomp.dll"));
-
- if (mD3d11Module == nullptr || mDxgiModule == nullptr)
- {
- return egl::EglNotInitialized(D3D11_INIT_MISSING_DEP)
- << "Could not load D3D11 or DXGI library.";
- }
-
- // create the D3D11 device
- ASSERT(mDevice == nullptr);
- D3D11CreateDevice = reinterpret_cast<PFN_D3D11_CREATE_DEVICE>(
- GetProcAddress(mD3d11Module, "D3D11CreateDevice"));
-
- if (D3D11CreateDevice == nullptr)
- {
- return egl::EglNotInitialized(D3D11_INIT_MISSING_DEP)
- << "Could not retrieve D3D11CreateDevice address.";
- }
- }
-#endif
-
- if (mCreateDebugDevice)
- {
- TRACE_EVENT0("gpu.angle", "D3D11CreateDevice (Debug)");
- result = callD3D11CreateDevice(D3D11CreateDevice, true);
-
- if (result == E_INVALIDARG && mAvailableFeatureLevels.size() > 1u &&
- mAvailableFeatureLevels[0] == D3D_FEATURE_LEVEL_11_1)
- {
- // On older Windows platforms, D3D11.1 is not supported which returns E_INVALIDARG.
- // Try again without passing D3D_FEATURE_LEVEL_11_1 in case we have other feature
- // levels to fall back on.
- mAvailableFeatureLevels.erase(mAvailableFeatureLevels.begin());
- result = callD3D11CreateDevice(D3D11CreateDevice, true);
- }
-
- if (!mDevice || FAILED(result))
- {
- WARN() << "Failed creating Debug D3D11 device - falling back to release runtime.";
- }
- }
-
- if (!mDevice || FAILED(result))
- {
- SCOPED_ANGLE_HISTOGRAM_TIMER("GPU.ANGLE.D3D11CreateDeviceMS");
- TRACE_EVENT0("gpu.angle", "D3D11CreateDevice");
-
- result = callD3D11CreateDevice(D3D11CreateDevice, false);
-
- if (result == E_INVALIDARG && mAvailableFeatureLevels.size() > 1u &&
- mAvailableFeatureLevels[0] == D3D_FEATURE_LEVEL_11_1)
- {
- // On older Windows platforms, D3D11.1 is not supported which returns E_INVALIDARG.
- // Try again without passing D3D_FEATURE_LEVEL_11_1 in case we have other feature
- // levels to fall back on.
- mAvailableFeatureLevels.erase(mAvailableFeatureLevels.begin());
- result = callD3D11CreateDevice(D3D11CreateDevice, false);
- }
-
- // Cleanup done by destructor
- if (!mDevice || FAILED(result))
- {
- ANGLE_HISTOGRAM_SPARSE_SLOWLY("GPU.ANGLE.D3D11CreateDeviceError",
- static_cast<int>(result));
- return egl::EglNotInitialized(D3D11_INIT_CREATEDEVICE_ERROR)
- << "Could not create D3D11 device.";
- }
- }
- }
- else
- {
- // We should use the inputted D3D11 device instead
- void *device = nullptr;
- ANGLE_TRY(mEGLDevice->getDevice(&device));
-
- ID3D11Device *d3dDevice = reinterpret_cast<ID3D11Device *>(device);
- if (FAILED(d3dDevice->GetDeviceRemovedReason()))
- {
- return egl::EglNotInitialized() << "Inputted D3D11 device has been lost.";
- }
-
- if (d3dDevice->GetFeatureLevel() < D3D_FEATURE_LEVEL_9_3)
- {
- return egl::EglNotInitialized()
- << "Inputted D3D11 device must be Feature Level 9_3 or greater.";
- }
-
- // The Renderer11 adds a ref to the inputted D3D11 device, like D3D11CreateDevice does.
- mDevice = d3dDevice;
- mDevice->AddRef();
- mDevice->GetImmediateContext(&mDeviceContext);
- mRenderer11DeviceCaps.featureLevel = mDevice->GetFeatureLevel();
- }
-
- mResourceManager11.setAllocationsInitialized(mCreateDebugDevice);
-
- d3d11::SetDebugName(mDeviceContext, "DeviceContext");
-
- return egl::NoError();
-}
-
-// do any one-time device initialization
-// NOTE: this is also needed after a device lost/reset
-// to reset the scene status and ensure the default states are reset.
-egl::Error Renderer11::initializeDevice()
-{
- SCOPED_ANGLE_HISTOGRAM_TIMER("GPU.ANGLE.Renderer11InitializeDeviceMS");
- TRACE_EVENT0("gpu.angle", "Renderer11::initializeDevice");
-
- populateRenderer11DeviceCaps();
-
- mStateCache.clear();
-
- ASSERT(!mBlit);
- mBlit = new Blit11(this);
-
- ASSERT(!mClear);
- mClear = new Clear11(this);
-
- const auto &attributes = mDisplay->getAttributeMap();
- // If automatic trim is enabled, DXGIDevice3::Trim( ) is called for the application
- // automatically when an application is suspended by the OS. This feature is currently
- // only supported for Windows Store applications.
- EGLint enableAutoTrim = static_cast<EGLint>(
- attributes.get(EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE, EGL_FALSE));
-
- if (enableAutoTrim == EGL_TRUE)
- {
- ASSERT(!mTrim);
- mTrim = new Trim11(this);
- }
-
- ASSERT(!mPixelTransfer);
- mPixelTransfer = new PixelTransfer11(this);
-
- const gl::Caps &rendererCaps = getNativeCaps();
-
- if (mStateManager.initialize(rendererCaps, getNativeExtensions()).isError())
- {
- return egl::EglBadAlloc() << "Error initializing state manager.";
- }
-
- // Gather stats on DXGI and D3D feature level
- ANGLE_HISTOGRAM_BOOLEAN("GPU.ANGLE.SupportsDXGI1_2", mRenderer11DeviceCaps.supportsDXGI1_2);
-
- ANGLEFeatureLevel angleFeatureLevel = GetANGLEFeatureLevel(mRenderer11DeviceCaps.featureLevel);
-
- // We don't actually request a 11_1 device, because of complications with the platform
- // update. Instead we check if the mDeviceContext1 pointer cast succeeded.
- // Note: we should support D3D11_0 always, but we aren't guaranteed to be at FL11_0
- // because the app can specify a lower version (such as 9_3) on Display creation.
- if (mDeviceContext1 != nullptr)
- {
- angleFeatureLevel = ANGLE_FEATURE_LEVEL_11_1;
- }
-
- ANGLE_HISTOGRAM_ENUMERATION("GPU.ANGLE.D3D11FeatureLevel", angleFeatureLevel,
- NUM_ANGLE_FEATURE_LEVELS);
-
- return egl::NoError();
-}
-
-void Renderer11::populateRenderer11DeviceCaps()
-{
- HRESULT hr = S_OK;
-
- LARGE_INTEGER version;
- hr = mDxgiAdapter->CheckInterfaceSupport(__uuidof(IDXGIDevice), &version);
- if (FAILED(hr))
- {
- mRenderer11DeviceCaps.driverVersion.reset();
- ERR() << "Error querying driver version from DXGI Adapter.";
- }
- else
- {
- mRenderer11DeviceCaps.driverVersion = version;
- }
-
- if (mDeviceContext1)
- {
- D3D11_FEATURE_DATA_D3D11_OPTIONS d3d11Options;
- HRESULT result = mDevice->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS, &d3d11Options,
- sizeof(D3D11_FEATURE_DATA_D3D11_OPTIONS));
- if (SUCCEEDED(result))
- {
- mRenderer11DeviceCaps.supportsClearView = (d3d11Options.ClearView != FALSE);
- mRenderer11DeviceCaps.supportsConstantBufferOffsets =
- (d3d11Options.ConstantBufferOffsetting != FALSE);
- }
- }
-
- if (mDeviceContext3)
- {
- D3D11_FEATURE_DATA_D3D11_OPTIONS3 d3d11Options3;
- HRESULT result = mDevice->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS3, &d3d11Options3,
- sizeof(D3D11_FEATURE_DATA_D3D11_OPTIONS3));
- if (SUCCEEDED(result))
- {
- mRenderer11DeviceCaps.supportsVpRtIndexWriteFromVertexShader =
- (d3d11Options3.VPAndRTArrayIndexFromAnyShaderFeedingRasterizer == TRUE);
- }
- }
-
- mRenderer11DeviceCaps.supportsMultisampledDepthStencilSRVs =
- mRenderer11DeviceCaps.featureLevel > D3D_FEATURE_LEVEL_10_0;
-
- if (getWorkarounds().disableB5G6R5Support)
- {
- mRenderer11DeviceCaps.B5G6R5support = 0;
- mRenderer11DeviceCaps.B5G6R5maxSamples = 0;
- }
- else
- {
- PopulateFormatDeviceCaps(mDevice, DXGI_FORMAT_B5G6R5_UNORM,
- &mRenderer11DeviceCaps.B5G6R5support,
- &mRenderer11DeviceCaps.B5G6R5maxSamples);
- }
-
- PopulateFormatDeviceCaps(mDevice, DXGI_FORMAT_B4G4R4A4_UNORM,
- &mRenderer11DeviceCaps.B4G4R4A4support,
- &mRenderer11DeviceCaps.B4G4R4A4maxSamples);
- PopulateFormatDeviceCaps(mDevice, DXGI_FORMAT_B5G5R5A1_UNORM,
- &mRenderer11DeviceCaps.B5G5R5A1support,
- &mRenderer11DeviceCaps.B5G5R5A1maxSamples);
-
- IDXGIAdapter2 *dxgiAdapter2 = d3d11::DynamicCastComObject<IDXGIAdapter2>(mDxgiAdapter);
- mRenderer11DeviceCaps.supportsDXGI1_2 = (dxgiAdapter2 != nullptr);
- SafeRelease(dxgiAdapter2);
-}
-
-gl::SupportedSampleSet Renderer11::generateSampleSetForEGLConfig(
- const gl::TextureCaps &colorBufferFormatCaps,
- const gl::TextureCaps &depthStencilBufferFormatCaps) const
-{
- gl::SupportedSampleSet sampleCounts;
-
-#if 0 // Disabling support for multisampling with Qt5 as it's causing a crash in the D3D11 shaders.
-
- // Generate a new set from the set intersection of sample counts between the color and depth
- // format caps.
- std::set_intersection(colorBufferFormatCaps.sampleCounts.begin(),
- colorBufferFormatCaps.sampleCounts.end(),
- depthStencilBufferFormatCaps.sampleCounts.begin(),
- depthStencilBufferFormatCaps.sampleCounts.end(),
- std::inserter(sampleCounts, sampleCounts.begin()));
-
- // Format of GL_NONE results in no supported sample counts.
- // Add back the color sample counts to the supported sample set.
- if (depthStencilBufferFormatCaps.sampleCounts.empty())
- {
- sampleCounts = colorBufferFormatCaps.sampleCounts;
- }
- else if (colorBufferFormatCaps.sampleCounts.empty())
- {
- // Likewise, add back the depth sample counts to the supported sample set.
- sampleCounts = depthStencilBufferFormatCaps.sampleCounts;
- }
-
-#endif
-
- // Always support 0 samples
- sampleCounts.insert(0);
-
- return sampleCounts;
-}
-
-egl::ConfigSet Renderer11::generateConfigs()
-{
- std::vector<GLenum> colorBufferFormats;
-
- // 32-bit supported formats
- colorBufferFormats.push_back(GL_BGRA8_EXT);
- colorBufferFormats.push_back(GL_RGBA8_OES);
-
- // 24-bit supported formats
- colorBufferFormats.push_back(GL_RGB8_OES);
-
- if (mRenderer11DeviceCaps.featureLevel >= D3D_FEATURE_LEVEL_10_0)
- {
- // Additional high bit depth formats added in D3D 10.0
- // https://msdn.microsoft.com/en-us/library/windows/desktop/bb173064.aspx
- colorBufferFormats.push_back(GL_RGBA16F);
- colorBufferFormats.push_back(GL_RGB10_A2);
- }
-
- if (!mPresentPathFastEnabled)
- {
- // 16-bit supported formats
- // These aren't valid D3D11 swapchain formats, so don't expose them as configs
- // if present path fast is active
- colorBufferFormats.push_back(GL_RGBA4);
- colorBufferFormats.push_back(GL_RGB5_A1);
- colorBufferFormats.push_back(GL_RGB565);
- }
-
- static const GLenum depthStencilBufferFormats[] = {
- GL_NONE, GL_DEPTH24_STENCIL8_OES, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT16,
- GL_STENCIL_INDEX8,
- };
-
- const gl::Caps &rendererCaps = getNativeCaps();
- const gl::TextureCapsMap &rendererTextureCaps = getNativeTextureCaps();
-
- const EGLint optimalSurfaceOrientation =
- mPresentPathFastEnabled ? 0 : EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE;
-
- egl::ConfigSet configs;
- for (GLenum colorBufferInternalFormat : colorBufferFormats)
- {
- const gl::TextureCaps &colorBufferFormatCaps =
- rendererTextureCaps.get(colorBufferInternalFormat);
- if (!colorBufferFormatCaps.renderable)
- {
- continue;
- }
-
- for (GLenum depthStencilBufferInternalFormat : depthStencilBufferFormats)
- {
- const gl::TextureCaps &depthStencilBufferFormatCaps =
- rendererTextureCaps.get(depthStencilBufferInternalFormat);
- if (!depthStencilBufferFormatCaps.renderable &&
- depthStencilBufferInternalFormat != GL_NONE)
- {
- continue;
- }
-
- const gl::InternalFormat &colorBufferFormatInfo =
- gl::GetSizedInternalFormatInfo(colorBufferInternalFormat);
- const gl::InternalFormat &depthStencilBufferFormatInfo =
- gl::GetSizedInternalFormatInfo(depthStencilBufferInternalFormat);
- const gl::Version &maxVersion = getMaxSupportedESVersion();
-
- const gl::SupportedSampleSet sampleCounts =
- generateSampleSetForEGLConfig(colorBufferFormatCaps, depthStencilBufferFormatCaps);
-
- for (GLuint sampleCount : sampleCounts)
- {
- egl::Config config;
- config.renderTargetFormat = colorBufferInternalFormat;
- config.depthStencilFormat = depthStencilBufferInternalFormat;
- config.bufferSize = colorBufferFormatInfo.pixelBytes * 8;
- config.redSize = colorBufferFormatInfo.redBits;
- config.greenSize = colorBufferFormatInfo.greenBits;
- config.blueSize = colorBufferFormatInfo.blueBits;
- config.luminanceSize = colorBufferFormatInfo.luminanceBits;
- config.alphaSize = colorBufferFormatInfo.alphaBits;
- config.alphaMaskSize = 0;
- config.bindToTextureRGB =
- ((colorBufferFormatInfo.format == GL_RGB) && (sampleCount <= 1));
- config.bindToTextureRGBA = (((colorBufferFormatInfo.format == GL_RGBA) ||
- (colorBufferFormatInfo.format == GL_BGRA_EXT)) &&
- (sampleCount <= 1));
- config.colorBufferType = EGL_RGB_BUFFER;
- config.configCaveat = EGL_NONE;
- config.configID = static_cast<EGLint>(configs.size() + 1);
-
- // PresentPathFast may not be conformant
- config.conformant = 0;
- if (!mPresentPathFastEnabled)
- {
- // Can only support a conformant ES2 with feature level greater than 10.0.
- if (mRenderer11DeviceCaps.featureLevel >= D3D_FEATURE_LEVEL_10_0)
- {
- config.conformant |= EGL_OPENGL_ES2_BIT;
- }
-
- // We can only support conformant ES3 on FL 10.1+
- if (maxVersion.major >= 3)
- {
- config.conformant |= EGL_OPENGL_ES3_BIT_KHR;
- }
- }
-
- config.depthSize = depthStencilBufferFormatInfo.depthBits;
- config.level = 0;
- config.matchNativePixmap = EGL_NONE;
- config.maxPBufferWidth = rendererCaps.max2DTextureSize;
- config.maxPBufferHeight = rendererCaps.max2DTextureSize;
- config.maxPBufferPixels =
- rendererCaps.max2DTextureSize * rendererCaps.max2DTextureSize;
- config.maxSwapInterval = 4;
- config.minSwapInterval = 0;
- config.nativeRenderable = EGL_FALSE;
- config.nativeVisualID = 0;
- config.nativeVisualType = EGL_NONE;
-
- // Can't support ES3 at all without feature level 10.1
- config.renderableType = EGL_OPENGL_ES2_BIT;
- if (maxVersion.major >= 3)
- {
- config.renderableType |= EGL_OPENGL_ES3_BIT_KHR;
- }
-
- config.sampleBuffers = (sampleCount == 0) ? 0 : 1;
- config.samples = sampleCount;
- config.stencilSize = depthStencilBufferFormatInfo.stencilBits;
- config.surfaceType =
- EGL_PBUFFER_BIT | EGL_WINDOW_BIT | EGL_SWAP_BEHAVIOR_PRESERVED_BIT;
- config.transparentType = EGL_NONE;
- config.transparentRedValue = 0;
- config.transparentGreenValue = 0;
- config.transparentBlueValue = 0;
- config.optimalOrientation = optimalSurfaceOrientation;
- config.colorComponentType = gl_egl::GLComponentTypeToEGLColorComponentType(
- colorBufferFormatInfo.componentType);
-
- configs.add(config);
- }
- }
- }
-
- ASSERT(configs.size() > 0);
- return configs;
-}
-
-void Renderer11::generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const
-{
- outExtensions->createContextRobustness = true;
-
- if (getShareHandleSupport())
- {
- outExtensions->d3dShareHandleClientBuffer = true;
- outExtensions->surfaceD3DTexture2DShareHandle = true;
- }
- outExtensions->d3dTextureClientBuffer = true;
-
- outExtensions->keyedMutex = true;
- outExtensions->querySurfacePointer = true;
- outExtensions->windowFixedSize = true;
-
- // If present path fast is active then the surface orientation extension isn't supported
- outExtensions->surfaceOrientation = !mPresentPathFastEnabled;
-
- // D3D11 does not support present with dirty rectangles until DXGI 1.2.
- outExtensions->postSubBuffer = mRenderer11DeviceCaps.supportsDXGI1_2;
-
- outExtensions->deviceQuery = true;
-
- outExtensions->image = true;
- outExtensions->imageBase = true;
- outExtensions->glTexture2DImage = true;
- outExtensions->glTextureCubemapImage = true;
- outExtensions->glRenderbufferImage = true;
-
- outExtensions->stream = true;
- outExtensions->streamConsumerGLTexture = true;
- outExtensions->streamConsumerGLTextureYUV = true;
- // Not all D3D11 devices support NV12 textures
- if (getNV12TextureSupport())
- {
- outExtensions->streamProducerD3DTextureNV12 = true;
- }
-
- outExtensions->flexibleSurfaceCompatibility = true;
- outExtensions->directComposition = !!mDCompModule;
-
- // Contexts are virtualized so textures can be shared globally
- outExtensions->displayTextureShareGroup = true;
-
- // getSyncValues requires direct composition.
- outExtensions->getSyncValues = outExtensions->directComposition;
-
- // D3D11 can be used without a swap chain
- outExtensions->surfacelessContext = true;
-
- // All D3D feature levels support robust resource init
- outExtensions->robustResourceInitialization = true;
-}
-
-gl::Error Renderer11::flush()
-{
- mDeviceContext->Flush();
- return gl::NoError();
-}
-
-gl::Error Renderer11::finish()
-{
- if (!mSyncQuery.valid())
- {
- D3D11_QUERY_DESC queryDesc;
- queryDesc.Query = D3D11_QUERY_EVENT;
- queryDesc.MiscFlags = 0;
-
- ANGLE_TRY(allocateResource(queryDesc, &mSyncQuery));
- }
-
- mDeviceContext->End(mSyncQuery.get());
-
- HRESULT result = S_OK;
- unsigned int attempt = 0;
- do
- {
- unsigned int flushFrequency = 100;
- UINT flags = (attempt % flushFrequency == 0) ? 0 : D3D11_ASYNC_GETDATA_DONOTFLUSH;
- attempt++;
-
- result = mDeviceContext->GetData(mSyncQuery.get(), nullptr, 0, flags);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to get event query data, " << gl::FmtHR(result);
- }
-
- if (result == S_FALSE)
- {
- // Keep polling, but allow other threads to do something useful first
- ScheduleYield();
- }
-
- if (testDeviceLost())
- {
- mDisplay->notifyDeviceLost();
- return gl::OutOfMemory() << "Device was lost while waiting for sync.";
- }
- } while (result == S_FALSE);
-
- return gl::NoError();
-}
-
-bool Renderer11::isValidNativeWindow(EGLNativeWindowType window) const
-{
-#ifdef ANGLE_ENABLE_WINDOWS_STORE
- return NativeWindow11WinRT::IsValidNativeWindow(window);
-#else
- return NativeWindow11Win32::IsValidNativeWindow(window);
-#endif
-}
-
-NativeWindowD3D *Renderer11::createNativeWindow(EGLNativeWindowType window,
- const egl::Config *config,
- const egl::AttributeMap &attribs) const
-{
-#ifdef ANGLE_ENABLE_WINDOWS_STORE
- UNUSED_VARIABLE(attribs);
- return new NativeWindow11WinRT(window, config->alphaSize > 0);
-#else
- return new NativeWindow11Win32(
- window, config->alphaSize > 0,
- attribs.get(EGL_DIRECT_COMPOSITION_ANGLE, EGL_FALSE) == EGL_TRUE);
-#endif
-}
-
-egl::Error Renderer11::getD3DTextureInfo(const egl::Config *configuration,
- IUnknown *d3dTexture,
- EGLint *width,
- EGLint *height,
- GLenum *fboFormat) const
-{
- ID3D11Texture2D *texture = d3d11::DynamicCastComObject<ID3D11Texture2D>(d3dTexture);
- if (texture == nullptr)
- {
- return egl::EglBadParameter() << "client buffer is not a ID3D11Texture2D";
- }
-
- ID3D11Device *textureDevice = nullptr;
- texture->GetDevice(&textureDevice);
- if (textureDevice != mDevice)
- {
- SafeRelease(texture);
- return egl::EglBadParameter() << "Texture's device does not match.";
- }
- SafeRelease(textureDevice);
-
- D3D11_TEXTURE2D_DESC desc = {0};
- texture->GetDesc(&desc);
- SafeRelease(texture);
-
- if (width)
- {
- *width = static_cast<EGLint>(desc.Width);
- }
- if (height)
- {
- *height = static_cast<EGLint>(desc.Height);
- }
- if (static_cast<EGLint>(desc.SampleDesc.Count) != configuration->samples)
- {
- // Both the texture and EGL config sample count may not be the same when multi-sampling
- // is disabled. The EGL sample count can be 0 but a D3D texture is always 1. Therefore,
- // we must only check for a invalid match when the EGL config is non-zero or the texture is
- // not one.
- if (configuration->samples != 0 || desc.SampleDesc.Count != 1)
- {
- return egl::EglBadParameter() << "Texture's sample count does not match.";
- }
- }
- // From table egl.restrictions in EGL_ANGLE_d3d_texture_client_buffer.
- switch (desc.Format)
- {
- case DXGI_FORMAT_R8G8B8A8_UNORM:
- case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
- case DXGI_FORMAT_B8G8R8A8_UNORM:
- case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
- case DXGI_FORMAT_R16G16B16A16_FLOAT:
- case DXGI_FORMAT_R32G32B32A32_FLOAT:
- break;
-
- default:
- return egl::EglBadParameter()
- << "Unknown client buffer texture format: " << desc.Format;
- }
-
- if (fboFormat)
- {
- const angle::Format &angleFormat = d3d11_angle::GetFormat(desc.Format);
- *fboFormat = angleFormat.fboImplementationInternalFormat;
- }
-
- return egl::NoError();
-}
-
-egl::Error Renderer11::validateShareHandle(const egl::Config *config,
- HANDLE shareHandle,
- const egl::AttributeMap &attribs) const
-{
- if (shareHandle == nullptr)
- {
- return egl::EglBadParameter() << "NULL share handle.";
- }
-
- ID3D11Resource *tempResource11 = nullptr;
- HRESULT result = mDevice->OpenSharedResource(shareHandle, __uuidof(ID3D11Resource),
- (void **)&tempResource11);
- if (FAILED(result))
- {
- return egl::EglBadParameter() << "Failed to open share handle, " << gl::FmtHR(result);
- }
-
- ID3D11Texture2D *texture2D = d3d11::DynamicCastComObject<ID3D11Texture2D>(tempResource11);
- SafeRelease(tempResource11);
-
- if (texture2D == nullptr)
- {
- return egl::EglBadParameter()
- << "Failed to query ID3D11Texture2D object from share handle.";
- }
-
- D3D11_TEXTURE2D_DESC desc = {0};
- texture2D->GetDesc(&desc);
- SafeRelease(texture2D);
-
- EGLint width = attribs.getAsInt(EGL_WIDTH, 0);
- EGLint height = attribs.getAsInt(EGL_HEIGHT, 0);
- ASSERT(width != 0 && height != 0);
-
- const d3d11::Format &backbufferFormatInfo =
- d3d11::Format::Get(config->renderTargetFormat, getRenderer11DeviceCaps());
-
- if (desc.Width != static_cast<UINT>(width) || desc.Height != static_cast<UINT>(height) ||
- desc.Format != backbufferFormatInfo.texFormat || desc.MipLevels != 1 || desc.ArraySize != 1)
- {
- return egl::EglBadParameter() << "Invalid texture parameters in share handle texture.";
- }
-
- return egl::NoError();
-}
-
-SwapChainD3D *Renderer11::createSwapChain(NativeWindowD3D *nativeWindow,
- HANDLE shareHandle,
- IUnknown *d3dTexture,
- GLenum backBufferFormat,
- GLenum depthBufferFormat,
- EGLint orientation,
- EGLint samples)
-{
- return new SwapChain11(this, GetAs<NativeWindow11>(nativeWindow), shareHandle, d3dTexture,
- backBufferFormat, depthBufferFormat, orientation, samples);
-}
-
-void *Renderer11::getD3DDevice()
-{
- return reinterpret_cast<void *>(mDevice);
-}
-
-bool Renderer11::applyPrimitiveType(const gl::State &glState, GLenum mode, GLsizei count)
-{
- D3D11_PRIMITIVE_TOPOLOGY primitiveTopology = D3D_PRIMITIVE_TOPOLOGY_UNDEFINED;
-
- GLsizei minCount = 0;
-
- switch (mode)
- {
- case GL_POINTS:
- {
- bool usesPointSize = GetImplAs<ProgramD3D>(glState.getProgram())->usesPointSize();
-
- // ProgramBinary assumes non-point rendering if gl_PointSize isn't written,
- // which affects varying interpolation. Since the value of gl_PointSize is
- // undefined when not written, just skip drawing to avoid unexpected results.
- if (!usesPointSize && !glState.isTransformFeedbackActiveUnpaused())
- {
- // Notify developers of risking undefined behavior.
- WARN() << "Point rendering without writing to gl_PointSize.";
- return false;
- }
-
- // If instanced pointsprites are enabled and the shader uses gl_PointSize, the topology
- // must be D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST.
- if (usesPointSize && getWorkarounds().useInstancedPointSpriteEmulation)
- {
- primitiveTopology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
- }
- else
- {
- primitiveTopology = D3D11_PRIMITIVE_TOPOLOGY_POINTLIST;
- }
- minCount = 1;
- break;
- }
- case GL_LINES:
- primitiveTopology = D3D_PRIMITIVE_TOPOLOGY_LINELIST;
- minCount = 2;
- break;
- case GL_LINE_LOOP:
- primitiveTopology = D3D_PRIMITIVE_TOPOLOGY_LINESTRIP;
- minCount = 2;
- break;
- case GL_LINE_STRIP:
- primitiveTopology = D3D_PRIMITIVE_TOPOLOGY_LINESTRIP;
- minCount = 2;
- break;
- case GL_TRIANGLES:
- primitiveTopology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
- minCount = CullsEverything(glState) ? std::numeric_limits<GLsizei>::max() : 3;
- break;
- case GL_TRIANGLE_STRIP:
- primitiveTopology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP;
- minCount = CullsEverything(glState) ? std::numeric_limits<GLsizei>::max() : 3;
- break;
- // emulate fans via rewriting index buffer
- case GL_TRIANGLE_FAN:
- primitiveTopology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
- minCount = CullsEverything(glState) ? std::numeric_limits<GLsizei>::max() : 3;
- break;
- default:
- UNREACHABLE();
- return false;
- }
-
- mStateManager.setPrimitiveTopology(primitiveTopology);
-
- return count >= minCount;
-}
-
-gl::Error Renderer11::drawArrays(const gl::Context *context,
- GLenum mode,
- GLint startVertex,
- GLsizei count,
- GLsizei instances)
-{
- const auto &glState = context->getGLState();
-
- if (!applyPrimitiveType(glState, mode, count))
- {
- return gl::NoError();
- }
-
- DrawCallVertexParams vertexParams(startVertex, count, instances);
- ANGLE_TRY(mStateManager.applyVertexBuffer(context, mode, vertexParams, false));
-
- if (glState.isTransformFeedbackActiveUnpaused())
- {
- ANGLE_TRY(markTransformFeedbackUsage(context));
- }
-
- gl::Program *program = glState.getProgram();
- ASSERT(program != nullptr);
- GLsizei adjustedInstanceCount = GetAdjustedInstanceCount(program, instances);
- ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
-
- if (programD3D->usesGeometryShader(mode) && glState.isTransformFeedbackActiveUnpaused())
- {
- // Since we use a geometry if-and-only-if we rewrite vertex streams, transform feedback
- // won't get the correct output. To work around this, draw with *only* the stream out
- // first (no pixel shader) to feed the stream out buffers and then draw again with the
- // geometry shader + pixel shader to rasterize the primitives.
- mStateManager.setPixelShader(nullptr);
-
- if (adjustedInstanceCount > 0)
- {
- mDeviceContext->DrawInstanced(count, adjustedInstanceCount, 0, 0);
- }
- else
- {
- mDeviceContext->Draw(count, 0);
- }
-
- rx::ShaderExecutableD3D *pixelExe = nullptr;
- ANGLE_TRY(programD3D->getPixelExecutableForCachedOutputLayout(&pixelExe, nullptr));
-
- // Skip the draw call if rasterizer discard is enabled (or no fragment shader).
- if (!pixelExe || glState.getRasterizerState().rasterizerDiscard)
- {
- return gl::NoError();
- }
-
- mStateManager.setPixelShader(&GetAs<ShaderExecutable11>(pixelExe)->getPixelShader());
-
- // Retrieve the geometry shader.
- rx::ShaderExecutableD3D *geometryExe = nullptr;
- ANGLE_TRY(programD3D->getGeometryExecutableForPrimitiveType(context, mode, &geometryExe,
- nullptr));
-
- mStateManager.setGeometryShader(
- &GetAs<ShaderExecutable11>(geometryExe)->getGeometryShader());
-
- if (adjustedInstanceCount > 0)
- {
- mDeviceContext->DrawInstanced(count, adjustedInstanceCount, 0, 0);
- }
- else
- {
- mDeviceContext->Draw(count, 0);
- }
- return gl::NoError();
- }
-
- if (mode == GL_LINE_LOOP)
- {
- return drawLineLoop(context, count, GL_NONE, nullptr, 0, adjustedInstanceCount);
- }
-
- if (mode == GL_TRIANGLE_FAN)
- {
- return drawTriangleFan(context, count, GL_NONE, nullptr, 0, adjustedInstanceCount);
- }
-
- bool useInstancedPointSpriteEmulation =
- programD3D->usesPointSize() && getWorkarounds().useInstancedPointSpriteEmulation;
-
- if (mode != GL_POINTS || !useInstancedPointSpriteEmulation)
- {
- if (adjustedInstanceCount == 0)
- {
- mDeviceContext->Draw(count, 0);
- }
- else
- {
- mDeviceContext->DrawInstanced(count, adjustedInstanceCount, 0, 0);
- }
- return gl::NoError();
- }
-
- // This code should not be reachable by multi-view programs.
- ASSERT(program->usesMultiview() == false);
-
- // If the shader is writing to gl_PointSize, then pointsprites are being rendered.
- // Emulating instanced point sprites for FL9_3 requires the topology to be
- // D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST and DrawIndexedInstanced is called instead.
- if (adjustedInstanceCount == 0)
- {
- mDeviceContext->DrawIndexedInstanced(6, count, 0, 0, 0);
- return gl::NoError();
- }
-
- // If pointsprite emulation is used with glDrawArraysInstanced then we need to take a less
- // efficent code path. Instanced rendering of emulated pointsprites requires a loop to draw each
- // batch of points. An offset into the instanced data buffer is calculated and applied on each
- // iteration to ensure all instances are rendered correctly. Each instance being rendered
- // requires the inputlayout cache to reapply buffers and offsets.
- for (GLsizei i = 0; i < instances; i++)
- {
- ANGLE_TRY(mStateManager.updateVertexOffsetsForPointSpritesEmulation(startVertex, i));
- mDeviceContext->DrawIndexedInstanced(6, count, 0, 0, 0);
- }
-
- // This required by updateVertexOffsets... above but is outside of the loop for speed.
- mStateManager.invalidateVertexBuffer();
- return gl::NoError();
-}
-
-gl::Error Renderer11::drawElements(const gl::Context *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei instances)
-{
- const auto &glState = context->getGLState();
-
- if (!applyPrimitiveType(glState, mode, count))
- {
- return gl::NoError();
- }
-
- // Transform feedback is not allowed for DrawElements, this error should have been caught at the
- // API validation layer.
- ASSERT(!glState.isTransformFeedbackActiveUnpaused());
-
- const auto &lazyIndexRange = context->getParams<gl::HasIndexRange>();
-
- bool usePrimitiveRestartWorkaround =
- UsePrimitiveRestartWorkaround(glState.isPrimitiveRestartEnabled(), type);
- DrawCallVertexParams vertexParams(!usePrimitiveRestartWorkaround, lazyIndexRange, 0, instances);
-
- ANGLE_TRY(mStateManager.applyIndexBuffer(context, indices, count, type, lazyIndexRange,
- usePrimitiveRestartWorkaround));
- ANGLE_TRY(mStateManager.applyVertexBuffer(context, mode, vertexParams, true));
-
- int startVertex = static_cast<int>(vertexParams.firstVertex());
- int baseVertex = -startVertex;
-
- const gl::Program *program = glState.getProgram();
- GLsizei adjustedInstanceCount = GetAdjustedInstanceCount(program, instances);
-
- if (mode == GL_LINE_LOOP)
- {
- return drawLineLoop(context, count, type, indices, baseVertex, adjustedInstanceCount);
- }
-
- if (mode == GL_TRIANGLE_FAN)
- {
- return drawTriangleFan(context, count, type, indices, baseVertex, adjustedInstanceCount);
- }
-
- const ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
-
- if (mode != GL_POINTS || !programD3D->usesInstancedPointSpriteEmulation())
- {
- if (adjustedInstanceCount == 0)
- {
- mDeviceContext->DrawIndexed(count, 0, baseVertex);
- }
- else
- {
- mDeviceContext->DrawIndexedInstanced(count, adjustedInstanceCount, 0, baseVertex, 0);
- }
- return gl::NoError();
- }
-
- // This code should not be reachable by multi-view programs.
- ASSERT(program->usesMultiview() == false);
-
- // If the shader is writing to gl_PointSize, then pointsprites are being rendered.
- // Emulating instanced point sprites for FL9_3 requires the topology to be
- // D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST and DrawIndexedInstanced is called instead.
- //
- // The count parameter passed to drawElements represents the total number of instances to be
- // rendered. Each instance is referenced by the bound index buffer from the the caller.
- //
- // Indexed pointsprite emulation replicates data for duplicate entries found in the index
- // buffer. This is not an efficent rendering mechanism and is only used on downlevel renderers
- // that do not support geometry shaders.
- if (instances == 0)
- {
- mDeviceContext->DrawIndexedInstanced(6, count, 0, 0, 0);
- return gl::NoError();
- }
-
- // If pointsprite emulation is used with glDrawElementsInstanced then we need to take a less
- // efficent code path. Instanced rendering of emulated pointsprites requires a loop to draw each
- // batch of points. An offset into the instanced data buffer is calculated and applied on each
- // iteration to ensure all instances are rendered correctly.
- GLsizei elementsToRender = vertexParams.vertexCount();
-
- // Each instance being rendered requires the inputlayout cache to reapply buffers and offsets.
- for (GLsizei i = 0; i < instances; i++)
- {
- ANGLE_TRY(mStateManager.updateVertexOffsetsForPointSpritesEmulation(startVertex, i));
- mDeviceContext->DrawIndexedInstanced(6, elementsToRender, 0, 0, 0);
- }
- mStateManager.invalidateVertexBuffer();
- return gl::NoError();
-}
-
-gl::Error Renderer11::drawArraysIndirect(const gl::Context *context,
- GLenum mode,
- const void *indirect)
-{
- const auto &glState = context->getGLState();
- ASSERT(!glState.isTransformFeedbackActiveUnpaused());
-
- if (!applyPrimitiveType(glState, mode, std::numeric_limits<int>::max() - 1))
- {
- return gl::NoError();
- }
-
- gl::Buffer *drawIndirectBuffer = glState.getTargetBuffer(gl::BufferBinding::DrawIndirect);
- ASSERT(drawIndirectBuffer);
- Buffer11 *storage = GetImplAs<Buffer11>(drawIndirectBuffer);
- uintptr_t offset = reinterpret_cast<uintptr_t>(indirect);
-
- if (!DrawCallNeedsTranslation(context, mode))
- {
- DrawCallVertexParams vertexParams(0, 0, 0);
- ANGLE_TRY(mStateManager.applyVertexBuffer(context, mode, vertexParams, false));
- ID3D11Buffer *buffer = nullptr;
- ANGLE_TRY_RESULT(storage->getBuffer(context, BUFFER_USAGE_INDIRECT), buffer);
- mDeviceContext->DrawInstancedIndirect(buffer, static_cast<unsigned int>(offset));
- return gl::NoError();
- }
-
- const uint8_t *bufferData = nullptr;
- ANGLE_TRY(storage->getData(context, &bufferData));
- ASSERT(bufferData);
- const gl::DrawArraysIndirectCommand *args =
- reinterpret_cast<const gl::DrawArraysIndirectCommand *>(bufferData + offset);
- GLuint count = args->count;
- GLuint instances = args->instanceCount;
- GLuint first = args->first;
-
- DrawCallVertexParams vertexParams(first, count, instances);
- ANGLE_TRY(mStateManager.applyVertexBuffer(context, mode, vertexParams, false));
-
- if (mode == GL_LINE_LOOP)
- {
- return drawLineLoop(context, count, GL_NONE, nullptr, 0, instances);
- }
- if (mode == GL_TRIANGLE_FAN)
- {
- return drawTriangleFan(context, count, GL_NONE, nullptr, 0, instances);
- }
-
- mDeviceContext->DrawInstanced(count, instances, 0, 0);
- return gl::NoError();
-}
-
-gl::Error Renderer11::drawElementsIndirect(const gl::Context *context,
- GLenum mode,
- GLenum type,
- const void *indirect)
-{
- const auto &glState = context->getGLState();
- ASSERT(!glState.isTransformFeedbackActiveUnpaused());
-
- if (!applyPrimitiveType(glState, mode, std::numeric_limits<int>::max() - 1))
- {
- return gl::NoError();
- }
-
- gl::Buffer *drawIndirectBuffer = glState.getTargetBuffer(gl::BufferBinding::DrawIndirect);
- ASSERT(drawIndirectBuffer);
- Buffer11 *storage = GetImplAs<Buffer11>(drawIndirectBuffer);
- uintptr_t offset = reinterpret_cast<uintptr_t>(indirect);
-
- // TODO(jmadill): Remove the if statement and compute indirect parameters lazily.
- bool usePrimitiveRestartWorkaround =
- UsePrimitiveRestartWorkaround(glState.isPrimitiveRestartEnabled(), type);
-
- if (!DrawCallNeedsTranslation(context, mode) && !IsStreamingIndexData(context, type))
- {
- ANGLE_TRY(mStateManager.applyIndexBuffer(context, nullptr, 0, type, gl::HasIndexRange(),
- usePrimitiveRestartWorkaround));
- DrawCallVertexParams vertexParams(0, 0, 0);
- ANGLE_TRY(mStateManager.applyVertexBuffer(context, mode, vertexParams, true));
- ID3D11Buffer *buffer = nullptr;
- ANGLE_TRY_RESULT(storage->getBuffer(context, BUFFER_USAGE_INDIRECT), buffer);
- mDeviceContext->DrawIndexedInstancedIndirect(buffer, static_cast<unsigned int>(offset));
- return gl::NoError();
- }
-
- const uint8_t *bufferData = nullptr;
- ANGLE_TRY(storage->getData(context, &bufferData));
- ASSERT(bufferData);
-
- const gl::DrawElementsIndirectCommand *cmd =
- reinterpret_cast<const gl::DrawElementsIndirectCommand *>(bufferData + offset);
- GLsizei count = cmd->count;
- GLuint instances = cmd->primCount;
- GLuint firstIndex = cmd->firstIndex;
- GLint baseVertex = cmd->baseVertex;
-
- // TODO(jmadill): Fix const cast.
- const gl::Type &typeInfo = gl::GetTypeInfo(type);
- const void *indices =
- reinterpret_cast<const void *>(static_cast<uintptr_t>(firstIndex * typeInfo.bytes));
- gl::HasIndexRange lazyIndexRange(const_cast<gl::Context *>(context), count, type, indices);
-
- ANGLE_TRY(mStateManager.applyIndexBuffer(context, indices, count, type, lazyIndexRange,
- usePrimitiveRestartWorkaround));
-
- DrawCallVertexParams vertexParams(false, lazyIndexRange, baseVertex, instances);
-
- ANGLE_TRY(mStateManager.applyVertexBuffer(context, mode, vertexParams, true));
-
- int baseVertexLocation = -static_cast<int>(lazyIndexRange.getIndexRange().value().start);
-
- if (mode == GL_LINE_LOOP)
- {
- return drawLineLoop(context, count, type, indices, baseVertexLocation, instances);
- }
-
- if (mode == GL_TRIANGLE_FAN)
- {
- return drawTriangleFan(context, count, type, indices, baseVertexLocation, instances);
- }
-
- mDeviceContext->DrawIndexedInstanced(count, instances, 0, baseVertexLocation, 0);
- return gl::NoError();
-}
-
-gl::Error Renderer11::drawLineLoop(const gl::Context *context,
- GLsizei count,
- GLenum type,
- const void *indexPointer,
- int baseVertex,
- int instances)
-{
- const gl::State &glState = context->getGLState();
- gl::VertexArray *vao = glState.getVertexArray();
- gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get();
-
- const void *indices = indexPointer;
-
- // Get the raw indices for an indexed draw
- if (type != GL_NONE && elementArrayBuffer)
- {
- BufferD3D *storage = GetImplAs<BufferD3D>(elementArrayBuffer);
- intptr_t offset = reinterpret_cast<intptr_t>(indices);
-
- const uint8_t *bufferData = nullptr;
- ANGLE_TRY(storage->getData(context, &bufferData));
-
- indices = bufferData + offset;
- }
-
- if (!mLineLoopIB)
- {
- mLineLoopIB = new StreamingIndexBufferInterface(this);
- gl::Error error =
- mLineLoopIB->reserveBufferSpace(INITIAL_INDEX_BUFFER_SIZE, GL_UNSIGNED_INT);
- if (error.isError())
- {
- SafeDelete(mLineLoopIB);
- return error;
- }
- }
-
- // Checked by Renderer11::applyPrimitiveType
- ASSERT(count >= 0);
-
- if (static_cast<unsigned int>(count) + 1 >
- (std::numeric_limits<unsigned int>::max() / sizeof(unsigned int)))
- {
- return gl::OutOfMemory() << "Failed to create a 32-bit looping index buffer for "
- "GL_LINE_LOOP, too many indices required.";
- }
-
- GetLineLoopIndices(indices, type, static_cast<GLuint>(count),
- glState.isPrimitiveRestartEnabled(), &mScratchIndexDataBuffer);
-
- unsigned int spaceNeeded =
- static_cast<unsigned int>(sizeof(GLuint) * mScratchIndexDataBuffer.size());
- ANGLE_TRY(mLineLoopIB->reserveBufferSpace(spaceNeeded, GL_UNSIGNED_INT));
-
- void *mappedMemory = nullptr;
- unsigned int offset;
- ANGLE_TRY(mLineLoopIB->mapBuffer(spaceNeeded, &mappedMemory, &offset));
-
- // Copy over the converted index data.
- memcpy(mappedMemory, &mScratchIndexDataBuffer[0],
- sizeof(GLuint) * mScratchIndexDataBuffer.size());
-
- ANGLE_TRY(mLineLoopIB->unmapBuffer());
-
- IndexBuffer11 *indexBuffer = GetAs<IndexBuffer11>(mLineLoopIB->getIndexBuffer());
- const d3d11::Buffer &d3dIndexBuffer = indexBuffer->getBuffer();
- DXGI_FORMAT indexFormat = indexBuffer->getIndexFormat();
-
- mStateManager.setIndexBuffer(d3dIndexBuffer.get(), indexFormat, offset);
-
- UINT indexCount = static_cast<UINT>(mScratchIndexDataBuffer.size());
-
- if (instances > 0)
- {
- mDeviceContext->DrawIndexedInstanced(indexCount, instances, 0, baseVertex, 0);
- }
- else
- {
- mDeviceContext->DrawIndexed(indexCount, 0, baseVertex);
- }
-
- return gl::NoError();
-}
-
-gl::Error Renderer11::drawTriangleFan(const gl::Context *context,
- GLsizei count,
- GLenum type,
- const void *indices,
- int baseVertex,
- int instances)
-{
- const gl::State &glState = context->getGLState();
- gl::VertexArray *vao = glState.getVertexArray();
- gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get();
-
- const void *indexPointer = indices;
-
- // Get the raw indices for an indexed draw
- if (type != GL_NONE && elementArrayBuffer)
- {
- BufferD3D *storage = GetImplAs<BufferD3D>(elementArrayBuffer);
- intptr_t offset = reinterpret_cast<intptr_t>(indices);
-
- const uint8_t *bufferData = nullptr;
- ANGLE_TRY(storage->getData(context, &bufferData));
-
- indexPointer = bufferData + offset;
- }
-
- if (!mTriangleFanIB)
- {
- mTriangleFanIB = new StreamingIndexBufferInterface(this);
- gl::Error error =
- mTriangleFanIB->reserveBufferSpace(INITIAL_INDEX_BUFFER_SIZE, GL_UNSIGNED_INT);
- if (error.isError())
- {
- SafeDelete(mTriangleFanIB);
- return error;
- }
- }
-
- // Checked by Renderer11::applyPrimitiveType
- ASSERT(count >= 3);
-
- const GLuint numTris = count - 2;
-
- if (numTris > (std::numeric_limits<unsigned int>::max() / (sizeof(unsigned int) * 3)))
- {
- return gl::OutOfMemory() << "Failed to create a scratch index buffer for GL_TRIANGLE_FAN, "
- "too many indices required.";
- }
-
- GetTriFanIndices(indexPointer, type, count, glState.isPrimitiveRestartEnabled(),
- &mScratchIndexDataBuffer);
-
- const unsigned int spaceNeeded =
- static_cast<unsigned int>(mScratchIndexDataBuffer.size() * sizeof(unsigned int));
- ANGLE_TRY(mTriangleFanIB->reserveBufferSpace(spaceNeeded, GL_UNSIGNED_INT));
-
- void *mappedMemory = nullptr;
- unsigned int offset;
- ANGLE_TRY(mTriangleFanIB->mapBuffer(spaceNeeded, &mappedMemory, &offset));
-
- memcpy(mappedMemory, &mScratchIndexDataBuffer[0], spaceNeeded);
-
- ANGLE_TRY(mTriangleFanIB->unmapBuffer());
-
- IndexBuffer11 *indexBuffer = GetAs<IndexBuffer11>(mTriangleFanIB->getIndexBuffer());
- const d3d11::Buffer &d3dIndexBuffer = indexBuffer->getBuffer();
- DXGI_FORMAT indexFormat = indexBuffer->getIndexFormat();
-
- mStateManager.setIndexBuffer(d3dIndexBuffer.get(), indexFormat, offset);
-
- UINT indexCount = static_cast<UINT>(mScratchIndexDataBuffer.size());
-
- if (instances > 0)
- {
- mDeviceContext->DrawIndexedInstanced(indexCount, instances, 0, baseVertex, 0);
- }
- else
- {
- mDeviceContext->DrawIndexed(indexCount, 0, baseVertex);
- }
-
- return gl::NoError();
-}
-
-void Renderer11::releaseDeviceResources()
-{
- mStateManager.deinitialize();
- mStateCache.clear();
-
- SafeDelete(mLineLoopIB);
- SafeDelete(mTriangleFanIB);
- SafeDelete(mBlit);
- SafeDelete(mClear);
- SafeDelete(mTrim);
- SafeDelete(mPixelTransfer);
-
- mSyncQuery.reset();
-
- mCachedResolveTexture.reset();
-}
-
-// set notify to true to broadcast a message to all contexts of the device loss
-bool Renderer11::testDeviceLost()
-{
- bool isLost = false;
-
- if (!mDevice)
- {
- return true;
- }
-
- // GetRemovedReason is used to test if the device is removed
- HRESULT result = mDevice->GetDeviceRemovedReason();
- isLost = d3d11::isDeviceLostError(result);
-
- if (isLost)
- {
- ERR() << "The D3D11 device was removed, " << gl::FmtHR(result);
- }
-
- return isLost;
-}
-
-bool Renderer11::testDeviceResettable()
-{
- // determine if the device is resettable by creating a dummy device
- PFN_D3D11_CREATE_DEVICE D3D11CreateDevice =
- (PFN_D3D11_CREATE_DEVICE)GetProcAddress(mD3d11Module, "D3D11CreateDevice");
-
- if (D3D11CreateDevice == nullptr)
- {
- return false;
- }
-
- ID3D11Device *dummyDevice;
- D3D_FEATURE_LEVEL dummyFeatureLevel;
- ID3D11DeviceContext *dummyContext;
- UINT flags = (mCreateDebugDevice ? D3D11_CREATE_DEVICE_DEBUG : 0);
-
- ASSERT(mRequestedDriverType != D3D_DRIVER_TYPE_UNKNOWN);
- HRESULT result = D3D11CreateDevice(
- nullptr, mRequestedDriverType, nullptr, flags, mAvailableFeatureLevels.data(),
- static_cast<unsigned int>(mAvailableFeatureLevels.size()), D3D11_SDK_VERSION, &dummyDevice,
- &dummyFeatureLevel, &dummyContext);
-
- if (!mDevice || FAILED(result))
- {
- return false;
- }
-
- SafeRelease(dummyContext);
- SafeRelease(dummyDevice);
-
- return true;
-}
-
-void Renderer11::release()
-{
- RendererD3D::cleanup();
-
- mScratchMemoryBuffer.clear();
-
- if (mAnnotator != nullptr)
- {
- gl::UninitializeDebugAnnotations();
- SafeDelete(mAnnotator);
- }
-
- releaseDeviceResources();
-
- if (!mCreatedWithDeviceEXT)
- {
- // Only delete the device if the Renderer11 owns it
- // Otherwise we should keep it around in case we try to reinitialize the renderer later
- SafeDelete(mEGLDevice);
- }
-
- SafeRelease(mDxgiFactory);
- SafeRelease(mDxgiAdapter);
-
- SafeRelease(mDeviceContext3);
- SafeRelease(mDeviceContext1);
-
- if (mDeviceContext)
- {
- mDeviceContext->ClearState();
- mDeviceContext->Flush();
- SafeRelease(mDeviceContext);
- }
-
- SafeRelease(mDevice);
- SafeRelease(mDebug);
-
- if (mD3d11Module)
- {
- FreeLibrary(mD3d11Module);
- mD3d11Module = nullptr;
- }
-
- if (mDxgiModule)
- {
- FreeLibrary(mDxgiModule);
- mDxgiModule = nullptr;
- }
-
- if (mDCompModule)
- {
- FreeLibrary(mDCompModule);
- mDCompModule = nullptr;
- }
-
- mCompiler.release();
-
- mSupportsShareHandles.reset();
-}
-
-bool Renderer11::resetDevice()
-{
- // recreate everything
- release();
- egl::Error result = initialize();
-
- if (result.isError())
- {
- ERR() << "Could not reinitialize D3D11 device: " << result;
- return false;
- }
-
- return true;
-}
-
-std::string Renderer11::getRendererDescription() const
-{
- std::ostringstream rendererString;
-
- rendererString << mDescription;
- rendererString << " Direct3D11";
-
- rendererString << " vs_" << getMajorShaderModel() << "_" << getMinorShaderModel()
- << getShaderModelSuffix();
- rendererString << " ps_" << getMajorShaderModel() << "_" << getMinorShaderModel()
- << getShaderModelSuffix();
-
- return rendererString.str();
-}
-
-DeviceIdentifier Renderer11::getAdapterIdentifier() const
-{
- // Don't use the AdapterLuid here, since that doesn't persist across reboot.
- DeviceIdentifier deviceIdentifier = {0};
- deviceIdentifier.VendorId = mAdapterDescription.VendorId;
- deviceIdentifier.DeviceId = mAdapterDescription.DeviceId;
- deviceIdentifier.SubSysId = mAdapterDescription.SubSysId;
- deviceIdentifier.Revision = mAdapterDescription.Revision;
- deviceIdentifier.FeatureLevel = static_cast<UINT>(mRenderer11DeviceCaps.featureLevel);
-
- return deviceIdentifier;
-}
-
-unsigned int Renderer11::getReservedVertexUniformVectors() const
-{
- // Driver uniforms are stored in a separate constant buffer
- return d3d11_gl::GetReservedVertexUniformVectors(mRenderer11DeviceCaps.featureLevel);
-}
-
-unsigned int Renderer11::getReservedFragmentUniformVectors() const
-{
- // Driver uniforms are stored in a separate constant buffer
- return d3d11_gl::GetReservedFragmentUniformVectors(mRenderer11DeviceCaps.featureLevel);
-}
-
-unsigned int Renderer11::getReservedVertexUniformBuffers() const
-{
- // we reserve one buffer for the application uniforms, and one for driver uniforms
- return 2;
-}
-
-unsigned int Renderer11::getReservedFragmentUniformBuffers() const
-{
- // we reserve one buffer for the application uniforms, and one for driver uniforms
- return 2;
-}
-
-d3d11::ANGLED3D11DeviceType Renderer11::getDeviceType() const
-{
- if (mCreatedWithDeviceEXT)
- {
- return d3d11::GetDeviceType(mDevice);
- }
-
- if ((mRequestedDriverType == D3D_DRIVER_TYPE_SOFTWARE) ||
- (mRequestedDriverType == D3D_DRIVER_TYPE_REFERENCE) ||
- (mRequestedDriverType == D3D_DRIVER_TYPE_NULL))
- {
- return d3d11::ANGLE_D3D11_DEVICE_TYPE_SOFTWARE_REF_OR_NULL;
- }
-
- if (mRequestedDriverType == D3D_DRIVER_TYPE_WARP)
- {
- return d3d11::ANGLE_D3D11_DEVICE_TYPE_WARP;
- }
-
- return d3d11::ANGLE_D3D11_DEVICE_TYPE_HARDWARE;
-}
-
-bool Renderer11::getShareHandleSupport() const
-{
- if (mSupportsShareHandles.valid())
- {
- return mSupportsShareHandles.value();
- }
-
- // We only currently support share handles with BGRA surfaces, because
- // chrome needs BGRA. Once chrome fixes this, we should always support them.
- if (!getNativeExtensions().textureFormatBGRA8888)
- {
- mSupportsShareHandles = false;
- return false;
- }
-
- // PIX doesn't seem to support using share handles, so disable them.
- if (gl::DebugAnnotationsActive())
- {
- mSupportsShareHandles = false;
- return false;
- }
-
- // Qt: we don't care about the 9_3 limitation
-#if 0
- // Also disable share handles on Feature Level 9_3, since it doesn't support share handles on
- // RGBA8 textures/swapchains.
- if (mRenderer11DeviceCaps.featureLevel <= D3D_FEATURE_LEVEL_9_3)
- {
- mSupportsShareHandles = false;
- return false;
- }
-#endif
-
- // Find out which type of D3D11 device the Renderer11 is using
- d3d11::ANGLED3D11DeviceType deviceType = getDeviceType();
- if (deviceType == d3d11::ANGLE_D3D11_DEVICE_TYPE_UNKNOWN)
- {
- mSupportsShareHandles = false;
- return false;
- }
-
- if (deviceType == d3d11::ANGLE_D3D11_DEVICE_TYPE_SOFTWARE_REF_OR_NULL)
- {
- // Software/Reference/NULL devices don't support share handles
- mSupportsShareHandles = false;
- return false;
- }
-
- if (deviceType == d3d11::ANGLE_D3D11_DEVICE_TYPE_WARP)
- {
-#ifndef ANGLE_ENABLE_WINDOWS_STORE
- if (!IsWindows8OrGreater())
- {
- // WARP on Windows 7 doesn't support shared handles
- mSupportsShareHandles = false;
- return false;
- }
-#endif // ANGLE_ENABLE_WINDOWS_STORE
-
- // WARP on Windows 8.0+ supports shared handles when shared with another WARP device
- // TODO: allow applications to query for HARDWARE or WARP-specific share handles,
- // to prevent them trying to use a WARP share handle with an a HW device (or
- // vice-versa)
- // e.g. by creating EGL_D3D11_[HARDWARE/WARP]_DEVICE_SHARE_HANDLE_ANGLE
- mSupportsShareHandles = true;
- return true;
- }
-
- ASSERT(mCreatedWithDeviceEXT || mRequestedDriverType == D3D_DRIVER_TYPE_HARDWARE);
- mSupportsShareHandles = true;
- return true;
-}
-
-bool Renderer11::getNV12TextureSupport() const
-{
- HRESULT result;
- UINT formatSupport;
- result = mDevice->CheckFormatSupport(DXGI_FORMAT_NV12, &formatSupport);
- if (result == E_FAIL)
- {
- return false;
- }
- return (formatSupport & D3D11_FORMAT_SUPPORT_TEXTURE2D) != 0;
-}
-
-int Renderer11::getMajorShaderModel() const
-{
- switch (mRenderer11DeviceCaps.featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_SHADER_MAJOR_VERSION; // 5
- case D3D_FEATURE_LEVEL_10_1:
- return D3D10_1_SHADER_MAJOR_VERSION; // 4
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_SHADER_MAJOR_VERSION; // 4
- case D3D_FEATURE_LEVEL_9_3:
- return D3D10_SHADER_MAJOR_VERSION; // 4
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-int Renderer11::getMinorShaderModel() const
-{
- switch (mRenderer11DeviceCaps.featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_SHADER_MINOR_VERSION; // 0
- case D3D_FEATURE_LEVEL_10_1:
- return D3D10_1_SHADER_MINOR_VERSION; // 1
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_SHADER_MINOR_VERSION; // 0
- case D3D_FEATURE_LEVEL_9_3:
- return D3D10_SHADER_MINOR_VERSION; // 0
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-std::string Renderer11::getShaderModelSuffix() const
-{
- switch (mRenderer11DeviceCaps.featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return "";
- case D3D_FEATURE_LEVEL_10_1:
- return "";
- case D3D_FEATURE_LEVEL_10_0:
- return "";
- case D3D_FEATURE_LEVEL_9_3:
- return "_level_9_3";
- default:
- UNREACHABLE();
- return "";
- }
-}
-
-const angle::WorkaroundsD3D &RendererD3D::getWorkarounds() const
-{
- if (!mWorkaroundsInitialized)
- {
- mWorkarounds = generateWorkarounds();
- mWorkaroundsInitialized = true;
- }
-
- return mWorkarounds;
-}
-
-gl::Error Renderer11::copyImageInternal(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- RenderTargetD3D *destRenderTarget)
-{
- const gl::FramebufferAttachment *colorAttachment = framebuffer->getReadColorbuffer();
- ASSERT(colorAttachment);
-
- RenderTarget11 *sourceRenderTarget = nullptr;
- ANGLE_TRY(colorAttachment->getRenderTarget(context, &sourceRenderTarget));
- ASSERT(sourceRenderTarget);
-
- const d3d11::SharedSRV &source = sourceRenderTarget->getBlitShaderResourceView();
- ASSERT(source.valid());
-
- const d3d11::RenderTargetView &dest =
- GetAs<RenderTarget11>(destRenderTarget)->getRenderTargetView();
- ASSERT(dest.valid());
-
- gl::Box sourceArea(sourceRect.x, sourceRect.y, 0, sourceRect.width, sourceRect.height, 1);
- gl::Extents sourceSize(sourceRenderTarget->getWidth(), sourceRenderTarget->getHeight(), 1);
-
- const bool invertSource = UsePresentPathFast(this, colorAttachment);
- if (invertSource)
- {
- sourceArea.y = sourceSize.height - sourceRect.y;
- sourceArea.height = -sourceArea.height;
- }
-
- gl::Box destArea(destOffset.x, destOffset.y, 0, sourceRect.width, sourceRect.height, 1);
- gl::Extents destSize(destRenderTarget->getWidth(), destRenderTarget->getHeight(), 1);
-
- // Use nearest filtering because source and destination are the same size for the direct copy.
- // Convert to the unsized format before calling copyTexture.
- GLenum sourceFormat = colorAttachment->getFormat().info->format;
- ANGLE_TRY(mBlit->copyTexture(context, source, sourceArea, sourceSize, sourceFormat, dest,
- destArea, destSize, nullptr, gl::GetUnsizedFormat(destFormat),
- GL_NEAREST, false, false, false));
-
- return gl::NoError();
-}
-
-gl::Error Renderer11::copyImage2D(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLint level)
-{
- TextureStorage11_2D *storage11 = GetAs<TextureStorage11_2D>(storage);
- ASSERT(storage11);
-
- gl::ImageIndex index = gl::ImageIndex::Make2D(level);
- RenderTargetD3D *destRenderTarget = nullptr;
- ANGLE_TRY(storage11->getRenderTarget(context, index, &destRenderTarget));
- ASSERT(destRenderTarget);
-
- ANGLE_TRY(copyImageInternal(context, framebuffer, sourceRect, destFormat, destOffset,
- destRenderTarget));
-
- storage11->markLevelDirty(level);
-
- return gl::NoError();
-}
-
-gl::Error Renderer11::copyImageCube(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLenum target,
- GLint level)
-{
- TextureStorage11_Cube *storage11 = GetAs<TextureStorage11_Cube>(storage);
- ASSERT(storage11);
-
- gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level);
- RenderTargetD3D *destRenderTarget = nullptr;
- ANGLE_TRY(storage11->getRenderTarget(context, index, &destRenderTarget));
- ASSERT(destRenderTarget);
-
- ANGLE_TRY(copyImageInternal(context, framebuffer, sourceRect, destFormat, destOffset,
- destRenderTarget));
-
- storage11->markLevelDirty(level);
-
- return gl::NoError();
-}
-
-gl::Error Renderer11::copyImage3D(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLint level)
-{
- TextureStorage11_3D *storage11 = GetAs<TextureStorage11_3D>(storage);
- ASSERT(storage11);
-
- gl::ImageIndex index = gl::ImageIndex::Make3D(level, destOffset.z);
- RenderTargetD3D *destRenderTarget = nullptr;
- ANGLE_TRY(storage11->getRenderTarget(context, index, &destRenderTarget));
- ASSERT(destRenderTarget);
-
- ANGLE_TRY(copyImageInternal(context, framebuffer, sourceRect, destFormat, destOffset,
- destRenderTarget));
-
- storage11->markLevelDirty(level);
-
- return gl::NoError();
-}
-
-gl::Error Renderer11::copyImage2DArray(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLint level)
-{
- TextureStorage11_2DArray *storage11 = GetAs<TextureStorage11_2DArray>(storage);
- ASSERT(storage11);
-
- gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, destOffset.z);
- RenderTargetD3D *destRenderTarget = nullptr;
- ANGLE_TRY(storage11->getRenderTarget(context, index, &destRenderTarget));
- ASSERT(destRenderTarget);
-
- ANGLE_TRY(copyImageInternal(context, framebuffer, sourceRect, destFormat, destOffset,
- destRenderTarget));
- storage11->markLevelDirty(level);
-
- return gl::NoError();
-}
-
-gl::Error Renderer11::copyTexture(const gl::Context *context,
- const gl::Texture *source,
- GLint sourceLevel,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLenum destTarget,
- GLint destLevel,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha)
-{
- TextureD3D *sourceD3D = GetImplAs<TextureD3D>(source);
-
- TextureStorage *sourceStorage = nullptr;
- ANGLE_TRY(sourceD3D->getNativeTexture(context, &sourceStorage));
-
- TextureStorage11_2D *sourceStorage11 = GetAs<TextureStorage11_2D>(sourceStorage);
- ASSERT(sourceStorage11);
-
- TextureStorage11 *destStorage11 = GetAs<TextureStorage11>(storage);
- ASSERT(destStorage11);
-
- // Check for fast path where a CopySubresourceRegion can be used.
- if (unpackPremultiplyAlpha == unpackUnmultiplyAlpha && !unpackFlipY &&
- source->getFormat(GL_TEXTURE_2D, sourceLevel).info->format == destFormat &&
- sourceStorage11->getFormatSet().texFormat == destStorage11->getFormatSet().texFormat)
- {
- const TextureHelper11 *sourceResource = nullptr;
- ANGLE_TRY(sourceStorage11->getResource(context, &sourceResource));
-
- gl::ImageIndex sourceIndex = gl::ImageIndex::Make2D(sourceLevel);
- UINT sourceSubresource = sourceStorage11->getSubresourceIndex(sourceIndex);
-
- const TextureHelper11 *destResource = nullptr;
- ANGLE_TRY(destStorage11->getResource(context, &destResource));
-
- gl::ImageIndex destIndex = gl::ImageIndex::MakeGeneric(destTarget, destLevel);
- UINT destSubresource = destStorage11->getSubresourceIndex(destIndex);
-
- D3D11_BOX sourceBox{
- static_cast<UINT>(sourceRect.x),
- static_cast<UINT>(sourceRect.y),
- 0u,
- static_cast<UINT>(sourceRect.x + sourceRect.width),
- static_cast<UINT>(sourceRect.y + sourceRect.height),
- 1u,
- };
-
- mDeviceContext->CopySubresourceRegion(destResource->get(), destSubresource, destOffset.x,
- destOffset.y, destOffset.z, sourceResource->get(),
- sourceSubresource, &sourceBox);
- }
- else
- {
- const d3d11::SharedSRV *sourceSRV = nullptr;
- ANGLE_TRY(sourceStorage11->getSRVLevels(context, sourceLevel, sourceLevel, &sourceSRV));
-
- gl::ImageIndex destIndex = gl::ImageIndex::MakeGeneric(destTarget, destLevel);
- RenderTargetD3D *destRenderTargetD3D = nullptr;
- ANGLE_TRY(destStorage11->getRenderTarget(context, destIndex, &destRenderTargetD3D));
-
- RenderTarget11 *destRenderTarget11 = GetAs<RenderTarget11>(destRenderTargetD3D);
-
- const d3d11::RenderTargetView &destRTV = destRenderTarget11->getRenderTargetView();
- ASSERT(destRTV.valid());
-
- gl::Box sourceArea(sourceRect.x, sourceRect.y, 0, sourceRect.width, sourceRect.height, 1);
- gl::Extents sourceSize(
- static_cast<int>(source->getWidth(source->getTarget(), sourceLevel)),
- static_cast<int>(source->getHeight(source->getTarget(), sourceLevel)), 1);
- if (unpackFlipY)
- {
- sourceArea.y += sourceArea.height;
- sourceArea.height = -sourceArea.height;
- }
-
- gl::Box destArea(destOffset.x, destOffset.y, 0, sourceRect.width, sourceRect.height, 1);
- gl::Extents destSize(destRenderTarget11->getWidth(), destRenderTarget11->getHeight(), 1);
-
- // Use nearest filtering because source and destination are the same size for the direct
- // copy
- GLenum sourceFormat = source->getFormat(GL_TEXTURE_2D, sourceLevel).info->format;
- ANGLE_TRY(mBlit->copyTexture(context, *sourceSRV, sourceArea, sourceSize, sourceFormat,
- destRTV, destArea, destSize, nullptr, destFormat, GL_NEAREST,
- false, unpackPremultiplyAlpha, unpackUnmultiplyAlpha));
- }
-
- destStorage11->markLevelDirty(destLevel);
-
- return gl::NoError();
-}
-
-gl::Error Renderer11::copyCompressedTexture(const gl::Context *context,
- const gl::Texture *source,
- GLint sourceLevel,
- TextureStorage *storage,
- GLint destLevel)
-{
- TextureStorage11_2D *destStorage11 = GetAs<TextureStorage11_2D>(storage);
- ASSERT(destStorage11);
-
- const TextureHelper11 *destResource = nullptr;
- ANGLE_TRY(destStorage11->getResource(context, &destResource));
-
- gl::ImageIndex destIndex = gl::ImageIndex::Make2D(destLevel);
- UINT destSubresource = destStorage11->getSubresourceIndex(destIndex);
-
- TextureD3D *sourceD3D = GetImplAs<TextureD3D>(source);
- ASSERT(sourceD3D);
-
- TextureStorage *sourceStorage = nullptr;
- ANGLE_TRY(sourceD3D->getNativeTexture(context, &sourceStorage));
-
- TextureStorage11_2D *sourceStorage11 = GetAs<TextureStorage11_2D>(sourceStorage);
- ASSERT(sourceStorage11);
-
- const TextureHelper11 *sourceResource = nullptr;
- ANGLE_TRY(sourceStorage11->getResource(context, &sourceResource));
-
- gl::ImageIndex sourceIndex = gl::ImageIndex::Make2D(sourceLevel);
- UINT sourceSubresource = sourceStorage11->getSubresourceIndex(sourceIndex);
-
- mDeviceContext->CopySubresourceRegion(destResource->get(), destSubresource, 0, 0, 0,
- sourceResource->get(), sourceSubresource, nullptr);
-
- return gl::NoError();
-}
-
-gl::Error Renderer11::createRenderTarget(int width,
- int height,
- GLenum format,
- GLsizei samples,
- RenderTargetD3D **outRT)
-{
- const d3d11::Format &formatInfo = d3d11::Format::Get(format, mRenderer11DeviceCaps);
-
- const gl::TextureCaps &textureCaps = getNativeTextureCaps().get(format);
- GLuint supportedSamples = textureCaps.getNearestSamples(samples);
-
- if (width > 0 && height > 0)
- {
- // Create texture resource
- D3D11_TEXTURE2D_DESC desc;
- desc.Width = width;
- desc.Height = height;
- desc.MipLevels = 1;
- desc.ArraySize = 1;
- desc.Format = formatInfo.texFormat;
- desc.SampleDesc.Count = (supportedSamples == 0) ? 1 : supportedSamples;
- desc.SampleDesc.Quality = 0;
- desc.Usage = D3D11_USAGE_DEFAULT;
- desc.CPUAccessFlags = 0;
- desc.MiscFlags = 0;
-
- // If a rendertarget or depthstencil format exists for this texture format,
- // we'll flag it to allow binding that way. Shader resource views are a little
- // more complicated.
- bool bindRTV = false, bindDSV = false, bindSRV = false;
- bindRTV = (formatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN);
- bindDSV = (formatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN);
- bindSRV = (formatInfo.srvFormat != DXGI_FORMAT_UNKNOWN);
-
- bool isMultisampledDepthStencil = bindDSV && desc.SampleDesc.Count > 1;
- if (isMultisampledDepthStencil &&
- !mRenderer11DeviceCaps.supportsMultisampledDepthStencilSRVs)
- {
- bindSRV = false;
- }
-
- desc.BindFlags = (bindRTV ? D3D11_BIND_RENDER_TARGET : 0) |
- (bindDSV ? D3D11_BIND_DEPTH_STENCIL : 0) |
- (bindSRV ? D3D11_BIND_SHADER_RESOURCE : 0);
-
- // The format must be either an RTV or a DSV
- ASSERT(bindRTV != bindDSV);
-
- TextureHelper11 texture;
- ANGLE_TRY(allocateTexture(desc, formatInfo, &texture));
-
- d3d11::SharedSRV srv;
- d3d11::SharedSRV blitSRV;
- if (bindSRV)
- {
- D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
- srvDesc.Format = formatInfo.srvFormat;
- srvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_SRV_DIMENSION_TEXTURE2D
- : D3D11_SRV_DIMENSION_TEXTURE2DMS;
- srvDesc.Texture2D.MostDetailedMip = 0;
- srvDesc.Texture2D.MipLevels = 1;
-
- ANGLE_TRY(allocateResource(srvDesc, texture.get(), &srv));
-
- if (formatInfo.blitSRVFormat != formatInfo.srvFormat)
- {
- D3D11_SHADER_RESOURCE_VIEW_DESC blitSRVDesc;
- blitSRVDesc.Format = formatInfo.blitSRVFormat;
- blitSRVDesc.ViewDimension = (supportedSamples == 0)
- ? D3D11_SRV_DIMENSION_TEXTURE2D
- : D3D11_SRV_DIMENSION_TEXTURE2DMS;
- blitSRVDesc.Texture2D.MostDetailedMip = 0;
- blitSRVDesc.Texture2D.MipLevels = 1;
-
- ANGLE_TRY(allocateResource(blitSRVDesc, texture.get(), &blitSRV));
- }
- else
- {
- blitSRV = srv.makeCopy();
- }
- }
-
- if (bindDSV)
- {
- D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
- dsvDesc.Format = formatInfo.dsvFormat;
- dsvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_DSV_DIMENSION_TEXTURE2D
- : D3D11_DSV_DIMENSION_TEXTURE2DMS;
- dsvDesc.Texture2D.MipSlice = 0;
- dsvDesc.Flags = 0;
-
- d3d11::DepthStencilView dsv;
- ANGLE_TRY(allocateResource(dsvDesc, texture.get(), &dsv));
-
- *outRT = new TextureRenderTarget11(std::move(dsv), texture, srv, format, formatInfo,
- width, height, 1, supportedSamples);
- }
- else if (bindRTV)
- {
- D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
- rtvDesc.Format = formatInfo.rtvFormat;
- rtvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_RTV_DIMENSION_TEXTURE2D
- : D3D11_RTV_DIMENSION_TEXTURE2DMS;
- rtvDesc.Texture2D.MipSlice = 0;
-
- d3d11::RenderTargetView rtv;
- ANGLE_TRY(allocateResource(rtvDesc, texture.get(), &rtv));
-
- if (formatInfo.dataInitializerFunction != nullptr)
- {
- const float clearValues[4] = {0.0f, 0.0f, 0.0f, 1.0f};
- mDeviceContext->ClearRenderTargetView(rtv.get(), clearValues);
- }
-
- *outRT = new TextureRenderTarget11(std::move(rtv), texture, srv, blitSRV, format,
- formatInfo, width, height, 1, supportedSamples);
- }
- else
- {
- UNREACHABLE();
- }
- }
- else
- {
- *outRT = new TextureRenderTarget11(d3d11::RenderTargetView(), TextureHelper11(),
- d3d11::SharedSRV(), d3d11::SharedSRV(), format,
- d3d11::Format::Get(GL_NONE, mRenderer11DeviceCaps),
- width, height, 1, supportedSamples);
- }
-
- return gl::NoError();
-}
-
-gl::Error Renderer11::createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT)
-{
- ASSERT(source != nullptr);
-
- RenderTargetD3D *newRT = nullptr;
- ANGLE_TRY(createRenderTarget(source->getWidth(), source->getHeight(),
- source->getInternalFormat(), source->getSamples(), &newRT));
-
- RenderTarget11 *source11 = GetAs<RenderTarget11>(source);
- RenderTarget11 *dest11 = GetAs<RenderTarget11>(newRT);
-
- mDeviceContext->CopySubresourceRegion(dest11->getTexture().get(), dest11->getSubresourceIndex(),
- 0, 0, 0, source11->getTexture().get(),
- source11->getSubresourceIndex(), nullptr);
- *outRT = newRT;
- return gl::NoError();
-}
-
-gl::Error Renderer11::loadExecutable(const uint8_t *function,
- size_t length,
- gl::ShaderType type,
- const std::vector<D3DVarying> &streamOutVaryings,
- bool separatedOutputBuffers,
- ShaderExecutableD3D **outExecutable)
-{
- ShaderData shaderData(function, length);
-
- switch (type)
- {
- case gl::SHADER_VERTEX:
- {
- d3d11::VertexShader vertexShader;
- d3d11::GeometryShader streamOutShader;
- ANGLE_TRY(allocateResource(shaderData, &vertexShader));
-
- if (!streamOutVaryings.empty())
- {
- std::vector<D3D11_SO_DECLARATION_ENTRY> soDeclaration;
- soDeclaration.reserve(streamOutVaryings.size());
-
- for (const auto &streamOutVarying : streamOutVaryings)
- {
- D3D11_SO_DECLARATION_ENTRY entry = {0};
- entry.Stream = 0;
- entry.SemanticName = streamOutVarying.semanticName.c_str();
- entry.SemanticIndex = streamOutVarying.semanticIndex;
- entry.StartComponent = 0;
- entry.ComponentCount = static_cast<BYTE>(streamOutVarying.componentCount);
- entry.OutputSlot = static_cast<BYTE>(
- (separatedOutputBuffers ? streamOutVarying.outputSlot : 0));
- soDeclaration.push_back(entry);
- }
-
- ANGLE_TRY(allocateResource(shaderData, &soDeclaration, &streamOutShader));
- }
-
- *outExecutable = new ShaderExecutable11(function, length, std::move(vertexShader),
- std::move(streamOutShader));
- }
- break;
- case gl::SHADER_FRAGMENT:
- {
- d3d11::PixelShader pixelShader;
- ANGLE_TRY(allocateResource(shaderData, &pixelShader));
- *outExecutable = new ShaderExecutable11(function, length, std::move(pixelShader));
- }
- break;
- case gl::SHADER_GEOMETRY:
- {
- d3d11::GeometryShader geometryShader;
- ANGLE_TRY(allocateResource(shaderData, &geometryShader));
- *outExecutable = new ShaderExecutable11(function, length, std::move(geometryShader));
- }
- break;
- case gl::SHADER_COMPUTE:
- {
- d3d11::ComputeShader computeShader;
- ANGLE_TRY(allocateResource(shaderData, &computeShader));
- *outExecutable = new ShaderExecutable11(function, length, std::move(computeShader));
- }
- break;
- default:
- UNREACHABLE();
- return gl::InternalError();
- }
-
- return gl::NoError();
-}
-
-gl::Error Renderer11::compileToExecutable(gl::InfoLog &infoLog,
- const std::string &shaderHLSL,
- gl::ShaderType type,
- const std::vector<D3DVarying> &streamOutVaryings,
- bool separatedOutputBuffers,
- const angle::CompilerWorkaroundsD3D &workarounds,
- ShaderExecutableD3D **outExectuable)
-{
- std::stringstream profileStream;
-
- switch (type)
- {
- case gl::SHADER_VERTEX:
- profileStream << "vs";
- break;
- case gl::SHADER_FRAGMENT:
- profileStream << "ps";
- break;
- case gl::SHADER_GEOMETRY:
- profileStream << "gs";
- break;
- case gl::SHADER_COMPUTE:
- profileStream << "cs";
- break;
- default:
- UNREACHABLE();
- return gl::InternalError();
- }
-
- profileStream << "_" << getMajorShaderModel() << "_" << getMinorShaderModel()
- << getShaderModelSuffix();
- std::string profile = profileStream.str();
-
- UINT flags = D3DCOMPILE_OPTIMIZATION_LEVEL2;
-
- if (gl::DebugAnnotationsActive())
- {
-#ifndef NDEBUG
- flags = D3DCOMPILE_SKIP_OPTIMIZATION;
-#endif
-
- flags |= D3DCOMPILE_DEBUG;
- }
-
- if (workarounds.enableIEEEStrictness)
- flags |= D3DCOMPILE_IEEE_STRICTNESS;
-
- // Sometimes D3DCompile will fail with the default compilation flags for complicated shaders
- // when it would otherwise pass with alternative options.
- // Try the default flags first and if compilation fails, try some alternatives.
- std::vector<CompileConfig> configs;
- configs.push_back(CompileConfig(flags, "default"));
- configs.push_back(CompileConfig(flags | D3DCOMPILE_SKIP_VALIDATION, "skip validation"));
- configs.push_back(CompileConfig(flags | D3DCOMPILE_SKIP_OPTIMIZATION, "skip optimization"));
-
- if (getMajorShaderModel() == 4 && getShaderModelSuffix() != "")
- {
- // Some shaders might cause a "blob content mismatch between level9 and d3d10 shader".
- // e.g. dEQP-GLES2.functional.shaders.struct.local.loop_nested_struct_array_*.
- // Using the [unroll] directive works around this, as does this D3DCompile flag.
- configs.push_back(
- CompileConfig(flags | D3DCOMPILE_AVOID_FLOW_CONTROL, "avoid flow control"));
- }
-
- D3D_SHADER_MACRO loopMacros[] = {{"ANGLE_ENABLE_LOOP_FLATTEN", "1"}, {0, 0}};
-
- // TODO(jmadill): Use ComPtr?
- ID3DBlob *binary = nullptr;
- std::string debugInfo;
- ANGLE_TRY(mCompiler.compileToBinary(infoLog, shaderHLSL, profile, configs, loopMacros, &binary,
- &debugInfo));
-
- // It's possible that binary is NULL if the compiler failed in all configurations. Set the
- // executable to NULL and return GL_NO_ERROR to signify that there was a link error but the
- // internal state is still OK.
- if (!binary)
- {
- *outExectuable = nullptr;
- return gl::NoError();
- }
-
- gl::Error error = loadExecutable(reinterpret_cast<const uint8_t *>(binary->GetBufferPointer()),
- binary->GetBufferSize(), type, streamOutVaryings,
- separatedOutputBuffers, outExectuable);
-
- SafeRelease(binary);
- if (error.isError())
- {
- return error;
- }
-
- if (!debugInfo.empty())
- {
- (*outExectuable)->appendDebugInfo(debugInfo);
- }
-
- return gl::NoError();
-}
-
-gl::Error Renderer11::ensureHLSLCompilerInitialized()
-{
- return mCompiler.ensureInitialized();
-}
-
-UniformStorageD3D *Renderer11::createUniformStorage(size_t storageSize)
-{
- return new UniformStorage11(storageSize);
-}
-
-VertexBuffer *Renderer11::createVertexBuffer()
-{
- return new VertexBuffer11(this);
-}
-
-IndexBuffer *Renderer11::createIndexBuffer()
-{
- return new IndexBuffer11(this);
-}
-
-StreamProducerImpl *Renderer11::createStreamProducerD3DTextureNV12(
- egl::Stream::ConsumerType consumerType,
- const egl::AttributeMap &attribs)
-{
- return new StreamProducerNV12(this);
-}
-
-bool Renderer11::supportsFastCopyBufferToTexture(GLenum internalFormat) const
-{
- ASSERT(getNativeExtensions().pixelBufferObject);
-
- const gl::InternalFormat &internalFormatInfo = gl::GetSizedInternalFormatInfo(internalFormat);
- const d3d11::Format &d3d11FormatInfo =
- d3d11::Format::Get(internalFormat, mRenderer11DeviceCaps);
-
- // sRGB formats do not work with D3D11 buffer SRVs
- if (internalFormatInfo.colorEncoding == GL_SRGB)
- {
- return false;
- }
-
- // We cannot support direct copies to non-color-renderable formats
- if (d3d11FormatInfo.rtvFormat == DXGI_FORMAT_UNKNOWN)
- {
- return false;
- }
-
- // We skip all 3-channel formats since sometimes format support is missing
- if (internalFormatInfo.componentCount == 3)
- {
- return false;
- }
-
- // We don't support formats which we can't represent without conversion
- if (d3d11FormatInfo.format().glInternalFormat != internalFormat)
- {
- return false;
- }
-
- // Buffer SRV creation for this format was not working on Windows 10.
- if (d3d11FormatInfo.texFormat == DXGI_FORMAT_B5G5R5A1_UNORM)
- {
- return false;
- }
-
- // This format is not supported as a buffer SRV.
- if (d3d11FormatInfo.texFormat == DXGI_FORMAT_A8_UNORM)
- {
- return false;
- }
-
- return true;
-}
-
-gl::Error Renderer11::fastCopyBufferToTexture(const gl::Context *context,
- const gl::PixelUnpackState &unpack,
- unsigned int offset,
- RenderTargetD3D *destRenderTarget,
- GLenum destinationFormat,
- GLenum sourcePixelsType,
- const gl::Box &destArea)
-{
- ASSERT(supportsFastCopyBufferToTexture(destinationFormat));
- return mPixelTransfer->copyBufferToTexture(context, unpack, offset, destRenderTarget,
- destinationFormat, sourcePixelsType, destArea);
-}
-
-ImageD3D *Renderer11::createImage()
-{
- return new Image11(this);
-}
-
-gl::Error Renderer11::generateMipmap(const gl::Context *context, ImageD3D *dest, ImageD3D *src)
-{
- Image11 *dest11 = GetAs<Image11>(dest);
- Image11 *src11 = GetAs<Image11>(src);
- return Image11::GenerateMipmap(context, dest11, src11, mRenderer11DeviceCaps);
-}
-
-gl::Error Renderer11::generateMipmapUsingD3D(const gl::Context *context,
- TextureStorage *storage,
- const gl::TextureState &textureState)
-{
- TextureStorage11 *storage11 = GetAs<TextureStorage11>(storage);
-
- ASSERT(storage11->isRenderTarget());
- ASSERT(storage11->supportsNativeMipmapFunction());
-
- const d3d11::SharedSRV *srv = nullptr;
- ANGLE_TRY(storage11->getSRVLevels(context, textureState.getEffectiveBaseLevel(),
- textureState.getEffectiveMaxLevel(), &srv));
-
- mDeviceContext->GenerateMips(srv->get());
-
- return gl::NoError();
-}
-
-gl::Error Renderer11::copyImage(const gl::Context *context,
- ImageD3D *dest,
- ImageD3D *source,
- const gl::Rectangle &sourceRect,
- const gl::Offset &destOffset,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha)
-{
- Image11 *dest11 = GetAs<Image11>(dest);
- Image11 *src11 = GetAs<Image11>(source);
- return Image11::CopyImage(context, dest11, src11, sourceRect, destOffset, unpackFlipY,
- unpackPremultiplyAlpha, unpackUnmultiplyAlpha, mRenderer11DeviceCaps);
-}
-
-TextureStorage *Renderer11::createTextureStorage2D(SwapChainD3D *swapChain)
-{
- SwapChain11 *swapChain11 = GetAs<SwapChain11>(swapChain);
- return new TextureStorage11_2D(this, swapChain11);
-}
-
-TextureStorage *Renderer11::createTextureStorageEGLImage(EGLImageD3D *eglImage,
- RenderTargetD3D *renderTargetD3D)
-{
- return new TextureStorage11_EGLImage(this, eglImage, GetAs<RenderTarget11>(renderTargetD3D));
-}
-
-TextureStorage *Renderer11::createTextureStorageExternal(
- egl::Stream *stream,
- const egl::Stream::GLTextureDescription &desc)
-{
- return new TextureStorage11_External(this, stream, desc);
-}
-
-TextureStorage *Renderer11::createTextureStorage2D(GLenum internalformat,
- bool renderTarget,
- GLsizei width,
- GLsizei height,
- int levels,
- bool hintLevelZeroOnly)
-{
- return new TextureStorage11_2D(this, internalformat, renderTarget, width, height, levels,
- hintLevelZeroOnly);
-}
-
-TextureStorage *Renderer11::createTextureStorageCube(GLenum internalformat,
- bool renderTarget,
- int size,
- int levels,
- bool hintLevelZeroOnly)
-{
- return new TextureStorage11_Cube(this, internalformat, renderTarget, size, levels,
- hintLevelZeroOnly);
-}
-
-TextureStorage *Renderer11::createTextureStorage3D(GLenum internalformat,
- bool renderTarget,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- int levels)
-{
- return new TextureStorage11_3D(this, internalformat, renderTarget, width, height, depth,
- levels);
-}
-
-TextureStorage *Renderer11::createTextureStorage2DArray(GLenum internalformat,
- bool renderTarget,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- int levels)
-{
- return new TextureStorage11_2DArray(this, internalformat, renderTarget, width, height, depth,
- levels);
-}
-
-TextureStorage *Renderer11::createTextureStorage2DMultisample(GLenum internalformat,
- GLsizei width,
- GLsizei height,
- int levels,
- int samples,
- bool fixedSampleLocations)
-{
- return new TextureStorage11_2DMultisample(this, internalformat, width, height, levels, samples,
- fixedSampleLocations);
-}
-
-gl::Error Renderer11::readFromAttachment(const gl::Context *context,
- const gl::FramebufferAttachment &srcAttachment,
- const gl::Rectangle &sourceArea,
- GLenum format,
- GLenum type,
- GLuint outputPitch,
- const gl::PixelPackState &pack,
- uint8_t *pixelsOut)
-{
- ASSERT(sourceArea.width >= 0);
- ASSERT(sourceArea.height >= 0);
-
- const bool invertTexture = UsePresentPathFast(this, &srcAttachment);
-
- RenderTarget11 *rt11 = nullptr;
- ANGLE_TRY(srcAttachment.getRenderTarget(context, &rt11));
- ASSERT(rt11->getTexture().valid());
-
- const TextureHelper11 &textureHelper = rt11->getTexture();
- unsigned int sourceSubResource = rt11->getSubresourceIndex();
-
- const gl::Extents &texSize = textureHelper.getExtents();
-
- gl::Rectangle actualArea = sourceArea;
- if (invertTexture)
- {
- actualArea.y = texSize.height - actualArea.y - actualArea.height;
- }
-
- // Clamp read region to the defined texture boundaries, preventing out of bounds reads
- // and reads of uninitialized data.
- gl::Rectangle safeArea;
- safeArea.x = gl::clamp(actualArea.x, 0, texSize.width);
- safeArea.y = gl::clamp(actualArea.y, 0, texSize.height);
- safeArea.width =
- gl::clamp(actualArea.width + std::min(actualArea.x, 0), 0, texSize.width - safeArea.x);
- safeArea.height =
- gl::clamp(actualArea.height + std::min(actualArea.y, 0), 0, texSize.height - safeArea.y);
-
- ASSERT(safeArea.x >= 0 && safeArea.y >= 0);
- ASSERT(safeArea.x + safeArea.width <= texSize.width);
- ASSERT(safeArea.y + safeArea.height <= texSize.height);
-
- if (safeArea.width == 0 || safeArea.height == 0)
- {
- // no work to do
- return gl::NoError();
- }
-
- gl::Extents safeSize(safeArea.width, safeArea.height, 1);
- TextureHelper11 stagingHelper;
- ANGLE_TRY_RESULT(
- createStagingTexture(textureHelper.getTextureType(), textureHelper.getFormatSet(), safeSize,
- StagingAccess::READ),
- stagingHelper);
-
- TextureHelper11 resolvedTextureHelper;
-
- // "srcTexture" usually points to the source texture.
- // For 2D multisampled textures, it points to the multisampled resolve texture.
- const TextureHelper11 *srcTexture = &textureHelper;
-
- if (textureHelper.is2D() && textureHelper.getSampleCount() > 1)
- {
- D3D11_TEXTURE2D_DESC resolveDesc;
- resolveDesc.Width = static_cast<UINT>(texSize.width);
- resolveDesc.Height = static_cast<UINT>(texSize.height);
- resolveDesc.MipLevels = 1;
- resolveDesc.ArraySize = 1;
- resolveDesc.Format = textureHelper.getFormat();
- resolveDesc.SampleDesc.Count = 1;
- resolveDesc.SampleDesc.Quality = 0;
- resolveDesc.Usage = D3D11_USAGE_DEFAULT;
- resolveDesc.BindFlags = 0;
- resolveDesc.CPUAccessFlags = 0;
- resolveDesc.MiscFlags = 0;
-
- ANGLE_TRY(
- allocateTexture(resolveDesc, textureHelper.getFormatSet(), &resolvedTextureHelper));
-
- mDeviceContext->ResolveSubresource(resolvedTextureHelper.get(), 0, textureHelper.get(),
- sourceSubResource, textureHelper.getFormat());
-
- sourceSubResource = 0;
- srcTexture = &resolvedTextureHelper;
- }
-
- D3D11_BOX srcBox;
- srcBox.left = static_cast<UINT>(safeArea.x);
- srcBox.right = static_cast<UINT>(safeArea.x + safeArea.width);
- srcBox.top = static_cast<UINT>(safeArea.y);
- srcBox.bottom = static_cast<UINT>(safeArea.y + safeArea.height);
-
- // Select the correct layer from a 3D attachment
- srcBox.front = 0;
- if (textureHelper.is3D())
- {
- srcBox.front = static_cast<UINT>(srcAttachment.layer());
- }
- srcBox.back = srcBox.front + 1;
-
- mDeviceContext->CopySubresourceRegion(stagingHelper.get(), 0, 0, 0, 0, srcTexture->get(),
- sourceSubResource, &srcBox);
-
- gl::Buffer *packBuffer = context->getGLState().getTargetBuffer(gl::BufferBinding::PixelPack);
- if (!invertTexture)
- {
- PackPixelsParams packParams(safeArea, format, type, outputPitch, pack, packBuffer, 0);
- return packPixels(stagingHelper, packParams, pixelsOut);
- }
-
- // Create a new PixelPackState with reversed row order. Note that we can't just assign
- // 'invertTexturePack' to be 'pack' (or memcpy) since that breaks the ref counting/object
- // tracking in the 'pixelBuffer' members, causing leaks. Instead we must use
- // pixelBuffer.set() twice, which performs the addRef/release correctly
- gl::PixelPackState invertTexturePack;
- invertTexturePack.alignment = pack.alignment;
- invertTexturePack.reverseRowOrder = !pack.reverseRowOrder;
-
- PackPixelsParams packParams(safeArea, format, type, outputPitch, invertTexturePack, packBuffer,
- 0);
- gl::Error error = packPixels(stagingHelper, packParams, pixelsOut);
- ANGLE_TRY(error);
- return gl::NoError();
-}
-
-gl::Error Renderer11::packPixels(const TextureHelper11 &textureHelper,
- const PackPixelsParams &params,
- uint8_t *pixelsOut)
-{
- ID3D11Resource *readResource = textureHelper.get();
-
- D3D11_MAPPED_SUBRESOURCE mapping;
- HRESULT hr = mDeviceContext->Map(readResource, 0, D3D11_MAP_READ, 0, &mapping);
- if (FAILED(hr))
- {
- ASSERT(hr == E_OUTOFMEMORY);
- return gl::OutOfMemory() << "Failed to map internal texture for reading, " << gl::FmtHR(hr);
- }
-
- uint8_t *source = static_cast<uint8_t *>(mapping.pData);
- int inputPitch = static_cast<int>(mapping.RowPitch);
-
- const auto &formatInfo = textureHelper.getFormatSet();
- ASSERT(formatInfo.format().glInternalFormat != GL_NONE);
-
- PackPixels(params, formatInfo.format(), inputPitch, source, pixelsOut);
-
- mDeviceContext->Unmap(readResource, 0);
-
- return gl::NoError();
-}
-
-gl::Error Renderer11::blitRenderbufferRect(const gl::Context *context,
- const gl::Rectangle &readRectIn,
- const gl::Rectangle &drawRectIn,
- RenderTargetD3D *readRenderTarget,
- RenderTargetD3D *drawRenderTarget,
- GLenum filter,
- const gl::Rectangle *scissor,
- bool colorBlit,
- bool depthBlit,
- bool stencilBlit)
-{
- // Since blitRenderbufferRect is called for each render buffer that needs to be blitted,
- // it should never be the case that both color and depth/stencil need to be blitted at
- // at the same time.
- ASSERT(colorBlit != (depthBlit || stencilBlit));
-
- RenderTarget11 *drawRenderTarget11 = GetAs<RenderTarget11>(drawRenderTarget);
- if (!drawRenderTarget11)
- {
- return gl::OutOfMemory()
- << "Failed to retrieve the internal draw render target from the draw framebuffer.";
- }
-
- const TextureHelper11 &drawTexture = drawRenderTarget11->getTexture();
- unsigned int drawSubresource = drawRenderTarget11->getSubresourceIndex();
-
- RenderTarget11 *readRenderTarget11 = GetAs<RenderTarget11>(readRenderTarget);
- if (!readRenderTarget11)
- {
- return gl::OutOfMemory()
- << "Failed to retrieve the internal read render target from the read framebuffer.";
- }
-
- TextureHelper11 readTexture;
- unsigned int readSubresource = 0;
- d3d11::SharedSRV readSRV;
-
- if (readRenderTarget->isMultisampled())
- {
- ANGLE_TRY_RESULT(
- resolveMultisampledTexture(context, readRenderTarget11, depthBlit, stencilBlit),
- readTexture);
-
- if (!stencilBlit)
- {
- const auto &readFormatSet = readTexture.getFormatSet();
-
- D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
- viewDesc.Format = readFormatSet.srvFormat;
- viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
- viewDesc.Texture2D.MipLevels = 1;
- viewDesc.Texture2D.MostDetailedMip = 0;
-
- ANGLE_TRY(allocateResource(viewDesc, readTexture.get(), &readSRV));
- }
- }
- else
- {
- ASSERT(readRenderTarget11);
- readTexture = readRenderTarget11->getTexture();
- readSubresource = readRenderTarget11->getSubresourceIndex();
- readSRV = readRenderTarget11->getBlitShaderResourceView().makeCopy();
- if (!readSRV.valid())
- {
- ASSERT(depthBlit || stencilBlit);
- readSRV = readRenderTarget11->getShaderResourceView().makeCopy();
- }
- ASSERT(readSRV.valid());
- }
-
- // Stencil blits don't use shaders.
- ASSERT(readSRV.valid() || stencilBlit);
-
- const gl::Extents readSize(readRenderTarget->getWidth(), readRenderTarget->getHeight(), 1);
- const gl::Extents drawSize(drawRenderTarget->getWidth(), drawRenderTarget->getHeight(), 1);
-
- // From the spec:
- // "The actual region taken from the read framebuffer is limited to the intersection of the
- // source buffers being transferred, which may include the color buffer selected by the read
- // buffer, the depth buffer, and / or the stencil buffer depending on mask."
- // This means negative x and y are out of bounds, and not to be read from. We handle this here
- // by internally scaling the read and draw rectangles.
- gl::Rectangle readRect = readRectIn;
- gl::Rectangle drawRect = drawRectIn;
-
- auto flip = [](int val) { return val >= 0 ? 1 : -1; };
-
- if (readRect.x > readSize.width && readRect.width < 0)
- {
- int delta = readRect.x - readSize.width;
- readRect.x -= delta;
- readRect.width += delta;
-
- int drawDelta = delta * flip(drawRect.width);
- drawRect.x += drawDelta;
- drawRect.width -= drawDelta;
- }
-
- if (readRect.y > readSize.height && readRect.height < 0)
- {
- int delta = readRect.y - readSize.height;
- readRect.y -= delta;
- readRect.height += delta;
-
- int drawDelta = delta * flip(drawRect.height);
- drawRect.y += drawDelta;
- drawRect.height -= drawDelta;
- }
-
- auto readToDrawX = [&drawRectIn, &readRectIn](int readOffset) {
- double readToDrawScale =
- static_cast<double>(drawRectIn.width) / static_cast<double>(readRectIn.width);
- return static_cast<int>(round(static_cast<double>(readOffset) * readToDrawScale));
- };
- if (readRect.x < 0)
- {
- int readOffset = -readRect.x;
- readRect.x += readOffset;
- readRect.width -= readOffset;
-
- int drawOffset = readToDrawX(readOffset);
- drawRect.x += drawOffset;
- drawRect.width -= drawOffset;
- }
-
- auto readToDrawY = [&drawRectIn, &readRectIn](int readOffset) {
- double readToDrawScale =
- static_cast<double>(drawRectIn.height) / static_cast<double>(readRectIn.height);
- return static_cast<int>(round(static_cast<double>(readOffset) * readToDrawScale));
- };
- if (readRect.y < 0)
- {
- int readOffset = -readRect.y;
- readRect.y += readOffset;
- readRect.height -= readOffset;
-
- int drawOffset = readToDrawY(readOffset);
- drawRect.y += drawOffset;
- drawRect.height -= drawOffset;
- }
-
- if (readRect.x1() < 0)
- {
- int readOffset = -readRect.x1();
- readRect.width += readOffset;
-
- int drawOffset = readToDrawX(readOffset);
- drawRect.width += drawOffset;
- }
-
- if (readRect.y1() < 0)
- {
- int readOffset = -readRect.y1();
- readRect.height += readOffset;
-
- int drawOffset = readToDrawY(readOffset);
- drawRect.height += drawOffset;
- }
-
- if (readRect.x1() > readSize.width)
- {
- int delta = readRect.x1() - readSize.width;
- readRect.width -= delta;
- drawRect.width -= delta * flip(drawRect.width);
- }
-
- if (readRect.y1() > readSize.height)
- {
- int delta = readRect.y1() - readSize.height;
- readRect.height -= delta;
- drawRect.height -= delta * flip(drawRect.height);
- }
-
- bool scissorNeeded = scissor && gl::ClipRectangle(drawRect, *scissor, nullptr);
-
- const auto &destFormatInfo =
- gl::GetSizedInternalFormatInfo(drawRenderTarget->getInternalFormat());
- const auto &srcFormatInfo =
- gl::GetSizedInternalFormatInfo(readRenderTarget->getInternalFormat());
- const auto &formatSet = drawRenderTarget11->getFormatSet();
- const auto &nativeFormat = formatSet.format();
-
- // Some blits require masking off emulated texture channels. eg: from RGBA8 to RGB8, we
- // emulate RGB8 with RGBA8, so we need to mask off the alpha channel when we copy.
-
- gl::Color<bool> colorMask;
- colorMask.red =
- (srcFormatInfo.redBits > 0) && (destFormatInfo.redBits == 0) && (nativeFormat.redBits > 0);
- colorMask.green = (srcFormatInfo.greenBits > 0) && (destFormatInfo.greenBits == 0) &&
- (nativeFormat.greenBits > 0);
- colorMask.blue = (srcFormatInfo.blueBits > 0) && (destFormatInfo.blueBits == 0) &&
- (nativeFormat.blueBits > 0);
- colorMask.alpha = (srcFormatInfo.alphaBits > 0) && (destFormatInfo.alphaBits == 0) &&
- (nativeFormat.alphaBits > 0);
-
- // We only currently support masking off the alpha channel.
- bool colorMaskingNeeded = colorMask.alpha;
- ASSERT(!colorMask.red && !colorMask.green && !colorMask.blue);
-
- bool wholeBufferCopy = !scissorNeeded && !colorMaskingNeeded && readRect.x == 0 &&
- readRect.width == readSize.width && readRect.y == 0 &&
- readRect.height == readSize.height && drawRect.x == 0 &&
- drawRect.width == drawSize.width && drawRect.y == 0 &&
- drawRect.height == drawSize.height;
-
- bool stretchRequired = readRect.width != drawRect.width || readRect.height != drawRect.height;
-
- bool flipRequired =
- readRect.width < 0 || readRect.height < 0 || drawRect.width < 0 || drawRect.height < 0;
-
- bool outOfBounds = readRect.x < 0 || readRect.x + readRect.width > readSize.width ||
- readRect.y < 0 || readRect.y + readRect.height > readSize.height ||
- drawRect.x < 0 || drawRect.x + drawRect.width > drawSize.width ||
- drawRect.y < 0 || drawRect.y + drawRect.height > drawSize.height;
-
- bool partialDSBlit =
- (nativeFormat.depthBits > 0 && depthBlit) != (nativeFormat.stencilBits > 0 && stencilBlit);
-
- if (readRenderTarget11->getFormatSet().formatID ==
- drawRenderTarget11->getFormatSet().formatID &&
- !stretchRequired && !outOfBounds && !flipRequired && !partialDSBlit &&
- !colorMaskingNeeded && (!(depthBlit || stencilBlit) || wholeBufferCopy))
- {
- UINT dstX = drawRect.x;
- UINT dstY = drawRect.y;
-
- D3D11_BOX readBox;
- readBox.left = readRect.x;
- readBox.right = readRect.x + readRect.width;
- readBox.top = readRect.y;
- readBox.bottom = readRect.y + readRect.height;
- readBox.front = 0;
- readBox.back = 1;
-
- if (scissorNeeded)
- {
- // drawRect is guaranteed to have positive width and height because stretchRequired is
- // false.
- ASSERT(drawRect.width >= 0 || drawRect.height >= 0);
-
- if (drawRect.x < scissor->x)
- {
- dstX = scissor->x;
- readBox.left += (scissor->x - drawRect.x);
- }
- if (drawRect.y < scissor->y)
- {
- dstY = scissor->y;
- readBox.top += (scissor->y - drawRect.y);
- }
- if (drawRect.x + drawRect.width > scissor->x + scissor->width)
- {
- readBox.right -= ((drawRect.x + drawRect.width) - (scissor->x + scissor->width));
- }
- if (drawRect.y + drawRect.height > scissor->y + scissor->height)
- {
- readBox.bottom -= ((drawRect.y + drawRect.height) - (scissor->y + scissor->height));
- }
- }
-
- // D3D11 needs depth-stencil CopySubresourceRegions to have a NULL pSrcBox
- // We also require complete framebuffer copies for depth-stencil blit.
- D3D11_BOX *pSrcBox = wholeBufferCopy ? nullptr : &readBox;
-
- mDeviceContext->CopySubresourceRegion(drawTexture.get(), drawSubresource, dstX, dstY, 0,
- readTexture.get(), readSubresource, pSrcBox);
- }
- else
- {
- gl::Box readArea(readRect.x, readRect.y, 0, readRect.width, readRect.height, 1);
- gl::Box drawArea(drawRect.x, drawRect.y, 0, drawRect.width, drawRect.height, 1);
-
- if (depthBlit && stencilBlit)
- {
- ANGLE_TRY(mBlit->copyDepthStencil(readTexture, readSubresource, readArea, readSize,
- drawTexture, drawSubresource, drawArea, drawSize,
- scissor));
- }
- else if (depthBlit)
- {
- const d3d11::DepthStencilView &drawDSV = drawRenderTarget11->getDepthStencilView();
- ASSERT(readSRV.valid());
- ANGLE_TRY(mBlit->copyDepth(context, readSRV, readArea, readSize, drawDSV, drawArea,
- drawSize, scissor));
- }
- else if (stencilBlit)
- {
- ANGLE_TRY(mBlit->copyStencil(context, readTexture, readSubresource, readArea, readSize,
- drawTexture, drawSubresource, drawArea, drawSize,
- scissor));
- }
- else
- {
- const d3d11::RenderTargetView &drawRTV = drawRenderTarget11->getRenderTargetView();
-
- // We don't currently support masking off any other channel than alpha
- bool maskOffAlpha = colorMaskingNeeded && colorMask.alpha;
- ASSERT(readSRV.valid());
- ANGLE_TRY(mBlit->copyTexture(
- context, readSRV, readArea, readSize, srcFormatInfo.format, drawRTV, drawArea,
- drawSize, scissor, destFormatInfo.format, filter, maskOffAlpha, false, false));
- }
- }
-
- return gl::NoError();
-}
-
-bool Renderer11::isES3Capable() const
-{
- return (d3d11_gl::GetMaximumClientVersion(mRenderer11DeviceCaps.featureLevel).major > 2);
-}
-
-RendererClass Renderer11::getRendererClass() const
-{
- return RENDERER_D3D11;
-}
-
-void Renderer11::onSwap()
-{
- // Send histogram updates every half hour
- const double kHistogramUpdateInterval = 30 * 60;
-
- auto *platform = ANGLEPlatformCurrent();
- const double currentTime = platform->monotonicallyIncreasingTime(platform);
- const double timeSinceLastUpdate = currentTime - mLastHistogramUpdateTime;
-
- if (timeSinceLastUpdate > kHistogramUpdateInterval)
- {
- updateHistograms();
- mLastHistogramUpdateTime = currentTime;
- }
-}
-
-void Renderer11::updateHistograms()
-{
- // Update the buffer CPU memory histogram
- {
- size_t sizeSum = 0;
- for (const Buffer11 *buffer : mAliveBuffers)
- {
- sizeSum += buffer->getTotalCPUBufferMemoryBytes();
- }
- const int kOneMegaByte = 1024 * 1024;
- ANGLE_HISTOGRAM_MEMORY_MB("GPU.ANGLE.Buffer11CPUMemoryMB",
- static_cast<int>(sizeSum) / kOneMegaByte);
- }
-}
-
-void Renderer11::onBufferCreate(const Buffer11 *created)
-{
- mAliveBuffers.insert(created);
-}
-
-void Renderer11::onBufferDelete(const Buffer11 *deleted)
-{
- mAliveBuffers.erase(deleted);
-}
-
-gl::ErrorOrResult<TextureHelper11> Renderer11::resolveMultisampledTexture(
- const gl::Context *context,
- RenderTarget11 *renderTarget,
- bool depth,
- bool stencil)
-{
- if (depth && !stencil)
- {
- return mBlit->resolveDepth(context, renderTarget);
- }
-
- if (stencil)
- {
- return mBlit->resolveStencil(context, renderTarget, depth);
- }
-
- const auto &formatSet = renderTarget->getFormatSet();
-
- ASSERT(renderTarget->isMultisampled());
- const d3d11::SharedSRV &sourceSRV = renderTarget->getShaderResourceView();
- D3D11_SHADER_RESOURCE_VIEW_DESC sourceSRVDesc;
- sourceSRV.get()->GetDesc(&sourceSRVDesc);
- ASSERT(sourceSRVDesc.ViewDimension == D3D_SRV_DIMENSION_TEXTURE2DMS);
-
- if (!mCachedResolveTexture.valid() ||
- mCachedResolveTexture.getExtents().width != renderTarget->getWidth() ||
- mCachedResolveTexture.getExtents().height != renderTarget->getHeight() ||
- mCachedResolveTexture.getFormat() != formatSet.texFormat)
- {
- D3D11_TEXTURE2D_DESC resolveDesc;
- resolveDesc.Width = renderTarget->getWidth();
- resolveDesc.Height = renderTarget->getHeight();
- resolveDesc.MipLevels = 1;
- resolveDesc.ArraySize = 1;
- resolveDesc.Format = formatSet.texFormat;
- resolveDesc.SampleDesc.Count = 1;
- resolveDesc.SampleDesc.Quality = 0;
- resolveDesc.Usage = D3D11_USAGE_DEFAULT;
- resolveDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
- resolveDesc.CPUAccessFlags = 0;
- resolveDesc.MiscFlags = 0;
-
- ANGLE_TRY(allocateTexture(resolveDesc, formatSet, &mCachedResolveTexture));
- }
-
- mDeviceContext->ResolveSubresource(mCachedResolveTexture.get(), 0,
- renderTarget->getTexture().get(),
- renderTarget->getSubresourceIndex(), formatSet.texFormat);
- return mCachedResolveTexture;
-}
-
-bool Renderer11::getLUID(LUID *adapterLuid) const
-{
- adapterLuid->HighPart = 0;
- adapterLuid->LowPart = 0;
-
- if (!mDxgiAdapter)
- {
- return false;
- }
-
- DXGI_ADAPTER_DESC adapterDesc;
- if (FAILED(mDxgiAdapter->GetDesc(&adapterDesc)))
- {
- return false;
- }
-
- *adapterLuid = adapterDesc.AdapterLuid;
- return true;
-}
-
-VertexConversionType Renderer11::getVertexConversionType(
- gl::VertexFormatType vertexFormatType) const
-{
- return d3d11::GetVertexFormatInfo(vertexFormatType, mRenderer11DeviceCaps.featureLevel)
- .conversionType;
-}
-
-GLenum Renderer11::getVertexComponentType(gl::VertexFormatType vertexFormatType) const
-{
- const auto &format =
- d3d11::GetVertexFormatInfo(vertexFormatType, mRenderer11DeviceCaps.featureLevel);
- return d3d11::GetComponentType(format.nativeFormat);
-}
-
-gl::ErrorOrResult<unsigned int> Renderer11::getVertexSpaceRequired(
- const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding,
- GLsizei count,
- GLsizei instances) const
-{
- if (!attrib.enabled)
- {
- return 16u;
- }
-
- unsigned int elementCount = 0;
- const unsigned int divisor = binding.getDivisor();
- if (instances == 0 || divisor == 0)
- {
- elementCount = count;
- }
- else
- {
- // Round up to divisor, if possible
- elementCount = UnsignedCeilDivide(static_cast<unsigned int>(instances), divisor);
- }
-
- gl::VertexFormatType formatType = gl::GetVertexFormatType(attrib);
- const D3D_FEATURE_LEVEL featureLevel = mRenderer11DeviceCaps.featureLevel;
- const d3d11::VertexFormat &vertexFormatInfo =
- d3d11::GetVertexFormatInfo(formatType, featureLevel);
- const d3d11::DXGIFormatSize &dxgiFormatInfo =
- d3d11::GetDXGIFormatSizeInfo(vertexFormatInfo.nativeFormat);
- unsigned int elementSize = dxgiFormatInfo.pixelBytes;
- if (elementSize > std::numeric_limits<unsigned int>::max() / elementCount)
- {
- return gl::OutOfMemory() << "New vertex buffer size would result in an overflow.";
- }
-
- return elementSize * elementCount;
-}
-
-void Renderer11::generateCaps(gl::Caps *outCaps,
- gl::TextureCapsMap *outTextureCaps,
- gl::Extensions *outExtensions,
- gl::Limitations *outLimitations) const
-{
- d3d11_gl::GenerateCaps(mDevice, mDeviceContext, mRenderer11DeviceCaps, outCaps, outTextureCaps,
- outExtensions, outLimitations);
-}
-
-angle::WorkaroundsD3D Renderer11::generateWorkarounds() const
-{
- return d3d11::GenerateWorkarounds(mRenderer11DeviceCaps, mAdapterDescription);
-}
-
-egl::Error Renderer11::getEGLDevice(DeviceImpl **device)
-{
- if (mEGLDevice == nullptr)
- {
- ASSERT(mDevice != nullptr);
- mEGLDevice = new DeviceD3D();
- egl::Error error = mEGLDevice->initialize(reinterpret_cast<void *>(mDevice),
- EGL_D3D11_DEVICE_ANGLE, EGL_FALSE);
-
- if (error.isError())
- {
- SafeDelete(mEGLDevice);
- return error;
- }
- }
-
- *device = static_cast<DeviceImpl *>(mEGLDevice);
- return egl::NoError();
-}
-
-ContextImpl *Renderer11::createContext(const gl::ContextState &state)
-{
- return new Context11(state, this);
-}
-
-FramebufferImpl *Renderer11::createDefaultFramebuffer(const gl::FramebufferState &state)
-{
- return new Framebuffer11(state, this);
-}
-
-gl::Error Renderer11::getScratchMemoryBuffer(size_t requestedSize, angle::MemoryBuffer **bufferOut)
-{
- if (!mScratchMemoryBuffer.get(requestedSize, bufferOut))
- {
- return gl::OutOfMemory() << "Failed to allocate internal buffer.";
- }
- return gl::NoError();
-}
-
-gl::Version Renderer11::getMaxSupportedESVersion() const
-{
- return d3d11_gl::GetMaximumClientVersion(mRenderer11DeviceCaps.featureLevel);
-}
-
-gl::DebugAnnotator *Renderer11::getAnnotator()
-{
- return mAnnotator;
-}
-
-gl::Error Renderer11::applyComputeShader(const gl::Context *context)
-{
- ANGLE_TRY(ensureHLSLCompilerInitialized());
-
- const auto &glState = context->getGLState();
- ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
-
- ShaderExecutableD3D *computeExe = nullptr;
- ANGLE_TRY(programD3D->getComputeExecutable(&computeExe));
- ASSERT(computeExe != nullptr);
-
- mStateManager.setComputeShader(&GetAs<ShaderExecutable11>(computeExe)->getComputeShader());
- ANGLE_TRY(mStateManager.applyComputeUniforms(programD3D));
-
- return gl::NoError();
-}
-
-gl::Error Renderer11::dispatchCompute(const gl::Context *context,
- GLuint numGroupsX,
- GLuint numGroupsY,
- GLuint numGroupsZ)
-{
- ANGLE_TRY(mStateManager.updateStateForCompute(context, numGroupsX, numGroupsY, numGroupsZ));
- ANGLE_TRY(applyComputeShader(context));
-
- mDeviceContext->Dispatch(numGroupsX, numGroupsY, numGroupsZ);
-
- return gl::NoError();
-}
-
-gl::ErrorOrResult<TextureHelper11> Renderer11::createStagingTexture(
- ResourceType textureType,
- const d3d11::Format &formatSet,
- const gl::Extents &size,
- StagingAccess readAndWriteAccess)
-{
- if (textureType == ResourceType::Texture2D)
- {
- D3D11_TEXTURE2D_DESC stagingDesc;
- stagingDesc.Width = size.width;
- stagingDesc.Height = size.height;
- stagingDesc.MipLevels = 1;
- stagingDesc.ArraySize = 1;
- stagingDesc.Format = formatSet.texFormat;
- stagingDesc.SampleDesc.Count = 1;
- stagingDesc.SampleDesc.Quality = 0;
- stagingDesc.Usage = D3D11_USAGE_STAGING;
- stagingDesc.BindFlags = 0;
- stagingDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
- stagingDesc.MiscFlags = 0;
-
- if (readAndWriteAccess == StagingAccess::READ_WRITE)
- {
- stagingDesc.CPUAccessFlags |= D3D11_CPU_ACCESS_WRITE;
- }
-
- TextureHelper11 stagingTex;
- ANGLE_TRY(allocateTexture(stagingDesc, formatSet, &stagingTex));
- return stagingTex;
- }
- ASSERT(textureType == ResourceType::Texture3D);
-
- D3D11_TEXTURE3D_DESC stagingDesc;
- stagingDesc.Width = size.width;
- stagingDesc.Height = size.height;
- stagingDesc.Depth = 1;
- stagingDesc.MipLevels = 1;
- stagingDesc.Format = formatSet.texFormat;
- stagingDesc.Usage = D3D11_USAGE_STAGING;
- stagingDesc.BindFlags = 0;
- stagingDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
- stagingDesc.MiscFlags = 0;
-
- TextureHelper11 stagingTex;
- ANGLE_TRY(allocateTexture(stagingDesc, formatSet, &stagingTex));
- return stagingTex;
-}
-
-gl::Error Renderer11::allocateTexture(const D3D11_TEXTURE2D_DESC &desc,
- const d3d11::Format &format,
- const D3D11_SUBRESOURCE_DATA *initData,
- TextureHelper11 *textureOut)
-{
- d3d11::Texture2D texture;
- ANGLE_TRY(mResourceManager11.allocate(this, &desc, initData, &texture));
- textureOut->init(std::move(texture), desc, format);
- return gl::NoError();
-}
-
-gl::Error Renderer11::allocateTexture(const D3D11_TEXTURE3D_DESC &desc,
- const d3d11::Format &format,
- const D3D11_SUBRESOURCE_DATA *initData,
- TextureHelper11 *textureOut)
-{
- d3d11::Texture3D texture;
- ANGLE_TRY(mResourceManager11.allocate(this, &desc, initData, &texture));
- textureOut->init(std::move(texture), desc, format);
- return gl::NoError();
-}
-
-gl::Error Renderer11::getBlendState(const d3d11::BlendStateKey &key,
- const d3d11::BlendState **outBlendState)
-{
- return mStateCache.getBlendState(this, key, outBlendState);
-}
-
-gl::Error Renderer11::getRasterizerState(const gl::RasterizerState &rasterState,
- bool scissorEnabled,
- ID3D11RasterizerState **outRasterizerState)
-{
- return mStateCache.getRasterizerState(this, rasterState, scissorEnabled, outRasterizerState);
-}
-
-gl::Error Renderer11::getDepthStencilState(const gl::DepthStencilState &dsState,
- const d3d11::DepthStencilState **outDSState)
-{
- return mStateCache.getDepthStencilState(this, dsState, outDSState);
-}
-
-gl::Error Renderer11::getSamplerState(const gl::SamplerState &samplerState,
- ID3D11SamplerState **outSamplerState)
-{
- return mStateCache.getSamplerState(this, samplerState, outSamplerState);
-}
-
-gl::Error Renderer11::clearRenderTarget(RenderTargetD3D *renderTarget,
- const gl::ColorF &clearColorValue,
- const float clearDepthValue,
- const unsigned int clearStencilValue)
-{
- RenderTarget11 *rt11 = GetAs<RenderTarget11>(renderTarget);
-
- if (rt11->getDepthStencilView().valid())
- {
- const auto &format = rt11->getFormatSet();
- const UINT clearFlags = (format.format().depthBits > 0 ? D3D11_CLEAR_DEPTH : 0) |
- (format.format().stencilBits ? D3D11_CLEAR_STENCIL : 0);
- mDeviceContext->ClearDepthStencilView(rt11->getDepthStencilView().get(), clearFlags,
- clearDepthValue,
- static_cast<UINT8>(clearStencilValue));
- return gl::NoError();
- }
-
- ASSERT(rt11->getRenderTargetView().valid());
- ID3D11RenderTargetView *rtv = rt11->getRenderTargetView().get();
-
- // There are complications with some types of RTV and FL 9_3 with ClearRenderTargetView.
- // See https://msdn.microsoft.com/en-us/library/windows/desktop/ff476388(v=vs.85).aspx
- ASSERT(mRenderer11DeviceCaps.featureLevel > D3D_FEATURE_LEVEL_9_3 || !IsArrayRTV(rtv));
-
- const auto &d3d11Format = rt11->getFormatSet();
- const auto &glFormat = gl::GetSizedInternalFormatInfo(renderTarget->getInternalFormat());
-
- gl::ColorF safeClearColor = clearColorValue;
-
- if (d3d11Format.format().alphaBits > 0 && glFormat.alphaBits == 0)
- {
- safeClearColor.alpha = 1.0f;
- }
-
- mDeviceContext->ClearRenderTargetView(rtv, &safeClearColor.red);
- return gl::NoError();
-}
-
-bool Renderer11::canSelectViewInVertexShader() const
-{
- return !getWorkarounds().selectViewInGeometryShader &&
- getRenderer11DeviceCaps().supportsVpRtIndexWriteFromVertexShader;
-}
-
-gl::Error Renderer11::markTransformFeedbackUsage(const gl::Context *context)
-{
- const gl::State &glState = context->getGLState();
- const gl::TransformFeedback *transformFeedback = glState.getCurrentTransformFeedback();
- for (size_t i = 0; i < transformFeedback->getIndexedBufferCount(); i++)
- {
- const gl::OffsetBindingPointer<gl::Buffer> &binding =
- transformFeedback->getIndexedBuffer(i);
- if (binding.get() != nullptr)
- {
- BufferD3D *bufferD3D = GetImplAs<BufferD3D>(binding.get());
- ANGLE_TRY(bufferD3D->markTransformFeedbackUsage(context));
- }
- }
-
- return gl::NoError();
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
deleted file mode 100644
index a8c24e681b..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
+++ /dev/null
@@ -1,576 +0,0 @@
-//
-// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Renderer11.h: Defines a back-end specific class for the D3D11 renderer.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_H_
-
-#include "common/angleutils.h"
-#include "common/mathutil.h"
-#include "libANGLE/AttributeMap.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/renderer/d3d/HLSLCompiler.h"
-#include "libANGLE/renderer/d3d/ProgramD3D.h"
-#include "libANGLE/renderer/d3d/RenderTargetD3D.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-#include "libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h"
-#include "libANGLE/renderer/d3d/d3d11/RenderStateCache.h"
-#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
-#include "libANGLE/renderer/d3d/d3d11/StateManager11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-
-namespace gl
-{
-class FramebufferAttachment;
-struct ImageIndex;
-}
-
-namespace rx
-{
-class Blit11;
-class Buffer11;
-class Clear11;
-class Context11;
-class IndexDataManager;
-struct PackPixelsParams;
-class PixelTransfer11;
-class RenderTarget11;
-class StreamingIndexBufferInterface;
-class Trim11;
-class VertexDataManager;
-
-struct Renderer11DeviceCaps
-{
- Renderer11DeviceCaps();
-
- D3D_FEATURE_LEVEL featureLevel;
- bool supportsDXGI1_2; // Support for DXGI 1.2
- bool supportsClearView; // Support for ID3D11DeviceContext1::ClearView
- bool supportsConstantBufferOffsets; // Support for Constant buffer offset
- bool supportsVpRtIndexWriteFromVertexShader; // VP/RT can be selected in the Vertex Shader
- // stage.
- bool supportsMultisampledDepthStencilSRVs; // D3D feature level 10.0 no longer allows creation
- // of textures with both the bind SRV and DSV flags
- // when multisampled. Textures will need to be
- // resolved before reading. crbug.com/656989
- UINT B5G6R5support; // Bitfield of D3D11_FORMAT_SUPPORT values for DXGI_FORMAT_B5G6R5_UNORM
- UINT B5G6R5maxSamples; // Maximum number of samples supported by DXGI_FORMAT_B5G6R5_UNORM
- UINT B4G4R4A4support; // Bitfield of D3D11_FORMAT_SUPPORT values for DXGI_FORMAT_B4G4R4A4_UNORM
- UINT B4G4R4A4maxSamples; // Maximum number of samples supported by DXGI_FORMAT_B4G4R4A4_UNORM
- UINT B5G5R5A1support; // Bitfield of D3D11_FORMAT_SUPPORT values for DXGI_FORMAT_B5G5R5A1_UNORM
- UINT B5G5R5A1maxSamples; // Maximum number of samples supported by DXGI_FORMAT_B5G5R5A1_UNORM
- Optional<LARGE_INTEGER> driverVersion; // Four-part driver version number.
-};
-
-enum
-{
- MAX_VERTEX_UNIFORM_VECTORS_D3D11 = 1024,
- MAX_FRAGMENT_UNIFORM_VECTORS_D3D11 = 1024
-};
-
-// Possible reasons RendererD3D initialize can fail
-enum D3D11InitError
-{
- // The renderer loaded successfully
- D3D11_INIT_SUCCESS = 0,
- // Failed to load the ANGLE & D3D compiler libraries
- D3D11_INIT_COMPILER_ERROR,
- // Failed to load a necessary DLL (non-compiler)
- D3D11_INIT_MISSING_DEP,
- // CreateDevice returned E_INVALIDARG
- D3D11_INIT_CREATEDEVICE_INVALIDARG,
- // CreateDevice failed with an error other than invalid arg
- D3D11_INIT_CREATEDEVICE_ERROR,
- // DXGI 1.2 required but not found
- D3D11_INIT_INCOMPATIBLE_DXGI,
- // Other initialization error
- D3D11_INIT_OTHER_ERROR,
- // CreateDevice returned E_FAIL
- D3D11_INIT_CREATEDEVICE_FAIL,
- // CreateDevice returned E_NOTIMPL
- D3D11_INIT_CREATEDEVICE_NOTIMPL,
- // CreateDevice returned E_OUTOFMEMORY
- D3D11_INIT_CREATEDEVICE_OUTOFMEMORY,
- // CreateDevice returned DXGI_ERROR_INVALID_CALL
- D3D11_INIT_CREATEDEVICE_INVALIDCALL,
- // CreateDevice returned DXGI_ERROR_SDK_COMPONENT_MISSING
- D3D11_INIT_CREATEDEVICE_COMPONENTMISSING,
- // CreateDevice returned DXGI_ERROR_WAS_STILL_DRAWING
- D3D11_INIT_CREATEDEVICE_WASSTILLDRAWING,
- // CreateDevice returned DXGI_ERROR_NOT_CURRENTLY_AVAILABLE
- D3D11_INIT_CREATEDEVICE_NOTAVAILABLE,
- // CreateDevice returned DXGI_ERROR_DEVICE_HUNG
- D3D11_INIT_CREATEDEVICE_DEVICEHUNG,
- // CreateDevice returned NULL
- D3D11_INIT_CREATEDEVICE_NULL,
- NUM_D3D11_INIT_ERRORS
-};
-
-class Renderer11 : public RendererD3D
-{
- public:
- explicit Renderer11(egl::Display *display);
- ~Renderer11() override;
-
- egl::Error initialize() override;
- bool resetDevice() override;
-
- egl::ConfigSet generateConfigs() override;
- void generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const override;
-
- ContextImpl *createContext(const gl::ContextState &state) override;
-
- gl::Error flush();
- gl::Error finish();
-
- bool isValidNativeWindow(EGLNativeWindowType window) const override;
- NativeWindowD3D *createNativeWindow(EGLNativeWindowType window,
- const egl::Config *config,
- const egl::AttributeMap &attribs) const override;
-
- SwapChainD3D *createSwapChain(NativeWindowD3D *nativeWindow,
- HANDLE shareHandle,
- IUnknown *d3dTexture,
- GLenum backBufferFormat,
- GLenum depthBufferFormat,
- EGLint orientation,
- EGLint samples) override;
- egl::Error getD3DTextureInfo(const egl::Config *configuration,
- IUnknown *d3dTexture,
- EGLint *width,
- EGLint *height,
- GLenum *fboFormat) const override;
- egl::Error validateShareHandle(const egl::Config *config,
- HANDLE shareHandle,
- const egl::AttributeMap &attribs) const override;
-
- bool applyPrimitiveType(const gl::State &glState, GLenum mode, GLsizei count);
-
- // lost device
- bool testDeviceLost() override;
- bool testDeviceResettable() override;
-
- std::string getRendererDescription() const;
- DeviceIdentifier getAdapterIdentifier() const override;
-
- unsigned int getReservedVertexUniformVectors() const;
- unsigned int getReservedFragmentUniformVectors() const;
- unsigned int getReservedVertexUniformBuffers() const;
- unsigned int getReservedFragmentUniformBuffers() const;
-
- bool getShareHandleSupport() const;
-
- bool getNV12TextureSupport() const;
-
- int getMajorShaderModel() const override;
- int getMinorShaderModel() const override;
- std::string getShaderModelSuffix() const override;
-
- // Pixel operations
- gl::Error copyImage2D(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLint level) override;
- gl::Error copyImageCube(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLenum target,
- GLint level) override;
- gl::Error copyImage3D(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLint level) override;
- gl::Error copyImage2DArray(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLint level) override;
-
- gl::Error copyTexture(const gl::Context *context,
- const gl::Texture *source,
- GLint sourceLevel,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLenum destTarget,
- GLint destLevel,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha) override;
- gl::Error copyCompressedTexture(const gl::Context *context,
- const gl::Texture *source,
- GLint sourceLevel,
- TextureStorage *storage,
- GLint destLevel) override;
-
- // RenderTarget creation
- gl::Error createRenderTarget(int width,
- int height,
- GLenum format,
- GLsizei samples,
- RenderTargetD3D **outRT) override;
- gl::Error createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) override;
-
- // Shader operations
- gl::Error loadExecutable(const uint8_t *function,
- size_t length,
- gl::ShaderType type,
- const std::vector<D3DVarying> &streamOutVaryings,
- bool separatedOutputBuffers,
- ShaderExecutableD3D **outExecutable) override;
- gl::Error compileToExecutable(gl::InfoLog &infoLog,
- const std::string &shaderHLSL,
- gl::ShaderType type,
- const std::vector<D3DVarying> &streamOutVaryings,
- bool separatedOutputBuffers,
- const angle::CompilerWorkaroundsD3D &workarounds,
- ShaderExecutableD3D **outExectuable) override;
- gl::Error ensureHLSLCompilerInitialized() override;
-
- UniformStorageD3D *createUniformStorage(size_t storageSize) override;
-
- // Image operations
- ImageD3D *createImage() override;
- gl::Error generateMipmap(const gl::Context *context, ImageD3D *dest, ImageD3D *source) override;
- gl::Error generateMipmapUsingD3D(const gl::Context *context,
- TextureStorage *storage,
- const gl::TextureState &textureState) override;
- gl::Error copyImage(const gl::Context *context,
- ImageD3D *dest,
- ImageD3D *source,
- const gl::Rectangle &sourceRect,
- const gl::Offset &destOffset,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha) override;
- TextureStorage *createTextureStorage2D(SwapChainD3D *swapChain) override;
- TextureStorage *createTextureStorageEGLImage(EGLImageD3D *eglImage,
- RenderTargetD3D *renderTargetD3D) override;
- TextureStorage *createTextureStorageExternal(
- egl::Stream *stream,
- const egl::Stream::GLTextureDescription &desc) override;
- TextureStorage *createTextureStorage2D(GLenum internalformat,
- bool renderTarget,
- GLsizei width,
- GLsizei height,
- int levels,
- bool hintLevelZeroOnly) override;
- TextureStorage *createTextureStorageCube(GLenum internalformat,
- bool renderTarget,
- int size,
- int levels,
- bool hintLevelZeroOnly) override;
- TextureStorage *createTextureStorage3D(GLenum internalformat,
- bool renderTarget,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- int levels) override;
- TextureStorage *createTextureStorage2DArray(GLenum internalformat,
- bool renderTarget,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- int levels) override;
- TextureStorage *createTextureStorage2DMultisample(GLenum internalformat,
- GLsizei width,
- GLsizei height,
- int levels,
- int samples,
- bool fixedSampleLocations) override;
-
- VertexBuffer *createVertexBuffer() override;
- IndexBuffer *createIndexBuffer() override;
-
- // Stream Creation
- StreamProducerImpl *createStreamProducerD3DTextureNV12(
- egl::Stream::ConsumerType consumerType,
- const egl::AttributeMap &attribs) override;
-
- // D3D11-renderer specific methods
- ID3D11Device *getDevice() { return mDevice; }
- void *getD3DDevice() override;
- ID3D11DeviceContext *getDeviceContext() { return mDeviceContext; };
- ID3D11DeviceContext1 *getDeviceContext1IfSupported() { return mDeviceContext1; };
- IDXGIFactory *getDxgiFactory() { return mDxgiFactory; };
-
- gl::Error getBlendState(const d3d11::BlendStateKey &key,
- const d3d11::BlendState **outBlendState);
- gl::Error getRasterizerState(const gl::RasterizerState &rasterState,
- bool scissorEnabled,
- ID3D11RasterizerState **outRasterizerState);
- gl::Error getDepthStencilState(const gl::DepthStencilState &dsState,
- const d3d11::DepthStencilState **outDSState);
- gl::Error getSamplerState(const gl::SamplerState &samplerState,
- ID3D11SamplerState **outSamplerState);
-
- Blit11 *getBlitter() { return mBlit; }
- Clear11 *getClearer() { return mClear; }
- gl::DebugAnnotator *getAnnotator();
-
- // Buffer-to-texture and Texture-to-buffer copies
- bool supportsFastCopyBufferToTexture(GLenum internalFormat) const override;
- gl::Error fastCopyBufferToTexture(const gl::Context *context,
- const gl::PixelUnpackState &unpack,
- unsigned int offset,
- RenderTargetD3D *destRenderTarget,
- GLenum destinationFormat,
- GLenum sourcePixelsType,
- const gl::Box &destArea) override;
-
- gl::Error packPixels(const TextureHelper11 &textureHelper,
- const PackPixelsParams &params,
- uint8_t *pixelsOut);
-
- bool getLUID(LUID *adapterLuid) const override;
- VertexConversionType getVertexConversionType(
- gl::VertexFormatType vertexFormatType) const override;
- GLenum getVertexComponentType(gl::VertexFormatType vertexFormatType) const override;
-
- // Warning: you should ensure binding really matches attrib.bindingIndex before using this
- // function.
- gl::ErrorOrResult<unsigned int> getVertexSpaceRequired(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding,
- GLsizei count,
- GLsizei instances) const override;
-
- gl::Error readFromAttachment(const gl::Context *context,
- const gl::FramebufferAttachment &srcAttachment,
- const gl::Rectangle &sourceArea,
- GLenum format,
- GLenum type,
- GLuint outputPitch,
- const gl::PixelPackState &pack,
- uint8_t *pixels);
-
- gl::Error blitRenderbufferRect(const gl::Context *context,
- const gl::Rectangle &readRect,
- const gl::Rectangle &drawRect,
- RenderTargetD3D *readRenderTarget,
- RenderTargetD3D *drawRenderTarget,
- GLenum filter,
- const gl::Rectangle *scissor,
- bool colorBlit,
- bool depthBlit,
- bool stencilBlit);
-
- bool isES3Capable() const;
- const Renderer11DeviceCaps &getRenderer11DeviceCaps() const { return mRenderer11DeviceCaps; };
-
- RendererClass getRendererClass() const override;
- StateManager11 *getStateManager() { return &mStateManager; }
-
- void onSwap();
- void onBufferCreate(const Buffer11 *created);
- void onBufferDelete(const Buffer11 *deleted);
-
- egl::Error getEGLDevice(DeviceImpl **device) override;
-
- gl::Error drawArrays(const gl::Context *context,
- GLenum mode,
- GLint startVertex,
- GLsizei count,
- GLsizei instances);
-
- gl::Error drawElements(const gl::Context *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei instances);
-
- gl::Error drawArraysIndirect(const gl::Context *context, GLenum mode, const void *indirect);
- gl::Error drawElementsIndirect(const gl::Context *context,
- GLenum mode,
- GLenum type,
- const void *indirect);
-
- // Necessary hack for default framebuffers in D3D.
- FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override;
-
- gl::Error getScratchMemoryBuffer(size_t requestedSize, angle::MemoryBuffer **bufferOut);
-
- gl::Version getMaxSupportedESVersion() const override;
-
- gl::Error dispatchCompute(const gl::Context *context,
- GLuint numGroupsX,
- GLuint numGroupsY,
- GLuint numGroupsZ);
- gl::Error applyComputeShader(const gl::Context *context);
-
- gl::ErrorOrResult<TextureHelper11> createStagingTexture(ResourceType textureType,
- const d3d11::Format &formatSet,
- const gl::Extents &size,
- StagingAccess readAndWriteAccess);
-
- template <typename DescT, typename ResourceT>
- gl::Error allocateResource(const DescT &desc, ResourceT *resourceOut)
- {
- return mResourceManager11.allocate(this, &desc, nullptr, resourceOut);
- }
-
- template <typename DescT, typename InitDataT, typename ResourceT>
- gl::Error allocateResource(const DescT &desc, InitDataT *initData, ResourceT *resourceOut)
- {
- return mResourceManager11.allocate(this, &desc, initData, resourceOut);
- }
-
- template <typename InitDataT, typename ResourceT>
- gl::Error allocateResourceNoDesc(InitDataT *initData, ResourceT *resourceOut)
- {
- return mResourceManager11.allocate(this, nullptr, initData, resourceOut);
- }
-
- template <typename DescT>
- gl::Error allocateTexture(const DescT &desc,
- const d3d11::Format &format,
- TextureHelper11 *textureOut)
- {
- return allocateTexture(desc, format, nullptr, textureOut);
- }
-
- gl::Error allocateTexture(const D3D11_TEXTURE2D_DESC &desc,
- const d3d11::Format &format,
- const D3D11_SUBRESOURCE_DATA *initData,
- TextureHelper11 *textureOut);
-
- gl::Error allocateTexture(const D3D11_TEXTURE3D_DESC &desc,
- const d3d11::Format &format,
- const D3D11_SUBRESOURCE_DATA *initData,
- TextureHelper11 *textureOut);
-
- gl::Error clearRenderTarget(RenderTargetD3D *renderTarget,
- const gl::ColorF &clearColorValue,
- const float clearDepthValue,
- const unsigned int clearStencilValue) override;
-
- bool canSelectViewInVertexShader() const override;
-
- private:
- void generateCaps(gl::Caps *outCaps,
- gl::TextureCapsMap *outTextureCaps,
- gl::Extensions *outExtensions,
- gl::Limitations *outLimitations) const override;
-
- angle::WorkaroundsD3D generateWorkarounds() const override;
-
- gl::Error drawLineLoop(const gl::Context *context,
- GLsizei count,
- GLenum type,
- const void *indices,
- int baseVertex,
- int instances);
- gl::Error drawTriangleFan(const gl::Context *context,
- GLsizei count,
- GLenum type,
- const void *indices,
- int baseVertex,
- int instances);
-
- gl::ErrorOrResult<TextureHelper11> resolveMultisampledTexture(const gl::Context *context,
- RenderTarget11 *renderTarget,
- bool depth,
- bool stencil);
-
- void populateRenderer11DeviceCaps();
-
- void updateHistograms();
-
- gl::Error copyImageInternal(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- RenderTargetD3D *destRenderTarget);
-
- gl::SupportedSampleSet generateSampleSetForEGLConfig(
- const gl::TextureCaps &colorBufferFormatCaps,
- const gl::TextureCaps &depthStencilBufferFormatCaps) const;
-
- HRESULT callD3D11CreateDevice(PFN_D3D11_CREATE_DEVICE createDevice, bool debug);
- egl::Error initializeD3DDevice();
- egl::Error initializeDevice();
- void releaseDeviceResources();
- void release();
-
- d3d11::ANGLED3D11DeviceType getDeviceType() const;
-
- gl::Error markTransformFeedbackUsage(const gl::Context *context);
-
- HMODULE mD3d11Module;
- HMODULE mDxgiModule;
- HMODULE mDCompModule;
- std::vector<D3D_FEATURE_LEVEL> mAvailableFeatureLevels;
- D3D_DRIVER_TYPE mRequestedDriverType;
- bool mCreateDebugDevice;
- bool mCreatedWithDeviceEXT;
- DeviceD3D *mEGLDevice;
-
- HLSLCompiler mCompiler;
-
- RenderStateCache mStateCache;
-
- StateManager11 mStateManager;
-
- StreamingIndexBufferInterface *mLineLoopIB;
- StreamingIndexBufferInterface *mTriangleFanIB;
-
- // Texture copy resources
- Blit11 *mBlit;
- PixelTransfer11 *mPixelTransfer;
-
- // Masked clear resources
- Clear11 *mClear;
-
- // Perform trim for D3D resources
- Trim11 *mTrim;
-
- // Sync query
- d3d11::Query mSyncQuery;
-
- // Created objects state tracking
- std::set<const Buffer11 *> mAliveBuffers;
-
- double mLastHistogramUpdateTime;
-
- ID3D11Device *mDevice;
- Renderer11DeviceCaps mRenderer11DeviceCaps;
- ID3D11DeviceContext *mDeviceContext;
- ID3D11DeviceContext1 *mDeviceContext1;
- ID3D11DeviceContext3 *mDeviceContext3;
- IDXGIAdapter *mDxgiAdapter;
- DXGI_ADAPTER_DESC mAdapterDescription;
- char mDescription[128];
- IDXGIFactory *mDxgiFactory;
- ID3D11Debug *mDebug;
-
- std::vector<GLuint> mScratchIndexDataBuffer;
-
- angle::ScratchBuffer mScratchMemoryBuffer;
-
- gl::DebugAnnotator *mAnnotator;
-
- mutable Optional<bool> mSupportsShareHandles;
- ResourceManager11 mResourceManager11;
-
- TextureHelper11 mCachedResolveTexture;
-};
-
-} // namespace rx
-#endif // LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp
deleted file mode 100644
index c228380a34..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp
+++ /dev/null
@@ -1,533 +0,0 @@
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// ResourceManager11:
-// Centralized point of allocation for all D3D11 Resources.
-
-#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
-
-#include "common/debug.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
-
-namespace rx
-{
-
-namespace
-{
-
-constexpr uint8_t kDebugInitTextureDataValue = 0x48;
-constexpr FLOAT kDebugColorInitClearValue[4] = {0.3f, 0.5f, 0.7f, 0.5f};
-constexpr FLOAT kDebugDepthInitValue = 0.2f;
-constexpr UINT8 kDebugStencilInitValue = 3;
-
-uint64_t ComputeMippedMemoryUsage(unsigned int width,
- unsigned int height,
- unsigned int depth,
- uint64_t pixelSize,
- unsigned int mipLevels)
-{
- uint64_t sizeSum = 0;
-
- for (unsigned int level = 0; level < mipLevels; ++level)
- {
- unsigned int mipWidth = std::max(width >> level, 1u);
- unsigned int mipHeight = std::max(height >> level, 1u);
- unsigned int mipDepth = std::max(depth >> level, 1u);
- sizeSum += static_cast<uint64_t>(mipWidth * mipHeight * mipDepth) * pixelSize;
- }
-
- return sizeSum;
-}
-
-uint64_t ComputeMemoryUsage(const D3D11_TEXTURE2D_DESC *desc)
-{
- ASSERT(desc);
- uint64_t pixelBytes =
- static_cast<uint64_t>(d3d11::GetDXGIFormatSizeInfo(desc->Format).pixelBytes);
- return ComputeMippedMemoryUsage(desc->Width, desc->Height, 1, pixelBytes, desc->MipLevels);
-}
-
-uint64_t ComputeMemoryUsage(const D3D11_TEXTURE3D_DESC *desc)
-{
- ASSERT(desc);
- uint64_t pixelBytes =
- static_cast<uint64_t>(d3d11::GetDXGIFormatSizeInfo(desc->Format).pixelBytes);
- return ComputeMippedMemoryUsage(desc->Width, desc->Height, desc->Depth, pixelBytes,
- desc->MipLevels);
-}
-
-uint64_t ComputeMemoryUsage(const D3D11_BUFFER_DESC *desc)
-{
- ASSERT(desc);
- return static_cast<uint64_t>(desc->ByteWidth);
-}
-
-template <typename T>
-uint64_t ComputeMemoryUsage(const T *desc)
-{
- return 0;
-}
-
-template <ResourceType ResourceT>
-uint64_t ComputeGenericMemoryUsage(ID3D11DeviceChild *genericResource)
-{
- auto *typedResource = static_cast<GetD3D11Type<ResourceT> *>(genericResource);
- GetDescType<ResourceT> desc;
- typedResource->GetDesc(&desc);
- return ComputeMemoryUsage(&desc);
-}
-
-uint64_t ComputeGenericMemoryUsage(ResourceType resourceType, ID3D11DeviceChild *resource)
-{
- switch (resourceType)
- {
- case ResourceType::Texture2D:
- return ComputeGenericMemoryUsage<ResourceType::Texture2D>(resource);
- case ResourceType::Texture3D:
- return ComputeGenericMemoryUsage<ResourceType::Texture3D>(resource);
- case ResourceType::Buffer:
- return ComputeGenericMemoryUsage<ResourceType::Buffer>(resource);
-
- default:
- return 0;
- }
-}
-
-HRESULT CreateResource(ID3D11Device *device,
- const D3D11_BLEND_DESC *desc,
- void * /*initData*/,
- ID3D11BlendState **blendState)
-{
- return device->CreateBlendState(desc, blendState);
-}
-
-HRESULT CreateResource(ID3D11Device *device,
- const D3D11_BUFFER_DESC *desc,
- const D3D11_SUBRESOURCE_DATA *initData,
- ID3D11Buffer **buffer)
-{
- return device->CreateBuffer(desc, initData, buffer);
-}
-
-HRESULT CreateResource(ID3D11Device *device,
- const ShaderData *desc,
- void * /*initData*/,
- ID3D11ComputeShader **resourceOut)
-{
- return device->CreateComputeShader(desc->get(), desc->size(), nullptr, resourceOut);
-}
-
-HRESULT CreateResource(ID3D11Device *device,
- const D3D11_DEPTH_STENCIL_DESC *desc,
- void * /*initData*/,
- ID3D11DepthStencilState **resourceOut)
-{
- return device->CreateDepthStencilState(desc, resourceOut);
-}
-
-HRESULT CreateResource(ID3D11Device *device,
- const D3D11_DEPTH_STENCIL_VIEW_DESC *desc,
- ID3D11Resource *resource,
- ID3D11DepthStencilView **resourceOut)
-{
- return device->CreateDepthStencilView(resource, desc, resourceOut);
-}
-
-HRESULT CreateResource(ID3D11Device *device,
- const ShaderData *desc,
- const std::vector<D3D11_SO_DECLARATION_ENTRY> *initData,
- ID3D11GeometryShader **resourceOut)
-{
- if (initData)
- {
- return device->CreateGeometryShaderWithStreamOutput(
- desc->get(), desc->size(), initData->data(), static_cast<UINT>(initData->size()),
- nullptr, 0, 0, nullptr, resourceOut);
- }
- else
- {
- return device->CreateGeometryShader(desc->get(), desc->size(), nullptr, resourceOut);
- }
-}
-
-HRESULT CreateResource(ID3D11Device *device,
- const InputElementArray *desc,
- const ShaderData *initData,
- ID3D11InputLayout **resourceOut)
-{
- return device->CreateInputLayout(desc->get(), static_cast<UINT>(desc->size()), initData->get(),
- initData->size(), resourceOut);
-}
-
-HRESULT CreateResource(ID3D11Device *device,
- const ShaderData *desc,
- void * /*initData*/,
- ID3D11PixelShader **resourceOut)
-{
- return device->CreatePixelShader(desc->get(), desc->size(), nullptr, resourceOut);
-}
-
-HRESULT CreateResource(ID3D11Device *device,
- const D3D11_QUERY_DESC *desc,
- void * /*initData*/,
- ID3D11Query **resourceOut)
-{
- return device->CreateQuery(desc, resourceOut);
-}
-
-HRESULT CreateResource(ID3D11Device *device,
- const D3D11_RASTERIZER_DESC *desc,
- void * /*initData*/,
- ID3D11RasterizerState **rasterizerState)
-{
- return device->CreateRasterizerState(desc, rasterizerState);
-}
-
-HRESULT CreateResource(ID3D11Device *device,
- const D3D11_RENDER_TARGET_VIEW_DESC *desc,
- ID3D11Resource *resource,
- ID3D11RenderTargetView **renderTargetView)
-{
- return device->CreateRenderTargetView(resource, desc, renderTargetView);
-}
-
-HRESULT CreateResource(ID3D11Device *device,
- const D3D11_SAMPLER_DESC *desc,
- void * /*initData*/,
- ID3D11SamplerState **resourceOut)
-{
- return device->CreateSamplerState(desc, resourceOut);
-}
-
-HRESULT CreateResource(ID3D11Device *device,
- const D3D11_SHADER_RESOURCE_VIEW_DESC *desc,
- ID3D11Resource *resource,
- ID3D11ShaderResourceView **resourceOut)
-{
- return device->CreateShaderResourceView(resource, desc, resourceOut);
-}
-
-HRESULT CreateResource(ID3D11Device *device,
- const D3D11_TEXTURE2D_DESC *desc,
- const D3D11_SUBRESOURCE_DATA *initData,
- ID3D11Texture2D **texture)
-{
- return device->CreateTexture2D(desc, initData, texture);
-}
-
-HRESULT CreateResource(ID3D11Device *device,
- const D3D11_TEXTURE3D_DESC *desc,
- const D3D11_SUBRESOURCE_DATA *initData,
- ID3D11Texture3D **texture)
-{
- return device->CreateTexture3D(desc, initData, texture);
-}
-
-HRESULT CreateResource(ID3D11Device *device,
- const ShaderData *desc,
- void * /*initData*/,
- ID3D11VertexShader **resourceOut)
-{
- return device->CreateVertexShader(desc->get(), desc->size(), nullptr, resourceOut);
-}
-
-DXGI_FORMAT GetTypedDepthStencilFormat(DXGI_FORMAT dxgiFormat)
-{
- switch (dxgiFormat)
- {
- case DXGI_FORMAT_R16_TYPELESS:
- return DXGI_FORMAT_D16_UNORM;
- case DXGI_FORMAT_R24G8_TYPELESS:
- return DXGI_FORMAT_D24_UNORM_S8_UINT;
- case DXGI_FORMAT_R32_TYPELESS:
- return DXGI_FORMAT_D32_FLOAT;
- case DXGI_FORMAT_R32G8X24_TYPELESS:
- return DXGI_FORMAT_D32_FLOAT_S8X24_UINT;
- default:
- return dxgiFormat;
- }
-}
-
-template <typename DescT, typename ResourceT>
-gl::Error ClearResource(Renderer11 *renderer, const DescT *desc, ResourceT *texture)
-{
- // No-op.
- return gl::NoError();
-}
-
-template <>
-gl::Error ClearResource(Renderer11 *renderer,
- const D3D11_TEXTURE2D_DESC *desc,
- ID3D11Texture2D *texture)
-{
- ID3D11DeviceContext *context = renderer->getDeviceContext();
-
- if ((desc->BindFlags & D3D11_BIND_DEPTH_STENCIL) != 0)
- {
- D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
- dsvDesc.Flags = 0;
- dsvDesc.Format = GetTypedDepthStencilFormat(desc->Format);
-
- const auto &format = d3d11_angle::GetFormat(dsvDesc.Format);
- UINT clearFlags = (format.depthBits > 0 ? D3D11_CLEAR_DEPTH : 0) |
- (format.stencilBits > 0 ? D3D11_CLEAR_STENCIL : 0);
-
- // Must process each mip level individually.
- for (UINT mipLevel = 0; mipLevel < desc->MipLevels; ++mipLevel)
- {
- if (desc->SampleDesc.Count == 0)
- {
- dsvDesc.Texture2D.MipSlice = mipLevel;
- dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
- }
- else
- {
- dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS;
- }
-
- d3d11::DepthStencilView dsv;
- ANGLE_TRY(renderer->allocateResource(dsvDesc, texture, &dsv));
-
- context->ClearDepthStencilView(dsv.get(), clearFlags, kDebugDepthInitValue,
- kDebugStencilInitValue);
- }
- }
- else
- {
- ASSERT((desc->BindFlags & D3D11_BIND_RENDER_TARGET) != 0);
- d3d11::RenderTargetView rtv;
- ANGLE_TRY(renderer->allocateResourceNoDesc(texture, &rtv));
-
- context->ClearRenderTargetView(rtv.get(), kDebugColorInitClearValue);
- }
-
- return gl::NoError();
-}
-
-template <>
-gl::Error ClearResource(Renderer11 *renderer,
- const D3D11_TEXTURE3D_DESC *desc,
- ID3D11Texture3D *texture)
-{
- ID3D11DeviceContext *context = renderer->getDeviceContext();
-
- ASSERT((desc->BindFlags & D3D11_BIND_DEPTH_STENCIL) == 0);
- ASSERT((desc->BindFlags & D3D11_BIND_RENDER_TARGET) != 0);
-
- d3d11::RenderTargetView rtv;
- ANGLE_TRY(renderer->allocateResourceNoDesc(texture, &rtv));
-
- context->ClearRenderTargetView(rtv.get(), kDebugColorInitClearValue);
- return gl::NoError();
-}
-
-#define ANGLE_RESOURCE_STRINGIFY_OP(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) #RESTYPE,
-
-constexpr std::array<const char *, NumResourceTypes> kResourceTypeNames = {
- {ANGLE_RESOURCE_TYPE_OP(Stringify, ANGLE_RESOURCE_STRINGIFY_OP)}};
-static_assert(kResourceTypeNames[NumResourceTypes - 1] != nullptr,
- "All members must be initialized.");
-
-} // anonymous namespace
-
-// ResourceManager11 Implementation.
-ResourceManager11::ResourceManager11()
- : mInitializeAllocations(false),
- mAllocatedResourceCounts({{}}),
- mAllocatedResourceDeviceMemory({{}})
-{
-}
-
-ResourceManager11::~ResourceManager11()
-{
- for (size_t count : mAllocatedResourceCounts)
- {
- ASSERT(count == 0);
- }
-
- for (uint64_t memorySize : mAllocatedResourceDeviceMemory)
- {
- ASSERT(memorySize == 0);
- }
-}
-
-template <typename T>
-gl::Error ResourceManager11::allocate(Renderer11 *renderer,
- const GetDescFromD3D11<T> *desc,
- GetInitDataFromD3D11<T> *initData,
- Resource11<T> *resourceOut)
-{
- ID3D11Device *device = renderer->getDevice();
- T *resource = nullptr;
-
- GetInitDataFromD3D11<T> *shadowInitData = initData;
- if (!shadowInitData && mInitializeAllocations)
- {
- shadowInitData = createInitDataIfNeeded<T>(desc);
- }
-
- HRESULT hr = CreateResource(device, desc, shadowInitData, &resource);
- if (FAILED(hr))
- {
- ASSERT(!resource);
- if (d3d11::isDeviceLostError(hr))
- {
- renderer->notifyDeviceLost();
- }
- return gl::OutOfMemory() << "Error allocating "
- << std::string(kResourceTypeNames[ResourceTypeIndex<T>()]) << ". "
- << gl::FmtHR(hr);
- }
-
- if (!shadowInitData && mInitializeAllocations)
- {
- ANGLE_TRY(ClearResource(renderer, desc, resource));
- }
-
- ASSERT(resource);
- incrResource(GetResourceTypeFromD3D11<T>(), ComputeMemoryUsage(desc));
- *resourceOut = std::move(Resource11<T>(resource, this));
- return gl::NoError();
-}
-
-void ResourceManager11::incrResource(ResourceType resourceType, uint64_t memorySize)
-{
- size_t typeIndex = ResourceTypeIndex(resourceType);
-
- mAllocatedResourceCounts[typeIndex]++;
- mAllocatedResourceDeviceMemory[typeIndex] += memorySize;
-
- // This checks for integer overflow.
- ASSERT(mAllocatedResourceCounts[typeIndex] > 0);
- ASSERT(mAllocatedResourceDeviceMemory[typeIndex] >= memorySize);
-}
-
-void ResourceManager11::decrResource(ResourceType resourceType, uint64_t memorySize)
-{
- size_t typeIndex = ResourceTypeIndex(resourceType);
-
- ASSERT(mAllocatedResourceCounts[typeIndex] > 0);
- mAllocatedResourceCounts[typeIndex]--;
- ASSERT(mAllocatedResourceDeviceMemory[typeIndex] >= memorySize);
- mAllocatedResourceDeviceMemory[typeIndex] -= memorySize;
-}
-
-void ResourceManager11::onReleaseGeneric(ResourceType resourceType, ID3D11DeviceChild *resource)
-{
- ASSERT(resource);
- decrResource(resourceType, ComputeGenericMemoryUsage(resourceType, resource));
-}
-
-template <>
-const D3D11_SUBRESOURCE_DATA *ResourceManager11::createInitDataIfNeeded<ID3D11Texture2D>(
- const D3D11_TEXTURE2D_DESC *desc)
-{
- ASSERT(desc);
-
- if ((desc->BindFlags & (D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_RENDER_TARGET)) != 0)
- {
- // This will be done using ClearView methods.
- return nullptr;
- }
-
- size_t requiredSize = static_cast<size_t>(ComputeMemoryUsage(desc));
- if (mZeroMemory.size() < requiredSize)
- {
- mZeroMemory.resize(requiredSize);
- mZeroMemory.fill(kDebugInitTextureDataValue);
- }
-
- const auto &formatSizeInfo = d3d11::GetDXGIFormatSizeInfo(desc->Format);
-
- UINT subresourceCount = desc->MipLevels * desc->ArraySize;
- if (mShadowInitData.size() < subresourceCount)
- {
- mShadowInitData.resize(subresourceCount);
- }
-
- for (UINT mipLevel = 0; mipLevel < desc->MipLevels; ++mipLevel)
- {
- for (UINT arrayIndex = 0; arrayIndex < desc->ArraySize; ++arrayIndex)
- {
- UINT subresourceIndex = D3D11CalcSubresource(mipLevel, arrayIndex, desc->MipLevels);
- D3D11_SUBRESOURCE_DATA *data = &mShadowInitData[subresourceIndex];
-
- UINT levelWidth = std::max(desc->Width >> mipLevel, 1u);
- UINT levelHeight = std::max(desc->Height >> mipLevel, 1u);
-
- data->SysMemPitch = levelWidth * formatSizeInfo.pixelBytes;
- data->SysMemSlicePitch = data->SysMemPitch * levelHeight;
- data->pSysMem = mZeroMemory.data();
- }
- }
-
- return mShadowInitData.data();
-}
-
-template <>
-const D3D11_SUBRESOURCE_DATA *ResourceManager11::createInitDataIfNeeded<ID3D11Texture3D>(
- const D3D11_TEXTURE3D_DESC *desc)
-{
- ASSERT(desc);
-
- if ((desc->BindFlags & D3D11_BIND_RENDER_TARGET) != 0)
- {
- // This will be done using ClearView methods.
- return nullptr;
- }
-
- size_t requiredSize = static_cast<size_t>(ComputeMemoryUsage(desc));
- if (mZeroMemory.size() < requiredSize)
- {
- mZeroMemory.resize(requiredSize);
- mZeroMemory.fill(kDebugInitTextureDataValue);
- }
-
- const auto &formatSizeInfo = d3d11::GetDXGIFormatSizeInfo(desc->Format);
-
- UINT subresourceCount = desc->MipLevels;
- if (mShadowInitData.size() < subresourceCount)
- {
- mShadowInitData.resize(subresourceCount);
- }
-
- for (UINT mipLevel = 0; mipLevel < desc->MipLevels; ++mipLevel)
- {
- UINT subresourceIndex = D3D11CalcSubresource(mipLevel, 0, desc->MipLevels);
- D3D11_SUBRESOURCE_DATA *data = &mShadowInitData[subresourceIndex];
-
- UINT levelWidth = std::max(desc->Width >> mipLevel, 1u);
- UINT levelHeight = std::max(desc->Height >> mipLevel, 1u);
-
- data->SysMemPitch = levelWidth * formatSizeInfo.pixelBytes;
- data->SysMemSlicePitch = data->SysMemPitch * levelHeight;
- data->pSysMem = mZeroMemory.data();
- }
-
- return mShadowInitData.data();
-}
-
-template <typename T>
-GetInitDataFromD3D11<T> *ResourceManager11::createInitDataIfNeeded(const GetDescFromD3D11<T> *desc)
-{
- // No-op.
- return nullptr;
-}
-
-void ResourceManager11::setAllocationsInitialized(bool initialize)
-{
- mInitializeAllocations = initialize;
-}
-
-#define ANGLE_INSTANTIATE_OP(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) \
- \
-template \
-gl::Error \
- ResourceManager11::allocate(Renderer11 *, const DESCTYPE *, INITDATATYPE *, \
- Resource11<D3D11TYPE> *);
-
-ANGLE_RESOURCE_TYPE_OP(Instantitate, ANGLE_INSTANTIATE_OP)
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.h
deleted file mode 100644
index 0bdde9f8b6..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.h
+++ /dev/null
@@ -1,366 +0,0 @@
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// ResourceManager11:
-// Centralized point of allocation for all D3D11 Resources.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_RESOURCEFACTORY11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_RESOURCEFACTORY11_H_
-
-#include <array>
-#include <memory>
-
-#include "common/MemoryBuffer.h"
-#include "common/angleutils.h"
-#include "common/debug.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/renderer/renderer_utils.h"
-
-namespace rx
-{
-// These two methods are declared here to prevent circular includes.
-namespace d3d11
-{
-HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name);
-
-template <typename T>
-HRESULT SetDebugName(angle::ComPtr<T> &resource, const char *name)
-{
- return SetDebugName(resource.Get(), name);
-}
-} // namespace d3d11
-
-class Renderer11;
-class ResourceManager11;
-template <typename T>
-class SharedResource11;
-class TextureHelper11;
-
-using InputElementArray = WrappedArray<D3D11_INPUT_ELEMENT_DESC>;
-using ShaderData = WrappedArray<uint8_t>;
-
-// Format: ResourceType, D3D11 type, DESC type, init data type.
-#define ANGLE_RESOURCE_TYPE_OP(NAME, OP) \
- OP(NAME, BlendState, ID3D11BlendState, D3D11_BLEND_DESC, void) \
- OP(NAME, Buffer, ID3D11Buffer, D3D11_BUFFER_DESC, const D3D11_SUBRESOURCE_DATA) \
- OP(NAME, ComputeShader, ID3D11ComputeShader, ShaderData, void) \
- OP(NAME, DepthStencilState, ID3D11DepthStencilState, D3D11_DEPTH_STENCIL_DESC, void) \
- OP(NAME, DepthStencilView, ID3D11DepthStencilView, D3D11_DEPTH_STENCIL_VIEW_DESC, \
- ID3D11Resource) \
- OP(NAME, GeometryShader, ID3D11GeometryShader, ShaderData, \
- const std::vector<D3D11_SO_DECLARATION_ENTRY>) \
- OP(NAME, InputLayout, ID3D11InputLayout, InputElementArray, const ShaderData) \
- OP(NAME, PixelShader, ID3D11PixelShader, ShaderData, void) \
- OP(NAME, Query, ID3D11Query, D3D11_QUERY_DESC, void) \
- OP(NAME, RasterizerState, ID3D11RasterizerState, D3D11_RASTERIZER_DESC, void) \
- OP(NAME, RenderTargetView, ID3D11RenderTargetView, D3D11_RENDER_TARGET_VIEW_DESC, \
- ID3D11Resource) \
- OP(NAME, SamplerState, ID3D11SamplerState, D3D11_SAMPLER_DESC, void) \
- OP(NAME, ShaderResourceView, ID3D11ShaderResourceView, D3D11_SHADER_RESOURCE_VIEW_DESC, \
- ID3D11Resource) \
- OP(NAME, Texture2D, ID3D11Texture2D, D3D11_TEXTURE2D_DESC, const D3D11_SUBRESOURCE_DATA) \
- OP(NAME, Texture3D, ID3D11Texture3D, D3D11_TEXTURE3D_DESC, const D3D11_SUBRESOURCE_DATA) \
- OP(NAME, VertexShader, ID3D11VertexShader, ShaderData, void)
-
-#define ANGLE_RESOURCE_TYPE_LIST(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) RESTYPE,
-
-enum class ResourceType
-{
- ANGLE_RESOURCE_TYPE_OP(List, ANGLE_RESOURCE_TYPE_LIST) Last
-};
-
-#undef ANGLE_RESOURCE_TYPE_LIST
-
-constexpr size_t ResourceTypeIndex(ResourceType resourceType)
-{
- return static_cast<size_t>(resourceType);
-}
-
-constexpr size_t NumResourceTypes = ResourceTypeIndex(ResourceType::Last);
-
-#define ANGLE_RESOURCE_TYPE_TO_D3D11(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) \
- \
-template<> struct NAME<ResourceType::RESTYPE> \
- { \
- using Value = D3D11TYPE; \
- };
-
-#define ANGLE_RESOURCE_TYPE_TO_DESC(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) \
- \
-template<> struct NAME<ResourceType::RESTYPE> \
- { \
- using Value = DESCTYPE; \
- };
-
-#define ANGLE_RESOURCE_TYPE_TO_INIT_DATA(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) \
- \
-template<> struct NAME<ResourceType::RESTYPE> \
- { \
- using Value = INITDATATYPE; \
- };
-
-#define ANGLE_RESOURCE_TYPE_TO_TYPE(NAME, OP) \
- template <ResourceType Param> \
- struct NAME; \
- ANGLE_RESOURCE_TYPE_OP(NAME, OP) \
- \
-template<ResourceType Param> struct NAME \
- { \
- }; \
- \
-template<ResourceType Param> using Get##NAME = typename NAME<Param>::Value;
-
-ANGLE_RESOURCE_TYPE_TO_TYPE(D3D11Type, ANGLE_RESOURCE_TYPE_TO_D3D11)
-ANGLE_RESOURCE_TYPE_TO_TYPE(DescType, ANGLE_RESOURCE_TYPE_TO_DESC)
-ANGLE_RESOURCE_TYPE_TO_TYPE(InitDataType, ANGLE_RESOURCE_TYPE_TO_INIT_DATA)
-
-#undef ANGLE_RESOURCE_TYPE_TO_D3D11
-#undef ANGLE_RESOURCE_TYPE_TO_DESC
-#undef ANGLE_RESOURCE_TYPE_TO_INIT_DATA
-#undef ANGLE_RESOURCE_TYPE_TO_TYPE
-
-#define ANGLE_TYPE_TO_RESOURCE_TYPE(NAME, OP) \
- template <typename Param> \
- struct NAME; \
- ANGLE_RESOURCE_TYPE_OP(NAME, OP) \
- \
-template<typename Param> struct NAME \
- { \
- }; \
- \
-template<typename Param> constexpr ResourceType Get##NAME() \
- { \
- return NAME<Param>::Value; \
- }
-
-#define ANGLE_D3D11_TO_RESOURCE_TYPE(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) \
- \
-template<> struct NAME<D3D11TYPE> \
- { \
- static constexpr ResourceType Value = ResourceType::RESTYPE; \
- };
-
-ANGLE_TYPE_TO_RESOURCE_TYPE(ResourceTypeFromD3D11, ANGLE_D3D11_TO_RESOURCE_TYPE)
-
-#undef ANGLE_D3D11_TO_RESOURCE_TYPE
-#undef ANGLE_TYPE_TO_RESOURCE_TYPE
-
-template <typename T>
-using GetDescFromD3D11 = GetDescType<ResourceTypeFromD3D11<T>::Value>;
-
-template <typename T>
-using GetInitDataFromD3D11 = GetInitDataType<ResourceTypeFromD3D11<T>::Value>;
-
-template <typename T>
-constexpr size_t ResourceTypeIndex()
-{
- return static_cast<size_t>(GetResourceTypeFromD3D11<T>());
-}
-
-template <typename T>
-struct TypedData
-{
- TypedData() {}
- ~TypedData();
-
- T *object = nullptr;
- ResourceManager11 *manager = nullptr;
-};
-
-// Smart pointer type. Wraps the resource and a factory for safe deletion.
-template <typename T, template <class> class Pointer, typename DataT>
-class Resource11Base : angle::NonCopyable
-{
- public:
- T *get() const { return mData->object; }
- T *const *getPointer() const { return &mData->object; }
-
- void setDebugName(const char *name) { d3d11::SetDebugName(mData->object, name); }
-
- void set(T *object)
- {
- ASSERT(!valid());
- mData->object = object;
- }
-
- bool valid() const { return (mData->object != nullptr); }
-
- void reset()
- {
- if (valid())
- mData.reset(new DataT());
- }
-
- ResourceSerial getSerial() const
- {
- return ResourceSerial(reinterpret_cast<uintptr_t>(mData->object));
- }
-
- protected:
- friend class TextureHelper11;
-
- Resource11Base() : mData(new DataT()) {}
-
- Resource11Base(Resource11Base &&movedObj) : mData(new DataT())
- {
- std::swap(mData, movedObj.mData);
- }
-
- virtual ~Resource11Base() { mData.reset(); }
-
- Resource11Base &operator=(Resource11Base &&movedObj)
- {
- std::swap(mData, movedObj.mData);
- return *this;
- }
-
- Pointer<DataT> mData;
-};
-
-template <typename T>
-using UniquePtr = typename std::unique_ptr<T, std::default_delete<T>>;
-
-template <typename ResourceT>
-class Resource11 : public Resource11Base<ResourceT, UniquePtr, TypedData<ResourceT>>
-{
- public:
- Resource11() {}
- Resource11(Resource11 &&other)
- : Resource11Base<ResourceT, UniquePtr, TypedData<ResourceT>>(std::move(other))
- {
- }
- Resource11 &operator=(Resource11 &&other)
- {
- std::swap(this->mData, other.mData);
- return *this;
- }
-
- private:
- template <typename T>
- friend class SharedResource11;
- friend class ResourceManager11;
-
- Resource11(ResourceT *object, ResourceManager11 *manager)
- {
- this->mData->object = object;
- this->mData->manager = manager;
- }
-};
-
-template <typename T>
-class SharedResource11 : public Resource11Base<T, std::shared_ptr, TypedData<T>>
-{
- public:
- SharedResource11() {}
- SharedResource11(SharedResource11 &&movedObj)
- : Resource11Base<T, std::shared_ptr, TypedData<T>>(std::move(movedObj))
- {
- }
-
- SharedResource11 &operator=(SharedResource11 &&other)
- {
- std::swap(this->mData, other.mData);
- return *this;
- }
-
- SharedResource11 makeCopy() const
- {
- SharedResource11 copy;
- copy.mData = this->mData;
- return std::move(copy);
- }
-
- private:
- friend class ResourceManager11;
- SharedResource11(Resource11<T> &&obj) : Resource11Base<T, std::shared_ptr, TypedData<T>>()
- {
- std::swap(this->mData->manager, obj.mData->manager);
-
- // Can't use std::swap because of ID3D11Resource.
- auto temp = this->mData->object;
- this->mData->object = obj.mData->object;
- obj.mData->object = static_cast<T *>(temp);
- }
-};
-
-class ResourceManager11 final : angle::NonCopyable
-{
- public:
- ResourceManager11();
- ~ResourceManager11();
-
- template <typename T>
- gl::Error allocate(Renderer11 *renderer,
- const GetDescFromD3D11<T> *desc,
- GetInitDataFromD3D11<T> *initData,
- Resource11<T> *resourceOut);
-
- template <typename T>
- gl::Error allocate(Renderer11 *renderer,
- const GetDescFromD3D11<T> *desc,
- GetInitDataFromD3D11<T> *initData,
- SharedResource11<T> *sharedRes)
- {
- Resource11<T> res;
- ANGLE_TRY(allocate(renderer, desc, initData, &res));
- *sharedRes = std::move(res);
- return gl::NoError();
- }
-
- template <typename T>
- void onRelease(T *resource)
- {
- onReleaseGeneric(GetResourceTypeFromD3D11<T>(), resource);
- }
-
- void onReleaseGeneric(ResourceType resourceType, ID3D11DeviceChild *resource);
-
- void setAllocationsInitialized(bool initialize);
-
- private:
- void incrResource(ResourceType resourceType, uint64_t memorySize);
- void decrResource(ResourceType resourceType, uint64_t memorySize);
-
- template <typename T>
- GetInitDataFromD3D11<T> *createInitDataIfNeeded(const GetDescFromD3D11<T> *desc);
-
- bool mInitializeAllocations;
-
- std::array<size_t, NumResourceTypes> mAllocatedResourceCounts;
- std::array<uint64_t, NumResourceTypes> mAllocatedResourceDeviceMemory;
- angle::MemoryBuffer mZeroMemory;
-
- std::vector<D3D11_SUBRESOURCE_DATA> mShadowInitData;
-};
-
-template <typename ResourceT>
-TypedData<ResourceT>::~TypedData()
-{
- if (object)
- {
- // We can have a nullptr factory when holding passed-in resources.
- if (manager)
- {
- manager->onRelease(object);
- }
- object->Release();
- }
-}
-
-#define ANGLE_RESOURCE_TYPE_CLASS(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) \
- using RESTYPE = Resource11<D3D11TYPE>;
-
-namespace d3d11
-{
-ANGLE_RESOURCE_TYPE_OP(ClassList, ANGLE_RESOURCE_TYPE_CLASS)
-
-using SharedSRV = SharedResource11<ID3D11ShaderResourceView>;
-} // namespace d3d11
-
-#undef ANGLE_RESOURCE_TYPE_CLASS
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_RESOURCEFACTORY11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp
deleted file mode 100644
index 73a530add0..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-//
-// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ShaderExecutable11.cpp: Implements a D3D11-specific class to contain shader
-// executable implementation details.
-
-#include "libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-
-namespace rx
-{
-
-ShaderExecutable11::ShaderExecutable11(const void *function,
- size_t length,
- d3d11::PixelShader &&executable)
- : ShaderExecutableD3D(function, length),
- mPixelExecutable(std::move(executable)),
- mVertexExecutable(),
- mGeometryExecutable(),
- mStreamOutExecutable(),
- mComputeExecutable()
-{
-}
-
-ShaderExecutable11::ShaderExecutable11(const void *function,
- size_t length,
- d3d11::VertexShader &&executable,
- d3d11::GeometryShader &&streamOut)
- : ShaderExecutableD3D(function, length),
- mPixelExecutable(),
- mVertexExecutable(std::move(executable)),
- mGeometryExecutable(),
- mStreamOutExecutable(std::move(streamOut)),
- mComputeExecutable()
-{
-}
-
-ShaderExecutable11::ShaderExecutable11(const void *function,
- size_t length,
- d3d11::GeometryShader &&executable)
- : ShaderExecutableD3D(function, length),
- mPixelExecutable(),
- mVertexExecutable(),
- mGeometryExecutable(std::move(executable)),
- mStreamOutExecutable(),
- mComputeExecutable()
-{
-}
-
-ShaderExecutable11::ShaderExecutable11(const void *function,
- size_t length,
- d3d11::ComputeShader &&executable)
- : ShaderExecutableD3D(function, length),
- mPixelExecutable(),
- mVertexExecutable(),
- mGeometryExecutable(),
- mStreamOutExecutable(),
- mComputeExecutable(std::move(executable))
-{
-}
-
-ShaderExecutable11::~ShaderExecutable11()
-{
-}
-
-const d3d11::VertexShader &ShaderExecutable11::getVertexShader() const
-{
- return mVertexExecutable;
-}
-
-const d3d11::PixelShader &ShaderExecutable11::getPixelShader() const
-{
- return mPixelExecutable;
-}
-
-const d3d11::GeometryShader &ShaderExecutable11::getGeometryShader() const
-{
- return mGeometryExecutable;
-}
-
-const d3d11::GeometryShader &ShaderExecutable11::getStreamOutShader() const
-{
- return mStreamOutExecutable;
-}
-
-const d3d11::ComputeShader &ShaderExecutable11::getComputeShader() const
-{
- return mComputeExecutable;
-}
-
-UniformStorage11::UniformStorage11(size_t initialSize)
- : UniformStorageD3D(initialSize), mConstantBuffer()
-{
-}
-
-UniformStorage11::~UniformStorage11()
-{
-}
-
-gl::Error UniformStorage11::getConstantBuffer(Renderer11 *renderer, const d3d11::Buffer **bufferOut)
-{
- if (size() > 0 && !mConstantBuffer.valid())
- {
- D3D11_BUFFER_DESC desc = {0};
- desc.ByteWidth = static_cast<unsigned int>(size());
- desc.Usage = D3D11_USAGE_DEFAULT;
- desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
-
- ANGLE_TRY(renderer->allocateResource(desc, &mConstantBuffer));
- }
-
- *bufferOut = &mConstantBuffer;
- return gl::NoError();
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h
deleted file mode 100644
index 3f417578a3..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ShaderExecutable11.h: Defines a D3D11-specific class to contain shader
-// executable implementation details.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_SHADEREXECUTABLE11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_SHADEREXECUTABLE11_H_
-
-#include "libANGLE/renderer/d3d/ShaderExecutableD3D.h"
-#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
-
-namespace rx
-{
-class Renderer11;
-class UniformStorage11;
-
-class ShaderExecutable11 : public ShaderExecutableD3D
-{
- public:
- ShaderExecutable11(const void *function, size_t length, d3d11::PixelShader &&executable);
- ShaderExecutable11(const void *function,
- size_t length,
- d3d11::VertexShader &&executable,
- d3d11::GeometryShader &&streamOut);
- ShaderExecutable11(const void *function, size_t length, d3d11::GeometryShader &&executable);
- ShaderExecutable11(const void *function, size_t length, d3d11::ComputeShader &&executable);
-
- ~ShaderExecutable11() override;
-
- const d3d11::PixelShader &getPixelShader() const;
- const d3d11::VertexShader &getVertexShader() const;
- const d3d11::GeometryShader &getGeometryShader() const;
- const d3d11::GeometryShader &getStreamOutShader() const;
- const d3d11::ComputeShader &getComputeShader() const;
-
- private:
- d3d11::PixelShader mPixelExecutable;
- d3d11::VertexShader mVertexExecutable;
- d3d11::GeometryShader mGeometryExecutable;
- d3d11::GeometryShader mStreamOutExecutable;
- d3d11::ComputeShader mComputeExecutable;
-};
-
-class UniformStorage11 : public UniformStorageD3D
-{
- public:
- UniformStorage11(size_t initialSize);
- ~UniformStorage11() override;
-
- gl::Error getConstantBuffer(Renderer11 *renderer, const d3d11::Buffer **bufferOut);
-
- private:
- d3d11::Buffer mConstantBuffer;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_SHADEREXECUTABLE11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp
deleted file mode 100644
index e9902d3f14..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp
+++ /dev/null
@@ -1,3075 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// StateManager11.cpp: Defines a class for caching D3D11 state
-
-#include "libANGLE/renderer/d3d/d3d11/StateManager11.h"
-
-#include "common/bitset_utils.h"
-#include "common/utilities.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Query.h"
-#include "libANGLE/VertexArray.h"
-#include "libANGLE/renderer/d3d/TextureD3D.h"
-#include "libANGLE/renderer/d3d/d3d11/Buffer11.h"
-#include "libANGLE/renderer/d3d/d3d11/Context11.h"
-#include "libANGLE/renderer/d3d/d3d11/Framebuffer11.h"
-#include "libANGLE/renderer/d3d/d3d11/IndexBuffer11.h"
-#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h"
-#include "libANGLE/renderer/d3d/d3d11/TextureStorage11.h"
-#include "libANGLE/renderer/d3d/d3d11/TransformFeedback11.h"
-#include "libANGLE/renderer/d3d/d3d11/VertexArray11.h"
-
-namespace rx
-{
-
-namespace
-{
-bool ImageIndexConflictsWithSRV(const gl::ImageIndex &index, D3D11_SHADER_RESOURCE_VIEW_DESC desc)
-{
- unsigned mipLevel = index.mipIndex;
- GLint layerIndex = index.layerIndex;
- GLenum type = index.type;
-
- switch (desc.ViewDimension)
- {
- case D3D11_SRV_DIMENSION_TEXTURE2D:
- {
- bool allLevels = (desc.Texture2D.MipLevels == std::numeric_limits<UINT>::max());
- unsigned int maxSrvMip = desc.Texture2D.MipLevels + desc.Texture2D.MostDetailedMip;
- maxSrvMip = allLevels ? INT_MAX : maxSrvMip;
-
- unsigned mipMin = index.mipIndex;
- unsigned mipMax = (layerIndex == -1) ? INT_MAX : layerIndex;
-
- return type == GL_TEXTURE_2D &&
- gl::RangeUI(mipMin, mipMax)
- .intersects(gl::RangeUI(desc.Texture2D.MostDetailedMip, maxSrvMip));
- }
-
- case D3D11_SRV_DIMENSION_TEXTURE2DARRAY:
- {
- bool allLevels = (desc.Texture2DArray.MipLevels == std::numeric_limits<UINT>::max());
- unsigned int maxSrvMip =
- desc.Texture2DArray.MipLevels + desc.Texture2DArray.MostDetailedMip;
- maxSrvMip = allLevels ? INT_MAX : maxSrvMip;
-
- unsigned maxSlice = desc.Texture2DArray.FirstArraySlice + desc.Texture2DArray.ArraySize;
-
- // Cube maps can be mapped to Texture2DArray SRVs
- return (type == GL_TEXTURE_2D_ARRAY || gl::IsCubeMapTextureTarget(type)) &&
- desc.Texture2DArray.MostDetailedMip <= mipLevel && mipLevel < maxSrvMip &&
- desc.Texture2DArray.FirstArraySlice <= static_cast<UINT>(layerIndex) &&
- static_cast<UINT>(layerIndex) < maxSlice;
- }
-
- case D3D11_SRV_DIMENSION_TEXTURECUBE:
- {
- bool allLevels = (desc.TextureCube.MipLevels == std::numeric_limits<UINT>::max());
- unsigned int maxSrvMip = desc.TextureCube.MipLevels + desc.TextureCube.MostDetailedMip;
- maxSrvMip = allLevels ? INT_MAX : maxSrvMip;
-
- return gl::IsCubeMapTextureTarget(type) &&
- desc.TextureCube.MostDetailedMip <= mipLevel && mipLevel < maxSrvMip;
- }
-
- case D3D11_SRV_DIMENSION_TEXTURE3D:
- {
- bool allLevels = (desc.Texture3D.MipLevels == std::numeric_limits<UINT>::max());
- unsigned int maxSrvMip = desc.Texture3D.MipLevels + desc.Texture3D.MostDetailedMip;
- maxSrvMip = allLevels ? INT_MAX : maxSrvMip;
-
- return type == GL_TEXTURE_3D && desc.Texture3D.MostDetailedMip <= mipLevel &&
- mipLevel < maxSrvMip;
- }
- default:
- // We only handle the cases corresponding to valid image indexes
- UNIMPLEMENTED();
- }
-
- return false;
-}
-
-// Does *not* increment the resource ref count!!
-ID3D11Resource *GetViewResource(ID3D11View *view)
-{
- ID3D11Resource *resource = nullptr;
- ASSERT(view);
- view->GetResource(&resource);
- resource->Release();
- return resource;
-}
-
-int GetWrapBits(GLenum wrap)
-{
- switch (wrap)
- {
- case GL_CLAMP_TO_EDGE:
- return 0x1;
- case GL_REPEAT:
- return 0x2;
- case GL_MIRRORED_REPEAT:
- return 0x3;
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-Optional<size_t> FindFirstNonInstanced(
- const std::vector<const TranslatedAttribute *> &currentAttributes)
-{
- for (size_t index = 0; index < currentAttributes.size(); ++index)
- {
- if (currentAttributes[index]->divisor == 0)
- {
- return Optional<size_t>(index);
- }
- }
-
- return Optional<size_t>::Invalid();
-}
-
-void SortAttributesByLayout(const gl::Program *program,
- const std::vector<TranslatedAttribute> &vertexArrayAttribs,
- const std::vector<TranslatedAttribute> &currentValueAttribs,
- AttribIndexArray *sortedD3DSemanticsOut,
- std::vector<const TranslatedAttribute *> *sortedAttributesOut)
-{
- sortedAttributesOut->clear();
-
- const auto &locationToSemantic =
- GetImplAs<ProgramD3D>(program)->getAttribLocationToD3DSemantics();
-
- for (auto locationIndex : program->getActiveAttribLocationsMask())
- {
- int d3dSemantic = locationToSemantic[locationIndex];
- if (sortedAttributesOut->size() <= static_cast<size_t>(d3dSemantic))
- {
- sortedAttributesOut->resize(d3dSemantic + 1);
- }
-
- (*sortedD3DSemanticsOut)[d3dSemantic] = d3dSemantic;
-
- const auto *arrayAttrib = &vertexArrayAttribs[locationIndex];
- if (arrayAttrib->attribute && arrayAttrib->attribute->enabled)
- {
- (*sortedAttributesOut)[d3dSemantic] = arrayAttrib;
- }
- else
- {
- ASSERT(currentValueAttribs[locationIndex].attribute);
- (*sortedAttributesOut)[d3dSemantic] = &currentValueAttribs[locationIndex];
- }
- }
-}
-
-void UpdateUniformBuffer(ID3D11DeviceContext *deviceContext,
- UniformStorage11 *storage,
- const d3d11::Buffer *buffer)
-{
- deviceContext->UpdateSubresource(buffer->get(), 0, nullptr, storage->getDataPointer(0, 0), 0,
- 0);
-}
-
-} // anonymous namespace
-
-// StateManager11::SRVCache Implementation.
-
-StateManager11::SRVCache::SRVCache() : mHighestUsedSRV(0)
-{
-}
-
-StateManager11::SRVCache::~SRVCache()
-{
-}
-
-void StateManager11::SRVCache::update(size_t resourceIndex, ID3D11ShaderResourceView *srv)
-{
- ASSERT(resourceIndex < mCurrentSRVs.size());
- SRVRecord *record = &mCurrentSRVs[resourceIndex];
-
- record->srv = reinterpret_cast<uintptr_t>(srv);
- if (srv)
- {
- record->resource = reinterpret_cast<uintptr_t>(GetViewResource(srv));
- srv->GetDesc(&record->desc);
- mHighestUsedSRV = std::max(resourceIndex + 1, mHighestUsedSRV);
- }
- else
- {
- record->resource = 0;
-
- if (resourceIndex + 1 == mHighestUsedSRV)
- {
- do
- {
- --mHighestUsedSRV;
- } while (mHighestUsedSRV > 0 && mCurrentSRVs[mHighestUsedSRV].srv == 0);
- }
- }
-}
-
-void StateManager11::SRVCache::clear()
-{
- if (mCurrentSRVs.empty())
- {
- return;
- }
-
- memset(&mCurrentSRVs[0], 0, sizeof(SRVRecord) * mCurrentSRVs.size());
- mHighestUsedSRV = 0;
-}
-
-// ShaderConstants11 implementation
-
-ShaderConstants11::ShaderConstants11()
- : mVertexDirty(true),
- mPixelDirty(true),
- mComputeDirty(true),
- mSamplerMetadataVSDirty(true),
- mSamplerMetadataPSDirty(true),
- mSamplerMetadataCSDirty(true)
-{
-}
-
-ShaderConstants11::~ShaderConstants11()
-{
-}
-
-void ShaderConstants11::init(const gl::Caps &caps)
-{
- mSamplerMetadataVS.resize(caps.maxVertexTextureImageUnits);
- mSamplerMetadataPS.resize(caps.maxTextureImageUnits);
- mSamplerMetadataCS.resize(caps.maxComputeTextureImageUnits);
-}
-
-size_t ShaderConstants11::getRequiredBufferSize(gl::SamplerType samplerType) const
-{
- switch (samplerType)
- {
- case gl::SAMPLER_VERTEX:
- return sizeof(Vertex) + mSamplerMetadataVS.size() * sizeof(SamplerMetadata);
- case gl::SAMPLER_PIXEL:
- return sizeof(Pixel) + mSamplerMetadataPS.size() * sizeof(SamplerMetadata);
- case gl::SAMPLER_COMPUTE:
- return sizeof(Compute) + mSamplerMetadataCS.size() * sizeof(SamplerMetadata);
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-void ShaderConstants11::markDirty()
-{
- mVertexDirty = true;
- mPixelDirty = true;
- mComputeDirty = true;
- mSamplerMetadataVSDirty = true;
- mSamplerMetadataPSDirty = true;
- mSamplerMetadataCSDirty = true;
-}
-
-bool ShaderConstants11::updateSamplerMetadata(SamplerMetadata *data, const gl::Texture &texture)
-{
- bool dirty = false;
- unsigned int baseLevel = texture.getTextureState().getEffectiveBaseLevel();
- GLenum sizedFormat =
- texture.getFormat(texture.getTarget(), baseLevel).info->sizedInternalFormat;
- if (data->baseLevel != static_cast<int>(baseLevel))
- {
- data->baseLevel = static_cast<int>(baseLevel);
- dirty = true;
- }
-
- // Some metadata is needed only for integer textures. We avoid updating the constant buffer
- // unnecessarily by changing the data only in case the texture is an integer texture and
- // the values have changed.
- bool needIntegerTextureMetadata = false;
- // internalFormatBits == 0 means a 32-bit texture in the case of integer textures.
- int internalFormatBits = 0;
- switch (sizedFormat)
- {
- case GL_RGBA32I:
- case GL_RGBA32UI:
- case GL_RGB32I:
- case GL_RGB32UI:
- case GL_RG32I:
- case GL_RG32UI:
- case GL_R32I:
- case GL_R32UI:
- needIntegerTextureMetadata = true;
- break;
- case GL_RGBA16I:
- case GL_RGBA16UI:
- case GL_RGB16I:
- case GL_RGB16UI:
- case GL_RG16I:
- case GL_RG16UI:
- case GL_R16I:
- case GL_R16UI:
- needIntegerTextureMetadata = true;
- internalFormatBits = 16;
- break;
- case GL_RGBA8I:
- case GL_RGBA8UI:
- case GL_RGB8I:
- case GL_RGB8UI:
- case GL_RG8I:
- case GL_RG8UI:
- case GL_R8I:
- case GL_R8UI:
- needIntegerTextureMetadata = true;
- internalFormatBits = 8;
- break;
- case GL_RGB10_A2UI:
- needIntegerTextureMetadata = true;
- internalFormatBits = 10;
- break;
- default:
- break;
- }
- if (needIntegerTextureMetadata)
- {
- if (data->internalFormatBits != internalFormatBits)
- {
- data->internalFormatBits = internalFormatBits;
- dirty = true;
- }
- // Pack the wrap values into one integer so we can fit all the metadata in one 4-integer
- // vector.
- GLenum wrapS = texture.getWrapS();
- GLenum wrapT = texture.getWrapT();
- GLenum wrapR = texture.getWrapR();
- int wrapModes = GetWrapBits(wrapS) | (GetWrapBits(wrapT) << 2) | (GetWrapBits(wrapR) << 4);
- if (data->wrapModes != wrapModes)
- {
- data->wrapModes = wrapModes;
- dirty = true;
- }
- }
-
- return dirty;
-}
-
-void ShaderConstants11::setComputeWorkGroups(GLuint numGroupsX,
- GLuint numGroupsY,
- GLuint numGroupsZ)
-{
- mCompute.numWorkGroups[0] = numGroupsX;
- mCompute.numWorkGroups[1] = numGroupsY;
- mCompute.numWorkGroups[2] = numGroupsZ;
- mComputeDirty = true;
-}
-
-void ShaderConstants11::setMultiviewWriteToViewportIndex(GLfloat index)
-{
- mVertex.multiviewWriteToViewportIndex = index;
- mVertexDirty = true;
- mPixel.multiviewWriteToViewportIndex = index;
- mPixelDirty = true;
-}
-
-void ShaderConstants11::onViewportChange(const gl::Rectangle &glViewport,
- const D3D11_VIEWPORT &dxViewport,
- bool is9_3,
- bool presentPathFast)
-{
- mVertexDirty = true;
- mPixelDirty = true;
-
- // On Feature Level 9_*, we must emulate large and/or negative viewports in the shaders
- // using viewAdjust (like the D3D9 renderer).
- if (is9_3)
- {
- mVertex.viewAdjust[0] = static_cast<float>((glViewport.width - dxViewport.Width) +
- 2 * (glViewport.x - dxViewport.TopLeftX)) /
- dxViewport.Width;
- mVertex.viewAdjust[1] = static_cast<float>((glViewport.height - dxViewport.Height) +
- 2 * (glViewport.y - dxViewport.TopLeftY)) /
- dxViewport.Height;
- mVertex.viewAdjust[2] = static_cast<float>(glViewport.width) / dxViewport.Width;
- mVertex.viewAdjust[3] = static_cast<float>(glViewport.height) / dxViewport.Height;
- }
-
- mPixel.viewCoords[0] = glViewport.width * 0.5f;
- mPixel.viewCoords[1] = glViewport.height * 0.5f;
- mPixel.viewCoords[2] = glViewport.x + (glViewport.width * 0.5f);
- mPixel.viewCoords[3] = glViewport.y + (glViewport.height * 0.5f);
-
- // Instanced pointsprite emulation requires ViewCoords to be defined in the
- // the vertex shader.
- mVertex.viewCoords[0] = mPixel.viewCoords[0];
- mVertex.viewCoords[1] = mPixel.viewCoords[1];
- mVertex.viewCoords[2] = mPixel.viewCoords[2];
- mVertex.viewCoords[3] = mPixel.viewCoords[3];
-
- const float zNear = dxViewport.MinDepth;
- const float zFar = dxViewport.MaxDepth;
-
- mPixel.depthFront[0] = (zFar - zNear) * 0.5f;
- mPixel.depthFront[1] = (zNear + zFar) * 0.5f;
-
- mVertex.depthRange[0] = zNear;
- mVertex.depthRange[1] = zFar;
- mVertex.depthRange[2] = zFar - zNear;
-
- mPixel.depthRange[0] = zNear;
- mPixel.depthRange[1] = zFar;
- mPixel.depthRange[2] = zFar - zNear;
-
- mPixel.viewScale[0] = 1.0f;
- mPixel.viewScale[1] = presentPathFast ? 1.0f : -1.0f;
- // Updates to the multiviewWriteToViewportIndex member are to be handled whenever the draw
- // framebuffer's layout is changed.
-
- mVertex.viewScale[0] = mPixel.viewScale[0];
- mVertex.viewScale[1] = mPixel.viewScale[1];
-}
-
-void ShaderConstants11::onSamplerChange(gl::SamplerType samplerType,
- unsigned int samplerIndex,
- const gl::Texture &texture)
-{
- switch (samplerType)
- {
- case gl::SAMPLER_VERTEX:
- if (updateSamplerMetadata(&mSamplerMetadataVS[samplerIndex], texture))
- {
- mSamplerMetadataVSDirty = true;
- }
- break;
- case gl::SAMPLER_PIXEL:
- if (updateSamplerMetadata(&mSamplerMetadataPS[samplerIndex], texture))
- {
- mSamplerMetadataPSDirty = true;
- }
- break;
- case gl::SAMPLER_COMPUTE:
- if (updateSamplerMetadata(&mSamplerMetadataCS[samplerIndex], texture))
- {
- mSamplerMetadataCSDirty = true;
- }
- break;
- default:
- UNREACHABLE();
- break;
- }
-}
-
-gl::Error ShaderConstants11::updateBuffer(ID3D11DeviceContext *deviceContext,
- gl::SamplerType samplerType,
- const ProgramD3D &programD3D,
- const d3d11::Buffer &driverConstantBuffer)
-{
- bool dirty = false;
- size_t dataSize = 0;
- const uint8_t *data = nullptr;
- const uint8_t *samplerData = nullptr;
-
- switch (samplerType)
- {
- case gl::SAMPLER_VERTEX:
- dirty = mVertexDirty || mSamplerMetadataVSDirty;
- dataSize = sizeof(Vertex);
- data = reinterpret_cast<const uint8_t *>(&mVertex);
- samplerData = reinterpret_cast<const uint8_t *>(mSamplerMetadataVS.data());
- mVertexDirty = false;
- mSamplerMetadataVSDirty = false;
- break;
- case gl::SAMPLER_PIXEL:
- dirty = mPixelDirty || mSamplerMetadataPSDirty;
- dataSize = sizeof(Pixel);
- data = reinterpret_cast<const uint8_t *>(&mPixel);
- samplerData = reinterpret_cast<const uint8_t *>(mSamplerMetadataPS.data());
- mPixelDirty = false;
- mSamplerMetadataPSDirty = false;
- break;
- case gl::SAMPLER_COMPUTE:
- dirty = mComputeDirty || mSamplerMetadataCSDirty;
- dataSize = sizeof(Compute);
- data = reinterpret_cast<const uint8_t *>(&mCompute);
- samplerData = reinterpret_cast<const uint8_t *>(mSamplerMetadataCS.data());
- mComputeDirty = false;
- mSamplerMetadataCSDirty = false;
- break;
- default:
- UNREACHABLE();
- break;
- }
-
- ASSERT(driverConstantBuffer.valid());
-
- if (!dirty)
- {
- return gl::NoError();
- }
-
- // Previous buffer contents are discarded, so we need to refresh the whole buffer.
- D3D11_MAPPED_SUBRESOURCE mapping = {0};
- HRESULT result =
- deviceContext->Map(driverConstantBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mapping);
-
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Internal error mapping constant buffer: " << gl::FmtHR(result);
- }
-
- size_t samplerDataBytes = sizeof(SamplerMetadata) * programD3D.getUsedSamplerRange(samplerType);
-
- memcpy(mapping.pData, data, dataSize);
- memcpy(reinterpret_cast<uint8_t *>(mapping.pData) + dataSize, samplerData, samplerDataBytes);
-
- deviceContext->Unmap(driverConstantBuffer.get(), 0);
-
- return gl::NoError();
-}
-
-static const GLenum QueryTypes[] = {GL_ANY_SAMPLES_PASSED, GL_ANY_SAMPLES_PASSED_CONSERVATIVE,
- GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, GL_TIME_ELAPSED_EXT,
- GL_COMMANDS_COMPLETED_CHROMIUM};
-
-StateManager11::StateManager11(Renderer11 *renderer)
- : mRenderer(renderer),
- mInternalDirtyBits(),
- mCurBlendColor(0, 0, 0, 0),
- mCurSampleMask(0),
- mCurStencilRef(0),
- mCurStencilBackRef(0),
- mCurStencilSize(0),
- mCurScissorEnabled(false),
- mCurScissorRect(),
- mCurViewport(),
- mCurNear(0.0f),
- mCurFar(0.0f),
- mViewportBounds(),
- mRenderTargetIsDirty(true),
- mCurPresentPathFastEnabled(false),
- mCurPresentPathFastColorBufferHeight(0),
- mDirtyCurrentValueAttribs(),
- mCurrentValueAttribs(),
- mCurrentInputLayout(),
- mInputLayoutIsDirty(false),
- mVertexAttribsNeedTranslation(false),
- mDirtyVertexBufferRange(gl::MAX_VERTEX_ATTRIBS, 0),
- mCurrentPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_UNDEFINED),
- mDirtySwizzles(false),
- mAppliedIB(nullptr),
- mAppliedIBFormat(DXGI_FORMAT_UNKNOWN),
- mAppliedIBOffset(0),
- mIndexBufferIsDirty(false),
- mVertexDataManager(renderer),
- mIndexDataManager(renderer),
- mIsMultiviewEnabled(false),
- mEmptySerial(mRenderer->generateSerial()),
- mIsTransformFeedbackCurrentlyActiveUnpaused(false)
-{
- mCurBlendState.blend = false;
- mCurBlendState.sourceBlendRGB = GL_ONE;
- mCurBlendState.destBlendRGB = GL_ZERO;
- mCurBlendState.sourceBlendAlpha = GL_ONE;
- mCurBlendState.destBlendAlpha = GL_ZERO;
- mCurBlendState.blendEquationRGB = GL_FUNC_ADD;
- mCurBlendState.blendEquationAlpha = GL_FUNC_ADD;
- mCurBlendState.colorMaskRed = true;
- mCurBlendState.colorMaskBlue = true;
- mCurBlendState.colorMaskGreen = true;
- mCurBlendState.colorMaskAlpha = true;
- mCurBlendState.sampleAlphaToCoverage = false;
- mCurBlendState.dither = false;
-
- mCurDepthStencilState.depthTest = false;
- mCurDepthStencilState.depthFunc = GL_LESS;
- mCurDepthStencilState.depthMask = true;
- mCurDepthStencilState.stencilTest = false;
- mCurDepthStencilState.stencilMask = true;
- mCurDepthStencilState.stencilFail = GL_KEEP;
- mCurDepthStencilState.stencilPassDepthFail = GL_KEEP;
- mCurDepthStencilState.stencilPassDepthPass = GL_KEEP;
- mCurDepthStencilState.stencilWritemask = static_cast<GLuint>(-1);
- mCurDepthStencilState.stencilBackFunc = GL_ALWAYS;
- mCurDepthStencilState.stencilBackMask = static_cast<GLuint>(-1);
- mCurDepthStencilState.stencilBackFail = GL_KEEP;
- mCurDepthStencilState.stencilBackPassDepthFail = GL_KEEP;
- mCurDepthStencilState.stencilBackPassDepthPass = GL_KEEP;
- mCurDepthStencilState.stencilBackWritemask = static_cast<GLuint>(-1);
-
- mCurRasterState.rasterizerDiscard = false;
- mCurRasterState.cullFace = false;
- mCurRasterState.cullMode = gl::CullFaceMode::Back;
- mCurRasterState.frontFace = GL_CCW;
- mCurRasterState.polygonOffsetFill = false;
- mCurRasterState.polygonOffsetFactor = 0.0f;
- mCurRasterState.polygonOffsetUnits = 0.0f;
- mCurRasterState.pointDrawMode = false;
- mCurRasterState.multiSample = false;
-
- // Start with all internal dirty bits set.
- mInternalDirtyBits.set();
-
- // Initially all current value attributes must be updated on first use.
- mDirtyCurrentValueAttribs.set();
-
- mCurrentVertexBuffers.fill(nullptr);
- mCurrentVertexStrides.fill(std::numeric_limits<UINT>::max());
- mCurrentVertexOffsets.fill(std::numeric_limits<UINT>::max());
-}
-
-StateManager11::~StateManager11()
-{
-}
-
-template <typename SRVType>
-void StateManager11::setShaderResourceInternal(gl::SamplerType shaderType,
- UINT resourceSlot,
- const SRVType *srv)
-{
- auto &currentSRVs = (shaderType == gl::SAMPLER_VERTEX ? mCurVertexSRVs : mCurPixelSRVs);
-
- ASSERT(static_cast<size_t>(resourceSlot) < currentSRVs.size());
- const SRVRecord &record = currentSRVs[resourceSlot];
-
- if (record.srv != reinterpret_cast<uintptr_t>(srv))
- {
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- ID3D11ShaderResourceView *srvPtr = srv ? srv->get() : nullptr;
- if (shaderType == gl::SAMPLER_VERTEX)
- {
- deviceContext->VSSetShaderResources(resourceSlot, 1, &srvPtr);
- }
- else
- {
- deviceContext->PSSetShaderResources(resourceSlot, 1, &srvPtr);
- }
-
- currentSRVs.update(resourceSlot, srvPtr);
- }
-}
-
-void StateManager11::updateStencilSizeIfChanged(bool depthStencilInitialized,
- unsigned int stencilSize)
-{
- if (!depthStencilInitialized || stencilSize != mCurStencilSize)
- {
- mCurStencilSize = stencilSize;
- mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
- }
-}
-
-void StateManager11::checkPresentPath(const gl::Context *context)
-{
- if (!mRenderer->presentPathFastEnabled())
- return;
-
- const auto *framebuffer = context->getGLState().getDrawFramebuffer();
- const auto *firstColorAttachment = framebuffer->getFirstColorbuffer();
- const bool presentPathFastActive = UsePresentPathFast(mRenderer, firstColorAttachment);
-
- const int colorBufferHeight = firstColorAttachment ? firstColorAttachment->getSize().height : 0;
-
- if ((mCurPresentPathFastEnabled != presentPathFastActive) ||
- (presentPathFastActive && (colorBufferHeight != mCurPresentPathFastColorBufferHeight)))
- {
- mCurPresentPathFastEnabled = presentPathFastActive;
- mCurPresentPathFastColorBufferHeight = colorBufferHeight;
-
- // Scissor rect may need to be vertically inverted
- mInternalDirtyBits.set(DIRTY_BIT_SCISSOR_STATE);
-
- // Cull Mode may need to be inverted
- mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE);
-
- // Viewport may need to be vertically inverted
- invalidateViewport(context);
- }
-}
-
-gl::Error StateManager11::updateStateForCompute(const gl::Context *context,
- GLuint numGroupsX,
- GLuint numGroupsY,
- GLuint numGroupsZ)
-{
- mShaderConstants.setComputeWorkGroups(numGroupsX, numGroupsY, numGroupsZ);
-
- // TODO(jmadill): Use dirty bits.
- const auto &glState = context->getGLState();
- auto *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
- programD3D->updateSamplerMapping();
-
- // TODO(jmadill): Use dirty bits.
- ANGLE_TRY(generateSwizzlesForShader(context, gl::SAMPLER_COMPUTE));
-
- // TODO(jmadill): More complete implementation.
- ANGLE_TRY(syncTextures(context));
-
- // TODO(Xinghua): applyUniformBuffers for compute shader.
-
- return gl::NoError();
-}
-
-void StateManager11::syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits)
-{
- if (!dirtyBits.any())
- {
- return;
- }
-
- const auto &state = context->getGLState();
-
- for (auto dirtyBit : dirtyBits)
- {
- switch (dirtyBit)
- {
- case gl::State::DIRTY_BIT_BLEND_EQUATIONS:
- {
- const gl::BlendState &blendState = state.getBlendState();
- if (blendState.blendEquationRGB != mCurBlendState.blendEquationRGB ||
- blendState.blendEquationAlpha != mCurBlendState.blendEquationAlpha)
- {
- mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
- }
- break;
- }
- case gl::State::DIRTY_BIT_BLEND_FUNCS:
- {
- const gl::BlendState &blendState = state.getBlendState();
- if (blendState.sourceBlendRGB != mCurBlendState.sourceBlendRGB ||
- blendState.destBlendRGB != mCurBlendState.destBlendRGB ||
- blendState.sourceBlendAlpha != mCurBlendState.sourceBlendAlpha ||
- blendState.destBlendAlpha != mCurBlendState.destBlendAlpha)
- {
- mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
- }
- break;
- }
- case gl::State::DIRTY_BIT_BLEND_ENABLED:
- if (state.getBlendState().blend != mCurBlendState.blend)
- {
- mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
- }
- break;
- case gl::State::DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED:
- if (state.getBlendState().sampleAlphaToCoverage !=
- mCurBlendState.sampleAlphaToCoverage)
- {
- mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
- }
- break;
- case gl::State::DIRTY_BIT_DITHER_ENABLED:
- if (state.getBlendState().dither != mCurBlendState.dither)
- {
- mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
- }
- break;
- case gl::State::DIRTY_BIT_COLOR_MASK:
- {
- const gl::BlendState &blendState = state.getBlendState();
- if (blendState.colorMaskRed != mCurBlendState.colorMaskRed ||
- blendState.colorMaskGreen != mCurBlendState.colorMaskGreen ||
- blendState.colorMaskBlue != mCurBlendState.colorMaskBlue ||
- blendState.colorMaskAlpha != mCurBlendState.colorMaskAlpha)
- {
- mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
- }
- break;
- }
- case gl::State::DIRTY_BIT_BLEND_COLOR:
- if (state.getBlendColor() != mCurBlendColor)
- {
- mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
- }
- break;
- case gl::State::DIRTY_BIT_DEPTH_MASK:
- if (state.getDepthStencilState().depthMask != mCurDepthStencilState.depthMask)
- {
- mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
- }
- break;
- case gl::State::DIRTY_BIT_DEPTH_TEST_ENABLED:
- if (state.getDepthStencilState().depthTest != mCurDepthStencilState.depthTest)
- {
- mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
- }
- break;
- case gl::State::DIRTY_BIT_DEPTH_FUNC:
- if (state.getDepthStencilState().depthFunc != mCurDepthStencilState.depthFunc)
- {
- mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
- }
- break;
- case gl::State::DIRTY_BIT_STENCIL_TEST_ENABLED:
- if (state.getDepthStencilState().stencilTest != mCurDepthStencilState.stencilTest)
- {
- mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
- }
- break;
- case gl::State::DIRTY_BIT_STENCIL_FUNCS_FRONT:
- {
- const gl::DepthStencilState &depthStencil = state.getDepthStencilState();
- if (depthStencil.stencilFunc != mCurDepthStencilState.stencilFunc ||
- depthStencil.stencilMask != mCurDepthStencilState.stencilMask ||
- state.getStencilRef() != mCurStencilRef)
- {
- mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
- }
- break;
- }
- case gl::State::DIRTY_BIT_STENCIL_FUNCS_BACK:
- {
- const gl::DepthStencilState &depthStencil = state.getDepthStencilState();
- if (depthStencil.stencilBackFunc != mCurDepthStencilState.stencilBackFunc ||
- depthStencil.stencilBackMask != mCurDepthStencilState.stencilBackMask ||
- state.getStencilBackRef() != mCurStencilBackRef)
- {
- mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
- }
- break;
- }
- case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT:
- if (state.getDepthStencilState().stencilWritemask !=
- mCurDepthStencilState.stencilWritemask)
- {
- mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
- }
- break;
- case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_BACK:
- if (state.getDepthStencilState().stencilBackWritemask !=
- mCurDepthStencilState.stencilBackWritemask)
- {
- mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
- }
- break;
- case gl::State::DIRTY_BIT_STENCIL_OPS_FRONT:
- {
- const gl::DepthStencilState &depthStencil = state.getDepthStencilState();
- if (depthStencil.stencilFail != mCurDepthStencilState.stencilFail ||
- depthStencil.stencilPassDepthFail !=
- mCurDepthStencilState.stencilPassDepthFail ||
- depthStencil.stencilPassDepthPass != mCurDepthStencilState.stencilPassDepthPass)
- {
- mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
- }
- break;
- }
- case gl::State::DIRTY_BIT_STENCIL_OPS_BACK:
- {
- const gl::DepthStencilState &depthStencil = state.getDepthStencilState();
- if (depthStencil.stencilBackFail != mCurDepthStencilState.stencilBackFail ||
- depthStencil.stencilBackPassDepthFail !=
- mCurDepthStencilState.stencilBackPassDepthFail ||
- depthStencil.stencilBackPassDepthPass !=
- mCurDepthStencilState.stencilBackPassDepthPass)
- {
- mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
- }
- break;
- }
- case gl::State::DIRTY_BIT_CULL_FACE_ENABLED:
- if (state.getRasterizerState().cullFace != mCurRasterState.cullFace)
- {
- mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE);
- }
- break;
- case gl::State::DIRTY_BIT_CULL_FACE:
- if (state.getRasterizerState().cullMode != mCurRasterState.cullMode)
- {
- mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE);
- }
- break;
- case gl::State::DIRTY_BIT_FRONT_FACE:
- if (state.getRasterizerState().frontFace != mCurRasterState.frontFace)
- {
- mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE);
- }
- break;
- case gl::State::DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED:
- if (state.getRasterizerState().polygonOffsetFill !=
- mCurRasterState.polygonOffsetFill)
- {
- mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE);
- }
- break;
- case gl::State::DIRTY_BIT_POLYGON_OFFSET:
- {
- const gl::RasterizerState &rasterState = state.getRasterizerState();
- if (rasterState.polygonOffsetFactor != mCurRasterState.polygonOffsetFactor ||
- rasterState.polygonOffsetUnits != mCurRasterState.polygonOffsetUnits)
- {
- mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE);
- }
- break;
- }
- case gl::State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED:
- if (state.getRasterizerState().rasterizerDiscard !=
- mCurRasterState.rasterizerDiscard)
- {
- mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE);
-
- // Enabling/disabling rasterizer discard affects the pixel shader.
- invalidateShaders();
- }
- break;
- case gl::State::DIRTY_BIT_SCISSOR:
- if (state.getScissor() != mCurScissorRect)
- {
- mInternalDirtyBits.set(DIRTY_BIT_SCISSOR_STATE);
- }
- break;
- case gl::State::DIRTY_BIT_SCISSOR_TEST_ENABLED:
- if (state.isScissorTestEnabled() != mCurScissorEnabled)
- {
- mInternalDirtyBits.set(DIRTY_BIT_SCISSOR_STATE);
- // Rasterizer state update needs mCurScissorsEnabled and updates when it changes
- mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE);
- }
- break;
- case gl::State::DIRTY_BIT_DEPTH_RANGE:
- if (state.getNearPlane() != mCurNear || state.getFarPlane() != mCurFar)
- {
- invalidateViewport(context);
- }
- break;
- case gl::State::DIRTY_BIT_VIEWPORT:
- if (state.getViewport() != mCurViewport)
- {
- invalidateViewport(context);
- }
- break;
- case gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING:
- invalidateRenderTarget();
- if (mIsMultiviewEnabled)
- {
- handleMultiviewDrawFramebufferChange(context);
- }
- break;
- case gl::State::DIRTY_BIT_VERTEX_ARRAY_BINDING:
- invalidateVertexBuffer();
- // Force invalidate the current value attributes, since the VertexArray11 keeps an
- // internal cache of TranslatedAttributes, and they CurrentValue attributes are
- // owned by the StateManager11/Context.
- mDirtyCurrentValueAttribs.set();
- // Invalidate the cached index buffer.
- mIndexBufferIsDirty = true;
- break;
- case gl::State::DIRTY_BIT_TEXTURE_BINDINGS:
- invalidateTexturesAndSamplers();
- break;
- case gl::State::DIRTY_BIT_SAMPLER_BINDINGS:
- invalidateTexturesAndSamplers();
- break;
- case gl::State::DIRTY_BIT_PROGRAM_EXECUTABLE:
- {
- mInternalDirtyBits.set(DIRTY_BIT_SHADERS);
- invalidateVertexBuffer();
- invalidateRenderTarget();
- invalidateTexturesAndSamplers();
- invalidateProgramUniforms();
- invalidateProgramUniformBuffers();
- gl::VertexArray *vao = state.getVertexArray();
- if (mIsMultiviewEnabled && vao != nullptr)
- {
- // If ANGLE_multiview is enabled, the attribute divisor has to be updated for
- // each binding.
- VertexArray11 *vao11 = GetImplAs<VertexArray11>(vao);
- const gl::Program *program = state.getProgram();
- int numViews = 1;
- if (program != nullptr && program->usesMultiview())
- {
- numViews = program->getNumViews();
- }
- vao11->markAllAttributeDivisorsForAdjustment(numViews);
- }
- break;
- }
- case gl::State::DIRTY_BIT_CURRENT_VALUES:
- {
- for (auto attribIndex : state.getAndResetDirtyCurrentValues())
- {
- invalidateCurrentValueAttrib(attribIndex);
- }
- }
- default:
- break;
- }
- }
-
- // TODO(jmadill): Input layout and vertex buffer state.
-}
-
-void StateManager11::handleMultiviewDrawFramebufferChange(const gl::Context *context)
-{
- const auto &glState = context->getGLState();
- 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)
- {
- 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;
- }
-}
-
-gl::Error StateManager11::syncBlendState(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::BlendState &blendState,
- const gl::ColorF &blendColor,
- unsigned int sampleMask)
-{
- const d3d11::BlendState *dxBlendState = nullptr;
- const d3d11::BlendStateKey &key =
- RenderStateCache::GetBlendStateKey(context, framebuffer, blendState);
-
- ANGLE_TRY(mRenderer->getBlendState(key, &dxBlendState));
-
- ASSERT(dxBlendState != nullptr);
-
- float blendColors[4] = {0.0f};
- if (blendState.sourceBlendRGB != GL_CONSTANT_ALPHA &&
- blendState.sourceBlendRGB != GL_ONE_MINUS_CONSTANT_ALPHA &&
- blendState.destBlendRGB != GL_CONSTANT_ALPHA &&
- blendState.destBlendRGB != GL_ONE_MINUS_CONSTANT_ALPHA)
- {
- blendColors[0] = blendColor.red;
- blendColors[1] = blendColor.green;
- blendColors[2] = blendColor.blue;
- blendColors[3] = blendColor.alpha;
- }
- else
- {
- blendColors[0] = blendColor.alpha;
- blendColors[1] = blendColor.alpha;
- blendColors[2] = blendColor.alpha;
- blendColors[3] = blendColor.alpha;
- }
-
- mRenderer->getDeviceContext()->OMSetBlendState(dxBlendState->get(), blendColors, sampleMask);
-
- mCurBlendState = blendState;
- mCurBlendColor = blendColor;
- mCurSampleMask = sampleMask;
-
- return gl::NoError();
-}
-
-gl::Error StateManager11::syncDepthStencilState(const gl::State &glState)
-{
- mCurDepthStencilState = glState.getDepthStencilState();
- mCurStencilRef = glState.getStencilRef();
- mCurStencilBackRef = glState.getStencilBackRef();
-
- // get the maximum size of the stencil ref
- unsigned int maxStencil = 0;
- if (mCurDepthStencilState.stencilTest && mCurStencilSize > 0)
- {
- maxStencil = (1 << mCurStencilSize) - 1;
- }
- ASSERT((mCurDepthStencilState.stencilWritemask & maxStencil) ==
- (mCurDepthStencilState.stencilBackWritemask & maxStencil));
- ASSERT(mCurStencilRef == mCurStencilBackRef);
- ASSERT((mCurDepthStencilState.stencilMask & maxStencil) ==
- (mCurDepthStencilState.stencilBackMask & maxStencil));
-
- gl::DepthStencilState modifiedGLState = glState.getDepthStencilState();
-
- ASSERT(mCurDisableDepth.valid() && mCurDisableStencil.valid());
-
- if (mCurDisableDepth.value())
- {
- modifiedGLState.depthTest = false;
- modifiedGLState.depthMask = false;
- }
-
- if (mCurDisableStencil.value())
- {
- modifiedGLState.stencilWritemask = 0;
- modifiedGLState.stencilBackWritemask = 0;
- modifiedGLState.stencilTest = false;
- }
-
- const d3d11::DepthStencilState *d3dState = nullptr;
- ANGLE_TRY(mRenderer->getDepthStencilState(modifiedGLState, &d3dState));
- ASSERT(d3dState);
-
- // Max D3D11 stencil reference value is 0xFF,
- // corresponding to the max 8 bits in a stencil buffer
- // GL specifies we should clamp the ref value to the
- // nearest bit depth when doing stencil ops
- static_assert(D3D11_DEFAULT_STENCIL_READ_MASK == 0xFF,
- "Unexpected value of D3D11_DEFAULT_STENCIL_READ_MASK");
- static_assert(D3D11_DEFAULT_STENCIL_WRITE_MASK == 0xFF,
- "Unexpected value of D3D11_DEFAULT_STENCIL_WRITE_MASK");
- UINT dxStencilRef = std::min<UINT>(mCurStencilRef, 0xFFu);
-
- mRenderer->getDeviceContext()->OMSetDepthStencilState(d3dState->get(), dxStencilRef);
-
- return gl::NoError();
-}
-
-gl::Error StateManager11::syncRasterizerState(const gl::Context *context, bool pointDrawMode)
-{
- // TODO: Remove pointDrawMode and multiSample from gl::RasterizerState.
- gl::RasterizerState rasterState = context->getGLState().getRasterizerState();
- rasterState.pointDrawMode = pointDrawMode;
- rasterState.multiSample = mCurRasterState.multiSample;
-
- ID3D11RasterizerState *dxRasterState = nullptr;
-
- if (mCurPresentPathFastEnabled)
- {
- gl::RasterizerState modifiedRasterState = rasterState;
-
- // If prseent path fast is active then we need invert the front face state.
- // This ensures that both gl_FrontFacing is correct, and front/back culling
- // is performed correctly.
- if (modifiedRasterState.frontFace == GL_CCW)
- {
- modifiedRasterState.frontFace = GL_CW;
- }
- else
- {
- ASSERT(modifiedRasterState.frontFace == GL_CW);
- modifiedRasterState.frontFace = GL_CCW;
- }
-
- ANGLE_TRY(
- mRenderer->getRasterizerState(modifiedRasterState, mCurScissorEnabled, &dxRasterState));
- }
- else
- {
- ANGLE_TRY(mRenderer->getRasterizerState(rasterState, mCurScissorEnabled, &dxRasterState));
- }
-
- mRenderer->getDeviceContext()->RSSetState(dxRasterState);
-
- mCurRasterState = rasterState;
-
- return gl::NoError();
-}
-
-void StateManager11::syncScissorRectangle(const gl::Rectangle &scissor, bool enabled)
-{
- int modifiedScissorY = scissor.y;
- if (mCurPresentPathFastEnabled)
- {
- modifiedScissorY = mCurPresentPathFastColorBufferHeight - scissor.height - scissor.y;
- }
-
- 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());
- }
-
- mCurScissorRect = scissor;
- mCurScissorEnabled = enabled;
-}
-
-void StateManager11::syncViewport(const gl::Context *context)
-{
- const auto &glState = context->getGLState();
- gl::Framebuffer *framebuffer = glState.getDrawFramebuffer();
- float actualZNear = gl::clamp01(glState.getNearPlane());
- float actualZFar = gl::clamp01(glState.getFarPlane());
-
- const auto &caps = context->getCaps();
- int dxMaxViewportBoundsX = static_cast<int>(caps.maxViewportWidth);
- int dxMaxViewportBoundsY = static_cast<int>(caps.maxViewportHeight);
- int dxMinViewportBoundsX = -dxMaxViewportBoundsX;
- int dxMinViewportBoundsY = -dxMaxViewportBoundsY;
-
- bool is9_3 = mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3;
-
- if (is9_3)
- {
- // Feature Level 9 viewports shouldn't exceed the dimensions of the rendertarget.
- dxMaxViewportBoundsX = static_cast<int>(mViewportBounds.width);
- dxMaxViewportBoundsY = static_cast<int>(mViewportBounds.height);
- dxMinViewportBoundsX = 0;
- dxMinViewportBoundsY = 0;
- }
-
- 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);
-
- 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);
- }
-
- // 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());
-
- mCurViewport = viewport;
- mCurNear = actualZNear;
- mCurFar = actualZFar;
-
- const D3D11_VIEWPORT adjustViewport = {static_cast<FLOAT>(dxViewportTopLeftX),
- static_cast<FLOAT>(dxViewportTopLeftY),
- static_cast<FLOAT>(dxViewportWidth),
- static_cast<FLOAT>(dxViewportHeight),
- actualZNear,
- actualZFar};
- mShaderConstants.onViewportChange(viewport, adjustViewport, is9_3, mCurPresentPathFastEnabled);
-}
-
-void StateManager11::invalidateRenderTarget()
-{
- mRenderTargetIsDirty = true;
-}
-
-void StateManager11::processFramebufferInvalidation(const gl::Context *context)
-{
- if (!mRenderTargetIsDirty)
- {
- return;
- }
-
- ASSERT(context);
-
- mRenderTargetIsDirty = false;
- mInternalDirtyBits.set(DIRTY_BIT_RENDER_TARGET);
-
- // The pixel shader is dependent on the output layout.
- invalidateShaders();
-
- // The D3D11 blend state is heavily dependent on the current render target.
- mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
-
- gl::Framebuffer *fbo = context->getGLState().getDrawFramebuffer();
- ASSERT(fbo);
-
- // Disable the depth test/depth write if we are using a stencil-only attachment.
- // This is because ANGLE emulates stencil-only with D24S8 on D3D11 - we should neither read
- // nor write to the unused depth part of this emulated texture.
- bool disableDepth = (!fbo->hasDepth() && fbo->hasStencil());
-
- // Similarly we disable the stencil portion of the DS attachment if the app only binds depth.
- bool disableStencil = (fbo->hasDepth() && !fbo->hasStencil());
-
- if (!mCurDisableDepth.valid() || disableDepth != mCurDisableDepth.value() ||
- !mCurDisableStencil.valid() || disableStencil != mCurDisableStencil.value())
- {
- mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
- mCurDisableDepth = disableDepth;
- mCurDisableStencil = disableStencil;
- }
-
- bool multiSample = (fbo->getCachedSamples(context) != 0);
- if (multiSample != mCurRasterState.multiSample)
- {
- mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE);
- mCurRasterState.multiSample = multiSample;
- }
-
- checkPresentPath(context);
-
- if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3)
- {
- const auto *firstAttachment = fbo->getFirstNonNullAttachment();
- if (firstAttachment)
- {
- const auto &size = firstAttachment->getSize();
- if (mViewportBounds.width != size.width || mViewportBounds.height != size.height)
- {
- mViewportBounds = gl::Extents(size.width, size.height, 1);
- invalidateViewport(context);
- }
- }
- }
-}
-
-void StateManager11::invalidateBoundViews()
-{
- mCurVertexSRVs.clear();
- mCurPixelSRVs.clear();
-
- invalidateRenderTarget();
-}
-
-void StateManager11::invalidateVertexBuffer()
-{
- unsigned int limit = std::min<unsigned int>(mRenderer->getNativeCaps().maxVertexAttributes,
- gl::MAX_VERTEX_ATTRIBS);
- mDirtyVertexBufferRange = gl::RangeUI(0, limit);
- mInputLayoutIsDirty = true;
- mInternalDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_ATTRIBS);
- invalidateVertexAttributeTranslation();
-}
-
-void StateManager11::invalidateViewport(const gl::Context *context)
-{
- mInternalDirtyBits.set(DIRTY_BIT_VIEWPORT_STATE);
-
- // Viewport affects the driver constants.
- invalidateDriverUniforms();
-}
-
-void StateManager11::invalidateTexturesAndSamplers()
-{
- mInternalDirtyBits.set(DIRTY_BIT_TEXTURE_AND_SAMPLER_STATE);
- invalidateSwizzles();
-
- // Texture state affects the driver uniforms (base level, etc).
- invalidateDriverUniforms();
-}
-
-void StateManager11::invalidateSwizzles()
-{
- mDirtySwizzles = true;
-}
-
-void StateManager11::invalidateProgramUniforms()
-{
- mInternalDirtyBits.set(DIRTY_BIT_PROGRAM_UNIFORMS);
-}
-
-void StateManager11::invalidateDriverUniforms()
-{
- mInternalDirtyBits.set(DIRTY_BIT_DRIVER_UNIFORMS);
-}
-
-void StateManager11::invalidateProgramUniformBuffers()
-{
- mInternalDirtyBits.set(DIRTY_BIT_PROGRAM_UNIFORM_BUFFERS);
-}
-
-void StateManager11::invalidateConstantBuffer(unsigned int slot)
-{
- if (slot == d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DRIVER)
- {
- invalidateDriverUniforms();
- }
- else if (slot == d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK)
- {
- invalidateProgramUniforms();
- }
- else
- {
- invalidateProgramUniformBuffers();
- }
-}
-
-void StateManager11::invalidateShaders()
-{
- mInternalDirtyBits.set(DIRTY_BIT_SHADERS);
-}
-
-void StateManager11::setRenderTarget(ID3D11RenderTargetView *rtv, ID3D11DepthStencilView *dsv)
-{
- if ((rtv && unsetConflictingView(rtv)) || (dsv && unsetConflictingView(dsv)))
- {
- mInternalDirtyBits.set(DIRTY_BIT_TEXTURE_AND_SAMPLER_STATE);
- }
-
- mRenderer->getDeviceContext()->OMSetRenderTargets(1, &rtv, dsv);
- mInternalDirtyBits.set(DIRTY_BIT_RENDER_TARGET);
-}
-
-void StateManager11::setRenderTargets(ID3D11RenderTargetView **rtvs,
- UINT numRTVs,
- ID3D11DepthStencilView *dsv)
-{
- bool anyDirty = false;
-
- for (UINT rtvIndex = 0; rtvIndex < numRTVs; ++rtvIndex)
- {
- anyDirty = anyDirty || unsetConflictingView(rtvs[rtvIndex]);
- }
-
- if (dsv)
- {
- anyDirty = anyDirty || unsetConflictingView(dsv);
- }
-
- if (anyDirty)
- {
- mInternalDirtyBits.set(DIRTY_BIT_TEXTURE_AND_SAMPLER_STATE);
- }
-
- mRenderer->getDeviceContext()->OMSetRenderTargets(numRTVs, (numRTVs > 0) ? rtvs : nullptr, dsv);
- mInternalDirtyBits.set(DIRTY_BIT_RENDER_TARGET);
-}
-
-void StateManager11::invalidateVertexAttributeTranslation()
-{
- mVertexAttribsNeedTranslation = true;
-}
-
-void StateManager11::onBeginQuery(Query11 *query)
-{
- mCurrentQueries.insert(query);
-}
-
-void StateManager11::onDeleteQueryObject(Query11 *query)
-{
- mCurrentQueries.erase(query);
-}
-
-gl::Error StateManager11::onMakeCurrent(const gl::Context *context)
-{
- const gl::State &state = context->getGLState();
-
- for (Query11 *query : mCurrentQueries)
- {
- ANGLE_TRY(query->pause());
- }
- mCurrentQueries.clear();
-
- for (GLenum queryType : QueryTypes)
- {
- gl::Query *query = state.getActiveQuery(queryType);
- if (query != nullptr)
- {
- Query11 *query11 = GetImplAs<Query11>(query);
- ANGLE_TRY(query11->resume());
- mCurrentQueries.insert(query11);
- }
- }
-
- return gl::NoError();
-}
-
-gl::Error StateManager11::clearTextures(gl::SamplerType samplerType,
- size_t rangeStart,
- size_t rangeEnd)
-{
- if (rangeStart == rangeEnd)
- {
- return gl::NoError();
- }
-
- auto &currentSRVs = (samplerType == gl::SAMPLER_VERTEX ? mCurVertexSRVs : mCurPixelSRVs);
-
- gl::Range<size_t> clearRange(rangeStart, std::min(rangeEnd, currentSRVs.highestUsed()));
- if (clearRange.empty())
- {
- return gl::NoError();
- }
-
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- if (samplerType == gl::SAMPLER_VERTEX)
- {
- deviceContext->VSSetShaderResources(static_cast<unsigned int>(clearRange.low()),
- static_cast<unsigned int>(clearRange.length()),
- &mNullSRVs[0]);
- }
- else
- {
- deviceContext->PSSetShaderResources(static_cast<unsigned int>(clearRange.low()),
- static_cast<unsigned int>(clearRange.length()),
- &mNullSRVs[0]);
- }
-
- for (size_t samplerIndex : clearRange)
- {
- currentSRVs.update(samplerIndex, nullptr);
- }
-
- return gl::NoError();
-}
-
-bool StateManager11::unsetConflictingView(ID3D11View *view)
-{
- uintptr_t resource = reinterpret_cast<uintptr_t>(GetViewResource(view));
- return unsetConflictingSRVs(gl::SAMPLER_VERTEX, resource, nullptr) ||
- unsetConflictingSRVs(gl::SAMPLER_PIXEL, resource, nullptr);
-}
-
-bool StateManager11::unsetConflictingSRVs(gl::SamplerType samplerType,
- uintptr_t resource,
- const gl::ImageIndex *index)
-{
- auto &currentSRVs = (samplerType == gl::SAMPLER_VERTEX ? mCurVertexSRVs : mCurPixelSRVs);
-
- bool foundOne = false;
-
- for (size_t resourceIndex = 0; resourceIndex < currentSRVs.size(); ++resourceIndex)
- {
- auto &record = currentSRVs[resourceIndex];
-
- if (record.srv && record.resource == resource &&
- (!index || ImageIndexConflictsWithSRV(*index, record.desc)))
- {
- setShaderResourceInternal<d3d11::ShaderResourceView>(
- samplerType, static_cast<UINT>(resourceIndex), nullptr);
- foundOne = true;
- }
- }
-
- return foundOne;
-}
-
-void StateManager11::unsetConflictingAttachmentResources(
- const gl::FramebufferAttachment *attachment,
- ID3D11Resource *resource)
-{
- // Unbind render target SRVs from the shader here to prevent D3D11 warnings.
- if (attachment->type() == GL_TEXTURE)
- {
- uintptr_t resourcePtr = reinterpret_cast<uintptr_t>(resource);
- const gl::ImageIndex &index = attachment->getTextureImageIndex();
- // The index doesn't need to be corrected for the small compressed texture workaround
- // because a rendertarget is never compressed.
- unsetConflictingSRVs(gl::SAMPLER_VERTEX, resourcePtr, &index);
- unsetConflictingSRVs(gl::SAMPLER_PIXEL, resourcePtr, &index);
- }
- else if (attachment->type() == GL_FRAMEBUFFER_DEFAULT)
- {
- uintptr_t resourcePtr = reinterpret_cast<uintptr_t>(resource);
- unsetConflictingSRVs(gl::SAMPLER_VERTEX, resourcePtr, nullptr);
- unsetConflictingSRVs(gl::SAMPLER_PIXEL, resourcePtr, nullptr);
- }
-}
-
-gl::Error StateManager11::initialize(const gl::Caps &caps, const gl::Extensions &extensions)
-{
- mCurVertexSRVs.initialize(caps.maxVertexTextureImageUnits);
- mCurPixelSRVs.initialize(caps.maxTextureImageUnits);
-
- // Initialize cached NULL SRV block
- mNullSRVs.resize(caps.maxTextureImageUnits, nullptr);
-
- mCurrentValueAttribs.resize(caps.maxVertexAttributes);
-
- mForceSetVertexSamplerStates.resize(caps.maxVertexTextureImageUnits, true);
- mForceSetPixelSamplerStates.resize(caps.maxTextureImageUnits, true);
- mForceSetComputeSamplerStates.resize(caps.maxComputeTextureImageUnits, true);
-
- mCurVertexSamplerStates.resize(caps.maxVertexTextureImageUnits);
- mCurPixelSamplerStates.resize(caps.maxTextureImageUnits);
- mCurComputeSamplerStates.resize(caps.maxComputeTextureImageUnits);
-
- mShaderConstants.init(caps);
-
- mIsMultiviewEnabled = extensions.multiview;
- mViewportOffsets.resize(1u);
-
- ANGLE_TRY(mVertexDataManager.initialize());
-
- mCurrentAttributes.reserve(gl::MAX_VERTEX_ATTRIBS);
-
- return gl::NoError();
-}
-
-void StateManager11::deinitialize()
-{
- mCurrentValueAttribs.clear();
- mInputLayoutCache.clear();
- mVertexDataManager.deinitialize();
- mIndexDataManager.deinitialize();
-
- mDriverConstantBufferVS.reset();
- mDriverConstantBufferPS.reset();
- mDriverConstantBufferCS.reset();
-}
-
-gl::Error StateManager11::syncFramebuffer(const gl::Context *context, gl::Framebuffer *framebuffer)
-{
- Framebuffer11 *framebuffer11 = GetImplAs<Framebuffer11>(framebuffer);
-
- // Applies the render target surface, depth stencil surface, viewport rectangle and
- // scissor rectangle to the renderer
- ASSERT(framebuffer && !framebuffer->hasAnyDirtyBit() && framebuffer->cachedComplete());
-
- // Check for zero-sized default framebuffer, which is a special case.
- // in this case we do not wish to modify any state and just silently return false.
- // this will not report any gl error but will cause the calling method to return.
- if (framebuffer->id() == 0)
- {
- ASSERT(!framebuffer11->hasAnyInternalDirtyBit());
- const gl::Extents &size = framebuffer->getFirstColorbuffer()->getSize();
- if (size.width == 0 || size.height == 0)
- {
- return gl::NoError();
- }
- }
-
- RTVArray framebufferRTVs = {{}};
-
- const auto &colorRTs = framebuffer11->getCachedColorRenderTargets();
-
- size_t appliedRTIndex = 0;
- bool skipInactiveRTs = mRenderer->getWorkarounds().mrtPerfWorkaround;
- const auto &drawStates = framebuffer->getDrawBufferStates();
- gl::DrawBufferMask activeProgramOutputs =
- context->getContextState().getState().getProgram()->getActiveOutputVariables();
- UINT maxExistingRT = 0;
-
- for (size_t rtIndex = 0; rtIndex < colorRTs.size(); ++rtIndex)
- {
- const RenderTarget11 *renderTarget = colorRTs[rtIndex];
-
- // Skip inactive rendertargets if the workaround is enabled.
- if (skipInactiveRTs &&
- (!renderTarget || drawStates[rtIndex] == GL_NONE || !activeProgramOutputs[rtIndex]))
- {
- continue;
- }
-
- if (renderTarget)
- {
- framebufferRTVs[appliedRTIndex] = renderTarget->getRenderTargetView().get();
- ASSERT(framebufferRTVs[appliedRTIndex]);
- maxExistingRT = static_cast<UINT>(appliedRTIndex) + 1;
-
- // Unset conflicting texture SRVs
- const auto *attachment = framebuffer->getColorbuffer(rtIndex);
- ASSERT(attachment);
- unsetConflictingAttachmentResources(attachment, renderTarget->getTexture().get());
- }
-
- appliedRTIndex++;
- }
-
- // Get the depth stencil buffers
- ID3D11DepthStencilView *framebufferDSV = nullptr;
- const auto *depthStencilRenderTarget = framebuffer11->getCachedDepthStencilRenderTarget();
- if (depthStencilRenderTarget)
- {
- framebufferDSV = depthStencilRenderTarget->getDepthStencilView().get();
- ASSERT(framebufferDSV);
-
- // Unset conflicting texture SRVs
- const auto *attachment = framebuffer->getDepthOrStencilbuffer();
- ASSERT(attachment);
- unsetConflictingAttachmentResources(attachment,
- depthStencilRenderTarget->getTexture().get());
- }
-
- // TODO(jmadill): Use context caps?
- ASSERT(maxExistingRT <= static_cast<UINT>(mRenderer->getNativeCaps().maxDrawBuffers));
-
- // Apply the render target and depth stencil
- mRenderer->getDeviceContext()->OMSetRenderTargets(maxExistingRT, framebufferRTVs.data(),
- framebufferDSV);
-
- return gl::NoError();
-}
-
-void StateManager11::invalidateCurrentValueAttrib(size_t attribIndex)
-{
- mDirtyCurrentValueAttribs.set(attribIndex);
- mInternalDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_ATTRIBS);
-}
-
-gl::Error StateManager11::syncCurrentValueAttribs(const gl::State &glState)
-{
- const auto &activeAttribsMask = glState.getProgram()->getActiveAttribLocationsMask();
- const auto &dirtyActiveAttribs = (activeAttribsMask & mDirtyCurrentValueAttribs);
-
- if (!dirtyActiveAttribs.any())
- {
- return gl::NoError();
- }
-
- const auto &vertexAttributes = glState.getVertexArray()->getVertexAttributes();
- const auto &vertexBindings = glState.getVertexArray()->getVertexBindings();
- mDirtyCurrentValueAttribs = (mDirtyCurrentValueAttribs & ~dirtyActiveAttribs);
-
- for (auto attribIndex : dirtyActiveAttribs)
- {
- if (vertexAttributes[attribIndex].enabled)
- continue;
-
- const auto *attrib = &vertexAttributes[attribIndex];
- const auto &currentValue = glState.getVertexAttribCurrentValue(attribIndex);
- TranslatedAttribute *currentValueAttrib = &mCurrentValueAttribs[attribIndex];
- currentValueAttrib->currentValueType = currentValue.Type;
- currentValueAttrib->attribute = attrib;
- currentValueAttrib->binding = &vertexBindings[attrib->bindingIndex];
-
- mDirtyVertexBufferRange.extend(static_cast<unsigned int>(attribIndex));
- mInputLayoutIsDirty = true;
-
- ANGLE_TRY(mVertexDataManager.storeCurrentValue(currentValue, currentValueAttrib,
- static_cast<size_t>(attribIndex)));
- }
-
- return gl::NoError();
-}
-
-void StateManager11::setInputLayout(const d3d11::InputLayout *inputLayout)
-{
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- if (inputLayout == nullptr)
- {
- if (!mCurrentInputLayout.empty())
- {
- deviceContext->IASetInputLayout(nullptr);
- mCurrentInputLayout.clear();
- mInputLayoutIsDirty = true;
- }
- }
- else if (inputLayout->getSerial() != mCurrentInputLayout)
- {
- deviceContext->IASetInputLayout(inputLayout->get());
- mCurrentInputLayout = inputLayout->getSerial();
- mInputLayoutIsDirty = true;
- }
-}
-
-bool StateManager11::queueVertexBufferChange(size_t bufferIndex,
- ID3D11Buffer *buffer,
- UINT stride,
- UINT offset)
-{
- if (buffer != mCurrentVertexBuffers[bufferIndex] ||
- stride != mCurrentVertexStrides[bufferIndex] ||
- offset != mCurrentVertexOffsets[bufferIndex])
- {
- mInputLayoutIsDirty = true;
- mDirtyVertexBufferRange.extend(static_cast<unsigned int>(bufferIndex));
-
- mCurrentVertexBuffers[bufferIndex] = buffer;
- mCurrentVertexStrides[bufferIndex] = stride;
- mCurrentVertexOffsets[bufferIndex] = offset;
- return true;
- }
-
- return false;
-}
-
-bool StateManager11::queueVertexOffsetChange(size_t bufferIndex, UINT offsetOnly)
-{
- if (offsetOnly != mCurrentVertexOffsets[bufferIndex])
- {
- mInputLayoutIsDirty = true;
- mDirtyVertexBufferRange.extend(static_cast<unsigned int>(bufferIndex));
- mCurrentVertexOffsets[bufferIndex] = offsetOnly;
- return true;
- }
- return false;
-}
-
-void StateManager11::applyVertexBufferChanges()
-{
- if (mDirtyVertexBufferRange.empty())
- {
- return;
- }
-
- ASSERT(mDirtyVertexBufferRange.high() <= gl::MAX_VERTEX_ATTRIBS);
-
- UINT start = static_cast<UINT>(mDirtyVertexBufferRange.low());
-
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- deviceContext->IASetVertexBuffers(start, static_cast<UINT>(mDirtyVertexBufferRange.length()),
- &mCurrentVertexBuffers[start], &mCurrentVertexStrides[start],
- &mCurrentVertexOffsets[start]);
-
- mDirtyVertexBufferRange = gl::RangeUI(gl::MAX_VERTEX_ATTRIBS, 0);
-}
-
-void StateManager11::setSingleVertexBuffer(const d3d11::Buffer *buffer, UINT stride, UINT offset)
-{
- ID3D11Buffer *native = buffer ? buffer->get() : nullptr;
- if (queueVertexBufferChange(0, native, stride, offset))
- {
- applyVertexBufferChanges();
- }
-}
-
-gl::Error StateManager11::updateState(const gl::Context *context, GLenum drawMode)
-{
- const auto &glState = context->getGLState();
- auto *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
-
- // TODO(jmadill): Use dirty bits.
- processFramebufferInvalidation(context);
-
- // TODO(jmadill): Use dirty bits.
- if (programD3D->updateSamplerMapping() == ProgramD3D::SamplerMapping::WasDirty)
- {
- invalidateTexturesAndSamplers();
- }
-
- // TODO(jmadill): Use dirty bits.
- if (programD3D->areVertexUniformsDirty() || programD3D->areFragmentUniformsDirty())
- {
- mInternalDirtyBits.set(DIRTY_BIT_PROGRAM_UNIFORMS);
- }
-
- // Transform feedback affects the stream-out geometry shader.
- // TODO(jmadill): Use dirty bits.
- if (glState.isTransformFeedbackActiveUnpaused() != mIsTransformFeedbackCurrentlyActiveUnpaused)
- {
- mIsTransformFeedbackCurrentlyActiveUnpaused = glState.isTransformFeedbackActiveUnpaused();
- invalidateShaders();
- }
-
- // Swizzling can cause internal state changes with blit shaders.
- if (mDirtySwizzles)
- {
- ANGLE_TRY(generateSwizzles(context));
- mDirtySwizzles = false;
- }
-
- gl::Framebuffer *framebuffer = glState.getDrawFramebuffer();
- Framebuffer11 *framebuffer11 = GetImplAs<Framebuffer11>(framebuffer);
- ANGLE_TRY(framebuffer11->markAttachmentsDirty(context));
-
- if (framebuffer11->hasAnyInternalDirtyBit())
- {
- ASSERT(framebuffer->id() != 0);
- framebuffer11->syncInternalState(context);
- }
-
- bool pointDrawMode = (drawMode == GL_POINTS);
- if (pointDrawMode != mCurRasterState.pointDrawMode)
- {
- mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE);
-
- // Changing from points to not points (or vice-versa) affects the geometry shader.
- invalidateShaders();
- }
-
- // TODO(jiawei.shao@intel.com): This can be recomputed only on framebuffer or multisample mask
- // state changes.
- RenderTarget11 *firstRT = framebuffer11->getFirstRenderTarget();
- int samples = (firstRT ? firstRT->getSamples() : 0);
- unsigned int sampleMask = GetBlendSampleMask(glState, samples);
- if (sampleMask != mCurSampleMask)
- {
- mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
- }
-
- // Changing the vertex attribute state can affect the vertex shader.
- gl::VertexArray *vao = glState.getVertexArray();
- VertexArray11 *vao11 = GetImplAs<VertexArray11>(vao);
- if (vao11->flushAttribUpdates(context))
- {
- mInternalDirtyBits.set(DIRTY_BIT_SHADERS);
- }
-
- auto dirtyBitsCopy = mInternalDirtyBits;
- mInternalDirtyBits.reset();
-
- for (auto dirtyBit : dirtyBitsCopy)
- {
- switch (dirtyBit)
- {
- case DIRTY_BIT_RENDER_TARGET:
- ANGLE_TRY(syncFramebuffer(context, framebuffer));
- break;
- case DIRTY_BIT_VIEWPORT_STATE:
- syncViewport(context);
- break;
- case DIRTY_BIT_SCISSOR_STATE:
- syncScissorRectangle(glState.getScissor(), glState.isScissorTestEnabled());
- break;
- case DIRTY_BIT_RASTERIZER_STATE:
- ANGLE_TRY(syncRasterizerState(context, pointDrawMode));
- break;
- case DIRTY_BIT_BLEND_STATE:
- ANGLE_TRY(syncBlendState(context, framebuffer, glState.getBlendState(),
- glState.getBlendColor(), sampleMask));
- break;
- case DIRTY_BIT_DEPTH_STENCIL_STATE:
- ANGLE_TRY(syncDepthStencilState(glState));
- break;
- case DIRTY_BIT_TEXTURE_AND_SAMPLER_STATE:
- // TODO(jmadill): More fine-grained update.
- ANGLE_TRY(syncTextures(context));
- break;
- case DIRTY_BIT_PROGRAM_UNIFORMS:
- ANGLE_TRY(applyUniforms(programD3D));
- break;
- case DIRTY_BIT_DRIVER_UNIFORMS:
- // This must happen after viewport sync; the viewport affects builtin uniforms.
- ANGLE_TRY(applyDriverUniforms(*programD3D));
- break;
- case DIRTY_BIT_PROGRAM_UNIFORM_BUFFERS:
- ANGLE_TRY(syncUniformBuffers(context, programD3D));
- break;
- case DIRTY_BIT_SHADERS:
- ANGLE_TRY(syncProgram(context, drawMode));
- break;
- case DIRTY_BIT_CURRENT_VALUE_ATTRIBS:
- ANGLE_TRY(syncCurrentValueAttribs(glState));
- break;
- default:
- UNREACHABLE();
- break;
- }
- }
-
- ANGLE_TRY(syncTransformFeedbackBuffers(context));
-
- // Check that we haven't set any dirty bits in the flushing of the dirty bits loop.
- ASSERT(mInternalDirtyBits.none());
-
- return gl::NoError();
-}
-
-void StateManager11::setShaderResourceShared(gl::SamplerType shaderType,
- UINT resourceSlot,
- const d3d11::SharedSRV *srv)
-{
- setShaderResourceInternal(shaderType, resourceSlot, srv);
-
- // TODO(jmadill): Narrower dirty region.
- mInternalDirtyBits.set(DIRTY_BIT_TEXTURE_AND_SAMPLER_STATE);
-}
-
-void StateManager11::setShaderResource(gl::SamplerType shaderType,
- UINT resourceSlot,
- const d3d11::ShaderResourceView *srv)
-{
- setShaderResourceInternal(shaderType, resourceSlot, srv);
-
- // TODO(jmadill): Narrower dirty region.
- mInternalDirtyBits.set(DIRTY_BIT_TEXTURE_AND_SAMPLER_STATE);
-}
-
-void StateManager11::setPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY primitiveTopology)
-{
- if (primitiveTopology != mCurrentPrimitiveTopology)
- {
- mRenderer->getDeviceContext()->IASetPrimitiveTopology(primitiveTopology);
- mCurrentPrimitiveTopology = primitiveTopology;
- }
-}
-
-void StateManager11::setDrawShaders(const d3d11::VertexShader *vertexShader,
- const d3d11::GeometryShader *geometryShader,
- const d3d11::PixelShader *pixelShader)
-{
- setVertexShader(vertexShader);
- setGeometryShader(geometryShader);
- setPixelShader(pixelShader);
-}
-
-void StateManager11::setVertexShader(const d3d11::VertexShader *shader)
-{
- ResourceSerial serial = shader ? shader->getSerial() : ResourceSerial(0);
-
- if (serial != mAppliedVertexShader)
- {
- ID3D11VertexShader *appliedShader = shader ? shader->get() : nullptr;
- mRenderer->getDeviceContext()->VSSetShader(appliedShader, nullptr, 0);
- mAppliedVertexShader = serial;
- invalidateShaders();
- }
-}
-
-void StateManager11::setGeometryShader(const d3d11::GeometryShader *shader)
-{
- ResourceSerial serial = shader ? shader->getSerial() : ResourceSerial(0);
-
- if (serial != mAppliedGeometryShader)
- {
- ID3D11GeometryShader *appliedShader = shader ? shader->get() : nullptr;
- mRenderer->getDeviceContext()->GSSetShader(appliedShader, nullptr, 0);
- mAppliedGeometryShader = serial;
- invalidateShaders();
- }
-}
-
-void StateManager11::setPixelShader(const d3d11::PixelShader *shader)
-{
- ResourceSerial serial = shader ? shader->getSerial() : ResourceSerial(0);
-
- if (serial != mAppliedPixelShader)
- {
- ID3D11PixelShader *appliedShader = shader ? shader->get() : nullptr;
- mRenderer->getDeviceContext()->PSSetShader(appliedShader, nullptr, 0);
- mAppliedPixelShader = serial;
- invalidateShaders();
- }
-}
-
-void StateManager11::setComputeShader(const d3d11::ComputeShader *shader)
-{
- ResourceSerial serial = shader ? shader->getSerial() : ResourceSerial(0);
-
- if (serial != mAppliedComputeShader)
- {
- ID3D11ComputeShader *appliedShader = shader ? shader->get() : nullptr;
- mRenderer->getDeviceContext()->CSSetShader(appliedShader, nullptr, 0);
- mAppliedComputeShader = serial;
- // TODO(jmadill): Dirty bits for compute.
- }
-}
-
-void StateManager11::setVertexConstantBuffer(unsigned int slot, const d3d11::Buffer *buffer)
-{
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- auto &currentSerial = mCurrentConstantBufferVS[slot];
-
- mCurrentConstantBufferVSOffset[slot] = 0;
- mCurrentConstantBufferVSSize[slot] = 0;
-
- if (buffer)
- {
- if (currentSerial != buffer->getSerial())
- {
- deviceContext->VSSetConstantBuffers(slot, 1, buffer->getPointer());
- currentSerial = buffer->getSerial();
- invalidateConstantBuffer(slot);
- }
- }
- else
- {
- if (!currentSerial.empty())
- {
- ID3D11Buffer *nullBuffer = nullptr;
- deviceContext->VSSetConstantBuffers(slot, 1, &nullBuffer);
- currentSerial.clear();
- invalidateConstantBuffer(slot);
- }
- }
-}
-
-void StateManager11::setPixelConstantBuffer(unsigned int slot, const d3d11::Buffer *buffer)
-{
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- auto &currentSerial = mCurrentConstantBufferPS[slot];
-
- mCurrentConstantBufferPSOffset[slot] = 0;
- mCurrentConstantBufferPSSize[slot] = 0;
-
- if (buffer)
- {
- if (currentSerial != buffer->getSerial())
- {
- deviceContext->PSSetConstantBuffers(slot, 1, buffer->getPointer());
- currentSerial = buffer->getSerial();
- invalidateConstantBuffer(slot);
- }
- }
- else
- {
- if (!currentSerial.empty())
- {
- ID3D11Buffer *nullBuffer = nullptr;
- deviceContext->PSSetConstantBuffers(slot, 1, &nullBuffer);
- currentSerial.clear();
- invalidateConstantBuffer(slot);
- }
- }
-}
-
-void StateManager11::setDepthStencilState(const d3d11::DepthStencilState *depthStencilState,
- UINT stencilRef)
-{
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- if (depthStencilState)
- {
- deviceContext->OMSetDepthStencilState(depthStencilState->get(), stencilRef);
- }
- else
- {
- deviceContext->OMSetDepthStencilState(nullptr, stencilRef);
- }
-
- mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
-}
-
-void StateManager11::setSimpleBlendState(const d3d11::BlendState *blendState)
-{
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- if (blendState)
- {
- deviceContext->OMSetBlendState(blendState->get(), nullptr, 0xFFFFFFFF);
- }
- else
- {
- deviceContext->OMSetBlendState(nullptr, nullptr, 0xFFFFFFFF);
- }
-
- mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
-}
-
-void StateManager11::setRasterizerState(const d3d11::RasterizerState *rasterizerState)
-{
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- if (rasterizerState)
- {
- deviceContext->RSSetState(rasterizerState->get());
- }
- else
- {
- deviceContext->RSSetState(nullptr);
- }
-
- mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE);
-}
-
-void StateManager11::setSimpleViewport(const gl::Extents &extents)
-{
- setSimpleViewport(extents.width, extents.height);
-}
-
-void StateManager11::setSimpleViewport(int width, int height)
-{
- D3D11_VIEWPORT viewport;
- viewport.TopLeftX = 0;
- viewport.TopLeftY = 0;
- viewport.Width = static_cast<FLOAT>(width);
- viewport.Height = static_cast<FLOAT>(height);
- viewport.MinDepth = 0.0f;
- viewport.MaxDepth = 1.0f;
-
- mRenderer->getDeviceContext()->RSSetViewports(1, &viewport);
- mInternalDirtyBits.set(DIRTY_BIT_VIEWPORT_STATE);
-}
-
-void StateManager11::setSimplePixelTextureAndSampler(const d3d11::SharedSRV &srv,
- const d3d11::SamplerState &samplerState)
-{
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- setShaderResourceInternal(gl::SAMPLER_PIXEL, 0, &srv);
- deviceContext->PSSetSamplers(0, 1, samplerState.getPointer());
-
- mInternalDirtyBits.set(DIRTY_BIT_TEXTURE_AND_SAMPLER_STATE);
- mForceSetPixelSamplerStates[0] = true;
-}
-
-void StateManager11::setSimpleScissorRect(const gl::Rectangle &glRect)
-{
- D3D11_RECT scissorRect;
- scissorRect.left = glRect.x;
- scissorRect.right = glRect.x + glRect.width;
- scissorRect.top = glRect.y;
- scissorRect.bottom = glRect.y + glRect.height;
- setScissorRectD3D(scissorRect);
-}
-
-void StateManager11::setScissorRectD3D(const D3D11_RECT &d3dRect)
-{
- mRenderer->getDeviceContext()->RSSetScissorRects(1, &d3dRect);
- mInternalDirtyBits.set(DIRTY_BIT_SCISSOR_STATE);
-}
-
-// For each Direct3D sampler of either the pixel or vertex stage,
-// looks up the corresponding OpenGL texture image unit and texture type,
-// and sets the texture and its addressing/filtering state (or NULL when inactive).
-// Sampler mapping needs to be up-to-date on the program object before this is called.
-gl::Error StateManager11::applyTextures(const gl::Context *context, gl::SamplerType shaderType)
-{
- const auto &glState = context->getGLState();
- const auto &caps = context->getCaps();
- ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
-
- ASSERT(!programD3D->isSamplerMappingDirty());
-
- // TODO(jmadill): Use the Program's sampler bindings.
- const auto &completeTextures = glState.getCompleteTextureCache();
-
- unsigned int samplerRange = programD3D->getUsedSamplerRange(shaderType);
- for (unsigned int samplerIndex = 0; samplerIndex < samplerRange; samplerIndex++)
- {
- GLint textureUnit = programD3D->getSamplerMapping(shaderType, samplerIndex, caps);
- ASSERT(textureUnit != -1);
- gl::Texture *texture = completeTextures[textureUnit];
-
- // A nullptr texture indicates incomplete.
- if (texture)
- {
- gl::Sampler *samplerObject = glState.getSampler(textureUnit);
-
- const gl::SamplerState &samplerState =
- samplerObject ? samplerObject->getSamplerState() : texture->getSamplerState();
-
- ANGLE_TRY(setSamplerState(context, shaderType, samplerIndex, texture, samplerState));
- ANGLE_TRY(setTexture(context, shaderType, samplerIndex, texture));
- }
- else
- {
- GLenum textureType = programD3D->getSamplerTextureType(shaderType, samplerIndex);
-
- // Texture is not sampler complete or it is in use by the framebuffer. Bind the
- // incomplete texture.
- gl::Texture *incompleteTexture = nullptr;
- ANGLE_TRY(mRenderer->getIncompleteTexture(context, textureType, &incompleteTexture));
- ANGLE_TRY(setSamplerState(context, shaderType, samplerIndex, incompleteTexture,
- incompleteTexture->getSamplerState()));
- ANGLE_TRY(setTexture(context, shaderType, samplerIndex, incompleteTexture));
- }
- }
-
- // Set all the remaining textures to NULL
- size_t samplerCount = (shaderType == gl::SAMPLER_PIXEL) ? caps.maxTextureImageUnits
- : caps.maxVertexTextureImageUnits;
- ANGLE_TRY(clearTextures(shaderType, samplerRange, samplerCount));
-
- return gl::NoError();
-}
-
-gl::Error StateManager11::syncTextures(const gl::Context *context)
-{
- ANGLE_TRY(applyTextures(context, gl::SAMPLER_VERTEX));
- ANGLE_TRY(applyTextures(context, gl::SAMPLER_PIXEL));
- return gl::NoError();
-}
-
-gl::Error StateManager11::setSamplerState(const gl::Context *context,
- gl::SamplerType type,
- int index,
- gl::Texture *texture,
- const gl::SamplerState &samplerState)
-{
-#if !defined(NDEBUG)
- // Storage should exist, texture should be complete. Only verified in Debug.
- TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture);
- TextureStorage *storage = nullptr;
- ANGLE_TRY(textureD3D->getNativeTexture(context, &storage));
- ASSERT(storage);
-#endif // !defined(NDEBUG)
-
- auto *deviceContext = mRenderer->getDeviceContext();
-
- if (type == gl::SAMPLER_PIXEL)
- {
- ASSERT(static_cast<unsigned int>(index) < mRenderer->getNativeCaps().maxTextureImageUnits);
-
- if (mForceSetPixelSamplerStates[index] ||
- memcmp(&samplerState, &mCurPixelSamplerStates[index], sizeof(gl::SamplerState)) != 0)
- {
- ID3D11SamplerState *dxSamplerState = nullptr;
- ANGLE_TRY(mRenderer->getSamplerState(samplerState, &dxSamplerState));
-
- ASSERT(dxSamplerState != nullptr);
- deviceContext->PSSetSamplers(index, 1, &dxSamplerState);
-
- mCurPixelSamplerStates[index] = samplerState;
- }
-
- mForceSetPixelSamplerStates[index] = false;
- }
- else if (type == gl::SAMPLER_VERTEX)
- {
- ASSERT(static_cast<unsigned int>(index) <
- mRenderer->getNativeCaps().maxVertexTextureImageUnits);
-
- if (mForceSetVertexSamplerStates[index] ||
- memcmp(&samplerState, &mCurVertexSamplerStates[index], sizeof(gl::SamplerState)) != 0)
- {
- ID3D11SamplerState *dxSamplerState = nullptr;
- ANGLE_TRY(mRenderer->getSamplerState(samplerState, &dxSamplerState));
-
- ASSERT(dxSamplerState != nullptr);
- deviceContext->VSSetSamplers(index, 1, &dxSamplerState);
-
- mCurVertexSamplerStates[index] = samplerState;
- }
-
- mForceSetVertexSamplerStates[index] = false;
- }
- else if (type == gl::SAMPLER_COMPUTE)
- {
- ASSERT(static_cast<unsigned int>(index) <
- mRenderer->getNativeCaps().maxComputeTextureImageUnits);
-
- if (mForceSetComputeSamplerStates[index] ||
- memcmp(&samplerState, &mCurComputeSamplerStates[index], sizeof(gl::SamplerState)) != 0)
- {
- ID3D11SamplerState *dxSamplerState = nullptr;
- ANGLE_TRY(mRenderer->getSamplerState(samplerState, &dxSamplerState));
-
- ASSERT(dxSamplerState != nullptr);
- deviceContext->CSSetSamplers(index, 1, &dxSamplerState);
-
- mCurComputeSamplerStates[index] = samplerState;
- }
-
- mForceSetComputeSamplerStates[index] = false;
- }
- else
- UNREACHABLE();
-
- // Sampler metadata that's passed to shaders in uniforms is stored separately from rest of the
- // sampler state since having it in contiguous memory makes it possible to memcpy to a constant
- // buffer, and it doesn't affect the state set by PSSetSamplers/VSSetSamplers.
- mShaderConstants.onSamplerChange(type, index, *texture);
-
- return gl::NoError();
-}
-
-gl::Error StateManager11::setTexture(const gl::Context *context,
- gl::SamplerType type,
- int index,
- gl::Texture *texture)
-{
- const d3d11::SharedSRV *textureSRV = nullptr;
-
- if (texture)
- {
- TextureD3D *textureImpl = GetImplAs<TextureD3D>(texture);
-
- TextureStorage *texStorage = nullptr;
- ANGLE_TRY(textureImpl->getNativeTexture(context, &texStorage));
-
- // Texture should be complete and have a storage
- ASSERT(texStorage);
-
- TextureStorage11 *storage11 = GetAs<TextureStorage11>(texStorage);
-
- ANGLE_TRY(storage11->getSRV(context, texture->getTextureState(), &textureSRV));
-
- // If we get an invalid SRV here, something went wrong in the texture class and we're
- // unexpectedly missing the shader resource view.
- ASSERT(textureSRV->valid());
-
- textureImpl->resetDirty();
- }
-
- ASSERT(
- (type == gl::SAMPLER_PIXEL &&
- static_cast<unsigned int>(index) < mRenderer->getNativeCaps().maxTextureImageUnits) ||
- (type == gl::SAMPLER_VERTEX &&
- static_cast<unsigned int>(index) < mRenderer->getNativeCaps().maxVertexTextureImageUnits));
-
- setShaderResourceInternal(type, index, textureSRV);
- return gl::NoError();
-}
-
-// Things that affect a program's dirtyness:
-// 1. Directly changing the program executable -> triggered in StateManager11::syncState.
-// 2. The vertex attribute layout -> triggered in VertexArray11::syncState/signal.
-// 3. The fragment shader's rendertargets -> triggered in Framebuffer11::syncState/signal.
-// 4. Enabling/disabling rasterizer discard. -> triggered in StateManager11::syncState.
-// 5. Enabling/disabling transform feedback. -> checked in StateManager11::updateState.
-// 6. An internal shader was used. -> triggered in StateManager11::set*Shader.
-// 7. Drawing with/without point sprites. -> checked in StateManager11::updateState.
-// TODO(jmadill): Use dirty bits for transform feedback.
-gl::Error StateManager11::syncProgram(const gl::Context *context, GLenum drawMode)
-{
- Context11 *context11 = GetImplAs<Context11>(context);
- ANGLE_TRY(context11->triggerDrawCallProgramRecompilation(context, drawMode));
-
- const auto &glState = context->getGLState();
- const auto *va11 = GetImplAs<VertexArray11>(glState.getVertexArray());
- auto *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
-
- programD3D->updateCachedInputLayout(va11->getCurrentStateSerial(), glState);
-
- // Binaries must be compiled before the sync.
- ASSERT(programD3D->hasVertexExecutableForCachedInputLayout());
- ASSERT(programD3D->hasGeometryExecutableForPrimitiveType(drawMode));
- ASSERT(programD3D->hasPixelExecutableForCachedOutputLayout());
-
- ShaderExecutableD3D *vertexExe = nullptr;
- ANGLE_TRY(programD3D->getVertexExecutableForCachedInputLayout(&vertexExe, nullptr));
-
- ShaderExecutableD3D *pixelExe = nullptr;
- ANGLE_TRY(programD3D->getPixelExecutableForCachedOutputLayout(&pixelExe, nullptr));
-
- ShaderExecutableD3D *geometryExe = nullptr;
- ANGLE_TRY(programD3D->getGeometryExecutableForPrimitiveType(context, drawMode, &geometryExe,
- nullptr));
-
- const d3d11::VertexShader *vertexShader =
- (vertexExe ? &GetAs<ShaderExecutable11>(vertexExe)->getVertexShader() : nullptr);
-
- // Skip pixel shader if we're doing rasterizer discard.
- const d3d11::PixelShader *pixelShader = nullptr;
- if (!glState.getRasterizerState().rasterizerDiscard)
- {
- pixelShader = (pixelExe ? &GetAs<ShaderExecutable11>(pixelExe)->getPixelShader() : nullptr);
- }
-
- const d3d11::GeometryShader *geometryShader = nullptr;
- if (glState.isTransformFeedbackActiveUnpaused())
- {
- geometryShader =
- (vertexExe ? &GetAs<ShaderExecutable11>(vertexExe)->getStreamOutShader() : nullptr);
- }
- else
- {
- geometryShader =
- (geometryExe ? &GetAs<ShaderExecutable11>(geometryExe)->getGeometryShader() : nullptr);
- }
-
- setDrawShaders(vertexShader, geometryShader, pixelShader);
-
- // Explicitly clear the shaders dirty bit.
- mInternalDirtyBits.reset(DIRTY_BIT_SHADERS);
-
- return gl::NoError();
-}
-
-gl::Error StateManager11::applyVertexBuffer(const gl::Context *context,
- GLenum mode,
- const DrawCallVertexParams &vertexParams,
- bool isIndexedRendering)
-{
- const auto &state = context->getGLState();
- const gl::VertexArray *vertexArray = state.getVertexArray();
- VertexArray11 *vertexArray11 = GetImplAs<VertexArray11>(vertexArray);
-
- if (mVertexAttribsNeedTranslation)
- {
- ANGLE_TRY(vertexArray11->updateDirtyAndDynamicAttribs(context, &mVertexDataManager,
- vertexParams));
- mInputLayoutIsDirty = true;
-
- // Determine if we need to update attribs on the next draw.
- mVertexAttribsNeedTranslation = (vertexArray11->hasActiveDynamicAttrib(context));
- }
-
- if (!mLastFirstVertex.valid() || mLastFirstVertex.value() != vertexParams.firstVertex())
- {
- mLastFirstVertex = vertexParams.firstVertex();
- mInputLayoutIsDirty = true;
- }
-
- if (!mInputLayoutIsDirty)
- {
- return gl::NoError();
- }
-
- const auto &vertexArrayAttribs = vertexArray11->getTranslatedAttribs();
- gl::Program *program = state.getProgram();
-
- // Sort the attributes according to ensure we re-use similar input layouts.
- AttribIndexArray sortedSemanticIndices;
- SortAttributesByLayout(program, vertexArrayAttribs, mCurrentValueAttribs,
- &sortedSemanticIndices, &mCurrentAttributes);
-
- auto featureLevel = mRenderer->getRenderer11DeviceCaps().featureLevel;
-
- // If we are using FL 9_3, make sure the first attribute is not instanced
- if (featureLevel <= D3D_FEATURE_LEVEL_9_3 && !mCurrentAttributes.empty())
- {
- if (mCurrentAttributes[0]->divisor > 0)
- {
- Optional<size_t> firstNonInstancedIndex = FindFirstNonInstanced(mCurrentAttributes);
- if (firstNonInstancedIndex.valid())
- {
- size_t index = firstNonInstancedIndex.value();
- std::swap(mCurrentAttributes[0], mCurrentAttributes[index]);
- std::swap(sortedSemanticIndices[0], sortedSemanticIndices[index]);
- }
- }
- }
-
- // Update the applied input layout by querying the cache.
- ANGLE_TRY(mInputLayoutCache.updateInputLayout(mRenderer, state, mCurrentAttributes, mode,
- sortedSemanticIndices, vertexParams));
-
- // Update the applied vertex buffers.
- ANGLE_TRY(mInputLayoutCache.applyVertexBuffers(context, mCurrentAttributes, mode,
- vertexParams.firstVertex(), isIndexedRendering));
-
- // InputLayoutCache::applyVertexBuffers calls through to the Bufer11 to get the native vertex
- // buffer (ID3D11Buffer *). Because we allocate these buffers lazily, this will trigger
- // allocation. This in turn will signal that the buffer is dirty. Since we just resolved the
- // dirty-ness in VertexArray11::updateDirtyAndDynamicAttribs, this can make us do a needless
- // update on the second draw call.
- // Hence we clear the flags here, after we've applied vertex data, since we know everything
- // is clean. This is a bit of a hack.
- vertexArray11->clearDirtyAndPromoteDynamicAttribs(context, vertexParams);
-
- mInputLayoutIsDirty = false;
- return gl::NoError();
-}
-
-gl::Error StateManager11::applyIndexBuffer(const gl::Context *context,
- const void *indices,
- GLsizei count,
- GLenum type,
- const gl::HasIndexRange &lazyIndexRange,
- bool usePrimitiveRestartWorkaround)
-{
- const auto &glState = context->getGLState();
- gl::VertexArray *vao = glState.getVertexArray();
- VertexArray11 *vao11 = GetImplAs<VertexArray11>(vao);
-
- GLenum destElementType =
- GetIndexTranslationDestType(type, lazyIndexRange, usePrimitiveRestartWorkaround);
-
- if (!vao11->updateElementArrayStorage(context, type, destElementType, indices) &&
- !mIndexBufferIsDirty)
- {
- // No streaming or index buffer application necessary.
- return gl::NoError();
- }
-
- gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get();
-
- TranslatedIndexData *indexInfo = vao11->getCachedIndexInfo();
- ANGLE_TRY(mIndexDataManager.prepareIndexData(context, type, destElementType, count,
- elementArrayBuffer, indices, indexInfo));
-
- ID3D11Buffer *buffer = nullptr;
- DXGI_FORMAT bufferFormat =
- (indexInfo->indexType == GL_UNSIGNED_INT) ? DXGI_FORMAT_R32_UINT : DXGI_FORMAT_R16_UINT;
-
- if (indexInfo->storage)
- {
- Buffer11 *storage = GetAs<Buffer11>(indexInfo->storage);
- ANGLE_TRY_RESULT(storage->getBuffer(context, BUFFER_USAGE_INDEX), buffer);
- }
- else
- {
- IndexBuffer11 *indexBuffer = GetAs<IndexBuffer11>(indexInfo->indexBuffer);
- buffer = indexBuffer->getBuffer().get();
- }
-
- // Track dirty indices in the index range cache.
- indexInfo->srcIndexData.srcIndicesChanged =
- syncIndexBuffer(buffer, bufferFormat, indexInfo->startOffset);
-
- mIndexBufferIsDirty = false;
-
- vao11->setCachedIndexInfoValid();
- return gl::NoError();
-}
-
-void StateManager11::setIndexBuffer(ID3D11Buffer *buffer,
- DXGI_FORMAT indexFormat,
- unsigned int offset)
-{
- if (syncIndexBuffer(buffer, indexFormat, offset))
- {
- mIndexBufferIsDirty = true;
- }
-}
-
-bool StateManager11::syncIndexBuffer(ID3D11Buffer *buffer,
- DXGI_FORMAT indexFormat,
- unsigned int offset)
-{
- if (buffer != mAppliedIB || indexFormat != mAppliedIBFormat || offset != mAppliedIBOffset)
- {
- mRenderer->getDeviceContext()->IASetIndexBuffer(buffer, indexFormat, offset);
-
- mAppliedIB = buffer;
- mAppliedIBFormat = indexFormat;
- mAppliedIBOffset = offset;
- return true;
- }
-
- return false;
-}
-
-// Vertex buffer is invalidated outside this function.
-gl::Error StateManager11::updateVertexOffsetsForPointSpritesEmulation(GLint startVertex,
- GLsizei emulatedInstanceId)
-{
- return mInputLayoutCache.updateVertexOffsetsForPointSpritesEmulation(
- mRenderer, mCurrentAttributes, startVertex, emulatedInstanceId);
-}
-
-gl::Error StateManager11::generateSwizzle(const gl::Context *context, gl::Texture *texture)
-{
- if (!texture)
- {
- return gl::NoError();
- }
-
- TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture);
- ASSERT(textureD3D);
-
- TextureStorage *texStorage = nullptr;
- ANGLE_TRY(textureD3D->getNativeTexture(context, &texStorage));
-
- if (texStorage)
- {
- TextureStorage11 *storage11 = GetAs<TextureStorage11>(texStorage);
- const gl::TextureState &textureState = texture->getTextureState();
- ANGLE_TRY(storage11->generateSwizzles(context, textureState.getSwizzleState()));
- }
-
- return gl::NoError();
-}
-
-gl::Error StateManager11::generateSwizzlesForShader(const gl::Context *context,
- gl::SamplerType type)
-{
- const auto &glState = context->getGLState();
- ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
-
- unsigned int samplerRange = programD3D->getUsedSamplerRange(type);
-
- for (unsigned int i = 0; i < samplerRange; i++)
- {
- GLenum textureType = programD3D->getSamplerTextureType(type, i);
- GLint textureUnit = programD3D->getSamplerMapping(type, i, context->getCaps());
- if (textureUnit != -1)
- {
- gl::Texture *texture = glState.getSamplerTexture(textureUnit, textureType);
- ASSERT(texture);
- if (texture->getTextureState().swizzleRequired())
- {
- ANGLE_TRY(generateSwizzle(context, texture));
- }
- }
- }
-
- return gl::NoError();
-}
-
-gl::Error StateManager11::generateSwizzles(const gl::Context *context)
-{
- ANGLE_TRY(generateSwizzlesForShader(context, gl::SAMPLER_VERTEX));
- ANGLE_TRY(generateSwizzlesForShader(context, gl::SAMPLER_PIXEL));
- return gl::NoError();
-}
-
-gl::Error StateManager11::applyUniforms(ProgramD3D *programD3D)
-{
- UniformStorage11 *vertexUniformStorage =
- GetAs<UniformStorage11>(&programD3D->getVertexUniformStorage());
- UniformStorage11 *fragmentUniformStorage =
- GetAs<UniformStorage11>(&programD3D->getFragmentUniformStorage());
- ASSERT(vertexUniformStorage);
- ASSERT(fragmentUniformStorage);
-
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- const d3d11::Buffer *vertexConstantBuffer = nullptr;
- ANGLE_TRY(vertexUniformStorage->getConstantBuffer(mRenderer, &vertexConstantBuffer));
- const d3d11::Buffer *pixelConstantBuffer = nullptr;
- ANGLE_TRY(fragmentUniformStorage->getConstantBuffer(mRenderer, &pixelConstantBuffer));
-
- if (vertexUniformStorage->size() > 0 && programD3D->areVertexUniformsDirty())
- {
- UpdateUniformBuffer(deviceContext, vertexUniformStorage, vertexConstantBuffer);
- }
-
- if (fragmentUniformStorage->size() > 0 && programD3D->areFragmentUniformsDirty())
- {
- UpdateUniformBuffer(deviceContext, fragmentUniformStorage, pixelConstantBuffer);
- }
-
- unsigned int slot = d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK;
-
- if (mCurrentConstantBufferVS[slot] != vertexConstantBuffer->getSerial())
- {
- deviceContext->VSSetConstantBuffers(slot, 1, vertexConstantBuffer->getPointer());
- mCurrentConstantBufferVS[slot] = vertexConstantBuffer->getSerial();
- mCurrentConstantBufferVSOffset[slot] = 0;
- mCurrentConstantBufferVSSize[slot] = 0;
- }
-
- if (mCurrentConstantBufferPS[slot] != pixelConstantBuffer->getSerial())
- {
- deviceContext->PSSetConstantBuffers(slot, 1, pixelConstantBuffer->getPointer());
- mCurrentConstantBufferPS[slot] = pixelConstantBuffer->getSerial();
- mCurrentConstantBufferPSOffset[slot] = 0;
- mCurrentConstantBufferPSSize[slot] = 0;
- }
-
- programD3D->markUniformsClean();
-
- return gl::NoError();
-}
-
-gl::Error StateManager11::applyDriverUniforms(const ProgramD3D &programD3D)
-{
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- if (!mDriverConstantBufferVS.valid())
- {
- size_t requiredSize = mShaderConstants.getRequiredBufferSize(gl::SAMPLER_VERTEX);
-
- D3D11_BUFFER_DESC constantBufferDescription = {0};
- d3d11::InitConstantBufferDesc(&constantBufferDescription, requiredSize);
- ANGLE_TRY(mRenderer->allocateResource(constantBufferDescription, &mDriverConstantBufferVS));
-
- ID3D11Buffer *driverVSConstants = mDriverConstantBufferVS.get();
- deviceContext->VSSetConstantBuffers(d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DRIVER, 1,
- &driverVSConstants);
- }
-
- if (!mDriverConstantBufferPS.valid())
- {
- size_t requiredSize = mShaderConstants.getRequiredBufferSize(gl::SAMPLER_PIXEL);
-
- D3D11_BUFFER_DESC constantBufferDescription = {0};
- d3d11::InitConstantBufferDesc(&constantBufferDescription, requiredSize);
- ANGLE_TRY(mRenderer->allocateResource(constantBufferDescription, &mDriverConstantBufferPS));
-
- ID3D11Buffer *driverVSConstants = mDriverConstantBufferPS.get();
- deviceContext->PSSetConstantBuffers(d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DRIVER, 1,
- &driverVSConstants);
- }
-
- // Sampler metadata and driver constants need to coexist in the same constant buffer to conserve
- // constant buffer slots. We update both in the constant buffer if needed.
- ANGLE_TRY(mShaderConstants.updateBuffer(deviceContext, gl::SAMPLER_VERTEX, programD3D,
- mDriverConstantBufferVS));
- ANGLE_TRY(mShaderConstants.updateBuffer(deviceContext, gl::SAMPLER_PIXEL, programD3D,
- mDriverConstantBufferPS));
-
- // needed for the point sprite geometry shader
- // GSSetConstantBuffers triggers device removal on 9_3, so we should only call it for ES3.
- if (mRenderer->isES3Capable())
- {
- if (mCurrentGeometryConstantBuffer != mDriverConstantBufferPS.getSerial())
- {
- ASSERT(mDriverConstantBufferPS.valid());
- deviceContext->GSSetConstantBuffers(0, 1, mDriverConstantBufferPS.getPointer());
- mCurrentGeometryConstantBuffer = mDriverConstantBufferPS.getSerial();
- }
- }
-
- return gl::NoError();
-}
-
-gl::Error StateManager11::applyComputeUniforms(ProgramD3D *programD3D)
-{
- UniformStorage11 *computeUniformStorage =
- GetAs<UniformStorage11>(&programD3D->getComputeUniformStorage());
- ASSERT(computeUniformStorage);
-
- const d3d11::Buffer *constantBuffer = nullptr;
- ANGLE_TRY(computeUniformStorage->getConstantBuffer(mRenderer, &constantBuffer));
-
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- if (computeUniformStorage->size() > 0 && programD3D->areComputeUniformsDirty())
- {
- UpdateUniformBuffer(deviceContext, computeUniformStorage, constantBuffer);
- programD3D->markUniformsClean();
- }
-
- if (mCurrentComputeConstantBuffer != constantBuffer->getSerial())
- {
- deviceContext->CSSetConstantBuffers(
- d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK, 1,
- constantBuffer->getPointer());
- mCurrentComputeConstantBuffer = constantBuffer->getSerial();
- }
-
- if (!mDriverConstantBufferCS.valid())
- {
- size_t requiredSize = mShaderConstants.getRequiredBufferSize(gl::SAMPLER_COMPUTE);
-
- D3D11_BUFFER_DESC constantBufferDescription = {0};
- d3d11::InitConstantBufferDesc(&constantBufferDescription, requiredSize);
- ANGLE_TRY(mRenderer->allocateResource(constantBufferDescription, &mDriverConstantBufferCS));
- ID3D11Buffer *buffer = mDriverConstantBufferCS.get();
- deviceContext->CSSetConstantBuffers(d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DRIVER, 1,
- &buffer);
- }
-
- ANGLE_TRY(mShaderConstants.updateBuffer(deviceContext, gl::SAMPLER_COMPUTE, *programD3D,
- mDriverConstantBufferCS));
-
- return gl::NoError();
-}
-
-gl::Error StateManager11::syncUniformBuffers(const gl::Context *context, ProgramD3D *programD3D)
-{
- unsigned int reservedVertex = mRenderer->getReservedVertexUniformBuffers();
- unsigned int reservedFragment = mRenderer->getReservedFragmentUniformBuffers();
-
- programD3D->updateUniformBufferCache(context->getCaps(), reservedVertex, reservedFragment);
-
- const auto &vertexUniformBuffers = programD3D->getVertexUniformBufferCache();
- const auto &fragmentUniformBuffers = programD3D->getFragmentUniformBufferCache();
- const auto &glState = context->getGLState();
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- ID3D11DeviceContext1 *deviceContext1 = mRenderer->getDeviceContext1IfSupported();
-
- for (size_t bufferIndex = 0; bufferIndex < vertexUniformBuffers.size(); bufferIndex++)
- {
- GLint binding = vertexUniformBuffers[bufferIndex];
-
- if (binding == -1)
- {
- continue;
- }
-
- const auto &uniformBuffer = glState.getIndexedUniformBuffer(binding);
- GLintptr uniformBufferOffset = uniformBuffer.getOffset();
- GLsizeiptr uniformBufferSize = uniformBuffer.getSize();
-
- if (uniformBuffer.get() == nullptr)
- {
- continue;
- }
-
- Buffer11 *bufferStorage = GetImplAs<Buffer11>(uniformBuffer.get());
- const d3d11::Buffer *constantBuffer = nullptr;
- UINT firstConstant = 0;
- UINT numConstants = 0;
-
- ANGLE_TRY(bufferStorage->getConstantBufferRange(context, uniformBufferOffset,
- uniformBufferSize, &constantBuffer,
- &firstConstant, &numConstants));
-
- ASSERT(constantBuffer);
-
- if (mCurrentConstantBufferVS[bufferIndex] == constantBuffer->getSerial() &&
- mCurrentConstantBufferVSOffset[bufferIndex] == uniformBufferOffset &&
- mCurrentConstantBufferVSSize[bufferIndex] == uniformBufferSize)
- {
- continue;
- }
-
- unsigned int appliedIndex = reservedVertex + static_cast<unsigned int>(bufferIndex);
-
- if (firstConstant != 0 && uniformBufferSize != 0)
- {
- ASSERT(numConstants != 0);
- deviceContext1->VSSetConstantBuffers1(appliedIndex, 1, constantBuffer->getPointer(),
- &firstConstant, &numConstants);
- }
- else
- {
- deviceContext->VSSetConstantBuffers(appliedIndex, 1, constantBuffer->getPointer());
- }
-
- mCurrentConstantBufferVS[appliedIndex] = constantBuffer->getSerial();
- mCurrentConstantBufferVSOffset[appliedIndex] = uniformBufferOffset;
- mCurrentConstantBufferVSSize[appliedIndex] = uniformBufferSize;
- }
-
- for (size_t bufferIndex = 0; bufferIndex < fragmentUniformBuffers.size(); bufferIndex++)
- {
- GLint binding = fragmentUniformBuffers[bufferIndex];
-
- if (binding == -1)
- {
- continue;
- }
-
- const auto &uniformBuffer = glState.getIndexedUniformBuffer(binding);
- GLintptr uniformBufferOffset = uniformBuffer.getOffset();
- GLsizeiptr uniformBufferSize = uniformBuffer.getSize();
-
- if (uniformBuffer.get() == nullptr)
- {
- continue;
- }
-
- Buffer11 *bufferStorage = GetImplAs<Buffer11>(uniformBuffer.get());
- const d3d11::Buffer *constantBuffer = nullptr;
- UINT firstConstant = 0;
- UINT numConstants = 0;
-
- ANGLE_TRY(bufferStorage->getConstantBufferRange(context, uniformBufferOffset,
- uniformBufferSize, &constantBuffer,
- &firstConstant, &numConstants));
-
- ASSERT(constantBuffer);
-
- if (mCurrentConstantBufferPS[bufferIndex] == constantBuffer->getSerial() &&
- mCurrentConstantBufferPSOffset[bufferIndex] == uniformBufferOffset &&
- mCurrentConstantBufferPSSize[bufferIndex] == uniformBufferSize)
- {
- continue;
- }
-
- unsigned int appliedIndex = reservedFragment + static_cast<unsigned int>(bufferIndex);
-
- if (firstConstant != 0 && uniformBufferSize != 0)
- {
- deviceContext1->PSSetConstantBuffers1(appliedIndex, 1, constantBuffer->getPointer(),
- &firstConstant, &numConstants);
- }
- else
- {
- deviceContext->PSSetConstantBuffers(appliedIndex, 1, constantBuffer->getPointer());
- }
-
- mCurrentConstantBufferPS[appliedIndex] = constantBuffer->getSerial();
- mCurrentConstantBufferPSOffset[appliedIndex] = uniformBufferOffset;
- mCurrentConstantBufferPSSize[appliedIndex] = uniformBufferSize;
- }
-
- return gl::NoError();
-}
-
-gl::Error StateManager11::syncTransformFeedbackBuffers(const gl::Context *context)
-{
- const auto &glState = context->getGLState();
-
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- // If transform feedback is not active, unbind all buffers
- if (!glState.isTransformFeedbackActiveUnpaused())
- {
- if (mAppliedTFSerial != mEmptySerial)
- {
- deviceContext->SOSetTargets(0, nullptr, nullptr);
- mAppliedTFSerial = mEmptySerial;
- }
- return gl::NoError();
- }
-
- gl::TransformFeedback *transformFeedback = glState.getCurrentTransformFeedback();
- TransformFeedback11 *tf11 = GetImplAs<TransformFeedback11>(transformFeedback);
- if (mAppliedTFSerial == tf11->getSerial() && !tf11->isDirty())
- {
- return gl::NoError();
- }
-
- const std::vector<ID3D11Buffer *> *soBuffers = nullptr;
- ANGLE_TRY_RESULT(tf11->getSOBuffers(context), soBuffers);
- const std::vector<UINT> &soOffsets = tf11->getSOBufferOffsets();
-
- deviceContext->SOSetTargets(tf11->getNumSOBuffers(), soBuffers->data(), soOffsets.data());
-
- mAppliedTFSerial = tf11->getSerial();
- tf11->onApply();
-
- return gl::NoError();
-}
-
-// DrawCallVertexParams implementation.
-DrawCallVertexParams::DrawCallVertexParams(GLint firstVertex,
- GLsizei vertexCount,
- GLsizei instances)
- : mHasIndexRange(nullptr),
- mFirstVertex(firstVertex),
- mVertexCount(vertexCount),
- mInstances(instances),
- mBaseVertex(0)
-{
-}
-
-// Use when in a drawElements call.
-DrawCallVertexParams::DrawCallVertexParams(bool firstVertexDefinitelyZero,
- const gl::HasIndexRange &hasIndexRange,
- GLint baseVertex,
- GLsizei instances)
- : mHasIndexRange(&hasIndexRange),
- mFirstVertex(),
- mVertexCount(0),
- mInstances(instances),
- mBaseVertex(baseVertex)
-{
- if (firstVertexDefinitelyZero)
- {
- mFirstVertex = baseVertex;
- }
-}
-
-GLint DrawCallVertexParams::firstVertex() const
-{
- if (!mFirstVertex.valid())
- {
- ensureResolved();
- ASSERT(mFirstVertex.valid());
- }
- return mFirstVertex.value();
-}
-
-GLsizei DrawCallVertexParams::vertexCount() const
-{
- ensureResolved();
- return mVertexCount;
-}
-
-GLsizei DrawCallVertexParams::instances() const
-{
- return mInstances;
-}
-
-void DrawCallVertexParams::ensureResolved() const
-{
- if (mHasIndexRange)
- {
- ASSERT(!mFirstVertex.valid() || mFirstVertex == mBaseVertex);
-
- // Resolve the index range now if we need to.
- const auto &indexRange = mHasIndexRange->getIndexRange().value();
- mFirstVertex = mBaseVertex + static_cast<GLint>(indexRange.start);
- mVertexCount = static_cast<GLsizei>(indexRange.vertexCount());
- mHasIndexRange = nullptr;
- }
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.h
deleted file mode 100644
index e48bc83a22..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.h
+++ /dev/null
@@ -1,557 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// StateManager11.h: Defines a class for caching D3D11 state
-
-#ifndef LIBANGLE_RENDERER_D3D11_STATEMANAGER11_H_
-#define LIBANGLE_RENDERER_D3D11_STATEMANAGER11_H_
-
-#include <array>
-
-#include "libANGLE/ContextState.h"
-#include "libANGLE/State.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/renderer/d3d/IndexDataManager.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-#include "libANGLE/renderer/d3d/d3d11/InputLayoutCache.h"
-#include "libANGLE/renderer/d3d/d3d11/Query11.h"
-#include "libANGLE/renderer/d3d/d3d11/RenderStateCache.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-
-namespace rx
-{
-
-struct RenderTargetDesc;
-struct Renderer11DeviceCaps;
-
-class ShaderConstants11 : angle::NonCopyable
-{
- public:
- ShaderConstants11();
- ~ShaderConstants11();
-
- void init(const gl::Caps &caps);
- size_t getRequiredBufferSize(gl::SamplerType samplerType) const;
- void markDirty();
-
- void setComputeWorkGroups(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ);
- void setMultiviewWriteToViewportIndex(GLfloat index);
- void onViewportChange(const gl::Rectangle &glViewport,
- const D3D11_VIEWPORT &dxViewport,
- bool is9_3,
- bool presentPathFast);
- void onSamplerChange(gl::SamplerType samplerType,
- unsigned int samplerIndex,
- const gl::Texture &texture);
-
- gl::Error updateBuffer(ID3D11DeviceContext *deviceContext,
- gl::SamplerType samplerType,
- const ProgramD3D &programD3D,
- const d3d11::Buffer &driverConstantBuffer);
-
- private:
- struct Vertex
- {
- Vertex()
- : depthRange{.0f},
- viewAdjust{.0f},
- viewCoords{.0f},
- viewScale{.0f},
- multiviewWriteToViewportIndex{.0f},
- padding{.0f}
- {
- }
-
- float depthRange[4];
- float viewAdjust[4];
- float viewCoords[4];
- float viewScale[2];
- // multiviewWriteToViewportIndex is used to select either the side-by-side or layered
- // code-path in the GS. It's value, if set, is either 0.0f or 1.0f. The value is updated
- // whenever a multi-view draw framebuffer is made active.
- float multiviewWriteToViewportIndex;
-
- // Added here to manually pad the struct.
- float padding;
- };
-
- struct Pixel
- {
- Pixel()
- : depthRange{.0f},
- viewCoords{.0f},
- depthFront{.0f},
- viewScale{.0f},
- multiviewWriteToViewportIndex(0),
- padding(0)
- {
- }
-
- float depthRange[4];
- float viewCoords[4];
- float depthFront[4];
- float viewScale[2];
- // multiviewWriteToViewportIndex is used to select either the side-by-side or layered
- // code-path in the GS. It's value, if set, is either 0.0f or 1.0f. The value is updated
- // whenever a multi-view draw framebuffer is made active.
- float multiviewWriteToViewportIndex;
-
- // Added here to manually pad the struct.
- float padding;
- };
-
- struct Compute
- {
- Compute() : numWorkGroups{0u}, padding(0u) {}
- unsigned int numWorkGroups[3];
- unsigned int padding; // This just pads the struct to 16 bytes
- };
-
- struct SamplerMetadata
- {
- SamplerMetadata() : baseLevel(0), internalFormatBits(0), wrapModes(0), padding(0) {}
-
- int baseLevel;
- int internalFormatBits;
- int wrapModes;
- int padding; // This just pads the struct to 16 bytes
- };
-
- static_assert(sizeof(SamplerMetadata) == 16u,
- "Sampler metadata struct must be one 4-vec / 16 bytes.");
-
- // Return true if dirty.
- bool updateSamplerMetadata(SamplerMetadata *data, const gl::Texture &texture);
-
- Vertex mVertex;
- bool mVertexDirty;
- Pixel mPixel;
- bool mPixelDirty;
- Compute mCompute;
- bool mComputeDirty;
-
- std::vector<SamplerMetadata> mSamplerMetadataVS;
- bool mSamplerMetadataVSDirty;
- std::vector<SamplerMetadata> mSamplerMetadataPS;
- bool mSamplerMetadataPSDirty;
- std::vector<SamplerMetadata> mSamplerMetadataCS;
- bool mSamplerMetadataCSDirty;
-};
-
-class DrawCallVertexParams final : angle::NonCopyable
-{
- public:
- // Use when in a drawArrays call.
- DrawCallVertexParams(GLint firstVertex, GLsizei vertexCount, GLsizei instances);
-
- // Use when in a drawElements call.
- DrawCallVertexParams(bool firstVertexDefinitelyZero,
- const gl::HasIndexRange &hasIndexRange,
- GLint baseVertex,
- GLsizei instances);
-
- // It should be possible to also use an overload to handle the 'slow' indirect draw path.
- // TODO(jmadill): Indirect draw slow path overload.
-
- GLint firstVertex() const;
- GLsizei vertexCount() const;
- GLsizei instances() const;
-
- private:
- void ensureResolved() const;
-
- mutable const gl::HasIndexRange *mHasIndexRange;
- mutable Optional<GLint> mFirstVertex;
- mutable GLsizei mVertexCount;
- GLsizei mInstances;
- GLint mBaseVertex;
-};
-
-class StateManager11 final : angle::NonCopyable
-{
- public:
- StateManager11(Renderer11 *renderer);
- ~StateManager11();
-
- gl::Error initialize(const gl::Caps &caps, const gl::Extensions &extensions);
- void deinitialize();
-
- void syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits);
-
- gl::Error updateStateForCompute(const gl::Context *context,
- GLuint numGroupsX,
- GLuint numGroupsY,
- GLuint numGroupsZ);
-
- void updateStencilSizeIfChanged(bool depthStencilInitialized, unsigned int stencilSize);
-
- // These invalidations methods are called externally.
-
- // Called from TextureStorage11.
- void invalidateBoundViews();
-
- // Called from VertexArray11::updateVertexAttribStorage.
- void invalidateCurrentValueAttrib(size_t attribIndex);
-
- // Checks are done on a framebuffer state change to trigger other state changes.
- // The Context is allowed to be nullptr for these methods, when called in EGL init code.
- void invalidateRenderTarget();
-
- // Called by instanced point sprite emulation.
- void invalidateVertexBuffer();
-
- // Called by Framebuffer11::syncState for the default sized viewport.
- void invalidateViewport(const gl::Context *context);
-
- // Called by TextureStorage11::markLevelDirty.
- void invalidateSwizzles();
-
- // Called by the Framebuffer11 and VertexArray11.
- void invalidateShaders();
-
- // Called by VertexArray11 to trigger attribute translation.
- void invalidateVertexAttributeTranslation();
-
- void setRenderTarget(ID3D11RenderTargetView *rtv, ID3D11DepthStencilView *dsv);
- void setRenderTargets(ID3D11RenderTargetView **rtvs, UINT numRtvs, ID3D11DepthStencilView *dsv);
-
- void onBeginQuery(Query11 *query);
- void onDeleteQueryObject(Query11 *query);
- gl::Error onMakeCurrent(const gl::Context *context);
-
- void setInputLayout(const d3d11::InputLayout *inputLayout);
-
- // TODO(jmadill): Migrate to d3d11::Buffer.
- bool queueVertexBufferChange(size_t bufferIndex,
- ID3D11Buffer *buffer,
- UINT stride,
- UINT offset);
- bool queueVertexOffsetChange(size_t bufferIndex, UINT offsetOnly);
- void applyVertexBufferChanges();
-
- void setSingleVertexBuffer(const d3d11::Buffer *buffer, UINT stride, UINT offset);
-
- gl::Error updateState(const gl::Context *context, GLenum drawMode);
-
- void setShaderResourceShared(gl::SamplerType shaderType,
- UINT resourceSlot,
- const d3d11::SharedSRV *srv);
- void setShaderResource(gl::SamplerType shaderType,
- UINT resourceSlot,
- const d3d11::ShaderResourceView *srv);
- void setPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY primitiveTopology);
-
- void setDrawShaders(const d3d11::VertexShader *vertexShader,
- const d3d11::GeometryShader *geometryShader,
- const d3d11::PixelShader *pixelShader);
- void setVertexShader(const d3d11::VertexShader *shader);
- void setGeometryShader(const d3d11::GeometryShader *shader);
- void setPixelShader(const d3d11::PixelShader *shader);
- void setComputeShader(const d3d11::ComputeShader *shader);
- void setVertexConstantBuffer(unsigned int slot, const d3d11::Buffer *buffer);
- void setPixelConstantBuffer(unsigned int slot, const d3d11::Buffer *buffer);
- void setDepthStencilState(const d3d11::DepthStencilState *depthStencilState, UINT stencilRef);
- void setSimpleBlendState(const d3d11::BlendState *blendState);
- void setRasterizerState(const d3d11::RasterizerState *rasterizerState);
- void setSimpleViewport(const gl::Extents &viewportExtents);
- void setSimpleViewport(int width, int height);
- void setSimplePixelTextureAndSampler(const d3d11::SharedSRV &srv,
- const d3d11::SamplerState &samplerState);
- void setSimpleScissorRect(const gl::Rectangle &glRect);
- void setScissorRectD3D(const D3D11_RECT &d3dRect);
-
- // Not handled by an internal dirty bit because of the extra draw parameters.
- gl::Error applyVertexBuffer(const gl::Context *context,
- GLenum mode,
- const DrawCallVertexParams &vertexParams,
- bool isIndexedRendering);
-
- gl::Error applyIndexBuffer(const gl::Context *context,
- const void *indices,
- GLsizei count,
- GLenum type,
- const gl::HasIndexRange &lazyIndexRange,
- bool usePrimitiveRestartWorkaround);
-
- void setIndexBuffer(ID3D11Buffer *buffer, DXGI_FORMAT indexFormat, unsigned int offset);
-
- gl::Error updateVertexOffsetsForPointSpritesEmulation(GLint startVertex,
- GLsizei emulatedInstanceId);
-
- // TODO(jmadill): Should be private.
- gl::Error applyComputeUniforms(ProgramD3D *programD3D);
-
- // Only used in testing.
- InputLayoutCache *getInputLayoutCache() { return &mInputLayoutCache; }
-
- private:
- template <typename SRVType>
- void setShaderResourceInternal(gl::SamplerType shaderType,
- UINT resourceSlot,
- const SRVType *srv);
-
- bool unsetConflictingView(ID3D11View *view);
- bool unsetConflictingSRVs(gl::SamplerType shaderType,
- uintptr_t resource,
- const gl::ImageIndex *index);
- void unsetConflictingAttachmentResources(const gl::FramebufferAttachment *attachment,
- ID3D11Resource *resource);
-
- gl::Error syncBlendState(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::BlendState &blendState,
- const gl::ColorF &blendColor,
- unsigned int sampleMask);
-
- gl::Error syncDepthStencilState(const gl::State &glState);
-
- gl::Error syncRasterizerState(const gl::Context *context, bool pointDrawMode);
-
- void syncScissorRectangle(const gl::Rectangle &scissor, bool enabled);
-
- void syncViewport(const gl::Context *context);
-
- void checkPresentPath(const gl::Context *context);
-
- gl::Error syncFramebuffer(const gl::Context *context, gl::Framebuffer *framebuffer);
- gl::Error syncProgram(const gl::Context *context, GLenum drawMode);
-
- gl::Error syncTextures(const gl::Context *context);
- gl::Error applyTextures(const gl::Context *context, gl::SamplerType shaderType);
-
- gl::Error setSamplerState(const gl::Context *context,
- gl::SamplerType type,
- int index,
- gl::Texture *texture,
- const gl::SamplerState &sampler);
- gl::Error setTexture(const gl::Context *context,
- gl::SamplerType type,
- int index,
- gl::Texture *texture);
-
- // Faster than calling setTexture a jillion times
- gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd);
- void handleMultiviewDrawFramebufferChange(const gl::Context *context);
-
- gl::Error syncCurrentValueAttribs(const gl::State &glState);
-
- gl::Error generateSwizzle(const gl::Context *context, gl::Texture *texture);
- gl::Error generateSwizzlesForShader(const gl::Context *context, gl::SamplerType type);
- gl::Error generateSwizzles(const gl::Context *context);
-
- gl::Error applyDriverUniforms(const ProgramD3D &programD3D);
- gl::Error applyUniforms(ProgramD3D *programD3D);
-
- gl::Error syncUniformBuffers(const gl::Context *context, ProgramD3D *programD3D);
- gl::Error syncTransformFeedbackBuffers(const gl::Context *context);
-
- // These are currently only called internally.
- void invalidateTexturesAndSamplers();
- void invalidateDriverUniforms();
- void invalidateProgramUniforms();
- void invalidateProgramUniformBuffers();
- void invalidateConstantBuffer(unsigned int slot);
-
- // Called by the Framebuffer11 directly.
- void processFramebufferInvalidation(const gl::Context *context);
-
- bool syncIndexBuffer(ID3D11Buffer *buffer, DXGI_FORMAT indexFormat, unsigned int offset);
-
- enum DirtyBitType
- {
- DIRTY_BIT_RENDER_TARGET,
- DIRTY_BIT_VIEWPORT_STATE,
- DIRTY_BIT_SCISSOR_STATE,
- DIRTY_BIT_RASTERIZER_STATE,
- DIRTY_BIT_BLEND_STATE,
- DIRTY_BIT_DEPTH_STENCIL_STATE,
- DIRTY_BIT_TEXTURE_AND_SAMPLER_STATE,
- DIRTY_BIT_PROGRAM_UNIFORMS,
- DIRTY_BIT_DRIVER_UNIFORMS,
- DIRTY_BIT_PROGRAM_UNIFORM_BUFFERS,
- DIRTY_BIT_SHADERS,
- DIRTY_BIT_CURRENT_VALUE_ATTRIBS,
- DIRTY_BIT_INVALID,
- DIRTY_BIT_MAX = DIRTY_BIT_INVALID,
- };
-
- using DirtyBits = angle::BitSet<DIRTY_BIT_MAX>;
-
- Renderer11 *mRenderer;
-
- // Internal dirty bits.
- DirtyBits mInternalDirtyBits;
-
- // Blend State
- gl::BlendState mCurBlendState;
- gl::ColorF mCurBlendColor;
- unsigned int mCurSampleMask;
-
- // Currently applied depth stencil state
- gl::DepthStencilState mCurDepthStencilState;
- int mCurStencilRef;
- int mCurStencilBackRef;
- unsigned int mCurStencilSize;
- Optional<bool> mCurDisableDepth;
- Optional<bool> mCurDisableStencil;
-
- // Currently applied rasterizer state
- gl::RasterizerState mCurRasterState;
-
- // Currently applied scissor rectangle state
- bool mCurScissorEnabled;
- gl::Rectangle mCurScissorRect;
-
- // Currently applied viewport state
- gl::Rectangle mCurViewport;
- 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;
-
- // Render target variables
- gl::Extents mViewportBounds;
- bool mRenderTargetIsDirty;
-
- // EGL_ANGLE_experimental_present_path variables
- bool mCurPresentPathFastEnabled;
- int mCurPresentPathFastColorBufferHeight;
-
- // Queries that are currently active in this state
- std::set<Query11 *> mCurrentQueries;
-
- // Currently applied textures
- struct SRVRecord
- {
- uintptr_t srv;
- uintptr_t resource;
- D3D11_SHADER_RESOURCE_VIEW_DESC desc;
- };
-
- // A cache of current SRVs that also tracks the highest 'used' (non-NULL) SRV
- // We might want to investigate a more robust approach that is also fast when there's
- // a large gap between used SRVs (e.g. if SRV 0 and 7 are non-NULL, this approach will
- // waste time on SRVs 1-6.)
- class SRVCache : angle::NonCopyable
- {
- public:
- SRVCache();
- ~SRVCache();
-
- void initialize(size_t size) { mCurrentSRVs.resize(size); }
-
- size_t size() const { return mCurrentSRVs.size(); }
- size_t highestUsed() const { return mHighestUsedSRV; }
-
- const SRVRecord &operator[](size_t index) const { return mCurrentSRVs[index]; }
- void clear();
- void update(size_t resourceIndex, ID3D11ShaderResourceView *srv);
-
- private:
- std::vector<SRVRecord> mCurrentSRVs;
- size_t mHighestUsedSRV;
- };
-
- SRVCache mCurVertexSRVs;
- SRVCache mCurPixelSRVs;
-
- // A block of NULL pointers, cached so we don't re-allocate every draw call
- std::vector<ID3D11ShaderResourceView *> mNullSRVs;
-
- // Current translations of "Current-Value" data - owned by Context, not VertexArray.
- gl::AttributesMask mDirtyCurrentValueAttribs;
- std::vector<TranslatedAttribute> mCurrentValueAttribs;
-
- // Current applied input layout.
- ResourceSerial mCurrentInputLayout;
- bool mInputLayoutIsDirty;
- bool mVertexAttribsNeedTranslation;
-
- // Current applied vertex states.
- // TODO(jmadill): Figure out how to use ResourceSerial here.
- std::array<ID3D11Buffer *, gl::MAX_VERTEX_ATTRIBS> mCurrentVertexBuffers;
- std::array<UINT, gl::MAX_VERTEX_ATTRIBS> mCurrentVertexStrides;
- std::array<UINT, gl::MAX_VERTEX_ATTRIBS> mCurrentVertexOffsets;
- gl::RangeUI mDirtyVertexBufferRange;
-
- // Currently applied primitive topology
- D3D11_PRIMITIVE_TOPOLOGY mCurrentPrimitiveTopology;
-
- // Currently applied shaders
- ResourceSerial mAppliedVertexShader;
- ResourceSerial mAppliedGeometryShader;
- ResourceSerial mAppliedPixelShader;
- ResourceSerial mAppliedComputeShader;
-
- // Currently applied sampler states
- std::vector<bool> mForceSetVertexSamplerStates;
- std::vector<gl::SamplerState> mCurVertexSamplerStates;
-
- std::vector<bool> mForceSetPixelSamplerStates;
- std::vector<gl::SamplerState> mCurPixelSamplerStates;
-
- std::vector<bool> mForceSetComputeSamplerStates;
- std::vector<gl::SamplerState> mCurComputeSamplerStates;
-
- // Special dirty bit for swizzles. Since they use internal shaders, must be done in a pre-pass.
- bool mDirtySwizzles;
-
- // Currently applied index buffer
- ID3D11Buffer *mAppliedIB;
- DXGI_FORMAT mAppliedIBFormat;
- unsigned int mAppliedIBOffset;
- bool mIndexBufferIsDirty;
-
- // Vertex, index and input layouts
- VertexDataManager mVertexDataManager;
- IndexDataManager mIndexDataManager;
- InputLayoutCache mInputLayoutCache;
- std::vector<const TranslatedAttribute *> mCurrentAttributes;
- Optional<GLint> mLastFirstVertex;
-
- // ANGLE_multiview.
- bool mIsMultiviewEnabled;
-
- // Driver Constants.
- d3d11::Buffer mDriverConstantBufferVS;
- d3d11::Buffer mDriverConstantBufferPS;
- d3d11::Buffer mDriverConstantBufferCS;
-
- ResourceSerial mCurrentComputeConstantBuffer;
- ResourceSerial mCurrentGeometryConstantBuffer;
-
- template <typename T>
- using VertexConstantBufferArray =
- std::array<T, gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS>;
-
- VertexConstantBufferArray<ResourceSerial> mCurrentConstantBufferVS;
- VertexConstantBufferArray<GLintptr> mCurrentConstantBufferVSOffset;
- VertexConstantBufferArray<GLsizeiptr> mCurrentConstantBufferVSSize;
-
- template <typename T>
- using FragmentConstantBufferArray =
- std::array<T, gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS>;
-
- FragmentConstantBufferArray<ResourceSerial> mCurrentConstantBufferPS;
- FragmentConstantBufferArray<GLintptr> mCurrentConstantBufferPSOffset;
- FragmentConstantBufferArray<GLsizeiptr> mCurrentConstantBufferPSSize;
-
- // Currently applied transform feedback buffers
- Serial mAppliedTFSerial;
-
- Serial mEmptySerial;
-
- bool mIsTransformFeedbackCurrentlyActiveUnpaused;
-};
-
-} // namespace rx
-#endif // LIBANGLE_RENDERER_D3D11_STATEMANAGER11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.cpp
deleted file mode 100644
index 1981b5f7b2..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// StreamProducerNV12.cpp: Implements the stream producer for NV12 textures
-
-#include "libANGLE/renderer/d3d/d3d11/StreamProducerNV12.h"
-
-#include "common/utilities.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-
-namespace rx
-{
-
-StreamProducerNV12::StreamProducerNV12(Renderer11 *renderer)
- : mRenderer(renderer), mTexture(nullptr), mArraySlice(0), mTextureWidth(0), mTextureHeight(0)
-{
-}
-
-StreamProducerNV12::~StreamProducerNV12()
-{
- SafeRelease(mTexture);
-}
-
-egl::Error StreamProducerNV12::validateD3DNV12Texture(void *pointer) const
-{
- ID3D11Texture2D *textureD3D = static_cast<ID3D11Texture2D *>(pointer);
-
- // Check that the texture originated from our device
- ID3D11Device *device;
- textureD3D->GetDevice(&device);
- if (device != mRenderer->getDevice())
- {
- return egl::EglBadParameter() << "Texture not created on ANGLE D3D device";
- }
-
- // Get the description and validate it
- D3D11_TEXTURE2D_DESC desc;
- textureD3D->GetDesc(&desc);
- if (desc.Format != DXGI_FORMAT_NV12)
- {
- return egl::EglBadParameter() << "Texture format not DXGI_FORMAT_NV12";
- }
- if (desc.Width < 1 || desc.Height < 1)
- {
- return egl::EglBadParameter() << "Texture is of size 0";
- }
- if ((desc.Width % 2) != 0 || (desc.Height % 2) != 0)
- {
- return egl::EglBadParameter() << "Texture dimensions are not even";
- }
- return egl::NoError();
-}
-
-void StreamProducerNV12::postD3DNV12Texture(void *pointer, const egl::AttributeMap &attributes)
-{
- ASSERT(pointer != nullptr);
- ID3D11Texture2D *textureD3D = static_cast<ID3D11Texture2D *>(pointer);
-
- // Check that the texture originated from our device
- ID3D11Device *device;
- textureD3D->GetDevice(&device);
-
- // Get the description
- D3D11_TEXTURE2D_DESC desc;
- textureD3D->GetDesc(&desc);
-
- // Release the previous texture if there is one
- SafeRelease(mTexture);
-
- mTexture = textureD3D;
- mTexture->AddRef();
- mTextureWidth = desc.Width;
- mTextureHeight = desc.Height;
- mArraySlice = static_cast<UINT>(attributes.get(EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE, 0));
-}
-
-egl::Stream::GLTextureDescription StreamProducerNV12::getGLFrameDescription(int planeIndex)
-{
- // The UV plane of NV12 textures has half the width/height of the Y plane
- egl::Stream::GLTextureDescription desc;
- desc.width = (planeIndex == 0) ? mTextureWidth : (mTextureWidth / 2);
- desc.height = (planeIndex == 0) ? mTextureHeight : (mTextureHeight / 2);
- desc.internalFormat = (planeIndex == 0) ? GL_R8 : GL_RG8;
- desc.mipLevels = 0;
- return desc;
-}
-
-ID3D11Texture2D *StreamProducerNV12::getD3DTexture()
-{
- return mTexture;
-}
-
-UINT StreamProducerNV12::getArraySlice()
-{
- return mArraySlice;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.h
deleted file mode 100644
index 304c9dfe53..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.h
+++ /dev/null
@@ -1,44 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// StreamProducerNV12.h: Interface for a NV12 texture stream producer
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_STREAM11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_STREAM11_H_
-
-#include "libANGLE/renderer/StreamProducerImpl.h"
-
-namespace rx
-{
-class Renderer11;
-
-class StreamProducerNV12 : public StreamProducerImpl
-{
- public:
- StreamProducerNV12(Renderer11 *renderer);
- ~StreamProducerNV12() override;
-
- egl::Error validateD3DNV12Texture(void *pointer) const override;
- void postD3DNV12Texture(void *pointer, const egl::AttributeMap &attributes) override;
- egl::Stream::GLTextureDescription getGLFrameDescription(int planeIndex) override;
-
- // Gets a pointer to the internal D3D texture
- ID3D11Texture2D *getD3DTexture();
-
- // Gets the slice index for the D3D texture that the frame is in
- UINT getArraySlice();
-
- private:
- Renderer11 *mRenderer;
-
- ID3D11Texture2D *mTexture;
- UINT mArraySlice;
- UINT mTextureWidth;
- UINT mTextureHeight;
-};
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_STREAM11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp
deleted file mode 100644
index 9ece77ecbc..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp
+++ /dev/null
@@ -1,1075 +0,0 @@
-//
-// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// SwapChain11.cpp: Implements a back-end specific class for the D3D11 swap chain.
-
-#include "libANGLE/renderer/d3d/d3d11/SwapChain11.h"
-
-#include <EGL/eglext.h>
-
-#include "libANGLE/features.h"
-#include "libANGLE/renderer/d3d/d3d11/NativeWindow11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h"
-#include "third_party/trace_event/trace_event.h"
-
-// Precompiled shaders
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough2d11vs.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d11ps.h"
-#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dms11ps.h"
-
-#ifdef ANGLE_ENABLE_KEYEDMUTEX
-#define ANGLE_RESOURCE_SHARE_TYPE D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX
-#else
-#define ANGLE_RESOURCE_SHARE_TYPE D3D11_RESOURCE_MISC_SHARED
-#endif
-
-namespace rx
-{
-
-namespace
-{
-// To avoid overflow in QPC to Microseconds calculations, since we multiply
-// by kMicrosecondsPerSecond, then the QPC value should not exceed
-// (2^63 - 1) / 1E6. If it exceeds that threshold, we divide then multiply.
-static constexpr int64_t kQPCOverflowThreshold = 0x8637BD05AF7;
-static constexpr int64_t kMicrosecondsPerSecond = 1000000;
-
-bool NeedsOffscreenTexture(Renderer11 *renderer, NativeWindow11 *nativeWindow, EGLint orientation)
-{
- // We don't need an offscreen texture if either orientation = INVERT_Y,
- // or present path fast is enabled and we're not rendering onto an offscreen surface.
- return orientation != EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE &&
- !(renderer->presentPathFastEnabled() && nativeWindow->getNativeWindow());
-}
-} // anonymous namespace
-
-SwapChain11::SwapChain11(Renderer11 *renderer,
- NativeWindow11 *nativeWindow,
- HANDLE shareHandle,
- IUnknown *d3dTexture,
- GLenum backBufferFormat,
- GLenum depthBufferFormat,
- EGLint orientation,
- EGLint samples)
- : SwapChainD3D(shareHandle, d3dTexture, backBufferFormat, depthBufferFormat),
- mRenderer(renderer),
- mWidth(-1),
- mHeight(-1),
- mOrientation(orientation),
- mAppCreatedShareHandle(mShareHandle != nullptr),
- mSwapInterval(0),
- mPassThroughResourcesInit(false),
- mNativeWindow(nativeWindow),
- mFirstSwap(true),
- mSwapChain(nullptr),
- mSwapChain1(nullptr),
- mKeyedMutex(nullptr),
- mBackBufferTexture(),
- mBackBufferRTView(),
- mBackBufferSRView(),
- mNeedsOffscreenTexture(NeedsOffscreenTexture(renderer, nativeWindow, orientation)),
- mOffscreenTexture(),
- mOffscreenRTView(),
- mOffscreenSRView(),
- mNeedsOffscreenTextureCopy(false),
- mOffscreenTextureCopyForSRV(),
- mDepthStencilTexture(),
- mDepthStencilDSView(),
- mDepthStencilSRView(),
- mQuadVB(),
- mPassThroughSampler(),
- mPassThroughIL(),
- mPassThroughVS(),
- mPassThroughPS(),
- mPassThroughRS(),
- mColorRenderTarget(this, renderer, false),
- mDepthStencilRenderTarget(this, renderer, true),
- mEGLSamples(samples)
-{
- // Sanity check that if present path fast is active then we're using the default orientation
- ASSERT(!mRenderer->presentPathFastEnabled() || orientation == 0);
-
- // Get the performance counter
- LARGE_INTEGER counterFreqency = {};
- BOOL success = QueryPerformanceFrequency(&counterFreqency);
- ASSERT(success);
-
- mQPCFrequency = counterFreqency.QuadPart;
-}
-
-SwapChain11::~SwapChain11()
-{
- release();
-}
-
-void SwapChain11::release()
-{
- // TODO(jmadill): Should probably signal that the RenderTarget is dirty.
-
- SafeRelease(mSwapChain1);
- SafeRelease(mSwapChain);
- SafeRelease(mKeyedMutex);
- mBackBufferTexture.reset();
- mBackBufferRTView.reset();
- mBackBufferSRView.reset();
- mOffscreenTexture.reset();
- mOffscreenRTView.reset();
- mOffscreenSRView.reset();
- mDepthStencilTexture.reset();
- mDepthStencilDSView.reset();
- mDepthStencilSRView.reset();
- mQuadVB.reset();
- mPassThroughSampler.reset();
- mPassThroughIL.reset();
- mPassThroughVS.reset();
- mPassThroughPS.reset();
- mPassThroughRS.reset();
-
- if (!mAppCreatedShareHandle)
- {
- mShareHandle = nullptr;
- }
-}
-
-void SwapChain11::releaseOffscreenColorBuffer()
-{
- mOffscreenTexture.reset();
- mOffscreenRTView.reset();
- mOffscreenSRView.reset();
- mNeedsOffscreenTextureCopy = false;
- mOffscreenTextureCopyForSRV.reset();
-}
-
-void SwapChain11::releaseOffscreenDepthBuffer()
-{
- mDepthStencilTexture.reset();
- mDepthStencilDSView.reset();
- mDepthStencilSRView.reset();
-}
-
-EGLint SwapChain11::resetOffscreenBuffers(const gl::Context *context,
- int backbufferWidth,
- int backbufferHeight)
-{
- if (mNeedsOffscreenTexture)
- {
- EGLint result = resetOffscreenColorBuffer(context, backbufferWidth, backbufferHeight);
- if (result != EGL_SUCCESS)
- {
- return result;
- }
- }
-
- EGLint result = resetOffscreenDepthBuffer(backbufferWidth, backbufferHeight);
- if (result != EGL_SUCCESS)
- {
- return result;
- }
-
- mWidth = backbufferWidth;
- mHeight = backbufferHeight;
-
- return EGL_SUCCESS;
-}
-
-EGLint SwapChain11::resetOffscreenColorBuffer(const gl::Context *context,
- int backbufferWidth,
- int backbufferHeight)
-{
- ASSERT(mNeedsOffscreenTexture);
-
- TRACE_EVENT0("gpu.angle", "SwapChain11::resetOffscreenTexture");
- ID3D11Device *device = mRenderer->getDevice();
-
- ASSERT(device != nullptr);
-
- // D3D11 does not allow zero size textures
- ASSERT(backbufferWidth >= 1);
- ASSERT(backbufferHeight >= 1);
-
- // Preserve the render target content
- TextureHelper11 previousOffscreenTexture(std::move(mOffscreenTexture));
- const int previousWidth = mWidth;
- const int previousHeight = mHeight;
-
- releaseOffscreenColorBuffer();
-
- const d3d11::Format &backbufferFormatInfo =
- d3d11::Format::Get(mOffscreenRenderTargetFormat, mRenderer->getRenderer11DeviceCaps());
- D3D11_TEXTURE2D_DESC offscreenTextureDesc = {0};
-
- // If the app passed in a share handle or D3D texture, open the resource
- // See EGL_ANGLE_d3d_share_handle_client_buffer and EGL_ANGLE_d3d_texture_client_buffer
- if (mAppCreatedShareHandle || mD3DTexture != nullptr)
- {
- if (mAppCreatedShareHandle)
- {
- ID3D11Resource *tempResource11;
- HRESULT result = device->OpenSharedResource(mShareHandle, __uuidof(ID3D11Resource),
- (void **)&tempResource11);
- ASSERT(SUCCEEDED(result));
-
- mOffscreenTexture.set(d3d11::DynamicCastComObject<ID3D11Texture2D>(tempResource11),
- backbufferFormatInfo);
- SafeRelease(tempResource11);
- }
- else if (mD3DTexture != nullptr)
- {
- mOffscreenTexture.set(d3d11::DynamicCastComObject<ID3D11Texture2D>(mD3DTexture),
- backbufferFormatInfo);
- }
- else
- {
- UNREACHABLE();
- }
- ASSERT(mOffscreenTexture.valid());
- mOffscreenTexture.getDesc(&offscreenTextureDesc);
-
- // Fail if the offscreen texture is not renderable.
- if ((offscreenTextureDesc.BindFlags & D3D11_BIND_RENDER_TARGET) == 0)
- {
- ERR() << "Could not use provided offscreen texture, texture not renderable.";
- release();
- return EGL_BAD_SURFACE;
- }
- }
- else
- {
- const bool useSharedResource =
- !mNativeWindow->getNativeWindow() && mRenderer->getShareHandleSupport();
-
- offscreenTextureDesc.Width = backbufferWidth;
- offscreenTextureDesc.Height = backbufferHeight;
- offscreenTextureDesc.Format = backbufferFormatInfo.texFormat;
- offscreenTextureDesc.MipLevels = 1;
- offscreenTextureDesc.ArraySize = 1;
- offscreenTextureDesc.SampleDesc.Count = getD3DSamples();
- offscreenTextureDesc.SampleDesc.Quality = 0;
- offscreenTextureDesc.Usage = D3D11_USAGE_DEFAULT;
- offscreenTextureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
- offscreenTextureDesc.CPUAccessFlags = 0;
- offscreenTextureDesc.MiscFlags = useSharedResource ? ANGLE_RESOURCE_SHARE_TYPE : 0;
-
- gl::Error err = mRenderer->allocateTexture(offscreenTextureDesc, backbufferFormatInfo,
- &mOffscreenTexture);
- if (err.isError())
- {
- ERR() << "Could not create offscreen texture, " << err;
- release();
- return EGL_BAD_ALLOC;
- }
-
- mOffscreenTexture.setDebugName("Offscreen back buffer texture");
-
- // EGL_ANGLE_surface_d3d_texture_2d_share_handle requires that we store a share handle for the client
- if (useSharedResource)
- {
- IDXGIResource *offscreenTextureResource = nullptr;
- HRESULT result = mOffscreenTexture.get()->QueryInterface(
- __uuidof(IDXGIResource), (void **)&offscreenTextureResource);
-
- // Fall back to no share handle on failure
- if (FAILED(result))
- {
- ERR() << "Could not query offscreen texture resource, " << gl::FmtHR(result);
- }
- else
- {
- result = offscreenTextureResource->GetSharedHandle(&mShareHandle);
- SafeRelease(offscreenTextureResource);
-
- if (FAILED(result))
- {
- mShareHandle = nullptr;
- ERR() << "Could not get offscreen texture shared handle, " << gl::FmtHR(result);
- }
- }
- }
- }
-
- // This may return null if the original texture was created without a keyed mutex.
- mKeyedMutex = d3d11::DynamicCastComObject<IDXGIKeyedMutex>(mOffscreenTexture.get());
-
- D3D11_RENDER_TARGET_VIEW_DESC offscreenRTVDesc;
- offscreenRTVDesc.Format = backbufferFormatInfo.rtvFormat;
- offscreenRTVDesc.ViewDimension =
- (mEGLSamples <= 1) ? D3D11_RTV_DIMENSION_TEXTURE2D : D3D11_RTV_DIMENSION_TEXTURE2DMS;
- offscreenRTVDesc.Texture2D.MipSlice = 0;
-
- gl::Error err =
- mRenderer->allocateResource(offscreenRTVDesc, mOffscreenTexture.get(), &mOffscreenRTView);
- ASSERT(!err.isError());
- mOffscreenRTView.setDebugName("Offscreen back buffer render target");
-
- D3D11_SHADER_RESOURCE_VIEW_DESC offscreenSRVDesc;
- offscreenSRVDesc.Format = backbufferFormatInfo.srvFormat;
- offscreenSRVDesc.ViewDimension =
- (mEGLSamples <= 1) ? D3D11_SRV_DIMENSION_TEXTURE2D : D3D11_SRV_DIMENSION_TEXTURE2DMS;
- offscreenSRVDesc.Texture2D.MostDetailedMip = 0;
- offscreenSRVDesc.Texture2D.MipLevels = static_cast<UINT>(-1);
-
- if (offscreenTextureDesc.BindFlags & D3D11_BIND_SHADER_RESOURCE)
- {
- err = mRenderer->allocateResource(offscreenSRVDesc, mOffscreenTexture.get(),
- &mOffscreenSRView);
- ASSERT(!err.isError());
- mOffscreenSRView.setDebugName("Offscreen back buffer shader resource");
- }
- else
- {
- // Special case for external textures that cannot support sampling. Since internally we
- // assume our SwapChain is always readable, we make a copy texture that is compatible.
- mNeedsOffscreenTextureCopy = true;
- }
-
- if (previousOffscreenTexture.valid())
- {
- D3D11_BOX sourceBox = {0};
- sourceBox.left = 0;
- sourceBox.right = std::min(previousWidth, backbufferWidth);
- sourceBox.top = std::max(previousHeight - backbufferHeight, 0);
- sourceBox.bottom = previousHeight;
- sourceBox.front = 0;
- sourceBox.back = 1;
-
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- const int yoffset = std::max(backbufferHeight - previousHeight, 0);
- deviceContext->CopySubresourceRegion(mOffscreenTexture.get(), 0, 0, yoffset, 0,
- previousOffscreenTexture.get(), 0, &sourceBox);
-
- if (mSwapChain)
- {
- swapRect(context, 0, 0, backbufferWidth, backbufferHeight);
- }
- }
-
- return EGL_SUCCESS;
-}
-
-EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbufferHeight)
-{
- releaseOffscreenDepthBuffer();
-
- if (mDepthBufferFormat != GL_NONE)
- {
- const d3d11::Format &depthBufferFormatInfo =
- d3d11::Format::Get(mDepthBufferFormat, mRenderer->getRenderer11DeviceCaps());
-
- D3D11_TEXTURE2D_DESC depthStencilTextureDesc;
- depthStencilTextureDesc.Width = backbufferWidth;
- depthStencilTextureDesc.Height = backbufferHeight;
- depthStencilTextureDesc.Format = depthBufferFormatInfo.texFormat;
- depthStencilTextureDesc.MipLevels = 1;
- depthStencilTextureDesc.ArraySize = 1;
- depthStencilTextureDesc.SampleDesc.Count = getD3DSamples();
- depthStencilTextureDesc.Usage = D3D11_USAGE_DEFAULT;
- depthStencilTextureDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
-
- // If there is a multisampled offscreen color texture, the offscreen depth-stencil texture
- // must also have the same quality value.
- if (mOffscreenTexture.valid() && getD3DSamples() > 1)
- {
- D3D11_TEXTURE2D_DESC offscreenTextureDesc = {0};
- mOffscreenTexture.getDesc(&offscreenTextureDesc);
- depthStencilTextureDesc.SampleDesc.Quality = offscreenTextureDesc.SampleDesc.Quality;
- }
- else
- {
- depthStencilTextureDesc.SampleDesc.Quality = 0;
- }
-
- // Only create an SRV if it is supported
- bool depthStencilSRV =
- depthBufferFormatInfo.srvFormat != DXGI_FORMAT_UNKNOWN &&
- (mRenderer->getRenderer11DeviceCaps().supportsMultisampledDepthStencilSRVs ||
- depthStencilTextureDesc.SampleDesc.Count <= 1);
- if (depthStencilSRV)
- {
- depthStencilTextureDesc.BindFlags |= D3D11_BIND_SHADER_RESOURCE;
- }
-
- depthStencilTextureDesc.CPUAccessFlags = 0;
- depthStencilTextureDesc.MiscFlags = 0;
-
- gl::Error err = mRenderer->allocateTexture(depthStencilTextureDesc, depthBufferFormatInfo,
- &mDepthStencilTexture);
- if (err.isError())
- {
- ERR() << "Could not create depthstencil surface for new swap chain, " << err;
- release();
- return EGL_BAD_ALLOC;
- }
- mDepthStencilTexture.setDebugName("Offscreen depth stencil texture");
-
- D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilDesc;
- depthStencilDesc.Format = depthBufferFormatInfo.dsvFormat;
- depthStencilDesc.ViewDimension =
- (mEGLSamples <= 1) ? D3D11_DSV_DIMENSION_TEXTURE2D : D3D11_DSV_DIMENSION_TEXTURE2DMS;
- depthStencilDesc.Flags = 0;
- depthStencilDesc.Texture2D.MipSlice = 0;
-
- err = mRenderer->allocateResource(depthStencilDesc, mDepthStencilTexture.get(),
- &mDepthStencilDSView);
- ASSERT(!err.isError());
- mDepthStencilDSView.setDebugName("Offscreen depth stencil view");
-
- if (depthStencilSRV)
- {
- D3D11_SHADER_RESOURCE_VIEW_DESC depthStencilSRVDesc;
- depthStencilSRVDesc.Format = depthBufferFormatInfo.srvFormat;
- depthStencilSRVDesc.ViewDimension = (mEGLSamples <= 1)
- ? D3D11_SRV_DIMENSION_TEXTURE2D
- : D3D11_SRV_DIMENSION_TEXTURE2DMS;
- depthStencilSRVDesc.Texture2D.MostDetailedMip = 0;
- depthStencilSRVDesc.Texture2D.MipLevels = static_cast<UINT>(-1);
-
- err = mRenderer->allocateResource(depthStencilSRVDesc, mDepthStencilTexture.get(),
- &mDepthStencilSRView);
- ASSERT(!err.isError());
- mDepthStencilSRView.setDebugName("Offscreen depth stencil shader resource");
- }
- }
-
- return EGL_SUCCESS;
-}
-
-EGLint SwapChain11::resize(const gl::Context *context,
- EGLint backbufferWidth,
- EGLint backbufferHeight)
-{
- TRACE_EVENT0("gpu.angle", "SwapChain11::resize");
- ID3D11Device *device = mRenderer->getDevice();
-
- if (device == nullptr)
- {
- return EGL_BAD_ACCESS;
- }
-
- // EGL allows creating a surface with 0x0 dimension, however, DXGI does not like 0x0 swapchains
- if (backbufferWidth < 1 || backbufferHeight < 1)
- {
- return EGL_SUCCESS;
- }
-
- // Don't resize unnecessarily
- if (mWidth == backbufferWidth && mHeight == backbufferHeight)
- {
- return EGL_SUCCESS;
- }
-
- // Can only call resize if we have already created our swap buffer and resources
- ASSERT(mSwapChain && mBackBufferTexture.valid() && mBackBufferRTView.valid() &&
- mBackBufferSRView.valid());
-
- mBackBufferTexture.reset();
- mBackBufferRTView.reset();
- mBackBufferSRView.reset();
-
- // Resize swap chain
- DXGI_SWAP_CHAIN_DESC desc;
- HRESULT result = mSwapChain->GetDesc(&desc);
- if (FAILED(result))
- {
- ERR() << "Error reading swap chain description, " << gl::FmtHR(result);
- release();
- return EGL_BAD_ALLOC;
- }
-
- result = mSwapChain->ResizeBuffers(desc.BufferCount, backbufferWidth, backbufferHeight, getSwapChainNativeFormat(), 0);
-
- if (FAILED(result))
- {
- ERR() << "Error resizing swap chain buffers, " << gl::FmtHR(result);
- release();
-
- if (d3d11::isDeviceLostError(result))
- {
- return EGL_CONTEXT_LOST;
- }
- else
- {
- return EGL_BAD_ALLOC;
- }
- }
-
- ID3D11Texture2D *backbufferTexture = nullptr;
- result = mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D),
- reinterpret_cast<void **>(&backbufferTexture));
- ASSERT(SUCCEEDED(result));
- if (SUCCEEDED(result))
- {
-#ifndef ANGLE_ENABLE_WINDOWS_STORE
- if (mNativeWindow->getNativeWindow())
- InvalidateRect(mNativeWindow->getNativeWindow(), nullptr, FALSE);
-#endif
- const auto &format =
- d3d11::Format::Get(mOffscreenRenderTargetFormat, mRenderer->getRenderer11DeviceCaps());
- mBackBufferTexture.set(backbufferTexture, format);
- mBackBufferTexture.setDebugName("Back buffer texture");
-
- gl::Error err =
- mRenderer->allocateResourceNoDesc(mBackBufferTexture.get(), &mBackBufferRTView);
- ASSERT(!err.isError());
- mBackBufferRTView.setDebugName("Back buffer render target");
-
- err = mRenderer->allocateResourceNoDesc(mBackBufferTexture.get(), &mBackBufferSRView);
- ASSERT(!err.isError());
- mBackBufferSRView.setDebugName("Back buffer shader resource");
- }
-
- mFirstSwap = true;
-
- return resetOffscreenBuffers(context, backbufferWidth, backbufferHeight);
-}
-
-DXGI_FORMAT SwapChain11::getSwapChainNativeFormat() const
-{
- // Return a render target format for offscreen rendering is supported by IDXGISwapChain.
- // MSDN https://msdn.microsoft.com/en-us/library/windows/desktop/bb173064(v=vs.85).aspx
- switch (mOffscreenRenderTargetFormat)
- {
- case GL_RGBA8:
- case GL_RGBA4:
- case GL_RGB5_A1:
- case GL_RGB8:
- case GL_RGB565:
- return DXGI_FORMAT_R8G8B8A8_UNORM;
-
- case GL_BGRA8_EXT:
- return DXGI_FORMAT_B8G8R8A8_UNORM;
-
- case GL_RGB10_A2:
- return DXGI_FORMAT_R10G10B10A2_UNORM;
-
- case GL_RGBA16F:
- return DXGI_FORMAT_R16G16B16A16_FLOAT;
-
- default:
- UNREACHABLE();
- return DXGI_FORMAT_UNKNOWN;
- }
-}
-
-EGLint SwapChain11::reset(const gl::Context *context,
- EGLint backbufferWidth,
- EGLint backbufferHeight,
- EGLint swapInterval)
-{
- mSwapInterval = static_cast<unsigned int>(swapInterval);
- if (mSwapInterval > 4)
- {
- // IDXGISwapChain::Present documentation states that valid sync intervals are in the [0,4]
- // range
- return EGL_BAD_PARAMETER;
- }
-
- // If the swap chain already exists, just resize
- if (mSwapChain != nullptr)
- {
- return resize(context, backbufferWidth, backbufferHeight);
- }
-
- TRACE_EVENT0("gpu.angle", "SwapChain11::reset");
- ID3D11Device *device = mRenderer->getDevice();
-
- if (device == nullptr)
- {
- return EGL_BAD_ACCESS;
- }
-
- // Release specific resources to free up memory for the new render target, while the
- // old render target still exists for the purpose of preserving its contents.
- SafeRelease(mSwapChain1);
- SafeRelease(mSwapChain);
- mBackBufferTexture.reset();
- mBackBufferRTView.reset();
-
- // EGL allows creating a surface with 0x0 dimension, however, DXGI does not like 0x0 swapchains
- if (backbufferWidth < 1 || backbufferHeight < 1)
- {
- releaseOffscreenColorBuffer();
- return EGL_SUCCESS;
- }
-
- if (mNativeWindow->getNativeWindow())
- {
- HRESULT result = mNativeWindow->createSwapChain(
- device, mRenderer->getDxgiFactory(), getSwapChainNativeFormat(), backbufferWidth,
- backbufferHeight, getD3DSamples(), &mSwapChain);
-
- if (FAILED(result))
- {
- ERR() << "Could not create additional swap chains or offscreen surfaces, "
- << gl::FmtHR(result);
- release();
-
- if (d3d11::isDeviceLostError(result))
- {
- return EGL_CONTEXT_LOST;
- }
- else
- {
- return EGL_BAD_ALLOC;
- }
- }
-
- if (mRenderer->getRenderer11DeviceCaps().supportsDXGI1_2)
- {
- mSwapChain1 = d3d11::DynamicCastComObject<IDXGISwapChain1>(mSwapChain);
- }
-
- ID3D11Texture2D *backbufferTex = nullptr;
- result = mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D),
- reinterpret_cast<LPVOID *>(&backbufferTex));
- ASSERT(SUCCEEDED(result));
- const auto &format =
- d3d11::Format::Get(mOffscreenRenderTargetFormat, mRenderer->getRenderer11DeviceCaps());
- mBackBufferTexture.set(backbufferTex, format);
- mBackBufferTexture.setDebugName("Back buffer texture");
-
- gl::Error err =
- mRenderer->allocateResourceNoDesc(mBackBufferTexture.get(), &mBackBufferRTView);
- ASSERT(!err.isError());
- mBackBufferRTView.setDebugName("Back buffer render target");
-
- err = mRenderer->allocateResourceNoDesc(mBackBufferTexture.get(), &mBackBufferSRView);
- ASSERT(!err.isError());
- mBackBufferSRView.setDebugName("Back buffer shader resource view");
- }
-
- mFirstSwap = true;
-
- return resetOffscreenBuffers(context, backbufferWidth, backbufferHeight);
-}
-
-void SwapChain11::initPassThroughResources()
-{
- if (mPassThroughResourcesInit)
- {
- return;
- }
-
- TRACE_EVENT0("gpu.angle", "SwapChain11::initPassThroughResources");
- ID3D11Device *device = mRenderer->getDevice();
-
- ASSERT(device != nullptr);
-
- // Make sure our resources are all not allocated, when we create
- ASSERT(!mQuadVB.valid() && !mPassThroughSampler.valid());
- ASSERT(!mPassThroughIL.valid() && !mPassThroughVS.valid() && !mPassThroughPS.valid());
-
- D3D11_BUFFER_DESC vbDesc;
- vbDesc.ByteWidth = sizeof(d3d11::PositionTexCoordVertex) * 4;
- vbDesc.Usage = D3D11_USAGE_DYNAMIC;
- vbDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
- vbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- vbDesc.MiscFlags = 0;
- vbDesc.StructureByteStride = 0;
-
- gl::Error err = mRenderer->allocateResource(vbDesc, &mQuadVB);
- ASSERT(!err.isError());
- mQuadVB.setDebugName("Swap chain quad vertex buffer");
-
- D3D11_SAMPLER_DESC samplerDesc;
- samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
- samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
- samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
- samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
- samplerDesc.MipLODBias = 0.0f;
- samplerDesc.MaxAnisotropy = 0;
- samplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
- samplerDesc.BorderColor[0] = 0.0f;
- samplerDesc.BorderColor[1] = 0.0f;
- samplerDesc.BorderColor[2] = 0.0f;
- samplerDesc.BorderColor[3] = 0.0f;
- samplerDesc.MinLOD = 0;
- samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;
-
- err = mRenderer->allocateResource(samplerDesc, &mPassThroughSampler);
- ASSERT(!err.isError());
- mPassThroughSampler.setDebugName("Swap chain pass through sampler");
-
- D3D11_INPUT_ELEMENT_DESC quadLayout[] =
- {
- { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
- { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 8, D3D11_INPUT_PER_VERTEX_DATA, 0 },
- };
-
- InputElementArray quadElements(quadLayout);
- ShaderData vertexShaderData(g_VS_Passthrough2D);
-
- err = mRenderer->allocateResource(quadElements, &vertexShaderData, &mPassThroughIL);
- ASSERT(!err.isError());
- mPassThroughIL.setDebugName("Swap chain pass through layout");
-
- err = mRenderer->allocateResource(vertexShaderData, &mPassThroughVS);
- ASSERT(!err.isError());
- mPassThroughVS.setDebugName("Swap chain pass through vertex shader");
-
- if (mEGLSamples <= 1)
- {
- ShaderData pixelShaderData(g_PS_PassthroughRGBA2D);
- err = mRenderer->allocateResource(pixelShaderData, &mPassThroughPS);
- }
- else
- {
- ShaderData pixelShaderData(g_PS_PassthroughRGBA2DMS);
- err = mRenderer->allocateResource(pixelShaderData, &mPassThroughPS);
- }
-
- ASSERT(!err.isError());
- mPassThroughPS.setDebugName("Swap chain pass through pixel shader");
-
- // Use the default rasterizer state but without culling
- D3D11_RASTERIZER_DESC rasterizerDesc;
- rasterizerDesc.FillMode = D3D11_FILL_SOLID;
- rasterizerDesc.CullMode = D3D11_CULL_NONE;
- rasterizerDesc.FrontCounterClockwise = FALSE;
- rasterizerDesc.DepthBias = 0;
- rasterizerDesc.SlopeScaledDepthBias = 0.0f;
- rasterizerDesc.DepthBiasClamp = 0.0f;
- rasterizerDesc.DepthClipEnable = TRUE;
- rasterizerDesc.ScissorEnable = FALSE;
- rasterizerDesc.MultisampleEnable = FALSE;
- rasterizerDesc.AntialiasedLineEnable = FALSE;
-
- err = mRenderer->allocateResource(rasterizerDesc, &mPassThroughRS);
- ASSERT(!err.isError());
- mPassThroughRS.setDebugName("Swap chain pass through rasterizer state");
-
- mPassThroughResourcesInit = true;
-}
-
-// parameters should be validated/clamped by caller
-EGLint SwapChain11::swapRect(const gl::Context *context,
- EGLint x,
- EGLint y,
- EGLint width,
- EGLint height)
-{
- if (mNeedsOffscreenTexture)
- {
- EGLint result = copyOffscreenToBackbuffer(context, x, y, width, height);
- if (result != EGL_SUCCESS)
- {
- return result;
- }
- }
-
- EGLint result = present(context, x, y, width, height);
- if (result != EGL_SUCCESS)
- {
- return result;
- }
-
- mRenderer->onSwap();
-
- return EGL_SUCCESS;
-}
-
-EGLint SwapChain11::copyOffscreenToBackbuffer(const gl::Context *context,
- EGLint x,
- EGLint y,
- EGLint width,
- EGLint height)
-{
- if (!mSwapChain)
- {
- return EGL_SUCCESS;
- }
-
- initPassThroughResources();
-
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- // Set vertices
- D3D11_MAPPED_SUBRESOURCE mappedResource;
- HRESULT result =
- deviceContext->Map(mQuadVB.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
- if (FAILED(result))
- {
- return EGL_BAD_ACCESS;
- }
-
- d3d11::PositionTexCoordVertex *vertices = static_cast<d3d11::PositionTexCoordVertex*>(mappedResource.pData);
-
- // Create a quad in homogeneous coordinates
- float x1 = (x / float(width)) * 2.0f - 1.0f;
- float y1 = (y / float(height)) * 2.0f - 1.0f;
- float x2 = ((x + width) / float(width)) * 2.0f - 1.0f;
- float y2 = ((y + height) / float(height)) * 2.0f - 1.0f;
-
- float u1 = x / float(width);
- float v1 = y / float(height);
- float u2 = (x + width) / float(width);
- float v2 = (y + height) / float(height);
- // Invert the quad vertices depending on the surface orientation.
- if ((mOrientation & EGL_SURFACE_ORIENTATION_INVERT_X_ANGLE) != 0)
- {
- std::swap(x1, x2);
- }
- if ((mOrientation & EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE) != 0)
- {
- std::swap(y1, y2);
- }
-
- d3d11::SetPositionTexCoordVertex(&vertices[0], x1, y1, u1, v1);
- d3d11::SetPositionTexCoordVertex(&vertices[1], x1, y2, u1, v2);
- d3d11::SetPositionTexCoordVertex(&vertices[2], x2, y1, u2, v1);
- d3d11::SetPositionTexCoordVertex(&vertices[3], x2, y2, u2, v2);
-
- deviceContext->Unmap(mQuadVB.get(), 0);
-
- StateManager11 *stateManager = mRenderer->getStateManager();
-
- constexpr UINT stride = sizeof(d3d11::PositionTexCoordVertex);
- stateManager->setSingleVertexBuffer(&mQuadVB, stride, 0);
-
- // Apply state
- stateManager->setDepthStencilState(nullptr, 0xFFFFFFFF);
- stateManager->setSimpleBlendState(nullptr);
- stateManager->setRasterizerState(&mPassThroughRS);
-
- // Apply shaders
- stateManager->setInputLayout(&mPassThroughIL);
- stateManager->setPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
- stateManager->setDrawShaders(&mPassThroughVS, nullptr, &mPassThroughPS);
-
- // Apply render targets. Use the proxy context in display.
- stateManager->setRenderTarget(mBackBufferRTView.get(), nullptr);
-
- // Set the viewport
- stateManager->setSimpleViewport(width, height);
-
- // Apply textures
- stateManager->setSimplePixelTextureAndSampler(mOffscreenSRView, mPassThroughSampler);
-
- // Draw
- deviceContext->Draw(4, 0);
-
- return EGL_SUCCESS;
-}
-
-EGLint SwapChain11::present(const gl::Context *context,
- EGLint x,
- EGLint y,
- EGLint width,
- EGLint height)
-{
- if (!mSwapChain)
- {
- return EGL_SUCCESS;
- }
-
- UINT swapInterval = mSwapInterval;
-#if ANGLE_VSYNC == ANGLE_DISABLED
- swapInterval = 0;
-#endif
-
- HRESULT result = S_OK;
-
- // Use IDXGISwapChain1::Present1 with a dirty rect if DXGI 1.2 is available.
- // Dirty rect present is not supported with a multisampled swapchain.
- if (mSwapChain1 != nullptr && mEGLSamples <= 1)
- {
- if (mFirstSwap)
- {
- // Can't swap with a dirty rect if this swap chain has never swapped before
- DXGI_PRESENT_PARAMETERS params = {0, nullptr, nullptr, nullptr};
- result = mSwapChain1->Present1(swapInterval, 0, &params);
- }
- else
- {
- RECT rect = {static_cast<LONG>(x), static_cast<LONG>(mHeight - y - height),
- static_cast<LONG>(x + width), static_cast<LONG>(mHeight - y)};
- DXGI_PRESENT_PARAMETERS params = {1, &rect, nullptr, nullptr};
- result = mSwapChain1->Present1(swapInterval, 0, &params);
- }
- }
- else
- {
- result = mSwapChain->Present(swapInterval, 0);
- }
-
- mFirstSwap = false;
-
- // Some swapping mechanisms such as DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL unbind the current render
- // target. Mark it dirty. Use the proxy context in display since there is none available.
- mRenderer->getStateManager()->invalidateRenderTarget();
-
- if (result == DXGI_ERROR_DEVICE_REMOVED)
- {
- ERR() << "Present failed: the D3D11 device was removed, "
- << gl::FmtHR(mRenderer->getDevice()->GetDeviceRemovedReason());
- return EGL_CONTEXT_LOST;
- }
- else if (result == DXGI_ERROR_DEVICE_RESET)
- {
- ERR() << "Present failed: the D3D11 device was reset from a bad command.";
- return EGL_CONTEXT_LOST;
- }
- else if (FAILED(result))
- {
- ERR() << "Present failed with " << gl::FmtHR(result);
- }
-
- mNativeWindow->commitChange();
-
- return EGL_SUCCESS;
-}
-
-const TextureHelper11 &SwapChain11::getOffscreenTexture()
-{
- return mNeedsOffscreenTexture ? mOffscreenTexture : mBackBufferTexture;
-}
-
-const d3d11::RenderTargetView &SwapChain11::getRenderTarget()
-{
- return mNeedsOffscreenTexture ? mOffscreenRTView : mBackBufferRTView;
-}
-
-const d3d11::SharedSRV &SwapChain11::getRenderTargetShaderResource()
-{
- if (!mNeedsOffscreenTexture)
- {
- ASSERT(mBackBufferSRView.valid());
- return mBackBufferSRView;
- }
-
- if (!mNeedsOffscreenTextureCopy)
- {
- ASSERT(mOffscreenSRView.valid());
- return mOffscreenSRView;
- }
-
- if (!mOffscreenTextureCopyForSRV.valid())
- {
- const d3d11::Format &backbufferFormatInfo =
- d3d11::Format::Get(mOffscreenRenderTargetFormat, mRenderer->getRenderer11DeviceCaps());
-
- D3D11_TEXTURE2D_DESC offscreenCopyDesc;
- mOffscreenTexture.getDesc(&offscreenCopyDesc);
-
- offscreenCopyDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
- offscreenCopyDesc.MiscFlags = 0;
- offscreenCopyDesc.CPUAccessFlags = 0;
- gl::Error err = mRenderer->allocateTexture(offscreenCopyDesc, backbufferFormatInfo,
- &mOffscreenTextureCopyForSRV);
- ASSERT(!err.isError());
- mOffscreenTextureCopyForSRV.setDebugName("Offscreen back buffer copy for SRV");
-
- D3D11_SHADER_RESOURCE_VIEW_DESC offscreenSRVDesc;
- offscreenSRVDesc.Format = backbufferFormatInfo.srvFormat;
- offscreenSRVDesc.ViewDimension =
- (mEGLSamples <= 1) ? D3D11_SRV_DIMENSION_TEXTURE2D : D3D11_SRV_DIMENSION_TEXTURE2DMS;
- offscreenSRVDesc.Texture2D.MostDetailedMip = 0;
- offscreenSRVDesc.Texture2D.MipLevels = static_cast<UINT>(-1);
-
- err = mRenderer->allocateResource(offscreenSRVDesc, mOffscreenTextureCopyForSRV.get(),
- &mOffscreenSRView);
- ASSERT(!err.isError());
- mOffscreenSRView.setDebugName("Offscreen back buffer shader resource");
- }
-
- // Need to copy the offscreen texture into the shader-readable copy, since it's external and
- // we don't know if the copy is up-to-date. This works around the problem we have when the app
- // passes in a texture that isn't shader-readable.
- mRenderer->getDeviceContext()->CopyResource(mOffscreenTextureCopyForSRV.get(),
- mOffscreenTexture.get());
- return mOffscreenSRView;
-}
-
-const d3d11::DepthStencilView &SwapChain11::getDepthStencil()
-{
- return mDepthStencilDSView;
-}
-
-const d3d11::SharedSRV &SwapChain11::getDepthStencilShaderResource()
-{
- return mDepthStencilSRView;
-}
-
-const TextureHelper11 &SwapChain11::getDepthStencilTexture()
-{
- return mDepthStencilTexture;
-}
-
-void *SwapChain11::getKeyedMutex()
-{
- return mKeyedMutex;
-}
-
-void SwapChain11::recreate()
-{
- // possibly should use this method instead of reset
-}
-
-void *rx::SwapChain11::getDevice()
-{
- return mRenderer->getDevice();
-}
-
-RenderTargetD3D *SwapChain11::getColorRenderTarget()
-{
- return &mColorRenderTarget;
-}
-
-RenderTargetD3D *SwapChain11::getDepthStencilRenderTarget()
-{
- return &mDepthStencilRenderTarget;
-}
-
-egl::Error SwapChain11::getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc)
-{
- if (!mSwapChain)
- {
- return egl::EglNotInitialized() << "Swap chain uninitialized";
- }
-
- DXGI_FRAME_STATISTICS stats = {};
- HRESULT result = mSwapChain->GetFrameStatistics(&stats);
-
- if (FAILED(result))
- {
- return egl::EglBadAlloc() << "Failed to get frame statistics, " << gl::FmtHR(result);
- }
-
- // Conversion from DXGI_FRAME_STATISTICS to the output values:
- // stats.SyncRefreshCount -> msc
- // stats.PresentCount -> sbc
- // stats.SyncQPCTime -> ust with conversion to microseconds via QueryPerformanceFrequency
- *msc = stats.SyncRefreshCount;
- *sbc = stats.PresentCount;
-
- LONGLONG syncQPCValue = stats.SyncQPCTime.QuadPart;
- // If the QPC Value is below the overflow threshold, we proceed with
- // simple multiply and divide.
- if (syncQPCValue < kQPCOverflowThreshold)
- {
- *ust = syncQPCValue * kMicrosecondsPerSecond / mQPCFrequency;
- }
- else
- {
- // Otherwise, calculate microseconds in a round about manner to avoid
- // overflow and precision issues.
- int64_t wholeSeconds = syncQPCValue / mQPCFrequency;
- int64_t leftoverTicks = syncQPCValue - (wholeSeconds * mQPCFrequency);
- *ust = wholeSeconds * kMicrosecondsPerSecond +
- leftoverTicks * kMicrosecondsPerSecond / mQPCFrequency;
- }
-
- return egl::NoError();
-}
-
-UINT SwapChain11::getD3DSamples() const
-{
- return (mEGLSamples == 0) ? 1 : mEGLSamples;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h
deleted file mode 100644
index eca068210b..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h
+++ /dev/null
@@ -1,137 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// SwapChain11.h: Defines a back-end specific class for the D3D11 swap chain.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_SWAPCHAIN11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_SWAPCHAIN11_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/renderer/d3d/SwapChainD3D.h"
-#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h"
-
-namespace rx
-{
-class Renderer11;
-class NativeWindow11;
-
-class SwapChain11 final : public SwapChainD3D
-{
- public:
- SwapChain11(Renderer11 *renderer,
- NativeWindow11 *nativeWindow,
- HANDLE shareHandle,
- IUnknown *d3dTexture,
- GLenum backBufferFormat,
- GLenum depthBufferFormat,
- EGLint orientation,
- EGLint samples);
- ~SwapChain11() override;
-
- EGLint resize(const gl::Context *context,
- EGLint backbufferWidth,
- EGLint backbufferHeight) override;
- EGLint reset(const gl::Context *context,
- EGLint backbufferWidth,
- EGLint backbufferHeight,
- EGLint swapInterval) override;
- EGLint swapRect(const gl::Context *context,
- EGLint x,
- EGLint y,
- EGLint width,
- EGLint height) override;
- void recreate() override;
-
- RenderTargetD3D *getColorRenderTarget() override;
- RenderTargetD3D *getDepthStencilRenderTarget() override;
-
- const TextureHelper11 &getOffscreenTexture();
- const d3d11::RenderTargetView &getRenderTarget();
- const d3d11::SharedSRV &getRenderTargetShaderResource();
-
- const TextureHelper11 &getDepthStencilTexture();
- const d3d11::DepthStencilView &getDepthStencil();
- const d3d11::SharedSRV &getDepthStencilShaderResource();
-
- EGLint getWidth() const { return mWidth; }
- EGLint getHeight() const { return mHeight; }
- void *getKeyedMutex() override;
- EGLint getSamples() const { return mEGLSamples; }
-
- void *getDevice() override;
-
- egl::Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc) override;
-
- private:
- void release();
- void initPassThroughResources();
-
- void releaseOffscreenColorBuffer();
- void releaseOffscreenDepthBuffer();
- EGLint resetOffscreenBuffers(const gl::Context *context,
- int backbufferWidth,
- int backbufferHeight);
- EGLint resetOffscreenColorBuffer(const gl::Context *context,
- int backbufferWidth,
- int backbufferHeight);
- EGLint resetOffscreenDepthBuffer(int backbufferWidth, int backbufferHeight);
-
- DXGI_FORMAT getSwapChainNativeFormat() const;
-
- EGLint copyOffscreenToBackbuffer(const gl::Context *context,
- EGLint x,
- EGLint y,
- EGLint width,
- EGLint height);
- EGLint present(const gl::Context *context, EGLint x, EGLint y, EGLint width, EGLint height);
- UINT getD3DSamples() const;
-
- Renderer11 *mRenderer;
- EGLint mWidth;
- EGLint mHeight;
- const EGLint mOrientation;
- bool mAppCreatedShareHandle;
- unsigned int mSwapInterval;
- bool mPassThroughResourcesInit;
-
- NativeWindow11 *mNativeWindow; // Handler for the Window that the surface is created for.
-
- bool mFirstSwap;
- IDXGISwapChain *mSwapChain;
- IDXGISwapChain1 *mSwapChain1;
- IDXGIKeyedMutex *mKeyedMutex;
-
- TextureHelper11 mBackBufferTexture;
- d3d11::RenderTargetView mBackBufferRTView;
- d3d11::SharedSRV mBackBufferSRView;
-
- const bool mNeedsOffscreenTexture;
- TextureHelper11 mOffscreenTexture;
- d3d11::RenderTargetView mOffscreenRTView;
- d3d11::SharedSRV mOffscreenSRView;
- bool mNeedsOffscreenTextureCopy;
- TextureHelper11 mOffscreenTextureCopyForSRV;
-
- TextureHelper11 mDepthStencilTexture;
- d3d11::DepthStencilView mDepthStencilDSView;
- d3d11::SharedSRV mDepthStencilSRView;
-
- d3d11::Buffer mQuadVB;
- d3d11::SamplerState mPassThroughSampler;
- d3d11::InputLayout mPassThroughIL;
- d3d11::VertexShader mPassThroughVS;
- d3d11::PixelShader mPassThroughPS;
- d3d11::RasterizerState mPassThroughRS;
-
- SurfaceRenderTarget11 mColorRenderTarget;
- SurfaceRenderTarget11 mDepthStencilRenderTarget;
-
- EGLint mEGLSamples;
- LONGLONG mQPCFrequency;
-};
-
-} // namespace rx
-#endif // LIBANGLE_RENDERER_D3D_D3D11_SWAPCHAIN11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp
deleted file mode 100644
index b702450ded..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp
+++ /dev/null
@@ -1,3155 +0,0 @@
-//
-// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// TextureStorage11.cpp: Implements the abstract rx::TextureStorage11 class and its concrete derived
-// classes TextureStorage11_2D and TextureStorage11_Cube, which act as the interface to the D3D11
-// texture.
-
-#include "libANGLE/renderer/d3d/d3d11/TextureStorage11.h"
-
-#include <tuple>
-
-#include "common/MemoryBuffer.h"
-#include "common/utilities.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/ImageIndex.h"
-#include "libANGLE/renderer/d3d/d3d11/Blit11.h"
-#include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
-#include "libANGLE/renderer/d3d/d3d11/Image11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h"
-#include "libANGLE/renderer/d3d/d3d11/StreamProducerNV12.h"
-#include "libANGLE/renderer/d3d/d3d11/SwapChain11.h"
-#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h"
-#include "libANGLE/renderer/d3d/EGLImageD3D.h"
-#include "libANGLE/renderer/d3d/TextureD3D.h"
-
-namespace rx
-{
-
-namespace
-{
-
-void InvalidateRenderTarget(const gl::Context *context, RenderTarget11 *renderTarget)
-{
- if (renderTarget)
- {
- renderTarget->signalDirty(context);
- }
-}
-
-RenderTarget11 *GetRenderTarget(std::unique_ptr<RenderTarget11> *pointer)
-{
- return pointer->get();
-}
-
-template <typename KeyT>
-RenderTarget11 *GetRenderTarget(std::pair<KeyT, std::unique_ptr<RenderTarget11>> *pair)
-{
- return pair->second.get();
-}
-
-template <typename T>
-void InvalidateRenderTargetContainer(const gl::Context *context, T *renderTargetContainer)
-{
- for (auto &rt : *renderTargetContainer)
- {
- InvalidateRenderTarget(context, GetRenderTarget(&rt));
- }
-}
-
-} // anonymous namespace
-
-TextureStorage11::SRVKey::SRVKey(int baseLevel, int mipLevels, bool swizzle, bool dropStencil)
- : baseLevel(baseLevel), mipLevels(mipLevels), swizzle(swizzle), dropStencil(dropStencil)
-{
-}
-
-bool TextureStorage11::SRVKey::operator<(const SRVKey &rhs) const
-{
- return std::tie(baseLevel, mipLevels, swizzle, dropStencil) <
- std::tie(rhs.baseLevel, rhs.mipLevels, rhs.swizzle, rhs.dropStencil);
-}
-
-TextureStorage11::TextureStorage11(Renderer11 *renderer,
- UINT bindFlags,
- UINT miscFlags,
- GLenum internalFormat)
- : mRenderer(renderer),
- mTopLevel(0),
- mMipLevels(0),
- mFormatInfo(d3d11::Format::Get(internalFormat, mRenderer->getRenderer11DeviceCaps())),
- mTextureWidth(0),
- mTextureHeight(0),
- mTextureDepth(0),
- mDropStencilTexture(),
- mBindFlags(bindFlags),
- mMiscFlags(miscFlags)
-{
-}
-
-TextureStorage11::~TextureStorage11()
-{
- mSrvCache.clear();
-}
-
-DWORD TextureStorage11::GetTextureBindFlags(GLenum internalFormat,
- const Renderer11DeviceCaps &renderer11DeviceCaps,
- bool renderTarget)
-{
- UINT bindFlags = 0;
-
- const d3d11::Format &formatInfo = d3d11::Format::Get(internalFormat, renderer11DeviceCaps);
- if (formatInfo.srvFormat != DXGI_FORMAT_UNKNOWN)
- {
- bindFlags |= D3D11_BIND_SHADER_RESOURCE;
- }
- if (formatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN)
- {
- bindFlags |= D3D11_BIND_DEPTH_STENCIL;
- }
- if (formatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN && renderTarget)
- {
- bindFlags |= D3D11_BIND_RENDER_TARGET;
- }
-
- return bindFlags;
-}
-
-DWORD TextureStorage11::GetTextureMiscFlags(GLenum internalFormat,
- const Renderer11DeviceCaps &renderer11DeviceCaps,
- bool renderTarget,
- int levels)
-{
- UINT miscFlags = 0;
-
- const d3d11::Format &formatInfo = d3d11::Format::Get(internalFormat, renderer11DeviceCaps);
- if (renderTarget && levels > 1)
- {
- if (d3d11::SupportsMipGen(formatInfo.texFormat, renderer11DeviceCaps.featureLevel))
- {
- miscFlags |= D3D11_RESOURCE_MISC_GENERATE_MIPS;
- }
- }
-
- return miscFlags;
-}
-
-UINT TextureStorage11::getBindFlags() const
-{
- return mBindFlags;
-}
-
-UINT TextureStorage11::getMiscFlags() const
-{
- return mMiscFlags;
-}
-
-int TextureStorage11::getTopLevel() const
-{
- // Applying top level is meant to be encapsulated inside TextureStorage11.
- UNREACHABLE();
- return mTopLevel;
-}
-
-bool TextureStorage11::isRenderTarget() const
-{
- return (mBindFlags & (D3D11_BIND_RENDER_TARGET | D3D11_BIND_DEPTH_STENCIL)) != 0;
-}
-
-bool TextureStorage11::isManaged() const
-{
- return false;
-}
-
-bool TextureStorage11::supportsNativeMipmapFunction() const
-{
- return (mMiscFlags & D3D11_RESOURCE_MISC_GENERATE_MIPS) != 0;
-}
-
-int TextureStorage11::getLevelCount() const
-{
- return mMipLevels - mTopLevel;
-}
-
-int TextureStorage11::getLevelWidth(int mipLevel) const
-{
- return std::max(static_cast<int>(mTextureWidth) >> mipLevel, 1);
-}
-
-int TextureStorage11::getLevelHeight(int mipLevel) const
-{
- return std::max(static_cast<int>(mTextureHeight) >> mipLevel, 1);
-}
-
-int TextureStorage11::getLevelDepth(int mipLevel) const
-{
- return std::max(static_cast<int>(mTextureDepth) >> mipLevel, 1);
-}
-
-gl::Error TextureStorage11::getMippedResource(const gl::Context *context,
- const TextureHelper11 **outResource)
-{
- return getResource(context, outResource);
-}
-
-UINT TextureStorage11::getSubresourceIndex(const gl::ImageIndex &index) const
-{
- UINT mipSlice = static_cast<UINT>(index.mipIndex + mTopLevel);
- UINT arraySlice = static_cast<UINT>(index.hasLayer() ? index.layerIndex : 0);
- UINT subresource = D3D11CalcSubresource(mipSlice, arraySlice, mMipLevels);
- ASSERT(subresource != std::numeric_limits<UINT>::max());
- return subresource;
-}
-
-gl::Error TextureStorage11::getSRV(const gl::Context *context,
- const gl::TextureState &textureState,
- const d3d11::SharedSRV **outSRV)
-{
- // Make sure to add the level offset for our tiny compressed texture workaround
- const GLuint effectiveBaseLevel = textureState.getEffectiveBaseLevel();
- bool swizzleRequired = textureState.swizzleRequired();
- bool mipmapping = gl::IsMipmapFiltered(textureState.getSamplerState());
- unsigned int mipLevels =
- mipmapping ? (textureState.getEffectiveMaxLevel() - effectiveBaseLevel + 1) : 1;
-
- // Make sure there's 'mipLevels' mipmap levels below the base level (offset by the top level,
- // which corresponds to GL level 0)
- mipLevels = std::min(mipLevels, mMipLevels - mTopLevel - effectiveBaseLevel);
-
- if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3)
- {
- ASSERT(!swizzleRequired);
- ASSERT(mipLevels == 1 || mipLevels == mMipLevels);
- }
-
- if (mRenderer->getWorkarounds().zeroMaxLodWorkaround)
- {
- // We must ensure that the level zero texture is in sync with mipped texture.
- ANGLE_TRY(useLevelZeroWorkaroundTexture(context, mipLevels == 1));
- }
-
- if (swizzleRequired)
- {
- verifySwizzleExists(textureState.getSwizzleState());
- }
-
- // We drop the stencil when sampling from the SRV if three conditions hold:
- // 1. the drop stencil workaround is enabled.
- bool workaround = mRenderer->getWorkarounds().emulateTinyStencilTextures;
- // 2. this is a stencil texture.
- bool hasStencil = (mFormatInfo.format().stencilBits > 0);
- // 3. the texture has a 1x1 or 2x2 mip.
- int effectiveTopLevel = effectiveBaseLevel + mipLevels - 1;
- bool hasSmallMips =
- (getLevelWidth(effectiveTopLevel) <= 2 || getLevelHeight(effectiveTopLevel) <= 2);
-
- bool useDropStencil = (workaround && hasStencil && hasSmallMips);
- SRVKey key(effectiveBaseLevel, mipLevels, swizzleRequired, useDropStencil);
- if (useDropStencil)
- {
- // Ensure drop texture gets created.
- DropStencil result = DropStencil::CREATED;
- ANGLE_TRY_RESULT(ensureDropStencilTexture(context), result);
-
- // Clear the SRV cache if necessary.
- // TODO(jmadill): Re-use find query result.
- auto srvEntry = mSrvCache.find(key);
- if (result == DropStencil::CREATED && srvEntry != mSrvCache.end())
- {
- mSrvCache.erase(key);
- }
- }
-
- ANGLE_TRY(getCachedOrCreateSRV(context, key, outSRV));
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11::getCachedOrCreateSRV(const gl::Context *context,
- const SRVKey &key,
- const d3d11::SharedSRV **outSRV)
-{
- auto iter = mSrvCache.find(key);
- if (iter != mSrvCache.end())
- {
- *outSRV = &iter->second;
- return gl::NoError();
- }
-
- const TextureHelper11 *texture = nullptr;
- DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN;
-
- if (key.swizzle)
- {
- const auto &swizzleFormat =
- mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps());
- ASSERT(!key.dropStencil || swizzleFormat.format().stencilBits == 0);
- ANGLE_TRY(getSwizzleTexture(&texture));
- format = swizzleFormat.srvFormat;
- }
- else if (key.dropStencil)
- {
- ASSERT(mDropStencilTexture.valid());
- texture = &mDropStencilTexture;
- format = DXGI_FORMAT_R32_FLOAT;
- }
- else
- {
- ANGLE_TRY(getResource(context, &texture));
- format = mFormatInfo.srvFormat;
- }
-
- d3d11::SharedSRV srv;
-
- ANGLE_TRY(createSRV(context, key.baseLevel, key.mipLevels, format, *texture, &srv));
-
- const auto &insertIt = mSrvCache.insert(std::make_pair(key, std::move(srv)));
- *outSRV = &insertIt.first->second;
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11::getSRVLevel(const gl::Context *context,
- int mipLevel,
- bool blitSRV,
- const d3d11::SharedSRV **outSRV)
-{
- ASSERT(mipLevel >= 0 && mipLevel < getLevelCount());
-
- auto &levelSRVs = (blitSRV) ? mLevelBlitSRVs : mLevelSRVs;
- auto &otherLevelSRVs = (blitSRV) ? mLevelSRVs : mLevelBlitSRVs;
-
- if (!levelSRVs[mipLevel].valid())
- {
- // Only create a different SRV for blit if blit format is different from regular srv format
- if (otherLevelSRVs[mipLevel].valid() && mFormatInfo.srvFormat == mFormatInfo.blitSRVFormat)
- {
- levelSRVs[mipLevel] = otherLevelSRVs[mipLevel].makeCopy();
- }
- else
- {
- const TextureHelper11 *resource = nullptr;
- ANGLE_TRY(getResource(context, &resource));
-
- DXGI_FORMAT resourceFormat =
- blitSRV ? mFormatInfo.blitSRVFormat : mFormatInfo.srvFormat;
- ANGLE_TRY(
- createSRV(context, mipLevel, 1, resourceFormat, *resource, &levelSRVs[mipLevel]));
- }
- }
-
- *outSRV = &levelSRVs[mipLevel];
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11::getSRVLevels(const gl::Context *context,
- GLint baseLevel,
- GLint maxLevel,
- const d3d11::SharedSRV **outSRV)
-{
- unsigned int mipLevels = maxLevel - baseLevel + 1;
-
- // Make sure there's 'mipLevels' mipmap levels below the base level (offset by the top level,
- // which corresponds to GL level 0)
- mipLevels = std::min(mipLevels, mMipLevels - mTopLevel - baseLevel);
-
- if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3)
- {
- ASSERT(mipLevels == 1 || mipLevels == mMipLevels);
- }
-
- if (mRenderer->getWorkarounds().zeroMaxLodWorkaround)
- {
- // We must ensure that the level zero texture is in sync with mipped texture.
- ANGLE_TRY(useLevelZeroWorkaroundTexture(context, mipLevels == 1));
- }
-
- // TODO(jmadill): Assert we don't need to drop stencil.
-
- SRVKey key(baseLevel, mipLevels, false, false);
- ANGLE_TRY(getCachedOrCreateSRV(context, key, outSRV));
-
- return gl::NoError();
-}
-
-const d3d11::Format &TextureStorage11::getFormatSet() const
-{
- return mFormatInfo;
-}
-
-gl::Error TextureStorage11::generateSwizzles(const gl::Context *context,
- const gl::SwizzleState &swizzleTarget)
-{
- for (int level = 0; level < getLevelCount(); level++)
- {
- // Check if the swizzle for this level is out of date
- if (mSwizzleCache[level] != swizzleTarget)
- {
- // Need to re-render the swizzle for this level
- const d3d11::SharedSRV *sourceSRV = nullptr;
- ANGLE_TRY(getSRVLevel(context, level, true, &sourceSRV));
-
- const d3d11::RenderTargetView *destRTV;
- ANGLE_TRY(getSwizzleRenderTarget(level, &destRTV));
-
- gl::Extents size(getLevelWidth(level), getLevelHeight(level), getLevelDepth(level));
-
- Blit11 *blitter = mRenderer->getBlitter();
-
- ANGLE_TRY(blitter->swizzleTexture(context, *sourceSRV, *destRTV, size, swizzleTarget));
-
- mSwizzleCache[level] = swizzleTarget;
- }
- }
-
- return gl::NoError();
-}
-
-void TextureStorage11::markLevelDirty(int mipLevel)
-{
- if (mipLevel >= 0 && static_cast<size_t>(mipLevel) < mSwizzleCache.size())
- {
- // The default constructor of SwizzleState has GL_INVALID_INDEX for all channels which is
- // not a valid swizzle combination
- if (mSwizzleCache[mipLevel] != gl::SwizzleState())
- {
- // TODO(jmadill): Invalidate specific swizzle.
- mRenderer->getStateManager()->invalidateSwizzles();
- mSwizzleCache[mipLevel] = gl::SwizzleState();
- }
- }
-
- if (mDropStencilTexture.valid())
- {
- mDropStencilTexture.reset();
- }
-}
-
-void TextureStorage11::markDirty()
-{
- for (size_t mipLevel = 0; mipLevel < mSwizzleCache.size(); ++mipLevel)
- {
- markLevelDirty(static_cast<int>(mipLevel));
- }
-}
-
-gl::Error TextureStorage11::updateSubresourceLevel(const gl::Context *context,
- const TextureHelper11 &srcTexture,
- unsigned int sourceSubresource,
- const gl::ImageIndex &index,
- const gl::Box &copyArea)
-{
- ASSERT(srcTexture.valid());
-
- const GLint level = index.mipIndex;
-
- markLevelDirty(level);
-
- gl::Extents texSize(getLevelWidth(level), getLevelHeight(level), getLevelDepth(level));
-
- bool fullCopy = copyArea.x == 0 && copyArea.y == 0 && copyArea.z == 0 &&
- copyArea.width == texSize.width && copyArea.height == texSize.height &&
- copyArea.depth == texSize.depth;
-
- const TextureHelper11 *dstTexture = nullptr;
-
- // If the zero-LOD workaround is active and we want to update a level greater than zero, then we
- // should update the mipmapped texture, even if mapmaps are currently disabled.
- if (index.mipIndex > 0 && mRenderer->getWorkarounds().zeroMaxLodWorkaround)
- {
- ANGLE_TRY(getMippedResource(context, &dstTexture));
- }
- else
- {
- ANGLE_TRY(getResource(context, &dstTexture));
- }
-
- unsigned int dstSubresource = getSubresourceIndex(index);
-
- ASSERT(dstTexture->valid());
-
- const d3d11::DXGIFormatSize &dxgiFormatSizeInfo =
- d3d11::GetDXGIFormatSizeInfo(mFormatInfo.texFormat);
- if (!fullCopy && mFormatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN)
- {
- // CopySubresourceRegion cannot copy partial depth stencils, use the blitter instead
- Blit11 *blitter = mRenderer->getBlitter();
- return blitter->copyDepthStencil(srcTexture, sourceSubresource, copyArea, texSize,
- *dstTexture, dstSubresource, copyArea, texSize, nullptr);
- }
-
- D3D11_BOX srcBox;
- srcBox.left = copyArea.x;
- srcBox.top = copyArea.y;
- srcBox.right =
- copyArea.x + roundUp(static_cast<UINT>(copyArea.width), dxgiFormatSizeInfo.blockWidth);
- srcBox.bottom =
- copyArea.y + roundUp(static_cast<UINT>(copyArea.height), dxgiFormatSizeInfo.blockHeight);
- srcBox.front = copyArea.z;
- srcBox.back = copyArea.z + copyArea.depth;
-
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- deviceContext->CopySubresourceRegion(dstTexture->get(), dstSubresource, copyArea.x, copyArea.y,
- copyArea.z, srcTexture.get(), sourceSubresource,
- fullCopy ? nullptr : &srcBox);
- return gl::NoError();
-}
-
-gl::Error TextureStorage11::copySubresourceLevel(const gl::Context *context,
- const TextureHelper11 &dstTexture,
- unsigned int dstSubresource,
- const gl::ImageIndex &index,
- const gl::Box &region)
-{
- ASSERT(dstTexture.valid());
-
- const TextureHelper11 *srcTexture = nullptr;
-
- // If the zero-LOD workaround is active and we want to update a level greater than zero, then we
- // should update the mipmapped texture, even if mapmaps are currently disabled.
- if (index.mipIndex > 0 && mRenderer->getWorkarounds().zeroMaxLodWorkaround)
- {
- ANGLE_TRY(getMippedResource(context, &srcTexture));
- }
- else
- {
- ANGLE_TRY(getResource(context, &srcTexture));
- }
-
- ASSERT(srcTexture->valid());
-
- unsigned int srcSubresource = getSubresourceIndex(index);
-
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- // D3D11 can't perform partial CopySubresourceRegion on depth/stencil textures, so pSrcBox
- // should be nullptr.
- D3D11_BOX srcBox;
- D3D11_BOX *pSrcBox = nullptr;
- if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3)
- {
- GLsizei width = region.width;
- GLsizei height = region.height;
- d3d11::MakeValidSize(false, mFormatInfo.texFormat, &width, &height, nullptr);
-
- // Keep srcbox as nullptr if we're dealing with tiny mips of compressed textures.
- if (width == region.width && height == region.height)
- {
- // However, D3D10Level9 doesn't always perform CopySubresourceRegion correctly unless
- // the source box is specified. This is okay, since we don't perform
- // CopySubresourceRegion on depth/stencil textures on 9_3.
- ASSERT(mFormatInfo.dsvFormat == DXGI_FORMAT_UNKNOWN);
- srcBox.left = region.x;
- srcBox.right = region.x + region.width;
- srcBox.top = region.y;
- srcBox.bottom = region.y + region.height;
- srcBox.front = region.z;
- srcBox.back = region.z + region.depth;
- pSrcBox = &srcBox;
- }
- }
-
- deviceContext->CopySubresourceRegion(dstTexture.get(), dstSubresource, region.x, region.y,
- region.z, srcTexture->get(), srcSubresource, pSrcBox);
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11::generateMipmap(const gl::Context *context,
- const gl::ImageIndex &sourceIndex,
- const gl::ImageIndex &destIndex)
-{
- ASSERT(sourceIndex.layerIndex == destIndex.layerIndex);
-
- markLevelDirty(destIndex.mipIndex);
-
- RenderTargetD3D *source = nullptr;
- ANGLE_TRY(getRenderTarget(context, sourceIndex, &source));
-
- RenderTargetD3D *dest = nullptr;
- ANGLE_TRY(getRenderTarget(context, destIndex, &dest));
-
- RenderTarget11 *rt11 = GetAs<RenderTarget11>(source);
- const d3d11::SharedSRV &sourceSRV = rt11->getBlitShaderResourceView();
- const d3d11::RenderTargetView &destRTV = rt11->getRenderTargetView();
-
- gl::Box sourceArea(0, 0, 0, source->getWidth(), source->getHeight(), source->getDepth());
- gl::Extents sourceSize(source->getWidth(), source->getHeight(), source->getDepth());
-
- gl::Box destArea(0, 0, 0, dest->getWidth(), dest->getHeight(), dest->getDepth());
- gl::Extents destSize(dest->getWidth(), dest->getHeight(), dest->getDepth());
-
- Blit11 *blitter = mRenderer->getBlitter();
- GLenum format = gl::GetUnsizedFormat(source->getInternalFormat());
- return blitter->copyTexture(context, sourceSRV, sourceArea, sourceSize, format, destRTV,
- destArea, destSize, nullptr, format, GL_LINEAR, false, false,
- false);
-}
-
-void TextureStorage11::verifySwizzleExists(const gl::SwizzleState &swizzleState)
-{
- for (unsigned int level = 0; level < mMipLevels; level++)
- {
- ASSERT(mSwizzleCache[level] == swizzleState);
- }
-}
-
-void TextureStorage11::clearSRVCache()
-{
- markDirty();
- mSrvCache.clear();
-
- for (size_t level = 0; level < mLevelSRVs.size(); level++)
- {
- mLevelSRVs[level].reset();
- mLevelBlitSRVs[level].reset();
- }
-}
-
-gl::Error TextureStorage11::copyToStorage(const gl::Context *context, TextureStorage *destStorage)
-{
- ASSERT(destStorage);
-
- const TextureHelper11 *sourceResouce = nullptr;
- ANGLE_TRY(getResource(context, &sourceResouce));
-
- TextureStorage11 *dest11 = GetAs<TextureStorage11>(destStorage);
- const TextureHelper11 *destResource = nullptr;
- ANGLE_TRY(dest11->getResource(context, &destResource));
-
- ID3D11DeviceContext *immediateContext = mRenderer->getDeviceContext();
- immediateContext->CopyResource(destResource->get(), sourceResouce->get());
-
- dest11->markDirty();
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11::setData(const gl::Context *context,
- const gl::ImageIndex &index,
- ImageD3D *image,
- const gl::Box *destBox,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixelData)
-{
- ASSERT(!image->isDirty());
-
- markLevelDirty(index.mipIndex);
-
- const TextureHelper11 *resource = nullptr;
- ANGLE_TRY(getResource(context, &resource));
- ASSERT(resource && resource->valid());
-
- UINT destSubresource = getSubresourceIndex(index);
-
- const gl::InternalFormat &internalFormatInfo =
- gl::GetInternalFormatInfo(image->getInternalFormat(), type);
-
- gl::Box levelBox(0, 0, 0, getLevelWidth(index.mipIndex), getLevelHeight(index.mipIndex),
- getLevelDepth(index.mipIndex));
- bool fullUpdate = (destBox == nullptr || *destBox == levelBox);
- ASSERT(internalFormatInfo.depthBits == 0 || fullUpdate);
-
- // TODO(jmadill): Handle compressed formats
- // Compressed formats have different load syntax, so we'll have to handle them with slightly
- // different logic. Will implemnent this in a follow-up patch, and ensure we do not use SetData
- // with compressed formats in the calling logic.
- ASSERT(!internalFormatInfo.compressed);
-
- const int imageWidth = static_cast<int>(image->getWidth());
- const int width = destBox ? destBox->width : imageWidth;
- const int imageHeight = static_cast<int>(image->getHeight());
- const int height = destBox ? destBox->height : imageHeight;
- const int imageDepth = static_cast<int>(image->getDepth());
- const int depth = destBox ? destBox->depth : imageDepth;
- if (imageWidth < width || imageHeight < height || imageDepth < depth)
- fullUpdate = true;
- GLuint srcRowPitch = 0;
- ANGLE_TRY_RESULT(
- internalFormatInfo.computeRowPitch(type, width, unpack.alignment, unpack.rowLength),
- srcRowPitch);
- GLuint srcDepthPitch = 0;
- ANGLE_TRY_RESULT(internalFormatInfo.computeDepthPitch(height, unpack.imageHeight, srcRowPitch),
- srcDepthPitch);
- GLuint srcSkipBytes = 0;
- ANGLE_TRY_RESULT(
- internalFormatInfo.computeSkipBytes(srcRowPitch, srcDepthPitch, unpack, index.is3D()),
- srcSkipBytes);
-
- const d3d11::Format &d3d11Format =
- d3d11::Format::Get(image->getInternalFormat(), mRenderer->getRenderer11DeviceCaps());
- const d3d11::DXGIFormatSize &dxgiFormatInfo =
- d3d11::GetDXGIFormatSizeInfo(d3d11Format.texFormat);
-
- const size_t outputPixelSize = dxgiFormatInfo.pixelBytes;
-
- UINT bufferRowPitch = static_cast<unsigned int>(outputPixelSize) * width;
- UINT bufferDepthPitch = bufferRowPitch * height;
-
- const size_t neededSize = bufferDepthPitch * depth;
- angle::MemoryBuffer *conversionBuffer = nullptr;
- const uint8_t *data = nullptr;
-
- LoadImageFunctionInfo loadFunctionInfo = d3d11Format.getLoadFunctions()(type);
- if (loadFunctionInfo.requiresConversion)
- {
- ANGLE_TRY(mRenderer->getScratchMemoryBuffer(neededSize, &conversionBuffer));
- loadFunctionInfo.loadFunction(width, height, depth, pixelData + srcSkipBytes, srcRowPitch,
- srcDepthPitch, conversionBuffer->data(), bufferRowPitch,
- bufferDepthPitch);
- data = conversionBuffer->data();
- }
- else
- {
- data = pixelData + srcSkipBytes;
- bufferRowPitch = srcRowPitch;
- bufferDepthPitch = srcDepthPitch;
- }
-
- ID3D11DeviceContext *immediateContext = mRenderer->getDeviceContext();
-
- if (!fullUpdate)
- {
- ASSERT(destBox);
-
- D3D11_BOX destD3DBox;
- destD3DBox.left = destBox->x;
- destD3DBox.right = destBox->x + destBox->width;
- destD3DBox.top = destBox->y;
- destD3DBox.bottom = destBox->y + destBox->height;
- destD3DBox.front = destBox->z;
- destD3DBox.back = destBox->z + destBox->depth;
-
- immediateContext->UpdateSubresource(resource->get(), destSubresource, &destD3DBox, data,
- bufferRowPitch, bufferDepthPitch);
- }
- else
- {
- immediateContext->UpdateSubresource(resource->get(), destSubresource, nullptr, data,
- bufferRowPitch, bufferDepthPitch);
- }
-
- return gl::NoError();
-}
-
-gl::ErrorOrResult<TextureStorage11::DropStencil> TextureStorage11::ensureDropStencilTexture(
- const gl::Context *context)
-{
- UNIMPLEMENTED();
- return gl::InternalError() << "Drop stencil texture not implemented.";
-}
-
-TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swapchain)
- : TextureStorage11(renderer,
- D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE,
- 0,
- swapchain->getRenderTargetInternalFormat()),
- mTexture(swapchain->getOffscreenTexture()),
- mLevelZeroTexture(),
- mLevelZeroRenderTarget(nullptr),
- mUseLevelZeroTexture(false),
- mSwizzleTexture()
-{
- for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
- {
- mAssociatedImages[i] = nullptr;
- mRenderTarget[i] = nullptr;
- }
-
- D3D11_TEXTURE2D_DESC texDesc;
- mTexture.getDesc(&texDesc);
- mMipLevels = texDesc.MipLevels;
- mTextureWidth = texDesc.Width;
- mTextureHeight = texDesc.Height;
- mTextureDepth = 1;
- mHasKeyedMutex = (texDesc.MiscFlags & D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX) != 0;
-}
-
-TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer,
- GLenum internalformat,
- bool renderTarget,
- GLsizei width,
- GLsizei height,
- int levels,
- bool hintLevelZeroOnly)
- : TextureStorage11(
- renderer,
- GetTextureBindFlags(internalformat, renderer->getRenderer11DeviceCaps(), renderTarget),
- GetTextureMiscFlags(internalformat,
- renderer->getRenderer11DeviceCaps(),
- renderTarget,
- levels),
- internalformat),
- mTexture(),
- mHasKeyedMutex(false),
- mLevelZeroTexture(),
- mLevelZeroRenderTarget(nullptr),
- mUseLevelZeroTexture(hintLevelZeroOnly && levels > 1),
- mSwizzleTexture()
-{
- for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
- {
- mAssociatedImages[i] = nullptr;
- mRenderTarget[i] = nullptr;
- }
-
- d3d11::MakeValidSize(false, mFormatInfo.texFormat, &width, &height, &mTopLevel);
- mMipLevels = mTopLevel + levels;
- mTextureWidth = width;
- mTextureHeight = height;
- mTextureDepth = 1;
-
- // The LevelZeroOnly hint should only be true if the zero max LOD workaround is active.
- ASSERT(!mUseLevelZeroTexture || mRenderer->getWorkarounds().zeroMaxLodWorkaround);
-}
-
-gl::Error TextureStorage11_2D::onDestroy(const gl::Context *context)
-{
- for (unsigned i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
- {
- if (mAssociatedImages[i] != nullptr)
- {
- mAssociatedImages[i]->verifyAssociatedStorageValid(this);
-
- // We must let the Images recover their data before we delete it from the
- // TextureStorage.
- ANGLE_TRY(mAssociatedImages[i]->recoverFromAssociatedStorage(context));
- }
- }
-
- if (mHasKeyedMutex)
- {
- // If the keyed mutex is released that will unbind it and cause the state cache to become
- // desynchronized.
- mRenderer->getStateManager()->invalidateBoundViews();
- }
-
- // Invalidate RenderTargets.
- InvalidateRenderTargetContainer(context, &mRenderTarget);
- InvalidateRenderTarget(context, mLevelZeroRenderTarget.get());
-
- return gl::NoError();
-}
-
-TextureStorage11_2D::~TextureStorage11_2D()
-{
-}
-
-gl::Error TextureStorage11_2D::copyToStorage(const gl::Context *context,
- TextureStorage *destStorage)
-{
- ASSERT(destStorage);
-
- TextureStorage11_2D *dest11 = GetAs<TextureStorage11_2D>(destStorage);
- ID3D11DeviceContext *immediateContext = mRenderer->getDeviceContext();
-
- if (mRenderer->getWorkarounds().zeroMaxLodWorkaround)
- {
- // If either mTexture or mLevelZeroTexture exist, then we need to copy them into the
- // corresponding textures in destStorage.
- if (mTexture.valid())
- {
- ANGLE_TRY(dest11->useLevelZeroWorkaroundTexture(context, false));
-
- const TextureHelper11 *destResource = nullptr;
- ANGLE_TRY(dest11->getResource(context, &destResource));
-
- immediateContext->CopyResource(destResource->get(), mTexture.get());
- }
-
- if (mLevelZeroTexture.valid())
- {
- ANGLE_TRY(dest11->useLevelZeroWorkaroundTexture(context, true));
-
- const TextureHelper11 *destResource = nullptr;
- ANGLE_TRY(dest11->getResource(context, &destResource));
-
- immediateContext->CopyResource(destResource->get(), mLevelZeroTexture.get());
- }
-
- return gl::NoError();
- }
-
- const TextureHelper11 *sourceResouce = nullptr;
- ANGLE_TRY(getResource(context, &sourceResouce));
-
- const TextureHelper11 *destResource = nullptr;
- ANGLE_TRY(dest11->getResource(context, &destResource));
-
- immediateContext->CopyResource(destResource->get(), sourceResouce->get());
- dest11->markDirty();
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2D::useLevelZeroWorkaroundTexture(const gl::Context *context,
- bool useLevelZeroTexture)
-{
- bool lastSetting = mUseLevelZeroTexture;
-
- if (useLevelZeroTexture && mMipLevels > 1)
- {
- if (!mUseLevelZeroTexture && mTexture.valid())
- {
- ANGLE_TRY(ensureTextureExists(1));
-
- // Pull data back from the mipped texture if necessary.
- ASSERT(mLevelZeroTexture.valid());
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- deviceContext->CopySubresourceRegion(mLevelZeroTexture.get(), 0, 0, 0, 0,
- mTexture.get(), 0, nullptr);
- }
-
- mUseLevelZeroTexture = true;
- }
- else
- {
- if (mUseLevelZeroTexture && mLevelZeroTexture.valid())
- {
- ANGLE_TRY(ensureTextureExists(mMipLevels));
-
- // Pull data back from the level zero texture if necessary.
- ASSERT(mTexture.valid());
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- deviceContext->CopySubresourceRegion(mTexture.get(), 0, 0, 0, 0,
- mLevelZeroTexture.get(), 0, nullptr);
- }
-
- mUseLevelZeroTexture = false;
- }
-
- if (lastSetting != mUseLevelZeroTexture)
- {
- // Mark everything as dirty to be conservative.
- if (mLevelZeroRenderTarget)
- {
- mLevelZeroRenderTarget->signalDirty(context);
- }
- for (auto &renderTarget : mRenderTarget)
- {
- if (renderTarget)
- {
- renderTarget->signalDirty(context);
- }
- }
- }
-
- return gl::NoError();
-}
-
-void TextureStorage11_2D::associateImage(Image11 *image, const gl::ImageIndex &index)
-{
- const GLint level = index.mipIndex;
-
- ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
-
- if (0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
- {
- mAssociatedImages[level] = image;
- }
-}
-
-void TextureStorage11_2D::verifyAssociatedImageValid(const gl::ImageIndex &index,
- Image11 *expectedImage)
-{
- const GLint level = index.mipIndex;
-
- ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- // This validation check should never return false. It means the Image/TextureStorage
- // association is broken.
- ASSERT(mAssociatedImages[level] == expectedImage);
-}
-
-// disassociateImage allows an Image to end its association with a Storage.
-void TextureStorage11_2D::disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage)
-{
- const GLint level = index.mipIndex;
-
- ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- ASSERT(mAssociatedImages[level] == expectedImage);
- mAssociatedImages[level] = nullptr;
-}
-
-// releaseAssociatedImage prepares the Storage for a new Image association. It lets the old Image
-// recover its data before ending the association.
-gl::Error TextureStorage11_2D::releaseAssociatedImage(const gl::Context *context,
- const gl::ImageIndex &index,
- Image11 *incomingImage)
-{
- const GLint level = index.mipIndex;
-
- ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
-
- if (0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
- {
- // No need to let the old Image recover its data, if it is also the incoming Image.
- if (mAssociatedImages[level] != nullptr && mAssociatedImages[level] != incomingImage)
- {
- // Ensure that the Image is still associated with this TextureStorage.
- mAssociatedImages[level]->verifyAssociatedStorageValid(this);
-
- // Force the image to recover from storage before its data is overwritten.
- // This will reset mAssociatedImages[level] to nullptr too.
- ANGLE_TRY(mAssociatedImages[level]->recoverFromAssociatedStorage(context));
- }
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2D::getResource(const gl::Context *context,
- const TextureHelper11 **outResource)
-{
- if (mUseLevelZeroTexture && mMipLevels > 1)
- {
- ANGLE_TRY(ensureTextureExists(1));
-
- *outResource = &mLevelZeroTexture;
- return gl::NoError();
- }
-
- ANGLE_TRY(ensureTextureExists(mMipLevels));
-
- *outResource = &mTexture;
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2D::getMippedResource(const gl::Context *context,
- const TextureHelper11 **outResource)
-{
- // This shouldn't be called unless the zero max LOD workaround is active.
- ASSERT(mRenderer->getWorkarounds().zeroMaxLodWorkaround);
-
- ANGLE_TRY(ensureTextureExists(mMipLevels));
-
- *outResource = &mTexture;
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2D::ensureTextureExists(int mipLevels)
-{
- // If mMipLevels = 1 then always use mTexture rather than mLevelZeroTexture.
- bool useLevelZeroTexture = mRenderer->getWorkarounds().zeroMaxLodWorkaround
- ? (mipLevels == 1) && (mMipLevels > 1)
- : false;
- TextureHelper11 *outputTexture = useLevelZeroTexture ? &mLevelZeroTexture : &mTexture;
-
- // if the width or height is not positive this should be treated as an incomplete texture
- // we handle that here by skipping the d3d texture creation
- if (!outputTexture->valid() && mTextureWidth > 0 && mTextureHeight > 0)
- {
- ASSERT(mipLevels > 0);
-
- D3D11_TEXTURE2D_DESC desc;
- desc.Width = mTextureWidth; // Compressed texture size constraints?
- desc.Height = mTextureHeight;
- desc.MipLevels = mipLevels;
- desc.ArraySize = 1;
- desc.Format = mFormatInfo.texFormat;
- desc.SampleDesc.Count = 1;
- desc.SampleDesc.Quality = 0;
- desc.Usage = D3D11_USAGE_DEFAULT;
- desc.BindFlags = getBindFlags();
- desc.CPUAccessFlags = 0;
- desc.MiscFlags = getMiscFlags();
-
- ANGLE_TRY(mRenderer->allocateTexture(desc, mFormatInfo, outputTexture));
- outputTexture->setDebugName("TexStorage2D.Texture");
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2D::getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT)
-{
- ASSERT(!index.hasLayer());
-
- const int level = index.mipIndex;
- ASSERT(level >= 0 && level < getLevelCount());
-
- // In GL ES 2.0, the application can only render to level zero of the texture (Section 4.4.3 of
- // the GLES 2.0 spec, page 113 of version 2.0.25). Other parts of TextureStorage11_2D could
- // create RTVs on non-zero levels of the texture (e.g. generateMipmap).
- // On Feature Level 9_3, this is unlikely to be useful. The renderer can't create SRVs on the
- // individual levels of the texture, so methods like generateMipmap can't do anything useful
- // with non-zero-level RTVs. Therefore if level > 0 on 9_3 then there's almost certainly
- // something wrong.
- ASSERT(
- !(mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3 && level > 0));
- ASSERT(outRT);
- if (mRenderTarget[level])
- {
- *outRT = mRenderTarget[level].get();
- return gl::NoError();
- }
-
- if (mRenderer->getWorkarounds().zeroMaxLodWorkaround)
- {
- ASSERT(index.mipIndex == 0);
- ANGLE_TRY(useLevelZeroWorkaroundTexture(context, true));
- }
-
- const TextureHelper11 *texture = nullptr;
- ANGLE_TRY(getResource(context, &texture));
-
- const d3d11::SharedSRV *srv = nullptr;
- ANGLE_TRY(getSRVLevel(context, level, false, &srv));
-
- const d3d11::SharedSRV *blitSRV = nullptr;
- ANGLE_TRY(getSRVLevel(context, level, true, &blitSRV));
-
- if (mUseLevelZeroTexture)
- {
- if (!mLevelZeroRenderTarget)
- {
- D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
- rtvDesc.Format = mFormatInfo.rtvFormat;
- rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
- rtvDesc.Texture2D.MipSlice = mTopLevel + level;
-
- d3d11::RenderTargetView rtv;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mLevelZeroTexture.get(), &rtv));
-
- mLevelZeroRenderTarget.reset(new TextureRenderTarget11(
- std::move(rtv), mLevelZeroTexture, d3d11::SharedSRV(), d3d11::SharedSRV(),
- mFormatInfo.internalFormat, getFormatSet(), getLevelWidth(level),
- getLevelHeight(level), 1, 0));
- }
-
- *outRT = mLevelZeroRenderTarget.get();
- return gl::NoError();
- }
-
- if (mFormatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN)
- {
- D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
- rtvDesc.Format = mFormatInfo.rtvFormat;
- rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
- rtvDesc.Texture2D.MipSlice = mTopLevel + level;
-
- d3d11::RenderTargetView rtv;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv));
-
- mRenderTarget[level].reset(new TextureRenderTarget11(
- std::move(rtv), *texture, *srv, *blitSRV, mFormatInfo.internalFormat, getFormatSet(),
- getLevelWidth(level), getLevelHeight(level), 1, 0));
-
- *outRT = mRenderTarget[level].get();
- return gl::NoError();
- }
-
- ASSERT(mFormatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN);
-
- D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
- dsvDesc.Format = mFormatInfo.dsvFormat;
- dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
- dsvDesc.Texture2D.MipSlice = mTopLevel + level;
- dsvDesc.Flags = 0;
-
- d3d11::DepthStencilView dsv;
- ANGLE_TRY(mRenderer->allocateResource(dsvDesc, texture->get(), &dsv));
-
- mRenderTarget[level].reset(new TextureRenderTarget11(
- std::move(dsv), *texture, *srv, mFormatInfo.internalFormat, getFormatSet(),
- getLevelWidth(level), getLevelHeight(level), 1, 0));
-
- *outRT = mRenderTarget[level].get();
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2D::createSRV(const gl::Context *context,
- int baseLevel,
- int mipLevels,
- DXGI_FORMAT format,
- const TextureHelper11 &texture,
- d3d11::SharedSRV *outSRV)
-{
- ASSERT(outSRV);
-
- D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
- srvDesc.Format = format;
- srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
- srvDesc.Texture2D.MostDetailedMip = mTopLevel + baseLevel;
- srvDesc.Texture2D.MipLevels = mipLevels;
-
- const TextureHelper11 *srvTexture = &texture;
-
- if (mRenderer->getWorkarounds().zeroMaxLodWorkaround)
- {
- ASSERT(mTopLevel == 0);
- ASSERT(baseLevel == 0);
- // This code also assumes that the incoming texture equals either mLevelZeroTexture or
- // mTexture.
-
- if (mipLevels == 1 && mMipLevels > 1)
- {
- // We must use a SRV on the level-zero-only texture.
- ANGLE_TRY(ensureTextureExists(1));
- srvTexture = &mLevelZeroTexture;
- }
- else
- {
- ASSERT(mipLevels == static_cast<int>(mMipLevels));
- ASSERT(mTexture.valid() && texture == mTexture);
- srvTexture = &mTexture;
- }
- }
-
- ANGLE_TRY(mRenderer->allocateResource(srvDesc, srvTexture->get(), outSRV));
- outSRV->setDebugName("TexStorage2D.SRV");
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2D::getSwizzleTexture(const TextureHelper11 **outTexture)
-{
- ASSERT(outTexture);
-
- if (!mSwizzleTexture.valid())
- {
- const auto &format = mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps());
-
- D3D11_TEXTURE2D_DESC desc;
- desc.Width = mTextureWidth;
- desc.Height = mTextureHeight;
- desc.MipLevels = mMipLevels;
- desc.ArraySize = 1;
- desc.Format = format.texFormat;
- desc.SampleDesc.Count = 1;
- desc.SampleDesc.Quality = 0;
- desc.Usage = D3D11_USAGE_DEFAULT;
- desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
- desc.CPUAccessFlags = 0;
- desc.MiscFlags = 0;
-
- ANGLE_TRY(mRenderer->allocateTexture(desc, format, &mSwizzleTexture));
- mSwizzleTexture.setDebugName("TexStorage2D.SwizzleTexture");
- }
-
- *outTexture = &mSwizzleTexture;
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2D::getSwizzleRenderTarget(int mipLevel,
- const d3d11::RenderTargetView **outRTV)
-{
- ASSERT(mipLevel >= 0 && mipLevel < getLevelCount());
- ASSERT(outRTV);
-
- if (!mSwizzleRenderTargets[mipLevel].valid())
- {
- const TextureHelper11 *swizzleTexture = nullptr;
- ANGLE_TRY(getSwizzleTexture(&swizzleTexture));
-
- D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
- rtvDesc.Format =
- mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()).rtvFormat;
- rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
- rtvDesc.Texture2D.MipSlice = mTopLevel + mipLevel;
-
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture.get(),
- &mSwizzleRenderTargets[mipLevel]));
- }
-
- *outRTV = &mSwizzleRenderTargets[mipLevel];
- return gl::NoError();
-}
-
-gl::ErrorOrResult<TextureStorage11::DropStencil> TextureStorage11_2D::ensureDropStencilTexture(
- const gl::Context *context)
-{
- if (mDropStencilTexture.valid())
- {
- return DropStencil::ALREADY_EXISTS;
- }
-
- D3D11_TEXTURE2D_DESC dropDesc = {};
- dropDesc.ArraySize = 1;
- dropDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_DEPTH_STENCIL;
- dropDesc.CPUAccessFlags = 0;
- dropDesc.Format = DXGI_FORMAT_R32_TYPELESS;
- dropDesc.Height = mTextureHeight;
- dropDesc.MipLevels = mMipLevels;
- dropDesc.MiscFlags = 0;
- dropDesc.SampleDesc.Count = 1;
- dropDesc.SampleDesc.Quality = 0;
- dropDesc.Usage = D3D11_USAGE_DEFAULT;
- dropDesc.Width = mTextureWidth;
-
- const auto &format =
- d3d11::Format::Get(GL_DEPTH_COMPONENT32F, mRenderer->getRenderer11DeviceCaps());
- ANGLE_TRY(mRenderer->allocateTexture(dropDesc, format, &mDropStencilTexture));
- mDropStencilTexture.setDebugName("TexStorage2D.DropStencil");
-
- ANGLE_TRY(initDropStencilTexture(context, gl::ImageIndexIterator::Make2D(0, mMipLevels)));
-
- return DropStencil::CREATED;
-}
-
-TextureStorage11_External::TextureStorage11_External(
- Renderer11 *renderer,
- egl::Stream *stream,
- const egl::Stream::GLTextureDescription &glDesc)
- : TextureStorage11(renderer, D3D11_BIND_SHADER_RESOURCE, 0, glDesc.internalFormat)
-{
- ASSERT(stream->getProducerType() == egl::Stream::ProducerType::D3D11TextureNV12);
- StreamProducerNV12 *producer = static_cast<StreamProducerNV12 *>(stream->getImplementation());
- mTexture.set(producer->getD3DTexture(), mFormatInfo);
- mSubresourceIndex = producer->getArraySlice();
- mTexture.get()->AddRef();
- mMipLevels = 1;
-
- D3D11_TEXTURE2D_DESC desc;
- mTexture.getDesc(&desc);
- mTextureWidth = desc.Width;
- mTextureHeight = desc.Height;
- mTextureDepth = 1;
- mHasKeyedMutex = (desc.MiscFlags & D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX) != 0;
-}
-
-gl::Error TextureStorage11_External::onDestroy(const gl::Context *context)
-{
- if (mHasKeyedMutex)
- {
- // If the keyed mutex is released that will unbind it and cause the state cache to become
- // desynchronized.
- mRenderer->getStateManager()->invalidateBoundViews();
- }
-
- return gl::NoError();
-}
-
-TextureStorage11_External::~TextureStorage11_External()
-{
-}
-
-gl::Error TextureStorage11_External::copyToStorage(const gl::Context *context,
- TextureStorage *destStorage)
-{
- UNIMPLEMENTED();
- return gl::NoError();
-}
-
-void TextureStorage11_External::associateImage(Image11 *image, const gl::ImageIndex &index)
-{
- ASSERT(index.mipIndex == 0);
- mAssociatedImage = image;
-}
-
-void TextureStorage11_External::verifyAssociatedImageValid(const gl::ImageIndex &index,
- Image11 *expectedImage)
-{
- ASSERT(index.mipIndex == 0 && mAssociatedImage == expectedImage);
-}
-
-void TextureStorage11_External::disassociateImage(const gl::ImageIndex &index,
- Image11 *expectedImage)
-{
- ASSERT(index.mipIndex == 0);
- ASSERT(mAssociatedImage == expectedImage);
- mAssociatedImage = nullptr;
-}
-
-gl::Error TextureStorage11_External::releaseAssociatedImage(const gl::Context *context,
- const gl::ImageIndex &index,
- Image11 *incomingImage)
-{
- ASSERT(index.mipIndex == 0);
-
- if (mAssociatedImage != nullptr && mAssociatedImage != incomingImage)
- {
- mAssociatedImage->verifyAssociatedStorageValid(this);
-
- ANGLE_TRY(mAssociatedImage->recoverFromAssociatedStorage(context));
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_External::getResource(const gl::Context *context,
- const TextureHelper11 **outResource)
-{
- *outResource = &mTexture;
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_External::getMippedResource(const gl::Context *context,
- const TextureHelper11 **outResource)
-{
- *outResource = &mTexture;
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_External::getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT)
-{
- // Render targets are not supported for external textures
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureStorage11_External::createSRV(const gl::Context *context,
- int baseLevel,
- int mipLevels,
- DXGI_FORMAT format,
- const TextureHelper11 &texture,
- d3d11::SharedSRV *outSRV)
-{
- // Since external textures are treates as non-mipmapped textures, we ignore mipmap levels and
- // use the specified subresource ID the storage was created with.
- ASSERT(mipLevels == 1);
- ASSERT(outSRV);
-
- D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
- srvDesc.Format = format;
- srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
- // subresource index is equal to the mip level for 2D textures
- srvDesc.Texture2DArray.MostDetailedMip = 0;
- srvDesc.Texture2DArray.MipLevels = 1;
- srvDesc.Texture2DArray.FirstArraySlice = mSubresourceIndex;
- srvDesc.Texture2DArray.ArraySize = 1;
-
- ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), outSRV));
- outSRV->setDebugName("TexStorage2D.SRV");
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_External::getSwizzleTexture(const TextureHelper11 **outTexture)
-{
- UNIMPLEMENTED();
- return gl::InternalError();
-}
-
-gl::Error TextureStorage11_External::getSwizzleRenderTarget(int mipLevel,
- const d3d11::RenderTargetView **outRTV)
-{
- UNIMPLEMENTED();
- return gl::InternalError();
-}
-
-TextureStorage11_EGLImage::TextureStorage11_EGLImage(Renderer11 *renderer,
- EGLImageD3D *eglImage,
- RenderTarget11 *renderTarget11)
- : TextureStorage11(renderer,
- D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE,
- 0,
- renderTarget11->getInternalFormat()),
- mImage(eglImage),
- mCurrentRenderTarget(0),
- mSwizzleTexture(),
- mSwizzleRenderTargets(gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
-{
- mCurrentRenderTarget = reinterpret_cast<uintptr_t>(renderTarget11);
-
- mMipLevels = 1;
- mTextureWidth = renderTarget11->getWidth();
- mTextureHeight = renderTarget11->getHeight();
- mTextureDepth = 1;
-}
-
-TextureStorage11_EGLImage::~TextureStorage11_EGLImage()
-{
-}
-
-gl::Error TextureStorage11_EGLImage::getResource(const gl::Context *context,
- const TextureHelper11 **outResource)
-{
- ANGLE_TRY(checkForUpdatedRenderTarget(context));
-
- RenderTarget11 *renderTarget11 = nullptr;
- ANGLE_TRY(getImageRenderTarget(context, &renderTarget11));
- *outResource = &renderTarget11->getTexture();
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_EGLImage::getSRV(const gl::Context *context,
- const gl::TextureState &textureState,
- const d3d11::SharedSRV **outSRV)
-{
- ANGLE_TRY(checkForUpdatedRenderTarget(context));
- return TextureStorage11::getSRV(context, textureState, outSRV);
-}
-
-gl::Error TextureStorage11_EGLImage::getMippedResource(const gl::Context *context,
- const TextureHelper11 **)
-{
- // This shouldn't be called unless the zero max LOD workaround is active.
- // EGL images are unavailable in this configuration.
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureStorage11_EGLImage::getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT)
-{
- ASSERT(!index.hasLayer());
- ASSERT(index.mipIndex == 0);
-
- ANGLE_TRY(checkForUpdatedRenderTarget(context));
-
- return mImage->getRenderTarget(context, outRT);
-}
-
-gl::Error TextureStorage11_EGLImage::copyToStorage(const gl::Context *context,
- TextureStorage *destStorage)
-{
- const TextureHelper11 *sourceResouce = nullptr;
- ANGLE_TRY(getResource(context, &sourceResouce));
-
- ASSERT(destStorage);
- TextureStorage11_2D *dest11 = GetAs<TextureStorage11_2D>(destStorage);
- const TextureHelper11 *destResource = nullptr;
- ANGLE_TRY(dest11->getResource(context, &destResource));
-
- ID3D11DeviceContext *immediateContext = mRenderer->getDeviceContext();
- immediateContext->CopyResource(destResource->get(), sourceResouce->get());
-
- dest11->markDirty();
-
- return gl::NoError();
-}
-
-void TextureStorage11_EGLImage::associateImage(Image11 *, const gl::ImageIndex &)
-{
-}
-
-void TextureStorage11_EGLImage::disassociateImage(const gl::ImageIndex &, Image11 *)
-{
-}
-
-void TextureStorage11_EGLImage::verifyAssociatedImageValid(const gl::ImageIndex &, Image11 *)
-{
-}
-
-gl::Error TextureStorage11_EGLImage::releaseAssociatedImage(const gl::Context *context,
- const gl::ImageIndex &,
- Image11 *)
-{
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_EGLImage::useLevelZeroWorkaroundTexture(const gl::Context *context, bool)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureStorage11_EGLImage::getSwizzleTexture(const TextureHelper11 **outTexture)
-{
- ASSERT(outTexture);
-
- if (!mSwizzleTexture.valid())
- {
- const auto &format = mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps());
-
- D3D11_TEXTURE2D_DESC desc;
- desc.Width = mTextureWidth;
- desc.Height = mTextureHeight;
- desc.MipLevels = mMipLevels;
- desc.ArraySize = 1;
- desc.Format = format.texFormat;
- desc.SampleDesc.Count = 1;
- desc.SampleDesc.Quality = 0;
- desc.Usage = D3D11_USAGE_DEFAULT;
- desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
- desc.CPUAccessFlags = 0;
- desc.MiscFlags = 0;
-
- ANGLE_TRY(mRenderer->allocateTexture(desc, format, &mSwizzleTexture));
- mSwizzleTexture.setDebugName("TexStorageEGLImage.SwizzleTexture");
- }
-
- *outTexture = &mSwizzleTexture;
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_EGLImage::getSwizzleRenderTarget(int mipLevel,
- const d3d11::RenderTargetView **outRTV)
-{
- ASSERT(mipLevel >= 0 && mipLevel < getLevelCount());
- ASSERT(outRTV);
-
- if (!mSwizzleRenderTargets[mipLevel].valid())
- {
- const TextureHelper11 *swizzleTexture = nullptr;
- ANGLE_TRY(getSwizzleTexture(&swizzleTexture));
-
- D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
- rtvDesc.Format =
- mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()).rtvFormat;
- rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
- rtvDesc.Texture2D.MipSlice = mTopLevel + mipLevel;
-
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture.get(),
- &mSwizzleRenderTargets[mipLevel]));
- }
-
- *outRTV = &mSwizzleRenderTargets[mipLevel];
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_EGLImage::checkForUpdatedRenderTarget(const gl::Context *context)
-{
- RenderTarget11 *renderTarget11 = nullptr;
- ANGLE_TRY(getImageRenderTarget(context, &renderTarget11));
-
- if (mCurrentRenderTarget != reinterpret_cast<uintptr_t>(renderTarget11))
- {
- clearSRVCache();
- mCurrentRenderTarget = reinterpret_cast<uintptr_t>(renderTarget11);
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_EGLImage::createSRV(const gl::Context *context,
- int baseLevel,
- int mipLevels,
- DXGI_FORMAT format,
- const TextureHelper11 &texture,
- d3d11::SharedSRV *outSRV)
-{
- ASSERT(baseLevel == 0);
- ASSERT(mipLevels == 1);
- ASSERT(outSRV);
-
- // Create a new SRV only for the swizzle texture. Otherwise just return the Image's
- // RenderTarget's SRV.
- if (texture == mSwizzleTexture)
- {
- D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
- srvDesc.Format = format;
- srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
- srvDesc.Texture2D.MostDetailedMip = mTopLevel + baseLevel;
- srvDesc.Texture2D.MipLevels = mipLevels;
-
- ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), outSRV));
- outSRV->setDebugName("TexStorageEGLImage.SRV");
- }
- else
- {
- RenderTarget11 *renderTarget = nullptr;
- ANGLE_TRY(getImageRenderTarget(context, &renderTarget));
-
- ASSERT(texture == renderTarget->getTexture());
-
- *outSRV = renderTarget->getShaderResourceView().makeCopy();
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_EGLImage::getImageRenderTarget(const gl::Context *context,
- RenderTarget11 **outRT) const
-{
- RenderTargetD3D *renderTargetD3D = nullptr;
- ANGLE_TRY(mImage->getRenderTarget(context, &renderTargetD3D));
- *outRT = GetAs<RenderTarget11>(renderTargetD3D);
- return gl::NoError();
-}
-
-TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer,
- GLenum internalformat,
- bool renderTarget,
- int size,
- int levels,
- bool hintLevelZeroOnly)
- : TextureStorage11(
- renderer,
- GetTextureBindFlags(internalformat, renderer->getRenderer11DeviceCaps(), renderTarget),
- GetTextureMiscFlags(internalformat,
- renderer->getRenderer11DeviceCaps(),
- renderTarget,
- levels),
- internalformat),
- mTexture(),
- mLevelZeroTexture(),
- mUseLevelZeroTexture(hintLevelZeroOnly && levels > 1),
- mSwizzleTexture()
-{
- for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
- {
- for (unsigned int face = 0; face < gl::CUBE_FACE_COUNT; face++)
- {
- mAssociatedImages[face][level] = nullptr;
- mRenderTarget[face][level] = nullptr;
- }
- }
-
- for (unsigned int face = 0; face < gl::CUBE_FACE_COUNT; face++)
- {
- mLevelZeroRenderTarget[face] = nullptr;
- }
-
- // adjust size if needed for compressed textures
- int height = size;
- d3d11::MakeValidSize(false, mFormatInfo.texFormat, &size, &height, &mTopLevel);
-
- mMipLevels = mTopLevel + levels;
- mTextureWidth = size;
- mTextureHeight = size;
- mTextureDepth = 1;
-
- // The LevelZeroOnly hint should only be true if the zero max LOD workaround is active.
- ASSERT(!mUseLevelZeroTexture || mRenderer->getWorkarounds().zeroMaxLodWorkaround);
-}
-
-gl::Error TextureStorage11_Cube::onDestroy(const gl::Context *context)
-{
- for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
- {
- for (unsigned int face = 0; face < gl::CUBE_FACE_COUNT; face++)
- {
- if (mAssociatedImages[face][level] != nullptr)
- {
- mAssociatedImages[face][level]->verifyAssociatedStorageValid(this);
-
- // We must let the Images recover their data before we delete it from the
- // TextureStorage.
- ANGLE_TRY(mAssociatedImages[face][level]->recoverFromAssociatedStorage(context));
- }
- }
- }
-
- for (auto &faceRenderTargets : mRenderTarget)
- {
- InvalidateRenderTargetContainer(context, &faceRenderTargets);
- }
- InvalidateRenderTargetContainer(context, &mLevelZeroRenderTarget);
-
- return gl::NoError();
-}
-
-TextureStorage11_Cube::~TextureStorage11_Cube()
-{
-}
-
-UINT TextureStorage11_Cube::getSubresourceIndex(const gl::ImageIndex &index) const
-{
- if (mRenderer->getWorkarounds().zeroMaxLodWorkaround && mUseLevelZeroTexture &&
- index.mipIndex == 0)
- {
- UINT arraySlice = static_cast<UINT>(index.hasLayer() ? index.layerIndex : 0);
- UINT subresource = D3D11CalcSubresource(0, arraySlice, 1);
- ASSERT(subresource != std::numeric_limits<UINT>::max());
- return subresource;
- }
- else
- {
- UINT mipSlice = static_cast<UINT>(index.mipIndex + mTopLevel);
- UINT arraySlice = static_cast<UINT>(index.hasLayer() ? index.layerIndex : 0);
- UINT subresource = D3D11CalcSubresource(mipSlice, arraySlice, mMipLevels);
- ASSERT(subresource != std::numeric_limits<UINT>::max());
- return subresource;
- }
-}
-
-gl::Error TextureStorage11_Cube::copyToStorage(const gl::Context *context,
- TextureStorage *destStorage)
-{
- ASSERT(destStorage);
-
- TextureStorage11_Cube *dest11 = GetAs<TextureStorage11_Cube>(destStorage);
-
- if (mRenderer->getWorkarounds().zeroMaxLodWorkaround)
- {
- ID3D11DeviceContext *immediateContext = mRenderer->getDeviceContext();
-
- // If either mTexture or mLevelZeroTexture exist, then we need to copy them into the
- // corresponding textures in destStorage.
- if (mTexture.valid())
- {
- ANGLE_TRY(dest11->useLevelZeroWorkaroundTexture(context, false));
-
- const TextureHelper11 *destResource = nullptr;
- ANGLE_TRY(dest11->getResource(context, &destResource));
-
- immediateContext->CopyResource(destResource->get(), mTexture.get());
- }
-
- if (mLevelZeroTexture.valid())
- {
- ANGLE_TRY(dest11->useLevelZeroWorkaroundTexture(context, true));
-
- const TextureHelper11 *destResource = nullptr;
- ANGLE_TRY(dest11->getResource(context, &destResource));
-
- immediateContext->CopyResource(destResource->get(), mLevelZeroTexture.get());
- }
- }
- else
- {
- const TextureHelper11 *sourceResouce = nullptr;
- ANGLE_TRY(getResource(context, &sourceResouce));
-
- const TextureHelper11 *destResource = nullptr;
- ANGLE_TRY(dest11->getResource(context, &destResource));
-
- ID3D11DeviceContext *immediateContext = mRenderer->getDeviceContext();
- immediateContext->CopyResource(destResource->get(), sourceResouce->get());
- }
-
- dest11->markDirty();
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_Cube::useLevelZeroWorkaroundTexture(const gl::Context *context,
- bool useLevelZeroTexture)
-{
- if (useLevelZeroTexture && mMipLevels > 1)
- {
- if (!mUseLevelZeroTexture && mTexture.valid())
- {
- ANGLE_TRY(ensureTextureExists(1));
-
- // Pull data back from the mipped texture if necessary.
- ASSERT(mLevelZeroTexture.valid());
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- for (int face = 0; face < 6; face++)
- {
- deviceContext->CopySubresourceRegion(mLevelZeroTexture.get(),
- D3D11CalcSubresource(0, face, 1), 0, 0, 0,
- mTexture.get(), face * mMipLevels, nullptr);
- }
- }
-
- mUseLevelZeroTexture = true;
- }
- else
- {
- if (mUseLevelZeroTexture && mLevelZeroTexture.valid())
- {
- ANGLE_TRY(ensureTextureExists(mMipLevels));
-
- // Pull data back from the level zero texture if necessary.
- ASSERT(mTexture.valid());
- ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
-
- for (int face = 0; face < 6; face++)
- {
- deviceContext->CopySubresourceRegion(mTexture.get(),
- D3D11CalcSubresource(0, face, mMipLevels), 0,
- 0, 0, mLevelZeroTexture.get(), face, nullptr);
- }
- }
-
- mUseLevelZeroTexture = false;
- }
-
- return gl::NoError();
-}
-
-void TextureStorage11_Cube::associateImage(Image11 *image, const gl::ImageIndex &index)
-{
- const GLint level = index.mipIndex;
- const GLint layerTarget = index.layerIndex;
-
- ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- ASSERT(0 <= layerTarget && layerTarget < static_cast<GLint>(gl::CUBE_FACE_COUNT));
-
- if (0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
- {
- if (0 <= layerTarget && layerTarget < static_cast<GLint>(gl::CUBE_FACE_COUNT))
- {
- mAssociatedImages[layerTarget][level] = image;
- }
- }
-}
-
-void TextureStorage11_Cube::verifyAssociatedImageValid(const gl::ImageIndex &index,
- Image11 *expectedImage)
-{
- const GLint level = index.mipIndex;
- const GLint layerTarget = index.layerIndex;
-
- ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- ASSERT(0 <= layerTarget && layerTarget < static_cast<GLint>(gl::CUBE_FACE_COUNT));
- // This validation check should never return false. It means the Image/TextureStorage
- // association is broken.
- ASSERT(mAssociatedImages[layerTarget][level] == expectedImage);
-}
-
-// disassociateImage allows an Image to end its association with a Storage.
-void TextureStorage11_Cube::disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage)
-{
- const GLint level = index.mipIndex;
- const GLint layerTarget = index.layerIndex;
-
- ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- ASSERT(0 <= layerTarget && layerTarget < static_cast<GLint>(gl::CUBE_FACE_COUNT));
- ASSERT(mAssociatedImages[layerTarget][level] == expectedImage);
- mAssociatedImages[layerTarget][level] = nullptr;
-}
-
-// releaseAssociatedImage prepares the Storage for a new Image association. It lets the old Image
-// recover its data before ending the association.
-gl::Error TextureStorage11_Cube::releaseAssociatedImage(const gl::Context *context,
- const gl::ImageIndex &index,
- Image11 *incomingImage)
-{
- const GLint level = index.mipIndex;
- const GLint layerTarget = index.layerIndex;
-
- ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- ASSERT(0 <= layerTarget && layerTarget < static_cast<GLint>(gl::CUBE_FACE_COUNT));
-
- if ((0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS))
- {
- if (0 <= layerTarget && layerTarget < static_cast<GLint>(gl::CUBE_FACE_COUNT))
- {
- // No need to let the old Image recover its data, if it is also the incoming Image.
- if (mAssociatedImages[layerTarget][level] != nullptr &&
- mAssociatedImages[layerTarget][level] != incomingImage)
- {
- // Ensure that the Image is still associated with this TextureStorage.
- mAssociatedImages[layerTarget][level]->verifyAssociatedStorageValid(this);
-
- // Force the image to recover from storage before its data is overwritten.
- // This will reset mAssociatedImages[level] to nullptr too.
- ANGLE_TRY(
- mAssociatedImages[layerTarget][level]->recoverFromAssociatedStorage(context));
- }
- }
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_Cube::getResource(const gl::Context *context,
- const TextureHelper11 **outResource)
-{
- if (mUseLevelZeroTexture && mMipLevels > 1)
- {
- ANGLE_TRY(ensureTextureExists(1));
- *outResource = &mLevelZeroTexture;
- return gl::NoError();
- }
- else
- {
- ANGLE_TRY(ensureTextureExists(mMipLevels));
- *outResource = &mTexture;
- return gl::NoError();
- }
-}
-
-gl::Error TextureStorage11_Cube::getMippedResource(const gl::Context *context,
- const TextureHelper11 **outResource)
-{
- // This shouldn't be called unless the zero max LOD workaround is active.
- ASSERT(mRenderer->getWorkarounds().zeroMaxLodWorkaround);
-
- ANGLE_TRY(ensureTextureExists(mMipLevels));
- *outResource = &mTexture;
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_Cube::ensureTextureExists(int mipLevels)
-{
- // If mMipLevels = 1 then always use mTexture rather than mLevelZeroTexture.
- bool useLevelZeroTexture = mRenderer->getWorkarounds().zeroMaxLodWorkaround
- ? (mipLevels == 1) && (mMipLevels > 1)
- : false;
- TextureHelper11 *outputTexture = useLevelZeroTexture ? &mLevelZeroTexture : &mTexture;
-
- // if the size is not positive this should be treated as an incomplete texture
- // we handle that here by skipping the d3d texture creation
- if (!outputTexture->valid() && mTextureWidth > 0 && mTextureHeight > 0)
- {
- ASSERT(mMipLevels > 0);
-
- D3D11_TEXTURE2D_DESC desc;
- desc.Width = mTextureWidth;
- desc.Height = mTextureHeight;
- desc.MipLevels = mipLevels;
- desc.ArraySize = gl::CUBE_FACE_COUNT;
- desc.Format = mFormatInfo.texFormat;
- desc.SampleDesc.Count = 1;
- desc.SampleDesc.Quality = 0;
- desc.Usage = D3D11_USAGE_DEFAULT;
- desc.BindFlags = getBindFlags();
- desc.CPUAccessFlags = 0;
- desc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE | getMiscFlags();
-
- ANGLE_TRY(mRenderer->allocateTexture(desc, mFormatInfo, outputTexture));
- outputTexture->setDebugName("TexStorageCube.Texture");
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_Cube::createRenderTargetSRV(const TextureHelper11 &texture,
- const gl::ImageIndex &index,
- DXGI_FORMAT resourceFormat,
- d3d11::SharedSRV *srv) const
-{
- D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
- srvDesc.Format = resourceFormat;
- srvDesc.Texture2DArray.MostDetailedMip = mTopLevel + index.mipIndex;
- srvDesc.Texture2DArray.MipLevels = 1;
- srvDesc.Texture2DArray.FirstArraySlice = index.layerIndex;
- srvDesc.Texture2DArray.ArraySize = 1;
-
- if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_10_0)
- {
- srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
- }
- else
- {
- // Will be used with Texture2D sampler, not TextureCube
- srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
- }
-
- ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), srv));
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_Cube::getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT)
-{
- const int faceIndex = index.layerIndex;
- const int level = index.mipIndex;
-
- ASSERT(level >= 0 && level < getLevelCount());
- ASSERT(faceIndex >= 0 && faceIndex < static_cast<GLint>(gl::CUBE_FACE_COUNT));
-
- if (!mRenderTarget[faceIndex][level])
- {
- if (mRenderer->getWorkarounds().zeroMaxLodWorkaround)
- {
- ASSERT(index.mipIndex == 0);
- ANGLE_TRY(useLevelZeroWorkaroundTexture(context, true));
- }
-
- const TextureHelper11 *texture = nullptr;
- ANGLE_TRY(getResource(context, &texture));
-
- if (mUseLevelZeroTexture)
- {
- if (!mLevelZeroRenderTarget[faceIndex])
- {
- D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
- rtvDesc.Format = mFormatInfo.rtvFormat;
- rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
- rtvDesc.Texture2DArray.MipSlice = mTopLevel + level;
- rtvDesc.Texture2DArray.FirstArraySlice = faceIndex;
- rtvDesc.Texture2DArray.ArraySize = 1;
-
- d3d11::RenderTargetView rtv;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mLevelZeroTexture.get(), &rtv));
-
- mLevelZeroRenderTarget[faceIndex].reset(new TextureRenderTarget11(
- std::move(rtv), mLevelZeroTexture, d3d11::SharedSRV(), d3d11::SharedSRV(),
- mFormatInfo.internalFormat, getFormatSet(), getLevelWidth(level),
- getLevelHeight(level), 1, 0));
- }
-
- ASSERT(outRT);
- *outRT = mLevelZeroRenderTarget[faceIndex].get();
- return gl::NoError();
- }
-
- d3d11::SharedSRV srv;
- ANGLE_TRY(createRenderTargetSRV(*texture, index, mFormatInfo.srvFormat, &srv));
- d3d11::SharedSRV blitSRV;
- if (mFormatInfo.blitSRVFormat != mFormatInfo.srvFormat)
- {
- ANGLE_TRY(createRenderTargetSRV(*texture, index, mFormatInfo.blitSRVFormat, &blitSRV));
- }
- else
- {
- blitSRV = srv.makeCopy();
- }
-
- srv.setDebugName("TexStorageCube.RenderTargetSRV");
-
- if (mFormatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN)
- {
- D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
- rtvDesc.Format = mFormatInfo.rtvFormat;
- rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
- rtvDesc.Texture2DArray.MipSlice = mTopLevel + level;
- rtvDesc.Texture2DArray.FirstArraySlice = faceIndex;
- rtvDesc.Texture2DArray.ArraySize = 1;
-
- d3d11::RenderTargetView rtv;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv));
- rtv.setDebugName("TexStorageCube.RenderTargetRTV");
-
- mRenderTarget[faceIndex][level].reset(new TextureRenderTarget11(
- std::move(rtv), *texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
- getLevelWidth(level), getLevelHeight(level), 1, 0));
- }
- else if (mFormatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN)
- {
- D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
- dsvDesc.Format = mFormatInfo.dsvFormat;
- dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY;
- dsvDesc.Flags = 0;
- dsvDesc.Texture2DArray.MipSlice = mTopLevel + level;
- dsvDesc.Texture2DArray.FirstArraySlice = faceIndex;
- dsvDesc.Texture2DArray.ArraySize = 1;
-
- d3d11::DepthStencilView dsv;
- ANGLE_TRY(mRenderer->allocateResource(dsvDesc, texture->get(), &dsv));
- dsv.setDebugName("TexStorageCube.RenderTargetDSV");
-
- mRenderTarget[faceIndex][level].reset(new TextureRenderTarget11(
- std::move(dsv), *texture, srv, mFormatInfo.internalFormat, getFormatSet(),
- getLevelWidth(level), getLevelHeight(level), 1, 0));
- }
- else
- {
- UNREACHABLE();
- }
- }
-
- ASSERT(outRT);
- *outRT = mRenderTarget[faceIndex][level].get();
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_Cube::createSRV(const gl::Context *context,
- int baseLevel,
- int mipLevels,
- DXGI_FORMAT format,
- const TextureHelper11 &texture,
- d3d11::SharedSRV *outSRV)
-{
- ASSERT(outSRV);
-
- D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
- srvDesc.Format = format;
-
- // Unnormalized integer cube maps are not supported by DX11; we emulate them as an array of six
- // 2D textures
- const GLenum componentType = d3d11::GetComponentType(format);
- if (componentType == GL_INT || componentType == GL_UNSIGNED_INT)
- {
- srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
- srvDesc.Texture2DArray.MostDetailedMip = mTopLevel + baseLevel;
- srvDesc.Texture2DArray.MipLevels = mipLevels;
- srvDesc.Texture2DArray.FirstArraySlice = 0;
- srvDesc.Texture2DArray.ArraySize = gl::CUBE_FACE_COUNT;
- }
- else
- {
- srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
- srvDesc.TextureCube.MipLevels = mipLevels;
- srvDesc.TextureCube.MostDetailedMip = mTopLevel + baseLevel;
- }
-
- const TextureHelper11 *srvTexture = &texture;
-
- if (mRenderer->getWorkarounds().zeroMaxLodWorkaround)
- {
- ASSERT(mTopLevel == 0);
- ASSERT(baseLevel == 0);
- // This code also assumes that the incoming texture equals either mLevelZeroTexture or
- // mTexture.
-
- if (mipLevels == 1 && mMipLevels > 1)
- {
- // We must use a SRV on the level-zero-only texture.
- ANGLE_TRY(ensureTextureExists(1));
- srvTexture = &mLevelZeroTexture;
- }
- else
- {
- ASSERT(mipLevels == static_cast<int>(mMipLevels));
- ASSERT(mTexture.valid() && texture == mTexture);
- srvTexture = &mTexture;
- }
- }
-
- ANGLE_TRY(mRenderer->allocateResource(srvDesc, srvTexture->get(), outSRV));
- outSRV->setDebugName("TexStorageCube.SRV");
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_Cube::getSwizzleTexture(const TextureHelper11 **outTexture)
-{
- ASSERT(outTexture);
-
- if (!mSwizzleTexture.valid())
- {
- const auto &format = mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps());
-
- D3D11_TEXTURE2D_DESC desc;
- desc.Width = mTextureWidth;
- desc.Height = mTextureHeight;
- desc.MipLevels = mMipLevels;
- desc.ArraySize = gl::CUBE_FACE_COUNT;
- desc.Format = format.texFormat;
- desc.SampleDesc.Count = 1;
- desc.SampleDesc.Quality = 0;
- desc.Usage = D3D11_USAGE_DEFAULT;
- desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
- desc.CPUAccessFlags = 0;
- desc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE;
-
- ANGLE_TRY(mRenderer->allocateTexture(desc, format, &mSwizzleTexture));
- mSwizzleTexture.setDebugName("TexStorageCube.SwizzleTexture");
- }
-
- *outTexture = &mSwizzleTexture;
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_Cube::getSwizzleRenderTarget(int mipLevel,
- const d3d11::RenderTargetView **outRTV)
-{
- ASSERT(mipLevel >= 0 && mipLevel < getLevelCount());
- ASSERT(outRTV);
-
- if (!mSwizzleRenderTargets[mipLevel].valid())
- {
- const TextureHelper11 *swizzleTexture = nullptr;
- ANGLE_TRY(getSwizzleTexture(&swizzleTexture));
-
- D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
- rtvDesc.Format =
- mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()).rtvFormat;
- rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
- rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel;
- rtvDesc.Texture2DArray.FirstArraySlice = 0;
- rtvDesc.Texture2DArray.ArraySize = gl::CUBE_FACE_COUNT;
-
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture.get(),
- &mSwizzleRenderTargets[mipLevel]));
- }
-
- *outRTV = &mSwizzleRenderTargets[mipLevel];
- return gl::NoError();
-}
-
-gl::Error TextureStorage11::initDropStencilTexture(const gl::Context *context,
- const gl::ImageIndexIterator &it)
-{
- const TextureHelper11 *sourceTexture = nullptr;
- ANGLE_TRY(getResource(context, &sourceTexture));
-
- gl::ImageIndexIterator itCopy = it;
-
- while (itCopy.hasNext())
- {
- gl::ImageIndex index = itCopy.next();
- gl::Box wholeArea(0, 0, 0, getLevelWidth(index.mipIndex), getLevelHeight(index.mipIndex),
- 1);
- gl::Extents wholeSize(wholeArea.width, wholeArea.height, 1);
- UINT subresource = getSubresourceIndex(index);
- ANGLE_TRY(mRenderer->getBlitter()->copyDepthStencil(
- *sourceTexture, subresource, wholeArea, wholeSize, mDropStencilTexture, subresource,
- wholeArea, wholeSize, nullptr));
- }
-
- return gl::NoError();
-}
-
-gl::ErrorOrResult<TextureStorage11::DropStencil> TextureStorage11_Cube::ensureDropStencilTexture(
- const gl::Context *context)
-{
- if (mDropStencilTexture.valid())
- {
- return DropStencil::ALREADY_EXISTS;
- }
-
- D3D11_TEXTURE2D_DESC dropDesc = {};
- dropDesc.ArraySize = 6;
- dropDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_DEPTH_STENCIL;
- dropDesc.CPUAccessFlags = 0;
- dropDesc.Format = DXGI_FORMAT_R32_TYPELESS;
- dropDesc.Height = mTextureHeight;
- dropDesc.MipLevels = mMipLevels;
- dropDesc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE;
- dropDesc.SampleDesc.Count = 1;
- dropDesc.SampleDesc.Quality = 0;
- dropDesc.Usage = D3D11_USAGE_DEFAULT;
- dropDesc.Width = mTextureWidth;
-
- const auto &format =
- d3d11::Format::Get(GL_DEPTH_COMPONENT32F, mRenderer->getRenderer11DeviceCaps());
- ANGLE_TRY(mRenderer->allocateTexture(dropDesc, format, &mDropStencilTexture));
- mDropStencilTexture.setDebugName("TexStorageCube.DropStencil");
-
- ANGLE_TRY(initDropStencilTexture(context, gl::ImageIndexIterator::MakeCube(0, mMipLevels)));
-
- return DropStencil::CREATED;
-}
-
-TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer,
- GLenum internalformat,
- bool renderTarget,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- int levels)
- : TextureStorage11(
- renderer,
- GetTextureBindFlags(internalformat, renderer->getRenderer11DeviceCaps(), renderTarget),
- GetTextureMiscFlags(internalformat,
- renderer->getRenderer11DeviceCaps(),
- renderTarget,
- levels),
- internalformat)
-{
- for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
- {
- mAssociatedImages[i] = nullptr;
- mLevelRenderTargets[i] = nullptr;
- }
-
- // adjust size if needed for compressed textures
- d3d11::MakeValidSize(false, mFormatInfo.texFormat, &width, &height, &mTopLevel);
-
- mMipLevels = mTopLevel + levels;
- mTextureWidth = width;
- mTextureHeight = height;
- mTextureDepth = depth;
-}
-
-gl::Error TextureStorage11_3D::onDestroy(const gl::Context *context)
-{
- for (unsigned i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
- {
- if (mAssociatedImages[i] != nullptr)
- {
- mAssociatedImages[i]->verifyAssociatedStorageValid(this);
-
- // We must let the Images recover their data before we delete it from the
- // TextureStorage.
- ANGLE_TRY(mAssociatedImages[i]->recoverFromAssociatedStorage(context));
- }
- }
-
- InvalidateRenderTargetContainer(context, &mLevelRenderTargets);
- InvalidateRenderTargetContainer(context, &mLevelLayerRenderTargets);
-
- return gl::NoError();
-}
-
-TextureStorage11_3D::~TextureStorage11_3D()
-{
-}
-
-void TextureStorage11_3D::associateImage(Image11 *image, const gl::ImageIndex &index)
-{
- const GLint level = index.mipIndex;
-
- ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
-
- if (0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
- {
- mAssociatedImages[level] = image;
- }
-}
-
-void TextureStorage11_3D::verifyAssociatedImageValid(const gl::ImageIndex &index,
- Image11 *expectedImage)
-{
- const GLint level = index.mipIndex;
-
- ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- // This validation check should never return false. It means the Image/TextureStorage
- // association is broken.
- ASSERT(mAssociatedImages[level] == expectedImage);
-}
-
-// disassociateImage allows an Image to end its association with a Storage.
-void TextureStorage11_3D::disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage)
-{
- const GLint level = index.mipIndex;
-
- ASSERT(0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- ASSERT(mAssociatedImages[level] == expectedImage);
- mAssociatedImages[level] = nullptr;
-}
-
-// releaseAssociatedImage prepares the Storage for a new Image association. It lets the old Image
-// recover its data before ending the association.
-gl::Error TextureStorage11_3D::releaseAssociatedImage(const gl::Context *context,
- const gl::ImageIndex &index,
- Image11 *incomingImage)
-{
- const GLint level = index.mipIndex;
-
- ASSERT((0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS));
-
- if (0 <= level && level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
- {
- // No need to let the old Image recover its data, if it is also the incoming Image.
- if (mAssociatedImages[level] != nullptr && mAssociatedImages[level] != incomingImage)
- {
- // Ensure that the Image is still associated with this TextureStorage.
- mAssociatedImages[level]->verifyAssociatedStorageValid(this);
-
- // Force the image to recover from storage before its data is overwritten.
- // This will reset mAssociatedImages[level] to nullptr too.
- ANGLE_TRY(mAssociatedImages[level]->recoverFromAssociatedStorage(context));
- }
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_3D::getResource(const gl::Context *context,
- const TextureHelper11 **outResource)
-{
- // If the width, height or depth are not positive this should be treated as an incomplete
- // texture. We handle that here by skipping the d3d texture creation.
- if (!mTexture.valid() && mTextureWidth > 0 && mTextureHeight > 0 && mTextureDepth > 0)
- {
- ASSERT(mMipLevels > 0);
-
- D3D11_TEXTURE3D_DESC desc;
- desc.Width = mTextureWidth;
- desc.Height = mTextureHeight;
- desc.Depth = mTextureDepth;
- desc.MipLevels = mMipLevels;
- desc.Format = mFormatInfo.texFormat;
- desc.Usage = D3D11_USAGE_DEFAULT;
- desc.BindFlags = getBindFlags();
- desc.CPUAccessFlags = 0;
- desc.MiscFlags = getMiscFlags();
-
- ANGLE_TRY(mRenderer->allocateTexture(desc, mFormatInfo, &mTexture));
- mTexture.setDebugName("TexStorage3D.Texture");
- }
-
- *outResource = &mTexture;
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_3D::createSRV(const gl::Context *context,
- int baseLevel,
- int mipLevels,
- DXGI_FORMAT format,
- const TextureHelper11 &texture,
- d3d11::SharedSRV *outSRV)
-{
- ASSERT(outSRV);
-
- D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
- srvDesc.Format = format;
- srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D;
- srvDesc.Texture3D.MostDetailedMip = baseLevel;
- srvDesc.Texture3D.MipLevels = mipLevels;
-
- ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), outSRV));
- outSRV->setDebugName("TexStorage3D.SRV");
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_3D::getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT)
-{
- const int mipLevel = index.mipIndex;
- ASSERT(mipLevel >= 0 && mipLevel < getLevelCount());
-
- ASSERT(mFormatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN);
-
- if (!index.hasLayer())
- {
- if (!mLevelRenderTargets[mipLevel])
- {
- const TextureHelper11 *texture = nullptr;
- ANGLE_TRY(getResource(context, &texture));
-
- const d3d11::SharedSRV *srv = nullptr;
- ANGLE_TRY(getSRVLevel(context, mipLevel, false, &srv));
-
- const d3d11::SharedSRV *blitSRV = nullptr;
- ANGLE_TRY(getSRVLevel(context, mipLevel, true, &blitSRV));
-
- D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
- rtvDesc.Format = mFormatInfo.rtvFormat;
- rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
- rtvDesc.Texture3D.MipSlice = mTopLevel + mipLevel;
- rtvDesc.Texture3D.FirstWSlice = 0;
- rtvDesc.Texture3D.WSize = static_cast<UINT>(-1);
-
- d3d11::RenderTargetView rtv;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv));
- rtv.setDebugName("TexStorage3D.RTV");
-
- mLevelRenderTargets[mipLevel].reset(new TextureRenderTarget11(
- std::move(rtv), *texture, *srv, *blitSRV, mFormatInfo.internalFormat,
- getFormatSet(), getLevelWidth(mipLevel), getLevelHeight(mipLevel),
- getLevelDepth(mipLevel), 0));
- }
-
- ASSERT(outRT);
- *outRT = mLevelRenderTargets[mipLevel].get();
- return gl::NoError();
- }
-
- const int layer = index.layerIndex;
-
- LevelLayerKey key(mipLevel, layer);
- if (mLevelLayerRenderTargets.find(key) == mLevelLayerRenderTargets.end())
- {
- const TextureHelper11 *texture = nullptr;
- ANGLE_TRY(getResource(context, &texture));
-
- // TODO, what kind of SRV is expected here?
- const d3d11::SharedSRV srv;
- const d3d11::SharedSRV blitSRV;
-
- D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
- rtvDesc.Format = mFormatInfo.rtvFormat;
- rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
- rtvDesc.Texture3D.MipSlice = mTopLevel + mipLevel;
- rtvDesc.Texture3D.FirstWSlice = layer;
- rtvDesc.Texture3D.WSize = 1;
-
- d3d11::RenderTargetView rtv;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv));
- rtv.setDebugName("TexStorage3D.LayerRTV");
-
- mLevelLayerRenderTargets[key].reset(new TextureRenderTarget11(
- std::move(rtv), *texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
- getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0));
- }
-
- ASSERT(outRT);
- *outRT = mLevelLayerRenderTargets[key].get();
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_3D::getSwizzleTexture(const TextureHelper11 **outTexture)
-{
- ASSERT(outTexture);
-
- if (!mSwizzleTexture.valid())
- {
- const auto &format = mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps());
-
- D3D11_TEXTURE3D_DESC desc;
- desc.Width = mTextureWidth;
- desc.Height = mTextureHeight;
- desc.Depth = mTextureDepth;
- desc.MipLevels = mMipLevels;
- desc.Format = format.texFormat;
- desc.Usage = D3D11_USAGE_DEFAULT;
- desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
- desc.CPUAccessFlags = 0;
- desc.MiscFlags = 0;
-
- ANGLE_TRY(mRenderer->allocateTexture(desc, format, &mSwizzleTexture));
- mSwizzleTexture.setDebugName("TexStorage3D.SwizzleTexture");
- }
-
- *outTexture = &mSwizzleTexture;
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_3D::getSwizzleRenderTarget(int mipLevel,
- const d3d11::RenderTargetView **outRTV)
-{
- ASSERT(mipLevel >= 0 && mipLevel < getLevelCount());
- ASSERT(outRTV);
-
- if (!mSwizzleRenderTargets[mipLevel].valid())
- {
- const TextureHelper11 *swizzleTexture = nullptr;
- ANGLE_TRY(getSwizzleTexture(&swizzleTexture));
-
- D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
- rtvDesc.Format =
- mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()).rtvFormat;
- rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
- rtvDesc.Texture3D.MipSlice = mTopLevel + mipLevel;
- rtvDesc.Texture3D.FirstWSlice = 0;
- rtvDesc.Texture3D.WSize = static_cast<UINT>(-1);
-
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture.get(),
- &mSwizzleRenderTargets[mipLevel]));
- mSwizzleRenderTargets[mipLevel].setDebugName("TexStorage3D.SwizzleRTV");
- }
-
- *outRTV = &mSwizzleRenderTargets[mipLevel];
- return gl::NoError();
-}
-
-TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer,
- GLenum internalformat,
- bool renderTarget,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- int levels)
- : TextureStorage11(
- renderer,
- GetTextureBindFlags(internalformat, renderer->getRenderer11DeviceCaps(), renderTarget),
- GetTextureMiscFlags(internalformat,
- renderer->getRenderer11DeviceCaps(),
- renderTarget,
- levels),
- internalformat)
-{
- // adjust size if needed for compressed textures
- d3d11::MakeValidSize(false, mFormatInfo.texFormat, &width, &height, &mTopLevel);
-
- mMipLevels = mTopLevel + levels;
- mTextureWidth = width;
- mTextureHeight = height;
- mTextureDepth = depth;
-}
-
-gl::Error TextureStorage11_2DArray::onDestroy(const gl::Context *context)
-{
- for (auto iter : mAssociatedImages)
- {
- if (iter.second)
- {
- iter.second->verifyAssociatedStorageValid(this);
-
- // We must let the Images recover their data before we delete it from the
- // TextureStorage.
- ANGLE_TRY(iter.second->recoverFromAssociatedStorage(context));
- }
- }
- mAssociatedImages.clear();
-
- InvalidateRenderTargetContainer(context, &mRenderTargets);
-
- return gl::NoError();
-}
-
-TextureStorage11_2DArray::~TextureStorage11_2DArray()
-{
-}
-
-void TextureStorage11_2DArray::associateImage(Image11 *image, const gl::ImageIndex &index)
-{
- const GLint level = index.mipIndex;
- const GLint layerTarget = index.layerIndex;
- const GLint numLayers = index.numLayers;
-
- ASSERT(0 <= level && level < getLevelCount());
-
- if (0 <= level && level < getLevelCount())
- {
- LevelLayerRangeKey key(level, layerTarget, numLayers);
- mAssociatedImages[key] = image;
- }
-}
-
-void TextureStorage11_2DArray::verifyAssociatedImageValid(const gl::ImageIndex &index,
- Image11 *expectedImage)
-{
- const GLint level = index.mipIndex;
- const GLint layerTarget = index.layerIndex;
- const GLint numLayers = index.numLayers;
-
- LevelLayerRangeKey key(level, layerTarget, numLayers);
-
- // This validation check should never return false. It means the Image/TextureStorage
- // association is broken.
- bool retValue = (mAssociatedImages.find(key) != mAssociatedImages.end() &&
- (mAssociatedImages[key] == expectedImage));
- ASSERT(retValue);
-}
-
-// disassociateImage allows an Image to end its association with a Storage.
-void TextureStorage11_2DArray::disassociateImage(const gl::ImageIndex &index,
- Image11 *expectedImage)
-{
- const GLint level = index.mipIndex;
- const GLint layerTarget = index.layerIndex;
- const GLint numLayers = index.numLayers;
-
- LevelLayerRangeKey key(level, layerTarget, numLayers);
-
- bool imageAssociationCorrect = (mAssociatedImages.find(key) != mAssociatedImages.end() &&
- (mAssociatedImages[key] == expectedImage));
- ASSERT(imageAssociationCorrect);
- mAssociatedImages[key] = nullptr;
-}
-
-// releaseAssociatedImage prepares the Storage for a new Image association. It lets the old Image
-// recover its data before ending the association.
-gl::Error TextureStorage11_2DArray::releaseAssociatedImage(const gl::Context *context,
- const gl::ImageIndex &index,
- Image11 *incomingImage)
-{
- const GLint level = index.mipIndex;
- const GLint layerTarget = index.layerIndex;
- const GLint numLayers = index.numLayers;
-
- LevelLayerRangeKey key(level, layerTarget, numLayers);
-
- if (mAssociatedImages.find(key) != mAssociatedImages.end())
- {
- if (mAssociatedImages[key] != nullptr && mAssociatedImages[key] != incomingImage)
- {
- // Ensure that the Image is still associated with this TextureStorage.
- mAssociatedImages[key]->verifyAssociatedStorageValid(this);
-
- // Force the image to recover from storage before its data is overwritten.
- // This will reset mAssociatedImages[level] to nullptr too.
- ANGLE_TRY(mAssociatedImages[key]->recoverFromAssociatedStorage(context));
- }
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2DArray::getResource(const gl::Context *context,
- const TextureHelper11 **outResource)
-{
- // if the width, height or depth is not positive this should be treated as an incomplete texture
- // we handle that here by skipping the d3d texture creation
- if (!mTexture.valid() && mTextureWidth > 0 && mTextureHeight > 0 && mTextureDepth > 0)
- {
- ASSERT(mMipLevels > 0);
-
- D3D11_TEXTURE2D_DESC desc;
- desc.Width = mTextureWidth;
- desc.Height = mTextureHeight;
- desc.MipLevels = mMipLevels;
- desc.ArraySize = mTextureDepth;
- desc.Format = mFormatInfo.texFormat;
- desc.SampleDesc.Count = 1;
- desc.SampleDesc.Quality = 0;
- desc.Usage = D3D11_USAGE_DEFAULT;
- desc.BindFlags = getBindFlags();
- desc.CPUAccessFlags = 0;
- desc.MiscFlags = getMiscFlags();
-
- ANGLE_TRY(mRenderer->allocateTexture(desc, mFormatInfo, &mTexture));
- mTexture.setDebugName("TexStorage2DArray.Texture");
- }
-
- *outResource = &mTexture;
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2DArray::createSRV(const gl::Context *context,
- int baseLevel,
- int mipLevels,
- DXGI_FORMAT format,
- const TextureHelper11 &texture,
- d3d11::SharedSRV *outSRV)
-{
- D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
- srvDesc.Format = format;
- srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
- srvDesc.Texture2DArray.MostDetailedMip = mTopLevel + baseLevel;
- srvDesc.Texture2DArray.MipLevels = mipLevels;
- srvDesc.Texture2DArray.FirstArraySlice = 0;
- srvDesc.Texture2DArray.ArraySize = mTextureDepth;
-
- ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), outSRV));
- outSRV->setDebugName("TexStorage2DArray.SRV");
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2DArray::createRenderTargetSRV(const TextureHelper11 &texture,
- const gl::ImageIndex &index,
- DXGI_FORMAT resourceFormat,
- d3d11::SharedSRV *srv) const
-{
- D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
- srvDesc.Format = resourceFormat;
- srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
- srvDesc.Texture2DArray.MostDetailedMip = mTopLevel + index.mipIndex;
- srvDesc.Texture2DArray.MipLevels = 1;
- srvDesc.Texture2DArray.FirstArraySlice = index.layerIndex;
- srvDesc.Texture2DArray.ArraySize = index.numLayers;
-
- ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), srv));
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT)
-{
- ASSERT(index.hasLayer());
-
- const int mipLevel = index.mipIndex;
- const int layer = index.layerIndex;
- const int numLayers = index.numLayers;
-
- ASSERT(mipLevel >= 0 && mipLevel < getLevelCount());
-
- LevelLayerRangeKey key(mipLevel, layer, numLayers);
- if (mRenderTargets.find(key) == mRenderTargets.end())
- {
- const TextureHelper11 *texture = nullptr;
- ANGLE_TRY(getResource(context, &texture));
- d3d11::SharedSRV srv;
- ANGLE_TRY(createRenderTargetSRV(*texture, index, mFormatInfo.srvFormat, &srv));
- d3d11::SharedSRV blitSRV;
- if (mFormatInfo.blitSRVFormat != mFormatInfo.srvFormat)
- {
- ANGLE_TRY(createRenderTargetSRV(*texture, index, mFormatInfo.blitSRVFormat, &blitSRV));
- }
- else
- {
- blitSRV = srv.makeCopy();
- }
-
- srv.setDebugName("TexStorage2DArray.RenderTargetSRV");
-
- if (mFormatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN)
- {
- D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
- rtvDesc.Format = mFormatInfo.rtvFormat;
- rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
- rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel;
- rtvDesc.Texture2DArray.FirstArraySlice = layer;
- rtvDesc.Texture2DArray.ArraySize = numLayers;
-
- d3d11::RenderTargetView rtv;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv));
- rtv.setDebugName("TexStorage2DArray.RenderTargetRTV");
-
- mRenderTargets[key].reset(new TextureRenderTarget11(
- std::move(rtv), *texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
- getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0));
- }
- else
- {
- ASSERT(mFormatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN);
-
- D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
- dsvDesc.Format = mFormatInfo.dsvFormat;
- dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY;
- dsvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel;
- dsvDesc.Texture2DArray.FirstArraySlice = layer;
- dsvDesc.Texture2DArray.ArraySize = numLayers;
- dsvDesc.Flags = 0;
-
- d3d11::DepthStencilView dsv;
- ANGLE_TRY(mRenderer->allocateResource(dsvDesc, texture->get(), &dsv));
- dsv.setDebugName("TexStorage2DArray.RenderTargetDSV");
-
- mRenderTargets[key].reset(new TextureRenderTarget11(
- std::move(dsv), *texture, srv, mFormatInfo.internalFormat, getFormatSet(),
- getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0));
- }
- }
-
- ASSERT(outRT);
- *outRT = mRenderTargets[key].get();
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2DArray::getSwizzleTexture(const TextureHelper11 **outTexture)
-{
- if (!mSwizzleTexture.valid())
- {
- const auto &format = mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps());
-
- D3D11_TEXTURE2D_DESC desc;
- desc.Width = mTextureWidth;
- desc.Height = mTextureHeight;
- desc.MipLevels = mMipLevels;
- desc.ArraySize = mTextureDepth;
- desc.Format = format.texFormat;
- desc.SampleDesc.Count = 1;
- desc.SampleDesc.Quality = 0;
- desc.Usage = D3D11_USAGE_DEFAULT;
- desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
- desc.CPUAccessFlags = 0;
- desc.MiscFlags = 0;
-
- ANGLE_TRY(mRenderer->allocateTexture(desc, format, &mSwizzleTexture));
- mSwizzleTexture.setDebugName("TexStorage2DArray.SwizzleTexture");
- }
-
- *outTexture = &mSwizzleTexture;
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2DArray::getSwizzleRenderTarget(int mipLevel,
- const d3d11::RenderTargetView **outRTV)
-{
- ASSERT(mipLevel >= 0 && mipLevel < getLevelCount());
- ASSERT(outRTV);
-
- if (!mSwizzleRenderTargets[mipLevel].valid())
- {
- const TextureHelper11 *swizzleTexture = nullptr;
- ANGLE_TRY(getSwizzleTexture(&swizzleTexture));
-
- D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
- rtvDesc.Format =
- mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()).rtvFormat;
- rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
- rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel;
- rtvDesc.Texture2DArray.FirstArraySlice = 0;
- rtvDesc.Texture2DArray.ArraySize = mTextureDepth;
-
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture.get(),
- &mSwizzleRenderTargets[mipLevel]));
- }
-
- *outRTV = &mSwizzleRenderTargets[mipLevel];
- return gl::NoError();
-}
-
-gl::ErrorOrResult<TextureStorage11::DropStencil> TextureStorage11_2DArray::ensureDropStencilTexture(
- const gl::Context *context)
-{
- if (mDropStencilTexture.valid())
- {
- return DropStencil::ALREADY_EXISTS;
- }
-
- D3D11_TEXTURE2D_DESC dropDesc = {};
- dropDesc.ArraySize = mTextureDepth;
- dropDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_DEPTH_STENCIL;
- dropDesc.CPUAccessFlags = 0;
- dropDesc.Format = DXGI_FORMAT_R32_TYPELESS;
- dropDesc.Height = mTextureHeight;
- dropDesc.MipLevels = mMipLevels;
- dropDesc.MiscFlags = 0;
- dropDesc.SampleDesc.Count = 1;
- dropDesc.SampleDesc.Quality = 0;
- dropDesc.Usage = D3D11_USAGE_DEFAULT;
- dropDesc.Width = mTextureWidth;
-
- const auto &format =
- d3d11::Format::Get(GL_DEPTH_COMPONENT32F, mRenderer->getRenderer11DeviceCaps());
- ANGLE_TRY(mRenderer->allocateTexture(dropDesc, format, &mDropStencilTexture));
- mDropStencilTexture.setDebugName("TexStorage2DArray.DropStencil");
-
- std::vector<GLsizei> layerCounts(mMipLevels, mTextureDepth);
-
- ANGLE_TRY(initDropStencilTexture(
- context, gl::ImageIndexIterator::Make2DArray(0, mMipLevels, layerCounts.data())));
-
- return DropStencil::CREATED;
-}
-
-TextureStorage11_2DMultisample::TextureStorage11_2DMultisample(Renderer11 *renderer,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- int levels,
- int samples,
- bool fixedSampleLocations)
- : TextureStorage11(
- renderer,
- GetTextureBindFlags(internalformat, renderer->getRenderer11DeviceCaps(), true),
- GetTextureMiscFlags(internalformat, renderer->getRenderer11DeviceCaps(), true, levels),
- internalformat),
- mTexture(),
- mRenderTarget(nullptr)
-{
- // adjust size if needed for compressed textures
- d3d11::MakeValidSize(false, mFormatInfo.texFormat, &width, &height, &mTopLevel);
-
- mMipLevels = 1;
- mTextureWidth = width;
- mTextureHeight = height;
- mTextureDepth = 1;
- mSamples = samples;
- mFixedSampleLocations = fixedSampleLocations;
-}
-
-gl::Error TextureStorage11_2DMultisample::onDestroy(const gl::Context *context)
-{
- InvalidateRenderTarget(context, mRenderTarget.get());
- mRenderTarget.reset();
- return gl::NoError();
-}
-
-TextureStorage11_2DMultisample::~TextureStorage11_2DMultisample()
-{
-}
-
-gl::Error TextureStorage11_2DMultisample::copyToStorage(const gl::Context *context,
- TextureStorage *destStorage)
-{
- UNIMPLEMENTED();
- return gl::InternalError() << "copyToStorage is unimplemented";
-}
-
-void TextureStorage11_2DMultisample::associateImage(Image11 *image, const gl::ImageIndex &index)
-{
-}
-
-void TextureStorage11_2DMultisample::verifyAssociatedImageValid(const gl::ImageIndex &index,
- Image11 *expectedImage)
-{
-}
-
-void TextureStorage11_2DMultisample::disassociateImage(const gl::ImageIndex &index,
- Image11 *expectedImage)
-{
-}
-
-gl::Error TextureStorage11_2DMultisample::releaseAssociatedImage(const gl::Context *context,
- const gl::ImageIndex &index,
- Image11 *incomingImage)
-{
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2DMultisample::getResource(const gl::Context *context,
- const TextureHelper11 **outResource)
-{
- ANGLE_TRY(ensureTextureExists(1));
-
- *outResource = &mTexture;
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2DMultisample::ensureTextureExists(int mipLevels)
-{
- // For Multisampled textures, mipLevels always equals 1.
- ASSERT(mipLevels == 1);
-
- // if the width or height is not positive this should be treated as an incomplete texture
- // we handle that here by skipping the d3d texture creation
- if (!mTexture.valid() && mTextureWidth > 0 && mTextureHeight > 0)
- {
- D3D11_TEXTURE2D_DESC desc;
- ZeroMemory(&desc, sizeof(desc));
- desc.Width = mTextureWidth; // Compressed texture size constraints?
- desc.Height = mTextureHeight;
- desc.MipLevels = mipLevels;
- desc.ArraySize = 1;
- desc.Format = mFormatInfo.texFormat;
- desc.Usage = D3D11_USAGE_DEFAULT;
- desc.BindFlags = getBindFlags();
- desc.CPUAccessFlags = 0;
- desc.MiscFlags = getMiscFlags();
-
- const gl::TextureCaps &textureCaps =
- mRenderer->getNativeTextureCaps().get(mFormatInfo.internalFormat);
- GLuint supportedSamples = textureCaps.getNearestSamples(mSamples);
- desc.SampleDesc.Count = (supportedSamples == 0) ? 1 : supportedSamples;
- desc.SampleDesc.Quality = static_cast<UINT>(D3D11_STANDARD_MULTISAMPLE_PATTERN);
-
- ANGLE_TRY(mRenderer->allocateTexture(desc, mFormatInfo, &mTexture));
- mTexture.setDebugName("TexStorage2DMS.Texture");
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2DMultisample::getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT)
-{
- ASSERT(!index.hasLayer());
-
- const int level = index.mipIndex;
- ASSERT(level == 0);
-
- ASSERT(outRT);
- if (mRenderTarget)
- {
- *outRT = mRenderTarget.get();
- return gl::NoError();
- }
-
- const TextureHelper11 *texture = nullptr;
- ANGLE_TRY(getResource(context, &texture));
-
- const d3d11::SharedSRV *srv = nullptr;
- ANGLE_TRY(getSRVLevel(context, level, false, &srv));
-
- const d3d11::SharedSRV *blitSRV = nullptr;
- ANGLE_TRY(getSRVLevel(context, level, true, &blitSRV));
-
- if (mFormatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN)
- {
- D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
- rtvDesc.Format = mFormatInfo.rtvFormat;
- rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMS;
-
- d3d11::RenderTargetView rtv;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv));
-
- mRenderTarget.reset(new TextureRenderTarget11(
- std::move(rtv), *texture, *srv, *blitSRV, mFormatInfo.internalFormat, getFormatSet(),
- getLevelWidth(level), getLevelHeight(level), 1, mSamples));
-
- *outRT = mRenderTarget.get();
- return gl::NoError();
- }
-
- ASSERT(mFormatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN);
-
- D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
- dsvDesc.Format = mFormatInfo.dsvFormat;
- dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS;
- dsvDesc.Flags = 0;
-
- d3d11::DepthStencilView dsv;
- ANGLE_TRY(mRenderer->allocateResource(dsvDesc, texture->get(), &dsv));
-
- mRenderTarget.reset(new TextureRenderTarget11(
- std::move(dsv), *texture, *srv, mFormatInfo.internalFormat, getFormatSet(),
- getLevelWidth(level), getLevelHeight(level), 1, mSamples));
-
- *outRT = mRenderTarget.get();
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2DMultisample::createSRV(const gl::Context *context,
- int baseLevel,
- int mipLevels,
- DXGI_FORMAT format,
- const TextureHelper11 &texture,
- d3d11::SharedSRV *outSRV)
-{
- ASSERT(outSRV);
-
- D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
- srvDesc.Format = format;
- srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DMS;
-
- ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), outSRV));
- outSRV->setDebugName("TexStorage2DMS.SRV");
- return gl::NoError();
-}
-
-gl::Error TextureStorage11_2DMultisample::getSwizzleTexture(const TextureHelper11 **outTexture)
-{
- UNIMPLEMENTED();
- return gl::InternalError() << "getSwizzleTexture is unimplemented.";
-}
-
-gl::Error TextureStorage11_2DMultisample::getSwizzleRenderTarget(
- int mipLevel,
- const d3d11::RenderTargetView **outRTV)
-{
- UNIMPLEMENTED();
- return gl::InternalError() << "getSwizzleRenderTarget is unimplemented.";
-}
-
-gl::ErrorOrResult<TextureStorage11::DropStencil>
-TextureStorage11_2DMultisample::ensureDropStencilTexture(const gl::Context *context)
-{
- UNIMPLEMENTED();
- return gl::InternalError() << "Drop stencil texture not implemented.";
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h
deleted file mode 100644
index 336aa495a8..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h
+++ /dev/null
@@ -1,589 +0,0 @@
-//
-// Copyright (c) 2012-2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// TextureStorage11.h: Defines the abstract rx::TextureStorage11 class and its concrete derived
-// classes TextureStorage11_2D and TextureStorage11_Cube, which act as the interface to the D3D11 texture.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_
-
-#include "libANGLE/Error.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/renderer/d3d/TextureStorage.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h"
-
-#include <array>
-#include <map>
-
-namespace gl
-{
-struct ImageIndex;
-}
-
-namespace rx
-{
-class EGLImageD3D;
-class RenderTargetD3D;
-class RenderTarget11;
-class Renderer11;
-class SwapChain11;
-class Image11;
-struct Renderer11DeviceCaps;
-
-template <typename T>
-using TexLevelArray = std::array<T, gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS>;
-
-template <typename T>
-using CubeFaceArray = std::array<T, gl::CUBE_FACE_COUNT>;
-
-class TextureStorage11 : public TextureStorage
-{
- public:
- ~TextureStorage11() override;
-
- static DWORD GetTextureBindFlags(GLenum internalFormat, const Renderer11DeviceCaps &renderer11DeviceCaps, bool renderTarget);
- static DWORD GetTextureMiscFlags(GLenum internalFormat, const Renderer11DeviceCaps &renderer11DeviceCaps, bool renderTarget, int levels);
-
- UINT getBindFlags() const;
- UINT getMiscFlags() const;
- const d3d11::Format &getFormatSet() const;
- gl::Error getSRVLevels(const gl::Context *context,
- GLint baseLevel,
- GLint maxLevel,
- const d3d11::SharedSRV **outSRV);
- gl::Error generateSwizzles(const gl::Context *context, const gl::SwizzleState &swizzleTarget);
- void markLevelDirty(int mipLevel);
- void markDirty();
-
- gl::Error updateSubresourceLevel(const gl::Context *context,
- const TextureHelper11 &texture,
- unsigned int sourceSubresource,
- const gl::ImageIndex &index,
- const gl::Box &copyArea);
-
- gl::Error copySubresourceLevel(const gl::Context *context,
- const TextureHelper11 &dstTexture,
- unsigned int dstSubresource,
- const gl::ImageIndex &index,
- const gl::Box &region);
-
- // TextureStorage virtual functions
- int getTopLevel() const override;
- bool isRenderTarget() const override;
- bool isManaged() const override;
- bool supportsNativeMipmapFunction() const override;
- int getLevelCount() const override;
- gl::Error generateMipmap(const gl::Context *context,
- const gl::ImageIndex &sourceIndex,
- const gl::ImageIndex &destIndex) override;
- gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
- gl::Error setData(const gl::Context *context,
- const gl::ImageIndex &index,
- ImageD3D *image,
- const gl::Box *destBox,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixelData) override;
-
- virtual gl::Error getSRV(const gl::Context *context,
- const gl::TextureState &textureState,
- const d3d11::SharedSRV **outSRV);
- virtual UINT getSubresourceIndex(const gl::ImageIndex &index) const;
- virtual gl::Error getResource(const gl::Context *context,
- const TextureHelper11 **outResource) = 0;
- virtual void associateImage(Image11* image, const gl::ImageIndex &index) = 0;
- virtual void disassociateImage(const gl::ImageIndex &index, Image11* expectedImage) = 0;
- virtual void verifyAssociatedImageValid(const gl::ImageIndex &index,
- Image11 *expectedImage) = 0;
- virtual gl::Error releaseAssociatedImage(const gl::Context *context,
- const gl::ImageIndex &index,
- Image11 *incomingImage) = 0;
-
- protected:
- TextureStorage11(Renderer11 *renderer, UINT bindFlags, UINT miscFlags, GLenum internalFormat);
- int getLevelWidth(int mipLevel) const;
- int getLevelHeight(int mipLevel) const;
- int getLevelDepth(int mipLevel) const;
-
- // Some classes (e.g. TextureStorage11_2D) will override getMippedResource.
- virtual gl::Error getMippedResource(const gl::Context *context,
- const TextureHelper11 **outResource);
-
- virtual gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) = 0;
- virtual gl::Error getSwizzleRenderTarget(int mipLevel,
- const d3d11::RenderTargetView **outRTV) = 0;
- gl::Error getSRVLevel(const gl::Context *context,
- int mipLevel,
- bool blitSRV,
- const d3d11::SharedSRV **outSRV);
-
- // Get a version of a depth texture with only depth information, not stencil.
- enum DropStencil
- {
- CREATED,
- ALREADY_EXISTS
- };
- virtual gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context);
- gl::Error initDropStencilTexture(const gl::Context *context, const gl::ImageIndexIterator &it);
-
- // The baseLevel parameter should *not* have mTopLevel applied.
- virtual gl::Error createSRV(const gl::Context *context,
- int baseLevel,
- int mipLevels,
- DXGI_FORMAT format,
- const TextureHelper11 &texture,
- d3d11::SharedSRV *outSRV) = 0;
-
- void verifySwizzleExists(const gl::SwizzleState &swizzleState);
-
- // Clear all cached non-swizzle SRVs and invalidate the swizzle cache.
- void clearSRVCache();
-
- Renderer11 *mRenderer;
- int mTopLevel;
- unsigned int mMipLevels;
-
- const d3d11::Format &mFormatInfo;
- unsigned int mTextureWidth;
- unsigned int mTextureHeight;
- unsigned int mTextureDepth;
-
- TexLevelArray<gl::SwizzleState> mSwizzleCache;
- TextureHelper11 mDropStencilTexture;
-
- private:
- const UINT mBindFlags;
- const UINT mMiscFlags;
-
- struct SRVKey
- {
- SRVKey(int baseLevel, int mipLevels, bool swizzle, bool dropStencil);
-
- bool operator<(const SRVKey &rhs) const;
-
- int baseLevel = 0; // Without mTopLevel applied.
- int mipLevels = 0;
- bool swizzle = false;
- bool dropStencil = false;
- };
- typedef std::map<SRVKey, d3d11::SharedSRV> SRVCache;
-
- gl::Error getCachedOrCreateSRV(const gl::Context *context,
- const SRVKey &key,
- const d3d11::SharedSRV **outSRV);
-
- SRVCache mSrvCache;
- TexLevelArray<d3d11::SharedSRV> mLevelSRVs;
- TexLevelArray<d3d11::SharedSRV> mLevelBlitSRVs;
-};
-
-class TextureStorage11_2D : public TextureStorage11
-{
- public:
- TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swapchain);
- TextureStorage11_2D(Renderer11 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels, bool hintLevelZeroOnly = false);
- ~TextureStorage11_2D() override;
-
- gl::Error onDestroy(const gl::Context *context) override;
-
- gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override;
- gl::Error getMippedResource(const gl::Context *context,
- const TextureHelper11 **outResource) override;
- gl::Error getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT) override;
-
- gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
-
- void associateImage(Image11 *image, const gl::ImageIndex &index) override;
- void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
- void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
- gl::Error releaseAssociatedImage(const gl::Context *context,
- const gl::ImageIndex &index,
- Image11 *incomingImage) override;
-
- gl::Error useLevelZeroWorkaroundTexture(const gl::Context *context,
- bool useLevelZeroTexture) override;
-
- protected:
- gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
- gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
-
- gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override;
-
- gl::Error ensureTextureExists(int mipLevels);
-
- private:
- gl::Error createSRV(const gl::Context *context,
- int baseLevel,
- int mipLevels,
- DXGI_FORMAT format,
- const TextureHelper11 &texture,
- d3d11::SharedSRV *outSRV) override;
-
- TextureHelper11 mTexture;
- TexLevelArray<std::unique_ptr<RenderTarget11>> mRenderTarget;
- bool mHasKeyedMutex;
-
- // These are members related to the zero max-LOD workaround.
- // D3D11 Feature Level 9_3 can't disable mipmaps on a mipmapped texture (i.e. solely sample from level zero).
- // These members are used to work around this limitation.
- // Usually only mTexture XOR mLevelZeroTexture will exist.
- // For example, if an app creates a texture with only one level, then 9_3 will only create mLevelZeroTexture.
- // However, in some scenarios, both textures have to be created. This incurs additional memory overhead.
- // One example of this is an application that creates a texture, calls glGenerateMipmap, and then disables mipmaps on the texture.
- // A more likely example is an app that creates an empty texture, renders to it, and then calls glGenerateMipmap
- // TODO: In this rendering scenario, release the mLevelZeroTexture after mTexture has been created to save memory.
- TextureHelper11 mLevelZeroTexture;
- std::unique_ptr<RenderTarget11> mLevelZeroRenderTarget;
- bool mUseLevelZeroTexture;
-
- // Swizzle-related variables
- TextureHelper11 mSwizzleTexture;
- TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets;
-
- TexLevelArray<Image11 *> mAssociatedImages;
-};
-
-class TextureStorage11_External : public TextureStorage11
-{
- public:
- TextureStorage11_External(Renderer11 *renderer,
- egl::Stream *stream,
- const egl::Stream::GLTextureDescription &glDesc);
- ~TextureStorage11_External() override;
-
- gl::Error onDestroy(const gl::Context *context) override;
-
- gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override;
- gl::Error getMippedResource(const gl::Context *context,
- const TextureHelper11 **outResource) override;
- gl::Error getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT) override;
-
- gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
-
- void associateImage(Image11 *image, const gl::ImageIndex &index) override;
- void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
- void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
- gl::Error releaseAssociatedImage(const gl::Context *context,
- const gl::ImageIndex &index,
- Image11 *incomingImage) override;
-
- protected:
- gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
- gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
-
- private:
- gl::Error createSRV(const gl::Context *context,
- int baseLevel,
- int mipLevels,
- DXGI_FORMAT format,
- const TextureHelper11 &texture,
- d3d11::SharedSRV *outSRV) override;
-
- TextureHelper11 mTexture;
- int mSubresourceIndex;
- bool mHasKeyedMutex;
-
- Image11 *mAssociatedImage;
-};
-
-class TextureStorage11_EGLImage final : public TextureStorage11
-{
- public:
- TextureStorage11_EGLImage(Renderer11 *renderer,
- EGLImageD3D *eglImage,
- RenderTarget11 *renderTarget11);
- ~TextureStorage11_EGLImage() override;
-
- gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override;
- gl::Error getSRV(const gl::Context *context,
- const gl::TextureState &textureState,
- const d3d11::SharedSRV **outSRV) override;
- gl::Error getMippedResource(const gl::Context *context,
- const TextureHelper11 **outResource) override;
- gl::Error getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT) override;
-
- gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
-
- void associateImage(Image11 *image, const gl::ImageIndex &index) override;
- void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
- void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
- gl::Error releaseAssociatedImage(const gl::Context *context,
- const gl::ImageIndex &index,
- Image11 *incomingImage) override;
-
- gl::Error useLevelZeroWorkaroundTexture(const gl::Context *context,
- bool useLevelZeroTexture) override;
-
- protected:
- gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
- gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
-
- private:
- // Check if the EGL image's render target has been updated due to orphaning and delete
- // any SRVs and other resources based on the image's old render target.
- gl::Error checkForUpdatedRenderTarget(const gl::Context *context);
-
- gl::Error createSRV(const gl::Context *context,
- int baseLevel,
- int mipLevels,
- DXGI_FORMAT format,
- const TextureHelper11 &texture,
- d3d11::SharedSRV *outSRV) override;
-
- gl::Error getImageRenderTarget(const gl::Context *context, RenderTarget11 **outRT) const;
-
- EGLImageD3D *mImage;
- uintptr_t mCurrentRenderTarget;
-
- // Swizzle-related variables
- TextureHelper11 mSwizzleTexture;
- std::vector<d3d11::RenderTargetView> mSwizzleRenderTargets;
-};
-
-class TextureStorage11_Cube : public TextureStorage11
-{
- public:
- TextureStorage11_Cube(Renderer11 *renderer, GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly);
- ~TextureStorage11_Cube() override;
-
- gl::Error onDestroy(const gl::Context *context) override;
-
- UINT getSubresourceIndex(const gl::ImageIndex &index) const override;
-
- gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override;
- gl::Error getMippedResource(const gl::Context *context,
- const TextureHelper11 **outResource) override;
- gl::Error getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT) override;
-
- gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
-
- void associateImage(Image11 *image, const gl::ImageIndex &index) override;
- void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
- void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
- gl::Error releaseAssociatedImage(const gl::Context *context,
- const gl::ImageIndex &index,
- Image11 *incomingImage) override;
-
- gl::Error useLevelZeroWorkaroundTexture(const gl::Context *context,
- bool useLevelZeroTexture) override;
-
- protected:
- gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
- gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
-
- gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override;
-
- gl::Error ensureTextureExists(int mipLevels);
-
- private:
- gl::Error createSRV(const gl::Context *context,
- int baseLevel,
- int mipLevels,
- DXGI_FORMAT format,
- const TextureHelper11 &texture,
- d3d11::SharedSRV *outSRV) override;
- gl::Error createRenderTargetSRV(const TextureHelper11 &texture,
- const gl::ImageIndex &index,
- DXGI_FORMAT resourceFormat,
- d3d11::SharedSRV *srv) const;
-
- TextureHelper11 mTexture;
- CubeFaceArray<TexLevelArray<std::unique_ptr<RenderTarget11>>> mRenderTarget;
-
- // Level-zero workaround members. See TextureStorage11_2D's workaround members for a description.
- TextureHelper11 mLevelZeroTexture;
- CubeFaceArray<std::unique_ptr<RenderTarget11>> mLevelZeroRenderTarget;
- bool mUseLevelZeroTexture;
-
- TextureHelper11 mSwizzleTexture;
- TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets;
-
- CubeFaceArray<TexLevelArray<Image11 *>> mAssociatedImages;
-};
-
-class TextureStorage11_3D : public TextureStorage11
-{
- public:
- TextureStorage11_3D(Renderer11 *renderer, GLenum internalformat, bool renderTarget,
- GLsizei width, GLsizei height, GLsizei depth, int levels);
- ~TextureStorage11_3D() override;
-
- gl::Error onDestroy(const gl::Context *context) override;
-
- gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override;
-
- // Handles both layer and non-layer RTs
- gl::Error getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT) override;
-
- void associateImage(Image11 *image, const gl::ImageIndex &index) override;
- void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
- void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
- gl::Error releaseAssociatedImage(const gl::Context *context,
- const gl::ImageIndex &index,
- Image11 *incomingImage) override;
-
- protected:
- gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
- gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
-
- private:
- gl::Error createSRV(const gl::Context *context,
- int baseLevel,
- int mipLevels,
- DXGI_FORMAT format,
- const TextureHelper11 &texture,
- d3d11::SharedSRV *outSRV) override;
-
- typedef std::pair<int, int> LevelLayerKey;
- std::map<LevelLayerKey, std::unique_ptr<RenderTarget11>> mLevelLayerRenderTargets;
-
- TexLevelArray<std::unique_ptr<RenderTarget11>> mLevelRenderTargets;
-
- TextureHelper11 mTexture;
- TextureHelper11 mSwizzleTexture;
- TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets;
-
- TexLevelArray<Image11 *> mAssociatedImages;
-};
-
-class TextureStorage11_2DArray : public TextureStorage11
-{
- public:
- TextureStorage11_2DArray(Renderer11 *renderer, GLenum internalformat, bool renderTarget,
- GLsizei width, GLsizei height, GLsizei depth, int levels);
- ~TextureStorage11_2DArray() override;
-
- gl::Error onDestroy(const gl::Context *context) override;
-
- gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override;
- gl::Error getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT) override;
-
- void associateImage(Image11 *image, const gl::ImageIndex &index) override;
- void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
- void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
- gl::Error releaseAssociatedImage(const gl::Context *context,
- const gl::ImageIndex &index,
- Image11 *incomingImage) override;
-
- protected:
- gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
- gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
-
- gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override;
-
- private:
- struct LevelLayerRangeKey
- {
- LevelLayerRangeKey(int mipLevelIn, int layerIn, int numLayersIn)
- : mipLevel(mipLevelIn), layer(layerIn), numLayers(numLayersIn)
- {
- }
- bool operator<(const LevelLayerRangeKey &other) const
- {
- if (mipLevel != other.mipLevel)
- {
- return mipLevel < other.mipLevel;
- }
- if (layer != other.layer)
- {
- return layer < other.layer;
- }
- return numLayers < other.numLayers;
- }
- int mipLevel;
- int layer;
- int numLayers;
- };
-
- private:
- gl::Error createSRV(const gl::Context *context,
- int baseLevel,
- int mipLevels,
- DXGI_FORMAT format,
- const TextureHelper11 &texture,
- d3d11::SharedSRV *outSRV) override;
- gl::Error createRenderTargetSRV(const TextureHelper11 &texture,
- const gl::ImageIndex &index,
- DXGI_FORMAT resourceFormat,
- d3d11::SharedSRV *srv) const;
-
- std::map<LevelLayerRangeKey, std::unique_ptr<RenderTarget11>> mRenderTargets;
-
- TextureHelper11 mTexture;
-
- TextureHelper11 mSwizzleTexture;
- TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets;
-
- typedef std::map<LevelLayerRangeKey, Image11 *> ImageMap;
- ImageMap mAssociatedImages;
-};
-
-class TextureStorage11_2DMultisample : public TextureStorage11
-{
- public:
- TextureStorage11_2DMultisample(Renderer11 *renderer,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- int levels,
- int samples,
- bool fixedSampleLocations);
- ~TextureStorage11_2DMultisample() override;
-
- gl::Error onDestroy(const gl::Context *context) override;
-
- gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override;
- gl::Error getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT) override;
-
- gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
-
- void associateImage(Image11 *image, const gl::ImageIndex &index) override;
- void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
- void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
- gl::Error releaseAssociatedImage(const gl::Context *context,
- const gl::ImageIndex &index,
- Image11 *incomingImage) override;
-
- protected:
- gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
- gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
-
- gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override;
-
- gl::Error ensureTextureExists(int mipLevels);
-
- private:
- gl::Error createSRV(const gl::Context *context,
- int baseLevel,
- int mipLevels,
- DXGI_FORMAT format,
- const TextureHelper11 &texture,
- d3d11::SharedSRV *outSRV) override;
-
- TextureHelper11 mTexture;
- std::unique_ptr<RenderTarget11> mRenderTarget;
-
- unsigned int mSamples;
- GLboolean mFixedSampleLocations;
-};
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.cpp
deleted file mode 100644
index 4b08edf71f..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.cpp
+++ /dev/null
@@ -1,124 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// TransformFeedbackD3D.cpp is a no-op implementation for both the D3D9 and D3D11 renderers.
-
-#include "libANGLE/renderer/d3d/d3d11/TransformFeedback11.h"
-
-#include "libANGLE/Buffer.h"
-#include "libANGLE/renderer/d3d/d3d11/Buffer11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-
-namespace rx
-{
-
-TransformFeedback11::TransformFeedback11(const gl::TransformFeedbackState &state,
- Renderer11 *renderer)
- : TransformFeedbackImpl(state),
- mRenderer(renderer),
- mIsDirty(true),
- mBuffers(state.getIndexedBuffers().size(), nullptr),
- mBufferOffsets(state.getIndexedBuffers().size(), 0),
- mSerial(mRenderer->generateSerial())
-{
-}
-
-TransformFeedback11::~TransformFeedback11()
-{
-}
-
-void TransformFeedback11::begin(GLenum primitiveMode)
-{
- // Reset all the cached offsets to the binding offsets
- mIsDirty = true;
- for (size_t bindingIdx = 0; bindingIdx < mBuffers.size(); bindingIdx++)
- {
- const auto &binding = mState.getIndexedBuffer(bindingIdx);
- if (binding.get() != nullptr)
- {
- mBufferOffsets[bindingIdx] = static_cast<UINT>(binding.getOffset());
- }
- else
- {
- mBufferOffsets[bindingIdx] = 0;
- }
- }
-}
-
-void TransformFeedback11::end()
-{
- if (mRenderer->getWorkarounds().flushAfterEndingTransformFeedback)
- {
- mRenderer->getDeviceContext()->Flush();
- }
-}
-
-void TransformFeedback11::pause()
-{
-}
-
-void TransformFeedback11::resume()
-{
-}
-
-void TransformFeedback11::bindGenericBuffer(const gl::BindingPointer<gl::Buffer> &binding)
-{
-}
-
-void TransformFeedback11::bindIndexedBuffer(size_t index,
- const gl::OffsetBindingPointer<gl::Buffer> &binding)
-{
- mIsDirty = true;
- mBufferOffsets[index] = static_cast<UINT>(binding.getOffset());
-}
-
-void TransformFeedback11::onApply()
-{
- mIsDirty = false;
-
- // Change all buffer offsets to -1 so that if any of them need to be re-applied, the are set to
- // append
- std::fill(mBufferOffsets.begin(), mBufferOffsets.end(), -1);
-}
-
-bool TransformFeedback11::isDirty() const
-{
- return mIsDirty;
-}
-
-UINT TransformFeedback11::getNumSOBuffers() const
-{
- return static_cast<UINT>(mBuffers.size());
-}
-
-gl::ErrorOrResult<const std::vector<ID3D11Buffer *> *> TransformFeedback11::getSOBuffers(
- const gl::Context *context)
-{
- for (size_t bindingIdx = 0; bindingIdx < mBuffers.size(); bindingIdx++)
- {
- const auto &binding = mState.getIndexedBuffer(bindingIdx);
- if (binding.get() != nullptr)
- {
- Buffer11 *storage = GetImplAs<Buffer11>(binding.get());
- ANGLE_TRY_RESULT(storage->getBuffer(context, BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK),
- mBuffers[bindingIdx]);
- }
- }
-
- return &mBuffers;
-}
-
-const std::vector<UINT> &TransformFeedback11::getSOBufferOffsets() const
-{
- return mBufferOffsets;
-}
-
-Serial TransformFeedback11::getSerial() const
-{
- return mSerial;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.h
deleted file mode 100644
index cc9fcc335a..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// TransformFeedback11.h: Implements the abstract rx::TransformFeedbackImpl class.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_TRANSFORMFEEDBACK11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_TRANSFORMFEEDBACK11_H_
-
-#include "common/platform.h"
-
-#include "libANGLE/Error.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/renderer/TransformFeedbackImpl.h"
-#include "libANGLE/renderer/renderer_utils.h"
-
-namespace rx
-{
-
-class Renderer11;
-
-class TransformFeedback11 : public TransformFeedbackImpl
-{
- public:
- TransformFeedback11(const gl::TransformFeedbackState &state, Renderer11 *renderer);
- ~TransformFeedback11() override;
-
- void begin(GLenum primitiveMode) override;
- void end() override;
- void pause() override;
- void resume() override;
-
- void bindGenericBuffer(const gl::BindingPointer<gl::Buffer> &binding) override;
- void bindIndexedBuffer(size_t index,
- const gl::OffsetBindingPointer<gl::Buffer> &binding) override;
-
- void onApply();
-
- bool isDirty() const;
-
- UINT getNumSOBuffers() const;
- gl::ErrorOrResult<const std::vector<ID3D11Buffer *> *> getSOBuffers(const gl::Context *context);
- const std::vector<UINT> &getSOBufferOffsets() const;
-
- Serial getSerial() const;
-
- private:
- Renderer11 *mRenderer;
-
- bool mIsDirty;
- std::vector<ID3D11Buffer *> mBuffers;
- std::vector<UINT> mBufferOffsets;
-
- Serial mSerial;
-};
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_TRANSFORMFEEDBACK11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Trim11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Trim11.cpp
deleted file mode 100644
index 29185a9d93..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Trim11.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Trim11.cpp: Trim support utility class.
-
-#include "libANGLE/renderer/d3d/d3d11/Trim11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-
-#if defined (ANGLE_ENABLE_WINDOWS_STORE)
-#include <wrl.h>
-#include <wrl/wrappers/corewrappers.h>
-#include <windows.applicationmodel.core.h>
-using namespace Microsoft::WRL;
-using namespace Microsoft::WRL::Wrappers;
-using namespace ABI::Windows::ApplicationModel;
-using namespace ABI::Windows::ApplicationModel::Core;
-using namespace ABI::Windows::Foundation;
-using namespace ABI::Windows::Foundation::Collections;
-#endif
-
-namespace rx
-{
-
-Trim11::Trim11(rx::Renderer11 *renderer)
- : mRenderer(renderer)
-{
- bool result = true;
- result = registerForRendererTrimRequest();
- ASSERT(result);
-}
-
-Trim11::~Trim11()
-{
- unregisterForRendererTrimRequest();
-}
-
-void Trim11::trim()
-{
- if (!mRenderer)
- {
- return;
- }
-
-#if defined (ANGLE_ENABLE_WINDOWS_STORE)
- ID3D11Device* device = mRenderer->getDevice();
- IDXGIDevice3 *dxgiDevice3 = d3d11::DynamicCastComObject<IDXGIDevice3>(device);
- if (dxgiDevice3)
- {
- dxgiDevice3->Trim();
- }
- SafeRelease(dxgiDevice3);
-#endif
-}
-
-bool Trim11::registerForRendererTrimRequest()
-{
-#if defined (ANGLE_ENABLE_WINDOWS_STORE)
- ICoreApplication* coreApplication = nullptr;
- HRESULT result = GetActivationFactory(HStringReference(RuntimeClass_Windows_ApplicationModel_Core_CoreApplication).Get(), &coreApplication);
- if (SUCCEEDED(result))
- {
- auto suspendHandler = Callback<IEventHandler<SuspendingEventArgs*>>(
- [this](IInspectable*, ISuspendingEventArgs*) -> HRESULT
- {
- trim();
- return S_OK;
- });
- result = coreApplication->add_Suspending(suspendHandler.Get(), &mApplicationSuspendedEventToken);
- }
- SafeRelease(coreApplication);
-
- if (FAILED(result))
- {
- return false;
- }
-#endif
- return true;
-}
-
-void Trim11::unregisterForRendererTrimRequest()
-{
-#if defined (ANGLE_ENABLE_WINDOWS_STORE)
- if (mApplicationSuspendedEventToken.value != 0)
- {
- ICoreApplication* coreApplication = nullptr;
- if (SUCCEEDED(GetActivationFactory(HStringReference(RuntimeClass_Windows_ApplicationModel_Core_CoreApplication).Get(), &coreApplication)))
- {
- coreApplication->remove_Suspending(mApplicationSuspendedEventToken);
- }
- mApplicationSuspendedEventToken.value = 0;
- SafeRelease(coreApplication);
- }
-#endif
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Trim11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Trim11.h
deleted file mode 100644
index 69fa05a57b..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Trim11.h
+++ /dev/null
@@ -1,43 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Trim11.h: Trim support utility class.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_TRIM11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_TRIM11_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/Error.h"
-
-#if defined(ANGLE_ENABLE_WINDOWS_STORE)
-#include <EventToken.h>
-#endif
-
-namespace rx
-{
-class Renderer11;
-
-class Trim11 : angle::NonCopyable
-{
- public:
- explicit Trim11(Renderer11 *renderer);
- ~Trim11();
-
- private:
- Renderer11 *mRenderer;
-#if defined (ANGLE_ENABLE_WINDOWS_STORE)
- EventRegistrationToken mApplicationSuspendedEventToken;
-#endif
-
- void trim();
- bool registerForRendererTrimRequest();
- void unregisterForRendererTrimRequest();
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_TRIM11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp
deleted file mode 100644
index 97c29415ed..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp
+++ /dev/null
@@ -1,413 +0,0 @@
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// VertexArray11:
-// Implementation of rx::VertexArray11.
-//
-
-#include "libANGLE/renderer/d3d/d3d11/VertexArray11.h"
-
-#include "common/bitset_utils.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/renderer/d3d/d3d11/Buffer11.h"
-#include "libANGLE/renderer/d3d/d3d11/Context11.h"
-
-using namespace angle;
-
-namespace rx
-{
-
-namespace
-{
-OnBufferDataDirtyChannel *GetBufferBroadcastChannel(Buffer11 *buffer11,
- IndexStorageType storageType)
-{
- switch (storageType)
- {
- case IndexStorageType::Direct:
- return buffer11->getDirectBroadcastChannel();
- case IndexStorageType::Static:
- return buffer11->getStaticBroadcastChannel();
- case IndexStorageType::Dynamic:
- return buffer11 ? buffer11->getStaticBroadcastChannel() : nullptr;
- default:
- UNREACHABLE();
- return nullptr;
- }
-}
-} // anonymous namespace
-
-VertexArray11::VertexArray11(const gl::VertexArrayState &data)
- : VertexArrayImpl(data),
- mAttributeStorageTypes(data.getMaxAttribs(), VertexStorageType::CURRENT_VALUE),
- mTranslatedAttribs(data.getMaxAttribs()),
- mCurrentArrayBuffers(data.getMaxAttribs()),
- mCurrentElementArrayBuffer(),
- mOnArrayBufferDataDirty(),
- mOnElementArrayBufferDataDirty(this, mCurrentArrayBuffers.size()),
- mAppliedNumViewsToDivisor(1),
- mLastElementType(GL_NONE),
- mLastDrawElementsOffset(0),
- mCurrentElementArrayStorage(IndexStorageType::Invalid),
- mCachedIndexInfoValid(false)
-{
- for (size_t attribIndex = 0; attribIndex < mCurrentArrayBuffers.size(); ++attribIndex)
- {
- mOnArrayBufferDataDirty.emplace_back(this, attribIndex);
- }
-}
-
-VertexArray11::~VertexArray11()
-{
-}
-
-void VertexArray11::destroy(const gl::Context *context)
-{
- for (auto &buffer : mCurrentArrayBuffers)
- {
- if (buffer.get())
- {
- buffer.set(context, nullptr);
- }
- }
-
- mCurrentElementArrayBuffer.set(context, nullptr);
-}
-
-void VertexArray11::syncState(const gl::Context *context,
- const gl::VertexArray::DirtyBits &dirtyBits)
-{
- ASSERT(dirtyBits.any());
-
- // Generate a state serial. This serial is used in the program class to validate the cached
- // input layout, and skip recomputation in the fast path.
- Renderer11 *renderer = GetImplAs<Context11>(context)->getRenderer();
- mCurrentStateSerial = renderer->generateSerial();
-
- // TODO(jmadill): Individual attribute invalidation.
- renderer->getStateManager()->invalidateVertexBuffer();
-
- for (auto dirtyBit : dirtyBits)
- {
- if (dirtyBit == gl::VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER)
- {
- mCachedIndexInfoValid = false;
- mLastElementType = GL_NONE;
- }
- else
- {
- size_t index = gl::VertexArray::GetVertexIndexFromDirtyBit(dirtyBit);
- // TODO(jiawei.shao@intel.com): Vertex Attrib Bindings
- ASSERT(index == mState.getBindingIndexFromAttribIndex(index));
- mAttribsToUpdate.set(index);
- }
- }
-}
-
-bool VertexArray11::flushAttribUpdates(const gl::Context *context)
-{
- if (mAttribsToUpdate.any())
- {
- const auto &activeLocations =
- context->getGLState().getProgram()->getActiveAttribLocationsMask();
-
- // Skip attrib locations the program doesn't use.
- gl::AttributesMask activeToUpdate = mAttribsToUpdate & activeLocations;
-
- for (auto toUpdateIndex : activeToUpdate)
- {
- mAttribsToUpdate.reset(toUpdateIndex);
- updateVertexAttribStorage(context, toUpdateIndex);
- }
-
- return true;
- }
-
- return false;
-}
-
-bool VertexArray11::updateElementArrayStorage(const gl::Context *context,
- GLenum elementType,
- GLenum destElementType,
- const void *indices)
-{
- unsigned int offset = static_cast<unsigned int>(reinterpret_cast<uintptr_t>(indices));
-
- if (mCachedIndexInfoValid && mLastElementType == elementType &&
- offset == mLastDrawElementsOffset)
- {
- // Dynamic index buffers must be re-streamed every draw.
- return (mCurrentElementArrayStorage == IndexStorageType::Dynamic);
- }
-
- gl::Buffer *newBuffer = mState.getElementArrayBuffer().get();
- gl::Buffer *oldBuffer = mCurrentElementArrayBuffer.get();
- bool needsTranslation = false;
- IndexStorageType newStorageType = ClassifyIndexStorage(
- context->getGLState(), newBuffer, elementType, destElementType, offset, &needsTranslation);
-
- if (newBuffer != oldBuffer)
- {
- mCurrentElementArrayBuffer.set(context, newBuffer);
- }
-
- if (newStorageType != mCurrentElementArrayStorage || newBuffer != oldBuffer)
- {
- Buffer11 *newBuffer11 = SafeGetImplAs<Buffer11>(newBuffer);
-
- auto *newChannel = GetBufferBroadcastChannel(newBuffer11, newStorageType);
-
- mCurrentElementArrayStorage = newStorageType;
- mOnElementArrayBufferDataDirty.bind(newChannel);
- needsTranslation = true;
- }
-
- if (mLastDrawElementsOffset != offset)
- {
- needsTranslation = true;
- mLastDrawElementsOffset = offset;
- }
-
- if (mLastElementType != elementType)
- {
- needsTranslation = true;
- mLastElementType = elementType;
- }
-
- // TODO(jmadill): We should probably promote static usage immediately, because this can change
- // the storage type for dynamic buffers.
- return needsTranslation || !mCachedIndexInfoValid;
-}
-
-void VertexArray11::updateVertexAttribStorage(const gl::Context *context, size_t attribIndex)
-{
- const auto &attrib = mState.getVertexAttribute(attribIndex);
- const auto &binding = mState.getBindingFromAttribIndex(attribIndex);
-
- // Note: having an unchanged storage type doesn't mean the attribute is clean.
- auto oldStorageType = mAttributeStorageTypes[attribIndex];
- auto newStorageType = ClassifyAttributeStorage(attrib, binding);
-
- mAttributeStorageTypes[attribIndex] = newStorageType;
-
- StateManager11 *stateManager = GetImplAs<Context11>(context)->getRenderer()->getStateManager();
-
- if (newStorageType == VertexStorageType::DYNAMIC)
- {
- if (oldStorageType != VertexStorageType::DYNAMIC)
- {
- // Sync dynamic attribs in a different set.
- mAttribsToTranslate.reset(attribIndex);
- mDynamicAttribsMask.set(attribIndex);
- }
- }
- else
- {
- mAttribsToTranslate.set(attribIndex);
- stateManager->invalidateVertexAttributeTranslation();
-
- if (oldStorageType == VertexStorageType::DYNAMIC)
- {
- ASSERT(mDynamicAttribsMask[attribIndex]);
- mDynamicAttribsMask.reset(attribIndex);
- }
- }
-
- gl::Buffer *oldBufferGL = mCurrentArrayBuffers[attribIndex].get();
- gl::Buffer *newBufferGL = binding.getBuffer().get();
- Buffer11 *oldBuffer11 = oldBufferGL ? GetImplAs<Buffer11>(oldBufferGL) : nullptr;
- Buffer11 *newBuffer11 = newBufferGL ? GetImplAs<Buffer11>(newBufferGL) : nullptr;
-
- if (oldBuffer11 != newBuffer11 || oldStorageType != newStorageType)
- {
- OnBufferDataDirtyChannel *newChannel = nullptr;
-
- if (newStorageType == VertexStorageType::CURRENT_VALUE)
- {
- stateManager->invalidateCurrentValueAttrib(attribIndex);
- }
- else if (newBuffer11 != nullptr)
- {
- // Note that for static callbacks, promotion to a static buffer from a dynamic buffer
- // means we need to tag dynamic buffers with static callbacks.
- switch (newStorageType)
- {
- case VertexStorageType::DIRECT:
- newChannel = newBuffer11->getDirectBroadcastChannel();
- break;
- case VertexStorageType::STATIC:
- case VertexStorageType::DYNAMIC:
- newChannel = newBuffer11->getStaticBroadcastChannel();
- break;
- default:
- UNREACHABLE();
- break;
- }
- }
-
- mOnArrayBufferDataDirty[attribIndex].bind(newChannel);
- mCurrentArrayBuffers[attribIndex].set(context, binding.getBuffer().get());
- }
-}
-
-bool VertexArray11::hasActiveDynamicAttrib(const gl::Context *context)
-{
- flushAttribUpdates(context);
- const auto &activeLocations =
- context->getGLState().getProgram()->getActiveAttribLocationsMask();
- auto activeDynamicAttribs = (mDynamicAttribsMask & activeLocations);
- return activeDynamicAttribs.any();
-}
-
-gl::Error VertexArray11::updateDirtyAndDynamicAttribs(const gl::Context *context,
- VertexDataManager *vertexDataManager,
- const DrawCallVertexParams &vertexParams)
-{
- flushAttribUpdates(context);
-
- const auto &glState = context->getGLState();
- const gl::Program *program = glState.getProgram();
- const auto &activeLocations = program->getActiveAttribLocationsMask();
- const auto &attribs = mState.getVertexAttributes();
- const auto &bindings = mState.getVertexBindings();
- mAppliedNumViewsToDivisor =
- (program != nullptr && program->usesMultiview()) ? program->getNumViews() : 1;
-
- if (mAttribsToTranslate.any())
- {
- // Skip attrib locations the program doesn't use, saving for the next frame.
- gl::AttributesMask dirtyActiveAttribs = (mAttribsToTranslate & activeLocations);
-
- for (auto dirtyAttribIndex : dirtyActiveAttribs)
- {
- mAttribsToTranslate.reset(dirtyAttribIndex);
-
- auto *translatedAttrib = &mTranslatedAttribs[dirtyAttribIndex];
- const auto &currentValue = glState.getVertexAttribCurrentValue(dirtyAttribIndex);
-
- // Record basic attrib info
- translatedAttrib->attribute = &attribs[dirtyAttribIndex];
- translatedAttrib->binding = &bindings[translatedAttrib->attribute->bindingIndex];
- translatedAttrib->currentValueType = currentValue.Type;
- translatedAttrib->divisor =
- translatedAttrib->binding->getDivisor() * mAppliedNumViewsToDivisor;
-
- switch (mAttributeStorageTypes[dirtyAttribIndex])
- {
- case VertexStorageType::DIRECT:
- VertexDataManager::StoreDirectAttrib(translatedAttrib);
- break;
- case VertexStorageType::STATIC:
- {
- ANGLE_TRY(VertexDataManager::StoreStaticAttrib(context, translatedAttrib));
- break;
- }
- case VertexStorageType::CURRENT_VALUE:
- // Current value attribs are managed by the StateManager11.
- break;
- default:
- UNREACHABLE();
- break;
- }
- }
- }
-
- if (mDynamicAttribsMask.any())
- {
- auto activeDynamicAttribs = (mDynamicAttribsMask & activeLocations);
- if (activeDynamicAttribs.none())
- {
- return gl::NoError();
- }
-
- for (auto dynamicAttribIndex : activeDynamicAttribs)
- {
- auto *dynamicAttrib = &mTranslatedAttribs[dynamicAttribIndex];
- const auto &currentValue = glState.getVertexAttribCurrentValue(dynamicAttribIndex);
-
- // Record basic attrib info
- dynamicAttrib->attribute = &attribs[dynamicAttribIndex];
- dynamicAttrib->binding = &bindings[dynamicAttrib->attribute->bindingIndex];
- dynamicAttrib->currentValueType = currentValue.Type;
- dynamicAttrib->divisor =
- dynamicAttrib->binding->getDivisor() * mAppliedNumViewsToDivisor;
- }
-
- ANGLE_TRY(vertexDataManager->storeDynamicAttribs(
- context, &mTranslatedAttribs, activeDynamicAttribs, vertexParams.firstVertex(),
- vertexParams.vertexCount(), vertexParams.instances()));
- }
-
- return gl::NoError();
-}
-
-const std::vector<TranslatedAttribute> &VertexArray11::getTranslatedAttribs() const
-{
- return mTranslatedAttribs;
-}
-
-void VertexArray11::signal(size_t channelID, const gl::Context *context)
-{
- if (channelID == mAttributeStorageTypes.size())
- {
- mCachedIndexInfoValid = false;
- mLastElementType = GL_NONE;
- mLastDrawElementsOffset = 0;
- }
- else
- {
- ASSERT(mAttributeStorageTypes[channelID] != VertexStorageType::CURRENT_VALUE);
-
- // This can change a buffer's storage, we'll need to re-check.
- mAttribsToUpdate.set(channelID);
-
- // Changing the vertex attribute state can affect the vertex shader.
- Renderer11 *renderer = GetImplAs<Context11>(context)->getRenderer();
- renderer->getStateManager()->invalidateShaders();
- }
-}
-
-void VertexArray11::clearDirtyAndPromoteDynamicAttribs(const gl::Context *context,
- const DrawCallVertexParams &vertexParams)
-{
- const gl::State &state = context->getGLState();
- const gl::Program *program = state.getProgram();
- const auto &activeLocations = program->getActiveAttribLocationsMask();
- mAttribsToUpdate &= ~activeLocations;
-
- // Promote to static after we clear the dirty attributes, otherwise we can lose dirtyness.
- auto activeDynamicAttribs = (mDynamicAttribsMask & activeLocations);
- if (activeDynamicAttribs.any())
- {
- VertexDataManager::PromoteDynamicAttribs(context, mTranslatedAttribs, activeDynamicAttribs,
- vertexParams.vertexCount());
- }
-}
-
-void VertexArray11::markAllAttributeDivisorsForAdjustment(int numViews)
-{
- if (mAppliedNumViewsToDivisor != numViews)
- {
- mAppliedNumViewsToDivisor = numViews;
- mAttribsToUpdate.set();
- }
-}
-
-TranslatedIndexData *VertexArray11::getCachedIndexInfo()
-{
- return &mCachedIndexInfo;
-}
-
-void VertexArray11::setCachedIndexInfoValid()
-{
- mCachedIndexInfoValid = true;
-}
-
-bool VertexArray11::isCachedIndexInfoValid() const
-{
- return mCachedIndexInfoValid;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h
deleted file mode 100644
index 4cdc92531d..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h
+++ /dev/null
@@ -1,99 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// VertexArray11.h: Defines the rx::VertexArray11 class which implements rx::VertexArrayImpl.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_VERTEXARRAY11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_VERTEXARRAY11_H_
-
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/renderer/VertexArrayImpl.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-#include "libANGLE/signal_utils.h"
-
-namespace rx
-{
-class Renderer11;
-
-class VertexArray11 : public VertexArrayImpl, public OnBufferDataDirtyReceiver
-{
- public:
- VertexArray11(const gl::VertexArrayState &data);
- ~VertexArray11() override;
- void destroy(const gl::Context *context) override;
-
- void syncState(const gl::Context *context,
- const gl::VertexArray::DirtyBits &dirtyBits) override;
- // This will flush any pending attrib updates and then check the dynamic attribs mask.
- bool hasActiveDynamicAttrib(const gl::Context *context);
- gl::Error updateDirtyAndDynamicAttribs(const gl::Context *context,
- VertexDataManager *vertexDataManager,
- const DrawCallVertexParams &vertexParams);
- void clearDirtyAndPromoteDynamicAttribs(const gl::Context *context,
- const DrawCallVertexParams &vertexParams);
-
- const std::vector<TranslatedAttribute> &getTranslatedAttribs() const;
-
- // SignalReceiver implementation
- void signal(size_t channelID, const gl::Context *context) override;
-
- Serial getCurrentStateSerial() const { return mCurrentStateSerial; }
-
- // In case of a multi-view program change, we have to update all attributes so that the divisor
- // is adjusted.
- void markAllAttributeDivisorsForAdjustment(int numViews);
-
- bool flushAttribUpdates(const gl::Context *context);
-
- // Returns true if the element array buffer needs to be translated.
- bool updateElementArrayStorage(const gl::Context *context,
- GLenum elementType,
- GLenum destElementType,
- const void *indices);
-
- TranslatedIndexData *getCachedIndexInfo();
- void setCachedIndexInfoValid();
- bool isCachedIndexInfoValid() const;
-
- private:
- void updateVertexAttribStorage(const gl::Context *context, size_t attribIndex);
-
- std::vector<VertexStorageType> mAttributeStorageTypes;
- std::vector<TranslatedAttribute> mTranslatedAttribs;
-
- // The mask of attributes marked as dynamic.
- gl::AttributesMask mDynamicAttribsMask;
-
- // A mask of attributes that need to be re-evaluated.
- gl::AttributesMask mAttribsToUpdate;
-
- // A set of attributes we know are dirty, and need to be re-translated.
- gl::AttributesMask mAttribsToTranslate;
-
- // We need to keep a safe pointer to the Buffer so we can attach the correct dirty callbacks.
- std::vector<gl::BindingPointer<gl::Buffer>> mCurrentArrayBuffers;
- gl::BindingPointer<gl::Buffer> mCurrentElementArrayBuffer;
-
- std::vector<OnBufferDataDirtyBinding> mOnArrayBufferDataDirty;
- OnBufferDataDirtyBinding mOnElementArrayBufferDataDirty;
-
- Serial mCurrentStateSerial;
-
- // The numViews value used to adjust the divisor.
- int mAppliedNumViewsToDivisor;
-
- // If the index buffer needs re-streaming.
- GLenum mLastElementType;
- unsigned int mLastDrawElementsOffset;
- IndexStorageType mCurrentElementArrayStorage;
- TranslatedIndexData mCachedIndexInfo;
- bool mCachedIndexInfoValid;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_VERTEXARRAY11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp
deleted file mode 100644
index 611bd0f18b..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp
+++ /dev/null
@@ -1,184 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// VertexBuffer11.cpp: Defines the D3D11 VertexBuffer implementation.
-
-#include "libANGLE/renderer/d3d/d3d11/VertexBuffer11.h"
-
-#include "libANGLE/Buffer.h"
-#include "libANGLE/VertexAttribute.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/d3d/d3d11/Buffer11.h"
-#include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-
-namespace rx
-{
-
-VertexBuffer11::VertexBuffer11(Renderer11 *const renderer)
- : mRenderer(renderer),
- mBuffer(),
- mBufferSize(0),
- mDynamicUsage(false),
- mMappedResourceData(nullptr)
-{
-}
-
-VertexBuffer11::~VertexBuffer11()
-{
- ASSERT(mMappedResourceData == nullptr);
-}
-
-gl::Error VertexBuffer11::initialize(unsigned int size, bool dynamicUsage)
-{
- mBuffer.reset();
- updateSerial();
-
- if (size > 0)
- {
- D3D11_BUFFER_DESC bufferDesc;
- bufferDesc.ByteWidth = size;
- bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
- bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
- bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- bufferDesc.MiscFlags = 0;
- bufferDesc.StructureByteStride = 0;
-
- ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &mBuffer));
-
- if (dynamicUsage)
- {
- mBuffer.setDebugName("VertexBuffer11 (dynamic)");
- }
- else
- {
- mBuffer.setDebugName("VertexBuffer11 (static)");
- }
- }
-
- mBufferSize = size;
- mDynamicUsage = dynamicUsage;
-
- return gl::NoError();
-}
-
-gl::Error VertexBuffer11::mapResource()
-{
- if (mMappedResourceData == nullptr)
- {
- ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
-
- D3D11_MAPPED_SUBRESOURCE mappedResource;
-
- HRESULT result =
- dxContext->Map(mBuffer.get(), 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedResource);
- if (FAILED(result))
- {
- return gl::OutOfMemory()
- << "Failed to map internal vertex buffer, " << gl::FmtHR(result);
- }
-
- mMappedResourceData = reinterpret_cast<uint8_t *>(mappedResource.pData);
- }
-
- return gl::NoError();
-}
-
-void VertexBuffer11::hintUnmapResource()
-{
- if (mMappedResourceData != nullptr)
- {
- ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
- dxContext->Unmap(mBuffer.get(), 0);
-
- mMappedResourceData = nullptr;
- }
-}
-
-gl::Error VertexBuffer11::storeVertexAttributes(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding,
- GLenum currentValueType,
- GLint start,
- GLsizei count,
- GLsizei instances,
- unsigned int offset,
- const uint8_t *sourceData)
-{
- if (!mBuffer.valid())
- {
- return gl::OutOfMemory() << "Internal vertex buffer is not initialized.";
- }
-
- int inputStride = static_cast<int>(ComputeVertexAttributeStride(attrib, binding));
-
- // This will map the resource if it isn't already mapped.
- ANGLE_TRY(mapResource());
-
- uint8_t *output = mMappedResourceData + offset;
-
- const uint8_t *input = sourceData;
-
- if (instances == 0 || binding.getDivisor() == 0)
- {
- input += inputStride * start;
- }
-
- gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib, currentValueType);
- const D3D_FEATURE_LEVEL featureLevel = mRenderer->getRenderer11DeviceCaps().featureLevel;
- const d3d11::VertexFormat &vertexFormatInfo =
- d3d11::GetVertexFormatInfo(vertexFormatType, featureLevel);
- ASSERT(vertexFormatInfo.copyFunction != nullptr);
- vertexFormatInfo.copyFunction(input, inputStride, count, output);
-
- return gl::NoError();
-}
-
-unsigned int VertexBuffer11::getBufferSize() const
-{
- return mBufferSize;
-}
-
-gl::Error VertexBuffer11::setBufferSize(unsigned int size)
-{
- if (size > mBufferSize)
- {
- return initialize(size, mDynamicUsage);
- }
- else
- {
- return gl::NoError();
- }
-}
-
-gl::Error VertexBuffer11::discard()
-{
- if (!mBuffer.valid())
- {
- return gl::OutOfMemory() << "Internal vertex buffer is not initialized.";
- }
-
- ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
-
- D3D11_MAPPED_SUBRESOURCE mappedResource;
- HRESULT result = dxContext->Map(mBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to map internal buffer for discarding, "
- << gl::FmtHR(result);
- }
-
- dxContext->Unmap(mBuffer.get(), 0);
-
- return gl::NoError();
-}
-
-const d3d11::Buffer &VertexBuffer11::getBuffer() const
-{
- return mBuffer;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.h
deleted file mode 100644
index ab619ae503..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.h
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// VertexBuffer11.h: Defines the D3D11 VertexBuffer implementation.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_VERTEXBUFFER11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_VERTEXBUFFER11_H_
-
-#include <stdint.h>
-
-#include "libANGLE/renderer/d3d/VertexBuffer.h"
-#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
-
-namespace rx
-{
-class Renderer11;
-
-class VertexBuffer11 : public VertexBuffer
-{
- public:
- explicit VertexBuffer11(Renderer11 *const renderer);
-
- gl::Error initialize(unsigned int size, bool dynamicUsage) override;
-
- // Warning: you should ensure binding really matches attrib.bindingIndex before using this
- // function.
- gl::Error storeVertexAttributes(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding,
- GLenum currentValueType,
- GLint start,
- GLsizei count,
- GLsizei instances,
- unsigned int offset,
- const uint8_t *sourceData) override;
-
- unsigned int getBufferSize() const override;
- gl::Error setBufferSize(unsigned int size) override;
- gl::Error discard() override;
-
- void hintUnmapResource() override;
-
- const d3d11::Buffer &getBuffer() const;
-
- private:
- ~VertexBuffer11() override;
- gl::Error mapResource();
-
- Renderer11 *const mRenderer;
-
- d3d11::Buffer mBuffer;
- unsigned int mBufferSize;
- bool mDynamicUsage;
-
- uint8_t *mMappedResourceData;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_VERTEXBUFFER11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/copyvertex.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/copyvertex.h
deleted file mode 100644
index 5501e361f1..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/copyvertex.h
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-// Copyright (c) 2013-2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// copyvertex.h: Defines D3D11 vertex buffer copying and conversion functions
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_COPYVERTEX_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_COPYVERTEX_H_
-
-#include "common/mathutil.h"
-
-namespace rx
-{
-
-// 'alphaDefaultValueBits' gives the default value for the alpha channel (4th component)
-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);
-
-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);
-
-template <size_t inputComponentCount, size_t outputComponentCount>
-inline 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);
-
-template <bool isSigned, bool normalized, bool toFloat>
-inline void CopyXYZ10W2ToXYZW32FVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output);
-
-}
-
-#include "copyvertex.inl"
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_COPYVERTEX_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/copyvertex.inl b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/copyvertex.inl
deleted file mode 100644
index 7c5c157c6f..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/copyvertex.inl
+++ /dev/null
@@ -1,386 +0,0 @@
-//
-// Copyright (c) 2014-2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-namespace rx
-{
-
-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;
-
- if (attribSize == stride && inputComponentCount == outputComponentCount)
- {
- memcpy(output, input, count * attribSize);
- return;
- }
-
- if (inputComponentCount == outputComponentCount)
- {
- 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;
-
- memcpy(offsetOutput, offsetInput, attribSize);
- }
- return;
- }
-
- 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;
-
- memcpy(offsetOutput, offsetInput, attribSize);
-
- if (inputComponentCount < lastNonAlphaOutputComponent)
- {
- // Set the remaining G/B channels to 0.
- size_t numComponents = (lastNonAlphaOutputComponent - inputComponentCount);
- memset(&offsetOutput[inputComponentCount], 0, numComponents * sizeof(T));
- }
-
- if (inputComponentCount < outputComponentCount && outputComponentCount == 4)
- {
- // Set the remaining alpha channel to the defaultAlphaValue.
- offsetOutput[3] = defaultAlphaValue;
- }
- }
-}
-
-template <size_t inputComponentCount, size_t outputComponentCount>
-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;
-
- for (size_t j = 0; j < inputComponentCount; j++)
- {
- offsetOutput[j] = static_cast<GLshort>(offsetInput[j]);
- }
-
- for (size_t j = inputComponentCount; j < lastNonAlphaOutputComponent; j++)
- {
- // Set remaining G/B channels to 0.
- offsetOutput[j] = 0;
- }
-
- if (inputComponentCount < outputComponentCount && outputComponentCount == 4)
- {
- // On integer formats, we must set the Alpha channel to 1 if it's unused.
- offsetOutput[3] = 1;
- }
- }
-}
-
-template <size_t inputComponentCount, size_t outputComponentCount>
-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;
-
- 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).
- if (offsetInput[j] > 0)
- {
- offsetOutput[j] = offsetInput[j] << 8 | offsetInput[j] << 1 | ((offsetInput[j] & 0x40) >> 6);
- }
- else
- {
- offsetOutput[j] = offsetInput[j] << 8;
- }
- }
-
- for (size_t j = inputComponentCount; j < std::min<size_t>(outputComponentCount, 3); j++)
- {
- // Set remaining G/B channels to 0.
- offsetOutput[j] = 0;
- }
-
- if (inputComponentCount < outputComponentCount && outputComponentCount == 4)
- {
- // On normalized formats, we must set the Alpha channel to the max value if it's unused.
- offsetOutput[3] = INT16_MAX;
- }
- }
-}
-
-template <size_t inputComponentCount, size_t outputComponentCount>
-inline void Copy32FixedTo32FVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output)
-{
- static const float divisor = 1.0f / (1 << 16);
-
- for (size_t i = 0; i < count; i++)
- {
- const GLfixed* offsetInput = reinterpret_cast<const GLfixed*>(input + (stride * i));
- float* offsetOutput = reinterpret_cast<float*>(output) + i * outputComponentCount;
-
- for (size_t j = 0; j < inputComponentCount; j++)
- {
- offsetOutput[j] = static_cast<float>(offsetInput[j]) * divisor;
- }
-
- // 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.");
-
- for (size_t j = inputComponentCount; j < outputComponentCount; j++)
- {
- offsetOutput[j] = 0.0f;
- }
- }
-}
-
-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)
-{
- typedef std::numeric_limits<T> NL;
-
- 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;
-
- for (size_t j = 0; j < inputComponentCount; j++)
- {
- if (normalized)
- {
- 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;
- }
- else
- {
- offsetOutput[j] = static_cast<float>(offsetInput[j]) / NL::max();
- }
- }
- else
- {
- 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.");
-
- for (size_t j = inputComponentCount; j < outputComponentCount; j++)
- {
- offsetOutput[j] = 0.0f;
- }
- }
-}
-
-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
-
- if (toFloat)
- {
- GLfloat *floatOutput = reinterpret_cast<GLfloat*>(output);
- if (isSigned)
- {
- GLfloat finalValue = 0;
- if (data & rgbSignMask)
- {
- int negativeNumber = data | negativeMask;
- finalValue = static_cast<GLfloat>(negativeNumber);
- }
- else
- {
- finalValue = static_cast<GLfloat>(data);
- }
-
- if (normalized)
- {
- 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.
- if (finalValue < minValue)
- {
- finalValue = minValue;
- }
-
- const int32_t halfRange = (maxValue - minValue) >> 1;
- *floatOutput = ((finalValue - minValue) / halfRange) - 1.0f;
- }
- else
- {
- *floatOutput = finalValue;
- }
- }
- else
- {
- if (normalized)
- {
- const uint32_t maxValue = 0x3FF; // 1 set in bits 0 through 9
- *floatOutput = static_cast<GLfloat>(data) / static_cast<GLfloat>(maxValue);
- }
- else
- {
- *floatOutput = static_cast<GLfloat>(data);
- }
- }
- }
- else
- {
- if (isSigned)
- {
- GLshort *intOutput = reinterpret_cast<GLshort*>(output);
-
- if (data & rgbSignMask)
- {
- *intOutput = static_cast<GLshort>(data | negativeMask);
- }
- else
- {
- *intOutput = static_cast<GLshort>(data);
- }
- }
- else
- {
- GLushort *uintOutput = reinterpret_cast<GLushort*>(output);
- *uintOutput = static_cast<GLushort>(data);
- }
- }
-}
-
-template <bool isSigned, bool normalized, bool toFloat>
-inline void CopyPackedAlpha(uint32_t data, uint8_t *output)
-{
- if (toFloat)
- {
- 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();
- }
- }
- 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();
- }
- }
- }
- else
- {
- if (normalized)
- {
- 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();
- }
- }
- 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();
- }
- }
- }
- }
- else
- {
- if (isSigned)
- {
- 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();
- }
- }
- else
- {
- 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();
- }
- }
- }
-}
-
-}
-
-template <bool isSigned, bool normalized, bool toFloat>
-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 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
-
- for (size_t i = 0; i < count; i++)
- {
- 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));
- }
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_format_data.json b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_format_data.json
deleted file mode 100644
index 891d30d252..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_format_data.json
+++ /dev/null
@@ -1,118 +0,0 @@
-{
- "UNKNOWN": "NONE",
- "R32G32B32A32_TYPELESS": "",
- "R32G32B32A32_FLOAT": "",
- "R32G32B32A32_UINT": "",
- "R32G32B32A32_SINT": "",
- "R32G32B32_TYPELESS": "",
- "R32G32B32_FLOAT": "",
- "R32G32B32_UINT": "",
- "R32G32B32_SINT": "",
- "R16G16B16A16_TYPELESS": "",
- "R16G16B16A16_FLOAT": "",
- "R16G16B16A16_UNORM": "",
- "R16G16B16A16_UINT": "",
- "R16G16B16A16_SNORM": "",
- "R16G16B16A16_SINT": "",
- "R32G32_TYPELESS": "",
- "R32G32_FLOAT": "",
- "R32G32_UINT": "",
- "R32G32_SINT": "",
- "R32G8X24_TYPELESS": "",
- "D32_FLOAT_S8X24_UINT": "",
- "R32_FLOAT_X8X24_TYPELESS": "",
- "X32_TYPELESS_G8X24_UINT": "",
- "R10G10B10A2_TYPELESS": "",
- "R10G10B10A2_UNORM": "",
- "R10G10B10A2_UINT": "",
- "R11G11B10_FLOAT": "",
- "R8G8B8A8_TYPELESS": "",
- "R8G8B8A8_UNORM": "",
- "R8G8B8A8_UNORM_SRGB": "",
- "R8G8B8A8_UINT": "",
- "R8G8B8A8_SNORM": "",
- "R8G8B8A8_SINT": "",
- "R16G16_TYPELESS": "",
- "R16G16_FLOAT": "",
- "R16G16_UNORM": "",
- "R16G16_UINT": "",
- "R16G16_SNORM": "",
- "R16G16_SINT": "",
- "R32_TYPELESS": "",
- "D32_FLOAT": "",
- "R32_FLOAT": "",
- "R32_UINT": "",
- "R32_SINT": "",
- "R24G8_TYPELESS": "",
- "D24_UNORM_S8_UINT": "",
- "R24_UNORM_X8_TYPELESS": "",
- "X24_TYPELESS_G8_UINT": "",
- "R8G8_TYPELESS": "",
- "R8G8_UNORM": "",
- "R8G8_UINT": "",
- "R8G8_SNORM": "",
- "R8G8_SINT": "",
- "R16_TYPELESS": "",
- "R16_FLOAT": "",
- "D16_UNORM": "",
- "R16_UNORM": "",
- "R16_UINT": "",
- "R16_SNORM": "",
- "R16_SINT": "",
- "R8_TYPELESS": "",
- "R8_UNORM": "",
- "R8_UINT": "",
- "R8_SNORM": "",
- "R8_SINT": "",
- "A8_UNORM": "",
- "R1_UNORM": "",
- "R9G9B9E5_SHAREDEXP": "",
- "R8G8_B8G8_UNORM": "",
- "G8R8_G8B8_UNORM": "",
- "BC1_TYPELESS": "",
- "BC1_UNORM": "BC1_RGBA_UNORM_BLOCK",
- "BC1_UNORM_SRGB": "BC1_RGBA_UNORM_SRGB_BLOCK",
- "BC2_TYPELESS": "",
- "BC2_UNORM": "BC2_RGBA_UNORM_BLOCK",
- "BC2_UNORM_SRGB": "BC2_RGBA_UNORM_SRGB_BLOCK",
- "BC3_TYPELESS": "",
- "BC3_UNORM": "BC3_RGBA_UNORM_BLOCK",
- "BC3_UNORM_SRGB": "BC3_RGBA_UNORM_SRGB_BLOCK",
- "BC4_TYPELESS": "",
- "BC4_UNORM": "",
- "BC4_SNORM": "",
- "BC5_TYPELESS": "",
- "BC5_UNORM": "",
- "BC5_SNORM": "",
- "B5G6R5_UNORM": "",
- "B5G5R5A1_UNORM": "",
- "B8G8R8A8_UNORM": "",
- "B8G8R8X8_UNORM": "",
- "R10G10B10_XR_BIAS_A2_UNORM": "",
- "B8G8R8A8_TYPELESS": "",
- "B8G8R8A8_UNORM_SRGB": "",
- "B8G8R8X8_TYPELESS": "",
- "B8G8R8X8_UNORM_SRGB": "",
- "BC6H_TYPELESS": "",
- "BC6H_UF16": "",
- "BC6H_SF16": "",
- "BC7_TYPELESS": "",
- "BC7_UNORM": "",
- "BC7_UNORM_SRGB": "",
- "AYUV": "",
- "Y410": "",
- "Y416": "",
- "NV12": "",
- "P010": "",
- "P016": "",
- "420_OPAQUE": "",
- "YUY2": "",
- "Y210": "",
- "Y216": "",
- "NV11": "",
- "AI44": "",
- "IA44": "",
- "P8": "",
- "A8P8": "",
- "B4G4R4A4_UNORM": ""
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_format_map_autogen.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_format_map_autogen.cpp
deleted file mode 100644
index b0697bc5db..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_format_map_autogen.cpp
+++ /dev/null
@@ -1,516 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by gen_dxgi_format_table.py using data from dxgi_format_data.json.
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// DXGI format info:
-// Determining metadata about a DXGI format.
-
-#include "libANGLE/renderer/Format.h"
-
-using namespace angle;
-
-namespace rx
-{
-
-namespace d3d11
-{
-
-GLenum GetComponentType(DXGI_FORMAT dxgiFormat)
-{
- switch (dxgiFormat)
- {
- case DXGI_FORMAT_420_OPAQUE:
- break;
- case DXGI_FORMAT_A8P8:
- break;
- case DXGI_FORMAT_A8_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_AI44:
- break;
- case DXGI_FORMAT_AYUV:
- break;
- case DXGI_FORMAT_B4G4R4A4_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_B5G5R5A1_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_B5G6R5_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_B8G8R8A8_TYPELESS:
- break;
- case DXGI_FORMAT_B8G8R8A8_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_B8G8R8X8_TYPELESS:
- break;
- case DXGI_FORMAT_B8G8R8X8_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_BC1_TYPELESS:
- break;
- case DXGI_FORMAT_BC1_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_BC1_UNORM_SRGB:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_BC2_TYPELESS:
- break;
- case DXGI_FORMAT_BC2_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_BC2_UNORM_SRGB:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_BC3_TYPELESS:
- break;
- case DXGI_FORMAT_BC3_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_BC3_UNORM_SRGB:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_BC4_SNORM:
- return GL_SIGNED_NORMALIZED;
- case DXGI_FORMAT_BC4_TYPELESS:
- break;
- case DXGI_FORMAT_BC4_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_BC5_SNORM:
- return GL_SIGNED_NORMALIZED;
- case DXGI_FORMAT_BC5_TYPELESS:
- break;
- case DXGI_FORMAT_BC5_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_BC6H_SF16:
- break;
- case DXGI_FORMAT_BC6H_TYPELESS:
- break;
- case DXGI_FORMAT_BC6H_UF16:
- break;
- case DXGI_FORMAT_BC7_TYPELESS:
- break;
- case DXGI_FORMAT_BC7_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_BC7_UNORM_SRGB:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_D16_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_D24_UNORM_S8_UINT:
- break;
- case DXGI_FORMAT_D32_FLOAT:
- return GL_FLOAT;
- case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
- break;
- case DXGI_FORMAT_G8R8_G8B8_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_IA44:
- break;
- case DXGI_FORMAT_NV11:
- break;
- case DXGI_FORMAT_NV12:
- break;
- case DXGI_FORMAT_P010:
- break;
- case DXGI_FORMAT_P016:
- break;
- case DXGI_FORMAT_P8:
- break;
- case DXGI_FORMAT_R10G10B10A2_TYPELESS:
- break;
- case DXGI_FORMAT_R10G10B10A2_UINT:
- return GL_UNSIGNED_INT;
- case DXGI_FORMAT_R10G10B10A2_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_R11G11B10_FLOAT:
- return GL_FLOAT;
- case DXGI_FORMAT_R16G16B16A16_FLOAT:
- return GL_FLOAT;
- case DXGI_FORMAT_R16G16B16A16_SINT:
- return GL_INT;
- case DXGI_FORMAT_R16G16B16A16_SNORM:
- return GL_SIGNED_NORMALIZED;
- case DXGI_FORMAT_R16G16B16A16_TYPELESS:
- break;
- case DXGI_FORMAT_R16G16B16A16_UINT:
- return GL_UNSIGNED_INT;
- case DXGI_FORMAT_R16G16B16A16_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_R16G16_FLOAT:
- return GL_FLOAT;
- case DXGI_FORMAT_R16G16_SINT:
- return GL_INT;
- case DXGI_FORMAT_R16G16_SNORM:
- return GL_SIGNED_NORMALIZED;
- case DXGI_FORMAT_R16G16_TYPELESS:
- break;
- case DXGI_FORMAT_R16G16_UINT:
- return GL_UNSIGNED_INT;
- case DXGI_FORMAT_R16G16_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_R16_FLOAT:
- return GL_FLOAT;
- case DXGI_FORMAT_R16_SINT:
- return GL_INT;
- case DXGI_FORMAT_R16_SNORM:
- return GL_SIGNED_NORMALIZED;
- case DXGI_FORMAT_R16_TYPELESS:
- break;
- case DXGI_FORMAT_R16_UINT:
- return GL_UNSIGNED_INT;
- case DXGI_FORMAT_R16_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_R1_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_R24G8_TYPELESS:
- break;
- case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_R32G32B32A32_FLOAT:
- return GL_FLOAT;
- case DXGI_FORMAT_R32G32B32A32_SINT:
- return GL_INT;
- case DXGI_FORMAT_R32G32B32A32_TYPELESS:
- break;
- case DXGI_FORMAT_R32G32B32A32_UINT:
- return GL_UNSIGNED_INT;
- case DXGI_FORMAT_R32G32B32_FLOAT:
- return GL_FLOAT;
- case DXGI_FORMAT_R32G32B32_SINT:
- return GL_INT;
- case DXGI_FORMAT_R32G32B32_TYPELESS:
- break;
- case DXGI_FORMAT_R32G32B32_UINT:
- return GL_UNSIGNED_INT;
- case DXGI_FORMAT_R32G32_FLOAT:
- return GL_FLOAT;
- case DXGI_FORMAT_R32G32_SINT:
- return GL_INT;
- case DXGI_FORMAT_R32G32_TYPELESS:
- break;
- case DXGI_FORMAT_R32G32_UINT:
- return GL_UNSIGNED_INT;
- case DXGI_FORMAT_R32G8X24_TYPELESS:
- break;
- case DXGI_FORMAT_R32_FLOAT:
- return GL_FLOAT;
- case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
- return GL_FLOAT;
- case DXGI_FORMAT_R32_SINT:
- return GL_INT;
- case DXGI_FORMAT_R32_TYPELESS:
- break;
- case DXGI_FORMAT_R32_UINT:
- return GL_UNSIGNED_INT;
- case DXGI_FORMAT_R8G8B8A8_SINT:
- return GL_INT;
- case DXGI_FORMAT_R8G8B8A8_SNORM:
- return GL_SIGNED_NORMALIZED;
- case DXGI_FORMAT_R8G8B8A8_TYPELESS:
- break;
- case DXGI_FORMAT_R8G8B8A8_UINT:
- return GL_UNSIGNED_INT;
- case DXGI_FORMAT_R8G8B8A8_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_R8G8_B8G8_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_R8G8_SINT:
- return GL_INT;
- case DXGI_FORMAT_R8G8_SNORM:
- return GL_SIGNED_NORMALIZED;
- case DXGI_FORMAT_R8G8_TYPELESS:
- break;
- case DXGI_FORMAT_R8G8_UINT:
- return GL_UNSIGNED_INT;
- case DXGI_FORMAT_R8G8_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_R8_SINT:
- return GL_INT;
- case DXGI_FORMAT_R8_SNORM:
- return GL_SIGNED_NORMALIZED;
- case DXGI_FORMAT_R8_TYPELESS:
- break;
- case DXGI_FORMAT_R8_UINT:
- return GL_UNSIGNED_INT;
- case DXGI_FORMAT_R8_UNORM:
- return GL_UNSIGNED_NORMALIZED;
- case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
- return GL_FLOAT;
- case DXGI_FORMAT_UNKNOWN:
- break;
- case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
- return GL_UNSIGNED_INT;
- case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
- return GL_UNSIGNED_INT;
- case DXGI_FORMAT_Y210:
- break;
- case DXGI_FORMAT_Y216:
- break;
- case DXGI_FORMAT_Y410:
- break;
- case DXGI_FORMAT_Y416:
- break;
- case DXGI_FORMAT_YUY2:
- break;
- default:
- break;
- }
-
- UNREACHABLE();
- return GL_NONE;
-}
-
-} // namespace d3d11
-
-namespace d3d11_angle
-{
-
-const Format &GetFormat(DXGI_FORMAT dxgiFormat)
-{
- switch (dxgiFormat)
- {
- case DXGI_FORMAT_420_OPAQUE:
- break;
- case DXGI_FORMAT_A8P8:
- break;
- case DXGI_FORMAT_A8_UNORM:
- return Format::Get(Format::ID::A8_UNORM);
- case DXGI_FORMAT_AI44:
- break;
- case DXGI_FORMAT_AYUV:
- break;
- case DXGI_FORMAT_B4G4R4A4_UNORM:
- return Format::Get(Format::ID::B4G4R4A4_UNORM);
- case DXGI_FORMAT_B5G5R5A1_UNORM:
- return Format::Get(Format::ID::B5G5R5A1_UNORM);
- case DXGI_FORMAT_B5G6R5_UNORM:
- return Format::Get(Format::ID::B5G6R5_UNORM);
- case DXGI_FORMAT_B8G8R8A8_TYPELESS:
- break;
- case DXGI_FORMAT_B8G8R8A8_UNORM:
- return Format::Get(Format::ID::B8G8R8A8_UNORM);
- case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
- return Format::Get(Format::ID::B8G8R8A8_UNORM_SRGB);
- case DXGI_FORMAT_B8G8R8X8_TYPELESS:
- break;
- case DXGI_FORMAT_B8G8R8X8_UNORM:
- return Format::Get(Format::ID::B8G8R8X8_UNORM);
- case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
- break;
- case DXGI_FORMAT_BC1_TYPELESS:
- break;
- case DXGI_FORMAT_BC1_UNORM:
- return Format::Get(Format::ID::BC1_RGBA_UNORM_BLOCK);
- case DXGI_FORMAT_BC1_UNORM_SRGB:
- return Format::Get(Format::ID::BC1_RGBA_UNORM_SRGB_BLOCK);
- case DXGI_FORMAT_BC2_TYPELESS:
- break;
- case DXGI_FORMAT_BC2_UNORM:
- return Format::Get(Format::ID::BC2_RGBA_UNORM_BLOCK);
- case DXGI_FORMAT_BC2_UNORM_SRGB:
- return Format::Get(Format::ID::BC2_RGBA_UNORM_SRGB_BLOCK);
- case DXGI_FORMAT_BC3_TYPELESS:
- break;
- case DXGI_FORMAT_BC3_UNORM:
- return Format::Get(Format::ID::BC3_RGBA_UNORM_BLOCK);
- case DXGI_FORMAT_BC3_UNORM_SRGB:
- return Format::Get(Format::ID::BC3_RGBA_UNORM_SRGB_BLOCK);
- case DXGI_FORMAT_BC4_SNORM:
- break;
- case DXGI_FORMAT_BC4_TYPELESS:
- break;
- case DXGI_FORMAT_BC4_UNORM:
- break;
- case DXGI_FORMAT_BC5_SNORM:
- break;
- case DXGI_FORMAT_BC5_TYPELESS:
- break;
- case DXGI_FORMAT_BC5_UNORM:
- break;
- case DXGI_FORMAT_BC6H_SF16:
- break;
- case DXGI_FORMAT_BC6H_TYPELESS:
- break;
- case DXGI_FORMAT_BC6H_UF16:
- break;
- case DXGI_FORMAT_BC7_TYPELESS:
- break;
- case DXGI_FORMAT_BC7_UNORM:
- break;
- case DXGI_FORMAT_BC7_UNORM_SRGB:
- break;
- case DXGI_FORMAT_D16_UNORM:
- return Format::Get(Format::ID::D16_UNORM);
- case DXGI_FORMAT_D24_UNORM_S8_UINT:
- return Format::Get(Format::ID::D24_UNORM_S8_UINT);
- case DXGI_FORMAT_D32_FLOAT:
- return Format::Get(Format::ID::D32_FLOAT);
- case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
- return Format::Get(Format::ID::D32_FLOAT_S8X24_UINT);
- case DXGI_FORMAT_G8R8_G8B8_UNORM:
- break;
- case DXGI_FORMAT_IA44:
- break;
- case DXGI_FORMAT_NV11:
- break;
- case DXGI_FORMAT_NV12:
- break;
- case DXGI_FORMAT_P010:
- break;
- case DXGI_FORMAT_P016:
- break;
- case DXGI_FORMAT_P8:
- break;
- case DXGI_FORMAT_R10G10B10A2_TYPELESS:
- break;
- case DXGI_FORMAT_R10G10B10A2_UINT:
- return Format::Get(Format::ID::R10G10B10A2_UINT);
- case DXGI_FORMAT_R10G10B10A2_UNORM:
- return Format::Get(Format::ID::R10G10B10A2_UNORM);
- case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
- break;
- case DXGI_FORMAT_R11G11B10_FLOAT:
- return Format::Get(Format::ID::R11G11B10_FLOAT);
- case DXGI_FORMAT_R16G16B16A16_FLOAT:
- return Format::Get(Format::ID::R16G16B16A16_FLOAT);
- case DXGI_FORMAT_R16G16B16A16_SINT:
- return Format::Get(Format::ID::R16G16B16A16_SINT);
- case DXGI_FORMAT_R16G16B16A16_SNORM:
- return Format::Get(Format::ID::R16G16B16A16_SNORM);
- case DXGI_FORMAT_R16G16B16A16_TYPELESS:
- break;
- case DXGI_FORMAT_R16G16B16A16_UINT:
- return Format::Get(Format::ID::R16G16B16A16_UINT);
- case DXGI_FORMAT_R16G16B16A16_UNORM:
- return Format::Get(Format::ID::R16G16B16A16_UNORM);
- case DXGI_FORMAT_R16G16_FLOAT:
- return Format::Get(Format::ID::R16G16_FLOAT);
- case DXGI_FORMAT_R16G16_SINT:
- return Format::Get(Format::ID::R16G16_SINT);
- case DXGI_FORMAT_R16G16_SNORM:
- return Format::Get(Format::ID::R16G16_SNORM);
- case DXGI_FORMAT_R16G16_TYPELESS:
- break;
- case DXGI_FORMAT_R16G16_UINT:
- return Format::Get(Format::ID::R16G16_UINT);
- case DXGI_FORMAT_R16G16_UNORM:
- return Format::Get(Format::ID::R16G16_UNORM);
- case DXGI_FORMAT_R16_FLOAT:
- return Format::Get(Format::ID::R16_FLOAT);
- case DXGI_FORMAT_R16_SINT:
- return Format::Get(Format::ID::R16_SINT);
- case DXGI_FORMAT_R16_SNORM:
- return Format::Get(Format::ID::R16_SNORM);
- case DXGI_FORMAT_R16_TYPELESS:
- break;
- case DXGI_FORMAT_R16_UINT:
- return Format::Get(Format::ID::R16_UINT);
- case DXGI_FORMAT_R16_UNORM:
- return Format::Get(Format::ID::R16_UNORM);
- case DXGI_FORMAT_R1_UNORM:
- break;
- case DXGI_FORMAT_R24G8_TYPELESS:
- break;
- case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
- break;
- case DXGI_FORMAT_R32G32B32A32_FLOAT:
- return Format::Get(Format::ID::R32G32B32A32_FLOAT);
- case DXGI_FORMAT_R32G32B32A32_SINT:
- return Format::Get(Format::ID::R32G32B32A32_SINT);
- case DXGI_FORMAT_R32G32B32A32_TYPELESS:
- break;
- case DXGI_FORMAT_R32G32B32A32_UINT:
- return Format::Get(Format::ID::R32G32B32A32_UINT);
- case DXGI_FORMAT_R32G32B32_FLOAT:
- return Format::Get(Format::ID::R32G32B32_FLOAT);
- case DXGI_FORMAT_R32G32B32_SINT:
- return Format::Get(Format::ID::R32G32B32_SINT);
- case DXGI_FORMAT_R32G32B32_TYPELESS:
- break;
- case DXGI_FORMAT_R32G32B32_UINT:
- return Format::Get(Format::ID::R32G32B32_UINT);
- case DXGI_FORMAT_R32G32_FLOAT:
- return Format::Get(Format::ID::R32G32_FLOAT);
- case DXGI_FORMAT_R32G32_SINT:
- return Format::Get(Format::ID::R32G32_SINT);
- case DXGI_FORMAT_R32G32_TYPELESS:
- break;
- case DXGI_FORMAT_R32G32_UINT:
- return Format::Get(Format::ID::R32G32_UINT);
- case DXGI_FORMAT_R32G8X24_TYPELESS:
- break;
- case DXGI_FORMAT_R32_FLOAT:
- return Format::Get(Format::ID::R32_FLOAT);
- case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
- break;
- case DXGI_FORMAT_R32_SINT:
- return Format::Get(Format::ID::R32_SINT);
- case DXGI_FORMAT_R32_TYPELESS:
- break;
- case DXGI_FORMAT_R32_UINT:
- return Format::Get(Format::ID::R32_UINT);
- case DXGI_FORMAT_R8G8B8A8_SINT:
- return Format::Get(Format::ID::R8G8B8A8_SINT);
- case DXGI_FORMAT_R8G8B8A8_SNORM:
- return Format::Get(Format::ID::R8G8B8A8_SNORM);
- case DXGI_FORMAT_R8G8B8A8_TYPELESS:
- break;
- case DXGI_FORMAT_R8G8B8A8_UINT:
- return Format::Get(Format::ID::R8G8B8A8_UINT);
- case DXGI_FORMAT_R8G8B8A8_UNORM:
- return Format::Get(Format::ID::R8G8B8A8_UNORM);
- case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
- return Format::Get(Format::ID::R8G8B8A8_UNORM_SRGB);
- case DXGI_FORMAT_R8G8_B8G8_UNORM:
- break;
- case DXGI_FORMAT_R8G8_SINT:
- return Format::Get(Format::ID::R8G8_SINT);
- case DXGI_FORMAT_R8G8_SNORM:
- return Format::Get(Format::ID::R8G8_SNORM);
- case DXGI_FORMAT_R8G8_TYPELESS:
- break;
- case DXGI_FORMAT_R8G8_UINT:
- return Format::Get(Format::ID::R8G8_UINT);
- case DXGI_FORMAT_R8G8_UNORM:
- return Format::Get(Format::ID::R8G8_UNORM);
- case DXGI_FORMAT_R8_SINT:
- return Format::Get(Format::ID::R8_SINT);
- case DXGI_FORMAT_R8_SNORM:
- return Format::Get(Format::ID::R8_SNORM);
- case DXGI_FORMAT_R8_TYPELESS:
- break;
- case DXGI_FORMAT_R8_UINT:
- return Format::Get(Format::ID::R8_UINT);
- case DXGI_FORMAT_R8_UNORM:
- return Format::Get(Format::ID::R8_UNORM);
- case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
- return Format::Get(Format::ID::R9G9B9E5_SHAREDEXP);
- case DXGI_FORMAT_UNKNOWN:
- return Format::Get(Format::ID::NONE);
- case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
- break;
- case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
- break;
- case DXGI_FORMAT_Y210:
- break;
- case DXGI_FORMAT_Y216:
- break;
- case DXGI_FORMAT_Y410:
- break;
- case DXGI_FORMAT_Y416:
- break;
- case DXGI_FORMAT_YUY2:
- break;
- default:
- break;
- }
-
- UNREACHABLE();
- return Format::Get(Format::ID::NONE);
-}
-
-} // namespace d3d11_angle
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_data.json b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_data.json
deleted file mode 100644
index 942745674f..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_data.json
+++ /dev/null
@@ -1,1279 +0,0 @@
-[
- {
- "DXGI_FORMAT_UNKNOWN":
- {
- "texture2D": "never",
- "texture3D": "never",
- "textureCube": "never",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R32G32B32A32_TYPELESS":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R32G32B32A32_FLOAT":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "10_0check10_1always",
- "renderTarget": "always",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "always"
- },
- "DXGI_FORMAT_R32G32B32A32_UINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R32G32B32A32_SINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R32G32B32_TYPELESS":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R32G32B32_FLOAT":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "11_0check",
- "renderTarget": "check",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R32G32B32_UINT":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "check",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R32G32B32_SINT":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "check",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R16G16B16A16_TYPELESS":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R16G16B16A16_FLOAT":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "9_3check_10_0always",
- "renderTarget": "always",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "always"
- },
- "DXGI_FORMAT_R16G16B16A16_UNORM":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "always",
- "renderTarget": "always",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "always"
- },
- "DXGI_FORMAT_R16G16B16A16_UINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R16G16B16A16_SNORM":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "10_0",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "10_0"
- },
- "DXGI_FORMAT_R16G16B16A16_SINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R32G32_TYPELESS":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R32G32_FLOAT":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "10_0check10_1always",
- "renderTarget": "always",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "10_0"
- },
- "DXGI_FORMAT_R32G32_UINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R32G32_SINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R32G8X24_TYPELESS":
- {
- "texture2D": "10_0",
- "texture3D": "never",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_D32_FLOAT_S8X24_UINT":
- {
- "texture2D": "always",
- "texture3D": "never",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "check",
- "depthStencil": "10_0",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS":
- {
- "texture2D": "always",
- "texture3D": "never",
- "textureCube": "always",
- "shaderSample": "10_0check10_1always",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_X32_TYPELESS_G8X24_UINT":
- {
- "texture2D": "always",
- "texture3D": "never",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R10G10B10A2_TYPELESS":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R10G10B10A2_UNORM":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "10_0",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "10_0"
- },
- "DXGI_FORMAT_R10G10B10A2_UINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R11G11B10_FLOAT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "10_0",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "10_0"
- },
- "DXGI_FORMAT_R8G8B8A8_TYPELESS":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R8G8B8A8_UNORM":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "always",
- "renderTarget": "always",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "always"
- },
- "DXGI_FORMAT_R8G8B8A8_UNORM_SRGB":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "always",
- "renderTarget": "always",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "always"
- },
- "DXGI_FORMAT_R8G8B8A8_UINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R8G8B8A8_SNORM":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "always",
- "renderTarget": "always",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "10_0"
- },
- "DXGI_FORMAT_R8G8B8A8_SINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R16G16_TYPELESS":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R16G16_FLOAT":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "10_0",
- "renderTarget": "always",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "always"
- },
- "DXGI_FORMAT_R16G16_UNORM":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "always",
- "renderTarget": "always",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "always"
- },
- "DXGI_FORMAT_R16G16_UINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R16G16_SNORM":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "always",
- "renderTarget": "always",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "10_0"
- },
- "DXGI_FORMAT_R16G16_SINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R32_TYPELESS":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_D32_FLOAT":
- {
- "texture2D": "always",
- "texture3D": "never",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "check",
- "depthStencil": "10_0",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R32_FLOAT":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "10_0check10_1always",
- "renderTarget": "always",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "always"
- },
- "DXGI_FORMAT_R32_UINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R32_SINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R24G8_TYPELESS":
- {
- "texture2D": "always",
- "texture3D": "never",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_D24_UNORM_S8_UINT":
- {
- "texture2D": "always",
- "texture3D": "never",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "check",
- "depthStencil": "always"
- },
- "DXGI_FORMAT_R24_UNORM_X8_TYPELESS":
- {
- "texture2D": "always",
- "texture3D": "never",
- "textureCube": "always",
- "shaderSample": "10_0check10_1always",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_X24_TYPELESS_G8_UINT":
- {
- "texture2D": "always",
- "texture3D": "never",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R8G8_TYPELESS":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R8G8_UNORM":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "9_3check_10_0always",
- "renderTarget": "9_3check_10_0always",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "10_0"
- },
- "DXGI_FORMAT_R8G8_UINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R8G8_SNORM":
- {
- "texture2D": "always",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "always",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "10_0"
- },
- "DXGI_FORMAT_R8G8_SINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R16_TYPELESS":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R16_FLOAT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "10_0",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "10_0"
- },
- "DXGI_FORMAT_D16_UNORM":
- {
- "texture2D": "always",
- "texture3D": "never",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "check",
- "depthStencil": "always",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R16_UNORM":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "always",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "10_0"
- },
- "DXGI_FORMAT_R16_UINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R16_SNORM":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "10_0",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "10_0"
- },
- "DXGI_FORMAT_R16_SINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R8_TYPELESS":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R8_UNORM":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "always",
- "renderTarget": "9_3check_10_0always",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "10_0"
- },
- "DXGI_FORMAT_R8_UINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R8_SNORM":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "10_0",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "10_0"
- },
- "DXGI_FORMAT_R8_SINT":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "never",
- "renderTarget": "10_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_A8_UNORM":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "10_0",
- "renderTarget": "always",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "10_0"
- },
- "DXGI_FORMAT_R1_UNORM":
- {
- "texture2D": "always",
- "texture3D": "11_0",
- "textureCube": "11_0",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R9G9B9E5_SHAREDEXP":
- {
- "texture2D": "10_0",
- "texture3D": "10_0",
- "textureCube": "10_0",
- "shaderSample": "10_0",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R8G8_B8G8_UNORM":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "10_0",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_G8R8_G8B8_UNORM":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "10_0",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC1_TYPELESS":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC1_UNORM":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "always",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC1_UNORM_SRGB":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "always",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC2_TYPELESS":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC2_UNORM":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "always",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC2_UNORM_SRGB":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "always",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC3_TYPELESS":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC3_UNORM":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "always",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC3_UNORM_SRGB":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "always",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC4_TYPELESS":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC4_UNORM":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "10_0",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC4_SNORM":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "10_0",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC5_TYPELESS":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC5_UNORM":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "10_0",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC5_SNORM":
- {
- "texture2D": "always",
- "texture3D": "always",
- "textureCube": "always",
- "shaderSample": "10_0",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_B5G6R5_UNORM":
- {
- "texture2D": "dxgi1_2",
- "texture3D": "dxgi1_2",
- "textureCube": "dxgi1_2",
- "shaderSample": "dxgi1_2",
- "renderTarget": "dxgi1_2",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "dxgi1_2"
- },
- "DXGI_FORMAT_B5G5R5A1_UNORM":
- {
- "texture2D": "dxgi1_2",
- "texture3D": "dxgi1_2",
- "textureCube": "dxgi1_2",
- "shaderSample": "dxgi1_2",
- "renderTarget": "check",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "dxgi1_2"
- },
- "DXGI_FORMAT_B8G8R8A8_UNORM":
- {
- "texture2D": "check",
- "texture3D": "check",
- "textureCube": "check",
- "shaderSample": "9_3always_10_0check11_0always",
- "renderTarget": "9_3always_10_0check11_0always",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "always"
- },
- "DXGI_FORMAT_B8G8R8X8_UNORM":
- {
- "texture2D": "check",
- "texture3D": "check",
- "textureCube": "check",
- "shaderSample": "10_0check11_0always",
- "renderTarget": "11_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM":
- {
- "texture2D": "check",
- "texture3D": "check",
- "textureCube": "never",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_B8G8R8A8_TYPELESS":
- {
- "texture2D": "check",
- "texture3D": "check",
- "textureCube": "check",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_B8G8R8A8_UNORM_SRGB":
- {
- "texture2D": "check",
- "texture3D": "check",
- "textureCube": "check",
- "shaderSample": "10_0check11_0always",
- "renderTarget": "11_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_B8G8R8X8_TYPELESS":
- {
- "texture2D": "check",
- "texture3D": "check",
- "textureCube": "check",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_B8G8R8X8_UNORM_SRGB":
- {
- "texture2D": "check",
- "texture3D": "check",
- "textureCube": "check",
- "shaderSample": "10_0check11_0always",
- "renderTarget": "11_0",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC6H_TYPELESS":
- {
- "texture2D": "11_0",
- "texture3D": "11_0",
- "textureCube": "11_0",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC6H_UF16":
- {
- "texture2D": "11_0",
- "texture3D": "11_0",
- "textureCube": "11_0",
- "shaderSample": "11_0",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC6H_SF16":
- {
- "texture2D": "11_0",
- "texture3D": "11_0",
- "textureCube": "11_0",
- "shaderSample": "11_0",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC7_TYPELESS":
- {
- "texture2D": "11_0",
- "texture3D": "11_0",
- "textureCube": "11_0",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC7_UNORM":
- {
- "texture2D": "11_0",
- "texture3D": "11_0",
- "textureCube": "11_0",
- "shaderSample": "11_0",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_BC7_UNORM_SRGB":
- {
- "texture2D": "11_0",
- "texture3D": "11_0",
- "textureCube": "11_0",
- "shaderSample": "11_0",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_AYUV":
- {
- "texture2D": "11_1",
- "texture3D": "never",
- "textureCube": "never",
- "shaderSample": "11_1",
- "renderTarget": "11_1",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_Y410":
- {
- "texture2D": "11_1",
- "texture3D": "never",
- "textureCube": "never",
- "shaderSample": "11_1",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_Y416":
- {
- "texture2D": "11_1",
- "texture3D": "never",
- "textureCube": "never",
- "shaderSample": "11_1",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_NV12":
- {
- "texture2D": "11_1",
- "texture3D": "never",
- "textureCube": "never",
- "shaderSample": "11_1",
- "renderTarget": "11_1",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_P010":
- {
- "texture2D": "11_1",
- "texture3D": "never",
- "textureCube": "never",
- "shaderSample": "11_1",
- "renderTarget": "11_1",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_P016":
- {
- "texture2D": "11_1",
- "texture3D": "never",
- "textureCube": "never",
- "shaderSample": "11_1",
- "renderTarget": "11_1",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_420_OPAQUE":
- {
- "texture2D": "11_1",
- "texture3D": "never",
- "textureCube": "never",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_YUY2":
- {
- "texture2D": "11_1",
- "texture3D": "never",
- "textureCube": "never",
- "shaderSample": "11_1",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_Y210":
- {
- "texture2D": "11_1",
- "texture3D": "never",
- "textureCube": "never",
- "shaderSample": "11_1",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_Y216":
- {
- "texture2D": "11_1",
- "texture3D": "never",
- "textureCube": "never",
- "shaderSample": "11_1",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_NV11":
- {
- "texture2D": "11_1",
- "texture3D": "never",
- "textureCube": "never",
- "shaderSample": "11_1",
- "renderTarget": "11_1",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_AI44":
- {
- "texture2D": "11_1",
- "texture3D": "never",
- "textureCube": "never",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_IA44":
- {
- "texture2D": "11_1",
- "texture3D": "never",
- "textureCube": "never",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_P8":
- {
- "texture2D": "11_1",
- "texture3D": "never",
- "textureCube": "never",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_A8P8":
- {
- "texture2D": "11_1",
- "texture3D": "never",
- "textureCube": "never",
- "shaderSample": "never",
- "renderTarget": "never",
- "multisampleRT": "never",
- "depthStencil": "never",
- "mipAutoGen": "never"
- },
- "DXGI_FORMAT_B4G4R4A4_UNORM":
- {
- "texture2D": "dxgi1_2",
- "texture3D": "dxgi1_2",
- "textureCube": "dxgi1_2",
- "shaderSample": "dxgi1_2",
- "renderTarget": "check",
- "multisampleRT": "check",
- "depthStencil": "never",
- "mipAutoGen": "dxgi1_2"
- }
- }
-]
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp
deleted file mode 100644
index 4d7e46bdf2..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp
+++ /dev/null
@@ -1,3042 +0,0 @@
-// GENERATED FILE - DO NOT EDIT. See dxgi_support_data.json.
-//
-// Copyright 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// dxgi_support_table:
-// Queries for DXGI support of various texture formats. Depends on DXGI
-// version, D3D feature level, and is sometimes guaranteed or optional.
-//
-
-#include "libANGLE/renderer/d3d/d3d11/dxgi_support_table.h"
-
-#include "common/debug.h"
-
-namespace rx
-{
-
-namespace d3d11
-{
-
-#define F_2D D3D11_FORMAT_SUPPORT_TEXTURE2D
-#define F_3D D3D11_FORMAT_SUPPORT_TEXTURE3D
-#define F_CUBE D3D11_FORMAT_SUPPORT_TEXTURECUBE
-#define F_SAMPLE D3D11_FORMAT_SUPPORT_SHADER_SAMPLE
-#define F_RT D3D11_FORMAT_SUPPORT_RENDER_TARGET
-#define F_MS D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET
-#define F_DS D3D11_FORMAT_SUPPORT_DEPTH_STENCIL
-#define F_MIPGEN D3D11_FORMAT_SUPPORT_MIP_AUTOGEN
-
-namespace
-{
-
-const DXGISupport &GetDefaultSupport()
-{
- static UINT AllSupportFlags =
- D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_TEXTURE3D |
- D3D11_FORMAT_SUPPORT_TEXTURECUBE | D3D11_FORMAT_SUPPORT_SHADER_SAMPLE |
- D3D11_FORMAT_SUPPORT_RENDER_TARGET | D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET |
- D3D11_FORMAT_SUPPORT_DEPTH_STENCIL | D3D11_FORMAT_SUPPORT_MIP_AUTOGEN;
- static const DXGISupport defaultSupport(0, 0, AllSupportFlags);
- return defaultSupport;
-}
-
-const DXGISupport &GetDXGISupport_9_3(DXGI_FORMAT dxgiFormat)
-{
- // clang-format off
- switch (dxgiFormat)
- {
- case DXGI_FORMAT_420_OPAQUE:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_A8P8:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_A8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_AI44:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_AYUV:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_B4G4R4A4_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_B5G5R5A1_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_B5G6R5_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_B8G8R8A8_TYPELESS:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE);
- return info;
- }
- case DXGI_FORMAT_B8G8R8A8_UNORM:
- {
- static const DXGISupport info(F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_2D | F_3D | F_CUBE | F_MS);
- return info;
- }
- case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS);
- return info;
- }
- case DXGI_FORMAT_B8G8R8X8_TYPELESS:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE);
- return info;
- }
- case DXGI_FORMAT_B8G8R8X8_UNORM:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS);
- return info;
- }
- case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS);
- return info;
- }
- case DXGI_FORMAT_BC1_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC1_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC1_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC2_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC2_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC2_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC3_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC3_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC3_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC4_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC4_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC4_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC5_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC5_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC5_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC6H_SF16:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC6H_TYPELESS:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC6H_UF16:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC7_TYPELESS:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC7_UNORM:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC7_UNORM_SRGB:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_D16_UNORM:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_D24_UNORM_S8_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_D32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_G8R8_G8B8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_IA44:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_NV11:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_NV12:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_P010:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_P016:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_P8:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R10G10B10A2_TYPELESS:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R10G10B10A2_UINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R10G10B10A2_UNORM:
- {
- static const DXGISupport info(0, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
- {
- static const DXGISupport info(0, F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D);
- return info;
- }
- case DXGI_FORMAT_R11G11B10_FLOAT:
- {
- static const DXGISupport info(0, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT, F_DS, F_MS | F_SAMPLE);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_SINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_SNORM:
- {
- static const DXGISupport info(0, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_UINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_SINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R16G16_UINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_FLOAT:
- {
- static const DXGISupport info(0, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_SINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_SNORM:
- {
- static const DXGISupport info(0, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R16_UINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R1_UNORM:
- {
- static const DXGISupport info(F_2D, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R24G8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_SINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_UINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_R32G32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32_SINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32_UINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G8X24_TYPELESS:
- {
- static const DXGISupport info(0, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_R32_SINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32_TYPELESS:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32_UINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_SINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_UINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_B8G8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_R8G8_SINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_SNORM:
- {
- static const DXGISupport info(F_2D | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R8G8_UINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_UNORM:
- {
- static const DXGISupport info(0, F_DS, F_MS | F_RT | F_SAMPLE);
- return info;
- }
- case DXGI_FORMAT_R8_SINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_SNORM:
- {
- static const DXGISupport info(0, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R8_UINT:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_UNKNOWN:
- {
- static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_Y210:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_Y216:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_Y410:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_Y416:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_YUY2:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
-
- default:
- UNREACHABLE();
- return GetDefaultSupport();
- }
- // clang-format on
-}
-
-const DXGISupport &GetDXGISupport_10_0(DXGI_FORMAT dxgiFormat)
-{
- // clang-format off
- switch (dxgiFormat)
- {
- case DXGI_FORMAT_420_OPAQUE:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_A8P8:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_A8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_AI44:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_AYUV:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_B4G4R4A4_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_B5G5R5A1_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_B5G6R5_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_B8G8R8A8_TYPELESS:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE);
- return info;
- }
- case DXGI_FORMAT_B8G8R8A8_UNORM:
- {
- static const DXGISupport info(F_MIPGEN, F_DS, F_2D | F_3D | F_CUBE | F_MS | F_RT | F_SAMPLE);
- return info;
- }
- case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS | F_SAMPLE);
- return info;
- }
- case DXGI_FORMAT_B8G8R8X8_TYPELESS:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE);
- return info;
- }
- case DXGI_FORMAT_B8G8R8X8_UNORM:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS | F_SAMPLE);
- return info;
- }
- case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS | F_SAMPLE);
- return info;
- }
- case DXGI_FORMAT_BC1_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC1_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC1_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC2_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC2_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC2_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC3_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC3_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC3_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC4_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC4_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC4_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC5_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC5_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC5_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC6H_SF16:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC6H_TYPELESS:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC6H_UF16:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC7_TYPELESS:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC7_UNORM:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC7_UNORM_SRGB:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_D16_UNORM:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_D24_UNORM_S8_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_D32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_G8R8_G8B8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_IA44:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_NV11:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_NV12:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_P010:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_P016:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_P8:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R10G10B10A2_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R10G10B10A2_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R10G10B10A2_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
- {
- static const DXGISupport info(0, F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D);
- return info;
- }
- case DXGI_FORMAT_R11G11B10_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R16G16_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R16_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R1_UNORM:
- {
- static const DXGISupport info(F_2D, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R24G8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, F_SAMPLE);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT, F_DS, F_MS | F_SAMPLE);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_R32G32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT, F_DS, F_MS | F_SAMPLE);
- return info;
- }
- case DXGI_FORMAT_R32G32_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G8X24_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT, F_DS, F_MS | F_SAMPLE);
- return info;
- }
- case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, F_SAMPLE);
- return info;
- }
- case DXGI_FORMAT_R32_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_B8G8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_R8G8_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R8G8_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R8_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_UNKNOWN:
- {
- static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_Y210:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_Y216:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_Y410:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_Y416:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_YUY2:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
-
- default:
- UNREACHABLE();
- return GetDefaultSupport();
- }
- // clang-format on
-}
-
-const DXGISupport &GetDXGISupport_10_1(DXGI_FORMAT dxgiFormat)
-{
- // clang-format off
- switch (dxgiFormat)
- {
- case DXGI_FORMAT_420_OPAQUE:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_A8P8:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_A8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_AI44:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_AYUV:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_B4G4R4A4_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_B5G5R5A1_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_B5G6R5_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_B8G8R8A8_TYPELESS:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE);
- return info;
- }
- case DXGI_FORMAT_B8G8R8A8_UNORM:
- {
- static const DXGISupport info(F_MIPGEN, F_DS, F_2D | F_3D | F_CUBE | F_MS | F_RT | F_SAMPLE);
- return info;
- }
- case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS | F_SAMPLE);
- return info;
- }
- case DXGI_FORMAT_B8G8R8X8_TYPELESS:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE);
- return info;
- }
- case DXGI_FORMAT_B8G8R8X8_UNORM:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS | F_SAMPLE);
- return info;
- }
- case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS | F_SAMPLE);
- return info;
- }
- case DXGI_FORMAT_BC1_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC1_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC1_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC2_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC2_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC2_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC3_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC3_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC3_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC4_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC4_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC4_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC5_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC5_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC5_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC6H_SF16:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC6H_TYPELESS:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC6H_UF16:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC7_TYPELESS:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC7_UNORM:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC7_UNORM_SRGB:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_D16_UNORM:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_D24_UNORM_S8_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_D32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_G8R8_G8B8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_IA44:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_NV11:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_NV12:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_P010:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_P016:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_P8:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R10G10B10A2_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R10G10B10A2_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R10G10B10A2_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
- {
- static const DXGISupport info(0, F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D);
- return info;
- }
- case DXGI_FORMAT_R11G11B10_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R16G16_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R16_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R1_UNORM:
- {
- static const DXGISupport info(F_2D, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R24G8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_SAMPLE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_R32G32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G8X24_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_SAMPLE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_R32_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_B8G8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_R8G8_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R8G8_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R8_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_UNKNOWN:
- {
- static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_Y210:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_Y216:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_Y410:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_Y416:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_YUY2:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
-
- default:
- UNREACHABLE();
- return GetDefaultSupport();
- }
- // clang-format on
-}
-
-const DXGISupport &GetDXGISupport_11_0(DXGI_FORMAT dxgiFormat)
-{
- // clang-format off
- switch (dxgiFormat)
- {
- case DXGI_FORMAT_420_OPAQUE:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_A8P8:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_A8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_AI44:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_AYUV:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_B4G4R4A4_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_B5G5R5A1_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_B5G6R5_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_B8G8R8A8_TYPELESS:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE);
- return info;
- }
- case DXGI_FORMAT_B8G8R8A8_UNORM:
- {
- static const DXGISupport info(F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_2D | F_3D | F_CUBE | F_MS);
- return info;
- }
- case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
- {
- static const DXGISupport info(F_RT | F_SAMPLE, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS);
- return info;
- }
- case DXGI_FORMAT_B8G8R8X8_TYPELESS:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE);
- return info;
- }
- case DXGI_FORMAT_B8G8R8X8_UNORM:
- {
- static const DXGISupport info(F_RT | F_SAMPLE, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS);
- return info;
- }
- case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
- {
- static const DXGISupport info(F_RT | F_SAMPLE, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS);
- return info;
- }
- case DXGI_FORMAT_BC1_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC1_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC1_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC2_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC2_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC2_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC3_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC3_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC3_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC4_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC4_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC4_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC5_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC5_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC5_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC6H_SF16:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC6H_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC6H_UF16:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC7_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC7_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC7_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_D16_UNORM:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_D24_UNORM_S8_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_D32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_G8R8_G8B8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_IA44:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_NV11:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_NV12:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_P010:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_P016:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_P8:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R10G10B10A2_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R10G10B10A2_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R10G10B10A2_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
- {
- static const DXGISupport info(0, F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D);
- return info;
- }
- case DXGI_FORMAT_R11G11B10_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R16G16_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R16_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R1_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R24G8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_SAMPLE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_R32G32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G8X24_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_SAMPLE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_R32_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_B8G8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_R8G8_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R8G8_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R8_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_UNKNOWN:
- {
- static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_Y210:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_Y216:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_Y410:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_Y416:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_YUY2:
- {
- static const DXGISupport info(0, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
-
- default:
- UNREACHABLE();
- return GetDefaultSupport();
- }
- // clang-format on
-}
-
-const DXGISupport &GetDXGISupport_11_1(DXGI_FORMAT dxgiFormat)
-{
- // clang-format off
- switch (dxgiFormat)
- {
- case DXGI_FORMAT_420_OPAQUE:
- {
- static const DXGISupport info(F_2D, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_A8P8:
- {
- static const DXGISupport info(F_2D, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_A8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_AI44:
- {
- static const DXGISupport info(F_2D, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_AYUV:
- {
- static const DXGISupport info(F_2D | F_RT | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_B4G4R4A4_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_B5G5R5A1_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_SAMPLE, F_DS, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_B5G6R5_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_B8G8R8A8_TYPELESS:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE);
- return info;
- }
- case DXGI_FORMAT_B8G8R8A8_UNORM:
- {
- static const DXGISupport info(F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_2D | F_3D | F_CUBE | F_MS);
- return info;
- }
- case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
- {
- static const DXGISupport info(F_RT | F_SAMPLE, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS);
- return info;
- }
- case DXGI_FORMAT_B8G8R8X8_TYPELESS:
- {
- static const DXGISupport info(0, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE);
- return info;
- }
- case DXGI_FORMAT_B8G8R8X8_UNORM:
- {
- static const DXGISupport info(F_RT | F_SAMPLE, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS);
- return info;
- }
- case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
- {
- static const DXGISupport info(F_RT | F_SAMPLE, F_DS | F_MIPGEN, F_2D | F_3D | F_CUBE | F_MS);
- return info;
- }
- case DXGI_FORMAT_BC1_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC1_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC1_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC2_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC2_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC2_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC3_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC3_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC3_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC4_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC4_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC4_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC5_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC5_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC5_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC6H_SF16:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC6H_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC6H_UF16:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC7_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_BC7_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_BC7_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_D16_UNORM:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_D24_UNORM_S8_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_D32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_MIPGEN | F_RT | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_G8R8_G8B8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_IA44:
- {
- static const DXGISupport info(F_2D, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_NV11:
- {
- static const DXGISupport info(F_2D | F_RT | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_NV12:
- {
- static const DXGISupport info(F_2D | F_RT | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_P010:
- {
- static const DXGISupport info(F_2D | F_RT | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_P016:
- {
- static const DXGISupport info(F_2D | F_RT | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN, F_MS);
- return info;
- }
- case DXGI_FORMAT_P8:
- {
- static const DXGISupport info(F_2D, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R10G10B10A2_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R10G10B10A2_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R10G10B10A2_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
- {
- static const DXGISupport info(0, F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, F_2D | F_3D);
- return info;
- }
- case DXGI_FORMAT_R11G11B10_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16B16A16_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R16G16_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16G16_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R16_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R16_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R1_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R24G8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_SAMPLE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32B32A32_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32B32_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_SAMPLE, F_MS | F_RT);
- return info;
- }
- case DXGI_FORMAT_R32G32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32G32_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32G8X24_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32_FLOAT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_CUBE | F_SAMPLE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_R32_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R32_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R32_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_B8G8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_R8G8_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R8G8_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8G8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_SINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_SNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_TYPELESS:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_R8_UINT:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_MIPGEN | F_SAMPLE, F_MS);
- return info;
- }
- case DXGI_FORMAT_R8_UNORM:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_MIPGEN | F_RT | F_SAMPLE, F_DS, F_MS);
- return info;
- }
- case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
- {
- static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_UNKNOWN:
- {
- static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
- {
- static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MIPGEN | F_MS | F_RT | F_SAMPLE, 0);
- return info;
- }
- case DXGI_FORMAT_Y210:
- {
- static const DXGISupport info(F_2D | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_Y216:
- {
- static const DXGISupport info(F_2D | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_Y410:
- {
- static const DXGISupport info(F_2D | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_Y416:
- {
- static const DXGISupport info(F_2D | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
- case DXGI_FORMAT_YUY2:
- {
- static const DXGISupport info(F_2D | F_SAMPLE, F_3D | F_CUBE | F_DS | F_MIPGEN | F_MS | F_RT, 0);
- return info;
- }
-
- default:
- UNREACHABLE();
- return GetDefaultSupport();
- }
- // clang-format on
-}
-
-}
-
-#undef F_2D
-#undef F_3D
-#undef F_CUBE
-#undef F_SAMPLE
-#undef F_RT
-#undef F_MS
-#undef F_DS
-#undef F_MIPGEN
-
-const DXGISupport &GetDXGISupport(DXGI_FORMAT dxgiFormat, D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_9_3:
- return GetDXGISupport_9_3(dxgiFormat);
- case D3D_FEATURE_LEVEL_10_0:
- return GetDXGISupport_10_0(dxgiFormat);
- case D3D_FEATURE_LEVEL_10_1:
- return GetDXGISupport_10_1(dxgiFormat);
- case D3D_FEATURE_LEVEL_11_0:
- return GetDXGISupport_11_0(dxgiFormat);
- case D3D_FEATURE_LEVEL_11_1:
- return GetDXGISupport_11_1(dxgiFormat);
- default:
- return GetDefaultSupport();
- }
-}
-
-} // namespace d3d11
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h
deleted file mode 100644
index a818f376ef..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h
+++ /dev/null
@@ -1,49 +0,0 @@
-//
-// Copyright 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// dxgi_support_table:
-// Queries for DXGI support of various texture formats. Depends on DXGI
-// version, D3D feature level, and is sometimes guaranteed or optional.
-//
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_DXGI_SUPPORT_TABLE_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_DXGI_SUPPORT_TABLE_H_
-
-#include "common/platform.h"
-
-namespace rx
-{
-
-namespace d3d11
-{
-
-struct DXGISupport
-{
- DXGISupport()
- : alwaysSupportedFlags(0),
- neverSupportedFlags(0),
- optionallySupportedFlags(0)
- {
- }
-
- DXGISupport(UINT alwaysSupportedIn, UINT neverSupportedIn, UINT optionallySupportedIn)
- : alwaysSupportedFlags(alwaysSupportedIn),
- neverSupportedFlags(neverSupportedIn),
- optionallySupportedFlags(optionallySupportedIn)
- {
- }
-
- UINT alwaysSupportedFlags;
- UINT neverSupportedFlags;
- UINT optionallySupportedFlags;
-};
-
-const DXGISupport &GetDXGISupport(DXGI_FORMAT dxgiFormat, D3D_FEATURE_LEVEL featureLevel);
-
-} // namespace d3d11
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_DXGI_SUPPORT_TABLE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/formatutils11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/formatutils11.cpp
deleted file mode 100644
index ce4edd26db..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/formatutils11.cpp
+++ /dev/null
@@ -1,1023 +0,0 @@
-//
-// Copyright (c) 2013-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// formatutils11.cpp: Queries for GL image formats and their translations to D3D11
-// formats.
-
-#include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
-
-#include "image_util/copyimage.h"
-#include "image_util/generatemip.h"
-#include "image_util/loadimage.h"
-
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/d3d/d3d11/copyvertex.h"
-#include "libANGLE/renderer/d3d/d3d11/dxgi_support_table.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-
-namespace rx
-{
-
-namespace d3d11
-{
-
-bool SupportsMipGen(DXGI_FORMAT dxgiFormat, D3D_FEATURE_LEVEL featureLevel)
-{
- const auto &support = GetDXGISupport(dxgiFormat, featureLevel);
- ASSERT((support.optionallySupportedFlags & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN) == 0);
- return ((support.alwaysSupportedFlags & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN) != 0);
-}
-
-DXGIFormatSize::DXGIFormatSize(GLuint pixelBits, GLuint blockWidth, GLuint blockHeight)
- : pixelBytes(pixelBits / 8), blockWidth(blockWidth), blockHeight(blockHeight)
-{
-}
-
-const DXGIFormatSize &GetDXGIFormatSizeInfo(DXGI_FORMAT format)
-{
- static const DXGIFormatSize sizeUnknown(0, 0, 0);
- static const DXGIFormatSize size128(128, 1, 1);
- static const DXGIFormatSize size96(96, 1, 1);
- static const DXGIFormatSize size64(64, 1, 1);
- static const DXGIFormatSize size32(32, 1, 1);
- static const DXGIFormatSize size16(16, 1, 1);
- static const DXGIFormatSize size8(8, 1, 1);
- static const DXGIFormatSize sizeBC1(64, 4, 4);
- static const DXGIFormatSize sizeBC2(128, 4, 4);
- static const DXGIFormatSize sizeBC3(128, 4, 4);
- static const DXGIFormatSize sizeBC4(64, 4, 4);
- static const DXGIFormatSize sizeBC5(128, 4, 4);
- static const DXGIFormatSize sizeBC6H(128, 4, 4);
- static const DXGIFormatSize sizeBC7(128, 4, 4);
- switch (format)
- {
- case DXGI_FORMAT_UNKNOWN:
- return sizeUnknown;
- case DXGI_FORMAT_R32G32B32A32_TYPELESS:
- case DXGI_FORMAT_R32G32B32A32_FLOAT:
- case DXGI_FORMAT_R32G32B32A32_UINT:
- case DXGI_FORMAT_R32G32B32A32_SINT:
- return size128;
- case DXGI_FORMAT_R32G32B32_TYPELESS:
- case DXGI_FORMAT_R32G32B32_FLOAT:
- case DXGI_FORMAT_R32G32B32_UINT:
- case DXGI_FORMAT_R32G32B32_SINT:
- return size96;
- case DXGI_FORMAT_R16G16B16A16_TYPELESS:
- case DXGI_FORMAT_R16G16B16A16_FLOAT:
- case DXGI_FORMAT_R16G16B16A16_UNORM:
- case DXGI_FORMAT_R16G16B16A16_UINT:
- case DXGI_FORMAT_R16G16B16A16_SNORM:
- case DXGI_FORMAT_R16G16B16A16_SINT:
- case DXGI_FORMAT_R32G32_TYPELESS:
- case DXGI_FORMAT_R32G32_FLOAT:
- case DXGI_FORMAT_R32G32_UINT:
- case DXGI_FORMAT_R32G32_SINT:
- case DXGI_FORMAT_R32G8X24_TYPELESS:
- case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
- case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
- case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
- return size64;
- case DXGI_FORMAT_R10G10B10A2_TYPELESS:
- case DXGI_FORMAT_R10G10B10A2_UNORM:
- case DXGI_FORMAT_R10G10B10A2_UINT:
- case DXGI_FORMAT_R11G11B10_FLOAT:
- case DXGI_FORMAT_R8G8B8A8_TYPELESS:
- case DXGI_FORMAT_R8G8B8A8_UNORM:
- case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
- case DXGI_FORMAT_R8G8B8A8_UINT:
- case DXGI_FORMAT_R8G8B8A8_SNORM:
- case DXGI_FORMAT_R8G8B8A8_SINT:
- case DXGI_FORMAT_R16G16_TYPELESS:
- case DXGI_FORMAT_R16G16_FLOAT:
- case DXGI_FORMAT_R16G16_UNORM:
- case DXGI_FORMAT_R16G16_UINT:
- case DXGI_FORMAT_R16G16_SNORM:
- case DXGI_FORMAT_R16G16_SINT:
- case DXGI_FORMAT_R32_TYPELESS:
- case DXGI_FORMAT_D32_FLOAT:
- case DXGI_FORMAT_R32_FLOAT:
- case DXGI_FORMAT_R32_UINT:
- case DXGI_FORMAT_R32_SINT:
- case DXGI_FORMAT_R24G8_TYPELESS:
- case DXGI_FORMAT_D24_UNORM_S8_UINT:
- case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
- case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
- return size32;
- case DXGI_FORMAT_R8G8_TYPELESS:
- case DXGI_FORMAT_R8G8_UNORM:
- case DXGI_FORMAT_R8G8_UINT:
- case DXGI_FORMAT_R8G8_SNORM:
- case DXGI_FORMAT_R8G8_SINT:
- case DXGI_FORMAT_R16_TYPELESS:
- case DXGI_FORMAT_R16_FLOAT:
- case DXGI_FORMAT_D16_UNORM:
- case DXGI_FORMAT_R16_UNORM:
- case DXGI_FORMAT_R16_UINT:
- case DXGI_FORMAT_R16_SNORM:
- case DXGI_FORMAT_R16_SINT:
- return size16;
- case DXGI_FORMAT_R8_TYPELESS:
- case DXGI_FORMAT_R8_UNORM:
- case DXGI_FORMAT_R8_UINT:
- case DXGI_FORMAT_R8_SNORM:
- case DXGI_FORMAT_R8_SINT:
- case DXGI_FORMAT_A8_UNORM:
- return size8;
- case DXGI_FORMAT_R1_UNORM:
- UNREACHABLE();
- return sizeUnknown;
- case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
- case DXGI_FORMAT_R8G8_B8G8_UNORM:
- case DXGI_FORMAT_G8R8_G8B8_UNORM:
- return size32;
- case DXGI_FORMAT_BC1_TYPELESS:
- case DXGI_FORMAT_BC1_UNORM:
- case DXGI_FORMAT_BC1_UNORM_SRGB:
- return sizeBC1;
- case DXGI_FORMAT_BC2_TYPELESS:
- case DXGI_FORMAT_BC2_UNORM:
- case DXGI_FORMAT_BC2_UNORM_SRGB:
- return sizeBC2;
- case DXGI_FORMAT_BC3_TYPELESS:
- case DXGI_FORMAT_BC3_UNORM:
- case DXGI_FORMAT_BC3_UNORM_SRGB:
- return sizeBC3;
- case DXGI_FORMAT_BC4_TYPELESS:
- case DXGI_FORMAT_BC4_UNORM:
- case DXGI_FORMAT_BC4_SNORM:
- return sizeBC4;
- case DXGI_FORMAT_BC5_TYPELESS:
- case DXGI_FORMAT_BC5_UNORM:
- case DXGI_FORMAT_BC5_SNORM:
- return sizeBC5;
- case DXGI_FORMAT_B5G6R5_UNORM:
- case DXGI_FORMAT_B5G5R5A1_UNORM:
- return size16;
- case DXGI_FORMAT_B8G8R8A8_UNORM:
- case DXGI_FORMAT_B8G8R8X8_UNORM:
- case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
- case DXGI_FORMAT_B8G8R8A8_TYPELESS:
- case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
- case DXGI_FORMAT_B8G8R8X8_TYPELESS:
- case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
- return size32;
- case DXGI_FORMAT_BC6H_TYPELESS:
- case DXGI_FORMAT_BC6H_UF16:
- case DXGI_FORMAT_BC6H_SF16:
- return sizeBC6H;
- case DXGI_FORMAT_BC7_TYPELESS:
- case DXGI_FORMAT_BC7_UNORM:
- case DXGI_FORMAT_BC7_UNORM_SRGB:
- return sizeBC7;
- case DXGI_FORMAT_AYUV:
- case DXGI_FORMAT_Y410:
- case DXGI_FORMAT_Y416:
- case DXGI_FORMAT_NV12:
- case DXGI_FORMAT_P010:
- case DXGI_FORMAT_P016:
- case DXGI_FORMAT_420_OPAQUE:
- case DXGI_FORMAT_YUY2:
- case DXGI_FORMAT_Y210:
- case DXGI_FORMAT_Y216:
- case DXGI_FORMAT_NV11:
- case DXGI_FORMAT_AI44:
- case DXGI_FORMAT_IA44:
- case DXGI_FORMAT_P8:
- case DXGI_FORMAT_A8P8:
- UNREACHABLE();
- return sizeUnknown;
- case DXGI_FORMAT_B4G4R4A4_UNORM:
- return size16;
- default:
- UNREACHABLE();
- return sizeUnknown;
- }
-}
-
-constexpr VertexFormat::VertexFormat()
- : conversionType(VERTEX_CONVERT_NONE), nativeFormat(DXGI_FORMAT_UNKNOWN), copyFunction(nullptr)
-{
-}
-
-constexpr VertexFormat::VertexFormat(VertexConversionType conversionTypeIn,
- DXGI_FORMAT nativeFormatIn,
- VertexCopyFunction copyFunctionIn)
- : conversionType(conversionTypeIn), nativeFormat(nativeFormatIn), copyFunction(copyFunctionIn)
-{
-}
-
-const VertexFormat *GetVertexFormatInfo_FL_9_3(gl::VertexFormatType vertexFormatType)
-{
- // D3D11 Feature Level 9_3 doesn't support as many formats for vertex buffer resource as Feature
- // Level 10_0+.
- // http://msdn.microsoft.com/en-us/library/windows/desktop/ff471324(v=vs.85).aspx
-
- switch (vertexFormatType)
- {
- // GL_BYTE -- unnormalized
- case gl::VERTEX_FORMAT_SBYTE1:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16_SINT,
- &Copy8SintTo16SintVertexData<1, 2>);
- return &info;
- }
- case gl::VERTEX_FORMAT_SBYTE2:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16_SINT,
- &Copy8SintTo16SintVertexData<2, 2>);
- return &info;
- }
- case gl::VERTEX_FORMAT_SBYTE3:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT,
- &Copy8SintTo16SintVertexData<3, 4>);
- return &info;
- }
- case gl::VERTEX_FORMAT_SBYTE4:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT,
- &Copy8SintTo16SintVertexData<4, 4>);
- return &info;
- }
-
- // GL_BYTE -- normalized
- case gl::VERTEX_FORMAT_SBYTE1_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16_SNORM,
- &Copy8SnormTo16SnormVertexData<1, 2>);
- return &info;
- }
- case gl::VERTEX_FORMAT_SBYTE2_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16_SNORM,
- &Copy8SnormTo16SnormVertexData<2, 2>);
- return &info;
- }
- case gl::VERTEX_FORMAT_SBYTE3_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SNORM,
- &Copy8SnormTo16SnormVertexData<3, 4>);
- return &info;
- }
- case gl::VERTEX_FORMAT_SBYTE4_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SNORM,
- &Copy8SnormTo16SnormVertexData<4, 4>);
- return &info;
- }
-
- // GL_UNSIGNED_BYTE -- un-normalized
- // NOTE: 3 and 4 component unnormalized GL_UNSIGNED_BYTE should use the default format
- // table.
- case gl::VERTEX_FORMAT_UBYTE1:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT,
- &CopyNativeVertexData<GLubyte, 1, 4, 1>);
- return &info;
- }
- case gl::VERTEX_FORMAT_UBYTE2:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT,
- &CopyNativeVertexData<GLubyte, 2, 4, 1>);
- return &info;
- }
-
- // GL_UNSIGNED_BYTE -- normalized
- // NOTE: 3 and 4 component normalized GL_UNSIGNED_BYTE should use the default format table.
-
- // GL_UNSIGNED_BYTE -- normalized
- case gl::VERTEX_FORMAT_UBYTE1_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UNORM,
- &CopyNativeVertexData<GLubyte, 1, 4, UINT8_MAX>);
- return &info;
- }
- case gl::VERTEX_FORMAT_UBYTE2_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UNORM,
- &CopyNativeVertexData<GLubyte, 2, 4, UINT8_MAX>);
- return &info;
- }
-
- // GL_SHORT -- un-normalized
- // NOTE: 2, 3 and 4 component unnormalized GL_SHORT should use the default format table.
- case gl::VERTEX_FORMAT_SSHORT1:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16_SINT,
- &CopyNativeVertexData<GLshort, 1, 2, 0>);
- return &info;
- }
-
- // GL_SHORT -- normalized
- // NOTE: 2, 3 and 4 component normalized GL_SHORT should use the default format table.
- case gl::VERTEX_FORMAT_SSHORT1_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16_SNORM,
- &CopyNativeVertexData<GLshort, 1, 2, 0>);
- return &info;
- }
-
- // GL_UNSIGNED_SHORT -- un-normalized
- case gl::VERTEX_FORMAT_USHORT1:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
- &CopyTo32FVertexData<GLushort, 1, 2, false>);
- return &info;
- }
- case gl::VERTEX_FORMAT_USHORT2:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
- &CopyTo32FVertexData<GLushort, 2, 2, false>);
- return &info;
- }
- case gl::VERTEX_FORMAT_USHORT3:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT,
- &CopyTo32FVertexData<GLushort, 3, 3, false>);
- return &info;
- }
- case gl::VERTEX_FORMAT_USHORT4:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
- &CopyTo32FVertexData<GLushort, 4, 4, false>);
- return &info;
- }
-
- // GL_UNSIGNED_SHORT -- normalized
- case gl::VERTEX_FORMAT_USHORT1_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
- &CopyTo32FVertexData<GLushort, 1, 2, true>);
- return &info;
- }
- case gl::VERTEX_FORMAT_USHORT2_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
- &CopyTo32FVertexData<GLushort, 2, 2, true>);
- return &info;
- }
- case gl::VERTEX_FORMAT_USHORT3_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT,
- &CopyTo32FVertexData<GLushort, 3, 3, true>);
- return &info;
- }
- case gl::VERTEX_FORMAT_USHORT4_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
- &CopyTo32FVertexData<GLushort, 4, 4, true>);
- return &info;
- }
-
- // GL_FIXED
- // TODO: Add test to verify that this works correctly.
- // NOTE: 2, 3 and 4 component GL_FIXED should use the default format table.
- case gl::VERTEX_FORMAT_FIXED1:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
- &Copy32FixedTo32FVertexData<1, 2>);
- return &info;
- }
-
- // GL_FLOAT
- // TODO: Add test to verify that this works correctly.
- // NOTE: 2, 3 and 4 component GL_FLOAT should use the default format table.
- case gl::VERTEX_FORMAT_FLOAT1:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
- &CopyNativeVertexData<GLfloat, 1, 2, 0>);
- return &info;
- }
-
- default:
- return nullptr;
- }
-}
-
-const VertexFormat &GetVertexFormatInfo(gl::VertexFormatType vertexFormatType, D3D_FEATURE_LEVEL featureLevel)
-{
- if (featureLevel == D3D_FEATURE_LEVEL_9_3)
- {
- const VertexFormat *result = GetVertexFormatInfo_FL_9_3(vertexFormatType);
- if (result)
- {
- return *result;
- }
- }
-
- switch (vertexFormatType)
- {
- //
- // Float formats
- //
-
- // GL_BYTE -- un-normalized
- case gl::VERTEX_FORMAT_SBYTE1:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8_SINT,
- &CopyNativeVertexData<GLbyte, 1, 1, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_SBYTE2:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8_SINT,
- &CopyNativeVertexData<GLbyte, 2, 2, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_SBYTE3:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_SINT,
- &CopyNativeVertexData<GLbyte, 3, 4, 1>);
- return info;
- }
- case gl::VERTEX_FORMAT_SBYTE4:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8B8A8_SINT,
- &CopyNativeVertexData<GLbyte, 4, 4, 0>);
- return info;
- }
-
- // GL_BYTE -- normalized
- case gl::VERTEX_FORMAT_SBYTE1_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_SNORM,
- &CopyNativeVertexData<GLbyte, 1, 1, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_SBYTE2_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_SNORM,
- &CopyNativeVertexData<GLbyte, 2, 2, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_SBYTE3_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_SNORM,
- &CopyNativeVertexData<GLbyte, 3, 4, INT8_MAX>);
- return info;
- }
- case gl::VERTEX_FORMAT_SBYTE4_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_SNORM,
- &CopyNativeVertexData<GLbyte, 4, 4, 0>);
- return info;
- }
-
- // GL_UNSIGNED_BYTE -- un-normalized
- case gl::VERTEX_FORMAT_UBYTE1:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8_UINT,
- &CopyNativeVertexData<GLubyte, 1, 1, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_UBYTE2:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8_UINT,
- &CopyNativeVertexData<GLubyte, 2, 2, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_UBYTE3:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT,
- &CopyNativeVertexData<GLubyte, 3, 4, 1>);
- return info;
- }
- case gl::VERTEX_FORMAT_UBYTE4:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8B8A8_UINT,
- &CopyNativeVertexData<GLubyte, 4, 4, 0>);
- return info;
- }
-
- // GL_UNSIGNED_BYTE -- normalized
- case gl::VERTEX_FORMAT_UBYTE1_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_UNORM,
- &CopyNativeVertexData<GLubyte, 1, 1, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_UBYTE2_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_UNORM,
- &CopyNativeVertexData<GLubyte, 2, 2, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_UBYTE3_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UNORM,
- &CopyNativeVertexData<GLubyte, 3, 4, UINT8_MAX>);
- return info;
- }
- case gl::VERTEX_FORMAT_UBYTE4_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_UNORM,
- &CopyNativeVertexData<GLubyte, 4, 4, 0>);
- return info;
- }
-
- // GL_SHORT -- un-normalized
- case gl::VERTEX_FORMAT_SSHORT1:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16_SINT,
- &CopyNativeVertexData<GLshort, 1, 1, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_SSHORT2:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16_SINT,
- &CopyNativeVertexData<GLshort, 2, 2, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_SSHORT3:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT,
- &CopyNativeVertexData<GLshort, 3, 4, 1>);
- return info;
- }
- case gl::VERTEX_FORMAT_SSHORT4:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16B16A16_SINT,
- &CopyNativeVertexData<GLshort, 4, 4, 0>);
- return info;
- }
-
- // GL_SHORT -- normalized
- case gl::VERTEX_FORMAT_SSHORT1_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_SNORM,
- &CopyNativeVertexData<GLshort, 1, 1, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_SSHORT2_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_SNORM,
- &CopyNativeVertexData<GLshort, 2, 2, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_SSHORT3_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SNORM,
- &CopyNativeVertexData<GLshort, 3, 4, INT16_MAX>);
- return info;
- }
- case gl::VERTEX_FORMAT_SSHORT4_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_SNORM,
- &CopyNativeVertexData<GLshort, 4, 4, 0>);
- return info;
- }
-
- // GL_UNSIGNED_SHORT -- un-normalized
- case gl::VERTEX_FORMAT_USHORT1:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16_UINT,
- &CopyNativeVertexData<GLushort, 1, 1, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_USHORT2:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16_UINT,
- &CopyNativeVertexData<GLushort, 2, 2, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_USHORT3:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_UINT,
- &CopyNativeVertexData<GLushort, 3, 4, 1>);
- return info;
- }
- case gl::VERTEX_FORMAT_USHORT4:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16B16A16_UINT,
- &CopyNativeVertexData<GLushort, 4, 4, 0>);
- return info;
- }
-
- // GL_UNSIGNED_SHORT -- normalized
- case gl::VERTEX_FORMAT_USHORT1_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_UNORM,
- &CopyNativeVertexData<GLushort, 1, 1, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_USHORT2_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_UNORM,
- &CopyNativeVertexData<GLushort, 2, 2, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_USHORT3_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_UNORM,
- &CopyNativeVertexData<GLushort, 3, 4, UINT16_MAX>);
- return info;
- }
- case gl::VERTEX_FORMAT_USHORT4_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_UNORM,
- &CopyNativeVertexData<GLushort, 4, 4, 0>);
- return info;
- }
-
- // GL_INT -- un-normalized
- case gl::VERTEX_FORMAT_SINT1:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32_SINT,
- &CopyNativeVertexData<GLint, 1, 1, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_SINT2:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32_SINT,
- &CopyNativeVertexData<GLint, 2, 2, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_SINT3:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32_SINT,
- &CopyNativeVertexData<GLint, 3, 3, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_SINT4:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32A32_SINT,
- &CopyNativeVertexData<GLint, 4, 4, 0>);
- return info;
- }
-
- // GL_INT -- normalized
- case gl::VERTEX_FORMAT_SINT1_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT,
- &CopyTo32FVertexData<GLint, 1, 1, true>);
- return info;
- }
- case gl::VERTEX_FORMAT_SINT2_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
- &CopyTo32FVertexData<GLint, 2, 2, true>);
- return info;
- }
- case gl::VERTEX_FORMAT_SINT3_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT,
- &CopyTo32FVertexData<GLint, 3, 3, true>);
- return info;
- }
- case gl::VERTEX_FORMAT_SINT4_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
- &CopyTo32FVertexData<GLint, 4, 4, true>);
- return info;
- }
-
- // GL_UNSIGNED_INT -- un-normalized
- case gl::VERTEX_FORMAT_UINT1:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32_UINT,
- &CopyNativeVertexData<GLuint, 1, 1, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_UINT2:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32_UINT,
- &CopyNativeVertexData<GLuint, 2, 2, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_UINT3:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32_UINT,
- &CopyNativeVertexData<GLuint, 3, 3, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_UINT4:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32A32_UINT,
- &CopyNativeVertexData<GLuint, 4, 4, 0>);
- return info;
- }
-
- // GL_UNSIGNED_INT -- normalized
- case gl::VERTEX_FORMAT_UINT1_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT,
- &CopyTo32FVertexData<GLuint, 1, 1, true>);
- return info;
- }
- case gl::VERTEX_FORMAT_UINT2_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
- &CopyTo32FVertexData<GLuint, 2, 2, true>);
- return info;
- }
- case gl::VERTEX_FORMAT_UINT3_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT,
- &CopyTo32FVertexData<GLuint, 3, 3, true>);
- return info;
- }
- case gl::VERTEX_FORMAT_UINT4_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
- &CopyTo32FVertexData<GLuint, 4, 4, true>);
- return info;
- }
-
- // GL_FIXED
- case gl::VERTEX_FORMAT_FIXED1:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT,
- &Copy32FixedTo32FVertexData<1, 1>);
- return info;
- }
- case gl::VERTEX_FORMAT_FIXED2:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
- &Copy32FixedTo32FVertexData<2, 2>);
- return info;
- }
- case gl::VERTEX_FORMAT_FIXED3:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT,
- &Copy32FixedTo32FVertexData<3, 3>);
- return info;
- }
- case gl::VERTEX_FORMAT_FIXED4:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
- &Copy32FixedTo32FVertexData<4, 4>);
- return info;
- }
-
- // GL_HALF_FLOAT
- case gl::VERTEX_FORMAT_HALF1:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_FLOAT,
- &CopyNativeVertexData<GLhalf, 1, 1, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_HALF2:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_FLOAT,
- &CopyNativeVertexData<GLhalf, 2, 2, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_HALF3:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_FLOAT,
- &CopyNativeVertexData<GLhalf, 3, 4, gl::Float16One>);
- return info;
- }
- case gl::VERTEX_FORMAT_HALF4:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_FLOAT,
- &CopyNativeVertexData<GLhalf, 4, 4, 0>);
- return info;
- }
-
- // GL_FLOAT
- case gl::VERTEX_FORMAT_FLOAT1:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_FLOAT,
- &CopyNativeVertexData<GLfloat, 1, 1, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_FLOAT2:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_FLOAT,
- &CopyNativeVertexData<GLfloat, 2, 2, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_FLOAT3:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_FLOAT,
- &CopyNativeVertexData<GLfloat, 3, 3, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_FLOAT4:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_FLOAT,
- &CopyNativeVertexData<GLfloat, 4, 4, 0>);
- return info;
- }
-
- // GL_INT_2_10_10_10_REV
- case gl::VERTEX_FORMAT_SINT210:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
- &CopyXYZ10W2ToXYZW32FVertexData<true, false, true>);
- return info;
- }
- case gl::VERTEX_FORMAT_SINT210_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
- &CopyXYZ10W2ToXYZW32FVertexData<true, true, true>);
- return info;
- }
-
- // GL_UNSIGNED_INT_2_10_10_10_REV
- case gl::VERTEX_FORMAT_UINT210:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
- &CopyXYZ10W2ToXYZW32FVertexData<false, false, true>);
- return info;
- }
- case gl::VERTEX_FORMAT_UINT210_NORM:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R10G10B10A2_UNORM,
- &CopyNativeVertexData<GLuint, 1, 1, 0>);
- return info;
- }
-
- //
- // Integer Formats
- //
-
- // GL_BYTE
- case gl::VERTEX_FORMAT_SBYTE1_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_SINT,
- &CopyNativeVertexData<GLbyte, 1, 1, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_SBYTE2_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_SINT,
- &CopyNativeVertexData<GLbyte, 2, 2, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_SBYTE3_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_SINT,
- &CopyNativeVertexData<GLbyte, 3, 4, 1>);
- return info;
- }
- case gl::VERTEX_FORMAT_SBYTE4_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_SINT,
- &CopyNativeVertexData<GLbyte, 4, 4, 0>);
- return info;
- }
-
- // GL_UNSIGNED_BYTE
- case gl::VERTEX_FORMAT_UBYTE1_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_UINT,
- &CopyNativeVertexData<GLubyte, 1, 1, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_UBYTE2_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_UINT,
- &CopyNativeVertexData<GLubyte, 2, 2, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_UBYTE3_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UINT,
- &CopyNativeVertexData<GLubyte, 3, 4, 1>);
- return info;
- }
- case gl::VERTEX_FORMAT_UBYTE4_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_UINT,
- &CopyNativeVertexData<GLubyte, 4, 4, 0>);
- return info;
- }
-
- // GL_SHORT
- case gl::VERTEX_FORMAT_SSHORT1_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_SINT,
- &CopyNativeVertexData<GLshort, 1, 1, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_SSHORT2_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_SINT,
- &CopyNativeVertexData<GLshort, 2, 2, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_SSHORT3_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SINT,
- &CopyNativeVertexData<GLshort, 3, 4, 1>);
- return info;
- }
- case gl::VERTEX_FORMAT_SSHORT4_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_SINT,
- &CopyNativeVertexData<GLshort, 4, 4, 0>);
- return info;
- }
-
- // GL_UNSIGNED_SHORT
- case gl::VERTEX_FORMAT_USHORT1_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_UINT,
- &CopyNativeVertexData<GLushort, 1, 1, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_USHORT2_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_UINT,
- &CopyNativeVertexData<GLushort, 2, 2, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_USHORT3_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_UINT,
- &CopyNativeVertexData<GLushort, 3, 4, 1>);
- return info;
- }
- case gl::VERTEX_FORMAT_USHORT4_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_UINT,
- &CopyNativeVertexData<GLushort, 4, 4, 0>);
- return info;
- }
-
- // GL_INT
- case gl::VERTEX_FORMAT_SINT1_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_SINT,
- &CopyNativeVertexData<GLint, 1, 1, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_SINT2_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_SINT,
- &CopyNativeVertexData<GLint, 2, 2, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_SINT3_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_SINT,
- &CopyNativeVertexData<GLint, 3, 3, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_SINT4_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_SINT,
- &CopyNativeVertexData<GLint, 4, 4, 0>);
- return info;
- }
-
- // GL_UNSIGNED_INT
- case gl::VERTEX_FORMAT_UINT1_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_SINT,
- &CopyNativeVertexData<GLuint, 1, 1, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_UINT2_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_SINT,
- &CopyNativeVertexData<GLuint, 2, 2, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_UINT3_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_SINT,
- &CopyNativeVertexData<GLuint, 3, 3, 0>);
- return info;
- }
- case gl::VERTEX_FORMAT_UINT4_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_SINT,
- &CopyNativeVertexData<GLuint, 4, 4, 0>);
- return info;
- }
-
- // GL_INT_2_10_10_10_REV
- case gl::VERTEX_FORMAT_SINT210_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SINT,
- &CopyXYZ10W2ToXYZW32FVertexData<true, true, false>);
- return info;
- }
-
- // GL_UNSIGNED_INT_2_10_10_10_REV
- case gl::VERTEX_FORMAT_UINT210_INT:
- {
- static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R10G10B10A2_UINT,
- &CopyNativeVertexData<GLuint, 1, 1, 0>);
- return info;
- }
-
- default:
- {
- static constexpr VertexFormat info;
- return info;
- }
- }
-}
-
-} // namespace d3d11
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/formatutils11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/formatutils11.h
deleted file mode 100644
index 883d338377..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/formatutils11.h
+++ /dev/null
@@ -1,71 +0,0 @@
-//
-// Copyright (c) 2013-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// formatutils11.h: Queries for GL image formats and their translations to D3D11
-// formats.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_FORMATUTILS11_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_FORMATUTILS11_H_
-
-#include <map>
-
-#include "common/platform.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/renderer_utils.h"
-#include "libANGLE/renderer/d3d/formatutilsD3D.h"
-
-namespace rx
-{
-struct Renderer11DeviceCaps;
-
-namespace d3d11
-{
-
-// A texture might be stored as DXGI_FORMAT_R16_TYPELESS but store integer components,
-// which are accessed through an DXGI_FORMAT_R16_SINT view. It's easy to write code which queries
-// information about the wrong format. Therefore, use of this should be avoided where possible.
-
-bool SupportsMipGen(DXGI_FORMAT dxgiFormat, D3D_FEATURE_LEVEL featureLevel);
-
-struct DXGIFormatSize
-{
- DXGIFormatSize(GLuint pixelBits, GLuint blockWidth, GLuint blockHeight);
-
- GLuint pixelBytes;
- GLuint blockWidth;
- GLuint blockHeight;
-};
-const DXGIFormatSize &GetDXGIFormatSizeInfo(DXGI_FORMAT format);
-
-struct VertexFormat : private angle::NonCopyable
-{
- constexpr VertexFormat();
- constexpr VertexFormat(VertexConversionType conversionType,
- DXGI_FORMAT nativeFormat,
- VertexCopyFunction copyFunction);
-
- VertexConversionType conversionType;
- DXGI_FORMAT nativeFormat;
- VertexCopyFunction copyFunction;
-};
-
-const VertexFormat &GetVertexFormatInfo(gl::VertexFormatType vertexFormatType,
- D3D_FEATURE_LEVEL featureLevel);
-
-// Auto-generated in dxgi_format_map_autogen.cpp.
-GLenum GetComponentType(DXGI_FORMAT dxgiFormat);
-
-} // namespace d3d11
-
-namespace d3d11_angle
-{
-const angle::Format &GetFormat(DXGI_FORMAT dxgiFormat);
-}
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_FORMATUTILS11_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
deleted file mode 100644
index d059b36120..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
+++ /dev/null
@@ -1,2421 +0,0 @@
-//
-// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// renderer11_utils.cpp: Conversion functions and other utility routines
-// specific to the D3D11 renderer.
-
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-
-#include <algorithm>
-
-#include "common/debug.h"
-#include "libANGLE/Buffer.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/State.h"
-#include "libANGLE/VertexArray.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/d3d/BufferD3D.h"
-#include "libANGLE/renderer/d3d/FramebufferD3D.h"
-#include "libANGLE/renderer/d3d/IndexBuffer.h"
-#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/dxgi_support_table.h"
-#include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
-#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h"
-#include "libANGLE/renderer/driver_utils.h"
-#include "platform/Platform.h"
-#include "platform/WorkaroundsD3D.h"
-
-namespace rx
-{
-
-namespace d3d11_gl
-{
-namespace
-{
-// Standard D3D sample positions from
-// https://msdn.microsoft.com/en-us/library/windows/desktop/ff476218.aspx
-using SamplePositionsArray = std::array<float, 32>;
-static constexpr std::array<SamplePositionsArray, 5> kSamplePositions = {
- {{{0.5f, 0.5f}},
- {{0.75f, 0.75f, 0.25f, 0.25f}},
- {{0.375f, 0.125f, 0.875f, 0.375f, 0.125f, 0.625f, 0.625f, 0.875f}},
- {{0.5625f, 0.3125f, 0.4375f, 0.6875f, 0.8125f, 0.5625f, 0.3125f, 0.1875f, 0.1875f, 0.8125f,
- 0.0625f, 0.4375f, 0.6875f, 0.9375f, 0.9375f, 0.0625f}},
- {{0.5625f, 0.5625f, 0.4375f, 0.3125f, 0.3125f, 0.625f, 0.75f, 0.4375f,
- 0.1875f, 0.375f, 0.625f, 0.8125f, 0.8125f, 0.6875f, 0.6875f, 0.1875f,
- 0.375f, 0.875f, 0.5f, 0.0625f, 0.25f, 0.125f, 0.125f, 0.75f,
- 0.0f, 0.5f, 0.9375f, 0.25f, 0.875f, 0.9375f, 0.0625f, 0.0f}}}};
-
-// Helper functor for querying DXGI support. Saves passing the parameters repeatedly.
-class DXGISupportHelper : angle::NonCopyable
-{
- public:
- DXGISupportHelper(ID3D11Device *device, D3D_FEATURE_LEVEL featureLevel)
- : mDevice(device), mFeatureLevel(featureLevel)
- {
- }
-
- bool query(DXGI_FORMAT dxgiFormat, UINT supportMask)
- {
- if (dxgiFormat == DXGI_FORMAT_UNKNOWN)
- return false;
-
- auto dxgiSupport = d3d11::GetDXGISupport(dxgiFormat, mFeatureLevel);
-
- UINT supportedBits = dxgiSupport.alwaysSupportedFlags;
-
- if ((dxgiSupport.optionallySupportedFlags & supportMask) != 0)
- {
- UINT formatSupport;
- if (SUCCEEDED(mDevice->CheckFormatSupport(dxgiFormat, &formatSupport)))
- {
- supportedBits |= (formatSupport & supportMask);
- }
- else
- {
- // TODO(jmadill): find out why we fail this call sometimes in FL9_3
- // ERR() << "Error checking format support for format 0x" << std::hex << dxgiFormat;
- }
- }
-
- return ((supportedBits & supportMask) == supportMask);
- }
-
- private:
- ID3D11Device *mDevice;
- D3D_FEATURE_LEVEL mFeatureLevel;
-};
-
-gl::TextureCaps GenerateTextureFormatCaps(gl::Version maxClientVersion,
- GLenum internalFormat,
- ID3D11Device *device,
- const Renderer11DeviceCaps &renderer11DeviceCaps)
-{
- gl::TextureCaps textureCaps;
-
- DXGISupportHelper support(device, renderer11DeviceCaps.featureLevel);
- const d3d11::Format &formatInfo = d3d11::Format::Get(internalFormat, renderer11DeviceCaps);
-
- const gl::InternalFormat &internalFormatInfo = gl::GetSizedInternalFormatInfo(internalFormat);
-
- UINT texSupportMask = D3D11_FORMAT_SUPPORT_TEXTURE2D;
- if (internalFormatInfo.depthBits == 0 && internalFormatInfo.stencilBits == 0)
- {
- texSupportMask |= D3D11_FORMAT_SUPPORT_TEXTURECUBE;
- if (maxClientVersion.major > 2)
- {
- texSupportMask |= D3D11_FORMAT_SUPPORT_TEXTURE3D;
- }
- }
-
- textureCaps.texturable = support.query(formatInfo.texFormat, texSupportMask);
- textureCaps.filterable =
- support.query(formatInfo.srvFormat, D3D11_FORMAT_SUPPORT_SHADER_SAMPLE);
- textureCaps.renderable =
- (support.query(formatInfo.rtvFormat, D3D11_FORMAT_SUPPORT_RENDER_TARGET)) ||
- (support.query(formatInfo.dsvFormat, D3D11_FORMAT_SUPPORT_DEPTH_STENCIL));
-
- DXGI_FORMAT renderFormat = DXGI_FORMAT_UNKNOWN;
- if (formatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN)
- {
- renderFormat = formatInfo.dsvFormat;
- }
- else if (formatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN)
- {
- renderFormat = formatInfo.rtvFormat;
- }
- if (renderFormat != DXGI_FORMAT_UNKNOWN &&
- support.query(renderFormat, D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET))
- {
- // Assume 1x
- textureCaps.sampleCounts.insert(1);
-
- for (unsigned int sampleCount = 2; sampleCount <= D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT;
- sampleCount *= 2)
- {
- UINT qualityCount = 0;
- if (SUCCEEDED(device->CheckMultisampleQualityLevels(renderFormat, sampleCount,
- &qualityCount)))
- {
- // Assume we always support lower sample counts
- if (qualityCount == 0)
- {
- break;
- }
- textureCaps.sampleCounts.insert(sampleCount);
- }
- }
- }
-
- return textureCaps;
-}
-
-bool GetNPOTTextureSupport(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return true;
-
- // From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876.aspx
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return false;
-
- default:
- UNREACHABLE();
- return false;
- }
-}
-
-float GetMaximumAnisotropy(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_MAX_MAXANISOTROPY;
-
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_MAX_MAXANISOTROPY;
-
- // From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876.aspx
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- return 16;
-
- case D3D_FEATURE_LEVEL_9_1:
- return D3D_FL9_1_DEFAULT_MAX_ANISOTROPY;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-bool GetOcclusionQuerySupport(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return true;
-
- // From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476150.aspx
- // ID3D11Device::CreateQuery
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- return true;
- case D3D_FEATURE_LEVEL_9_1:
- return false;
-
- default:
- UNREACHABLE();
- return false;
- }
-}
-
-bool GetEventQuerySupport(D3D_FEATURE_LEVEL featureLevel)
-{
- // From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476150.aspx
- // ID3D11Device::CreateQuery
-
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return true;
-
- default:
- UNREACHABLE();
- return false;
- }
-}
-
-bool GetInstancingSupport(D3D_FEATURE_LEVEL featureLevel)
-{
- // From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476150.aspx
- // ID3D11Device::CreateInputLayout
-
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return true;
-
- // Feature Level 9_3 supports instancing, but slot 0 in the input layout must not be
- // instanced.
- // D3D9 has a similar restriction, where stream 0 must not be instanced.
- // This restriction can be worked around by remapping any non-instanced slot to slot
- // 0.
- // This works because HLSL uses shader semantics to match the vertex inputs to the
- // elements in the input layout, rather than the slots.
- // Note that we only support instancing via ANGLE_instanced_array on 9_3, since 9_3
- // doesn't support OpenGL ES 3.0
- case D3D_FEATURE_LEVEL_9_3:
- return true;
-
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return false;
-
- default:
- UNREACHABLE();
- return false;
- }
-}
-
-bool GetFramebufferMultisampleSupport(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return true;
-
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return false;
-
- default:
- UNREACHABLE();
- return false;
- }
-}
-
-bool GetFramebufferBlitSupport(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return true;
-
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return false;
-
- default:
- UNREACHABLE();
- return false;
- }
-}
-
-bool GetDerivativeInstructionSupport(D3D_FEATURE_LEVEL featureLevel)
-{
- // http://msdn.microsoft.com/en-us/library/windows/desktop/bb509588.aspx states that
- // shader model
- // ps_2_x is required for the ddx (and other derivative functions).
-
- // http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876.aspx states that
- // feature level
- // 9.3 supports shader model ps_2_x.
-
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- case D3D_FEATURE_LEVEL_9_3:
- return true;
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return false;
-
- default:
- UNREACHABLE();
- return false;
- }
-}
-
-bool GetShaderTextureLODSupport(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return true;
-
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return false;
-
- default:
- UNREACHABLE();
- return false;
- }
-}
-
-size_t GetMaximumSimultaneousRenderTargets(D3D_FEATURE_LEVEL featureLevel)
-{
- // From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476150.aspx
- // ID3D11Device::CreateInputLayout
-
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT;
-
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT;
-
- case D3D_FEATURE_LEVEL_9_3:
- return D3D_FL9_3_SIMULTANEOUS_RENDER_TARGET_COUNT;
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return D3D_FL9_1_SIMULTANEOUS_RENDER_TARGET_COUNT;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximum2DTextureSize(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION;
-
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION;
-
- case D3D_FEATURE_LEVEL_9_3:
- return D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION;
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximumCubeMapTextureSize(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_REQ_TEXTURECUBE_DIMENSION;
-
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_REQ_TEXTURECUBE_DIMENSION;
-
- case D3D_FEATURE_LEVEL_9_3:
- return D3D_FL9_3_REQ_TEXTURECUBE_DIMENSION;
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return D3D_FL9_1_REQ_TEXTURECUBE_DIMENSION;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximum2DTextureArraySize(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION;
-
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION;
-
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 0;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximum3DTextureSize(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION;
-
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION;
-
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximumViewportSize(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_VIEWPORT_BOUNDS_MAX;
-
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_VIEWPORT_BOUNDS_MAX;
-
- // No constants for D3D11 Feature Level 9 viewport size limits, use the maximum
- // texture sizes
- case D3D_FEATURE_LEVEL_9_3:
- return D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION;
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximumDrawIndexedIndexCount(D3D_FEATURE_LEVEL featureLevel)
-{
- // D3D11 allows up to 2^32 elements, but we report max signed int for convenience since
- // that's what's
- // returned from glGetInteger
- static_assert(D3D11_REQ_DRAWINDEXED_INDEX_COUNT_2_TO_EXP == 32,
- "Unexpected D3D11 constant value.");
- static_assert(D3D10_REQ_DRAWINDEXED_INDEX_COUNT_2_TO_EXP == 32,
- "Unexpected D3D11 constant value.");
-
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return std::numeric_limits<GLint>::max();
-
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- return D3D_FL9_2_IA_PRIMITIVE_MAX_COUNT;
- case D3D_FEATURE_LEVEL_9_1:
- return D3D_FL9_1_IA_PRIMITIVE_MAX_COUNT;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximumDrawVertexCount(D3D_FEATURE_LEVEL featureLevel)
-{
- // D3D11 allows up to 2^32 elements, but we report max signed int for convenience since
- // that's what's
- // returned from glGetInteger
- static_assert(D3D11_REQ_DRAW_VERTEX_COUNT_2_TO_EXP == 32, "Unexpected D3D11 constant value.");
- static_assert(D3D10_REQ_DRAW_VERTEX_COUNT_2_TO_EXP == 32, "Unexpected D3D11 constant value.");
-
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return std::numeric_limits<GLint>::max();
-
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- return D3D_FL9_2_IA_PRIMITIVE_MAX_COUNT;
- case D3D_FEATURE_LEVEL_9_1:
- return D3D_FL9_1_IA_PRIMITIVE_MAX_COUNT;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximumVertexInputSlots(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_STANDARD_VERTEX_ELEMENT_COUNT;
-
- case D3D_FEATURE_LEVEL_10_1:
- return D3D10_1_STANDARD_VERTEX_ELEMENT_COUNT;
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_STANDARD_VERTEX_ELEMENT_COUNT;
-
- // From http://http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876.aspx
- // "Max Input Slots"
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 16;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximumVertexUniformVectors(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT;
-
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT;
-
- // From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476149.aspx
- // ID3D11DeviceContext::VSSetConstantBuffers
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 255 - d3d11_gl::GetReservedVertexUniformVectors(featureLevel);
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximumVertexUniformBlocks(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT -
- d3d11::RESERVED_CONSTANT_BUFFER_SLOT_COUNT;
-
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT -
- d3d11::RESERVED_CONSTANT_BUFFER_SLOT_COUNT;
-
- // Uniform blocks not supported on D3D11 Feature Level 9
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 0;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetReservedVertexOutputVectors(D3D_FEATURE_LEVEL featureLevel)
-{
- // According to The OpenGL ES Shading Language specifications
- // (Language Version 1.00 section 10.16, Language Version 3.10 section 12.21)
- // built-in special variables (e.g. gl_FragCoord, or gl_PointCoord)
- // which are statically used in the shader should be included in the variable packing
- // algorithm.
- // Therefore, we should not reserve output vectors for them.
-
- switch (featureLevel)
- {
- // We must reserve one output vector for dx_Position.
- // We also reserve one for gl_Position, which we unconditionally output on Feature
- // Levels 10_0+,
- // even if it's unused in the shader (e.g. for transform feedback). TODO: This could
- // be improved.
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return 2;
-
- // Just reserve dx_Position on Feature Level 9, since we don't ever need to output
- // gl_Position.
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 1;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximumVertexOutputVectors(D3D_FEATURE_LEVEL featureLevel)
-{
- static_assert(gl::IMPLEMENTATION_MAX_VARYING_VECTORS == D3D11_VS_OUTPUT_REGISTER_COUNT,
- "Unexpected D3D11 constant value.");
-
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_VS_OUTPUT_REGISTER_COUNT - GetReservedVertexOutputVectors(featureLevel);
-
- case D3D_FEATURE_LEVEL_10_1:
- return D3D10_1_VS_OUTPUT_REGISTER_COUNT - GetReservedVertexOutputVectors(featureLevel);
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_VS_OUTPUT_REGISTER_COUNT - GetReservedVertexOutputVectors(featureLevel);
-
- // Use Shader Model 2.X limits
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 8 - GetReservedVertexOutputVectors(featureLevel);
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximumVertexTextureUnits(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT;
-
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT;
-
- // Vertex textures not supported on D3D11 Feature Level 9 according to
- // http://msdn.microsoft.com/en-us/library/windows/desktop/ff476149.aspx
- // ID3D11DeviceContext::VSSetSamplers and ID3D11DeviceContext::VSSetShaderResources
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 0;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximumPixelUniformVectors(D3D_FEATURE_LEVEL featureLevel)
-{
- // TODO(geofflang): Remove hard-coded limit once the gl-uniform-arrays test can pass
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return 1024; // D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT;
-
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return 1024; // D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT;
-
- // From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476149.aspx
- // ID3D11DeviceContext::PSSetConstantBuffers
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 32 - d3d11_gl::GetReservedFragmentUniformVectors(featureLevel);
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximumPixelUniformBlocks(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT -
- d3d11::RESERVED_CONSTANT_BUFFER_SLOT_COUNT;
-
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT -
- d3d11::RESERVED_CONSTANT_BUFFER_SLOT_COUNT;
-
- // Uniform blocks not supported on D3D11 Feature Level 9
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 0;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximumPixelInputVectors(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_PS_INPUT_REGISTER_COUNT - GetReservedVertexOutputVectors(featureLevel);
-
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_PS_INPUT_REGISTER_COUNT - GetReservedVertexOutputVectors(featureLevel);
-
- // Use Shader Model 2.X limits
- case D3D_FEATURE_LEVEL_9_3:
- return 8 - GetReservedVertexOutputVectors(featureLevel);
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 8 - GetReservedVertexOutputVectors(featureLevel);
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximumPixelTextureUnits(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT;
-
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT;
-
- // http://msdn.microsoft.com/en-us/library/windows/desktop/ff476149.aspx
- // ID3D11DeviceContext::PSSetShaderResources
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 16;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-std::array<GLuint, 3> GetMaxComputeWorkGroupCount(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return {{D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION,
- D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION,
- D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION}};
- break;
- default:
- return {{0, 0, 0}};
- }
-}
-
-std::array<GLuint, 3> GetMaxComputeWorkGroupSize(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return {{D3D11_CS_THREAD_GROUP_MAX_X, D3D11_CS_THREAD_GROUP_MAX_Y,
- D3D11_CS_THREAD_GROUP_MAX_Z}};
- break;
- default:
- return {{0, 0, 0}};
- }
-}
-
-size_t GetMaxComputeWorkGroupInvocations(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_CS_THREAD_GROUP_MAX_THREADS_PER_GROUP;
- default:
- return 0;
- }
-}
-
-size_t GetMaximumComputeUniformVectors(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT;
- default:
- return 0;
- }
-}
-
-size_t GetMaximumComputeUniformBlocks(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT -
- d3d11::RESERVED_CONSTANT_BUFFER_SLOT_COUNT;
- default:
- return 0;
- }
-}
-
-size_t GetMaximumComputeTextureUnits(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT;
- default:
- return 0;
- }
-}
-
-size_t GetMaximumImageUnits(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- // TODO(xinghua.cao@intel.com): Get a more accurate limit. For now using
- // the minimum requirement for GLES 3.1.
- return 4;
- default:
- return 0;
- }
-}
-
-size_t GetMaximumComputeImageUniforms(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- // TODO(xinghua.cao@intel.com): Get a more accurate limit. For now using
- // the minimum requirement for GLES 3.1.
- return 4;
- default:
- return 0;
- }
-}
-
-int GetMinimumTexelOffset(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_COMMONSHADER_TEXEL_OFFSET_MAX_NEGATIVE;
-
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_COMMONSHADER_TEXEL_OFFSET_MAX_NEGATIVE;
-
- // Sampling functions with offsets are not available below shader model 4.0.
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 0;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-int GetMaximumTexelOffset(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_COMMONSHADER_TEXEL_OFFSET_MAX_POSITIVE;
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return D3D11_COMMONSHADER_TEXEL_OFFSET_MAX_POSITIVE;
-
- // Sampling functions with offsets are not available below shader model 4.0.
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 0;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximumConstantBufferSize(D3D_FEATURE_LEVEL featureLevel)
-{
- // Returns a size_t despite the limit being a GLuint64 because size_t is the maximum
- // size of
- // any buffer that could be allocated.
-
- const size_t bytesPerComponent = 4 * sizeof(float);
-
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT * bytesPerComponent;
-
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT * bytesPerComponent;
-
- // Limits from http://msdn.microsoft.com/en-us/library/windows/desktop/ff476501.aspx
- // remarks section
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 4096 * bytesPerComponent;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximumStreamOutputBuffers(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_SO_BUFFER_SLOT_COUNT;
-
- case D3D_FEATURE_LEVEL_10_1:
- return D3D10_1_SO_BUFFER_SLOT_COUNT;
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_SO_BUFFER_SLOT_COUNT;
-
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 0;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximumStreamOutputInterleavedComponents(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
-
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return GetMaximumVertexOutputVectors(featureLevel) * 4;
-
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 0;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximumStreamOutputSeparateComponents(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return GetMaximumStreamOutputInterleavedComponents(featureLevel) /
- GetMaximumStreamOutputBuffers(featureLevel);
-
- // D3D 10 and 10.1 only allow one output per output slot if an output slot other
- // than zero is used.
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return 4;
-
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 0;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-size_t GetMaximumRenderToBufferWindowSize(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_REQ_RENDER_TO_BUFFER_WINDOW_WIDTH;
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return D3D10_REQ_RENDER_TO_BUFFER_WINDOW_WIDTH;
-
- // REQ_RENDER_TO_BUFFER_WINDOW_WIDTH not supported on D3D11 Feature Level 9,
- // use the maximum texture sizes
- case D3D_FEATURE_LEVEL_9_3:
- return D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION;
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-IntelDriverVersion GetIntelDriverVersion(const Optional<LARGE_INTEGER> driverVersion)
-{
- if (!driverVersion.valid())
- return IntelDriverVersion(0);
-
- // According to http://www.intel.com/content/www/us/en/support/graphics-drivers/000005654.html,
- // only the fourth part is necessary since it stands for the driver specific unique version
- // number.
- WORD part = LOWORD(driverVersion.value().LowPart);
- return IntelDriverVersion(part);
-}
-
-} // anonymous namespace
-
-unsigned int GetReservedVertexUniformVectors(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return 0;
-
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 3; // dx_ViewAdjust, dx_ViewCoords and dx_ViewScale
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-unsigned int GetReservedFragmentUniformVectors(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return 0;
-
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 3;
-
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-gl::Version GetMaximumClientVersion(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return gl::Version(3, 1);
- case D3D_FEATURE_LEVEL_10_1:
- return gl::Version(3, 0);
-
- case D3D_FEATURE_LEVEL_10_0:
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return gl::Version(2, 0);
-
- default:
- UNREACHABLE();
- return gl::Version(0, 0);
- }
-}
-
-unsigned int GetMaxViewportAndScissorRectanglesPerPipeline(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE;
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 1;
- default:
- UNREACHABLE();
- return 0;
- }
-}
-
-bool IsMultiviewSupported(D3D_FEATURE_LEVEL featureLevel)
-{
- // The ANGLE_multiview extension can always be supported in D3D11 through geometry shaders.
- switch (featureLevel)
- {
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- return true;
- default:
- return false;
- }
-}
-
-unsigned int GetMaxSampleMaskWords(D3D_FEATURE_LEVEL featureLevel)
-{
- switch (featureLevel)
- {
- // D3D10+ only allows 1 sample mask.
- case D3D_FEATURE_LEVEL_11_1:
- case D3D_FEATURE_LEVEL_11_0:
- case D3D_FEATURE_LEVEL_10_1:
- case D3D_FEATURE_LEVEL_10_0:
- return 1u;
- case D3D_FEATURE_LEVEL_9_3:
- case D3D_FEATURE_LEVEL_9_2:
- case D3D_FEATURE_LEVEL_9_1:
- return 0u;
- default:
- UNREACHABLE();
- return 0u;
- }
-}
-
-void GenerateCaps(ID3D11Device *device, ID3D11DeviceContext *deviceContext, const Renderer11DeviceCaps &renderer11DeviceCaps, gl::Caps *caps,
- gl::TextureCapsMap *textureCapsMap, gl::Extensions *extensions, gl::Limitations *limitations)
-{
- D3D_FEATURE_LEVEL featureLevel = renderer11DeviceCaps.featureLevel;
- const gl::FormatSet &allFormats = gl::GetAllSizedInternalFormats();
- for (GLenum internalFormat : allFormats)
- {
- gl::TextureCaps textureCaps = GenerateTextureFormatCaps(
- GetMaximumClientVersion(featureLevel), internalFormat, device, renderer11DeviceCaps);
- textureCapsMap->insert(internalFormat, textureCaps);
-
- if (gl::GetSizedInternalFormatInfo(internalFormat).compressed)
- {
- caps->compressedTextureFormats.push_back(internalFormat);
- }
- }
-
- // GL core feature limits
- // Reserve MAX_UINT for D3D11's primitive restart.
- caps->maxElementIndex = static_cast<GLint64>(std::numeric_limits<unsigned int>::max() - 1);
- caps->max3DTextureSize = static_cast<GLuint>(GetMaximum3DTextureSize(featureLevel));
- caps->max2DTextureSize = static_cast<GLuint>(GetMaximum2DTextureSize(featureLevel));
- caps->maxCubeMapTextureSize = static_cast<GLuint>(GetMaximumCubeMapTextureSize(featureLevel));
- caps->maxArrayTextureLayers = static_cast<GLuint>(GetMaximum2DTextureArraySize(featureLevel));
-
- // Unimplemented, set to minimum required
- caps->maxLODBias = 2.0f;
-
- // No specific limits on render target size, maximum 2D texture size is equivalent
- caps->maxRenderbufferSize = caps->max2DTextureSize;
-
- // Maximum draw buffers and color attachments are the same, max color attachments could eventually be
- // increased to 16
- caps->maxDrawBuffers = static_cast<GLuint>(GetMaximumSimultaneousRenderTargets(featureLevel));
- caps->maxColorAttachments =
- static_cast<GLuint>(GetMaximumSimultaneousRenderTargets(featureLevel));
-
- // D3D11 has the same limit for viewport width and height
- caps->maxViewportWidth = static_cast<GLuint>(GetMaximumViewportSize(featureLevel));
- caps->maxViewportHeight = caps->maxViewportWidth;
-
- // Choose a reasonable maximum, enforced in the shader.
- caps->minAliasedPointSize = 1.0f;
- caps->maxAliasedPointSize = 1024.0f;
-
- // Wide lines not supported
- caps->minAliasedLineWidth = 1.0f;
- caps->maxAliasedLineWidth = 1.0f;
-
- // Primitive count limits
- caps->maxElementsIndices = static_cast<GLuint>(GetMaximumDrawIndexedIndexCount(featureLevel));
- caps->maxElementsVertices = static_cast<GLuint>(GetMaximumDrawVertexCount(featureLevel));
-
- // Program and shader binary formats (no supported shader binary formats)
- caps->programBinaryFormats.push_back(GL_PROGRAM_BINARY_ANGLE);
-
- caps->vertexHighpFloat.setIEEEFloat();
- caps->vertexMediumpFloat.setIEEEFloat();
- caps->vertexLowpFloat.setIEEEFloat();
- caps->fragmentHighpFloat.setIEEEFloat();
- caps->fragmentMediumpFloat.setIEEEFloat();
- caps->fragmentLowpFloat.setIEEEFloat();
-
- // 32-bit integers are natively supported
- caps->vertexHighpInt.setTwosComplementInt(32);
- caps->vertexMediumpInt.setTwosComplementInt(32);
- caps->vertexLowpInt.setTwosComplementInt(32);
- caps->fragmentHighpInt.setTwosComplementInt(32);
- caps->fragmentMediumpInt.setTwosComplementInt(32);
- caps->fragmentLowpInt.setTwosComplementInt(32);
-
- // We do not wait for server fence objects internally, so report a max timeout of zero.
- caps->maxServerWaitTimeout = 0;
-
- // Vertex shader limits
- caps->maxVertexAttributes = static_cast<GLuint>(GetMaximumVertexInputSlots(featureLevel));
- caps->maxVertexUniformComponents =
- static_cast<GLuint>(GetMaximumVertexUniformVectors(featureLevel)) * 4;
- caps->maxVertexUniformVectors =
- static_cast<GLuint>(GetMaximumVertexUniformVectors(featureLevel));
- caps->maxVertexUniformBlocks = static_cast<GLuint>(GetMaximumVertexUniformBlocks(featureLevel));
- caps->maxVertexOutputComponents =
- static_cast<GLuint>(GetMaximumVertexOutputVectors(featureLevel)) * 4;
- caps->maxVertexTextureImageUnits =
- static_cast<GLuint>(GetMaximumVertexTextureUnits(featureLevel));
-
- // Vertex Attribute Bindings are emulated on D3D11.
- caps->maxVertexAttribBindings = caps->maxVertexAttributes;
- // Experimental testing confirmed there is no explicit limit on maximum buffer offset in D3D11.
- caps->maxVertexAttribRelativeOffset = std::numeric_limits<GLint>::max();
- // Experimental testing confirmed 2048 is the maximum stride that D3D11 can support on all
- // platforms.
- caps->maxVertexAttribStride = 2048;
-
- // Fragment shader limits
- caps->maxFragmentUniformComponents =
- static_cast<GLuint>(GetMaximumPixelUniformVectors(featureLevel)) * 4;
- caps->maxFragmentUniformVectors =
- static_cast<GLuint>(GetMaximumPixelUniformVectors(featureLevel));
- caps->maxFragmentUniformBlocks =
- static_cast<GLuint>(GetMaximumPixelUniformBlocks(featureLevel));
- caps->maxFragmentInputComponents =
- static_cast<GLuint>(GetMaximumPixelInputVectors(featureLevel)) * 4;
- caps->maxTextureImageUnits = static_cast<GLuint>(GetMaximumPixelTextureUnits(featureLevel));
- caps->minProgramTexelOffset = GetMinimumTexelOffset(featureLevel);
- caps->maxProgramTexelOffset = GetMaximumTexelOffset(featureLevel);
-
- // Compute shader limits
- caps->maxComputeWorkGroupCount = GetMaxComputeWorkGroupCount(featureLevel);
- caps->maxComputeWorkGroupSize = GetMaxComputeWorkGroupSize(featureLevel);
- caps->maxComputeWorkGroupInvocations =
- static_cast<GLuint>(GetMaxComputeWorkGroupInvocations(featureLevel));
- caps->maxComputeUniformComponents =
- static_cast<GLuint>(GetMaximumComputeUniformVectors(featureLevel)) * 4;
- caps->maxComputeUniformBlocks =
- static_cast<GLuint>(GetMaximumComputeUniformBlocks(featureLevel));
- caps->maxComputeTextureImageUnits =
- static_cast<GLuint>(GetMaximumComputeTextureUnits(featureLevel));
- caps->maxImageUnits = static_cast<GLuint>(GetMaximumImageUnits(featureLevel));
- caps->maxComputeImageUniforms =
- static_cast<GLuint>(GetMaximumComputeImageUniforms(featureLevel));
-
- // Aggregate shader limits
- caps->maxUniformBufferBindings = caps->maxVertexUniformBlocks + caps->maxFragmentUniformBlocks;
- caps->maxUniformBlockSize = GetMaximumConstantBufferSize(featureLevel);
-
- // TODO(oetuaho): Get a more accurate limit. For now using the minimum requirement for GLES 3.1.
- caps->maxUniformLocations = 1024;
-
- // With DirectX 11.1, constant buffer offset and size must be a multiple of 16 constants of 16 bytes each.
- // https://msdn.microsoft.com/en-us/library/windows/desktop/hh404649%28v=vs.85%29.aspx
- // With DirectX 11.0, we emulate UBO offsets using copies of ranges of the UBO however
- // we still keep the same alignment as 11.1 for consistency.
- caps->uniformBufferOffsetAlignment = 256;
-
- caps->maxCombinedUniformBlocks = caps->maxVertexUniformBlocks + caps->maxFragmentUniformBlocks;
- caps->maxCombinedVertexUniformComponents = (static_cast<GLint64>(caps->maxVertexUniformBlocks) * static_cast<GLint64>(caps->maxUniformBlockSize / 4)) +
- static_cast<GLint64>(caps->maxVertexUniformComponents);
- caps->maxCombinedFragmentUniformComponents = (static_cast<GLint64>(caps->maxFragmentUniformBlocks) * static_cast<GLint64>(caps->maxUniformBlockSize / 4)) +
- static_cast<GLint64>(caps->maxFragmentUniformComponents);
- caps->maxCombinedComputeUniformComponents =
- static_cast<GLuint>(caps->maxComputeUniformBlocks * (caps->maxUniformBlockSize / 4) +
- caps->maxComputeUniformComponents);
- caps->maxVaryingComponents =
- static_cast<GLuint>(GetMaximumVertexOutputVectors(featureLevel)) * 4;
- caps->maxVaryingVectors = static_cast<GLuint>(GetMaximumVertexOutputVectors(featureLevel));
- caps->maxCombinedTextureImageUnits = caps->maxVertexTextureImageUnits + caps->maxTextureImageUnits;
-
- // Transform feedback limits
- caps->maxTransformFeedbackInterleavedComponents =
- static_cast<GLuint>(GetMaximumStreamOutputInterleavedComponents(featureLevel));
- caps->maxTransformFeedbackSeparateAttributes =
- static_cast<GLuint>(GetMaximumStreamOutputBuffers(featureLevel));
- caps->maxTransformFeedbackSeparateComponents =
- static_cast<GLuint>(GetMaximumStreamOutputSeparateComponents(featureLevel));
-
- // Defer the computation of multisample limits to Context::updateCaps() where max*Samples values
- // are determined according to available sample counts for each individual format.
- caps->maxSamples = std::numeric_limits<GLint>::max();
- caps->maxColorTextureSamples = std::numeric_limits<GLint>::max();
- caps->maxDepthTextureSamples = std::numeric_limits<GLint>::max();
- caps->maxIntegerSamples = std::numeric_limits<GLint>::max();
-
- // Sample mask words limits
- caps->maxSampleMaskWords = GetMaxSampleMaskWords(featureLevel);
-
- // Framebuffer limits
- caps->maxFramebufferSamples = std::numeric_limits<GLint>::max();
- caps->maxFramebufferWidth =
- static_cast<GLuint>(GetMaximumRenderToBufferWindowSize(featureLevel));
- caps->maxFramebufferHeight = caps->maxFramebufferWidth;
-
- // GL extension support
- extensions->setTextureExtensionSupport(*textureCapsMap);
- extensions->elementIndexUint = true;
- extensions->getProgramBinary = true;
- extensions->rgb8rgba8 = true;
- extensions->readFormatBGRA = true;
- extensions->pixelBufferObject = true;
- extensions->mapBuffer = true;
- extensions->mapBufferRange = true;
- extensions->textureNPOT = GetNPOTTextureSupport(featureLevel);
- extensions->drawBuffers = GetMaximumSimultaneousRenderTargets(featureLevel) > 1;
- extensions->textureStorage = true;
- extensions->textureFilterAnisotropic = true;
- extensions->maxTextureAnisotropy = GetMaximumAnisotropy(featureLevel);
- extensions->occlusionQueryBoolean = GetOcclusionQuerySupport(featureLevel);
- extensions->fence = GetEventQuerySupport(featureLevel);
- extensions->disjointTimerQuery = true;
- extensions->queryCounterBitsTimeElapsed = 64;
- extensions->queryCounterBitsTimestamp =
- 0; // Timestamps cannot be supported due to D3D11 limitations
- extensions->robustness = true;
- // Direct3D guarantees to return zero for any resource that is accessed out of bounds.
- // See https://msdn.microsoft.com/en-us/library/windows/desktop/ff476332(v=vs.85).aspx
- // and https://msdn.microsoft.com/en-us/library/windows/desktop/ff476900(v=vs.85).aspx
- extensions->robustBufferAccessBehavior = true;
- extensions->blendMinMax = true;
- extensions->framebufferBlit = GetFramebufferBlitSupport(featureLevel);
- extensions->framebufferMultisample = GetFramebufferMultisampleSupport(featureLevel);
- extensions->instancedArrays = GetInstancingSupport(featureLevel);
- extensions->packReverseRowOrder = true;
- extensions->standardDerivatives = GetDerivativeInstructionSupport(featureLevel);
- extensions->shaderTextureLOD = GetShaderTextureLODSupport(featureLevel);
- extensions->fragDepth = true;
- extensions->multiview = IsMultiviewSupported(featureLevel);
- if (extensions->multiview)
- {
- extensions->maxViews =
- std::min(static_cast<GLuint>(gl::IMPLEMENTATION_ANGLE_MULTIVIEW_MAX_VIEWS),
- std::min(static_cast<GLuint>(GetMaximum2DTextureArraySize(featureLevel)),
- GetMaxViewportAndScissorRectanglesPerPipeline(featureLevel)));
- }
- extensions->textureUsage = true; // This could be false since it has no effect in D3D11
- extensions->discardFramebuffer = true;
- extensions->translatedShaderSource = true;
- extensions->fboRenderMipmap = false;
- extensions->debugMarker = true;
- extensions->eglImage = true;
- extensions->eglImageExternal = true;
- extensions->eglImageExternalEssl3 = true;
- extensions->eglStreamConsumerExternal = true;
- extensions->unpackSubimage = true;
- extensions->packSubimage = true;
- extensions->lossyETCDecode = true;
- extensions->syncQuery = GetEventQuerySupport(featureLevel);
- extensions->copyTexture = true;
- extensions->copyCompressedTexture = true;
-
- // D3D11 Feature Level 10_0+ uses SV_IsFrontFace in HLSL to emulate gl_FrontFacing.
- // D3D11 Feature Level 9_3 doesn't support SV_IsFrontFace, and has no equivalent, so can't support gl_FrontFacing.
- limitations->noFrontFacingSupport = (renderer11DeviceCaps.featureLevel <= D3D_FEATURE_LEVEL_9_3);
-
- // D3D11 Feature Level 9_3 doesn't support alpha-to-coverage
- limitations->noSampleAlphaToCoverageSupport = (renderer11DeviceCaps.featureLevel <= D3D_FEATURE_LEVEL_9_3);
-
- // D3D11 Feature Levels 9_3 and below do not support non-constant loop indexing and require
- // additional
- // pre-validation of the shader at compile time to produce a better error message.
- limitations->shadersRequireIndexedLoopValidation =
- (renderer11DeviceCaps.featureLevel <= D3D_FEATURE_LEVEL_9_3);
-
- // D3D11 has no concept of separate masks and refs for front and back faces in the depth stencil
- // state.
- limitations->noSeparateStencilRefsAndMasks = true;
-
- // D3D11 cannot support constant color and alpha blend funcs together
- limitations->noSimultaneousConstantColorAndAlphaBlendFunc = true;
-
-#ifdef ANGLE_ENABLE_WINDOWS_STORE
- // Setting a non-zero divisor on attribute zero doesn't work on certain Windows Phone 8-era devices.
- // We should prevent developers from doing this on ALL Windows Store devices. This will maintain consistency across all Windows devices.
- // We allow non-zero divisors on attribute zero if the Client Version >= 3, since devices affected by this issue don't support ES3+.
- limitations->attributeZeroRequiresZeroDivisorInEXT = true;
-#endif
-}
-
-void GetSamplePosition(GLsizei sampleCount, size_t index, GLfloat *xy)
-{
- size_t indexKey = static_cast<size_t>(ceil(log(sampleCount)));
- ASSERT(indexKey < kSamplePositions.size() &&
- (2 * index + 1) < kSamplePositions[indexKey].size());
-
- xy[0] = kSamplePositions[indexKey][2 * index];
- xy[1] = kSamplePositions[indexKey][2 * index + 1];
-}
-
-} // namespace d3d11_gl
-
-namespace gl_d3d11
-{
-
-D3D11_BLEND ConvertBlendFunc(GLenum glBlend, bool isAlpha)
-{
- D3D11_BLEND d3dBlend = D3D11_BLEND_ZERO;
-
- switch (glBlend)
- {
- case GL_ZERO:
- d3dBlend = D3D11_BLEND_ZERO;
- break;
- case GL_ONE:
- d3dBlend = D3D11_BLEND_ONE;
- break;
- case GL_SRC_COLOR:
- d3dBlend = (isAlpha ? D3D11_BLEND_SRC_ALPHA : D3D11_BLEND_SRC_COLOR);
- break;
- case GL_ONE_MINUS_SRC_COLOR:
- d3dBlend = (isAlpha ? D3D11_BLEND_INV_SRC_ALPHA : D3D11_BLEND_INV_SRC_COLOR);
- break;
- case GL_DST_COLOR:
- d3dBlend = (isAlpha ? D3D11_BLEND_DEST_ALPHA : D3D11_BLEND_DEST_COLOR);
- break;
- case GL_ONE_MINUS_DST_COLOR:
- d3dBlend = (isAlpha ? D3D11_BLEND_INV_DEST_ALPHA : D3D11_BLEND_INV_DEST_COLOR);
- break;
- case GL_SRC_ALPHA:
- d3dBlend = D3D11_BLEND_SRC_ALPHA;
- break;
- case GL_ONE_MINUS_SRC_ALPHA:
- d3dBlend = D3D11_BLEND_INV_SRC_ALPHA;
- break;
- case GL_DST_ALPHA:
- d3dBlend = D3D11_BLEND_DEST_ALPHA;
- break;
- case GL_ONE_MINUS_DST_ALPHA:
- d3dBlend = D3D11_BLEND_INV_DEST_ALPHA;
- break;
- case GL_CONSTANT_COLOR:
- d3dBlend = D3D11_BLEND_BLEND_FACTOR;
- break;
- case GL_ONE_MINUS_CONSTANT_COLOR:
- d3dBlend = D3D11_BLEND_INV_BLEND_FACTOR;
- break;
- case GL_CONSTANT_ALPHA:
- d3dBlend = D3D11_BLEND_BLEND_FACTOR;
- break;
- case GL_ONE_MINUS_CONSTANT_ALPHA:
- d3dBlend = D3D11_BLEND_INV_BLEND_FACTOR;
- break;
- case GL_SRC_ALPHA_SATURATE:
- d3dBlend = D3D11_BLEND_SRC_ALPHA_SAT;
- break;
- default:
- UNREACHABLE();
- }
-
- return d3dBlend;
-}
-
-D3D11_BLEND_OP ConvertBlendOp(GLenum glBlendOp)
-{
- D3D11_BLEND_OP d3dBlendOp = D3D11_BLEND_OP_ADD;
-
- switch (glBlendOp)
- {
- case GL_FUNC_ADD:
- d3dBlendOp = D3D11_BLEND_OP_ADD;
- break;
- case GL_FUNC_SUBTRACT:
- d3dBlendOp = D3D11_BLEND_OP_SUBTRACT;
- break;
- case GL_FUNC_REVERSE_SUBTRACT:
- d3dBlendOp = D3D11_BLEND_OP_REV_SUBTRACT;
- break;
- case GL_MIN:
- d3dBlendOp = D3D11_BLEND_OP_MIN;
- break;
- case GL_MAX:
- d3dBlendOp = D3D11_BLEND_OP_MAX;
- break;
- default:
- UNREACHABLE();
- }
-
- return d3dBlendOp;
-}
-
-UINT8 ConvertColorMask(bool red, bool green, bool blue, bool alpha)
-{
- UINT8 mask = 0;
- if (red)
- {
- mask |= D3D11_COLOR_WRITE_ENABLE_RED;
- }
- if (green)
- {
- mask |= D3D11_COLOR_WRITE_ENABLE_GREEN;
- }
- if (blue)
- {
- mask |= D3D11_COLOR_WRITE_ENABLE_BLUE;
- }
- if (alpha)
- {
- mask |= D3D11_COLOR_WRITE_ENABLE_ALPHA;
- }
- return mask;
-}
-
-D3D11_CULL_MODE ConvertCullMode(bool cullEnabled, gl::CullFaceMode cullMode)
-{
- D3D11_CULL_MODE cull = D3D11_CULL_NONE;
-
- if (cullEnabled)
- {
- switch (cullMode)
- {
- case gl::CullFaceMode::Front:
- cull = D3D11_CULL_FRONT;
- break;
- case gl::CullFaceMode::Back:
- cull = D3D11_CULL_BACK;
- break;
- case gl::CullFaceMode::FrontAndBack:
- cull = D3D11_CULL_NONE;
- break;
- default:
- UNREACHABLE();
- }
- }
- else
- {
- cull = D3D11_CULL_NONE;
- }
-
- return cull;
-}
-
-D3D11_COMPARISON_FUNC ConvertComparison(GLenum comparison)
-{
- D3D11_COMPARISON_FUNC d3dComp = D3D11_COMPARISON_NEVER;
- switch (comparison)
- {
- case GL_NEVER:
- d3dComp = D3D11_COMPARISON_NEVER;
- break;
- case GL_ALWAYS:
- d3dComp = D3D11_COMPARISON_ALWAYS;
- break;
- case GL_LESS:
- d3dComp = D3D11_COMPARISON_LESS;
- break;
- case GL_LEQUAL:
- d3dComp = D3D11_COMPARISON_LESS_EQUAL;
- break;
- case GL_EQUAL:
- d3dComp = D3D11_COMPARISON_EQUAL;
- break;
- case GL_GREATER:
- d3dComp = D3D11_COMPARISON_GREATER;
- break;
- case GL_GEQUAL:
- d3dComp = D3D11_COMPARISON_GREATER_EQUAL;
- break;
- case GL_NOTEQUAL:
- d3dComp = D3D11_COMPARISON_NOT_EQUAL;
- break;
- default:
- UNREACHABLE();
- }
-
- return d3dComp;
-}
-
-D3D11_DEPTH_WRITE_MASK ConvertDepthMask(bool depthWriteEnabled)
-{
- return depthWriteEnabled ? D3D11_DEPTH_WRITE_MASK_ALL : D3D11_DEPTH_WRITE_MASK_ZERO;
-}
-
-UINT8 ConvertStencilMask(GLuint stencilmask)
-{
- return static_cast<UINT8>(stencilmask);
-}
-
-D3D11_STENCIL_OP ConvertStencilOp(GLenum stencilOp)
-{
- D3D11_STENCIL_OP d3dStencilOp = D3D11_STENCIL_OP_KEEP;
-
- switch (stencilOp)
- {
- case GL_ZERO:
- d3dStencilOp = D3D11_STENCIL_OP_ZERO;
- break;
- case GL_KEEP:
- d3dStencilOp = D3D11_STENCIL_OP_KEEP;
- break;
- case GL_REPLACE:
- d3dStencilOp = D3D11_STENCIL_OP_REPLACE;
- break;
- case GL_INCR:
- d3dStencilOp = D3D11_STENCIL_OP_INCR_SAT;
- break;
- case GL_DECR:
- d3dStencilOp = D3D11_STENCIL_OP_DECR_SAT;
- break;
- case GL_INVERT:
- d3dStencilOp = D3D11_STENCIL_OP_INVERT;
- break;
- case GL_INCR_WRAP:
- d3dStencilOp = D3D11_STENCIL_OP_INCR;
- break;
- case GL_DECR_WRAP:
- d3dStencilOp = D3D11_STENCIL_OP_DECR;
- break;
- default:
- UNREACHABLE();
- }
-
- return d3dStencilOp;
-}
-
-D3D11_FILTER ConvertFilter(GLenum minFilter,
- GLenum magFilter,
- float maxAnisotropy,
- GLenum comparisonMode)
-{
- bool comparison = comparisonMode != GL_NONE;
-
- if (maxAnisotropy > 1.0f)
- {
- return D3D11_ENCODE_ANISOTROPIC_FILTER(static_cast<D3D11_COMPARISON_FUNC>(comparison));
- }
- else
- {
- D3D11_FILTER_TYPE dxMin = D3D11_FILTER_TYPE_POINT;
- D3D11_FILTER_TYPE dxMip = D3D11_FILTER_TYPE_POINT;
- switch (minFilter)
- {
- case GL_NEAREST:
- dxMin = D3D11_FILTER_TYPE_POINT;
- dxMip = D3D11_FILTER_TYPE_POINT;
- break;
- case GL_LINEAR:
- dxMin = D3D11_FILTER_TYPE_LINEAR;
- dxMip = D3D11_FILTER_TYPE_POINT;
- break;
- case GL_NEAREST_MIPMAP_NEAREST:
- dxMin = D3D11_FILTER_TYPE_POINT;
- dxMip = D3D11_FILTER_TYPE_POINT;
- break;
- case GL_LINEAR_MIPMAP_NEAREST:
- dxMin = D3D11_FILTER_TYPE_LINEAR;
- dxMip = D3D11_FILTER_TYPE_POINT;
- break;
- case GL_NEAREST_MIPMAP_LINEAR:
- dxMin = D3D11_FILTER_TYPE_POINT;
- dxMip = D3D11_FILTER_TYPE_LINEAR;
- break;
- case GL_LINEAR_MIPMAP_LINEAR:
- dxMin = D3D11_FILTER_TYPE_LINEAR;
- dxMip = D3D11_FILTER_TYPE_LINEAR;
- break;
- default:
- UNREACHABLE();
- }
-
- D3D11_FILTER_TYPE dxMag = D3D11_FILTER_TYPE_POINT;
- switch (magFilter)
- {
- case GL_NEAREST:
- dxMag = D3D11_FILTER_TYPE_POINT;
- break;
- case GL_LINEAR:
- dxMag = D3D11_FILTER_TYPE_LINEAR;
- break;
- default:
- UNREACHABLE();
- }
-
- return D3D11_ENCODE_BASIC_FILTER(dxMin, dxMag, dxMip,
- static_cast<D3D11_COMPARISON_FUNC>(comparison));
- }
-}
-
-D3D11_TEXTURE_ADDRESS_MODE ConvertTextureWrap(GLenum wrap)
-{
- switch (wrap)
- {
- case GL_REPEAT:
- return D3D11_TEXTURE_ADDRESS_WRAP;
- case GL_CLAMP_TO_EDGE:
- return D3D11_TEXTURE_ADDRESS_CLAMP;
- case GL_MIRRORED_REPEAT:
- return D3D11_TEXTURE_ADDRESS_MIRROR;
- default:
- UNREACHABLE();
- }
-
- return D3D11_TEXTURE_ADDRESS_WRAP;
-}
-
-UINT ConvertMaxAnisotropy(float maxAnisotropy, D3D_FEATURE_LEVEL featureLevel)
-{
- return static_cast<UINT>(std::min(maxAnisotropy, d3d11_gl::GetMaximumAnisotropy(featureLevel)));
-}
-
-D3D11_QUERY ConvertQueryType(GLenum queryType)
-{
- switch (queryType)
- {
- case GL_ANY_SAMPLES_PASSED_EXT:
- case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
- return D3D11_QUERY_OCCLUSION;
- case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
- return D3D11_QUERY_SO_STATISTICS;
- case GL_TIME_ELAPSED_EXT:
- // Two internal queries are also created for begin/end timestamps
- return D3D11_QUERY_TIMESTAMP_DISJOINT;
- case GL_COMMANDS_COMPLETED_CHROMIUM:
- return D3D11_QUERY_EVENT;
- default:
- UNREACHABLE();
- return D3D11_QUERY_EVENT;
- }
-}
-
-// Get the D3D11 write mask covering all color channels of a given format
-UINT8 GetColorMask(const gl::InternalFormat &format)
-{
- return ConvertColorMask(format.redBits > 0, format.greenBits > 0, format.blueBits > 0,
- format.alphaBits > 0);
-}
-
-} // namespace gl_d3d11
-
-namespace d3d11
-{
-
-ANGLED3D11DeviceType GetDeviceType(ID3D11Device *device)
-{
- // Note that this function returns an ANGLED3D11DeviceType rather than a D3D_DRIVER_TYPE value,
- // since it is difficult to tell Software and Reference devices apart
-
- IDXGIDevice *dxgiDevice = nullptr;
- IDXGIAdapter *dxgiAdapter = nullptr;
- IDXGIAdapter2 *dxgiAdapter2 = nullptr;
-
- ANGLED3D11DeviceType retDeviceType = ANGLE_D3D11_DEVICE_TYPE_UNKNOWN;
-
- HRESULT hr = device->QueryInterface(__uuidof(IDXGIDevice), (void **)&dxgiDevice);
- if (SUCCEEDED(hr))
- {
- hr = dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void **)&dxgiAdapter);
- if (SUCCEEDED(hr))
- {
- std::wstring adapterString;
- HRESULT adapter2hr =
- dxgiAdapter->QueryInterface(__uuidof(dxgiAdapter2), (void **)&dxgiAdapter2);
- if (SUCCEEDED(adapter2hr))
- {
- // On D3D_FEATURE_LEVEL_9_*, IDXGIAdapter::GetDesc returns "Software Adapter"
- // for the description string. Try to use IDXGIAdapter2::GetDesc2 to get the
- // actual hardware values if possible.
- DXGI_ADAPTER_DESC2 adapterDesc2;
- dxgiAdapter2->GetDesc2(&adapterDesc2);
- adapterString = std::wstring(adapterDesc2.Description);
- }
- else
- {
- DXGI_ADAPTER_DESC adapterDesc;
- dxgiAdapter->GetDesc(&adapterDesc);
- adapterString = std::wstring(adapterDesc.Description);
- }
-
- // Both Reference and Software adapters will be 'Software Adapter'
- const bool isSoftwareDevice =
- (adapterString.find(std::wstring(L"Software Adapter")) != std::string::npos);
- const bool isNullDevice = (adapterString == L"");
- const bool isWARPDevice =
- (adapterString.find(std::wstring(L"Basic Render")) != std::string::npos);
-
- if (isSoftwareDevice || isNullDevice)
- {
- ASSERT(!isWARPDevice);
- retDeviceType = ANGLE_D3D11_DEVICE_TYPE_SOFTWARE_REF_OR_NULL;
- }
- else if (isWARPDevice)
- {
- retDeviceType = ANGLE_D3D11_DEVICE_TYPE_WARP;
- }
- else
- {
- retDeviceType = ANGLE_D3D11_DEVICE_TYPE_HARDWARE;
- }
- }
- }
-
- SafeRelease(dxgiDevice);
- SafeRelease(dxgiAdapter);
- SafeRelease(dxgiAdapter2);
-
- return retDeviceType;
-}
-
-void MakeValidSize(bool isImage, DXGI_FORMAT format, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset)
-{
- const DXGIFormatSize &dxgiFormatInfo = d3d11::GetDXGIFormatSizeInfo(format);
-
- int upsampleCount = 0;
- // Don't expand the size of full textures that are at least (blockWidth x blockHeight) already.
- if (isImage || *requestWidth < static_cast<GLsizei>(dxgiFormatInfo.blockWidth) ||
- *requestHeight < static_cast<GLsizei>(dxgiFormatInfo.blockHeight))
- {
- while (*requestWidth % dxgiFormatInfo.blockWidth != 0 || *requestHeight % dxgiFormatInfo.blockHeight != 0)
- {
- *requestWidth <<= 1;
- *requestHeight <<= 1;
- upsampleCount++;
- }
- }
- if (levelOffset)
- {
- *levelOffset = upsampleCount;
- }
-}
-
-void GenerateInitialTextureData(GLint internalFormat,
- const Renderer11DeviceCaps &renderer11DeviceCaps,
- GLuint width,
- GLuint height,
- GLuint depth,
- GLuint mipLevels,
- std::vector<D3D11_SUBRESOURCE_DATA> *outSubresourceData,
- std::vector<std::vector<BYTE>> *outData)
-{
- const d3d11::Format &d3dFormatInfo = d3d11::Format::Get(internalFormat, renderer11DeviceCaps);
- ASSERT(d3dFormatInfo.dataInitializerFunction != nullptr);
-
- const d3d11::DXGIFormatSize &dxgiFormatInfo =
- d3d11::GetDXGIFormatSizeInfo(d3dFormatInfo.texFormat);
-
- outSubresourceData->resize(mipLevels);
- outData->resize(mipLevels);
-
- for (unsigned int i = 0; i < mipLevels; i++)
- {
- unsigned int mipWidth = std::max(width >> i, 1U);
- unsigned int mipHeight = std::max(height >> i, 1U);
- unsigned int mipDepth = std::max(depth >> i, 1U);
-
- unsigned int rowWidth = dxgiFormatInfo.pixelBytes * mipWidth;
- unsigned int imageSize = rowWidth * height;
-
- outData->at(i).resize(rowWidth * mipHeight * mipDepth);
- d3dFormatInfo.dataInitializerFunction(mipWidth, mipHeight, mipDepth, outData->at(i).data(), rowWidth, imageSize);
-
- outSubresourceData->at(i).pSysMem = outData->at(i).data();
- outSubresourceData->at(i).SysMemPitch = rowWidth;
- outSubresourceData->at(i).SysMemSlicePitch = imageSize;
- }
-}
-
-UINT GetPrimitiveRestartIndex()
-{
- return std::numeric_limits<UINT>::max();
-}
-
-void SetPositionTexCoordVertex(PositionTexCoordVertex* vertex, float x, float y, float u, float v)
-{
- vertex->x = x;
- vertex->y = y;
- vertex->u = u;
- vertex->v = v;
-}
-
-void SetPositionLayerTexCoord3DVertex(PositionLayerTexCoord3DVertex* vertex, float x, float y,
- unsigned int layer, float u, float v, float s)
-{
- vertex->x = x;
- vertex->y = y;
- vertex->l = layer;
- vertex->u = u;
- vertex->v = v;
- vertex->s = s;
-}
-
-BlendStateKey::BlendStateKey()
-{
- memset(this, 0, sizeof(BlendStateKey));
-}
-
-bool operator==(const BlendStateKey &a, const BlendStateKey &b)
-{
- return memcmp(&a, &b, sizeof(BlendStateKey)) == 0;
-}
-
-bool operator!=(const BlendStateKey &a, const BlendStateKey &b)
-{
- return !(a == b);
-}
-
-RasterizerStateKey::RasterizerStateKey()
-{
- memset(this, 0, sizeof(RasterizerStateKey));
-}
-
-bool operator==(const RasterizerStateKey &a, const RasterizerStateKey &b)
-{
- return memcmp(&a, &b, sizeof(RasterizerStateKey)) == 0;
-}
-
-bool operator!=(const RasterizerStateKey &a, const RasterizerStateKey &b)
-{
- return !(a == b);
-}
-
-HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name)
-{
-#if defined(_DEBUG)
- UINT existingDataSize = 0;
- resource->GetPrivateData(WKPDID_D3DDebugObjectName, &existingDataSize, nullptr);
- // Don't check the HRESULT- if it failed then that probably just means that no private data
- // exists yet
-
- if (existingDataSize > 0)
- {
- // In some cases, ANGLE will try to apply two names to one object, which causes
- // a D3D SDK Layers warning. This can occur if, for example, you 'create' two objects
- // (e.g.Rasterizer States) with identical DESCs on the same device. D3D11 will optimize
- // these calls and return the same object both times.
- static const char *multipleNamesUsed = "Multiple names set by ANGLE";
-
- // Remove the existing name
- HRESULT hr = resource->SetPrivateData(WKPDID_D3DDebugObjectName, 0, nullptr);
- if (FAILED(hr))
- {
- return hr;
- }
-
- // Apply the new name
- return resource->SetPrivateData(WKPDID_D3DDebugObjectName,
- static_cast<unsigned int>(strlen(multipleNamesUsed)),
- multipleNamesUsed);
- }
- else
- {
- return resource->SetPrivateData(WKPDID_D3DDebugObjectName,
- static_cast<unsigned int>(strlen(name)), name);
- }
-#else
- return S_OK;
-#endif
-}
-
-// Keep this in cpp file where it has visibility of Renderer11.h, otherwise calling
-// allocateResource is only compatible with Clang and MSVS, which support calling a
-// method on a forward declared class in a template.
-template <ResourceType ResourceT>
-gl::Error LazyResource<ResourceT>::resolveImpl(Renderer11 *renderer,
- const GetDescType<ResourceT> &desc,
- GetInitDataType<ResourceT> *initData,
- const char *name)
-{
- if (!mResource.valid())
- {
- ANGLE_TRY(renderer->allocateResource(desc, initData, &mResource));
- mResource.setDebugName(name);
- }
- return gl::NoError();
-}
-
-template gl::Error LazyResource<ResourceType::BlendState>::resolveImpl(Renderer11 *renderer,
- const D3D11_BLEND_DESC &desc,
- void *initData,
- const char *name);
-template gl::Error LazyResource<ResourceType::ComputeShader>::resolveImpl(Renderer11 *renderer,
- const ShaderData &desc,
- void *initData,
- const char *name);
-template gl::Error LazyResource<ResourceType::GeometryShader>::resolveImpl(
- Renderer11 *renderer,
- const ShaderData &desc,
- const std::vector<D3D11_SO_DECLARATION_ENTRY> *initData,
- const char *name);
-template gl::Error LazyResource<ResourceType::InputLayout>::resolveImpl(
- Renderer11 *renderer,
- const InputElementArray &desc,
- const ShaderData *initData,
- const char *name);
-template gl::Error LazyResource<ResourceType::PixelShader>::resolveImpl(Renderer11 *renderer,
- const ShaderData &desc,
- void *initData,
- const char *name);
-template gl::Error LazyResource<ResourceType::VertexShader>::resolveImpl(Renderer11 *renderer,
- const ShaderData &desc,
- void *initData,
- const char *name);
-
-LazyInputLayout::LazyInputLayout(const D3D11_INPUT_ELEMENT_DESC *inputDesc,
- size_t inputDescLen,
- const BYTE *byteCode,
- size_t byteCodeLen,
- const char *debugName)
- : mInputDesc(inputDesc, inputDescLen), mByteCode(byteCode, byteCodeLen), mDebugName(debugName)
-{
-}
-
-LazyInputLayout::~LazyInputLayout()
-{
-}
-
-gl::Error LazyInputLayout::resolve(Renderer11 *renderer)
-{
- return resolveImpl(renderer, mInputDesc, &mByteCode, mDebugName);
-}
-
-LazyBlendState::LazyBlendState(const D3D11_BLEND_DESC &desc, const char *debugName)
- : mDesc(desc), mDebugName(debugName)
-{
-}
-
-gl::Error LazyBlendState::resolve(Renderer11 *renderer)
-{
- return resolveImpl(renderer, mDesc, nullptr, mDebugName);
-}
-
-angle::WorkaroundsD3D GenerateWorkarounds(const Renderer11DeviceCaps &deviceCaps,
- const DXGI_ADAPTER_DESC &adapterDesc)
-{
- bool is9_3 = (deviceCaps.featureLevel <= D3D_FEATURE_LEVEL_9_3);
-
- angle::WorkaroundsD3D workarounds;
- workarounds.mrtPerfWorkaround = true;
- workarounds.setDataFasterThanImageUpload = true;
- workarounds.zeroMaxLodWorkaround = is9_3;
- workarounds.useInstancedPointSpriteEmulation = is9_3;
-
- // TODO(jmadill): Narrow problematic driver range.
- if (IsNvidia(adapterDesc.VendorId))
- {
- if (deviceCaps.driverVersion.valid())
- {
- WORD part1 = HIWORD(deviceCaps.driverVersion.value().LowPart);
- WORD part2 = LOWORD(deviceCaps.driverVersion.value().LowPart);
-
- // Disable the workaround to fix a second driver bug on newer NVIDIA.
- workarounds.depthStencilBlitExtraCopy = (part1 <= 13u && part2 < 6881);
- }
- else
- {
- workarounds.depthStencilBlitExtraCopy = true;
- }
- }
-
- // TODO(jmadill): Disable workaround when we have a fixed compiler DLL.
- workarounds.expandIntegerPowExpressions = true;
-
- workarounds.flushAfterEndingTransformFeedback = IsNvidia(adapterDesc.VendorId);
- workarounds.getDimensionsIgnoresBaseLevel = IsNvidia(adapterDesc.VendorId);
-
- if (IsIntel(adapterDesc.VendorId))
- {
- IntelDriverVersion capsVersion = d3d11_gl::GetIntelDriverVersion(deviceCaps.driverVersion);
-
- workarounds.preAddTexelFetchOffsets = true;
- workarounds.useSystemMemoryForConstantBuffers = true;
- workarounds.disableB5G6R5Support = capsVersion < IntelDriverVersion(4539);
- workarounds.addDummyTextureNoRenderTarget = capsVersion < IntelDriverVersion(4815);
- if (IsSkylake(adapterDesc.DeviceId))
- {
- workarounds.callClearTwice = capsVersion < IntelDriverVersion(4771);
- workarounds.emulateIsnanFloat = capsVersion < IntelDriverVersion(4542);
- }
- else if (IsBroadwell(adapterDesc.DeviceId) || IsHaswell(adapterDesc.DeviceId))
- {
- workarounds.rewriteUnaryMinusOperator = capsVersion < IntelDriverVersion(4624);
- }
- }
-
- // TODO(jmadill): Disable when we have a fixed driver version.
- workarounds.emulateTinyStencilTextures = IsAMD(adapterDesc.VendorId);
-
- // The tiny stencil texture workaround involves using CopySubresource or UpdateSubresource on a
- // depth stencil texture. This is not allowed until feature level 10.1 but since it is not
- // possible to support ES3 on these devices, there is no need for the workaround to begin with
- // (anglebug.com/1572).
- if (deviceCaps.featureLevel < D3D_FEATURE_LEVEL_10_1)
- {
- workarounds.emulateTinyStencilTextures = false;
- }
-
- // If the VPAndRTArrayIndexFromAnyShaderFeedingRasterizer feature is not available, we have to
- // select the viewport / RT array index in the geometry shader.
- workarounds.selectViewInGeometryShader =
- (deviceCaps.supportsVpRtIndexWriteFromVertexShader == false);
-
- // Call platform hooks for testing overrides.
- auto *platform = ANGLEPlatformCurrent();
- platform->overrideWorkaroundsD3D(platform, &workarounds);
-
- return workarounds;
-}
-
-void InitConstantBufferDesc(D3D11_BUFFER_DESC *constantBufferDescription, size_t byteWidth)
-{
- constantBufferDescription->ByteWidth = static_cast<UINT>(byteWidth);
- constantBufferDescription->Usage = D3D11_USAGE_DYNAMIC;
- constantBufferDescription->BindFlags = D3D11_BIND_CONSTANT_BUFFER;
- constantBufferDescription->CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- constantBufferDescription->MiscFlags = 0;
- constantBufferDescription->StructureByteStride = 0;
-}
-
-} // namespace d3d11
-
-// TextureHelper11 implementation.
-TextureHelper11::TextureHelper11() : mFormatSet(nullptr), mSampleCount(0)
-{
-}
-
-TextureHelper11::TextureHelper11(TextureHelper11 &&toCopy) : TextureHelper11()
-{
- *this = std::move(toCopy);
-}
-
-TextureHelper11::TextureHelper11(const TextureHelper11 &other)
- : mFormatSet(other.mFormatSet), mExtents(other.mExtents), mSampleCount(other.mSampleCount)
-{
- mData = other.mData;
-}
-
-TextureHelper11::~TextureHelper11()
-{
-}
-
-void TextureHelper11::getDesc(D3D11_TEXTURE2D_DESC *desc) const
-{
- static_cast<ID3D11Texture2D *>(mData->object)->GetDesc(desc);
-}
-
-void TextureHelper11::getDesc(D3D11_TEXTURE3D_DESC *desc) const
-{
- static_cast<ID3D11Texture3D *>(mData->object)->GetDesc(desc);
-}
-
-void TextureHelper11::initDesc(const D3D11_TEXTURE2D_DESC &desc2D)
-{
- mData->resourceType = ResourceType::Texture2D;
- mExtents.width = static_cast<int>(desc2D.Width);
- mExtents.height = static_cast<int>(desc2D.Height);
- mExtents.depth = 1;
- mSampleCount = desc2D.SampleDesc.Count;
-}
-
-void TextureHelper11::initDesc(const D3D11_TEXTURE3D_DESC &desc3D)
-{
- mData->resourceType = ResourceType::Texture3D;
- mExtents.width = static_cast<int>(desc3D.Width);
- mExtents.height = static_cast<int>(desc3D.Height);
- mExtents.depth = static_cast<int>(desc3D.Depth);
- mSampleCount = 1;
-}
-
-TextureHelper11 &TextureHelper11::operator=(TextureHelper11 &&other)
-{
- std::swap(mData, other.mData);
- std::swap(mExtents, other.mExtents);
- std::swap(mFormatSet, other.mFormatSet);
- std::swap(mSampleCount, other.mSampleCount);
- return *this;
-}
-
-TextureHelper11 &TextureHelper11::operator=(const TextureHelper11 &other)
-{
- mData = other.mData;
- mExtents = other.mExtents;
- mFormatSet = other.mFormatSet;
- mSampleCount = other.mSampleCount;
- return *this;
-}
-
-bool TextureHelper11::operator==(const TextureHelper11 &other) const
-{
- return mData->object == other.mData->object;
-}
-
-bool TextureHelper11::operator!=(const TextureHelper11 &other) const
-{
- return mData->object != other.mData->object;
-}
-
-bool UsePresentPathFast(const Renderer11 *renderer,
- const gl::FramebufferAttachment *framebufferAttachment)
-{
- if (framebufferAttachment == nullptr)
- {
- return false;
- }
-
- return (framebufferAttachment->type() == GL_FRAMEBUFFER_DEFAULT &&
- renderer->presentPathFastEnabled());
-}
-
-bool UsePrimitiveRestartWorkaround(bool primitiveRestartFixedIndexEnabled, GLenum type)
-{
- // We should never have to deal with primitive restart workaround issue with GL_UNSIGNED_INT
- // indices, since we restrict it via MAX_ELEMENT_INDEX.
- return (!primitiveRestartFixedIndexEnabled && type == GL_UNSIGNED_SHORT);
-}
-
-bool IsStreamingIndexData(const gl::Context *context, GLenum srcType)
-{
- const auto &glState = context->getGLState();
- gl::Buffer *glBuffer = glState.getVertexArray()->getElementArrayBuffer().get();
-
- // Case 1: the indices are passed by pointer, which forces the streaming of index data
- if (glBuffer == nullptr)
- {
- return true;
- }
-
- bool primitiveRestartWorkaround =
- UsePrimitiveRestartWorkaround(glState.isPrimitiveRestartEnabled(), srcType);
-
- BufferD3D *buffer = GetImplAs<BufferD3D>(glBuffer);
- const GLenum dstType = (srcType == GL_UNSIGNED_INT || primitiveRestartWorkaround)
- ? GL_UNSIGNED_INT
- : GL_UNSIGNED_SHORT;
-
- // Case 2a: the buffer can be used directly
- if (buffer->supportsDirectBinding() && dstType == srcType)
- {
- return false;
- }
-
- // Case 2b: use a static translated copy or fall back to streaming
- StaticIndexBufferInterface *staticBuffer = buffer->getStaticIndexBuffer();
- if (staticBuffer == nullptr)
- {
- return true;
- }
-
- if ((staticBuffer->getBufferSize() == 0) || (staticBuffer->getIndexType() != dstType))
- {
- return true;
- }
-
- return false;
-}
-
-IndexStorageType ClassifyIndexStorage(const gl::State &glState,
- const gl::Buffer *elementArrayBuffer,
- GLenum elementType,
- GLenum destElementType,
- unsigned int offset,
- bool *needsTranslation)
-{
- // No buffer bound means we are streaming from a client pointer.
- if (!elementArrayBuffer || !IsOffsetAligned(elementType, offset))
- {
- *needsTranslation = true;
- return IndexStorageType::Dynamic;
- }
-
- // The buffer can be used directly if the storage supports it and no translation needed.
- BufferD3D *bufferD3D = GetImplAs<BufferD3D>(elementArrayBuffer);
- if (bufferD3D->supportsDirectBinding() && destElementType == elementType)
- {
- *needsTranslation = false;
- return IndexStorageType::Direct;
- }
-
- // Use a static copy when available.
- StaticIndexBufferInterface *staticBuffer = bufferD3D->getStaticIndexBuffer();
- if (staticBuffer != nullptr)
- {
- // Need to re-translate the static data if has never been used, or changed type.
- *needsTranslation =
- (staticBuffer->getBufferSize() == 0 || staticBuffer->getIndexType() != destElementType);
- return IndexStorageType::Static;
- }
-
- // Static buffer not available, fall back to streaming.
- *needsTranslation = true;
- return IndexStorageType::Dynamic;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h
deleted file mode 100644
index 3af51bb0f6..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h
+++ /dev/null
@@ -1,431 +0,0 @@
-//
-// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// renderer11_utils.h: Conversion functions and other utility routines
-// specific to the D3D11 renderer.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_UTILS_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_UTILS_H_
-
-#include <array>
-#include <functional>
-#include <vector>
-
-#include "common/Color.h"
-
-#include "libANGLE/Caps.h"
-#include "libANGLE/Error.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
-#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h"
-
-namespace gl
-{
-class FramebufferAttachment;
-}
-
-namespace rx
-{
-class Renderer11;
-class RenderTarget11;
-struct Renderer11DeviceCaps;
-
-using RenderTargetArray = std::array<RenderTarget11 *, gl::IMPLEMENTATION_MAX_DRAW_BUFFERS>;
-using RTVArray = std::array<ID3D11RenderTargetView *, gl::IMPLEMENTATION_MAX_DRAW_BUFFERS>;
-
-namespace gl_d3d11
-{
-
-D3D11_BLEND ConvertBlendFunc(GLenum glBlend, bool isAlpha);
-D3D11_BLEND_OP ConvertBlendOp(GLenum glBlendOp);
-UINT8 ConvertColorMask(bool maskRed, bool maskGreen, bool maskBlue, bool maskAlpha);
-
-D3D11_CULL_MODE ConvertCullMode(bool cullEnabled, gl::CullFaceMode cullMode);
-
-D3D11_COMPARISON_FUNC ConvertComparison(GLenum comparison);
-D3D11_DEPTH_WRITE_MASK ConvertDepthMask(bool depthWriteEnabled);
-UINT8 ConvertStencilMask(GLuint stencilmask);
-D3D11_STENCIL_OP ConvertStencilOp(GLenum stencilOp);
-
-D3D11_FILTER ConvertFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy, GLenum comparisonMode);
-D3D11_TEXTURE_ADDRESS_MODE ConvertTextureWrap(GLenum wrap);
-UINT ConvertMaxAnisotropy(float maxAnisotropy, D3D_FEATURE_LEVEL featureLevel);
-
-D3D11_QUERY ConvertQueryType(GLenum queryType);
-
-UINT8 GetColorMask(const gl::InternalFormat &formatInfo);
-
-} // namespace gl_d3d11
-
-namespace d3d11_gl
-{
-
-unsigned int GetReservedVertexUniformVectors(D3D_FEATURE_LEVEL featureLevel);
-
-unsigned int GetReservedFragmentUniformVectors(D3D_FEATURE_LEVEL featureLevel);
-
-gl::Version GetMaximumClientVersion(D3D_FEATURE_LEVEL featureLevel);
-void GenerateCaps(ID3D11Device *device, ID3D11DeviceContext *deviceContext, const Renderer11DeviceCaps &renderer11DeviceCaps, gl::Caps *caps,
- gl::TextureCapsMap *textureCapsMap, gl::Extensions *extensions, gl::Limitations *limitations);
-
-void GetSamplePosition(GLsizei sampleCount, size_t index, GLfloat *xy);
-
-} // namespace d3d11_gl
-
-namespace d3d11
-{
-
-enum ANGLED3D11DeviceType
-{
- ANGLE_D3D11_DEVICE_TYPE_UNKNOWN,
- ANGLE_D3D11_DEVICE_TYPE_HARDWARE,
- ANGLE_D3D11_DEVICE_TYPE_SOFTWARE_REF_OR_NULL,
- ANGLE_D3D11_DEVICE_TYPE_WARP,
-};
-
-ANGLED3D11DeviceType GetDeviceType(ID3D11Device *device);
-
-void MakeValidSize(bool isImage, DXGI_FORMAT format, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset);
-
-void GenerateInitialTextureData(GLint internalFormat,
- const Renderer11DeviceCaps &renderer11DeviceCaps,
- GLuint width,
- GLuint height,
- GLuint depth,
- GLuint mipLevels,
- std::vector<D3D11_SUBRESOURCE_DATA> *outSubresourceData,
- std::vector<std::vector<BYTE>> *outData);
-
-UINT GetPrimitiveRestartIndex();
-
-struct PositionTexCoordVertex
-{
- float x, y;
- float u, v;
-};
-void SetPositionTexCoordVertex(PositionTexCoordVertex* vertex, float x, float y, float u, float v);
-
-struct PositionLayerTexCoord3DVertex
-{
- float x, y;
- unsigned int l;
- float u, v, s;
-};
-void SetPositionLayerTexCoord3DVertex(PositionLayerTexCoord3DVertex* vertex, float x, float y,
- unsigned int layer, float u, float v, float s);
-
-struct PositionVertex
-{
- float x, y, z, w;
-};
-
-struct BlendStateKey final
-{
- // This will zero-initialize the struct, including padding.
- BlendStateKey();
-
- gl::BlendState blendState;
-
- // An int so struct size rounds nicely.
- uint32_t rtvMax;
-
- uint8_t rtvMasks[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT];
-};
-
-bool operator==(const BlendStateKey &a, const BlendStateKey &b);
-bool operator!=(const BlendStateKey &a, const BlendStateKey &b);
-
-struct RasterizerStateKey final
-{
- // This will zero-initialize the struct, including padding.
- RasterizerStateKey();
-
- gl::RasterizerState rasterizerState;
-
- // Use a 32-bit int to round the struct nicely.
- uint32_t scissorEnabled;
-};
-
-bool operator==(const RasterizerStateKey &a, const RasterizerStateKey &b);
-bool operator!=(const RasterizerStateKey &a, const RasterizerStateKey &b);
-
-template <typename outType>
-outType* DynamicCastComObject(IUnknown* object)
-{
- outType *outObject = nullptr;
- HRESULT result = object->QueryInterface(__uuidof(outType), reinterpret_cast<void**>(&outObject));
- if (SUCCEEDED(result))
- {
- return outObject;
- }
- else
- {
- SafeRelease(outObject);
- return nullptr;
- }
-}
-
-inline bool isDeviceLostError(HRESULT errorCode)
-{
- switch (errorCode)
- {
- case DXGI_ERROR_DEVICE_HUNG:
- case DXGI_ERROR_DEVICE_REMOVED:
- case DXGI_ERROR_DEVICE_RESET:
- case DXGI_ERROR_DRIVER_INTERNAL_ERROR:
- case DXGI_ERROR_NOT_CURRENTLY_AVAILABLE:
- return true;
- default:
- return false;
- }
-}
-
-template <ResourceType ResourceT>
-class LazyResource : angle::NonCopyable
-{
- public:
- constexpr LazyResource() : mResource() {}
- virtual ~LazyResource() {}
-
- virtual gl::Error resolve(Renderer11 *renderer) = 0;
- void reset() { mResource.reset(); }
- GetD3D11Type<ResourceT> *get() const
- {
- ASSERT(mResource.valid());
- return mResource.get();
- }
-
- const Resource11<GetD3D11Type<ResourceT>> &getObj() const { return mResource; }
-
- protected:
- LazyResource(LazyResource &&other) : mResource(std::move(other.mResource)) {}
-
- // Specialized in the cpp file to avoid MSVS/Clang specific code.
- gl::Error resolveImpl(Renderer11 *renderer,
- const GetDescType<ResourceT> &desc,
- GetInitDataType<ResourceT> *initData,
- const char *name);
-
- Resource11<GetD3D11Type<ResourceT>> mResource;
-};
-
-template <typename D3D11ShaderType>
-class LazyShader final : public LazyResource<GetResourceTypeFromD3D11<D3D11ShaderType>()>
-{
- public:
- // All parameters must be constexpr. Not supported in VS2013.
- constexpr LazyShader(const BYTE *byteCode, size_t byteCodeSize, const char *name)
- : mByteCode(byteCode, byteCodeSize), mName(name)
- {
- }
-
- constexpr LazyShader(LazyShader &&shader)
- : LazyResource<GetResourceTypeFromD3D11<D3D11ShaderType>()>(std::move(shader)),
- mByteCode(std::move(shader.mByteCode)),
- mName(shader.mName)
- {
- }
-
- gl::Error resolve(Renderer11 *renderer) override
- {
- return this->resolveImpl(renderer, mByteCode, nullptr, mName);
- }
-
- private:
- ShaderData mByteCode;
- const char *mName;
-};
-
-class LazyInputLayout final : public LazyResource<ResourceType::InputLayout>
-{
- public:
- LazyInputLayout(const D3D11_INPUT_ELEMENT_DESC *inputDesc,
- size_t inputDescLen,
- const BYTE *byteCode,
- size_t byteCodeLen,
- const char *debugName);
- ~LazyInputLayout() override;
-
- gl::Error resolve(Renderer11 *renderer) override;
-
- private:
- InputElementArray mInputDesc;
- ShaderData mByteCode;
- const char *mDebugName;
-};
-
-class LazyBlendState final : public LazyResource<ResourceType::BlendState>
-{
- public:
- LazyBlendState(const D3D11_BLEND_DESC &desc, const char *debugName);
-
- gl::Error resolve(Renderer11 *renderer) override;
-
- private:
- D3D11_BLEND_DESC mDesc;
- const char *mDebugName;
-};
-
-// Copy data to small D3D11 buffers, such as for small constant buffers, which use one struct to
-// represent an entire buffer.
-template <class T>
-void SetBufferData(ID3D11DeviceContext *context, ID3D11Buffer *constantBuffer, const T &value)
-{
- D3D11_MAPPED_SUBRESOURCE mappedResource = {};
- HRESULT result = context->Map(constantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
- ASSERT(SUCCEEDED(result));
- if (SUCCEEDED(result))
- {
- memcpy(mappedResource.pData, &value, sizeof(T));
- context->Unmap(constantBuffer, 0);
- }
-}
-
-angle::WorkaroundsD3D GenerateWorkarounds(const Renderer11DeviceCaps &deviceCaps,
- const DXGI_ADAPTER_DESC &adapterDesc);
-
-enum ReservedConstantBufferSlot
-{
- RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK = 0,
- RESERVED_CONSTANT_BUFFER_SLOT_DRIVER = 1,
-
- RESERVED_CONSTANT_BUFFER_SLOT_COUNT = 2
-};
-
-void InitConstantBufferDesc(D3D11_BUFFER_DESC *constantBufferDescription, size_t byteWidth);
-} // namespace d3d11
-
-struct GenericData
-{
- GenericData() {}
- ~GenericData()
- {
- if (object)
- {
- // We can have a nullptr factory when holding passed-in resources.
- if (manager)
- {
- manager->onReleaseGeneric(resourceType, object);
- manager = nullptr;
- }
- object->Release();
- object = nullptr;
- }
- }
-
- ResourceType resourceType = ResourceType::Last;
- ID3D11Resource *object = nullptr;
- ResourceManager11 *manager = nullptr;
-};
-
-// A helper class which wraps a 2D or 3D texture.
-class TextureHelper11 : public Resource11Base<ID3D11Resource, std::shared_ptr, GenericData>
-{
- public:
- TextureHelper11();
- TextureHelper11(TextureHelper11 &&other);
- TextureHelper11(const TextureHelper11 &other);
- ~TextureHelper11() override;
- TextureHelper11 &operator=(TextureHelper11 &&other);
- TextureHelper11 &operator=(const TextureHelper11 &other);
-
- bool is2D() const { return mData->resourceType == ResourceType::Texture2D; }
- bool is3D() const { return mData->resourceType == ResourceType::Texture3D; }
- ResourceType getTextureType() const { return mData->resourceType; }
- gl::Extents getExtents() const { return mExtents; }
- DXGI_FORMAT getFormat() const { return mFormatSet->texFormat; }
- const d3d11::Format &getFormatSet() const { return *mFormatSet; }
- int getSampleCount() const { return mSampleCount; }
-
- template <typename DescT, typename ResourceT>
- void init(Resource11<ResourceT> &&texture, const DescT &desc, const d3d11::Format &format)
- {
- std::swap(mData->manager, texture.mData->manager);
-
- // Can't use std::swap because texture is typed, and here we use ID3D11Resource.
- ID3D11Resource *temp = mData->object;
- mData->object = texture.mData->object;
- texture.mData->object = static_cast<ResourceT *>(temp);
-
- mFormatSet = &format;
- initDesc(desc);
- }
-
- template <typename ResourceT>
- void set(ResourceT *object, const d3d11::Format &format)
- {
- ASSERT(!valid());
- mFormatSet = &format;
- mData->object = object;
- mData->manager = nullptr;
-
- GetDescFromD3D11<ResourceT> desc;
- getDesc(&desc);
- initDesc(desc);
- }
-
- bool operator==(const TextureHelper11 &other) const;
- bool operator!=(const TextureHelper11 &other) const;
-
- void getDesc(D3D11_TEXTURE2D_DESC *desc) const;
- void getDesc(D3D11_TEXTURE3D_DESC *desc) const;
-
- private:
- void initDesc(const D3D11_TEXTURE2D_DESC &desc2D);
- void initDesc(const D3D11_TEXTURE3D_DESC &desc3D);
-
- const d3d11::Format *mFormatSet;
- gl::Extents mExtents;
- int mSampleCount;
-};
-
-enum class StagingAccess
-{
- READ,
- READ_WRITE,
-};
-
-bool UsePresentPathFast(const Renderer11 *renderer, const gl::FramebufferAttachment *colorbuffer);
-bool UsePrimitiveRestartWorkaround(bool primitiveRestartFixedIndexEnabled, GLenum type);
-bool IsStreamingIndexData(const gl::Context *context, GLenum srcType);
-
-enum class IndexStorageType
-{
- // Dynamic indexes are re-streamed every frame. They come from a client data pointer or
- // from buffers that are updated frequently.
- Dynamic,
-
- // Static indexes are translated from the original storage once, and re-used multiple times.
- Static,
-
- // Direct indexes are never transated and are used directly from the source buffer. They are
- // the fastest available path.
- Direct,
-
- // Not a real storage type.
- Invalid,
-};
-
-IndexStorageType ClassifyIndexStorage(const gl::State &glState,
- const gl::Buffer *elementArrayBuffer,
- GLenum elementType,
- GLenum destElementType,
- unsigned int offset,
- bool *needsTranslation);
-
-// Used for state change notifications between buffers and vertex arrays.
-using OnBufferDataDirtyBinding = angle::ChannelBinding<size_t, const gl::Context *>;
-using OnBufferDataDirtyChannel = angle::BroadcastChannel<size_t, const gl::Context *>;
-using OnBufferDataDirtyReceiver = angle::SignalReceiver<size_t, const gl::Context *>;
-
-// Used for state change notifications between RenderTarget11 and Framebuffer11.
-using OnRenderTargetDirtyBinding = angle::ChannelBinding<size_t, const gl::Context *>;
-using OnRenderTargetDirtyChannel = angle::BroadcastChannel<size_t, const gl::Context *>;
-using OnRenderTargetDirtyReceiver = angle::SignalReceiver<size_t, const gl::Context *>;
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_UTILS_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/BufferToTexture11.hlsl b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/BufferToTexture11.hlsl
deleted file mode 100644
index c43734f6a3..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/BufferToTexture11.hlsl
+++ /dev/null
@@ -1,77 +0,0 @@
-Buffer<float4> Buffer4F : register(t0);
-Buffer<int4> Buffer4I : register(t0);
-Buffer<uint4> Buffer4UI : register(t0);
-
-struct VS_OUTPUT
-{
- float4 position : SV_Position;
- uint index : TEXCOORD0;
- uint slice : LAYER;
-};
-
-struct GS_OUTPUT
-{
- float4 position : SV_Position;
- uint index : TEXCOORD0;
- uint slice : SV_RenderTargetArrayIndex;
-};
-
-cbuffer BufferCopyParams : register(b0)
-{
- uint FirstPixelOffset;
- uint PixelsPerRow;
- uint RowStride;
- uint RowsPerSlice;
- float2 PositionOffset;
- float2 PositionScale;
- int2 TexLocationOffset;
- int2 TexLocationScale;
- uint FirstSlice;
-}
-
-void ComputePositionAndIndex(uint vertexID, out VS_OUTPUT outVertex)
-{
- uint PixelsPerSlice = PixelsPerRow * RowsPerSlice;
- uint SliceStride = RowStride * RowsPerSlice;
-
- uint slice = vertexID / PixelsPerSlice;
- uint sliceOffset = slice * PixelsPerSlice;
- uint row = (vertexID - sliceOffset) / PixelsPerRow;
- uint col = vertexID - sliceOffset - (row * PixelsPerRow);
-
- float2 coords = float2(float(col), float(row));
-
- outVertex.position = float4(PositionOffset + PositionScale * coords, 0.0f, 1.0f);
- outVertex.index = FirstPixelOffset + slice * SliceStride + row * RowStride + col;
- outVertex.slice = FirstSlice + slice;
-}
-
-void VS_BufferToTexture(in uint vertexID : SV_VertexID, out VS_OUTPUT outVertex)
-{
- ComputePositionAndIndex(vertexID, outVertex);
-}
-
-[maxvertexcount(1)]
-void GS_BufferToTexture(point VS_OUTPUT inVertex[1], inout PointStream<GS_OUTPUT> outStream)
-{
- GS_OUTPUT outVertex;
- outVertex.position = inVertex[0].position;
- outVertex.index = inVertex[0].index;
- outVertex.slice = inVertex[0].slice;
- outStream.Append(outVertex);
-}
-
-float4 PS_BufferToTexture_4F(in float4 inPosition : SV_Position, in uint inIndex : TEXCOORD0) : SV_Target
-{
- return Buffer4F.Load(inIndex);
-}
-
-int4 PS_BufferToTexture_4I(in float4 inPosition : SV_Position, in uint inIndex : TEXCOORD0) : SV_Target
-{
- return Buffer4I.Load(inIndex);
-}
-
-uint4 PS_BufferToTexture_4UI(in float4 inPosition : SV_Position, in uint inIndex : TEXCOORD0) : SV_Target
-{
- return Buffer4UI.Load(inIndex);
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Clear11.hlsl b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Clear11.hlsl
deleted file mode 100644
index 48f5b427ec..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Clear11.hlsl
+++ /dev/null
@@ -1,635 +0,0 @@
-//
-// Copyright (c) 2017 The ANGLE Project. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Clear11.hlsl: Shaders for clearing RTVs and DSVs using draw calls and
-// specifying float depth values and either float, uint or sint clear colors.
-// Notes:
-// - UINT & SINT clears can only be compiled with FL10+
-// - VS_Clear_FL9 requires a VB to be bound with vertices to create
-// a primitive covering the entire surface (in clip co-ordinates)
-
-// Constants
-static const float2 g_Corners[6] =
-{
- float2(-1.0f, 1.0f),
- float2( 1.0f, -1.0f),
- float2(-1.0f, -1.0f),
- float2(-1.0f, 1.0f),
- float2( 1.0f, 1.0f),
- float2( 1.0f, -1.0f),
-};
-
-// Vertex Shaders
-void VS_Clear(in uint id : SV_VertexID,
- out float4 outPosition : SV_POSITION)
-{
- float2 corner = g_Corners[id];
- outPosition = float4(corner.x, corner.y, 0.0f, 1.0f);
-}
-
-void VS_Multiview_Clear(in uint id : SV_VertexID,
- in uint instanceID : SV_InstanceID,
- out float4 outPosition : SV_POSITION,
- out uint outLayerID : TEXCOORD0)
-{
- float2 corner = g_Corners[id];
- outPosition = float4(corner.x, corner.y, 0.0f, 1.0f);
- outLayerID = instanceID;
-}
-
-void VS_Clear_FL9( in float4 inPosition : POSITION,
- out float4 outPosition : SV_POSITION)
-{
- outPosition = inPosition;
-}
-
-// Geometry shader for clearing multiview layered textures
-struct GS_INPUT
-{
- float4 inPosition : SV_Position;
- uint inLayerID : TEXCOORD0;
-};
-
-struct GS_OUTPUT
-{
- float4 outPosition : SV_Position;
- uint outLayerID : SV_RenderTargetArrayIndex;
-};
-
-[maxvertexcount(3)]
-void GS_Multiview_Clear(triangle GS_INPUT input[3], inout TriangleStream<GS_OUTPUT> outStream)
-{
- GS_OUTPUT output = (GS_OUTPUT)0;
- for (int i = 0; i < 3; i++)
- {
- output.outPosition = input[i].inPosition;
- output.outLayerID = input[i].inLayerID;
- outStream.Append(output);
- }
- outStream.RestartStrip();
-}
-
-// Pixel Shader Constant Buffers
-cbuffer ColorAndDepthDataFloat : register(b0)
-{
- float4 color_Float : packoffset(c0);
- float zValueF_Float : packoffset(c1);
-}
-
-cbuffer ColorAndDepthDataSint : register(b0)
-{
- int4 color_Sint : packoffset(c0);
- float zValueF_Sint : packoffset(c1);
-}
-
-cbuffer ColorAndDepthDataUint : register(b0)
-{
- uint4 color_Uint : packoffset(c0);
- float zValueF_Uint : packoffset(c1);
-}
-
-cbuffer DepthOnlyData : register(b0)
-{
- float zValue_Depth : packoffset(c1);
-}
-
-// Pixel Shader Output Structs
-struct PS_OutputFloat_FL9
-{
- float4 color0 : SV_TARGET0;
- float4 color1 : SV_TARGET1;
- float4 color2 : SV_TARGET2;
- float4 color3 : SV_TARGET3;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputFloat1
-{
- float4 color0 : SV_TARGET0;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputFloat2
-{
- float4 color0 : SV_TARGET0;
- float4 color1 : SV_TARGET1;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputFloat3
-{
- float4 color0 : SV_TARGET0;
- float4 color1 : SV_TARGET1;
- float4 color2 : SV_TARGET2;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputFloat4
-{
- float4 color0 : SV_TARGET0;
- float4 color1 : SV_TARGET1;
- float4 color2 : SV_TARGET2;
- float4 color3 : SV_TARGET3;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputFloat5
-{
- float4 color0 : SV_TARGET0;
- float4 color1 : SV_TARGET1;
- float4 color2 : SV_TARGET2;
- float4 color3 : SV_TARGET3;
- float4 color4 : SV_TARGET4;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputFloat6
-{
- float4 color0 : SV_TARGET0;
- float4 color1 : SV_TARGET1;
- float4 color2 : SV_TARGET2;
- float4 color3 : SV_TARGET3;
- float4 color4 : SV_TARGET4;
- float4 color5 : SV_TARGET5;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputFloat7
-{
- float4 color0 : SV_TARGET0;
- float4 color1 : SV_TARGET1;
- float4 color2 : SV_TARGET2;
- float4 color3 : SV_TARGET3;
- float4 color4 : SV_TARGET4;
- float4 color5 : SV_TARGET5;
- float4 color6 : SV_TARGET6;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputFloat8
-{
- float4 color0 : SV_TARGET0;
- float4 color1 : SV_TARGET1;
- float4 color2 : SV_TARGET2;
- float4 color3 : SV_TARGET3;
- float4 color4 : SV_TARGET4;
- float4 color5 : SV_TARGET5;
- float4 color6 : SV_TARGET6;
- float4 color7 : SV_TARGET7;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputUint1
-{
- uint4 color0 : SV_TARGET0;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputUint2
-{
- uint4 color0 : SV_TARGET0;
- uint4 color1 : SV_TARGET1;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputUint3
-{
- uint4 color0 : SV_TARGET0;
- uint4 color1 : SV_TARGET1;
- uint4 color2 : SV_TARGET2;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputUint4
-{
- uint4 color0 : SV_TARGET0;
- uint4 color1 : SV_TARGET1;
- uint4 color2 : SV_TARGET2;
- uint4 color3 : SV_TARGET3;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputUint5
-{
- uint4 color0 : SV_TARGET0;
- uint4 color1 : SV_TARGET1;
- uint4 color2 : SV_TARGET2;
- uint4 color3 : SV_TARGET3;
- uint4 color4 : SV_TARGET4;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputUint6
-{
- uint4 color0 : SV_TARGET0;
- uint4 color1 : SV_TARGET1;
- uint4 color2 : SV_TARGET2;
- uint4 color3 : SV_TARGET3;
- uint4 color4 : SV_TARGET4;
- uint4 color5 : SV_TARGET5;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputUint7
-{
- uint4 color0 : SV_TARGET0;
- uint4 color1 : SV_TARGET1;
- uint4 color2 : SV_TARGET2;
- uint4 color3 : SV_TARGET3;
- uint4 color4 : SV_TARGET4;
- uint4 color5 : SV_TARGET5;
- uint4 color6 : SV_TARGET6;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputUint8
-{
- uint4 color0 : SV_TARGET0;
- uint4 color1 : SV_TARGET1;
- uint4 color2 : SV_TARGET2;
- uint4 color3 : SV_TARGET3;
- uint4 color4 : SV_TARGET4;
- uint4 color5 : SV_TARGET5;
- uint4 color6 : SV_TARGET6;
- uint4 color7 : SV_TARGET7;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputSint1
-{
- int4 color0 : SV_TARGET0;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputSint2
-{
- int4 color0 : SV_TARGET0;
- int4 color1 : SV_TARGET1;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputSint3
-{
- int4 color0 : SV_TARGET0;
- int4 color1 : SV_TARGET1;
- int4 color2 : SV_TARGET2;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputSint4
-{
- int4 color0 : SV_TARGET0;
- int4 color1 : SV_TARGET1;
- int4 color2 : SV_TARGET2;
- int4 color3 : SV_TARGET3;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputSint5
-{
- int4 color0 : SV_TARGET0;
- int4 color1 : SV_TARGET1;
- int4 color2 : SV_TARGET2;
- int4 color3 : SV_TARGET3;
- int4 color4 : SV_TARGET4;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputSint6
-{
- int4 color0 : SV_TARGET0;
- int4 color1 : SV_TARGET1;
- int4 color2 : SV_TARGET2;
- int4 color3 : SV_TARGET3;
- int4 color4 : SV_TARGET4;
- int4 color5 : SV_TARGET5;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputSint7
-{
- int4 color0 : SV_TARGET0;
- int4 color1 : SV_TARGET1;
- int4 color2 : SV_TARGET2;
- int4 color3 : SV_TARGET3;
- int4 color4 : SV_TARGET4;
- int4 color5 : SV_TARGET5;
- int4 color6 : SV_TARGET6;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputSint8
-{
- int4 color0 : SV_TARGET0;
- int4 color1 : SV_TARGET1;
- int4 color2 : SV_TARGET2;
- int4 color3 : SV_TARGET3;
- int4 color4 : SV_TARGET4;
- int4 color5 : SV_TARGET5;
- int4 color6 : SV_TARGET6;
- int4 color7 : SV_TARGET7;
- float depth : SV_DEPTH;
-};
-
-struct PS_OutputDepth
-{
- float depth : SV_DEPTH;
-};
-
-// Pixel Shaders
-PS_OutputFloat_FL9 PS_ClearFloat_FL9(in float4 inPosition : SV_POSITION)
-{
- PS_OutputFloat_FL9 outData;
- outData.color0 = color_Float;
- outData.color1 = color_Float;
- outData.color2 = color_Float;
- outData.color3 = color_Float;
- outData.depth = zValueF_Float;
- return outData;
-}
-
-PS_OutputFloat1 PS_ClearFloat1(in float4 inPosition : SV_POSITION)
-{
- PS_OutputFloat1 outData;
- outData.color0 = color_Float;
- outData.depth = zValueF_Float;
- return outData;
-}
-
-PS_OutputFloat2 PS_ClearFloat2(in float4 inPosition : SV_POSITION)
-{
- PS_OutputFloat2 outData;
- outData.color0 = color_Float;
- outData.color1 = color_Float;
- outData.depth = zValueF_Float;
- return outData;
-}
-
-PS_OutputFloat3 PS_ClearFloat3(in float4 inPosition : SV_POSITION)
-{
- PS_OutputFloat3 outData;
- outData.color0 = color_Float;
- outData.color1 = color_Float;
- outData.color2 = color_Float;
- outData.depth = zValueF_Float;
- return outData;
-}
-
-PS_OutputFloat4 PS_ClearFloat4(in float4 inPosition : SV_POSITION)
-{
- PS_OutputFloat4 outData;
- outData.color0 = color_Float;
- outData.color1 = color_Float;
- outData.color2 = color_Float;
- outData.color3 = color_Float;
- outData.depth = zValueF_Float;
- return outData;
-}
-
-PS_OutputFloat5 PS_ClearFloat5(in float4 inPosition : SV_POSITION)
-{
- PS_OutputFloat5 outData;
- outData.color0 = color_Float;
- outData.color1 = color_Float;
- outData.color2 = color_Float;
- outData.color3 = color_Float;
- outData.color4 = color_Float;
- outData.depth = zValueF_Float;
- return outData;
-}
-
-PS_OutputFloat6 PS_ClearFloat6(in float4 inPosition : SV_POSITION)
-{
- PS_OutputFloat6 outData;
- outData.color0 = color_Float;
- outData.color1 = color_Float;
- outData.color2 = color_Float;
- outData.color3 = color_Float;
- outData.color4 = color_Float;
- outData.color5 = color_Float;
- outData.depth = zValueF_Float;
- return outData;
-}
-
-PS_OutputFloat7 PS_ClearFloat7(in float4 inPosition : SV_POSITION)
-{
- PS_OutputFloat7 outData;
- outData.color0 = color_Float;
- outData.color1 = color_Float;
- outData.color2 = color_Float;
- outData.color3 = color_Float;
- outData.color4 = color_Float;
- outData.color5 = color_Float;
- outData.color6 = color_Float;
- outData.depth = zValueF_Float;
- return outData;
-}
-
-PS_OutputFloat8 PS_ClearFloat8(in float4 inPosition : SV_POSITION)
-{
- PS_OutputFloat8 outData;
- outData.color0 = color_Float;
- outData.color1 = color_Float;
- outData.color2 = color_Float;
- outData.color3 = color_Float;
- outData.color4 = color_Float;
- outData.color5 = color_Float;
- outData.color6 = color_Float;
- outData.color7 = color_Float;
- outData.depth = zValueF_Float;
- return outData;
-}
-
-PS_OutputUint1 PS_ClearUint1(in float4 inPosition : SV_POSITION)
-{
- PS_OutputUint1 outData;
- outData.color0 = color_Uint;
- outData.depth = zValueF_Uint;
- return outData;
-}
-
-PS_OutputUint2 PS_ClearUint2(in float4 inPosition : SV_POSITION)
-{
- PS_OutputUint2 outData;
- outData.color0 = color_Uint;
- outData.color1 = color_Uint;
- outData.depth = zValueF_Uint;
- return outData;
-}
-
-PS_OutputUint3 PS_ClearUint3(in float4 inPosition : SV_POSITION)
-{
- PS_OutputUint3 outData;
- outData.color0 = color_Uint;
- outData.color1 = color_Uint;
- outData.color2 = color_Uint;
- outData.depth = zValueF_Uint;
- return outData;
-}
-
-PS_OutputUint4 PS_ClearUint4(in float4 inPosition : SV_POSITION)
-{
- PS_OutputUint4 outData;
- outData.color0 = color_Uint;
- outData.color1 = color_Uint;
- outData.color2 = color_Uint;
- outData.color3 = color_Uint;
- outData.depth = zValueF_Uint;
- return outData;
-}
-
-PS_OutputUint5 PS_ClearUint5(in float4 inPosition : SV_POSITION)
-{
- PS_OutputUint5 outData;
- outData.color0 = color_Uint;
- outData.color1 = color_Uint;
- outData.color2 = color_Uint;
- outData.color3 = color_Uint;
- outData.color4 = color_Uint;
- outData.depth = zValueF_Uint;
- return outData;
-}
-
-PS_OutputUint6 PS_ClearUint6(in float4 inPosition : SV_POSITION)
-{
- PS_OutputUint6 outData;
- outData.color0 = color_Uint;
- outData.color1 = color_Uint;
- outData.color2 = color_Uint;
- outData.color3 = color_Uint;
- outData.color4 = color_Uint;
- outData.color5 = color_Uint;
- outData.depth = zValueF_Uint;
- return outData;
-}
-
-PS_OutputUint7 PS_ClearUint7(in float4 inPosition : SV_POSITION)
-{
- PS_OutputUint7 outData;
- outData.color0 = color_Uint;
- outData.color1 = color_Uint;
- outData.color2 = color_Uint;
- outData.color3 = color_Uint;
- outData.color4 = color_Uint;
- outData.color5 = color_Uint;
- outData.color6 = color_Uint;
- outData.depth = zValueF_Uint;
- return outData;
-}
-
-PS_OutputUint8 PS_ClearUint8(in float4 inPosition : SV_POSITION)
-{
- PS_OutputUint8 outData;
- outData.color0 = color_Uint;
- outData.color1 = color_Uint;
- outData.color2 = color_Uint;
- outData.color3 = color_Uint;
- outData.color4 = color_Uint;
- outData.color5 = color_Uint;
- outData.color6 = color_Uint;
- outData.color7 = color_Uint;
- outData.depth = zValueF_Uint;
- return outData;
-}
-
-PS_OutputSint1 PS_ClearSint1(in float4 inPosition : SV_POSITION)
-{
- PS_OutputSint1 outData;
- outData.color0 = color_Sint;
- outData.depth = zValueF_Sint;
- return outData;
-}
-
-PS_OutputSint2 PS_ClearSint2(in float4 inPosition : SV_POSITION)
-{
- PS_OutputSint2 outData;
- outData.color0 = color_Sint;
- outData.color1 = color_Sint;
- outData.depth = zValueF_Sint;
- return outData;
-}
-
-PS_OutputSint3 PS_ClearSint3(in float4 inPosition : SV_POSITION)
-{
- PS_OutputSint3 outData;
- outData.color0 = color_Sint;
- outData.color1 = color_Sint;
- outData.color2 = color_Sint;
- outData.depth = zValueF_Sint;
- return outData;
-}
-
-PS_OutputSint4 PS_ClearSint4(in float4 inPosition : SV_POSITION)
-{
- PS_OutputSint4 outData;
- outData.color0 = color_Sint;
- outData.color1 = color_Sint;
- outData.color2 = color_Sint;
- outData.color3 = color_Sint;
- outData.depth = zValueF_Sint;
- return outData;
-}
-
-PS_OutputSint5 PS_ClearSint5(in float4 inPosition : SV_POSITION)
-{
- PS_OutputSint5 outData;
- outData.color0 = color_Sint;
- outData.color1 = color_Sint;
- outData.color2 = color_Sint;
- outData.color3 = color_Sint;
- outData.color4 = color_Sint;
- outData.depth = zValueF_Sint;
- return outData;
-}
-
-PS_OutputSint6 PS_ClearSint6(in float4 inPosition : SV_POSITION)
-{
- PS_OutputSint6 outData;
- outData.color0 = color_Sint;
- outData.color1 = color_Sint;
- outData.color2 = color_Sint;
- outData.color3 = color_Sint;
- outData.color4 = color_Sint;
- outData.color5 = color_Sint;
- outData.depth = zValueF_Sint;
- return outData;
-}
-
-PS_OutputSint7 PS_ClearSint7(in float4 inPosition : SV_POSITION)
-{
- PS_OutputSint7 outData;
- outData.color0 = color_Sint;
- outData.color1 = color_Sint;
- outData.color2 = color_Sint;
- outData.color3 = color_Sint;
- outData.color4 = color_Sint;
- outData.color5 = color_Sint;
- outData.color6 = color_Sint;
- outData.depth = zValueF_Sint;
- return outData;
-}
-
-PS_OutputSint8 PS_ClearSint8(in float4 inPosition : SV_POSITION)
-{
- PS_OutputSint8 outData;
- outData.color0 = color_Sint;
- outData.color1 = color_Sint;
- outData.color2 = color_Sint;
- outData.color3 = color_Sint;
- outData.color4 = color_Sint;
- outData.color5 = color_Sint;
- outData.color6 = color_Sint;
- outData.color7 = color_Sint;
- outData.depth = zValueF_Sint;
- return outData;
-}
-
-PS_OutputDepth PS_ClearDepth(in float4 inPosition : SV_POSITION)
-{
- PS_OutputDepth outData;
- outData.depth = zValue_Depth;
- return outData;
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/MultiplyAlpha.hlsl b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/MultiplyAlpha.hlsl
deleted file mode 100644
index 0d10b8eafa..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/MultiplyAlpha.hlsl
+++ /dev/null
@@ -1,131 +0,0 @@
-Texture2D<float4> TextureF : register(t0);
-Texture2D<uint4> TextureUI : register(t0);
-
-SamplerState Sampler : register(s0);
-
-// Notation:
-// PM: premultiply, UM: unmulitply, PT: passthrough
-// F: float, U: uint
-
-// Float to float LUMA
-float4 PS_FtoF_PM_LUMA(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- float4 color = TextureF.Sample(Sampler, inTexCoord).rgba;
- color.rgb = color.r * color.a;
- color.a = 1.0f;
- return color;
-}
-float4 PS_FtoF_UM_LUMA(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- float4 color = TextureF.Sample(Sampler, inTexCoord).rgba;
- if (color.a > 0.0f)
- {
- color.rgb = color.r / color.a;
- }
- color.a = 1.0f;
- return color;
-}
-
-// Float to float LUMAALPHA
-float4 PS_FtoF_PM_LUMAALPHA(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- float4 color = TextureF.Sample(Sampler, inTexCoord).rgba;
- color.rgb = color.r * color.a;
- return color;
-}
-
-float4 PS_FtoF_UM_LUMAALPHA(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- float4 color = TextureF.Sample(Sampler, inTexCoord).rgba;
- if (color.a > 0.0f)
- {
- color.rgb = color.r / color.a;
- }
- return color;
-}
-
-// Float to float RGBA
-float4 PS_FtoF_PM_RGBA(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- float4 color = TextureF.Sample(Sampler, inTexCoord).rgba;
- color.rgb *= color.a;
- return color;
-}
-
-float4 PS_FtoF_UM_RGBA(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- float4 color = TextureF.Sample(Sampler, inTexCoord).rgba;
- if (color.a > 0.0f)
- {
- color.rgb /= color.a;
- }
- return color;
-}
-
-// Float to float RGB
-float4 PS_FtoF_PM_RGB(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- float4 color = TextureF.Sample(Sampler, inTexCoord).rgba;
- color.rgb *= color.a;
- color.a = 1.0f;
- return color;
-}
-
-float4 PS_FtoF_UM_RGB(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- float4 color = TextureF.Sample(Sampler, inTexCoord).rgba;
- if (color.a > 0.0f)
- {
- color.rgb /= color.a;
- }
- color.a = 1.0f;
- return color;
-}
-
-// Float to uint RGBA
-uint4 PS_FtoU_PT_RGBA(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- float4 color = TextureF.Sample(Sampler, inTexCoord).rgba;
- return uint4(color * 255);
-}
-
-uint4 PS_FtoU_PM_RGBA(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- float4 color = TextureF.Sample(Sampler, inTexCoord).rgba;
- color.rgb *= color.a;
- return uint4(color * 255);
-}
-
-uint4 PS_FtoU_UM_RGBA(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- float4 color = TextureF.Sample(Sampler, inTexCoord).rgba;
- if (color.a > 0.0f)
- {
- color.rgb /= color.a;
- }
- return uint4(color * 255);
-}
-
-// Float to uint RGB
-uint4 PS_FtoU_PT_RGB(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- float4 color = TextureF.Sample(Sampler, inTexCoord).rgba;
- return uint4(color.rgb * 255, 1);
-}
-
-uint4 PS_FtoU_PM_RGB(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- float4 color = TextureF.Sample(Sampler, inTexCoord).rgba;
- color.rgb *= color.a;
- return uint4(color.rgb * 255, 1);
-}
-
-uint4 PS_FtoU_UM_RGB(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- float4 color = TextureF.Sample(Sampler, inTexCoord).rgba;
- if (color.a > 0.0f)
- {
- color.rgb /= color.a;
- }
- return uint4(color.rgb * 255, 1);
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Passthrough2D11.hlsl b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Passthrough2D11.hlsl
deleted file mode 100644
index 0b1a5ad169..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Passthrough2D11.hlsl
+++ /dev/null
@@ -1,122 +0,0 @@
-Texture2D<float4> TextureF : register(t0);
-Texture2DMS<float4> TextureF_MS: register(t0);
-Texture2D<uint4> TextureUI : register(t0);
-Texture2D<int4> TextureI : register(t0);
-
-SamplerState Sampler : register(s0);
-
-void VS_Passthrough2D( in float2 inPosition : POSITION, in float2 inTexCoord : TEXCOORD0,
- out float4 outPosition : SV_POSITION, out float2 outTexCoord : TEXCOORD0)
-{
- outPosition = float4(inPosition, 0.0f, 1.0f);
- outTexCoord = inTexCoord;
-}
-
-float PS_PassthroughDepth2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_DEPTH
-{
- return TextureF.Sample(Sampler, inTexCoord).r;
-}
-
-float4 PS_PassthroughRGBA2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- return TextureF.Sample(Sampler, inTexCoord).rgba;
-}
-
-float4 PS_PassthroughA2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- return float4(0.0f, 0.0f, 0.0f, TextureF.Sample(Sampler, inTexCoord).a);
-}
-
-float4 PS_PassthroughRGBA2DMS(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCORD0, in uint inSampleIndex : SV_SAMPLEINDEX) : SV_TARGET0
-{
- return TextureF_MS.sample[inSampleIndex][inTexCoord].rgba;
-}
-
-uint4 PS_PassthroughRGBA2DUI(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- uint2 size;
- TextureUI.GetDimensions(size.x, size.y);
-
- return TextureUI.Load(int3(size * inTexCoord, 0)).rgba;
-}
-
-int4 PS_PassthroughRGBA2DI(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- uint2 size;
- TextureI.GetDimensions(size.x, size.y);
-
- return TextureI.Load(int3(size * inTexCoord, 0)).rgba;
-}
-
-float4 PS_PassthroughRGB2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- return float4(TextureF.Sample(Sampler, inTexCoord).rgb, 1.0f);
-}
-
-uint4 PS_PassthroughRGB2DUI(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- uint2 size;
- TextureUI.GetDimensions(size.x, size.y);
-
- return uint4(TextureUI.Load(int3(size * inTexCoord, 0)).rgb, 0);
-}
-
-int4 PS_PassthroughRGB2DI(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- uint2 size;
- TextureI.GetDimensions(size.x, size.y);
-
- return int4(TextureI.Load(int3(size * inTexCoord, 0)).rgb, 0);
-}
-
-float4 PS_PassthroughRG2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- return float4(TextureF.Sample(Sampler, inTexCoord).rg, 0.0f, 1.0f);
-}
-
-uint4 PS_PassthroughRG2DUI(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- uint2 size;
- TextureUI.GetDimensions(size.x, size.y);
-
- return uint4(TextureUI.Load(int3(size * inTexCoord, 0)).rg, 0, 0);
-}
-
-int4 PS_PassthroughRG2DI(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- uint2 size;
- TextureI.GetDimensions(size.x, size.y);
-
- return int4(TextureI.Load(int3(size * inTexCoord, 0)).rg, 0, 0);
-}
-
-float4 PS_PassthroughR2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- return float4(TextureF.Sample(Sampler, inTexCoord).r, 0.0f, 0.0f, 1.0f);
-}
-
-uint4 PS_PassthroughR2DUI(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- uint2 size;
- TextureUI.GetDimensions(size.x, size.y);
-
- return uint4(TextureUI.Load(int3(size * inTexCoord, 0)).r, 0, 0, 0);
-}
-
-int4 PS_PassthroughR2DI(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- uint2 size;
- TextureI.GetDimensions(size.x, size.y);
-
- return int4(TextureI.Load(int3(size * inTexCoord, 0)).r, 0, 0, 0);
-}
-
-float4 PS_PassthroughLum2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- return float4(TextureF.Sample(Sampler, inTexCoord).rrr, 1.0f);
-}
-
-float4 PS_PassthroughLumAlpha2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- return TextureF.Sample(Sampler, inTexCoord).rrra;
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Passthrough3D11.hlsl b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Passthrough3D11.hlsl
deleted file mode 100644
index c23c9032ec..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Passthrough3D11.hlsl
+++ /dev/null
@@ -1,146 +0,0 @@
-Texture3D<float4> TextureF : register(t0);
-Texture3D<uint4> TextureUI : register(t0);
-Texture3D<int4> TextureI : register(t0);
-
-SamplerState Sampler : register(s0);
-
-struct VS_INPUT
-{
- float2 Position : POSITION;
- uint Layer : LAYER;
- float3 TexCoord : TEXCOORD;
-};
-
-struct VS_OUTPUT
-{
- float4 Position : SV_POSITION;
- uint Layer : LAYER;
- float3 TexCoord : TEXCOORD;
-};
-
-struct GS_OUTPUT
-{
- float4 Position : SV_POSITION;
- uint Layer : SV_RENDERTARGETARRAYINDEX;
- float3 TexCoord : TEXCOORD;
-};
-
-VS_OUTPUT VS_Passthrough3D(VS_INPUT input)
-{
- VS_OUTPUT output;
-
- output.Position = float4(input.Position, 0.0f, 1.0f);
- output.Layer = input.Layer;
- output.TexCoord = input.TexCoord;
-
- return output;
-}
-
-[maxvertexcount(3)]
-void GS_Passthrough3D(triangle VS_OUTPUT input[3], inout TriangleStream<GS_OUTPUT> outputStream)
-{
- GS_OUTPUT output;
-
- for (int i = 0; i < 3; i++)
- {
- output.Position = input[i].Position;
- output.Layer = input[i].Layer;
- output.TexCoord = input[i].TexCoord;
-
- outputStream.Append(output);
- }
-}
-
-float4 PS_PassthroughRGBA3D(GS_OUTPUT input) : SV_TARGET0
-{
- return TextureF.Sample(Sampler, input.TexCoord).rgba;
-}
-
-uint4 PS_PassthroughRGBA3DUI(GS_OUTPUT input) : SV_TARGET0
-{
- uint3 size;
- TextureUI.GetDimensions(size.x, size.y, size.z);
-
- return TextureUI.Load(int4(size * input.TexCoord, 0)).rgba;
-}
-
-int4 PS_PassthroughRGBA3DI(GS_OUTPUT input) : SV_TARGET0
-{
- uint3 size;
- TextureI.GetDimensions(size.x, size.y, size.z);
-
- return TextureI.Load(int4(size * input.TexCoord, 0)).rgba;
-}
-
-float4 PS_PassthroughRGB3D(GS_OUTPUT input) : SV_TARGET0
-{
- return float4(TextureF.Sample(Sampler, input.TexCoord).rgb, 1.0f);
-}
-
-uint4 PS_PassthroughRGB3DUI(GS_OUTPUT input) : SV_TARGET0
-{
- uint3 size;
- TextureUI.GetDimensions(size.x, size.y, size.z);
-
- return uint4(TextureUI.Load(int4(size * input.TexCoord, 0)).rgb, 0);
-}
-
-int4 PS_PassthroughRGB3DI(GS_OUTPUT input) : SV_TARGET0
-{
- uint3 size;
- TextureI.GetDimensions(size.x, size.y, size.z);
-
- return int4(TextureI.Load(int4(size * input.TexCoord, 0)).rgb, 0);
-}
-
-float4 PS_PassthroughRG3D(GS_OUTPUT input) : SV_TARGET0
-{
- return float4(TextureF.Sample(Sampler, input.TexCoord).rg, 0.0f, 1.0f);
-}
-
-uint4 PS_PassthroughRG3DUI(GS_OUTPUT input) : SV_TARGET0
-{
- uint3 size;
- TextureUI.GetDimensions(size.x, size.y, size.z);
-
- return uint4(TextureUI.Load(int4(size * input.TexCoord, 0)).rg, 0, 0);
-}
-
-int4 PS_PassthroughRG3DI(GS_OUTPUT input) : SV_TARGET0
-{
- uint3 size;
- TextureI.GetDimensions(size.x, size.y, size.z);
-
- return int4(TextureI.Load(int4(size * input.TexCoord, 0)).rg, 0, 0);
-}
-
-float4 PS_PassthroughR3D(GS_OUTPUT input) : SV_TARGET0
-{
- return float4(TextureF.Sample(Sampler, input.TexCoord).r, 0.0f, 0.0f, 1.0f);
-}
-
-uint4 PS_PassthroughR3DUI(GS_OUTPUT input) : SV_TARGET0
-{
- uint3 size;
- TextureUI.GetDimensions(size.x, size.y, size.z);
-
- return uint4(TextureUI.Load(int4(size * input.TexCoord, 0)).r, 0, 0, 0);
-}
-
-int4 PS_PassthroughR3DI(GS_OUTPUT input) : SV_TARGET0
-{
- uint3 size;
- TextureI.GetDimensions(size.x, size.y, size.z);
-
- return int4(TextureI.Load(int4(size * input.TexCoord, 0)).r, 0, 0, 0);
-}
-
-float4 PS_PassthroughLum3D(GS_OUTPUT input) : SV_TARGET0
-{
- return float4(TextureF.Sample(Sampler, input.TexCoord).rrr, 1.0f);
-}
-
-float4 PS_PassthroughLumAlpha3D(GS_OUTPUT input) : SV_TARGET0
-{
- return TextureF.Sample(Sampler, input.TexCoord).rrra;
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/ResolveDepthStencil.hlsl b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/ResolveDepthStencil.hlsl
deleted file mode 100644
index 7dc40d4b6a..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/ResolveDepthStencil.hlsl
+++ /dev/null
@@ -1,56 +0,0 @@
-static const float2 g_Corners[6] =
-{
- float2(-1.0f, 1.0f),
- float2( 1.0f, -1.0f),
- float2(-1.0f, -1.0f),
- float2(-1.0f, 1.0f),
- float2( 1.0f, 1.0f),
- float2( 1.0f, -1.0f),
-};
-
-void VS_ResolveDepthStencil(in uint id : SV_VertexID,
- out float4 position : SV_Position,
- out float2 texCoord : TEXCOORD0)
-{
- float2 corner = g_Corners[id];
- position = float4(corner.x, corner.y, 0.0f, 1.0f);
- texCoord = float2((corner.x + 1.0f) * 0.5f, (-corner.y + 1.0f) * 0.5f);
-}
-
-Texture2DMS<float> Depth : register(t0);
-Texture2DMS<uint2> Stencil : register(t1);
-
-void PS_ResolveDepth(in float4 position : SV_Position,
- in float2 texCoord : TEXCOORD0,
- out float depth : SV_Depth)
-{
- // MS samplers must use Load
- uint width, height, samples;
- Depth.GetDimensions(width, height, samples);
- uint2 coord = uint2(texCoord.x * float(width), texCoord.y * float(height));
- depth = Depth.Load(coord, 0).r;
-}
-
-void PS_ResolveDepthStencil(in float4 position : SV_Position,
- in float2 texCoord : TEXCOORD0,
- out float2 depthStencil : SV_Target0)
-{
- // MS samplers must use Load
- uint width, height, samples;
- Depth.GetDimensions(width, height, samples);
- uint2 coord = uint2(texCoord.x * float(width), texCoord.y * float(height));
- depthStencil.r = Depth.Load(coord, 0).r;
- depthStencil.g = float(Stencil.Load(coord, 0).g);
-}
-
-void PS_ResolveStencil(in float4 position : SV_Position,
- in float2 texCoord : TEXCOORD0,
- out float2 stencil : SV_Target0)
-{
- // MS samplers must use Load
- uint width, height, samples;
- Stencil.GetDimensions(width, height, samples);
- uint2 coord = uint2(texCoord.x * float(width), texCoord.y * float(height));
- stencil.r = 0.0f;
- stencil.g = float(Stencil.Load(coord, 0).g);
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Swizzle11.hlsl b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Swizzle11.hlsl
deleted file mode 100644
index 505e222137..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/Swizzle11.hlsl
+++ /dev/null
@@ -1,99 +0,0 @@
-Texture2D<float4> TextureF2D : register(t0);
-Texture2D<uint4> TextureUI2D : register(t0);
-Texture2D<int4> TextureI2D : register(t0);
-
-Texture3D<float4> TextureF3D : register(t0);
-Texture3D<uint4> TextureUI3D : register(t0);
-Texture3D<int4> TextureI3D : register(t0);
-
-Texture2DArray<float4> TextureF2DArray : register(t0);
-Texture2DArray<uint4> TextureUI2DArray : register(t0);
-Texture2DArray<int4> TextureI2DArray : register(t0);
-
-SamplerState Sampler : register(s0);
-
-cbuffer SwizzleProperties : register(b0)
-{
- uint4 SwizzleIndices : packoffset(c0);
-}
-
-float4 SwizzleLookup(in float4 sample)
-{
- float lookup[6] = { sample[0], sample[1], sample[2], sample[3], 0.0f, 1.0f };
- return float4(lookup[SwizzleIndices[0]], lookup[SwizzleIndices[1]], lookup[SwizzleIndices[2]], lookup[SwizzleIndices[3]]);
-}
-
-int4 SwizzleLookup(in int4 sample)
-{
- int lookup[6] = { sample[0], sample[1], sample[2], sample[3], 0.0f, 1.0f };
- return int4(lookup[SwizzleIndices[0]], lookup[SwizzleIndices[1]], lookup[SwizzleIndices[2]], lookup[SwizzleIndices[3]]);
-}
-
-uint4 SwizzleLookup(in uint4 sample)
-{
- uint lookup[6] = { sample[0], sample[1], sample[2], sample[3], 0.0f, 1.0f };
- return uint4(lookup[SwizzleIndices[0]], lookup[SwizzleIndices[1]], lookup[SwizzleIndices[2]], lookup[SwizzleIndices[3]]);
-}
-
-float4 PS_SwizzleF2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- return SwizzleLookup(TextureF2D.Sample(Sampler, inTexCoord));
-}
-
-int4 PS_SwizzleI2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- uint2 size;
- TextureI2D.GetDimensions(size.x, size.y);
-
- return SwizzleLookup(TextureI2D.Load(int3(size * inTexCoord, 0)));
-}
-
-uint4 PS_SwizzleUI2D(in float4 inPosition : SV_POSITION, in float2 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- uint2 size;
- TextureUI2D.GetDimensions(size.x, size.y);
-
- return SwizzleLookup(TextureUI2D.Load(int3(size * inTexCoord, 0)));
-}
-
-float4 PS_SwizzleF3D(in float4 inPosition : SV_POSITION, in uint inLayer : SV_RENDERTARGETARRAYINDEX, in float3 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- return SwizzleLookup(TextureF3D.Sample(Sampler, inTexCoord));
-}
-
-int4 PS_SwizzleI3D(in float4 inPosition : SV_POSITION, in uint inLayer : SV_RENDERTARGETARRAYINDEX, in float3 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- uint3 size;
- TextureI3D.GetDimensions(size.x, size.y, size.z);
-
- return SwizzleLookup(TextureI3D.Load(int4(size * inTexCoord, 0)));
-}
-
-uint4 PS_SwizzleUI3D(in float4 inPosition : SV_POSITION, in uint inLayer : SV_RENDERTARGETARRAYINDEX, in float3 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- uint3 size;
- TextureUI3D.GetDimensions(size.x, size.y, size.z);
-
- return SwizzleLookup(TextureUI3D.Load(int4(size * inTexCoord, 0)));
-}
-
-float4 PS_SwizzleF2DArray(in float4 inPosition : SV_POSITION, in uint inLayer : SV_RENDERTARGETARRAYINDEX, in float3 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- return SwizzleLookup(TextureF2DArray.Sample(Sampler, float3(inTexCoord.xy, inLayer)));
-}
-
-int4 PS_SwizzleI2DArray(in float4 inPosition : SV_POSITION, in uint inLayer : SV_RENDERTARGETARRAYINDEX, in float3 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- uint3 size;
- TextureI2DArray.GetDimensions(size.x, size.y, size.z);
-
- return SwizzleLookup(TextureI2DArray.Load(int4(size.xy * inTexCoord.xy, inLayer, 0)));
-}
-
-uint4 PS_SwizzleUI2DArray(in float4 inPosition : SV_POSITION, in uint inLayer : SV_RENDERTARGETARRAYINDEX, in float3 inTexCoord : TEXCOORD0) : SV_TARGET0
-{
- uint3 size;
- TextureUI2DArray.GetDimensions(size.x, size.y, size.z);
-
- return SwizzleLookup(TextureUI2DArray.Load(int4(size.xy * inTexCoord.xy, inLayer, 0)));
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dms11ps.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dms11ps.h
deleted file mode 100644
index a5cccdc98e..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dms11ps.h
+++ /dev/null
@@ -1,155 +0,0 @@
-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 10.1
-//
-//
-// Resource Bindings:
-//
-// Name Type Format Dim HLSL Bind Count
-// ------------------------------ ---------- ------- ----------- -------------- ------
-// TextureF_MS texture float4 2dMS t0 1
-//
-//
-//
-// Input signature:
-//
-// Name Index Mask Register SysValue Format Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION 0 xyzw 0 POS float
-// TEXCORD 0 xy 1 NONE float xy
-// SV_SAMPLEINDEX 0 x 2 SAMPLE uint x
-//
-//
-// Output signature:
-//
-// Name Index Mask Register SysValue Format Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET 0 xyzw 0 TARGET float xyzw
-//
-// Pixel Shader runs at sample frequency
-//
-ps_4_1
-dcl_globalFlags refactoringAllowed
-dcl_resource_texture2dms(0) (float,float,float,float) t0
-dcl_input_ps linear v1.xy
-dcl_input_ps_sgv constant v2.x, sampleIndex
-dcl_output o0.xyzw
-dcl_temps 1
-ftou r0.xy, v1.xyxx
-mov r0.zw, l(0,0,0,0)
-ldms o0.xyzw, r0.xyzw, t0.xyzw, v2.x
-ret
-// Approximately 4 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRGBA2DMS[] =
-{
- 68, 88, 66, 67, 206, 115,
- 73, 27, 160, 237, 59, 223,
- 179, 180, 28, 146, 74, 174,
- 29, 197, 1, 0, 0, 0,
- 136, 2, 0, 0, 5, 0,
- 0, 0, 52, 0, 0, 0,
- 172, 0, 0, 0, 40, 1,
- 0, 0, 92, 1, 0, 0,
- 12, 2, 0, 0, 82, 68,
- 69, 70, 112, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 0, 0, 0,
- 28, 0, 0, 0, 1, 4,
- 255, 255, 0, 1, 0, 0,
- 72, 0, 0, 0, 60, 0,
- 0, 0, 2, 0, 0, 0,
- 5, 0, 0, 0, 6, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0,
- 0, 0, 13, 0, 0, 0,
- 84, 101, 120, 116, 117, 114,
- 101, 70, 95, 77, 83, 0,
- 77, 105, 99, 114, 111, 115,
- 111, 102, 116, 32, 40, 82,
- 41, 32, 72, 76, 83, 76,
- 32, 83, 104, 97, 100, 101,
- 114, 32, 67, 111, 109, 112,
- 105, 108, 101, 114, 32, 49,
- 48, 46, 49, 0, 73, 83,
- 71, 78, 116, 0, 0, 0,
- 3, 0, 0, 0, 8, 0,
- 0, 0, 80, 0, 0, 0,
- 0, 0, 0, 0, 1, 0,
- 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 15, 0,
- 0, 0, 92, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 3, 0, 0, 0,
- 1, 0, 0, 0, 3, 3,
- 0, 0, 100, 0, 0, 0,
- 0, 0, 0, 0, 10, 0,
- 0, 0, 1, 0, 0, 0,
- 2, 0, 0, 0, 1, 1,
- 0, 0, 83, 86, 95, 80,
- 79, 83, 73, 84, 73, 79,
- 78, 0, 84, 69, 88, 67,
- 79, 82, 68, 0, 83, 86,
- 95, 83, 65, 77, 80, 76,
- 69, 73, 78, 68, 69, 88,
- 0, 171, 79, 83, 71, 78,
- 44, 0, 0, 0, 1, 0,
- 0, 0, 8, 0, 0, 0,
- 32, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0,
- 0, 0, 15, 0, 0, 0,
- 83, 86, 95, 84, 65, 82,
- 71, 69, 84, 0, 171, 171,
- 83, 72, 68, 82, 168, 0,
- 0, 0, 65, 0, 0, 0,
- 42, 0, 0, 0, 106, 8,
- 0, 1, 88, 32, 0, 4,
- 0, 112, 16, 0, 0, 0,
- 0, 0, 85, 85, 0, 0,
- 98, 16, 0, 3, 50, 16,
- 16, 0, 1, 0, 0, 0,
- 99, 8, 0, 4, 18, 16,
- 16, 0, 2, 0, 0, 0,
- 10, 0, 0, 0, 101, 0,
- 0, 3, 242, 32, 16, 0,
- 0, 0, 0, 0, 104, 0,
- 0, 2, 1, 0, 0, 0,
- 28, 0, 0, 5, 50, 0,
- 16, 0, 0, 0, 0, 0,
- 70, 16, 16, 0, 1, 0,
- 0, 0, 54, 0, 0, 8,
- 194, 0, 16, 0, 0, 0,
- 0, 0, 2, 64, 0, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 46, 0,
- 0, 9, 242, 32, 16, 0,
- 0, 0, 0, 0, 70, 14,
- 16, 0, 0, 0, 0, 0,
- 70, 126, 16, 0, 0, 0,
- 0, 0, 10, 16, 16, 0,
- 2, 0, 0, 0, 62, 0,
- 0, 1, 83, 84, 65, 84,
- 116, 0, 0, 0, 4, 0,
- 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 3, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 1, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 0, 0, 0
-};
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_data.json b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_data.json
deleted file mode 100644
index 61cd44a62b..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_data.json
+++ /dev/null
@@ -1,523 +0,0 @@
-{
- "NONE": {
- },
- "A8_UNORM": {
- "texFormat": "DXGI_FORMAT_A8_UNORM",
- "srvFormat": "DXGI_FORMAT_A8_UNORM",
- "rtvFormat": "DXGI_FORMAT_A8_UNORM",
- "channels": "a",
- "componentType": "unorm",
- "bits": { "alpha": 8 },
- "supportTest": "OnlyFL10Plus(deviceCaps)",
- "fallbackFormat": "R8G8B8A8_UNORM"
- },
- "R8G8B8A8_UNORM": {
- "texFormat": "DXGI_FORMAT_R8G8B8A8_UNORM",
- "srvFormat": "DXGI_FORMAT_R8G8B8A8_UNORM",
- "rtvFormat": "DXGI_FORMAT_R8G8B8A8_UNORM",
- "channels": "rgba",
- "componentType": "unorm",
- "bits": { "red": 8, "green": 8, "blue": 8, "alpha": 8 },
- "glInternalFormat": "GL_RGBA8"
- },
- "R16G16B16A16_UNORM": {
- "texFormat": "DXGI_FORMAT_R16G16B16A16_UNORM",
- "srvFormat": "DXGI_FORMAT_R16G16B16A16_UNORM",
- "rtvFormat": "DXGI_FORMAT_R16G16B16A16_UNORM",
- "channels": "rgba",
- "componentType": "unorm",
- "bits": { "red": 16, "green": 16, "blue": 16, "alpha": 16 },
- "glInternalFormat": "GL_RGBA16_EXT"
- },
- "R16G16B16A16_FLOAT": {
- "texFormat": "DXGI_FORMAT_R16G16B16A16_FLOAT",
- "srvFormat": "DXGI_FORMAT_R16G16B16A16_FLOAT",
- "rtvFormat": "DXGI_FORMAT_R16G16B16A16_FLOAT",
- "channels": "rgba",
- "componentType": "float",
- "bits": { "red": 16, "green": 16, "blue": 16, "alpha": 16 },
- "glInternalFormat": "GL_RGBA16F"
- },
- "R32G32B32A32_FLOAT": {
- "texFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT",
- "srvFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT",
- "rtvFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT",
- "channels": "rgba",
- "componentType": "float",
- "bits": { "red": 32, "green": 32, "blue": 32, "alpha": 32 },
- "glInternalFormat": "GL_RGBA32F"
- },
- "B8G8R8A8_UNORM": {
- "texFormat": "DXGI_FORMAT_B8G8R8A8_UNORM",
- "srvFormat": "DXGI_FORMAT_B8G8R8A8_UNORM",
- "rtvFormat": "DXGI_FORMAT_B8G8R8A8_UNORM",
- "channels": "bgra",
- "componentType": "unorm",
- "bits": { "red": 8, "green": 8, "blue": 8, "alpha": 8 },
- "glInternalFormat": "GL_BGRA8_EXT"
- },
- "B8G8R8A8_UNORM_SRGB": {
- "texFormat": "DXGI_FORMAT_B8G8R8A8_UNORM_SRGB",
- "srvFormat": "DXGI_FORMAT_B8G8R8A8_UNORM_SRGB",
- "rtvFormat": "DXGI_FORMAT_B8G8R8A8_UNORM_SRGB",
- "channels": "bgra",
- "componentType": "unorm",
- "bits": {"red": 8, "green": 8, "blue": 8,"alpha": 8},
- "siwzzleFormat": "GL_RGBA8"
- },
- "BC1_RGBA_UNORM_BLOCK": {
- "texFormat": "DXGI_FORMAT_BC1_UNORM",
- "srvFormat": "DXGI_FORMAT_BC1_UNORM",
- "channels": "rgba",
- "componentType": "unorm",
- "swizzleFormat": "GL_RGBA8"
- },
- "BC1_RGB_UNORM_BLOCK": {
- "texFormat": "DXGI_FORMAT_BC1_UNORM",
- "srvFormat": "DXGI_FORMAT_BC1_UNORM",
- "channels": "rgba",
- "componentType": "unorm",
- "swizzleFormat": "GL_RGBA8"
- },
- "BC2_RGBA_UNORM_BLOCK": {
- "texFormat": "DXGI_FORMAT_BC2_UNORM",
- "srvFormat": "DXGI_FORMAT_BC2_UNORM",
- "channels": "rgba",
- "componentType": "unorm",
- "swizzleFormat": "GL_RGBA8"
- },
- "BC3_RGBA_UNORM_BLOCK": {
- "texFormat": "DXGI_FORMAT_BC3_UNORM",
- "srvFormat": "DXGI_FORMAT_BC3_UNORM",
- "channels": "rgba",
- "componentType": "unorm",
- "swizzleFormat": "GL_RGBA8"
- },
- "BC1_RGBA_UNORM_SRGB_BLOCK": {
- "texFormat": "DXGI_FORMAT_BC1_UNORM_SRGB",
- "srvFormat": "DXGI_FORMAT_BC1_UNORM_SRGB",
- "channels": "rgba",
- "componentType": "unorm",
- "swizzleFormat": "GL_RGBA8"
- },
- "BC1_RGB_UNORM_SRGB_BLOCK": {
- "texFormat": "DXGI_FORMAT_BC1_UNORM_SRGB",
- "srvFormat": "DXGI_FORMAT_BC1_UNORM_SRGB",
- "channels": "rgba",
- "componentType": "unorm",
- "swizzleFormat": "GL_RGBA8"
- },
- "BC2_RGBA_UNORM_SRGB_BLOCK": {
- "texFormat": "DXGI_FORMAT_BC2_UNORM_SRGB",
- "srvFormat": "DXGI_FORMAT_BC2_UNORM_SRGB",
- "channels": "rgba",
- "componentType": "unorm",
- "swizzleFormat": "GL_RGBA8"
- },
- "BC3_RGBA_UNORM_SRGB_BLOCK": {
- "texFormat": "DXGI_FORMAT_BC3_UNORM_SRGB",
- "srvFormat": "DXGI_FORMAT_BC3_UNORM_SRGB",
- "channels": "rgba",
- "componentType": "unorm",
- "swizzleFormat": "GL_RGBA8"
- },
- "D24_UNORM_S8_UINT": {
- "FL10Plus": {
- "texFormat": "DXGI_FORMAT_R24G8_TYPELESS",
- "srvFormat": "DXGI_FORMAT_R24_UNORM_X8_TYPELESS"
- },
- "FL9_3": {
- "texFormat": "DXGI_FORMAT_D24_UNORM_S8_UINT"
- },
- "dsvFormat": "DXGI_FORMAT_D24_UNORM_S8_UINT",
- "channels": "ds",
- "bits": { "depth": 24, "stencil": 8 },
- "glInternalFormat": "GL_DEPTH24_STENCIL8_OES"
- },
- "D32_FLOAT_S8X24_UINT": {
- "texFormat": "DXGI_FORMAT_R32G8X24_TYPELESS",
- "srvFormat": "DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS",
- "dsvFormat": "DXGI_FORMAT_D32_FLOAT_S8X24_UINT",
- "channels": "ds",
- "bits": { "depth": 32, "stencil": 8 },
- "glInternalFormat": "GL_DEPTH32F_STENCIL8"
- },
- "D16_UNORM": {
- "FL10Plus": {
- "texFormat": "DXGI_FORMAT_R16_TYPELESS",
- "srvFormat": "DXGI_FORMAT_R16_UNORM"
- },
- "FL9_3": {
- "texFormat": "DXGI_FORMAT_D16_UNORM"
- },
- "dsvFormat": "DXGI_FORMAT_D16_UNORM",
- "channels": "d",
- "componentType": "unorm",
- "bits": { "depth": 16 },
- "glInternalFormat": "GL_DEPTH_COMPONENT16"
- },
- "D32_FLOAT": {
- "texFormat": "DXGI_FORMAT_R32_TYPELESS",
- "srvFormat": "DXGI_FORMAT_R32_FLOAT",
- "dsvFormat": "DXGI_FORMAT_D32_FLOAT",
- "channels": "d",
- "componentType": "float",
- "bits": { "depth": 32 },
- "glInternalFormat": "GL_DEPTH_COMPONENT32F"
- },
- "R11G11B10_FLOAT": {
- "texFormat": "DXGI_FORMAT_R11G11B10_FLOAT",
- "srvFormat": "DXGI_FORMAT_R11G11B10_FLOAT",
- "rtvFormat": "DXGI_FORMAT_R11G11B10_FLOAT",
- "channels": "rgb",
- "componentType": "float",
- "bits": { "red": 11, "green": 11, "blue": 10 },
- "glInternalFormat": "GL_R11F_G11F_B10F"
- },
- "R16_FLOAT": {
- "texFormat": "DXGI_FORMAT_R16_FLOAT",
- "srvFormat": "DXGI_FORMAT_R16_FLOAT",
- "rtvFormat": "DXGI_FORMAT_R16_FLOAT",
- "channels": "r",
- "componentType": "float",
- "bits": { "red": 16 },
- "glInternalFormat": "GL_R16F"
- },
- "R16_SINT": {
- "texFormat": "DXGI_FORMAT_R16_SINT",
- "srvFormat": "DXGI_FORMAT_R16_SINT",
- "rtvFormat": "DXGI_FORMAT_R16_SINT",
- "channels": "r",
- "componentType": "int",
- "bits": { "red": 16 },
- "glInternalFormat": "GL_R16I"
- },
- "R16_UINT": {
- "texFormat": "DXGI_FORMAT_R16_UINT",
- "srvFormat": "DXGI_FORMAT_R16_UINT",
- "rtvFormat": "DXGI_FORMAT_R16_UINT",
- "channels": "r",
- "componentType": "uint",
- "bits": { "red": 16 },
- "glInternalFormat": "GL_R16UI"
- },
- "R32_FLOAT": {
- "texFormat": "DXGI_FORMAT_R32_FLOAT",
- "srvFormat": "DXGI_FORMAT_R32_FLOAT",
- "rtvFormat": "DXGI_FORMAT_R32_FLOAT",
- "channels": "r",
- "componentType": "float",
- "bits": { "red": 32 },
- "glInternalFormat": "GL_R32F"
- },
- "R32_SINT": {
- "texFormat": "DXGI_FORMAT_R32_SINT",
- "srvFormat": "DXGI_FORMAT_R32_SINT",
- "rtvFormat": "DXGI_FORMAT_R32_SINT",
- "channels": "r",
- "componentType": "int",
- "bits": { "red": 32 },
- "glInternalFormat": "GL_R32I"
- },
- "R32_UINT": {
- "texFormat": "DXGI_FORMAT_R32_UINT",
- "srvFormat": "DXGI_FORMAT_R32_UINT",
- "rtvFormat": "DXGI_FORMAT_R32_UINT",
- "channels": "r",
- "componentType": "uint",
- "bits": { "red": 32 },
- "glInternalFormat": "GL_R32UI"
- },
- "R8_UNORM": {
- "texFormat": "DXGI_FORMAT_R8_UNORM",
- "srvFormat": "DXGI_FORMAT_R8_UNORM",
- "rtvFormat": "DXGI_FORMAT_R8_UNORM",
- "channels": "r",
- "componentType": "unorm",
- "bits": { "red": 8 },
- "glInternalFormat": "GL_R8"
- },
- "R8_SINT": {
- "texFormat": "DXGI_FORMAT_R8_SINT",
- "srvFormat": "DXGI_FORMAT_R8_SINT",
- "rtvFormat": "DXGI_FORMAT_R8_SINT",
- "channels": "r",
- "componentType": "int",
- "bits": { "red": 8 },
- "glInternalFormat": "GL_R8I"
- },
- "R8_UINT": {
- "texFormat": "DXGI_FORMAT_R8_UINT",
- "srvFormat": "DXGI_FORMAT_R8_UINT",
- "rtvFormat": "DXGI_FORMAT_R8_UINT",
- "channels": "r",
- "componentType": "uint",
- "bits": { "red": 8 },
- "glInternalFormat": "GL_R8UI"
- },
- "R8_SNORM": {
- "texFormat": "DXGI_FORMAT_R8_SNORM",
- "srvFormat": "DXGI_FORMAT_R8_SNORM",
- "channels": "r",
- "componentType": "snorm",
- "bits": { "red": 8 },
- "glInternalFormat": "GL_R8_SNORM"
- },
- "R16G16_FLOAT": {
- "texFormat": "DXGI_FORMAT_R16G16_FLOAT",
- "srvFormat": "DXGI_FORMAT_R16G16_FLOAT",
- "rtvFormat": "DXGI_FORMAT_R16G16_FLOAT",
- "channels": "rg",
- "componentType": "float",
- "bits": { "red": 16, "green": 16 },
- "glInternalFormat": "GL_RG16F"
- },
- "R16G16_SINT": {
- "texFormat": "DXGI_FORMAT_R16G16_SINT",
- "srvFormat": "DXGI_FORMAT_R16G16_SINT",
- "rtvFormat": "DXGI_FORMAT_R16G16_SINT",
- "channels": "rg",
- "componentType": "int",
- "bits": { "red": 16, "green": 16 },
- "glInternalFormat": "GL_RG16I"
- },
- "R16G16_UINT": {
- "texFormat": "DXGI_FORMAT_R16G16_UINT",
- "srvFormat": "DXGI_FORMAT_R16G16_UINT",
- "rtvFormat": "DXGI_FORMAT_R16G16_UINT",
- "channels": "rg",
- "componentType": "uint",
- "bits": { "red": 16, "green": 16 },
- "glInternalFormat": "GL_RG16UI"
- },
- "R32G32_FLOAT": {
- "texFormat": "DXGI_FORMAT_R32G32_FLOAT",
- "srvFormat": "DXGI_FORMAT_R32G32_FLOAT",
- "rtvFormat": "DXGI_FORMAT_R32G32_FLOAT",
- "channels": "rg",
- "componentType": "float",
- "bits": { "red": 32, "green": 32 },
- "glInternalFormat": "GL_RG32F"
- },
- "R32G32_SINT": {
- "texFormat": "DXGI_FORMAT_R32G32_SINT",
- "srvFormat": "DXGI_FORMAT_R32G32_SINT",
- "rtvFormat": "DXGI_FORMAT_R32G32_SINT",
- "channels": "rg",
- "componentType": "int",
- "bits": { "red": 32, "green": 32 },
- "glInternalFormat": "GL_RG32I"
- },
- "R32G32_UINT": {
- "texFormat": "DXGI_FORMAT_R32G32_UINT",
- "srvFormat": "DXGI_FORMAT_R32G32_UINT",
- "rtvFormat": "DXGI_FORMAT_R32G32_UINT",
- "channels": "rg",
- "componentType": "uint",
- "bits": { "red": 32, "green": 32 },
- "glInternalFormat": "GL_RG32UI"
- },
- "R8G8_UNORM": {
- "texFormat": "DXGI_FORMAT_R8G8_UNORM",
- "srvFormat": "DXGI_FORMAT_R8G8_UNORM",
- "rtvFormat": "DXGI_FORMAT_R8G8_UNORM",
- "channels": "rg",
- "componentType": "unorm",
- "bits": { "red": 8, "green": 8 },
- "glInternalFormat": "GL_RG8"
- },
- "R8G8_SINT": {
- "texFormat": "DXGI_FORMAT_R8G8_SINT",
- "srvFormat": "DXGI_FORMAT_R8G8_SINT",
- "rtvFormat": "DXGI_FORMAT_R8G8_SINT",
- "channels": "rg",
- "componentType": "int",
- "bits": { "red": 8, "green": 8 },
- "glInternalFormat": "GL_RG8I"
- },
- "R8G8_UINT": {
- "texFormat": "DXGI_FORMAT_R8G8_UINT",
- "srvFormat": "DXGI_FORMAT_R8G8_UINT",
- "rtvFormat": "DXGI_FORMAT_R8G8_UINT",
- "channels": "rg",
- "componentType": "uint",
- "bits": { "red": 8, "green": 8 },
- "glInternalFormat": "GL_RG8UI"
- },
- "R8G8_SNORM": {
- "texFormat": "DXGI_FORMAT_R8G8_SNORM",
- "srvFormat": "DXGI_FORMAT_R8G8_SNORM",
- "channels": "rg",
- "componentType": "snorm",
- "bits": { "red": 8, "green": 8 },
- "glInternalFormat": "GL_RG8_SNORM"
- },
- "R10G10B10A2_UNORM": {
- "texFormat": "DXGI_FORMAT_R10G10B10A2_UNORM",
- "srvFormat": "DXGI_FORMAT_R10G10B10A2_UNORM",
- "rtvFormat": "DXGI_FORMAT_R10G10B10A2_UNORM",
- "channels": "rgba",
- "componentType": "unorm",
- "bits": { "red": 10, "green": 10, "blue": 10, "alpha": 2 },
- "glInternalFormat": "GL_RGB10_A2"
- },
- "R10G10B10A2_UINT": {
- "texFormat": "DXGI_FORMAT_R10G10B10A2_UINT",
- "srvFormat": "DXGI_FORMAT_R10G10B10A2_UINT",
- "rtvFormat": "DXGI_FORMAT_R10G10B10A2_UINT",
- "channels": "rgba",
- "componentType": "uint",
- "bits": { "red": 10, "green": 10, "blue": 10, "alpha": 2 },
- "glInternalFormat": "GL_RGB10_A2UI"
- },
- "R16G16B16A16_SINT": {
- "texFormat": "DXGI_FORMAT_R16G16B16A16_SINT",
- "srvFormat": "DXGI_FORMAT_R16G16B16A16_SINT",
- "rtvFormat": "DXGI_FORMAT_R16G16B16A16_SINT",
- "channels": "rgba",
- "componentType": "int",
- "bits": { "red": 16, "green": 16, "blue": 16, "alpha": 16 },
- "glInternalFormat": "GL_RGBA16I"
- },
- "R16G16B16A16_UINT": {
- "texFormat": "DXGI_FORMAT_R16G16B16A16_UINT",
- "srvFormat": "DXGI_FORMAT_R16G16B16A16_UINT",
- "rtvFormat": "DXGI_FORMAT_R16G16B16A16_UINT",
- "channels": "rgba",
- "componentType": "uint",
- "bits": { "red": 16, "green": 16, "blue": 16, "alpha": 16 },
- "glInternalFormat": "GL_RGBA16UI"
- },
- "R32G32B32A32_SINT": {
- "texFormat": "DXGI_FORMAT_R32G32B32A32_SINT",
- "srvFormat": "DXGI_FORMAT_R32G32B32A32_SINT",
- "rtvFormat": "DXGI_FORMAT_R32G32B32A32_SINT",
- "channels": "rgba",
- "componentType": "int",
- "bits": { "red": 32, "green": 32, "blue": 32, "alpha": 32 },
- "glInternalFormat": "GL_RGBA32I"
- },
- "R32G32B32A32_UINT": {
- "texFormat": "DXGI_FORMAT_R32G32B32A32_UINT",
- "srvFormat": "DXGI_FORMAT_R32G32B32A32_UINT",
- "rtvFormat": "DXGI_FORMAT_R32G32B32A32_UINT",
- "channels": "rgba",
- "componentType": "uint",
- "bits": { "red": 32, "green": 32, "blue": 32, "alpha": 32 },
- "glInternalFormat": "GL_RGBA32UI"
- },
- "B5G6R5_UNORM": {
- "texFormat": "DXGI_FORMAT_B5G6R5_UNORM",
- "srvFormat": "DXGI_FORMAT_B5G6R5_UNORM",
- "rtvFormat": "DXGI_FORMAT_B5G6R5_UNORM",
- "channels": "bgr",
- "componentType": "unorm",
- "bits": { "red": 5, "green": 6, "blue": 5 },
- "supportTest": "SupportsFormat(DXGI_FORMAT_B5G6R5_UNORM, deviceCaps)",
- "fallbackFormat": "R8G8B8A8_UNORM"
- },
- "B5G5R5A1_UNORM": {
- "texFormat": "DXGI_FORMAT_B5G5R5A1_UNORM",
- "srvFormat": "DXGI_FORMAT_B5G5R5A1_UNORM",
- "rtvFormat": "DXGI_FORMAT_B5G5R5A1_UNORM",
- "channels": "bgra",
- "componentType": "unorm",
- "bits": { "red": 5, "green": 5, "blue": 5, "alpha": 1 },
- "supportTest": "SupportsFormat(DXGI_FORMAT_B5G5R5A1_UNORM, deviceCaps)",
- "fallbackFormat": "R8G8B8A8_UNORM"
- },
- "R8G8B8A8_SINT": {
- "texFormat": "DXGI_FORMAT_R8G8B8A8_SINT",
- "srvFormat": "DXGI_FORMAT_R8G8B8A8_SINT",
- "rtvFormat": "DXGI_FORMAT_R8G8B8A8_SINT",
- "channels": "rgba",
- "componentType": "int",
- "bits": { "red": 8, "green": 8, "blue": 8, "alpha": 8 },
- "glInternalFormat": "GL_RGBA8I"
- },
- "R8G8B8A8_UINT": {
- "texFormat": "DXGI_FORMAT_R8G8B8A8_UINT",
- "srvFormat": "DXGI_FORMAT_R8G8B8A8_UINT",
- "rtvFormat": "DXGI_FORMAT_R8G8B8A8_UINT",
- "channels": "rgba",
- "componentType": "uint",
- "bits": { "red": 8, "green": 8, "blue": 8, "alpha": 8 },
- "glInternalFormat": "GL_RGBA8UI"
- },
- "R8G8B8A8_SNORM": {
- "texFormat": "DXGI_FORMAT_R8G8B8A8_SNORM",
- "srvFormat": "DXGI_FORMAT_R8G8B8A8_SNORM",
- "channels": "rgba",
- "componentType": "snorm",
- "bits": { "red": 8, "green": 8, "blue": 8, "alpha": 8 },
- "glInternalFormat": "GL_RGBA8_SNORM"
- },
- "R9G9B9E5_SHAREDEXP": {
- "texFormat": "DXGI_FORMAT_R9G9B9E5_SHAREDEXP",
- "srvFormat": "DXGI_FORMAT_R9G9B9E5_SHAREDEXP",
- "channels": "rgb",
- "componentType": "float",
- "bits": { "red": 9, "green": 9, "blue": 9, "shared": 5 }
- },
- "B4G4R4A4_UNORM": {
- "texFormat": "DXGI_FORMAT_B4G4R4A4_UNORM",
- "srvFormat": "DXGI_FORMAT_B4G4R4A4_UNORM",
- "rtvFormat": "DXGI_FORMAT_B4G4R4A4_UNORM",
- "channels": "bgra",
- "componentType": "unorm",
- "bits": { "red": 4, "green": 4, "blue": 4, "alpha": 4 },
- "supportTest": "SupportsFormat(DXGI_FORMAT_B4G4R4A4_UNORM, deviceCaps)",
- "fallbackFormat": "R8G8B8A8_UNORM"
- },
- "R8G8B8A8_UNORM_SRGB": {
- "texFormat": "DXGI_FORMAT_R8G8B8A8_UNORM_SRGB",
- "srvFormat": "DXGI_FORMAT_R8G8B8A8_UNORM_SRGB",
- "rtvFormat": "DXGI_FORMAT_R8G8B8A8_UNORM_SRGB",
- "channels": "rgba",
- "componentType": "unorm",
- "bits": { "red": 8, "green": 8, "blue": 8, "alpha": 8 },
- "glInternalFormat": "GL_SRGB8_ALPHA8"
- },
- "R16_UNORM": {
- "texFormat": "DXGI_FORMAT_R16_UNORM",
- "srvFormat": "DXGI_FORMAT_R16_UNORM",
- "rtvFormat": "DXGI_FORMAT_R16_UNORM",
- "channels": "r",
- "componentType": "unorm",
- "bits": { "red": 16 },
- "glInternalFormat": "GL_R16_EXT"
- },
- "R16G16_UNORM": {
- "texFormat": "DXGI_FORMAT_R16G16_UNORM",
- "srvFormat": "DXGI_FORMAT_R16G16_UNORM",
- "rtvFormat": "DXGI_FORMAT_R16G16_UNORM",
- "channels": "rg",
- "componentType": "unorm",
- "bits": { "red": 16, "green": 16 },
- "glInternalFormat": "GL_RG16_EXT"
- },
- "R16_SNORM": {
- "texFormat": "DXGI_FORMAT_R16_SNORM",
- "srvFormat": "DXGI_FORMAT_R16_SNORM",
- "channels": "r",
- "componentType": "snorm",
- "bits": { "red": 16 },
- "glInternalFormat": "GL_R16_SNORM_EXT"
- },
- "R16G16_SNORM": {
- "texFormat": "DXGI_FORMAT_R16G16_SNORM",
- "srvFormat": "DXGI_FORMAT_R16G16_SNORM",
- "channels": "rg",
- "componentType": "snorm",
- "bits": { "red": 16, "green": 16 },
- "glInternalFormat": "GL_RG16_SNORM_EXT"
- },
- "R16G16B16A16_SNORM": {
- "texFormat": "DXGI_FORMAT_R16G16B16A16_SNORM",
- "srvFormat": "DXGI_FORMAT_R16G16B16A16_SNORM",
- "channels": "rgba",
- "componentType": "snorm",
- "bits": { "red": 16, "green": 16, "blue": 16, "alpha": 16 },
- "glInternalFormat": "GL_RGBA16_SNORM_EXT"
- }
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_map.json b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_map.json
deleted file mode 100644
index 3ef2355645..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_map.json
+++ /dev/null
@@ -1,78 +0,0 @@
-{
- "GL_ALPHA16F_EXT": "R16G16B16A16_FLOAT",
- "GL_ALPHA32F_EXT": "R32G32B32A32_FLOAT",
- "GL_BGR5_A1_ANGLEX": "B8G8R8A8_UNORM",
- "GL_BGRA4_ANGLEX": "B8G8R8A8_UNORM",
- "GL_BGRA8_SRGB_ANGLEX": "B8G8R8A8_UNORM_SRGB",
- "GL_COMPRESSED_R11_EAC": "R8_UNORM",
- "GL_COMPRESSED_RG11_EAC": "R8G8_UNORM",
- "GL_COMPRESSED_RGB8_ETC2": "R8G8B8A8_UNORM",
- "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2": "R8G8B8A8_UNORM",
- "GL_COMPRESSED_RGBA8_ETC2_EAC": "R8G8B8A8_UNORM",
- "GL_COMPRESSED_RGBA_ASTC_4x4_KHR": "NONE",
- "GL_COMPRESSED_RGBA_ASTC_5x4_KHR": "NONE",
- "GL_COMPRESSED_RGBA_ASTC_5x5_KHR": "NONE",
- "GL_COMPRESSED_RGBA_ASTC_6x5_KHR": "NONE",
- "GL_COMPRESSED_RGBA_ASTC_6x6_KHR": "NONE",
- "GL_COMPRESSED_RGBA_ASTC_8x5_KHR": "NONE",
- "GL_COMPRESSED_RGBA_ASTC_8x6_KHR": "NONE",
- "GL_COMPRESSED_RGBA_ASTC_8x8_KHR": "NONE",
- "GL_COMPRESSED_RGBA_ASTC_10x5_KHR": "NONE",
- "GL_COMPRESSED_RGBA_ASTC_10x6_KHR": "NONE",
- "GL_COMPRESSED_RGBA_ASTC_10x8_KHR": "NONE",
- "GL_COMPRESSED_RGBA_ASTC_10x10_KHR": "NONE",
- "GL_COMPRESSED_RGBA_ASTC_12x10_KHR": "NONE",
- "GL_COMPRESSED_RGBA_ASTC_12x12_KHR": "NONE",
- "GL_COMPRESSED_SIGNED_R11_EAC": "R8_SNORM",
- "GL_COMPRESSED_SIGNED_RG11_EAC": "R8G8_SNORM",
- "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR": "NONE",
- "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR": "NONE",
- "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR": "NONE",
- "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR": "NONE",
- "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR": "NONE",
- "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR": "NONE",
- "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR": "NONE",
- "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR": "NONE",
- "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR": "NONE",
- "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR": "NONE",
- "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR": "NONE",
- "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR": "NONE",
- "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR": "NONE",
- "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR": "NONE",
- "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC": "R8G8B8A8_UNORM_SRGB",
- "GL_COMPRESSED_SRGB8_ETC2": "R8G8B8A8_UNORM_SRGB",
- "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2": "R8G8B8A8_UNORM_SRGB",
- "GL_DEPTH_COMPONENT24": "D24_UNORM_S8_UINT",
- "GL_DEPTH_COMPONENT32_OES": "D24_UNORM_S8_UINT",
- "GL_ETC1_RGB8_OES": "R8G8B8A8_UNORM",
- "GL_ETC1_RGB8_LOSSY_DECODE_ANGLE": "BC1_RGB_UNORM_BLOCK",
- "GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE": "BC1_RGB_UNORM_BLOCK",
- "GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE": "BC1_RGB_UNORM_SRGB_BLOCK",
- "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE": "BC1_RGBA_UNORM_BLOCK",
- "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE": "BC1_RGBA_UNORM_SRGB_BLOCK",
- "GL_LUMINANCE16F_EXT": "R16G16B16A16_FLOAT",
- "GL_LUMINANCE32F_EXT": "R32G32B32A32_FLOAT",
- "GL_LUMINANCE8_ALPHA8_EXT": "R8G8B8A8_UNORM",
- "GL_LUMINANCE8_EXT": "R8G8B8A8_UNORM",
- "GL_LUMINANCE_ALPHA16F_EXT": "R16G16B16A16_FLOAT",
- "GL_LUMINANCE_ALPHA32F_EXT": "R32G32B32A32_FLOAT",
- "GL_RGB": "R8G8B8A8_UNORM",
- "GL_RGB16F": "R16G16B16A16_FLOAT",
- "GL_RGB16I": "R16G16B16A16_SINT",
- "GL_RGB16UI": "R16G16B16A16_UINT",
- "GL_RGB565": "B5G6R5_UNORM",
- "GL_RGB5_A1": "B5G5R5A1_UNORM",
- "GL_RGB8": "R8G8B8A8_UNORM",
- "GL_RGB8I": "R8G8B8A8_SINT",
- "GL_RGB8UI": "R8G8B8A8_UINT",
- "GL_RGB8_SNORM": "R8G8B8A8_SNORM",
- "GL_RGBA4": "B4G4R4A4_UNORM",
- "GL_SRGB8": "R8G8B8A8_UNORM_SRGB",
- "GL_STENCIL_INDEX8": "D24_UNORM_S8_UINT",
- "GL_RGB16_EXT": "R16G16B16A16_UNORM",
- "GL_RGBA16_EXT": "R16G16B16A16_UNORM",
- "GL_RGB16_SNORM_EXT": "R16G16B16A16_SNORM",
- "GL_RGB32F": "R32G32B32A32_FLOAT",
- "GL_RGB32I": "R32G32B32A32_SINT",
- "GL_RGB32UI": "R32G32B32A32_UINT"
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table.cpp
deleted file mode 100644
index a9dfec56b8..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Helper routines for the D3D11 texture format table.
-
-#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h"
-
-#include "libANGLE/renderer/load_functions_table.h"
-
-namespace rx
-{
-
-namespace d3d11
-{
-
-const Format &Format::getSwizzleFormat(const Renderer11DeviceCaps &deviceCaps) const
-{
- return (swizzleFormat == internalFormat ? *this : Format::Get(swizzleFormat, deviceCaps));
-}
-
-LoadFunctionMap Format::getLoadFunctions() const
-{
- return GetLoadFunctionsMap(internalFormat, formatID);
-}
-
-const angle::Format &Format::format() const
-{
- return angle::Format::Get(formatID);
-}
-
-} // namespace d3d11
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table.h
deleted file mode 100644
index 3efcb81adb..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table.h
+++ /dev/null
@@ -1,105 +0,0 @@
-//
-// Copyright 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// texture_format_table:
-// Queries for full textureFormat information based on internalFormat
-//
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_TEXTUREFORMATTABLE_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_TEXTUREFORMATTABLE_H_
-
-#include <map>
-
-#include "common/angleutils.h"
-#include "common/platform.h"
-#include "libANGLE/renderer/Format.h"
-#include "libANGLE/renderer/renderer_utils.h"
-#include "libANGLE/renderer/d3d/formatutilsD3D.h"
-
-namespace rx
-{
-
-struct Renderer11DeviceCaps;
-
-namespace d3d11
-{
-
-// For sized GL internal formats, there are several possible corresponding D3D11 formats depending
-// on device capabilities.
-// This structure allows querying for the DXGI texture formats to use for textures, SRVs, RTVs and
-// DSVs given a GL internal format.
-struct Format final : private angle::NonCopyable
-{
- constexpr Format();
- constexpr Format(GLenum internalFormat,
- angle::Format::ID formatID,
- DXGI_FORMAT texFormat,
- DXGI_FORMAT srvFormat,
- DXGI_FORMAT rtvFormat,
- DXGI_FORMAT dsvFormat,
- DXGI_FORMAT blitSRVFormat,
- GLenum swizzleFormat,
- InitializeTextureDataFunction internalFormatInitializer);
-
- static const Format &Get(GLenum internalFormat, const Renderer11DeviceCaps &deviceCaps);
-
- const Format &getSwizzleFormat(const Renderer11DeviceCaps &deviceCaps) const;
- LoadFunctionMap getLoadFunctions() const;
- const angle::Format &format() const;
-
- GLenum internalFormat;
- angle::Format::ID formatID;
-
- DXGI_FORMAT texFormat;
- DXGI_FORMAT srvFormat;
- DXGI_FORMAT rtvFormat;
- DXGI_FORMAT dsvFormat;
-
- DXGI_FORMAT blitSRVFormat;
-
- GLenum swizzleFormat;
-
- InitializeTextureDataFunction dataInitializerFunction;
-};
-
-constexpr Format::Format()
- : internalFormat(GL_NONE),
- formatID(angle::Format::ID::NONE),
- texFormat(DXGI_FORMAT_UNKNOWN),
- srvFormat(DXGI_FORMAT_UNKNOWN),
- rtvFormat(DXGI_FORMAT_UNKNOWN),
- dsvFormat(DXGI_FORMAT_UNKNOWN),
- blitSRVFormat(DXGI_FORMAT_UNKNOWN),
- swizzleFormat(GL_NONE),
- dataInitializerFunction(nullptr)
-{
-}
-
-constexpr Format::Format(GLenum internalFormat,
- angle::Format::ID formatID,
- DXGI_FORMAT texFormat,
- DXGI_FORMAT srvFormat,
- DXGI_FORMAT rtvFormat,
- DXGI_FORMAT dsvFormat,
- DXGI_FORMAT blitSRVFormat,
- GLenum swizzleFormat,
- InitializeTextureDataFunction internalFormatInitializer)
- : internalFormat(internalFormat),
- formatID(formatID),
- texFormat(texFormat),
- srvFormat(srvFormat),
- rtvFormat(rtvFormat),
- dsvFormat(dsvFormat),
- blitSRVFormat(blitSRVFormat),
- swizzleFormat(swizzleFormat),
- dataInitializerFunction(internalFormatInitializer)
-{
-}
-
-} // namespace d3d11
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_TEXTUREFORMATTABLE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp
deleted file mode 100644
index 3c1c2bcd50..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp
+++ /dev/null
@@ -1,1938 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by gen_texture_format_table.py using data from texture_format_data.json
-//
-// Copyright 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// texture_format_table:
-// Queries for full textureFormat information based in internalFormat
-//
-
-#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h"
-
-#include "image_util/copyimage.h"
-#include "image_util/generatemip.h"
-#include "image_util/loadimage.h"
-
-#include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-#include "libANGLE/renderer/d3d/d3d11/texture_format_table_utils.h"
-
-using namespace angle;
-
-namespace rx
-{
-
-namespace d3d11
-{
-
-// static
-const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &deviceCaps)
-{
- // clang-format off
- switch (internalFormat)
- {
- case GL_ALPHA16F_EXT:
- {
- static constexpr Format info(GL_ALPHA16F_EXT,
- angle::Format::ID::R16G16B16A16_FLOAT,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- GL_RGBA16F,
- nullptr);
- return info;
- }
- case GL_ALPHA32F_EXT:
- {
- static constexpr Format info(GL_ALPHA32F_EXT,
- angle::Format::ID::R32G32B32A32_FLOAT,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- GL_RGBA32F,
- nullptr);
- return info;
- }
- case GL_ALPHA8_EXT:
- {
- if (OnlyFL10Plus(deviceCaps))
- {
- static constexpr Format info(GL_ALPHA8_EXT,
- angle::Format::ID::A8_UNORM,
- DXGI_FORMAT_A8_UNORM,
- DXGI_FORMAT_A8_UNORM,
- DXGI_FORMAT_A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_A8_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- else
- {
- static constexpr Format info(GL_ALPHA8_EXT,
- angle::Format::ID::R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- }
- case GL_BGR565_ANGLEX:
- {
- if (SupportsFormat(DXGI_FORMAT_B5G6R5_UNORM, deviceCaps))
- {
- static constexpr Format info(GL_BGR565_ANGLEX,
- angle::Format::ID::B5G6R5_UNORM,
- DXGI_FORMAT_B5G6R5_UNORM,
- DXGI_FORMAT_B5G6R5_UNORM,
- DXGI_FORMAT_B5G6R5_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_B5G6R5_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- else
- {
- static constexpr Format info(GL_BGR565_ANGLEX,
- angle::Format::ID::R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- }
- case GL_BGR5_A1_ANGLEX:
- {
- static constexpr Format info(GL_BGR5_A1_ANGLEX,
- angle::Format::ID::B8G8R8A8_UNORM,
- DXGI_FORMAT_B8G8R8A8_UNORM,
- DXGI_FORMAT_B8G8R8A8_UNORM,
- DXGI_FORMAT_B8G8R8A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_B8G8R8A8_UNORM,
- GL_BGRA8_EXT,
- nullptr);
- return info;
- }
- case GL_BGRA4_ANGLEX:
- {
- static constexpr Format info(GL_BGRA4_ANGLEX,
- angle::Format::ID::B8G8R8A8_UNORM,
- DXGI_FORMAT_B8G8R8A8_UNORM,
- DXGI_FORMAT_B8G8R8A8_UNORM,
- DXGI_FORMAT_B8G8R8A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_B8G8R8A8_UNORM,
- GL_BGRA8_EXT,
- nullptr);
- return info;
- }
- case GL_BGRA8_EXT:
- {
- static constexpr Format info(GL_BGRA8_EXT,
- angle::Format::ID::B8G8R8A8_UNORM,
- DXGI_FORMAT_B8G8R8A8_UNORM,
- DXGI_FORMAT_B8G8R8A8_UNORM,
- DXGI_FORMAT_B8G8R8A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_B8G8R8A8_UNORM,
- GL_BGRA8_EXT,
- nullptr);
- return info;
- }
- case GL_BGRA8_SRGB_ANGLEX:
- {
- static constexpr Format info(GL_BGRA8_SRGB_ANGLEX,
- angle::Format::ID::B8G8R8A8_UNORM_SRGB,
- DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,
- DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,
- DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,
- GL_BGRA8_SRGB_ANGLEX,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_R11_EAC:
- {
- static constexpr Format info(GL_COMPRESSED_R11_EAC,
- angle::Format::ID::R8_UNORM,
- DXGI_FORMAT_R8_UNORM,
- DXGI_FORMAT_R8_UNORM,
- DXGI_FORMAT_R8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RG11_EAC:
- {
- static constexpr Format info(GL_COMPRESSED_RG11_EAC,
- angle::Format::ID::R8G8_UNORM,
- DXGI_FORMAT_R8G8_UNORM,
- DXGI_FORMAT_R8G8_UNORM,
- DXGI_FORMAT_R8G8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGB8_ETC2:
- {
- static constexpr Format info(GL_COMPRESSED_RGB8_ETC2,
- angle::Format::ID::R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- GL_RGBA8,
- Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>);
- return info;
- }
- case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
- {
- static constexpr Format info(GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE,
- angle::Format::ID::BC1_RGB_UNORM_BLOCK,
- DXGI_FORMAT_BC1_UNORM,
- DXGI_FORMAT_BC1_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_BC1_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
- {
- static constexpr Format info(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,
- angle::Format::ID::R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- GL_RGBA8,
- Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>);
- return info;
- }
- case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
- {
- static constexpr Format info(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE,
- angle::Format::ID::BC1_RGBA_UNORM_BLOCK,
- DXGI_FORMAT_BC1_UNORM,
- DXGI_FORMAT_BC1_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_BC1_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGBA8_ETC2_EAC:
- {
- static constexpr Format info(GL_COMPRESSED_RGBA8_ETC2_EAC,
- angle::Format::ID::R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_10x10_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_10x5_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_10x6_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_10x8_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_12x10_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_12x12_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_4x4_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_5x4_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_5x5_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_6x5_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_6x6_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_8x5_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_8x6_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_RGBA_ASTC_8x8_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- {
- static constexpr Format info(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
- angle::Format::ID::BC1_RGBA_UNORM_BLOCK,
- DXGI_FORMAT_BC1_UNORM,
- DXGI_FORMAT_BC1_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_BC1_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
- {
- static constexpr Format info(GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE,
- angle::Format::ID::BC2_RGBA_UNORM_BLOCK,
- DXGI_FORMAT_BC2_UNORM,
- DXGI_FORMAT_BC2_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_BC2_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
- {
- static constexpr Format info(GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE,
- angle::Format::ID::BC3_RGBA_UNORM_BLOCK,
- DXGI_FORMAT_BC3_UNORM,
- DXGI_FORMAT_BC3_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_BC3_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
- {
- static constexpr Format info(GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
- angle::Format::ID::BC1_RGB_UNORM_BLOCK,
- DXGI_FORMAT_BC1_UNORM,
- DXGI_FORMAT_BC1_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_BC1_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SIGNED_R11_EAC:
- {
- static constexpr Format info(GL_COMPRESSED_SIGNED_R11_EAC,
- angle::Format::ID::R8_SNORM,
- DXGI_FORMAT_R8_SNORM,
- DXGI_FORMAT_R8_SNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8_SNORM,
- GL_RGBA8_SNORM,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SIGNED_RG11_EAC:
- {
- static constexpr Format info(GL_COMPRESSED_SIGNED_RG11_EAC,
- angle::Format::ID::R8G8_SNORM,
- DXGI_FORMAT_R8G8_SNORM,
- DXGI_FORMAT_R8G8_SNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8_SNORM,
- GL_RGBA8_SNORM,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,
- angle::Format::ID::R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- GL_SRGB8_ALPHA8,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB8_ETC2:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_ETC2,
- angle::Format::ID::R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- GL_SRGB8_ALPHA8,
- Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>);
- return info;
- }
- case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE,
- angle::Format::ID::BC1_RGB_UNORM_SRGB_BLOCK,
- DXGI_FORMAT_BC1_UNORM_SRGB,
- DXGI_FORMAT_BC1_UNORM_SRGB,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_BC1_UNORM_SRGB,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,
- angle::Format::ID::R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- GL_SRGB8_ALPHA8,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE,
- angle::Format::ID::BC1_RGBA_UNORM_SRGB_BLOCK,
- DXGI_FORMAT_BC1_UNORM_SRGB,
- DXGI_FORMAT_BC1_UNORM_SRGB,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_BC1_UNORM_SRGB,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,
- angle::Format::ID::BC1_RGBA_UNORM_SRGB_BLOCK,
- DXGI_FORMAT_BC1_UNORM_SRGB,
- DXGI_FORMAT_BC1_UNORM_SRGB,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_BC1_UNORM_SRGB,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,
- angle::Format::ID::BC2_RGBA_UNORM_SRGB_BLOCK,
- DXGI_FORMAT_BC2_UNORM_SRGB,
- DXGI_FORMAT_BC2_UNORM_SRGB,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_BC2_UNORM_SRGB,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,
- angle::Format::ID::BC3_RGBA_UNORM_SRGB_BLOCK,
- DXGI_FORMAT_BC3_UNORM_SRGB,
- DXGI_FORMAT_BC3_UNORM_SRGB,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_BC3_UNORM_SRGB,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
- {
- static constexpr Format info(GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,
- angle::Format::ID::BC1_RGB_UNORM_SRGB_BLOCK,
- DXGI_FORMAT_BC1_UNORM_SRGB,
- DXGI_FORMAT_BC1_UNORM_SRGB,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_BC1_UNORM_SRGB,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_DEPTH24_STENCIL8:
- {
- if (OnlyFL10Plus(deviceCaps))
- {
- static constexpr Format info(GL_DEPTH24_STENCIL8,
- angle::Format::ID::D24_UNORM_S8_UINT,
- DXGI_FORMAT_R24G8_TYPELESS,
- DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_D24_UNORM_S8_UINT,
- DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
- GL_RGBA32F,
- nullptr);
- return info;
- }
- else
- {
- static constexpr Format info(GL_DEPTH24_STENCIL8,
- angle::Format::ID::D24_UNORM_S8_UINT,
- DXGI_FORMAT_D24_UNORM_S8_UINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_D24_UNORM_S8_UINT,
- DXGI_FORMAT_UNKNOWN,
- GL_RGBA32F,
- nullptr);
- return info;
- }
- }
- case GL_DEPTH32F_STENCIL8:
- {
- static constexpr Format info(GL_DEPTH32F_STENCIL8,
- angle::Format::ID::D32_FLOAT_S8X24_UINT,
- DXGI_FORMAT_R32G8X24_TYPELESS,
- DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_D32_FLOAT_S8X24_UINT,
- DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS,
- GL_RGBA32F,
- nullptr);
- return info;
- }
- case GL_DEPTH_COMPONENT16:
- {
- if (OnlyFL10Plus(deviceCaps))
- {
- static constexpr Format info(GL_DEPTH_COMPONENT16,
- angle::Format::ID::D16_UNORM,
- DXGI_FORMAT_R16_TYPELESS,
- DXGI_FORMAT_R16_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_D16_UNORM,
- DXGI_FORMAT_R16_UNORM,
- GL_RGBA16_EXT,
- nullptr);
- return info;
- }
- else
- {
- static constexpr Format info(GL_DEPTH_COMPONENT16,
- angle::Format::ID::D16_UNORM,
- DXGI_FORMAT_D16_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_D16_UNORM,
- DXGI_FORMAT_UNKNOWN,
- GL_RGBA16_EXT,
- nullptr);
- return info;
- }
- }
- case GL_DEPTH_COMPONENT24:
- {
- if (OnlyFL10Plus(deviceCaps))
- {
- static constexpr Format info(GL_DEPTH_COMPONENT24,
- angle::Format::ID::D24_UNORM_S8_UINT,
- DXGI_FORMAT_R24G8_TYPELESS,
- DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_D24_UNORM_S8_UINT,
- DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
- GL_RGBA32F,
- nullptr);
- return info;
- }
- else
- {
- static constexpr Format info(GL_DEPTH_COMPONENT24,
- angle::Format::ID::D24_UNORM_S8_UINT,
- DXGI_FORMAT_D24_UNORM_S8_UINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_D24_UNORM_S8_UINT,
- DXGI_FORMAT_UNKNOWN,
- GL_RGBA32F,
- nullptr);
- return info;
- }
- }
- case GL_DEPTH_COMPONENT32F:
- {
- static constexpr Format info(GL_DEPTH_COMPONENT32F,
- angle::Format::ID::D32_FLOAT,
- DXGI_FORMAT_R32_TYPELESS,
- DXGI_FORMAT_R32_FLOAT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_D32_FLOAT,
- DXGI_FORMAT_R32_FLOAT,
- GL_RGBA32F,
- nullptr);
- return info;
- }
- case GL_DEPTH_COMPONENT32_OES:
- {
- if (OnlyFL10Plus(deviceCaps))
- {
- static constexpr Format info(GL_DEPTH_COMPONENT32_OES,
- angle::Format::ID::D24_UNORM_S8_UINT,
- DXGI_FORMAT_R24G8_TYPELESS,
- DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_D24_UNORM_S8_UINT,
- DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
- GL_RGBA32F,
- nullptr);
- return info;
- }
- else
- {
- static constexpr Format info(GL_DEPTH_COMPONENT32_OES,
- angle::Format::ID::D24_UNORM_S8_UINT,
- DXGI_FORMAT_D24_UNORM_S8_UINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_D24_UNORM_S8_UINT,
- DXGI_FORMAT_UNKNOWN,
- GL_RGBA32F,
- nullptr);
- return info;
- }
- }
- case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
- {
- static constexpr Format info(GL_ETC1_RGB8_LOSSY_DECODE_ANGLE,
- angle::Format::ID::BC1_RGB_UNORM_BLOCK,
- DXGI_FORMAT_BC1_UNORM,
- DXGI_FORMAT_BC1_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_BC1_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_ETC1_RGB8_OES:
- {
- static constexpr Format info(GL_ETC1_RGB8_OES,
- angle::Format::ID::R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- GL_RGBA8,
- Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>);
- return info;
- }
- case GL_LUMINANCE16F_EXT:
- {
- static constexpr Format info(GL_LUMINANCE16F_EXT,
- angle::Format::ID::R16G16B16A16_FLOAT,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- GL_RGBA16F,
- Initialize4ComponentData<GLhalf, 0x0000, 0x0000, 0x0000, gl::Float16One>);
- return info;
- }
- case GL_LUMINANCE32F_EXT:
- {
- static constexpr Format info(GL_LUMINANCE32F_EXT,
- angle::Format::ID::R32G32B32A32_FLOAT,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- GL_RGBA32F,
- Initialize4ComponentData<GLfloat, 0x00000000, 0x00000000, 0x00000000, gl::Float32One>);
- return info;
- }
- case GL_LUMINANCE8_ALPHA8_EXT:
- {
- static constexpr Format info(GL_LUMINANCE8_ALPHA8_EXT,
- angle::Format::ID::R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_LUMINANCE8_EXT:
- {
- static constexpr Format info(GL_LUMINANCE8_EXT,
- angle::Format::ID::R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- GL_RGBA8,
- Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>);
- return info;
- }
- case GL_LUMINANCE_ALPHA16F_EXT:
- {
- static constexpr Format info(GL_LUMINANCE_ALPHA16F_EXT,
- angle::Format::ID::R16G16B16A16_FLOAT,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- GL_RGBA16F,
- nullptr);
- return info;
- }
- case GL_LUMINANCE_ALPHA32F_EXT:
- {
- static constexpr Format info(GL_LUMINANCE_ALPHA32F_EXT,
- angle::Format::ID::R32G32B32A32_FLOAT,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- GL_RGBA32F,
- nullptr);
- return info;
- }
- case GL_NONE:
- {
- static constexpr Format info(GL_NONE,
- angle::Format::ID::NONE,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- GL_NONE,
- nullptr);
- return info;
- }
- case GL_R11F_G11F_B10F:
- {
- static constexpr Format info(GL_R11F_G11F_B10F,
- angle::Format::ID::R11G11B10_FLOAT,
- DXGI_FORMAT_R11G11B10_FLOAT,
- DXGI_FORMAT_R11G11B10_FLOAT,
- DXGI_FORMAT_R11G11B10_FLOAT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R11G11B10_FLOAT,
- GL_RGBA16F_EXT,
- nullptr);
- return info;
- }
- case GL_R16F:
- {
- static constexpr Format info(GL_R16F,
- angle::Format::ID::R16_FLOAT,
- DXGI_FORMAT_R16_FLOAT,
- DXGI_FORMAT_R16_FLOAT,
- DXGI_FORMAT_R16_FLOAT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16_FLOAT,
- GL_RGBA16F_EXT,
- nullptr);
- return info;
- }
- case GL_R16I:
- {
- static constexpr Format info(GL_R16I,
- angle::Format::ID::R16_SINT,
- DXGI_FORMAT_R16_SINT,
- DXGI_FORMAT_R16_SINT,
- DXGI_FORMAT_R16_SINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16_SINT,
- GL_RGBA16I,
- nullptr);
- return info;
- }
- case GL_R16UI:
- {
- static constexpr Format info(GL_R16UI,
- angle::Format::ID::R16_UINT,
- DXGI_FORMAT_R16_UINT,
- DXGI_FORMAT_R16_UINT,
- DXGI_FORMAT_R16_UINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16_UINT,
- GL_RGBA16I,
- nullptr);
- return info;
- }
- case GL_R16_EXT:
- {
- static constexpr Format info(GL_R16_EXT,
- angle::Format::ID::R16_UNORM,
- DXGI_FORMAT_R16_UNORM,
- DXGI_FORMAT_R16_UNORM,
- DXGI_FORMAT_R16_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16_UNORM,
- GL_RGBA16_EXT,
- nullptr);
- return info;
- }
- case GL_R16_SNORM_EXT:
- {
- static constexpr Format info(GL_R16_SNORM_EXT,
- angle::Format::ID::R16_SNORM,
- DXGI_FORMAT_R16_SNORM,
- DXGI_FORMAT_R16_SNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16_SNORM,
- GL_RGBA16_SNORM_EXT,
- nullptr);
- return info;
- }
- case GL_R32F:
- {
- static constexpr Format info(GL_R32F,
- angle::Format::ID::R32_FLOAT,
- DXGI_FORMAT_R32_FLOAT,
- DXGI_FORMAT_R32_FLOAT,
- DXGI_FORMAT_R32_FLOAT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R32_FLOAT,
- GL_RGBA32F,
- nullptr);
- return info;
- }
- case GL_R32I:
- {
- static constexpr Format info(GL_R32I,
- angle::Format::ID::R32_SINT,
- DXGI_FORMAT_R32_SINT,
- DXGI_FORMAT_R32_SINT,
- DXGI_FORMAT_R32_SINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R32_SINT,
- GL_RGBA32I,
- nullptr);
- return info;
- }
- case GL_R32UI:
- {
- static constexpr Format info(GL_R32UI,
- angle::Format::ID::R32_UINT,
- DXGI_FORMAT_R32_UINT,
- DXGI_FORMAT_R32_UINT,
- DXGI_FORMAT_R32_UINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R32_UINT,
- GL_RGBA32I,
- nullptr);
- return info;
- }
- case GL_R8:
- {
- static constexpr Format info(GL_R8,
- angle::Format::ID::R8_UNORM,
- DXGI_FORMAT_R8_UNORM,
- DXGI_FORMAT_R8_UNORM,
- DXGI_FORMAT_R8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_R8I:
- {
- static constexpr Format info(GL_R8I,
- angle::Format::ID::R8_SINT,
- DXGI_FORMAT_R8_SINT,
- DXGI_FORMAT_R8_SINT,
- DXGI_FORMAT_R8_SINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8_SINT,
- GL_RGBA8I,
- nullptr);
- return info;
- }
- case GL_R8UI:
- {
- static constexpr Format info(GL_R8UI,
- angle::Format::ID::R8_UINT,
- DXGI_FORMAT_R8_UINT,
- DXGI_FORMAT_R8_UINT,
- DXGI_FORMAT_R8_UINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8_UINT,
- GL_RGBA8I,
- nullptr);
- return info;
- }
- case GL_R8_SNORM:
- {
- static constexpr Format info(GL_R8_SNORM,
- angle::Format::ID::R8_SNORM,
- DXGI_FORMAT_R8_SNORM,
- DXGI_FORMAT_R8_SNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8_SNORM,
- GL_RGBA8_SNORM,
- nullptr);
- return info;
- }
- case GL_RG16F:
- {
- static constexpr Format info(GL_RG16F,
- angle::Format::ID::R16G16_FLOAT,
- DXGI_FORMAT_R16G16_FLOAT,
- DXGI_FORMAT_R16G16_FLOAT,
- DXGI_FORMAT_R16G16_FLOAT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16G16_FLOAT,
- GL_RGBA16F_EXT,
- nullptr);
- return info;
- }
- case GL_RG16I:
- {
- static constexpr Format info(GL_RG16I,
- angle::Format::ID::R16G16_SINT,
- DXGI_FORMAT_R16G16_SINT,
- DXGI_FORMAT_R16G16_SINT,
- DXGI_FORMAT_R16G16_SINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16G16_SINT,
- GL_RGBA16I,
- nullptr);
- return info;
- }
- case GL_RG16UI:
- {
- static constexpr Format info(GL_RG16UI,
- angle::Format::ID::R16G16_UINT,
- DXGI_FORMAT_R16G16_UINT,
- DXGI_FORMAT_R16G16_UINT,
- DXGI_FORMAT_R16G16_UINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16G16_UINT,
- GL_RGBA16I,
- nullptr);
- return info;
- }
- case GL_RG16_EXT:
- {
- static constexpr Format info(GL_RG16_EXT,
- angle::Format::ID::R16G16_UNORM,
- DXGI_FORMAT_R16G16_UNORM,
- DXGI_FORMAT_R16G16_UNORM,
- DXGI_FORMAT_R16G16_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16G16_UNORM,
- GL_RGBA16_EXT,
- nullptr);
- return info;
- }
- case GL_RG16_SNORM_EXT:
- {
- static constexpr Format info(GL_RG16_SNORM_EXT,
- angle::Format::ID::R16G16_SNORM,
- DXGI_FORMAT_R16G16_SNORM,
- DXGI_FORMAT_R16G16_SNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16G16_SNORM,
- GL_RGBA16_SNORM_EXT,
- nullptr);
- return info;
- }
- case GL_RG32F:
- {
- static constexpr Format info(GL_RG32F,
- angle::Format::ID::R32G32_FLOAT,
- DXGI_FORMAT_R32G32_FLOAT,
- DXGI_FORMAT_R32G32_FLOAT,
- DXGI_FORMAT_R32G32_FLOAT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R32G32_FLOAT,
- GL_RGBA32F,
- nullptr);
- return info;
- }
- case GL_RG32I:
- {
- static constexpr Format info(GL_RG32I,
- angle::Format::ID::R32G32_SINT,
- DXGI_FORMAT_R32G32_SINT,
- DXGI_FORMAT_R32G32_SINT,
- DXGI_FORMAT_R32G32_SINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R32G32_SINT,
- GL_RGBA32I,
- nullptr);
- return info;
- }
- case GL_RG32UI:
- {
- static constexpr Format info(GL_RG32UI,
- angle::Format::ID::R32G32_UINT,
- DXGI_FORMAT_R32G32_UINT,
- DXGI_FORMAT_R32G32_UINT,
- DXGI_FORMAT_R32G32_UINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R32G32_UINT,
- GL_RGBA32I,
- nullptr);
- return info;
- }
- case GL_RG8:
- {
- static constexpr Format info(GL_RG8,
- angle::Format::ID::R8G8_UNORM,
- DXGI_FORMAT_R8G8_UNORM,
- DXGI_FORMAT_R8G8_UNORM,
- DXGI_FORMAT_R8G8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_RG8I:
- {
- static constexpr Format info(GL_RG8I,
- angle::Format::ID::R8G8_SINT,
- DXGI_FORMAT_R8G8_SINT,
- DXGI_FORMAT_R8G8_SINT,
- DXGI_FORMAT_R8G8_SINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8_SINT,
- GL_RGBA8I,
- nullptr);
- return info;
- }
- case GL_RG8UI:
- {
- static constexpr Format info(GL_RG8UI,
- angle::Format::ID::R8G8_UINT,
- DXGI_FORMAT_R8G8_UINT,
- DXGI_FORMAT_R8G8_UINT,
- DXGI_FORMAT_R8G8_UINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8_UINT,
- GL_RGBA8I,
- nullptr);
- return info;
- }
- case GL_RG8_SNORM:
- {
- static constexpr Format info(GL_RG8_SNORM,
- angle::Format::ID::R8G8_SNORM,
- DXGI_FORMAT_R8G8_SNORM,
- DXGI_FORMAT_R8G8_SNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8_SNORM,
- GL_RGBA8_SNORM,
- nullptr);
- return info;
- }
- case GL_RGB:
- {
- static constexpr Format info(GL_RGB,
- angle::Format::ID::R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- GL_RGBA8,
- Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>);
- return info;
- }
- case GL_RGB10_A2:
- {
- static constexpr Format info(GL_RGB10_A2,
- angle::Format::ID::R10G10B10A2_UNORM,
- DXGI_FORMAT_R10G10B10A2_UNORM,
- DXGI_FORMAT_R10G10B10A2_UNORM,
- DXGI_FORMAT_R10G10B10A2_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R10G10B10A2_UNORM,
- GL_RGBA16_EXT,
- nullptr);
- return info;
- }
- case GL_RGB10_A2UI:
- {
- static constexpr Format info(GL_RGB10_A2UI,
- angle::Format::ID::R10G10B10A2_UINT,
- DXGI_FORMAT_R10G10B10A2_UINT,
- DXGI_FORMAT_R10G10B10A2_UINT,
- DXGI_FORMAT_R10G10B10A2_UINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R10G10B10A2_UINT,
- GL_RGBA16I,
- nullptr);
- return info;
- }
- case GL_RGB16F:
- {
- static constexpr Format info(GL_RGB16F,
- angle::Format::ID::R16G16B16A16_FLOAT,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- GL_RGBA16F,
- Initialize4ComponentData<GLhalf, 0x0000, 0x0000, 0x0000, gl::Float16One>);
- return info;
- }
- case GL_RGB16I:
- {
- static constexpr Format info(GL_RGB16I,
- angle::Format::ID::R16G16B16A16_SINT,
- DXGI_FORMAT_R16G16B16A16_SINT,
- DXGI_FORMAT_R16G16B16A16_SINT,
- DXGI_FORMAT_R16G16B16A16_SINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16G16B16A16_SINT,
- GL_RGBA16I,
- Initialize4ComponentData<GLshort, 0x0000, 0x0000, 0x0000, 0x0001>);
- return info;
- }
- case GL_RGB16UI:
- {
- static constexpr Format info(GL_RGB16UI,
- angle::Format::ID::R16G16B16A16_UINT,
- DXGI_FORMAT_R16G16B16A16_UINT,
- DXGI_FORMAT_R16G16B16A16_UINT,
- DXGI_FORMAT_R16G16B16A16_UINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16G16B16A16_UINT,
- GL_RGBA16UI,
- Initialize4ComponentData<GLushort, 0x0000, 0x0000, 0x0000, 0x0001>);
- return info;
- }
- case GL_RGB16_EXT:
- {
- static constexpr Format info(GL_RGB16_EXT,
- angle::Format::ID::R16G16B16A16_UNORM,
- DXGI_FORMAT_R16G16B16A16_UNORM,
- DXGI_FORMAT_R16G16B16A16_UNORM,
- DXGI_FORMAT_R16G16B16A16_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16G16B16A16_UNORM,
- GL_RGBA16_EXT,
- Initialize4ComponentData<GLubyte, 0x0000, 0x0000, 0x0000, 0xFFFF>);
- return info;
- }
- case GL_RGB16_SNORM_EXT:
- {
- static constexpr Format info(GL_RGB16_SNORM_EXT,
- angle::Format::ID::R16G16B16A16_SNORM,
- DXGI_FORMAT_R16G16B16A16_SNORM,
- DXGI_FORMAT_R16G16B16A16_SNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16G16B16A16_SNORM,
- GL_RGBA16_SNORM_EXT,
- Initialize4ComponentData<GLushort, 0x0000, 0x0000, 0x0000, 0x7FFF>);
- return info;
- }
- case GL_RGB32F:
- {
- static constexpr Format info(GL_RGB32F,
- angle::Format::ID::R32G32B32A32_FLOAT,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- GL_RGBA32F,
- Initialize4ComponentData<GLfloat, 0x00000000, 0x00000000, 0x00000000, gl::Float32One>);
- return info;
- }
- case GL_RGB32I:
- {
- static constexpr Format info(GL_RGB32I,
- angle::Format::ID::R32G32B32A32_SINT,
- DXGI_FORMAT_R32G32B32A32_SINT,
- DXGI_FORMAT_R32G32B32A32_SINT,
- DXGI_FORMAT_R32G32B32A32_SINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R32G32B32A32_SINT,
- GL_RGBA32I,
- Initialize4ComponentData<GLint, 0x00000000, 0x00000000, 0x00000000, 0x00000001>);
- return info;
- }
- case GL_RGB32UI:
- {
- static constexpr Format info(GL_RGB32UI,
- angle::Format::ID::R32G32B32A32_UINT,
- DXGI_FORMAT_R32G32B32A32_UINT,
- DXGI_FORMAT_R32G32B32A32_UINT,
- DXGI_FORMAT_R32G32B32A32_UINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R32G32B32A32_UINT,
- GL_RGBA32UI,
- Initialize4ComponentData<GLuint, 0x00000000, 0x00000000, 0x00000000, 0x00000001>);
- return info;
- }
- case GL_RGB565:
- {
- if (SupportsFormat(DXGI_FORMAT_B5G6R5_UNORM, deviceCaps))
- {
- static constexpr Format info(GL_RGB565,
- angle::Format::ID::B5G6R5_UNORM,
- DXGI_FORMAT_B5G6R5_UNORM,
- DXGI_FORMAT_B5G6R5_UNORM,
- DXGI_FORMAT_B5G6R5_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_B5G6R5_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- else
- {
- static constexpr Format info(GL_RGB565,
- angle::Format::ID::R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- GL_RGBA8,
- Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>);
- return info;
- }
- }
- case GL_RGB5_A1:
- {
- if (SupportsFormat(DXGI_FORMAT_B5G5R5A1_UNORM, deviceCaps))
- {
- static constexpr Format info(GL_RGB5_A1,
- angle::Format::ID::B5G5R5A1_UNORM,
- DXGI_FORMAT_B5G5R5A1_UNORM,
- DXGI_FORMAT_B5G5R5A1_UNORM,
- DXGI_FORMAT_B5G5R5A1_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_B5G5R5A1_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- else
- {
- static constexpr Format info(GL_RGB5_A1,
- angle::Format::ID::R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- }
- case GL_RGB8:
- {
- static constexpr Format info(GL_RGB8,
- angle::Format::ID::R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- GL_RGBA8,
- Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>);
- return info;
- }
- case GL_RGB8I:
- {
- static constexpr Format info(GL_RGB8I,
- angle::Format::ID::R8G8B8A8_SINT,
- DXGI_FORMAT_R8G8B8A8_SINT,
- DXGI_FORMAT_R8G8B8A8_SINT,
- DXGI_FORMAT_R8G8B8A8_SINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_SINT,
- GL_RGBA8I,
- Initialize4ComponentData<GLbyte, 0x00, 0x00, 0x00, 0x01>);
- return info;
- }
- case GL_RGB8UI:
- {
- static constexpr Format info(GL_RGB8UI,
- angle::Format::ID::R8G8B8A8_UINT,
- DXGI_FORMAT_R8G8B8A8_UINT,
- DXGI_FORMAT_R8G8B8A8_UINT,
- DXGI_FORMAT_R8G8B8A8_UINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UINT,
- GL_RGBA8UI,
- Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0x01>);
- return info;
- }
- case GL_RGB8_SNORM:
- {
- static constexpr Format info(GL_RGB8_SNORM,
- angle::Format::ID::R8G8B8A8_SNORM,
- DXGI_FORMAT_R8G8B8A8_SNORM,
- DXGI_FORMAT_R8G8B8A8_SNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_SNORM,
- GL_RGBA8_SNORM,
- Initialize4ComponentData<GLbyte, 0x00, 0x00, 0x00, 0x7F>);
- return info;
- }
- case GL_RGB9_E5:
- {
- static constexpr Format info(GL_RGB9_E5,
- angle::Format::ID::R9G9B9E5_SHAREDEXP,
- DXGI_FORMAT_R9G9B9E5_SHAREDEXP,
- DXGI_FORMAT_R9G9B9E5_SHAREDEXP,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R9G9B9E5_SHAREDEXP,
- GL_RGBA16F_EXT,
- nullptr);
- return info;
- }
- case GL_RGBA:
- {
- static constexpr Format info(GL_RGBA,
- angle::Format::ID::R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_RGBA16F:
- {
- static constexpr Format info(GL_RGBA16F,
- angle::Format::ID::R16G16B16A16_FLOAT,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16G16B16A16_FLOAT,
- GL_RGBA16F,
- nullptr);
- return info;
- }
- case GL_RGBA16I:
- {
- static constexpr Format info(GL_RGBA16I,
- angle::Format::ID::R16G16B16A16_SINT,
- DXGI_FORMAT_R16G16B16A16_SINT,
- DXGI_FORMAT_R16G16B16A16_SINT,
- DXGI_FORMAT_R16G16B16A16_SINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16G16B16A16_SINT,
- GL_RGBA16I,
- nullptr);
- return info;
- }
- case GL_RGBA16UI:
- {
- static constexpr Format info(GL_RGBA16UI,
- angle::Format::ID::R16G16B16A16_UINT,
- DXGI_FORMAT_R16G16B16A16_UINT,
- DXGI_FORMAT_R16G16B16A16_UINT,
- DXGI_FORMAT_R16G16B16A16_UINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16G16B16A16_UINT,
- GL_RGBA16UI,
- nullptr);
- return info;
- }
- case GL_RGBA16_EXT:
- {
- static constexpr Format info(GL_RGBA16_EXT,
- angle::Format::ID::R16G16B16A16_UNORM,
- DXGI_FORMAT_R16G16B16A16_UNORM,
- DXGI_FORMAT_R16G16B16A16_UNORM,
- DXGI_FORMAT_R16G16B16A16_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16G16B16A16_UNORM,
- GL_RGBA16_EXT,
- nullptr);
- return info;
- }
- case GL_RGBA16_SNORM_EXT:
- {
- static constexpr Format info(GL_RGBA16_SNORM_EXT,
- angle::Format::ID::R16G16B16A16_SNORM,
- DXGI_FORMAT_R16G16B16A16_SNORM,
- DXGI_FORMAT_R16G16B16A16_SNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R16G16B16A16_SNORM,
- GL_RGBA16_SNORM_EXT,
- nullptr);
- return info;
- }
- case GL_RGBA32F:
- {
- static constexpr Format info(GL_RGBA32F,
- angle::Format::ID::R32G32B32A32_FLOAT,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R32G32B32A32_FLOAT,
- GL_RGBA32F,
- nullptr);
- return info;
- }
- case GL_RGBA32I:
- {
- static constexpr Format info(GL_RGBA32I,
- angle::Format::ID::R32G32B32A32_SINT,
- DXGI_FORMAT_R32G32B32A32_SINT,
- DXGI_FORMAT_R32G32B32A32_SINT,
- DXGI_FORMAT_R32G32B32A32_SINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R32G32B32A32_SINT,
- GL_RGBA32I,
- nullptr);
- return info;
- }
- case GL_RGBA32UI:
- {
- static constexpr Format info(GL_RGBA32UI,
- angle::Format::ID::R32G32B32A32_UINT,
- DXGI_FORMAT_R32G32B32A32_UINT,
- DXGI_FORMAT_R32G32B32A32_UINT,
- DXGI_FORMAT_R32G32B32A32_UINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R32G32B32A32_UINT,
- GL_RGBA32UI,
- nullptr);
- return info;
- }
- case GL_RGBA4:
- {
- if (SupportsFormat(DXGI_FORMAT_B4G4R4A4_UNORM, deviceCaps))
- {
- static constexpr Format info(GL_RGBA4,
- angle::Format::ID::B4G4R4A4_UNORM,
- DXGI_FORMAT_B4G4R4A4_UNORM,
- DXGI_FORMAT_B4G4R4A4_UNORM,
- DXGI_FORMAT_B4G4R4A4_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_B4G4R4A4_UNORM,
- GL_RGBA4,
- nullptr);
- return info;
- }
- else
- {
- static constexpr Format info(GL_RGBA4,
- angle::Format::ID::R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- }
- case GL_RGBA8:
- {
- static constexpr Format info(GL_RGBA8,
- angle::Format::ID::R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM,
- GL_RGBA8,
- nullptr);
- return info;
- }
- case GL_RGBA8I:
- {
- static constexpr Format info(GL_RGBA8I,
- angle::Format::ID::R8G8B8A8_SINT,
- DXGI_FORMAT_R8G8B8A8_SINT,
- DXGI_FORMAT_R8G8B8A8_SINT,
- DXGI_FORMAT_R8G8B8A8_SINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_SINT,
- GL_RGBA8I,
- nullptr);
- return info;
- }
- case GL_RGBA8UI:
- {
- static constexpr Format info(GL_RGBA8UI,
- angle::Format::ID::R8G8B8A8_UINT,
- DXGI_FORMAT_R8G8B8A8_UINT,
- DXGI_FORMAT_R8G8B8A8_UINT,
- DXGI_FORMAT_R8G8B8A8_UINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UINT,
- GL_RGBA8UI,
- nullptr);
- return info;
- }
- case GL_RGBA8_SNORM:
- {
- static constexpr Format info(GL_RGBA8_SNORM,
- angle::Format::ID::R8G8B8A8_SNORM,
- DXGI_FORMAT_R8G8B8A8_SNORM,
- DXGI_FORMAT_R8G8B8A8_SNORM,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_SNORM,
- GL_RGBA8_SNORM,
- nullptr);
- return info;
- }
- case GL_SRGB8:
- {
- static constexpr Format info(GL_SRGB8,
- angle::Format::ID::R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- GL_SRGB8_ALPHA8,
- Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>);
- return info;
- }
- case GL_SRGB8_ALPHA8:
- {
- static constexpr Format info(GL_SRGB8_ALPHA8,
- angle::Format::ID::R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
- GL_SRGB8_ALPHA8,
- nullptr);
- return info;
- }
- case GL_STENCIL_INDEX8:
- {
- if (OnlyFL10Plus(deviceCaps))
- {
- static constexpr Format info(GL_STENCIL_INDEX8,
- angle::Format::ID::D24_UNORM_S8_UINT,
- DXGI_FORMAT_R24G8_TYPELESS,
- DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_D24_UNORM_S8_UINT,
- DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
- GL_RGBA32F,
- nullptr);
- return info;
- }
- else
- {
- static constexpr Format info(GL_STENCIL_INDEX8,
- angle::Format::ID::D24_UNORM_S8_UINT,
- DXGI_FORMAT_D24_UNORM_S8_UINT,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_UNKNOWN,
- DXGI_FORMAT_D24_UNORM_S8_UINT,
- DXGI_FORMAT_UNKNOWN,
- GL_RGBA32F,
- nullptr);
- return info;
- }
- }
-
- default:
- break;
- }
- // clang-format on
-
- UNREACHABLE();
- static constexpr Format defaultInfo;
- return defaultInfo;
-}
-
-} // namespace d3d11
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_utils.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_utils.h
deleted file mode 100644
index d5351ff882..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_utils.h
+++ /dev/null
@@ -1,85 +0,0 @@
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Helper routines for the D3D11 texture format table.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_TEXTURE_FORMAT_TABLE_UTILS_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_TEXTURE_FORMAT_TABLE_UTILS_H_
-
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-
-namespace rx
-{
-
-namespace d3d11
-{
-
-using FormatSupportFunction = bool (*)(const Renderer11DeviceCaps &);
-
-inline bool OnlyFL10Plus(const Renderer11DeviceCaps &deviceCaps)
-{
- return (deviceCaps.featureLevel >= D3D_FEATURE_LEVEL_10_0);
-}
-
-inline bool OnlyFL9_3(const Renderer11DeviceCaps &deviceCaps)
-{
- return (deviceCaps.featureLevel == D3D_FEATURE_LEVEL_9_3);
-}
-
-inline bool SupportsFormat(DXGI_FORMAT format, const Renderer11DeviceCaps &deviceCaps)
-{
- // Must support texture, SRV and RTV support
- UINT mustSupport = D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_TEXTURECUBE |
- D3D11_FORMAT_SUPPORT_SHADER_SAMPLE | D3D11_FORMAT_SUPPORT_MIP |
- D3D11_FORMAT_SUPPORT_RENDER_TARGET;
- UINT minimumRequiredSamples = 0;
-
- if (d3d11_gl::GetMaximumClientVersion(deviceCaps.featureLevel).major > 2)
- {
- mustSupport |= D3D11_FORMAT_SUPPORT_TEXTURE3D;
-
- // RGBA4, RGB5A1 and RGB565 are all required multisampled renderbuffer formats in ES3 and
- // need to support a minimum of 4 samples.
- minimumRequiredSamples = 4;
- }
-
- bool fullSupport = false;
- if (format == DXGI_FORMAT_B5G6R5_UNORM)
- {
- // All hardware that supports DXGI_FORMAT_B5G6R5_UNORM should support autogen mipmaps, but
- // check anyway.
- mustSupport |= D3D11_FORMAT_SUPPORT_MIP_AUTOGEN;
- fullSupport = ((deviceCaps.B5G6R5support & mustSupport) == mustSupport) &&
- deviceCaps.B5G6R5maxSamples >= minimumRequiredSamples;
- }
- else if (format == DXGI_FORMAT_B4G4R4A4_UNORM)
- {
- fullSupport = ((deviceCaps.B4G4R4A4support & mustSupport) == mustSupport) &&
- deviceCaps.B4G4R4A4maxSamples >= minimumRequiredSamples;
- }
- else if (format == DXGI_FORMAT_B5G5R5A1_UNORM)
- {
- fullSupport = ((deviceCaps.B5G5R5A1support & mustSupport) == mustSupport) &&
- deviceCaps.B5G5R5A1maxSamples >= minimumRequiredSamples;
- }
- else
- {
- UNREACHABLE();
- return false;
- }
-
- // This means that ANGLE would like to use the entry in the map if the inputted DXGI format
- // *IS* supported.
- // e.g. the entry might map GL_RGB5_A1 to DXGI_FORMAT_B5G5R5A1, which should only be used if
- // DXGI_FORMAT_B5G5R5A1 is supported.
- // In this case, we should only return 'true' if the format *IS* supported.
- return fullSupport;
-}
-
-} // namespace d3d11
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_TEXTURE_FORMAT_TABLE_UTILS_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.cpp
deleted file mode 100644
index f5e6c93813..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.cpp
+++ /dev/null
@@ -1,217 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// NativeWindow11Win32.cpp: Implementation of NativeWindow11 using win32 window APIs.
-
-#include "libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-
-#include "common/debug.h"
-
-#include <initguid.h>
-#include <dcomp.h>
-
-namespace rx
-{
-
-NativeWindow11Win32::NativeWindow11Win32(EGLNativeWindowType window,
- bool hasAlpha,
- bool directComposition)
- : NativeWindow11(window),
- mDirectComposition(directComposition),
- mHasAlpha(hasAlpha),
- mDevice(nullptr),
- mCompositionTarget(nullptr),
- mVisual(nullptr)
-{
-}
-
-NativeWindow11Win32::~NativeWindow11Win32()
-{
- SafeRelease(mCompositionTarget);
- SafeRelease(mDevice);
- SafeRelease(mVisual);
-}
-
-bool NativeWindow11Win32::initialize()
-{
- return true;
-}
-
-bool NativeWindow11Win32::getClientRect(LPRECT rect) const
-{
- return GetClientRect(getNativeWindow(), rect) == TRUE;
-}
-
-bool NativeWindow11Win32::isIconic() const
-{
- return IsIconic(getNativeWindow()) == TRUE;
-}
-
-HRESULT NativeWindow11Win32::createSwapChain(ID3D11Device *device,
- IDXGIFactory *factory,
- DXGI_FORMAT format,
- UINT width,
- UINT height,
- UINT samples,
- IDXGISwapChain **swapChain)
-{
- if (device == nullptr || factory == nullptr || swapChain == nullptr || width == 0 ||
- height == 0)
- {
- return E_INVALIDARG;
- }
-
- if (mDirectComposition)
- {
- HMODULE dcomp = ::GetModuleHandle(TEXT("dcomp.dll"));
- if (!dcomp)
- {
- return E_INVALIDARG;
- }
-
- typedef HRESULT(WINAPI * PFN_DCOMPOSITION_CREATE_DEVICE)(
- IDXGIDevice * dxgiDevice, REFIID iid, void **dcompositionDevice);
- PFN_DCOMPOSITION_CREATE_DEVICE createDComp =
- reinterpret_cast<PFN_DCOMPOSITION_CREATE_DEVICE>(
- GetProcAddress(dcomp, "DCompositionCreateDevice"));
- if (!createDComp)
- {
- return E_INVALIDARG;
- }
-
- if (!mDevice)
- {
- IDXGIDevice *dxgiDevice = d3d11::DynamicCastComObject<IDXGIDevice>(device);
- HRESULT result = createDComp(dxgiDevice, __uuidof(IDCompositionDevice),
- reinterpret_cast<void **>(&mDevice));
- SafeRelease(dxgiDevice);
-
- if (FAILED(result))
- {
- return result;
- }
- }
-
- if (!mCompositionTarget)
- {
- HRESULT result =
- mDevice->CreateTargetForHwnd(getNativeWindow(), TRUE, &mCompositionTarget);
- if (FAILED(result))
- {
- return result;
- }
- }
-
- if (!mVisual)
- {
- HRESULT result = mDevice->CreateVisual(&mVisual);
- if (FAILED(result))
- {
- return result;
- }
- }
-
- IDXGIFactory2 *factory2 = d3d11::DynamicCastComObject<IDXGIFactory2>(factory);
- DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};
- swapChainDesc.Width = width;
- swapChainDesc.Height = height;
- swapChainDesc.Format = format;
- swapChainDesc.Stereo = FALSE;
- swapChainDesc.SampleDesc.Count = 1;
- swapChainDesc.SampleDesc.Quality = 0;
- swapChainDesc.BufferUsage =
- DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_BACK_BUFFER | DXGI_USAGE_SHADER_INPUT;
- swapChainDesc.BufferCount = 2;
- swapChainDesc.Scaling = DXGI_SCALING_STRETCH;
- swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
- swapChainDesc.AlphaMode =
- mHasAlpha ? DXGI_ALPHA_MODE_PREMULTIPLIED : DXGI_ALPHA_MODE_IGNORE;
- swapChainDesc.Flags = 0;
- IDXGISwapChain1 *swapChain1 = nullptr;
- HRESULT result =
- factory2->CreateSwapChainForComposition(device, &swapChainDesc, nullptr, &swapChain1);
- if (SUCCEEDED(result))
- {
- *swapChain = static_cast<IDXGISwapChain *>(swapChain1);
- }
- mVisual->SetContent(swapChain1);
- mCompositionTarget->SetRoot(mVisual);
- SafeRelease(factory2);
- return result;
- }
-
- // Use IDXGIFactory2::CreateSwapChainForHwnd if DXGI 1.2 is available to create a
- // DXGI_SWAP_EFFECT_SEQUENTIAL swap chain.
- IDXGIFactory2 *factory2 = d3d11::DynamicCastComObject<IDXGIFactory2>(factory);
- if (factory2 != nullptr)
- {
- DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};
- swapChainDesc.Width = width;
- swapChainDesc.Height = height;
- swapChainDesc.Format = format;
- swapChainDesc.Stereo = FALSE;
- swapChainDesc.SampleDesc.Count = samples;
- swapChainDesc.SampleDesc.Quality = 0;
- swapChainDesc.BufferUsage =
- DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_BACK_BUFFER;
- swapChainDesc.BufferCount = 1;
- swapChainDesc.Scaling = DXGI_SCALING_STRETCH;
- swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_SEQUENTIAL;
- swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED;
- swapChainDesc.Flags = 0;
- IDXGISwapChain1 *swapChain1 = nullptr;
- HRESULT result = factory2->CreateSwapChainForHwnd(device, getNativeWindow(), &swapChainDesc,
- nullptr, nullptr, &swapChain1);
- if (SUCCEEDED(result))
- {
- factory2->MakeWindowAssociation(getNativeWindow(), DXGI_MWA_NO_WINDOW_CHANGES);
- *swapChain = static_cast<IDXGISwapChain *>(swapChain1);
- }
- SafeRelease(factory2);
- return result;
- }
-
- DXGI_SWAP_CHAIN_DESC swapChainDesc = {};
- swapChainDesc.BufferCount = 1;
- swapChainDesc.BufferDesc.Format = format;
- swapChainDesc.BufferDesc.Width = width;
- swapChainDesc.BufferDesc.Height = height;
- swapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
- swapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
- swapChainDesc.BufferDesc.RefreshRate.Numerator = 0;
- swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
- swapChainDesc.BufferUsage =
- DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_BACK_BUFFER;
- swapChainDesc.Flags = 0;
- swapChainDesc.OutputWindow = getNativeWindow();
- swapChainDesc.SampleDesc.Count = samples;
- swapChainDesc.SampleDesc.Quality = 0;
- swapChainDesc.Windowed = TRUE;
- swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
-
- HRESULT result = factory->CreateSwapChain(device, &swapChainDesc, swapChain);
- if (SUCCEEDED(result))
- {
- factory->MakeWindowAssociation(getNativeWindow(), DXGI_MWA_NO_WINDOW_CHANGES);
- }
- return result;
-}
-
-void NativeWindow11Win32::commitChange()
-{
- if (mDevice)
- {
- mDevice->Commit();
- }
-}
-
-// static
-bool NativeWindow11Win32::IsValidNativeWindow(EGLNativeWindowType window)
-{
- return IsWindow(window) == TRUE;
-}
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.h
deleted file mode 100644
index baeba6a347..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.h
+++ /dev/null
@@ -1,53 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// NativeWindow11Win32.h: Implementation of NativeWindow11 using win32 window APIs.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_WIN32_NATIVEWINDOW11WIN32_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_WIN32_NATIVEWINDOW11WIN32_H_
-
-#include "libANGLE/renderer/d3d/d3d11/NativeWindow11.h"
-
-typedef interface IDCompositionDevice IDCompositionDevice;
-typedef interface IDCompositionTarget IDCompositionTarget;
-typedef interface IDCompositionVisual IDCompositionVisual;
-
-namespace rx
-{
-
-class NativeWindow11Win32 : public NativeWindow11
-{
- public:
- NativeWindow11Win32(EGLNativeWindowType window, bool hasAlpha, bool directComposition);
- ~NativeWindow11Win32() override;
-
- bool initialize() override;
- bool getClientRect(LPRECT rect) const override;
- bool isIconic() const override;
-
- HRESULT createSwapChain(ID3D11Device *device,
- IDXGIFactory *factory,
- DXGI_FORMAT format,
- UINT width,
- UINT height,
- UINT samples,
- IDXGISwapChain **swapChain) override;
-
- void commitChange() override;
-
- static bool IsValidNativeWindow(EGLNativeWindowType window);
-
- private:
- bool mDirectComposition;
- bool mHasAlpha;
- IDCompositionDevice *mDevice;
- IDCompositionTarget *mCompositionTarget;
- IDCompositionVisual *mVisual;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_WIN32_NATIVEWINDOW11WIN32_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.cpp
deleted file mode 100644
index 1ef90e7b09..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.cpp
+++ /dev/null
@@ -1,208 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// CoreWindowNativeWindow.cpp: NativeWindow for managing ICoreWindow native window types.
-
-#include "libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h"
-
-#include <windows.graphics.display.h>
-
-using namespace ABI::Windows::Foundation::Collections;
-
-namespace rx
-{
-CoreWindowNativeWindow::~CoreWindowNativeWindow()
-{
- unregisterForSizeChangeEvents();
-}
-
-bool CoreWindowNativeWindow::initialize(EGLNativeWindowType window, IPropertySet *propertySet)
-{
- ComPtr<IPropertySet> props = propertySet;
- ComPtr<IInspectable> win = window;
- SIZE swapChainSize = {};
- HRESULT result = S_OK;
-
- // IPropertySet is an optional parameter and can be null.
- // If one is specified, cache as an IMap and read the properties
- // used for initial host initialization.
- if (propertySet)
- {
- result = props.As(&mPropertyMap);
- if (FAILED(result))
- {
- return false;
- }
-
- // The EGLRenderSurfaceSizeProperty is optional and may be missing. The IPropertySet
- // was prevalidated to contain the EGLNativeWindowType before being passed to
- // this host.
- result = GetOptionalSizePropertyValue(mPropertyMap, EGLRenderSurfaceSizeProperty, &swapChainSize, &mSwapChainSizeSpecified);
- if (FAILED(result))
- {
- return false;
- }
-
- // The EGLRenderResolutionScaleProperty is optional and may be missing. The IPropertySet
- // was prevalidated to contain the EGLNativeWindowType before being passed to
- // this host.
- result = GetOptionalSinglePropertyValue(mPropertyMap, EGLRenderResolutionScaleProperty, &mSwapChainScale, &mSwapChainScaleSpecified);
- if (FAILED(result))
- {
- return false;
- }
-
- if (!mSwapChainScaleSpecified)
- {
- // Default value for the scale is 1.0f
- mSwapChainScale = 1.0f;
- }
-
- // A EGLRenderSurfaceSizeProperty and a EGLRenderResolutionScaleProperty can't both be specified
- if (mSwapChainScaleSpecified && mSwapChainSizeSpecified)
- {
- ERR() << "It is invalid to specify both an EGLRenderSurfaceSizeProperty and a "
- "EGLRenderResolutionScaleProperty.";
- return false;
- }
- }
-
- if (SUCCEEDED(result))
- {
- result = win.As(&mCoreWindow);
- }
-
- if (SUCCEEDED(result))
- {
- // If a swapchain size is specfied, then the automatic resize
- // behaviors implemented by the host should be disabled. The swapchain
- // will be still be scaled when being rendered to fit the bounds
- // of the host.
- // Scaling of the swapchain output occurs automatically because if
- // the scaling mode setting DXGI_SCALING_STRETCH on the swapchain.
- if (mSwapChainSizeSpecified)
- {
- mClientRect = { 0, 0, swapChainSize.cx, swapChainSize.cy };
- }
- else
- {
- Size coreWindowSize;
- result = GetCoreWindowSizeInPixels(mCoreWindow, &coreWindowSize);
-
- if (SUCCEEDED(result))
- {
- mClientRect = clientRect(coreWindowSize);
- }
- }
- }
-
- if (SUCCEEDED(result))
- {
- mNewClientRect = mClientRect;
- mClientRectChanged = false;
- return registerForSizeChangeEvents();
- }
-
- return false;
-}
-
-bool CoreWindowNativeWindow::registerForSizeChangeEvents()
-{
- ComPtr<IWindowSizeChangedEventHandler> sizeChangedHandler;
- HRESULT result = Microsoft::WRL::MakeAndInitialize<CoreWindowSizeChangedHandler>(sizeChangedHandler.ReleaseAndGetAddressOf(), this->shared_from_this());
- if (SUCCEEDED(result))
- {
- result = mCoreWindow->add_SizeChanged(sizeChangedHandler.Get(), &mSizeChangedEventToken);
- }
-
- if (SUCCEEDED(result))
- {
- return true;
- }
-
- return false;
-}
-
-void CoreWindowNativeWindow::unregisterForSizeChangeEvents()
-{
- if (mCoreWindow)
- {
- (void)mCoreWindow->remove_SizeChanged(mSizeChangedEventToken);
- }
- mSizeChangedEventToken.value = 0;
-}
-
-HRESULT CoreWindowNativeWindow::createSwapChain(ID3D11Device *device,
- IDXGIFactory2 *factory,
- DXGI_FORMAT format,
- unsigned int width,
- unsigned int height,
- bool containsAlpha,
- IDXGISwapChain1 **swapChain)
-{
- if (device == nullptr || factory == nullptr || swapChain == nullptr || width == 0 ||
- height == 0)
- {
- return E_INVALIDARG;
- }
-
- DXGI_SWAP_CHAIN_DESC1 swapChainDesc = { 0 };
- swapChainDesc.Width = width;
- swapChainDesc.Height = height;
- swapChainDesc.Format = format;
- swapChainDesc.Stereo = FALSE;
- swapChainDesc.SampleDesc.Count = 1;
- swapChainDesc.SampleDesc.Quality = 0;
- swapChainDesc.BufferUsage =
- DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_BACK_BUFFER;
- swapChainDesc.BufferCount = 2;
- swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
- swapChainDesc.Scaling = DXGI_SCALING_STRETCH;
- swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED;
-
- *swapChain = nullptr;
-
- ComPtr<IDXGISwapChain1> newSwapChain;
- HRESULT result = factory->CreateSwapChainForCoreWindow(device, mCoreWindow.Get(), &swapChainDesc, nullptr, newSwapChain.ReleaseAndGetAddressOf());
- if (SUCCEEDED(result))
- {
- result = newSwapChain.CopyTo(swapChain);
- }
-
- if (SUCCEEDED(result))
- {
- // If automatic swapchain resize behaviors have been disabled, then
- // unregister for the resize change events.
- if (mSupportsSwapChainResize == false)
- {
- unregisterForSizeChangeEvents();
- }
- }
-
- return result;
-}
-
-inline HRESULT CoreWindowNativeWindow::scaleSwapChain(const Size &windowSize,
- const RECT &clientRect)
-{
- // We don't need to do any additional work to scale CoreWindow swapchains.
- // Using DXGI_SCALING_STRETCH to create the swapchain above does all the necessary work.
- return S_OK;
-}
-
-HRESULT GetCoreWindowSizeInPixels(const ComPtr<ABI::Windows::UI::Core::ICoreWindow> &coreWindow,
- Size *windowSize)
-{
- ABI::Windows::Foundation::Rect bounds;
- HRESULT result = coreWindow->get_Bounds(&bounds);
- if (SUCCEEDED(result))
- {
- *windowSize = { ConvertDipsToPixels(bounds.Width), ConvertDipsToPixels(bounds.Height) };
- }
-
- return result;
-}
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h
deleted file mode 100644
index 21855c2c3b..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h
+++ /dev/null
@@ -1,90 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// CoreWindowNativeWindow.h: NativeWindow for managing ICoreWindow native window types.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_WINRT_COREWINDOWNATIVEWINDOW_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_WINRT_COREWINDOWNATIVEWINDOW_H_
-
-#include "libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h"
-
-#include <memory>
-
-#include <EGL/eglplatform.h>
-
-typedef ABI::Windows::Foundation::__FITypedEventHandler_2_Windows__CUI__CCore__CCoreWindow_Windows__CUI__CCore__CWindowSizeChangedEventArgs_t IWindowSizeChangedEventHandler;
-
-namespace rx
-{
-class CoreWindowNativeWindow : public InspectableNativeWindow, public std::enable_shared_from_this<CoreWindowNativeWindow>
-{
- public:
- ~CoreWindowNativeWindow();
-
- bool initialize(EGLNativeWindowType window, IPropertySet *propertySet) override;
- HRESULT createSwapChain(ID3D11Device *device,
- IDXGIFactory2 *factory,
- DXGI_FORMAT format,
- unsigned int width,
- unsigned int height,
- bool containsAlpha,
- IDXGISwapChain1 **swapChain) override;
-
- protected:
- HRESULT scaleSwapChain(const Size &windowSize, const RECT &clientRect) override;
-
- bool registerForSizeChangeEvents();
- void unregisterForSizeChangeEvents();
-
- private:
- ComPtr<ABI::Windows::UI::Core::ICoreWindow> mCoreWindow;
- ComPtr<IMap<HSTRING, IInspectable*>> mPropertyMap;
-};
-
-[uuid(7F924F66-EBAE-40E5-A10B-B8F35E245190)]
-class CoreWindowSizeChangedHandler :
- public Microsoft::WRL::RuntimeClass<Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::ClassicCom>, IWindowSizeChangedEventHandler>
-{
- public:
- CoreWindowSizeChangedHandler() { }
- HRESULT RuntimeClassInitialize(std::shared_ptr<InspectableNativeWindow> host)
- {
- if (!host)
- {
- return E_INVALIDARG;
- }
-
- mHost = host;
- return S_OK;
- }
-
- // IWindowSizeChangedEventHandler
- IFACEMETHOD(Invoke)(ABI::Windows::UI::Core::ICoreWindow *sender, ABI::Windows::UI::Core::IWindowSizeChangedEventArgs *sizeChangedEventArgs)
- {
- std::shared_ptr<InspectableNativeWindow> host = mHost.lock();
- if (host)
- {
- ABI::Windows::Foundation::Size windowSize;
- if (SUCCEEDED(sizeChangedEventArgs->get_Size(&windowSize)))
- {
- Size windowSizeInPixels = {ConvertDipsToPixels(windowSize.Width),
- ConvertDipsToPixels(windowSize.Height)};
- host->setNewClientSize(windowSizeInPixels);
- }
- }
-
- return S_OK;
- }
-
- private:
- std::weak_ptr<InspectableNativeWindow> mHost;
-};
-
-HRESULT GetCoreWindowSizeInPixels(const ComPtr<ABI::Windows::UI::Core::ICoreWindow> &coreWindow,
- Size *windowSize);
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_WINRT_COREWINDOWNATIVEWINDOW_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.cpp
deleted file mode 100644
index 1bd796e58f..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.cpp
+++ /dev/null
@@ -1,297 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// InspectableNativeWindow.cpp: NativeWindow base class for managing IInspectable native window types.
-
-#include "libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h"
-#include "libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h"
-
-namespace rx
-{
-
-bool IsCoreWindow(EGLNativeWindowType window, ComPtr<ABI::Windows::UI::Core::ICoreWindow> *coreWindow)
-{
- if (!window)
- {
- return false;
- }
-
- ComPtr<IInspectable> win = window;
- ComPtr<ABI::Windows::UI::Core::ICoreWindow> coreWin;
- if (SUCCEEDED(win.As(&coreWin)))
- {
- if (coreWindow != nullptr)
- {
- *coreWindow = coreWin;
- }
- return true;
- }
-
- return false;
-}
-
-bool IsSwapChainPanel(EGLNativeWindowType window, ComPtr<ABI::Windows::UI::Xaml::Controls::ISwapChainPanel> *swapChainPanel)
-{
- if (!window)
- {
- return false;
- }
-
- ComPtr<IInspectable> win = window;
- ComPtr<ABI::Windows::UI::Xaml::Controls::ISwapChainPanel> panel;
- if (SUCCEEDED(win.As(&panel)))
- {
- if (swapChainPanel != nullptr)
- {
- *swapChainPanel = panel;
- }
- return true;
- }
-
- return false;
-}
-
-bool IsEGLConfiguredPropertySet(EGLNativeWindowType window, ABI::Windows::Foundation::Collections::IPropertySet **propertySet, IInspectable **eglNativeWindow)
-{
- if (!window)
- {
- return false;
- }
-
- ComPtr<IInspectable> props = window;
- ComPtr<IPropertySet> propSet;
- ComPtr<IInspectable> nativeWindow;
- ComPtr<ABI::Windows::Foundation::Collections::IMap<HSTRING, IInspectable*>> propMap;
- boolean hasEglNativeWindowPropertyKey = false;
-
- HRESULT result = props.As(&propSet);
- if (SUCCEEDED(result))
- {
- result = propSet.As(&propMap);
- }
-
- // Look for the presence of the EGLNativeWindowType in the property set
- if (SUCCEEDED(result))
- {
- result = propMap->HasKey(HStringReference(EGLNativeWindowTypeProperty).Get(), &hasEglNativeWindowPropertyKey);
- }
-
- // If the IPropertySet does not contain the required EglNativeWindowType key, the property set is
- // considered invalid.
- if (SUCCEEDED(result) && !hasEglNativeWindowPropertyKey)
- {
- ERR() << "Could not find EGLNativeWindowTypeProperty in IPropertySet. Valid "
- "EGLNativeWindowTypeProperty values include ICoreWindow";
- return false;
- }
-
- // The EglNativeWindowType property exists, so retreive the IInspectable that represents the EGLNativeWindowType
- if (SUCCEEDED(result) && hasEglNativeWindowPropertyKey)
- {
- result = propMap->Lookup(HStringReference(EGLNativeWindowTypeProperty).Get(), &nativeWindow);
- }
-
- if (SUCCEEDED(result))
- {
- if (propertySet != nullptr)
- {
- result = propSet.CopyTo(propertySet);
- }
- }
-
- if (SUCCEEDED(result))
- {
- if (eglNativeWindow != nullptr)
- {
- result = nativeWindow.CopyTo(eglNativeWindow);
- }
- }
-
- if (SUCCEEDED(result))
- {
- return true;
- }
-
- return false;
-}
-
-// Retrieve an optional property from a property set
-HRESULT GetOptionalPropertyValue(const ComPtr<ABI::Windows::Foundation::Collections::IMap<HSTRING, IInspectable*>> &propertyMap,
- const wchar_t *propertyName,
- boolean *hasKey,
- ComPtr<ABI::Windows::Foundation::IPropertyValue> &propertyValue)
-{
- if (!propertyMap || !hasKey)
- {
- return E_INVALIDARG;
- }
-
- // Assume that the value does not exist
- *hasKey = false;
-
- HRESULT result = propertyMap->HasKey(HStringReference(propertyName).Get(), hasKey);
- if (SUCCEEDED(result) && !(*hasKey))
- {
- // Value does not exist, so return S_OK and set the exists parameter to false to indicate
- // that a the optional property does not exist.
- return S_OK;
- }
-
- if (SUCCEEDED(result))
- {
- result = propertyMap->Lookup(HStringReference(propertyName).Get(), &propertyValue);
- }
-
- return result;
-}
-
-// Attempts to read an optional SIZE property value that is assumed to be in the form of
-// an ABI::Windows::Foundation::Size. This function validates the Size value before returning
-// it to the caller.
-//
-// Possible return values are:
-// S_OK, valueExists == true - optional SIZE value was successfully retrieved and validated
-// S_OK, valueExists == false - optional SIZE value was not found
-// E_INVALIDARG, valueExists = false - optional SIZE value was malformed in the property set.
-// * Incorrect property type ( must be PropertyType_Size)
-// * Invalid property value (width/height must be > 0)
-// Additional errors may be returned from IMap or IPropertyValue
-//
-HRESULT GetOptionalSizePropertyValue(const ComPtr<ABI::Windows::Foundation::Collections::IMap<HSTRING, IInspectable*>> &propertyMap,
- const wchar_t *propertyName, SIZE *value, bool *valueExists)
-{
- ComPtr<ABI::Windows::Foundation::IPropertyValue> propertyValue;
- ABI::Windows::Foundation::PropertyType propertyType = ABI::Windows::Foundation::PropertyType::PropertyType_Empty;
- Size sizeValue = { 0, 0 };
- boolean hasKey = false;
-
- if (!propertyMap || !value || !valueExists)
- {
- return E_INVALIDARG;
- }
-
- // Assume that the value does not exist
- *valueExists = false;
- *value = { 0, 0 };
-
- HRESULT result = GetOptionalPropertyValue(propertyMap, propertyName, &hasKey, propertyValue);
- if (SUCCEEDED(result) && hasKey)
- {
- result = propertyValue->get_Type(&propertyType);
-
- // Check if the expected Size property is of PropertyType_Size type.
- if (SUCCEEDED(result) && propertyType == ABI::Windows::Foundation::PropertyType::PropertyType_Size)
- {
- if (SUCCEEDED(propertyValue->GetSize(&sizeValue)) && (sizeValue.Width > 0 && sizeValue.Height > 0))
- {
- // A valid property value exists
- *value = { static_cast<long>(sizeValue.Width), static_cast<long>(sizeValue.Height) };
- *valueExists = true;
- result = S_OK;
- }
- else
- {
- // An invalid Size property was detected. Width/Height values must > 0
- result = E_INVALIDARG;
- }
- }
- else
- {
- // An invalid property type was detected. Size property must be of PropertyType_Size
- result = E_INVALIDARG;
- }
- }
-
- return result;
-}
-
-// Attempts to read an optional float property value that is assumed to be in the form of
-// an ABI::Windows::Foundation::Single. This function validates the Single value before returning
-// it to the caller.
-//
-// Possible return values are:
-// S_OK, valueExists == true - optional Single value was successfully retrieved and validated
-// S_OK, valueExists == false - optional Single value was not found
-// E_INVALIDARG, valueExists = false - optional Single value was malformed in the property set.
-// * Incorrect property type ( must be PropertyType_Single)
-// * Invalid property value (must be > 0)
-// Additional errors may be returned from IMap or IPropertyValue
-//
-HRESULT GetOptionalSinglePropertyValue(const ComPtr<ABI::Windows::Foundation::Collections::IMap<HSTRING, IInspectable*>> &propertyMap,
- const wchar_t *propertyName, float *value, bool *valueExists)
-{
- ComPtr<ABI::Windows::Foundation::IPropertyValue> propertyValue;
- ABI::Windows::Foundation::PropertyType propertyType = ABI::Windows::Foundation::PropertyType::PropertyType_Empty;
- float scaleValue = 0.0f;
- boolean hasKey = false;
-
- if (!propertyMap || !value || !valueExists)
- {
- return E_INVALIDARG;
- }
-
- // Assume that the value does not exist
- *valueExists = false;
- *value = 0.0f;
-
- HRESULT result = GetOptionalPropertyValue(propertyMap, propertyName, &hasKey, propertyValue);
- if (SUCCEEDED(result) && hasKey)
- {
- result = propertyValue->get_Type(&propertyType);
-
- // Check if the expected Scale property is of PropertyType_Single type.
- if (SUCCEEDED(result) && propertyType == ABI::Windows::Foundation::PropertyType::PropertyType_Single)
- {
- if (SUCCEEDED(propertyValue->GetSingle(&scaleValue)) && (scaleValue > 0.0f))
- {
- // A valid property value exists
- *value = scaleValue;
- *valueExists = true;
- result = S_OK;
- }
- else
- {
- // An invalid scale was set
- result = E_INVALIDARG;
- }
- }
- else
- {
- // An invalid property type was detected. Size property must be of PropertyType_Single
- result = E_INVALIDARG;
- }
- }
-
- return result;
-}
-
-RECT InspectableNativeWindow::clientRect(const Size &size)
-{
- return {0, 0, static_cast<long>(ConvertDipsToPixels(size.Width)),
- static_cast<long>(ConvertDipsToPixels(size.Height))};
-}
-
-float GetLogicalDpi()
-{
- ComPtr<ABI::Windows::Graphics::Display::IDisplayPropertiesStatics> displayProperties;
- float dpi = 96.0f;
-
- if (SUCCEEDED(GetActivationFactory(HStringReference(RuntimeClass_Windows_Graphics_Display_DisplayProperties).Get(), displayProperties.GetAddressOf())))
- {
- if (SUCCEEDED(displayProperties->get_LogicalDpi(&dpi)))
- {
- return dpi;
- }
- }
- return dpi;
-}
-
-float ConvertDipsToPixels(float dips)
-{
- static const float dipsPerInch = 96.0f;
- return lround((dips * GetLogicalDpi() / dipsPerInch));
-}
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h
deleted file mode 100644
index d81c3e5fb9..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h
+++ /dev/null
@@ -1,136 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// InspectableNativeWindow.h: Host specific implementation interface for
-// managing IInspectable native window types.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_WINRT_INSPECTABLENATIVEWINDOW_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_WINRT_INSPECTABLENATIVEWINDOW_H_
-
-#include "common/debug.h"
-#include "common/platform.h"
-
-#include "angle_windowsstore.h"
-
-#include <EGL/eglplatform.h>
-
-#include <windows.applicationmodel.core.h>
-#include <windows.ui.xaml.h>
-#include <windows.ui.xaml.media.dxinterop.h>
-#include <wrl.h>
-#include <wrl/wrappers/corewrappers.h>
-
-using namespace Microsoft::WRL;
-using namespace Microsoft::WRL::Wrappers;
-using namespace ABI::Windows::Foundation;
-using namespace ABI::Windows::Foundation::Collections;
-
-namespace rx
-{
-float ConvertDipsToPixels(float dips);
-float GetLogicalDpi();
-
-class InspectableNativeWindow
-{
- public:
- InspectableNativeWindow() :
- mSupportsSwapChainResize(true),
- mSwapChainSizeSpecified(false),
- mSwapChainScaleSpecified(false),
- mClientRectChanged(false),
- mClientRect({0,0,0,0}),
- mNewClientRect({0,0,0,0})
- {
- mSizeChangedEventToken.value = 0;
- mSwapChainScale = 96.0f / GetLogicalDpi();
- if (mSwapChainScale != 1.0f)
- mSwapChainScaleSpecified = true;
- }
- virtual ~InspectableNativeWindow(){}
-
- virtual bool initialize(EGLNativeWindowType window, IPropertySet *propertySet) = 0;
- virtual HRESULT createSwapChain(ID3D11Device *device,
- IDXGIFactory2 *factory,
- DXGI_FORMAT format,
- unsigned int width,
- unsigned int height,
- bool containsAlpha,
- IDXGISwapChain1 **swapChain) = 0;
-
- bool getClientRect(RECT *rect)
- {
- if (mClientRectChanged)
- {
- mClientRect = mNewClientRect;
- }
-
- *rect = mClientRect;
-
- return true;
- }
-
- // setNewClientSize is used by the WinRT size change handler. It isn't used by the rest of ANGLE.
- void setNewClientSize(const Size &newWindowSize)
- {
- // If the client doesn't support swapchain resizing then we should have already unregistered from size change handler
- ASSERT(mSupportsSwapChainResize);
-
- if (mSupportsSwapChainResize)
- {
- // If the swapchain size was specified then we should ignore this call too
- if (!mSwapChainSizeSpecified)
- {
- mNewClientRect = clientRect(newWindowSize);
- mClientRectChanged = true;
-
- // If a scale was specified, then now is the time to apply the scale matrix for the new swapchain size and window size
- if (mSwapChainScaleSpecified)
- {
- scaleSwapChain(newWindowSize, mNewClientRect);
- }
- }
-
- // Even if the swapchain size was fixed, the window might have changed size.
- // In this case, we should recalculate the scale matrix to account for the new window size
- if (mSwapChainSizeSpecified)
- {
- scaleSwapChain(newWindowSize, mClientRect);
- }
- }
- }
-
- protected:
- virtual HRESULT scaleSwapChain(const Size &windowSize, const RECT &clientRect) = 0;
- RECT clientRect(const Size &size);
-
- bool mSupportsSwapChainResize; // Support for IDXGISwapChain::ResizeBuffers method
- bool mSwapChainSizeSpecified; // If an EGLRenderSurfaceSizeProperty was specified
- bool mSwapChainScaleSpecified; // If an EGLRenderResolutionScaleProperty was specified
- float mSwapChainScale; // The scale value specified by the EGLRenderResolutionScaleProperty property
- RECT mClientRect;
- RECT mNewClientRect;
- bool mClientRectChanged;
-
- EventRegistrationToken mSizeChangedEventToken;
-};
-
-bool IsCoreWindow(EGLNativeWindowType window, ComPtr<ABI::Windows::UI::Core::ICoreWindow> *coreWindow = nullptr);
-bool IsSwapChainPanel(EGLNativeWindowType window, ComPtr<ABI::Windows::UI::Xaml::Controls::ISwapChainPanel> *swapChainPanel = nullptr);
-bool IsEGLConfiguredPropertySet(EGLNativeWindowType window, ABI::Windows::Foundation::Collections::IPropertySet **propertySet = nullptr, IInspectable **inspectable = nullptr);
-
-HRESULT GetOptionalPropertyValue(const ComPtr<ABI::Windows::Foundation::Collections::IMap<HSTRING, IInspectable*>> &propertyMap,
- const wchar_t *propertyName,
- boolean *hasKey,
- ComPtr<ABI::Windows::Foundation::IPropertyValue> &propertyValue);
-
-HRESULT GetOptionalSizePropertyValue(const ComPtr<ABI::Windows::Foundation::Collections::IMap<HSTRING, IInspectable*>> &propertyMap,
- const wchar_t *propertyName, SIZE *value, bool *valueExists);
-
-HRESULT GetOptionalSinglePropertyValue(const ComPtr<ABI::Windows::Foundation::Collections::IMap<HSTRING, IInspectable*>> &propertyMap,
- const wchar_t *propertyName, float *value, bool *valueExists);
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_WINRT_INSPECTABLENATIVEWINDOW_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.cpp
deleted file mode 100644
index 655b23be83..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// NativeWindow11WinRT.cpp: NativeWindow base class for managing IInspectable native window types.
-
-#include "libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h"
-
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
-#include "libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h"
-#include "libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h"
-#include "libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h"
-
-using namespace Microsoft::WRL;
-using namespace Microsoft::WRL::Wrappers;
-
-namespace rx
-{
-NativeWindow11WinRT::NativeWindow11WinRT(EGLNativeWindowType window, bool hasAlpha)
- : NativeWindow11(window), mHasAlpha(hasAlpha)
-{
-}
-
-bool NativeWindow11WinRT::initialize()
-{
- EGLNativeWindowType window = getNativeWindow();
-
- // If the native window type is a IPropertySet, extract the
- // EGLNativeWindowType (IInspectable) and initialize the
- // proper host with this IPropertySet.
- ComPtr<ABI::Windows::Foundation::Collections::IPropertySet> propertySet;
- ComPtr<IInspectable> eglNativeWindow;
- if (IsEGLConfiguredPropertySet(window, &propertySet, &eglNativeWindow))
- {
- // A property set was found and the EGLNativeWindowType was
- // retrieved. The mWindow member of the host to must be updated
- // to use the EGLNativeWindowType specified in the property set.
- // mWindow is treated as a raw pointer not an AddRef'd interface, so
- // the old mWindow does not need a Release() before this assignment.
- window = eglNativeWindow.Get();
- }
-
- ComPtr<ABI::Windows::UI::Core::ICoreWindow> coreWindow;
- ComPtr<ABI::Windows::UI::Xaml::Controls::ISwapChainPanel> swapChainPanel;
- if (IsCoreWindow(window, &coreWindow))
- {
- mImpl = std::make_shared<CoreWindowNativeWindow>();
- if (mImpl)
- {
- return mImpl->initialize(window, propertySet.Get());
- }
- }
- else if (IsSwapChainPanel(window, &swapChainPanel))
- {
- mImpl = std::make_shared<SwapChainPanelNativeWindow>();
- if (mImpl)
- {
- return mImpl->initialize(window, propertySet.Get());
- }
- }
- else
- {
- ERR() << "Invalid IInspectable EGLNativeWindowType detected. Valid IInspectables include "
- "ICoreWindow, ISwapChainPanel and IPropertySet";
- }
-
- return false;
-}
-
-bool NativeWindow11WinRT::getClientRect(LPRECT rect) const
-{
- if (mImpl)
- {
- return mImpl->getClientRect(rect);
- }
-
- return false;
-}
-
-bool NativeWindow11WinRT::isIconic() const
-{
- return false;
-}
-
-HRESULT NativeWindow11WinRT::createSwapChain(ID3D11Device *device,
- IDXGIFactory *factory,
- DXGI_FORMAT format,
- UINT width,
- UINT height,
- UINT samples,
- IDXGISwapChain **swapChain)
-{
- if (mImpl)
- {
- IDXGIFactory2 *factory2 = d3d11::DynamicCastComObject<IDXGIFactory2>(factory);
- IDXGISwapChain1 *swapChain1 = nullptr;
- HRESULT result =
- mImpl->createSwapChain(device, factory2, format, width, height, mHasAlpha, &swapChain1);
- SafeRelease(factory2);
- *swapChain = static_cast<IDXGISwapChain *>(swapChain1);
- return result;
- }
-
- return E_UNEXPECTED;
-}
-
-void NativeWindow11WinRT::commitChange()
-{
-}
-
-// static
-bool NativeWindow11WinRT::IsValidNativeWindow(EGLNativeWindowType window)
-{
- // A Valid EGLNativeWindowType IInspectable can only be:
- //
- // ICoreWindow
- // ISwapChainPanel
- // IPropertySet
- //
- // Anything else will be rejected as an invalid IInspectable.
- return IsCoreWindow(window) || IsSwapChainPanel(window) || IsEGLConfiguredPropertySet(window);
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h
deleted file mode 100644
index c4ac997a55..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// NativeWindow11WinRT.h: NativeWindow base class for managing IInspectable native window types.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_WINRT_NATIVEWINDOW11WINRT_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_WINRT_NATIVEWINDOW11WINRT_H_
-
-#include "libANGLE/renderer/d3d/d3d11/NativeWindow11.h"
-
-#include <memory>
-#include <windows.applicationmodel.core.h>
-#include <wrl.h>
-#include <wrl/wrappers/corewrappers.h>
-
-namespace rx
-{
-class InspectableNativeWindow;
-
-class NativeWindow11WinRT : public NativeWindow11
-{
- public:
- NativeWindow11WinRT(EGLNativeWindowType window, bool hasAlpha);
-
- bool initialize() override;
- bool getClientRect(LPRECT rect) const override;
- bool isIconic() const override;
-
- HRESULT createSwapChain(ID3D11Device *device,
- IDXGIFactory *factory,
- DXGI_FORMAT format,
- UINT width,
- UINT height,
- UINT samples,
- IDXGISwapChain **swapChain) override;
-
- void commitChange() override;
-
- static bool IsValidNativeWindow(EGLNativeWindowType window);
-
- private:
- bool mHasAlpha;
- std::shared_ptr<InspectableNativeWindow> mImpl;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D11_WINRT_NATIVEWINDOW11WINRT_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.cpp
deleted file mode 100644
index 3425fad95d..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.cpp
+++ /dev/null
@@ -1,359 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// SwapChainPanelNativeWindow.cpp: NativeWindow for managing ISwapChainPanel native window types.
-
-#include "libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h"
-
-#include <algorithm>
-#include <math.h>
-
-using namespace ABI::Windows::Foundation;
-using namespace ABI::Windows::Foundation::Collections;
-using namespace ABI::Windows::UI::Core;
-using namespace ABI::Windows::UI::Xaml;
-using namespace Microsoft::WRL;
-
-namespace rx
-{
-SwapChainPanelNativeWindow::~SwapChainPanelNativeWindow()
-{
- unregisterForSizeChangeEvents();
-}
-
-template <typename T>
-struct AddFtmBase
-{
- typedef Implements<RuntimeClassFlags<ClassicCom>, T, FtmBase> Type;
-};
-
-template <typename CODE>
-HRESULT RunOnUIThread(CODE &&code, const ComPtr<ICoreDispatcher> &dispatcher)
-{
- ComPtr<IAsyncAction> asyncAction;
- HRESULT result = S_OK;
-
- boolean hasThreadAccess;
- result = dispatcher->get_HasThreadAccess(&hasThreadAccess);
- if (FAILED(result))
- {
- return result;
- }
-
- if (hasThreadAccess)
- {
- return code();
- }
- else
- {
- Event waitEvent(
- CreateEventEx(nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS));
- if (!waitEvent.IsValid())
- {
- return E_FAIL;
- }
-
- HRESULT codeResult = E_FAIL;
- auto handler =
- Callback<AddFtmBase<IDispatchedHandler>::Type>([&codeResult, &code, &waitEvent]
- {
- codeResult = code();
- SetEvent(waitEvent.Get());
- return S_OK;
- });
-
- result = dispatcher->RunAsync(CoreDispatcherPriority_Normal, handler.Get(),
- asyncAction.GetAddressOf());
- if (FAILED(result))
- {
- return result;
- }
-
- auto waitResult = WaitForSingleObjectEx(waitEvent.Get(), 10 * 1000, true);
- if (waitResult != WAIT_OBJECT_0)
- {
- // Wait 10 seconds before giving up. At this point, the application is in an
- // unrecoverable state (probably deadlocked). We therefore terminate the application
- // entirely. This also prevents stack corruption if the async operation is eventually
- // run.
- ERR()
- << "Timeout waiting for async action on UI thread. The UI thread might be blocked.";
- std::terminate();
- return E_FAIL;
- }
-
- return codeResult;
- }
-}
-
-bool SwapChainPanelNativeWindow::initialize(EGLNativeWindowType window, IPropertySet *propertySet)
-{
- ComPtr<IPropertySet> props = propertySet;
- ComPtr<IInspectable> win = window;
- SIZE swapChainSize = {};
- HRESULT result = S_OK;
-
- // IPropertySet is an optional parameter and can be null.
- // If one is specified, cache as an IMap and read the properties
- // used for initial host initialization.
- if (propertySet)
- {
- result = props.As(&mPropertyMap);
- if (FAILED(result))
- {
- return false;
- }
-
- // The EGLRenderSurfaceSizeProperty is optional and may be missing. The IPropertySet
- // was prevalidated to contain the EGLNativeWindowType before being passed to
- // this host.
- result = GetOptionalSizePropertyValue(mPropertyMap, EGLRenderSurfaceSizeProperty, &swapChainSize, &mSwapChainSizeSpecified);
- if (FAILED(result))
- {
- return false;
- }
-
- // The EGLRenderResolutionScaleProperty is optional and may be missing. The IPropertySet
- // was prevalidated to contain the EGLNativeWindowType before being passed to
- // this host.
- result = GetOptionalSinglePropertyValue(mPropertyMap, EGLRenderResolutionScaleProperty, &mSwapChainScale, &mSwapChainScaleSpecified);
- if (FAILED(result))
- {
- return false;
- }
-
- if (!mSwapChainScaleSpecified)
- {
- // Default value for the scale is 1.0f
- mSwapChainScale = 1.0f;
- }
-
- // A EGLRenderSurfaceSizeProperty and a EGLRenderResolutionScaleProperty can't both be specified
- if (mSwapChainScaleSpecified && mSwapChainSizeSpecified)
- {
- ERR() << "It is invalid to specify both an EGLRenderSurfaceSizeProperty and a "
- "EGLRenderResolutionScaleProperty.";
- return false;
- }
- }
-
- if (SUCCEEDED(result))
- {
- result = win.As(&mSwapChainPanel);
- }
-
- ComPtr<IDependencyObject> swapChainPanelDependencyObject;
- if (SUCCEEDED(result))
- {
- result = mSwapChainPanel.As(&swapChainPanelDependencyObject);
- }
-
- if (SUCCEEDED(result))
- {
- result = swapChainPanelDependencyObject->get_Dispatcher(
- mSwapChainPanelDispatcher.GetAddressOf());
- }
-
- if (SUCCEEDED(result))
- {
- // If a swapchain size is specfied, then the automatic resize
- // behaviors implemented by the host should be disabled. The swapchain
- // will be still be scaled when being rendered to fit the bounds
- // of the host.
- // Scaling of the swapchain output needs to be handled by the
- // host for swapchain panels even though the scaling mode setting
- // DXGI_SCALING_STRETCH is configured on the swapchain.
- if (mSwapChainSizeSpecified)
- {
- mClientRect = { 0, 0, swapChainSize.cx, swapChainSize.cy };
- }
- else
- {
- Size swapChainPanelSize;
- result = GetSwapChainPanelSize(mSwapChainPanel, mSwapChainPanelDispatcher,
- &swapChainPanelSize);
-
- if (SUCCEEDED(result))
- {
- // Update the client rect to account for any swapchain scale factor
- mClientRect = clientRect(swapChainPanelSize);
- }
- }
- }
-
- if (SUCCEEDED(result))
- {
- mNewClientRect = mClientRect;
- mClientRectChanged = false;
- return registerForSizeChangeEvents();
- }
-
- return false;
-}
-
-bool SwapChainPanelNativeWindow::registerForSizeChangeEvents()
-{
- ComPtr<ISizeChangedEventHandler> sizeChangedHandler;
- ComPtr<IFrameworkElement> frameworkElement;
- HRESULT result = Microsoft::WRL::MakeAndInitialize<SwapChainPanelSizeChangedHandler>(sizeChangedHandler.ReleaseAndGetAddressOf(), this->shared_from_this());
-
- if (SUCCEEDED(result))
- {
- result = mSwapChainPanel.As(&frameworkElement);
- }
-
- if (SUCCEEDED(result))
- {
- result = RunOnUIThread(
- [this, frameworkElement, sizeChangedHandler]
- {
- return frameworkElement->add_SizeChanged(sizeChangedHandler.Get(),
- &mSizeChangedEventToken);
- },
- mSwapChainPanelDispatcher);
- }
-
- if (SUCCEEDED(result))
- {
- return true;
- }
-
- return false;
-}
-
-void SwapChainPanelNativeWindow::unregisterForSizeChangeEvents()
-{
- ComPtr<IFrameworkElement> frameworkElement;
- if (mSwapChainPanel && SUCCEEDED(mSwapChainPanel.As(&frameworkElement)))
- {
- RunOnUIThread(
- [this, frameworkElement]
- {
- return frameworkElement->remove_SizeChanged(mSizeChangedEventToken);
- },
- mSwapChainPanelDispatcher);
- }
-
- mSizeChangedEventToken.value = 0;
-}
-
-HRESULT SwapChainPanelNativeWindow::createSwapChain(ID3D11Device *device,
- IDXGIFactory2 *factory,
- DXGI_FORMAT format,
- unsigned int width,
- unsigned int height,
- bool containsAlpha,
- IDXGISwapChain1 **swapChain)
-{
- if (device == nullptr || factory == nullptr || swapChain == nullptr || width == 0 ||
- height == 0)
- {
- return E_INVALIDARG;
- }
-
- DXGI_SWAP_CHAIN_DESC1 swapChainDesc = { 0 };
- swapChainDesc.Width = width;
- swapChainDesc.Height = height;
- swapChainDesc.Format = format;
- swapChainDesc.Stereo = FALSE;
- swapChainDesc.SampleDesc.Count = 1;
- swapChainDesc.SampleDesc.Quality = 0;
- swapChainDesc.BufferUsage =
- DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_BACK_BUFFER;
- swapChainDesc.BufferCount = 2;
- swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
- swapChainDesc.Scaling = DXGI_SCALING_STRETCH;
- swapChainDesc.AlphaMode =
- containsAlpha ? DXGI_ALPHA_MODE_PREMULTIPLIED : DXGI_ALPHA_MODE_IGNORE;
-
- *swapChain = nullptr;
-
- ComPtr<IDXGISwapChain1> newSwapChain;
- ComPtr<ISwapChainPanelNative> swapChainPanelNative;
- Size currentPanelSize = {};
-
- HRESULT result = factory->CreateSwapChainForComposition(device, &swapChainDesc, nullptr, newSwapChain.ReleaseAndGetAddressOf());
-
- if (SUCCEEDED(result))
- {
- result = mSwapChainPanel.As(&swapChainPanelNative);
- }
-
- if (SUCCEEDED(result))
- {
- result = RunOnUIThread(
- [swapChainPanelNative, newSwapChain]
- {
- return swapChainPanelNative->SetSwapChain(newSwapChain.Get());
- },
- mSwapChainPanelDispatcher);
- }
-
- if (SUCCEEDED(result))
- {
- // The swapchain panel host requires an instance of the swapchain set on the SwapChainPanel
- // to perform the runtime-scale behavior. This swapchain is cached here because there are
- // no methods for retreiving the currently configured on from ISwapChainPanelNative.
- mSwapChain = newSwapChain;
- result = newSwapChain.CopyTo(swapChain);
- }
-
- // If the host is responsible for scaling the output of the swapchain, then
- // scale it now before returning an instance to the caller. This is done by
- // first reading the current size of the swapchain panel, then scaling
- if (SUCCEEDED(result))
- {
- if (mSwapChainSizeSpecified || mSwapChainScaleSpecified)
- {
- result = GetSwapChainPanelSize(mSwapChainPanel, mSwapChainPanelDispatcher,
- &currentPanelSize);
-
- // Scale the swapchain to fit inside the contents of the panel.
- if (SUCCEEDED(result))
- {
- result = scaleSwapChain(currentPanelSize, mClientRect);
- }
- }
- }
-
- return result;
-}
-
-HRESULT SwapChainPanelNativeWindow::scaleSwapChain(const Size &windowSize, const RECT &clientRect)
-{
- Size renderScale = {windowSize.Width / std::max(LONG(1), clientRect.right),
- windowSize.Height / std::max(LONG(1), clientRect.bottom)};
- // Setup a scale matrix for the swap chain
- DXGI_MATRIX_3X2_F scaleMatrix = {};
- scaleMatrix._11 = renderScale.Width;
- scaleMatrix._22 = renderScale.Height;
-
- ComPtr<IDXGISwapChain2> swapChain2;
- HRESULT result = mSwapChain.As(&swapChain2);
- if (SUCCEEDED(result))
- {
- result = swapChain2->SetMatrixTransform(&scaleMatrix);
- }
-
- return result;
-}
-
-HRESULT GetSwapChainPanelSize(
- const ComPtr<ABI::Windows::UI::Xaml::Controls::ISwapChainPanel> &swapChainPanel,
- const ComPtr<ICoreDispatcher> &dispatcher,
- Size *windowSize)
-{
- ComPtr<IUIElement> uiElement;
- HRESULT result = swapChainPanel.As(&uiElement);
- if (SUCCEEDED(result))
- {
- result = RunOnUIThread(
- [uiElement, windowSize] { return uiElement->get_RenderSize(windowSize); }, dispatcher);
- }
-
- return result;
-}
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h
deleted file mode 100644
index f9a2fc0e4b..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h
+++ /dev/null
@@ -1,93 +0,0 @@
-//
-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// SwapChainPanelNativeWindow.h: NativeWindow for managing ISwapChainPanel native window types.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D11_WINRT_SWAPCHAINPANELNATIVEWINDOW_H_
-#define LIBANGLE_RENDERER_D3D_D3D11_WINRT_SWAPCHAINPANELNATIVEWINDOW_H_
-
-#include "libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h"
-
-#include <memory>
-
-namespace rx
-{
-class SwapChainPanelNativeWindow : public InspectableNativeWindow, public std::enable_shared_from_this<SwapChainPanelNativeWindow>
-{
- public:
- ~SwapChainPanelNativeWindow();
-
- bool initialize(EGLNativeWindowType window, IPropertySet *propertySet) override;
- HRESULT createSwapChain(ID3D11Device *device,
- IDXGIFactory2 *factory,
- DXGI_FORMAT format,
- unsigned int width,
- unsigned int height,
- bool containsAlpha,
- IDXGISwapChain1 **swapChain) override;
-
- protected:
- HRESULT scaleSwapChain(const Size &windowSize, const RECT &clientRect) override;
-
- bool registerForSizeChangeEvents();
- void unregisterForSizeChangeEvents();
-
- private:
- ComPtr<ABI::Windows::UI::Xaml::Controls::ISwapChainPanel> mSwapChainPanel;
- ComPtr<ABI::Windows::UI::Core::ICoreDispatcher> mSwapChainPanelDispatcher;
- ComPtr<IMap<HSTRING, IInspectable*>> mPropertyMap;
- ComPtr<IDXGISwapChain1> mSwapChain;
-};
-
-[uuid(8ACBD974-8187-4508-AD80-AEC77F93CF36)]
-class SwapChainPanelSizeChangedHandler :
- public Microsoft::WRL::RuntimeClass<Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::ClassicCom>, ABI::Windows::UI::Xaml::ISizeChangedEventHandler>
-{
- public:
- SwapChainPanelSizeChangedHandler() { }
- HRESULT RuntimeClassInitialize(std::shared_ptr<InspectableNativeWindow> host)
- {
- if (!host)
- {
- return E_INVALIDARG;
- }
-
- mHost = host;
- return S_OK;
- }
-
- // ISizeChangedEventHandler
- IFACEMETHOD(Invoke)(IInspectable *sender, ABI::Windows::UI::Xaml::ISizeChangedEventArgs *sizeChangedEventArgs)
- {
- std::shared_ptr<InspectableNativeWindow> host = mHost.lock();
- if (host)
- {
- // The size of the ISwapChainPanel control is returned in DIPs.
- // We are keeping these in dips because the swapchain created for composition
- // also uses dip units. This keeps dimensions, viewports, etc in the same unit.
- // XAML Clients of the ISwapChainPanel are required to use dips to define their
- // layout sizes as well.
- ABI::Windows::Foundation::Size newSize;
- HRESULT result = sizeChangedEventArgs->get_NewSize(&newSize);
- if (SUCCEEDED(result))
- {
- host->setNewClientSize(newSize);
- }
- }
-
- return S_OK;
- }
-
- private:
- std::weak_ptr<InspectableNativeWindow> mHost;
-};
-
-HRESULT GetSwapChainPanelSize(
- const ComPtr<ABI::Windows::UI::Xaml::Controls::ISwapChainPanel> &swapChainPanel,
- const ComPtr<ABI::Windows::UI::Core::ICoreDispatcher> &dispatcher,
- Size *windowSize);
-}
-#endif // LIBANGLE_RENDERER_D3D_D3D11_WINRT_SWAPCHAINPANELNATIVEWINDOW_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp
deleted file mode 100644
index 36f2bd0db8..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp
+++ /dev/null
@@ -1,829 +0,0 @@
-//
-// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Blit9.cpp: Surface copy utility class.
-
-#include "libANGLE/renderer/d3d/d3d9/Blit9.h"
-
-#include "libANGLE/renderer/d3d/TextureD3D.h"
-#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h"
-#include "libANGLE/renderer/d3d/d3d9/formatutils9.h"
-#include "libANGLE/renderer/d3d/d3d9/TextureStorage9.h"
-#include "libANGLE/renderer/d3d/d3d9/RenderTarget9.h"
-#include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/FramebufferAttachment.h"
-
-namespace
-{
-// Precompiled shaders
-#include "libANGLE/renderer/d3d/d3d9/shaders/compiled/standardvs.h"
-#include "libANGLE/renderer/d3d/d3d9/shaders/compiled/passthroughps.h"
-#include "libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceps.h"
-#include "libANGLE/renderer/d3d/d3d9/shaders/compiled/luminancepremultps.h"
-#include "libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceunmultps.h"
-#include "libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskps.h"
-#include "libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskpremultps.h"
-#include "libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskunmultps.h"
-
-const BYTE *const g_shaderCode[] = {
- g_vs20_standardvs,
- g_ps20_passthroughps,
- g_ps20_luminanceps,
- g_ps20_luminancepremultps,
- g_ps20_luminanceunmultps,
- g_ps20_componentmaskps,
- g_ps20_componentmaskpremultps,
- g_ps20_componentmaskunmultps,
-};
-
-const size_t g_shaderSize[] = {
- sizeof(g_vs20_standardvs),
- sizeof(g_ps20_passthroughps),
- sizeof(g_ps20_luminanceps),
- sizeof(g_ps20_luminancepremultps),
- sizeof(g_ps20_luminanceunmultps),
- sizeof(g_ps20_componentmaskps),
- sizeof(g_ps20_componentmaskpremultps),
- sizeof(g_ps20_componentmaskunmultps),
-};
-}
-
-namespace rx
-{
-
-Blit9::Blit9(Renderer9 *renderer)
- : mRenderer(renderer),
- mGeometryLoaded(false),
- mQuadVertexBuffer(nullptr),
- mQuadVertexDeclaration(nullptr),
- mSavedStateBlock(nullptr),
- mSavedRenderTarget(nullptr),
- mSavedDepthStencil(nullptr)
-{
- memset(mCompiledShaders, 0, sizeof(mCompiledShaders));
-}
-
-Blit9::~Blit9()
-{
- SafeRelease(mSavedStateBlock);
- SafeRelease(mQuadVertexBuffer);
- SafeRelease(mQuadVertexDeclaration);
-
- for (int i = 0; i < SHADER_COUNT; i++)
- {
- SafeRelease(mCompiledShaders[i]);
- }
-}
-
-gl::Error Blit9::initialize()
-{
- if (mGeometryLoaded)
- {
- return gl::NoError();
- }
-
- static const float quad[] =
- {
- -1, -1,
- -1, 1,
- 1, -1,
- 1, 1
- };
-
- IDirect3DDevice9 *device = mRenderer->getDevice();
-
- HRESULT result = device->CreateVertexBuffer(sizeof(quad), D3DUSAGE_WRITEONLY, 0,
- D3DPOOL_DEFAULT, &mQuadVertexBuffer, nullptr);
-
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::OutOfMemory() << "Failed to create internal blit vertex shader, "
- << gl::FmtHR(result);
- }
-
- void *lockPtr = nullptr;
- result = mQuadVertexBuffer->Lock(0, 0, &lockPtr, 0);
-
- if (FAILED(result) || lockPtr == nullptr)
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- SafeRelease(mQuadVertexBuffer);
- return gl::OutOfMemory() << "Failed to lock internal blit vertex shader, "
- << gl::FmtHR(result);
- }
-
- memcpy(lockPtr, quad, sizeof(quad));
- mQuadVertexBuffer->Unlock();
-
- static const D3DVERTEXELEMENT9 elements[] =
- {
- { 0, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
- D3DDECL_END()
- };
-
- result = device->CreateVertexDeclaration(elements, &mQuadVertexDeclaration);
-
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- SafeRelease(mQuadVertexBuffer);
- return gl::OutOfMemory() << "Failed to lock internal blit vertex declaration, "
- << gl::FmtHR(result);
- }
-
- mGeometryLoaded = true;
- return gl::NoError();
-}
-
-template <class D3DShaderType>
-gl::Error Blit9::setShader(ShaderId source, const char *profile,
- gl::Error (Renderer9::*createShader)(const DWORD *, size_t length, D3DShaderType **outShader),
- HRESULT (WINAPI IDirect3DDevice9::*setShader)(D3DShaderType*))
-{
- IDirect3DDevice9 *device = mRenderer->getDevice();
-
- D3DShaderType *shader = nullptr;
-
- if (mCompiledShaders[source] != nullptr)
- {
- shader = static_cast<D3DShaderType*>(mCompiledShaders[source]);
- }
- else
- {
- const BYTE* shaderCode = g_shaderCode[source];
- size_t shaderSize = g_shaderSize[source];
- ANGLE_TRY((mRenderer->*createShader)(reinterpret_cast<const DWORD*>(shaderCode), shaderSize, &shader));
- mCompiledShaders[source] = shader;
- }
-
- HRESULT hr = (device->*setShader)(shader);
- if (FAILED(hr))
- {
- return gl::OutOfMemory() << "Failed to set shader for blit operation, " << gl::FmtHR(hr);
- }
-
- return gl::NoError();
-}
-
-gl::Error Blit9::setVertexShader(ShaderId shader)
-{
- return setShader<IDirect3DVertexShader9>(shader, "vs_2_0", &Renderer9::createVertexShader, &IDirect3DDevice9::SetVertexShader);
-}
-
-gl::Error Blit9::setPixelShader(ShaderId shader)
-{
- return setShader<IDirect3DPixelShader9>(shader, "ps_2_0", &Renderer9::createPixelShader, &IDirect3DDevice9::SetPixelShader);
-}
-
-RECT Blit9::getSurfaceRect(IDirect3DSurface9 *surface) const
-{
- D3DSURFACE_DESC desc;
- surface->GetDesc(&desc);
-
- RECT rect;
- rect.left = 0;
- rect.top = 0;
- rect.right = desc.Width;
- rect.bottom = desc.Height;
-
- return rect;
-}
-
-gl::Extents Blit9::getSurfaceSize(IDirect3DSurface9 *surface) const
-{
- D3DSURFACE_DESC desc;
- surface->GetDesc(&desc);
-
- return gl::Extents(desc.Width, desc.Height, 1);
-}
-
-gl::Error Blit9::boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest)
-{
- ANGLE_TRY(initialize());
-
- IDirect3DBaseTexture9 *texture = nullptr;
- ANGLE_TRY(copySurfaceToTexture(source, getSurfaceRect(source), &texture));
-
- IDirect3DDevice9 *device = mRenderer->getDevice();
-
- saveState();
-
- device->SetTexture(0, texture);
- device->SetRenderTarget(0, dest);
-
- ANGLE_TRY(setVertexShader(SHADER_VS_STANDARD));
- ANGLE_TRY(setPixelShader(SHADER_PS_PASSTHROUGH));
-
- setCommonBlitState();
- device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
- device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
-
- setViewportAndShaderConstants(getSurfaceRect(source), getSurfaceSize(source),
- getSurfaceRect(dest), false);
-
- render();
-
- SafeRelease(texture);
-
- restoreState();
-
- return gl::NoError();
-}
-
-gl::Error Blit9::copy2D(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const RECT &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLint level)
-{
- ANGLE_TRY(initialize());
-
- const gl::FramebufferAttachment *colorbuffer = framebuffer->getColorbuffer(0);
- ASSERT(colorbuffer);
-
- RenderTarget9 *renderTarget9 = nullptr;
- ANGLE_TRY(colorbuffer->getRenderTarget(context, &renderTarget9));
- ASSERT(renderTarget9);
-
- IDirect3DSurface9 *source = renderTarget9->getSurface();
- ASSERT(source);
-
- IDirect3DSurface9 *destSurface = nullptr;
- TextureStorage9 *storage9 = GetAs<TextureStorage9>(storage);
- gl::Error error = storage9->getSurfaceLevel(context, GL_TEXTURE_2D, level, true, &destSurface);
- if (error.isError())
- {
- SafeRelease(source);
- return error;
- }
- ASSERT(destSurface);
-
- gl::Error result =
- copy(source, nullptr, sourceRect, destFormat, destOffset, destSurface, false, false, false);
-
- SafeRelease(destSurface);
- SafeRelease(source);
-
- return result;
-}
-
-gl::Error Blit9::copyCube(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const RECT &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLenum target,
- GLint level)
-{
- gl::Error error = initialize();
- if (error.isError())
- {
- return error;
- }
-
- const gl::FramebufferAttachment *colorbuffer = framebuffer->getColorbuffer(0);
- ASSERT(colorbuffer);
-
- RenderTarget9 *renderTarget9 = nullptr;
- error = colorbuffer->getRenderTarget(context, &renderTarget9);
- if (error.isError())
- {
- return error;
- }
- ASSERT(renderTarget9);
-
- IDirect3DSurface9 *source = renderTarget9->getSurface();
- ASSERT(source);
-
- IDirect3DSurface9 *destSurface = nullptr;
- TextureStorage9 *storage9 = GetAs<TextureStorage9>(storage);
- error = storage9->getSurfaceLevel(context, target, level, true, &destSurface);
- if (error.isError())
- {
- SafeRelease(source);
- return error;
- }
- ASSERT(destSurface);
-
- gl::Error result =
- copy(source, nullptr, sourceRect, destFormat, destOffset, destSurface, false, false, false);
-
- SafeRelease(destSurface);
- SafeRelease(source);
-
- return result;
-}
-
-gl::Error Blit9::copyTexture(const gl::Context *context,
- const gl::Texture *source,
- GLint sourceLevel,
- const RECT &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLenum destTarget,
- GLint destLevel,
- bool flipY,
- bool premultiplyAlpha,
- bool unmultiplyAlpha)
-{
- ANGLE_TRY(initialize());
-
- const TextureD3D *sourceD3D = GetImplAs<TextureD3D>(source);
-
- TextureStorage *sourceStorage = nullptr;
- ANGLE_TRY(const_cast<TextureD3D *>(sourceD3D)->getNativeTexture(context, &sourceStorage));
-
- TextureStorage9_2D *sourceStorage9 = GetAs<TextureStorage9_2D>(sourceStorage);
- ASSERT(sourceStorage9);
-
- TextureStorage9 *destStorage9 = GetAs<TextureStorage9>(storage);
- ASSERT(destStorage9);
-
- ASSERT(sourceLevel == 0);
- IDirect3DBaseTexture9 *sourceTexture = nullptr;
- ANGLE_TRY(sourceStorage9->getBaseTexture(context, &sourceTexture));
-
- IDirect3DSurface9 *sourceSurface = nullptr;
- ANGLE_TRY(
- sourceStorage9->getSurfaceLevel(context, GL_TEXTURE_2D, sourceLevel, true, &sourceSurface));
-
- IDirect3DSurface9 *destSurface = nullptr;
- gl::Error error =
- destStorage9->getSurfaceLevel(context, destTarget, destLevel, true, &destSurface);
- if (error.isError())
- {
- SafeRelease(sourceSurface);
- return error;
- }
-
- error = copy(sourceSurface, sourceTexture, sourceRect, destFormat, destOffset, destSurface,
- flipY, premultiplyAlpha, unmultiplyAlpha);
-
- SafeRelease(sourceSurface);
- SafeRelease(destSurface);
-
- return error;
-}
-
-gl::Error Blit9::copy(IDirect3DSurface9 *source,
- IDirect3DBaseTexture9 *sourceTexture,
- const RECT &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- IDirect3DSurface9 *dest,
- bool flipY,
- bool premultiplyAlpha,
- bool unmultiplyAlpha)
-{
- ASSERT(source != nullptr && dest != nullptr);
-
- IDirect3DDevice9 *device = mRenderer->getDevice();
-
- D3DSURFACE_DESC sourceDesc;
- D3DSURFACE_DESC destDesc;
- source->GetDesc(&sourceDesc);
- dest->GetDesc(&destDesc);
-
- // Check if it's possible to use StetchRect
- if (sourceDesc.Format == destDesc.Format && (destDesc.Usage & D3DUSAGE_RENDERTARGET) &&
- d3d9_gl::IsFormatChannelEquivalent(destDesc.Format, destFormat) && !flipY &&
- premultiplyAlpha == unmultiplyAlpha)
- {
- RECT destRect = { destOffset.x, destOffset.y, destOffset.x + (sourceRect.right - sourceRect.left), destOffset.y + (sourceRect.bottom - sourceRect.top)};
- HRESULT result = device->StretchRect(source, &sourceRect, dest, &destRect, D3DTEXF_POINT);
-
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::OutOfMemory()
- << "Failed to blit between textures, StretchRect " << gl::FmtHR(result);
- }
-
- return gl::NoError();
- }
- else
- {
- IDirect3DBaseTexture9 *texture = sourceTexture;
- RECT adjustedSourceRect = sourceRect;
- gl::Extents sourceSize(sourceDesc.Width, sourceDesc.Height, 1);
-
- if (texture == nullptr)
- {
- ANGLE_TRY(copySurfaceToTexture(source, sourceRect, &texture));
-
- // copySurfaceToTexture only copies in the sourceRect area of the source surface.
- // Adjust sourceRect so that it is now covering the entire source texture
- adjustedSourceRect.left = 0;
- adjustedSourceRect.right = sourceRect.right - sourceRect.left;
- adjustedSourceRect.top = 0;
- adjustedSourceRect.bottom = sourceRect.bottom - sourceRect.top;
-
- sourceSize.width = sourceRect.right - sourceRect.left;
- sourceSize.height = sourceRect.bottom - sourceRect.top;
- }
- else
- {
- texture->AddRef();
- }
-
- gl::Error error = formatConvert(texture, adjustedSourceRect, sourceSize, destFormat,
- destOffset, dest, flipY, premultiplyAlpha, unmultiplyAlpha);
-
- SafeRelease(texture);
-
- return error;
- }
-}
-
-gl::Error Blit9::formatConvert(IDirect3DBaseTexture9 *source,
- const RECT &sourceRect,
- const gl::Extents &sourceSize,
- GLenum destFormat,
- const gl::Offset &destOffset,
- IDirect3DSurface9 *dest,
- bool flipY,
- bool premultiplyAlpha,
- bool unmultiplyAlpha)
-{
- ANGLE_TRY(initialize());
-
- IDirect3DDevice9 *device = mRenderer->getDevice();
-
- saveState();
-
- device->SetTexture(0, source);
- device->SetRenderTarget(0, dest);
-
- RECT destRect;
- destRect.left = destOffset.x;
- destRect.right = destOffset.x + (sourceRect.right - sourceRect.left);
- destRect.top = destOffset.y;
- destRect.bottom = destOffset.y + (sourceRect.bottom - sourceRect.top);
-
- setViewportAndShaderConstants(sourceRect, sourceSize, destRect, flipY);
-
- setCommonBlitState();
-
- gl::Error error = setFormatConvertShaders(destFormat, flipY, premultiplyAlpha, unmultiplyAlpha);
- if (!error.isError())
- {
- render();
- }
-
- restoreState();
-
- return error;
-}
-
-gl::Error Blit9::setFormatConvertShaders(GLenum destFormat,
- bool flipY,
- bool premultiplyAlpha,
- bool unmultiplyAlpha)
-{
- ANGLE_TRY(setVertexShader(SHADER_VS_STANDARD));
-
- switch (destFormat)
- {
- case GL_RGBA:
- case GL_BGRA_EXT:
- case GL_RGB:
- case GL_RG_EXT:
- case GL_RED_EXT:
- case GL_ALPHA:
- if (premultiplyAlpha == unmultiplyAlpha)
- {
- ANGLE_TRY(setPixelShader(SHADER_PS_COMPONENTMASK));
- }
- else if (premultiplyAlpha)
- {
- ANGLE_TRY(setPixelShader(SHADER_PS_COMPONENTMASK_PREMULTIPLY_ALPHA));
- }
- else
- {
- ASSERT(unmultiplyAlpha);
- ANGLE_TRY(setPixelShader(SHADER_PS_COMPONENTMASK_UNMULTIPLY_ALPHA));
- }
- break;
-
- case GL_LUMINANCE:
- case GL_LUMINANCE_ALPHA:
- if (premultiplyAlpha == unmultiplyAlpha)
- {
- ANGLE_TRY(setPixelShader(SHADER_PS_LUMINANCE));
- }
- else if (premultiplyAlpha)
- {
- ANGLE_TRY(setPixelShader(SHADER_PS_LUMINANCE_PREMULTIPLY_ALPHA));
- }
- else
- {
- ASSERT(unmultiplyAlpha);
- ANGLE_TRY(setPixelShader(SHADER_PS_LUMINANCE_UNMULTIPLY_ALPHA));
- }
- break;
-
- default:
- UNREACHABLE();
- }
-
- enum { X = 0, Y = 1, Z = 2, W = 3 };
-
- // The meaning of this constant depends on the shader that was selected.
- // See the shader assembly code above for details.
- // Allocate one array for both registers and split it into two float4's.
- float psConst[8] = { 0 };
- float *multConst = &psConst[0];
- float *addConst = &psConst[4];
-
- switch (destFormat)
- {
- default: UNREACHABLE();
- case GL_RGBA:
- case GL_BGRA_EXT:
- multConst[X] = 1;
- multConst[Y] = 1;
- multConst[Z] = 1;
- multConst[W] = 1;
- addConst[X] = 0;
- addConst[Y] = 0;
- addConst[Z] = 0;
- addConst[W] = 0;
- break;
-
- case GL_RGB:
- multConst[X] = 1;
- multConst[Y] = 1;
- multConst[Z] = 1;
- multConst[W] = 0;
- addConst[X] = 0;
- addConst[Y] = 0;
- addConst[Z] = 0;
- addConst[W] = 1;
- break;
-
- case GL_RG_EXT:
- multConst[X] = 1;
- multConst[Y] = 1;
- multConst[Z] = 0;
- multConst[W] = 0;
- addConst[X] = 0;
- addConst[Y] = 0;
- addConst[Z] = 0;
- addConst[W] = 1;
- break;
-
- case GL_RED_EXT:
- multConst[X] = 1;
- multConst[Y] = 0;
- multConst[Z] = 0;
- multConst[W] = 0;
- addConst[X] = 0;
- addConst[Y] = 0;
- addConst[Z] = 0;
- addConst[W] = 1;
- break;
-
- case GL_ALPHA:
- multConst[X] = 0;
- multConst[Y] = 0;
- multConst[Z] = 0;
- multConst[W] = 1;
- addConst[X] = 0;
- addConst[Y] = 0;
- addConst[Z] = 0;
- addConst[W] = 0;
- break;
-
- case GL_LUMINANCE:
- multConst[X] = 1;
- multConst[Y] = 0;
- multConst[Z] = 0;
- multConst[W] = 0;
- addConst[X] = 0;
- addConst[Y] = 0;
- addConst[Z] = 0;
- addConst[W] = 1;
- break;
-
- case GL_LUMINANCE_ALPHA:
- multConst[X] = 1;
- multConst[Y] = 0;
- multConst[Z] = 0;
- multConst[W] = 1;
- addConst[X] = 0;
- addConst[Y] = 0;
- addConst[Z] = 0;
- addConst[W] = 0;
- break;
- }
-
- mRenderer->getDevice()->SetPixelShaderConstantF(0, psConst, 2);
-
- return gl::NoError();
-}
-
-gl::Error Blit9::copySurfaceToTexture(IDirect3DSurface9 *surface,
- const RECT &sourceRect,
- IDirect3DBaseTexture9 **outTexture)
-{
- ASSERT(surface);
-
- IDirect3DDevice9 *device = mRenderer->getDevice();
-
- D3DSURFACE_DESC sourceDesc;
- surface->GetDesc(&sourceDesc);
-
- // Copy the render target into a texture
- IDirect3DTexture9 *texture;
- HRESULT result = device->CreateTexture(
- sourceRect.right - sourceRect.left, sourceRect.bottom - sourceRect.top, 1,
- D3DUSAGE_RENDERTARGET, sourceDesc.Format, D3DPOOL_DEFAULT, &texture, nullptr);
-
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::OutOfMemory() << "Failed to allocate internal texture for blit, "
- << gl::FmtHR(result);
- }
-
- IDirect3DSurface9 *textureSurface;
- result = texture->GetSurfaceLevel(0, &textureSurface);
-
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- SafeRelease(texture);
- return gl::OutOfMemory() << "Failed to query surface of internal blit texture, "
- << gl::FmtHR(result);
- }
-
- mRenderer->endScene();
- result = device->StretchRect(surface, &sourceRect, textureSurface, nullptr, D3DTEXF_NONE);
-
- SafeRelease(textureSurface);
-
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- SafeRelease(texture);
- return gl::OutOfMemory() << "Failed to copy between internal blit textures, "
- << gl::FmtHR(result);
- }
-
- *outTexture = texture;
- return gl::NoError();
-}
-
-void Blit9::setViewportAndShaderConstants(const RECT &sourceRect,
- const gl::Extents &sourceSize,
- const RECT &destRect,
- bool flipY)
-{
- IDirect3DDevice9 *device = mRenderer->getDevice();
-
- D3DVIEWPORT9 vp;
- vp.X = destRect.left;
- vp.Y = destRect.top;
- vp.Width = destRect.right - destRect.left;
- vp.Height = destRect.bottom - destRect.top;
- vp.MinZ = 0.0f;
- vp.MaxZ = 1.0f;
- device->SetViewport(&vp);
-
- float vertexConstants[8] = {
- // halfPixelAdjust
- -1.0f / vp.Width, 1.0f / vp.Height, 0, 0,
- // texcoordOffset
- static_cast<float>(sourceRect.left) / sourceSize.width,
- static_cast<float>(flipY ? sourceRect.bottom : sourceRect.top) / sourceSize.height,
- static_cast<float>(sourceRect.right - sourceRect.left) / sourceSize.width,
- static_cast<float>(flipY ? sourceRect.top - sourceRect.bottom
- : sourceRect.bottom - sourceRect.top) /
- sourceSize.height,
- };
-
- device->SetVertexShaderConstantF(0, vertexConstants, 2);
-}
-
-void Blit9::setCommonBlitState()
-{
- IDirect3DDevice9 *device = mRenderer->getDevice();
-
- device->SetDepthStencilSurface(nullptr);
-
- device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
- device->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
- device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
- device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
- device->SetRenderState(D3DRS_CLIPPLANEENABLE, 0);
- device->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED);
- device->SetRenderState(D3DRS_SRGBWRITEENABLE, FALSE);
- device->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE);
-
- device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
- device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
- device->SetSamplerState(0, D3DSAMP_SRGBTEXTURE, FALSE);
- device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
- device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
-
- RECT scissorRect = {0}; // Scissoring is disabled for flipping, but we need this to capture and restore the old rectangle
- device->SetScissorRect(&scissorRect);
-
- for(int i = 0; i < gl::MAX_VERTEX_ATTRIBS; i++)
- {
- device->SetStreamSourceFreq(i, 1);
- }
-}
-
-void Blit9::render()
-{
- IDirect3DDevice9 *device = mRenderer->getDevice();
-
- HRESULT hr = device->SetStreamSource(0, mQuadVertexBuffer, 0, 2 * sizeof(float));
- hr = device->SetVertexDeclaration(mQuadVertexDeclaration);
-
- mRenderer->startScene();
- hr = device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
-}
-
-void Blit9::saveState()
-{
- IDirect3DDevice9 *device = mRenderer->getDevice();
-
- HRESULT hr;
-
- device->GetDepthStencilSurface(&mSavedDepthStencil);
- device->GetRenderTarget(0, &mSavedRenderTarget);
-
- if (mSavedStateBlock == nullptr)
- {
- hr = device->BeginStateBlock();
- ASSERT(SUCCEEDED(hr) || hr == D3DERR_OUTOFVIDEOMEMORY || hr == E_OUTOFMEMORY);
-
- setCommonBlitState();
-
- static const float dummyConst[8] = { 0 };
-
- device->SetVertexShader(nullptr);
- device->SetVertexShaderConstantF(0, dummyConst, 2);
- device->SetPixelShader(nullptr);
- device->SetPixelShaderConstantF(0, dummyConst, 2);
-
- D3DVIEWPORT9 dummyVp;
- dummyVp.X = 0;
- dummyVp.Y = 0;
- dummyVp.Width = 1;
- dummyVp.Height = 1;
- dummyVp.MinZ = 0;
- dummyVp.MaxZ = 1;
-
- device->SetViewport(&dummyVp);
-
- device->SetTexture(0, nullptr);
-
- device->SetStreamSource(0, mQuadVertexBuffer, 0, 0);
-
- device->SetVertexDeclaration(mQuadVertexDeclaration);
-
- hr = device->EndStateBlock(&mSavedStateBlock);
- ASSERT(SUCCEEDED(hr) || hr == D3DERR_OUTOFVIDEOMEMORY || hr == E_OUTOFMEMORY);
- }
-
- ASSERT(mSavedStateBlock != nullptr);
-
- if (mSavedStateBlock != nullptr)
- {
- hr = mSavedStateBlock->Capture();
- ASSERT(SUCCEEDED(hr));
- }
-}
-
-void Blit9::restoreState()
-{
- IDirect3DDevice9 *device = mRenderer->getDevice();
-
- device->SetDepthStencilSurface(mSavedDepthStencil);
- SafeRelease(mSavedDepthStencil);
-
- device->SetRenderTarget(0, mSavedRenderTarget);
- SafeRelease(mSavedRenderTarget);
-
- ASSERT(mSavedStateBlock != nullptr);
-
- if (mSavedStateBlock != nullptr)
- {
- mSavedStateBlock->Apply();
- }
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.h
deleted file mode 100644
index 026874f8ae..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.h
+++ /dev/null
@@ -1,153 +0,0 @@
-//
-// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Blit9.cpp: Surface copy utility class.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_BLIT9_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_BLIT9_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/Error.h"
-
-#include <GLES2/gl2.h>
-
-namespace gl
-{
-class Context;
-class Framebuffer;
-class Texture;
-struct Extents;
-struct Offset;
-}
-
-namespace rx
-{
-class Renderer9;
-class TextureStorage;
-
-class Blit9 : angle::NonCopyable
-{
- public:
- explicit Blit9(Renderer9 *renderer);
- ~Blit9();
-
- gl::Error initialize();
-
- // Copy from source surface to dest surface.
- // sourceRect, xoffset, yoffset are in D3D coordinates (0,0 in upper-left)
- gl::Error copy2D(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const RECT &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLint level);
- gl::Error copyCube(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const RECT &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLenum target,
- GLint level);
- gl::Error copyTexture(const gl::Context *context,
- const gl::Texture *source,
- GLint sourceLevel,
- const RECT &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLenum destTarget,
- GLint destLevel,
- bool flipY,
- bool premultiplyAlpha,
- bool unmultiplyAlpha);
-
- // 2x2 box filter sample from source to dest.
- // Requires that source is RGB(A) and dest has the same format as source.
- gl::Error boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest);
-
- private:
- Renderer9 *mRenderer;
-
- bool mGeometryLoaded;
- IDirect3DVertexBuffer9 *mQuadVertexBuffer;
- IDirect3DVertexDeclaration9 *mQuadVertexDeclaration;
-
- // Copy from source texture to dest surface.
- // sourceRect, xoffset, yoffset are in D3D coordinates (0,0 in upper-left)
- // source is interpreted as RGBA and destFormat specifies the desired result format. For
- // example, if destFormat = GL_RGB, the alpha channel will be forced to 0.
- gl::Error formatConvert(IDirect3DBaseTexture9 *source,
- const RECT &sourceRect,
- const gl::Extents &sourceSize,
- GLenum destFormat,
- const gl::Offset &destOffset,
- IDirect3DSurface9 *dest,
- bool flipY,
- bool premultiplyAlpha,
- bool unmultiplyAlpha);
- gl::Error setFormatConvertShaders(GLenum destFormat,
- bool flipY,
- bool premultiplyAlpha,
- bool unmultiplyAlpha);
-
- gl::Error copy(IDirect3DSurface9 *source,
- IDirect3DBaseTexture9 *sourceTexture,
- const RECT &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- IDirect3DSurface9 *dest,
- bool flipY,
- bool premultiplyAlpha,
- bool unmultiplyAlpha);
- gl::Error copySurfaceToTexture(IDirect3DSurface9 *surface,
- const RECT &sourceRect,
- IDirect3DBaseTexture9 **outTexture);
- void setViewportAndShaderConstants(const RECT &sourceRect,
- const gl::Extents &sourceSize,
- const RECT &destRect,
- bool flipY);
- void setCommonBlitState();
- RECT getSurfaceRect(IDirect3DSurface9 *surface) const;
- gl::Extents getSurfaceSize(IDirect3DSurface9 *surface) const;
-
- // This enum is used to index mCompiledShaders and mShaderSource.
- enum ShaderId
- {
- SHADER_VS_STANDARD,
- SHADER_PS_PASSTHROUGH,
- SHADER_PS_LUMINANCE,
- SHADER_PS_LUMINANCE_PREMULTIPLY_ALPHA,
- SHADER_PS_LUMINANCE_UNMULTIPLY_ALPHA,
- SHADER_PS_COMPONENTMASK,
- SHADER_PS_COMPONENTMASK_PREMULTIPLY_ALPHA,
- SHADER_PS_COMPONENTMASK_UNMULTIPLY_ALPHA,
- SHADER_COUNT,
- };
-
- // This actually contains IDirect3DVertexShader9 or IDirect3DPixelShader9 casted to IUnknown.
- IUnknown *mCompiledShaders[SHADER_COUNT];
-
- template <class D3DShaderType>
- gl::Error setShader(ShaderId source, const char *profile,
- gl::Error (Renderer9::*createShader)(const DWORD *, size_t length, D3DShaderType **outShader),
- HRESULT (WINAPI IDirect3DDevice9::*setShader)(D3DShaderType*));
-
- gl::Error setVertexShader(ShaderId shader);
- gl::Error setPixelShader(ShaderId shader);
- void render();
-
- void saveState();
- void restoreState();
- IDirect3DStateBlock9 *mSavedStateBlock;
- IDirect3DSurface9 *mSavedRenderTarget;
- IDirect3DSurface9 *mSavedDepthStencil;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_BLIT9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp
deleted file mode 100644
index dc308e7752..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Buffer9.cpp Defines the Buffer9 class.
-
-#include "libANGLE/renderer/d3d/d3d9/Buffer9.h"
-#include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
-
-namespace rx
-{
-
-Buffer9::Buffer9(const gl::BufferState &state, Renderer9 *renderer)
- : BufferD3D(state, renderer), mSize(0)
-{
-}
-
-Buffer9::~Buffer9()
-{
- mSize = 0;
-}
-
-size_t Buffer9::getSize() const
-{
- return mSize;
-}
-
-bool Buffer9::supportsDirectBinding() const
-{
- return false;
-}
-
-gl::Error Buffer9::setData(const gl::Context *context,
- gl::BufferBinding /*target*/,
- const void *data,
- size_t size,
- gl::BufferUsage usage)
-{
- if (size > mMemory.size())
- {
- if (!mMemory.resize(size))
- {
- return gl::OutOfMemory() << "Failed to resize internal buffer.";
- }
- }
-
- mSize = size;
- if (data && size > 0)
- {
- memcpy(mMemory.data(), data, size);
- }
-
- updateD3DBufferUsage(context, usage);
-
- invalidateStaticData(context);
-
- return gl::NoError();
-}
-
-gl::Error Buffer9::getData(const gl::Context *context, const uint8_t **outData)
-{
- *outData = mMemory.data();
- return gl::NoError();
-}
-
-gl::Error Buffer9::setSubData(const gl::Context *context,
- gl::BufferBinding /*target*/,
- const void *data,
- size_t size,
- size_t offset)
-{
- if (offset + size > mMemory.size())
- {
- if (!mMemory.resize(offset + size))
- {
- return gl::OutOfMemory() << "Failed to resize internal buffer.";
- }
- }
-
- mSize = std::max(mSize, offset + size);
- if (data && size > 0)
- {
- memcpy(mMemory.data() + offset, data, size);
- }
-
- invalidateStaticData(context);
-
- return gl::NoError();
-}
-
-gl::Error Buffer9::copySubData(const gl::Context *context,
- BufferImpl *source,
- GLintptr sourceOffset,
- GLintptr destOffset,
- GLsizeiptr size)
-{
- // Note: this method is currently unreachable
- Buffer9 *sourceBuffer = GetAs<Buffer9>(source);
- ASSERT(sourceBuffer);
-
- memcpy(mMemory.data() + destOffset, sourceBuffer->mMemory.data() + sourceOffset, size);
-
- invalidateStaticData(context);
-
- return gl::NoError();
-}
-
-// We do not support buffer mapping in D3D9
-gl::Error Buffer9::map(const gl::Context *context, GLenum access, void **mapPtr)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error Buffer9::mapRange(const gl::Context *context,
- size_t offset,
- size_t length,
- GLbitfield access,
- void **mapPtr)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error Buffer9::unmap(const gl::Context *context, GLboolean *result)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error Buffer9::markTransformFeedbackUsage(const gl::Context *context)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.h
deleted file mode 100644
index 960b2a2474..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.h
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Buffer9.h: Defines the rx::Buffer9 class which implements rx::BufferImpl via rx::BufferD3D.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_BUFFER9_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_BUFFER9_H_
-
-#include "common/MemoryBuffer.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/renderer/d3d/BufferD3D.h"
-
-namespace rx
-{
-class Renderer9;
-
-class Buffer9 : public BufferD3D
-{
- public:
- Buffer9(const gl::BufferState &state, Renderer9 *renderer);
- ~Buffer9() override;
-
- // BufferD3D implementation
- size_t getSize() const override;
- bool supportsDirectBinding() const override;
- gl::Error getData(const gl::Context *context, const uint8_t **outData) override;
-
- // BufferImpl implementation
- gl::Error setData(const gl::Context *context,
- gl::BufferBinding target,
- const void *data,
- size_t size,
- gl::BufferUsage usage) override;
- gl::Error setSubData(const gl::Context *context,
- gl::BufferBinding target,
- const void *data,
- size_t size,
- size_t offset) override;
- gl::Error copySubData(const gl::Context *context,
- BufferImpl *source,
- GLintptr sourceOffset,
- GLintptr destOffset,
- GLsizeiptr size) override;
- gl::Error map(const gl::Context *context, GLenum access, void **mapPtr) override;
- gl::Error mapRange(const gl::Context *context,
- size_t offset,
- size_t length,
- GLbitfield access,
- void **mapPtr) override;
- gl::Error unmap(const gl::Context *context, GLboolean *result) override;
- gl::Error markTransformFeedbackUsage(const gl::Context *context) override;
-
- private:
- angle::MemoryBuffer mMemory;
- size_t mSize;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_BUFFER9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Context9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Context9.cpp
deleted file mode 100644
index 1b9874cc20..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Context9.cpp
+++ /dev/null
@@ -1,303 +0,0 @@
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context9:
-// D3D9-specific functionality associated with a GL Context.
-//
-
-#include "libANGLE/renderer/d3d/d3d9/Context9.h"
-
-#include "common/string_utils.h"
-#include "libANGLE/renderer/d3d/CompilerD3D.h"
-#include "libANGLE/renderer/d3d/ProgramD3D.h"
-#include "libANGLE/renderer/d3d/RenderbufferD3D.h"
-#include "libANGLE/renderer/d3d/SamplerD3D.h"
-#include "libANGLE/renderer/d3d/ShaderD3D.h"
-#include "libANGLE/renderer/d3d/TextureD3D.h"
-#include "libANGLE/renderer/d3d/d3d9/Buffer9.h"
-#include "libANGLE/renderer/d3d/d3d9/Fence9.h"
-#include "libANGLE/renderer/d3d/d3d9/Framebuffer9.h"
-#include "libANGLE/renderer/d3d/d3d9/Query9.h"
-#include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
-#include "libANGLE/renderer/d3d/d3d9/StateManager9.h"
-#include "libANGLE/renderer/d3d/d3d9/VertexArray9.h"
-
-namespace rx
-{
-
-Context9::Context9(const gl::ContextState &state, Renderer9 *renderer)
- : ContextImpl(state), mRenderer(renderer)
-{
-}
-
-Context9::~Context9()
-{
-}
-
-gl::Error Context9::initialize()
-{
- return gl::NoError();
-}
-
-CompilerImpl *Context9::createCompiler()
-{
- return new CompilerD3D(SH_HLSL_3_0_OUTPUT);
-}
-
-ShaderImpl *Context9::createShader(const gl::ShaderState &data)
-{
- return new ShaderD3D(data, mRenderer->getWorkarounds(), mRenderer->getNativeExtensions());
-}
-
-ProgramImpl *Context9::createProgram(const gl::ProgramState &data)
-{
- return new ProgramD3D(data, mRenderer);
-}
-
-FramebufferImpl *Context9::createFramebuffer(const gl::FramebufferState &data)
-{
- return new Framebuffer9(data, mRenderer);
-}
-
-TextureImpl *Context9::createTexture(const gl::TextureState &state)
-{
- switch (state.getTarget())
- {
- case GL_TEXTURE_2D:
- return new TextureD3D_2D(state, mRenderer);
- case GL_TEXTURE_CUBE_MAP:
- return new TextureD3D_Cube(state, mRenderer);
- case GL_TEXTURE_EXTERNAL_OES:
- return new TextureD3D_External(state, mRenderer);
- default:
- UNREACHABLE();
- }
- return nullptr;
-}
-
-RenderbufferImpl *Context9::createRenderbuffer()
-{
- return new RenderbufferD3D(mRenderer);
-}
-
-BufferImpl *Context9::createBuffer(const gl::BufferState &state)
-{
- return new Buffer9(state, mRenderer);
-}
-
-VertexArrayImpl *Context9::createVertexArray(const gl::VertexArrayState &data)
-{
- return new VertexArray9(data);
-}
-
-QueryImpl *Context9::createQuery(GLenum type)
-{
- return new Query9(mRenderer, type);
-}
-
-FenceNVImpl *Context9::createFenceNV()
-{
- return new FenceNV9(mRenderer);
-}
-
-SyncImpl *Context9::createSync()
-{
- // D3D9 doesn't support ES 3.0 and its sync objects.
- UNREACHABLE();
- return nullptr;
-}
-
-TransformFeedbackImpl *Context9::createTransformFeedback(const gl::TransformFeedbackState &state)
-{
- UNREACHABLE();
- return nullptr;
-}
-
-SamplerImpl *Context9::createSampler(const gl::SamplerState &state)
-{
- return new SamplerD3D(state);
-}
-
-ProgramPipelineImpl *Context9::createProgramPipeline(const gl::ProgramPipelineState &data)
-{
- UNREACHABLE();
- return nullptr;
-}
-
-std::vector<PathImpl *> Context9::createPaths(GLsizei)
-{
- return std::vector<PathImpl *>();
-}
-
-gl::Error Context9::flush(const gl::Context *context)
-{
- return mRenderer->flush();
-}
-
-gl::Error Context9::finish(const gl::Context *context)
-{
- return mRenderer->finish();
-}
-
-gl::Error Context9::drawArrays(const gl::Context *context, GLenum mode, GLint first, GLsizei count)
-{
- return mRenderer->genericDrawArrays(context, mode, first, count, 0);
-}
-
-gl::Error Context9::drawArraysInstanced(const gl::Context *context,
- GLenum mode,
- GLint first,
- GLsizei count,
- GLsizei instanceCount)
-{
- return mRenderer->genericDrawArrays(context, mode, first, count, instanceCount);
-}
-
-gl::Error Context9::drawElements(const gl::Context *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices)
-{
- return mRenderer->genericDrawElements(context, mode, count, type, indices, 0);
-}
-
-gl::Error Context9::drawElementsInstanced(const gl::Context *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei instances)
-{
- return mRenderer->genericDrawElements(context, mode, count, type, indices, instances);
-}
-
-gl::Error Context9::drawRangeElements(const gl::Context *context,
- GLenum mode,
- GLuint start,
- GLuint end,
- GLsizei count,
- GLenum type,
- const void *indices)
-{
- return mRenderer->genericDrawElements(context, mode, count, type, indices, 0);
-}
-
-gl::Error Context9::drawArraysIndirect(const gl::Context *context,
- GLenum mode,
- const void *indirect)
-{
- UNREACHABLE();
- return gl::InternalError() << "D3D9 doesn't support ES 3.1 DrawArraysIndirect API";
-}
-
-gl::Error Context9::drawElementsIndirect(const gl::Context *context,
- GLenum mode,
- GLenum type,
- const void *indirect)
-{
- UNREACHABLE();
- return gl::InternalError() << "D3D9 doesn't support ES 3.1 DrawElementsIndirect API";
-}
-
-GLenum Context9::getResetStatus()
-{
- return mRenderer->getResetStatus();
-}
-
-std::string Context9::getVendorString() const
-{
- return mRenderer->getVendorString();
-}
-
-std::string Context9::getRendererDescription() const
-{
- return mRenderer->getRendererDescription();
-}
-
-void Context9::insertEventMarker(GLsizei length, const char *marker)
-{
- auto optionalString = angle::WidenString(static_cast<size_t>(length), marker);
- if (optionalString.valid())
- {
- mRenderer->getAnnotator()->setMarker(optionalString.value().data());
- }
-}
-
-void Context9::pushGroupMarker(GLsizei length, const char *marker)
-{
- auto optionalString = angle::WidenString(static_cast<size_t>(length), marker);
- if (optionalString.valid())
- {
- mRenderer->getAnnotator()->beginEvent(optionalString.value().data());
- }
-}
-
-void Context9::popGroupMarker()
-{
- mRenderer->getAnnotator()->endEvent();
-}
-
-void Context9::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const char *message)
-{
- // Fall through to the EXT_debug_marker functions
- pushGroupMarker(length, message);
-}
-
-void Context9::popDebugGroup()
-{
- // Fall through to the EXT_debug_marker functions
- popGroupMarker();
-}
-
-void Context9::syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits)
-{
- mRenderer->getStateManager()->syncState(mState.getState(), dirtyBits);
-}
-
-GLint Context9::getGPUDisjoint()
-{
- return mRenderer->getGPUDisjoint();
-}
-
-GLint64 Context9::getTimestamp()
-{
- return mRenderer->getTimestamp();
-}
-
-void Context9::onMakeCurrent(const gl::Context *context)
-{
-}
-
-const gl::Caps &Context9::getNativeCaps() const
-{
- return mRenderer->getNativeCaps();
-}
-
-const gl::TextureCapsMap &Context9::getNativeTextureCaps() const
-{
- return mRenderer->getNativeTextureCaps();
-}
-
-const gl::Extensions &Context9::getNativeExtensions() const
-{
- return mRenderer->getNativeExtensions();
-}
-
-const gl::Limitations &Context9::getNativeLimitations() const
-{
- return mRenderer->getNativeLimitations();
-}
-
-gl::Error Context9::dispatchCompute(const gl::Context *context,
- GLuint numGroupsX,
- GLuint numGroupsY,
- GLuint numGroupsZ)
-{
- UNREACHABLE();
- return gl::InternalError() << "D3D9 doesn't support ES 3.1 DispatchCompute API";
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Context9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Context9.h
deleted file mode 100644
index d681bfde89..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Context9.h
+++ /dev/null
@@ -1,151 +0,0 @@
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Context9:
-// D3D9-specific functionality associated with a GL Context.
-//
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_CONTEXT9_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_CONTEXT9_H_
-
-#include "libANGLE/renderer/ContextImpl.h"
-
-namespace rx
-{
-class Renderer9;
-
-class Context9 : public ContextImpl
-{
- public:
- Context9(const gl::ContextState &state, Renderer9 *renderer);
- ~Context9() override;
-
- gl::Error initialize() override;
-
- // Shader creation
- CompilerImpl *createCompiler() override;
- ShaderImpl *createShader(const gl::ShaderState &data) override;
- ProgramImpl *createProgram(const gl::ProgramState &data) override;
-
- // Framebuffer creation
- FramebufferImpl *createFramebuffer(const gl::FramebufferState &data) override;
-
- // Texture creation
- TextureImpl *createTexture(const gl::TextureState &state) override;
-
- // Renderbuffer creation
- RenderbufferImpl *createRenderbuffer() override;
-
- // Buffer creation
- BufferImpl *createBuffer(const gl::BufferState &state) override;
-
- // Vertex Array creation
- VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override;
-
- // Query and Fence creation
- QueryImpl *createQuery(GLenum type) override;
- FenceNVImpl *createFenceNV() override;
- SyncImpl *createSync() override;
-
- // Transform Feedback creation
- TransformFeedbackImpl *createTransformFeedback(
- const gl::TransformFeedbackState &state) override;
-
- // Sampler object creation
- SamplerImpl *createSampler(const gl::SamplerState &state) override;
-
- // Program Pipeline object creation
- ProgramPipelineImpl *createProgramPipeline(const gl::ProgramPipelineState &data) override;
-
- // Path object creation
- std::vector<PathImpl *> createPaths(GLsizei) override;
-
- // Flush and finish.
- gl::Error flush(const gl::Context *context) override;
- gl::Error finish(const gl::Context *context) override;
-
- // Drawing methods.
- gl::Error drawArrays(const gl::Context *context,
- GLenum mode,
- GLint first,
- GLsizei count) override;
- gl::Error drawArraysInstanced(const gl::Context *context,
- GLenum mode,
- GLint first,
- GLsizei count,
- GLsizei instanceCount) override;
-
- gl::Error drawElements(const gl::Context *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices) override;
- gl::Error drawElementsInstanced(const gl::Context *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei instances) override;
- gl::Error drawRangeElements(const gl::Context *context,
- GLenum mode,
- GLuint start,
- GLuint end,
- GLsizei count,
- GLenum type,
- const void *indices) override;
- gl::Error drawArraysIndirect(const gl::Context *context,
- GLenum mode,
- const void *indirect) override;
- gl::Error drawElementsIndirect(const gl::Context *context,
- GLenum mode,
- GLenum type,
- const void *indirect) override;
-
- // Device loss
- GLenum getResetStatus() override;
-
- // Vendor and description strings.
- std::string getVendorString() const override;
- std::string getRendererDescription() const override;
-
- // EXT_debug_marker
- void insertEventMarker(GLsizei length, const char *marker) override;
- void pushGroupMarker(GLsizei length, const char *marker) override;
- void popGroupMarker() override;
-
- // KHR_debug
- void pushDebugGroup(GLenum source, GLuint id, GLsizei length, const char *message) override;
- void popDebugGroup() override;
-
- // State sync with dirty bits.
- void syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits) override;
-
- // Disjoint timer queries
- GLint getGPUDisjoint() override;
- GLint64 getTimestamp() override;
-
- // Context switching
- void onMakeCurrent(const gl::Context *context) override;
-
- // Caps queries
- const gl::Caps &getNativeCaps() const override;
- const gl::TextureCapsMap &getNativeTextureCaps() const override;
- const gl::Extensions &getNativeExtensions() const override;
- const gl::Limitations &getNativeLimitations() const override;
-
- gl::Error dispatchCompute(const gl::Context *context,
- GLuint numGroupsX,
- GLuint numGroupsY,
- GLuint numGroupsZ) override;
-
- Renderer9 *getRenderer() const { return mRenderer; }
-
- private:
- Renderer9 *mRenderer;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_CONTEXT9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.cpp
deleted file mode 100644
index 6ec35e16a7..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-//
-// Copyright 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// DebugAnnotator9.h: D3D9 helpers for adding trace annotations.
-//
-
-#include "libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h"
-
-#include "common/platform.h"
-
-namespace rx
-{
-
-void DebugAnnotator9::beginEvent(const wchar_t *eventName)
-{
- D3DPERF_BeginEvent(0, eventName);
-}
-
-void DebugAnnotator9::endEvent()
-{
- D3DPERF_EndEvent();
-}
-
-void DebugAnnotator9::setMarker(const wchar_t *markerName)
-{
- D3DPERF_SetMarker(0, markerName);
-}
-
-bool DebugAnnotator9::getStatus()
-{
- return !!D3DPERF_GetStatus();
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h
deleted file mode 100644
index b28008335f..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// Copyright 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// DebugAnnotator9.h: D3D9 helpers for adding trace annotations.
-//
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_DEBUGANNOTATOR9_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_DEBUGANNOTATOR9_H_
-
-#include "libANGLE/LoggingAnnotator.h"
-
-namespace rx
-{
-
-class DebugAnnotator9 : public angle::LoggingAnnotator
-{
- public:
- DebugAnnotator9() {}
- void beginEvent(const wchar_t *eventName) override;
- void endEvent() override;
- void setMarker(const wchar_t *markerName) override;
- bool getStatus() override;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_DEBUGANNOTATOR9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.cpp
deleted file mode 100644
index bff3881655..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Fence9.cpp: Defines the rx::FenceNV9 class.
-
-#include "libANGLE/renderer/d3d/d3d9/Fence9.h"
-#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h"
-#include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
-
-namespace rx
-{
-
-FenceNV9::FenceNV9(Renderer9 *renderer) : FenceNVImpl(), mRenderer(renderer), mQuery(nullptr)
-{
-}
-
-FenceNV9::~FenceNV9()
-{
- SafeRelease(mQuery);
-}
-
-gl::Error FenceNV9::set(GLenum condition)
-{
- if (!mQuery)
- {
- gl::Error error = mRenderer->allocateEventQuery(&mQuery);
- if (error.isError())
- {
- return error;
- }
- }
-
- HRESULT result = mQuery->Issue(D3DISSUE_END);
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- SafeRelease(mQuery);
- return gl::OutOfMemory() << "Failed to end event query, " << gl::FmtHR(result);
- }
-
- return gl::NoError();
-}
-
-gl::Error FenceNV9::test(GLboolean *outFinished)
-{
- return testHelper(true, outFinished);
-}
-
-gl::Error FenceNV9::finish()
-{
- GLboolean finished = GL_FALSE;
- while (finished != GL_TRUE)
- {
- gl::Error error = testHelper(true, &finished);
- if (error.isError())
- {
- return error;
- }
-
- Sleep(0);
- }
-
- return gl::NoError();
-}
-
-gl::Error FenceNV9::testHelper(bool flushCommandBuffer, GLboolean *outFinished)
-{
- ASSERT(mQuery);
-
- DWORD getDataFlags = (flushCommandBuffer ? D3DGETDATA_FLUSH : 0);
- HRESULT result = mQuery->GetData(nullptr, 0, getDataFlags);
-
- if (d3d9::isDeviceLostError(result))
- {
- mRenderer->notifyDeviceLost();
- return gl::OutOfMemory() << "Device was lost while querying result of an event query.";
- }
- else if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to get query data, " << gl::FmtHR(result);
- }
-
- ASSERT(result == S_OK || result == S_FALSE);
- *outFinished = ((result == S_OK) ? GL_TRUE : GL_FALSE);
- return gl::NoError();
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.h
deleted file mode 100644
index de0ff20774..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.h
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Fence9.h: Defines the rx::FenceNV9 class which implements rx::FenceNVImpl.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_FENCE9_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_FENCE9_H_
-
-#include "libANGLE/renderer/FenceNVImpl.h"
-#include "libANGLE/renderer/SyncImpl.h"
-
-namespace rx
-{
-class Renderer9;
-
-class FenceNV9 : public FenceNVImpl
-{
- public:
- explicit FenceNV9(Renderer9 *renderer);
- ~FenceNV9() override;
-
- gl::Error set(GLenum condition) override;
- gl::Error test(GLboolean *outFinished) override;
- gl::Error finish() override;
-
- private:
- gl::Error testHelper(bool flushCommandBuffer, GLboolean *outFinished);
-
- Renderer9 *mRenderer;
- IDirect3DQuery9 *mQuery;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_FENCE9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp
deleted file mode 100644
index dff12e03f8..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp
+++ /dev/null
@@ -1,411 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Framebuffer9.cpp: Implements the Framebuffer9 class.
-
-#include "libANGLE/renderer/d3d/d3d9/Framebuffer9.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/ContextImpl.h"
-#include "libANGLE/renderer/d3d/TextureD3D.h"
-#include "libANGLE/renderer/d3d/d3d9/RenderTarget9.h"
-#include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
-#include "libANGLE/renderer/d3d/d3d9/TextureStorage9.h"
-#include "libANGLE/renderer/d3d/d3d9/formatutils9.h"
-#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h"
-#include "libANGLE/renderer/renderer_utils.h"
-
-namespace rx
-{
-
-Framebuffer9::Framebuffer9(const gl::FramebufferState &data, Renderer9 *renderer)
- : FramebufferD3D(data, renderer), mRenderer(renderer)
-{
- ASSERT(mRenderer != nullptr);
-}
-
-Framebuffer9::~Framebuffer9()
-{
-}
-
-gl::Error Framebuffer9::discard(const gl::Context *context, size_t, const GLenum *)
-{
- // Extension not implemented in D3D9 renderer
- UNREACHABLE();
- return gl::NoError();
-}
-
-gl::Error Framebuffer9::invalidate(const gl::Context *context, size_t, const GLenum *)
-{
- // Shouldn't ever reach here in D3D9
- UNREACHABLE();
- return gl::NoError();
-}
-
-gl::Error Framebuffer9::invalidateSub(const gl::Context *context,
- size_t,
- const GLenum *,
- const gl::Rectangle &)
-{
- // Shouldn't ever reach here in D3D9
- UNREACHABLE();
- return gl::NoError();
-}
-
-gl::Error Framebuffer9::clearImpl(const gl::Context *context, const ClearParameters &clearParams)
-{
- const gl::FramebufferAttachment *colorAttachment = mState.getColorAttachment(0);
- const gl::FramebufferAttachment *depthStencilAttachment = mState.getDepthOrStencilAttachment();
-
- ANGLE_TRY(mRenderer->applyRenderTarget(context, colorAttachment, depthStencilAttachment));
-
- const gl::State &glState = context->getGLState();
- float nearZ = glState.getNearPlane();
- float farZ = glState.getFarPlane();
- mRenderer->setViewport(glState.getViewport(), nearZ, farZ, GL_TRIANGLES,
- glState.getRasterizerState().frontFace, true);
-
- mRenderer->setScissorRectangle(glState.getScissor(), glState.isScissorTestEnabled());
-
- return mRenderer->clear(context, clearParams, colorAttachment, depthStencilAttachment);
-}
-
-gl::Error Framebuffer9::readPixelsImpl(const gl::Context *context,
- const gl::Rectangle &area,
- GLenum format,
- GLenum type,
- size_t outputPitch,
- const gl::PixelPackState &pack,
- uint8_t *pixels)
-{
- const gl::FramebufferAttachment *colorbuffer = mState.getColorAttachment(0);
- ASSERT(colorbuffer);
-
- RenderTarget9 *renderTarget = nullptr;
- ANGLE_TRY(colorbuffer->getRenderTarget(context, &renderTarget));
- ASSERT(renderTarget);
-
- IDirect3DSurface9 *surface = renderTarget->getSurface();
- ASSERT(surface);
-
- D3DSURFACE_DESC desc;
- surface->GetDesc(&desc);
-
- if (desc.MultiSampleType != D3DMULTISAMPLE_NONE)
- {
- UNIMPLEMENTED(); // FIXME: Requires resolve using StretchRect into non-multisampled render target
- SafeRelease(surface);
- return gl::OutOfMemory()
- << "ReadPixels is unimplemented for multisampled framebuffer attachments.";
- }
-
- IDirect3DDevice9 *device = mRenderer->getDevice();
- ASSERT(device);
-
- HRESULT result;
- IDirect3DSurface9 *systemSurface = nullptr;
- bool directToPixels = !pack.reverseRowOrder && pack.alignment <= 4 && mRenderer->getShareHandleSupport() &&
- area.x == 0 && area.y == 0 &&
- static_cast<UINT>(area.width) == desc.Width && static_cast<UINT>(area.height) == desc.Height &&
- desc.Format == D3DFMT_A8R8G8B8 && format == GL_BGRA_EXT && type == GL_UNSIGNED_BYTE;
- if (directToPixels)
- {
- // Use the pixels ptr as a shared handle to write directly into client's memory
- result = device->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format,
- D3DPOOL_SYSTEMMEM, &systemSurface, reinterpret_cast<void**>(&pixels));
- if (FAILED(result))
- {
- // Try again without the shared handle
- directToPixels = false;
- }
- }
-
- if (!directToPixels)
- {
- result = device->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format,
- D3DPOOL_SYSTEMMEM, &systemSurface, nullptr);
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- SafeRelease(surface);
- return gl::OutOfMemory() << "Failed to allocate internal texture for ReadPixels.";
- }
- }
-
- result = device->GetRenderTargetData(surface, systemSurface);
- SafeRelease(surface);
-
- if (FAILED(result))
- {
- SafeRelease(systemSurface);
-
- // It turns out that D3D will sometimes produce more error
- // codes than those documented.
- if (d3d9::isDeviceLostError(result))
- {
- mRenderer->notifyDeviceLost();
- }
- else
- {
- UNREACHABLE();
- }
-
- return gl::OutOfMemory() << "Failed to read internal render target data.";
- }
-
- if (directToPixels)
- {
- SafeRelease(systemSurface);
- return gl::NoError();
- }
-
- RECT rect;
- rect.left = gl::clamp(area.x, 0L, static_cast<LONG>(desc.Width));
- rect.top = gl::clamp(area.y, 0L, static_cast<LONG>(desc.Height));
- rect.right = gl::clamp(area.x + area.width, 0L, static_cast<LONG>(desc.Width));
- rect.bottom = gl::clamp(area.y + area.height, 0L, static_cast<LONG>(desc.Height));
-
- D3DLOCKED_RECT lock;
- result = systemSurface->LockRect(&lock, &rect, D3DLOCK_READONLY);
-
- if (FAILED(result))
- {
- UNREACHABLE();
- SafeRelease(systemSurface);
-
- return gl::OutOfMemory() << "Failed to lock internal render target.";
- }
-
- uint8_t *source = reinterpret_cast<uint8_t *>(lock.pBits);
- int inputPitch = lock.Pitch;
-
- const d3d9::D3DFormat &d3dFormatInfo = d3d9::GetD3DFormatInfo(desc.Format);
- gl::FormatType formatType(format, type);
-
- PackPixelsParams packParams;
- packParams.area.x = rect.left;
- packParams.area.y = rect.top;
- packParams.area.width = rect.right - rect.left;
- packParams.area.height = rect.bottom - rect.top;
- packParams.format = format;
- packParams.type = type;
- packParams.outputPitch = static_cast<GLuint>(outputPitch);
- packParams.pack = pack;
-
- PackPixels(packParams, d3dFormatInfo.info(), inputPitch, source, pixels);
-
- systemSurface->UnlockRect();
- SafeRelease(systemSurface);
-
- return gl::NoError();
-}
-
-gl::Error Framebuffer9::blitImpl(const gl::Context *context,
- const gl::Rectangle &sourceArea,
- const gl::Rectangle &destArea,
- const gl::Rectangle *scissor,
- bool blitRenderTarget,
- bool blitDepth,
- bool blitStencil,
- GLenum filter,
- const gl::Framebuffer *sourceFramebuffer)
-{
- ASSERT(filter == GL_NEAREST);
-
- IDirect3DDevice9 *device = mRenderer->getDevice();
- ASSERT(device);
-
- mRenderer->endScene();
-
- if (blitRenderTarget)
- {
- const gl::FramebufferAttachment *readBuffer = sourceFramebuffer->getColorbuffer(0);
- ASSERT(readBuffer);
-
- RenderTarget9 *readRenderTarget = nullptr;
- gl::Error error = readBuffer->getRenderTarget(context, &readRenderTarget);
- if (error.isError())
- {
- return error;
- }
- ASSERT(readRenderTarget);
-
- const gl::FramebufferAttachment *drawBuffer = mState.getColorAttachment(0);
- ASSERT(drawBuffer);
-
- RenderTarget9 *drawRenderTarget = nullptr;
- error = drawBuffer->getRenderTarget(context, &drawRenderTarget);
- if (error.isError())
- {
- return error;
- }
- ASSERT(drawRenderTarget);
-
- // The getSurface calls do an AddRef so save them until after no errors are possible
- IDirect3DSurface9* readSurface = readRenderTarget->getSurface();
- ASSERT(readSurface);
-
- IDirect3DSurface9* drawSurface = drawRenderTarget->getSurface();
- ASSERT(drawSurface);
-
- gl::Extents srcSize(readRenderTarget->getWidth(), readRenderTarget->getHeight(), 1);
- gl::Extents dstSize(drawRenderTarget->getWidth(), drawRenderTarget->getHeight(), 1);
-
- RECT srcRect;
- srcRect.left = sourceArea.x;
- srcRect.right = sourceArea.x + sourceArea.width;
- srcRect.top = sourceArea.y;
- srcRect.bottom = sourceArea.y + sourceArea.height;
-
- RECT dstRect;
- dstRect.left = destArea.x;
- dstRect.right = destArea.x + destArea.width;
- dstRect.top = destArea.y;
- dstRect.bottom = destArea.y + destArea.height;
-
- // Clip the rectangles to the scissor rectangle
- if (scissor)
- {
- if (dstRect.left < scissor->x)
- {
- srcRect.left += (scissor->x - dstRect.left);
- dstRect.left = scissor->x;
- }
- if (dstRect.top < scissor->y)
- {
- srcRect.top += (scissor->y - dstRect.top);
- dstRect.top = scissor->y;
- }
- if (dstRect.right > scissor->x + scissor->width)
- {
- srcRect.right -= (dstRect.right - (scissor->x + scissor->width));
- dstRect.right = scissor->x + scissor->width;
- }
- if (dstRect.bottom > scissor->y + scissor->height)
- {
- srcRect.bottom -= (dstRect.bottom - (scissor->y + scissor->height));
- dstRect.bottom = scissor->y + scissor->height;
- }
- }
-
- // Clip the rectangles to the destination size
- if (dstRect.left < 0)
- {
- srcRect.left += -dstRect.left;
- dstRect.left = 0;
- }
- if (dstRect.right > dstSize.width)
- {
- srcRect.right -= (dstRect.right - dstSize.width);
- dstRect.right = dstSize.width;
- }
- if (dstRect.top < 0)
- {
- srcRect.top += -dstRect.top;
- dstRect.top = 0;
- }
- if (dstRect.bottom > dstSize.height)
- {
- srcRect.bottom -= (dstRect.bottom - dstSize.height);
- dstRect.bottom = dstSize.height;
- }
-
- // Clip the rectangles to the source size
- if (srcRect.left < 0)
- {
- dstRect.left += -srcRect.left;
- srcRect.left = 0;
- }
- if (srcRect.right > srcSize.width)
- {
- dstRect.right -= (srcRect.right - srcSize.width);
- srcRect.right = srcSize.width;
- }
- if (srcRect.top < 0)
- {
- dstRect.top += -srcRect.top;
- srcRect.top = 0;
- }
- if (srcRect.bottom > srcSize.height)
- {
- dstRect.bottom -= (srcRect.bottom - srcSize.height);
- srcRect.bottom = srcSize.height;
- }
-
- HRESULT result = device->StretchRect(readSurface, &srcRect, drawSurface, &dstRect, D3DTEXF_NONE);
-
- SafeRelease(readSurface);
- SafeRelease(drawSurface);
-
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Internal blit failed, StretchRect " << gl::FmtHR(result);
- }
- }
-
- if (blitDepth || blitStencil)
- {
- const gl::FramebufferAttachment *readBuffer = sourceFramebuffer->getDepthOrStencilbuffer();
- ASSERT(readBuffer);
-
- RenderTarget9 *readDepthStencil = nullptr;
- gl::Error error = readBuffer->getRenderTarget(context, &readDepthStencil);
- if (error.isError())
- {
- return error;
- }
- ASSERT(readDepthStencil);
-
- const gl::FramebufferAttachment *drawBuffer = mState.getDepthOrStencilAttachment();
- ASSERT(drawBuffer);
-
- RenderTarget9 *drawDepthStencil = nullptr;
- error = drawBuffer->getRenderTarget(context, &drawDepthStencil);
- if (error.isError())
- {
- return error;
- }
- ASSERT(drawDepthStencil);
-
- // The getSurface calls do an AddRef so save them until after no errors are possible
- IDirect3DSurface9* readSurface = readDepthStencil->getSurface();
- ASSERT(readDepthStencil);
-
- IDirect3DSurface9* drawSurface = drawDepthStencil->getSurface();
- ASSERT(drawDepthStencil);
-
- HRESULT result = device->StretchRect(readSurface, nullptr, drawSurface, nullptr, D3DTEXF_NONE);
-
- SafeRelease(readSurface);
- SafeRelease(drawSurface);
-
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Internal blit failed, StretchRect " << gl::FmtHR(result);
- }
- }
-
- return gl::NoError();
-}
-
-GLenum Framebuffer9::getRenderTargetImplementationFormat(RenderTargetD3D *renderTarget) const
-{
- RenderTarget9 *renderTarget9 = GetAs<RenderTarget9>(renderTarget);
- const d3d9::D3DFormat &d3dFormatInfo = d3d9::GetD3DFormatInfo(renderTarget9->getD3DFormat());
- return d3dFormatInfo.info().glInternalFormat;
-}
-
-gl::Error Framebuffer9::getSamplePosition(size_t index, GLfloat *xy) const
-{
- UNREACHABLE();
- return gl::InternalError() << "getSamplePosition is unsupported to d3d9.";
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h
deleted file mode 100644
index d2b46435ee..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Framebuffer9.h: Defines the Framebuffer9 class.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_FRAMBUFFER9_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_FRAMBUFFER9_H_
-
-#include "libANGLE/renderer/d3d/FramebufferD3D.h"
-
-namespace rx
-{
-class Renderer9;
-
-class Framebuffer9 : public FramebufferD3D
-{
- public:
- Framebuffer9(const gl::FramebufferState &data, Renderer9 *renderer);
- ~Framebuffer9() override;
-
- gl::Error discard(const gl::Context *context, size_t count, const GLenum *attachments) override;
- gl::Error invalidate(const gl::Context *context,
- size_t count,
- const GLenum *attachments) override;
- gl::Error invalidateSub(const gl::Context *context,
- size_t count,
- const GLenum *attachments,
- const gl::Rectangle &area) override;
-
- gl::Error getSamplePosition(size_t index, GLfloat *xy) const override;
-
- private:
- gl::Error clearImpl(const gl::Context *context, const ClearParameters &clearParams) override;
-
- gl::Error readPixelsImpl(const gl::Context *context,
- const gl::Rectangle &area,
- GLenum format,
- GLenum type,
- size_t outputPitch,
- const gl::PixelPackState &pack,
- uint8_t *pixels) override;
-
- gl::Error blitImpl(const gl::Context *context,
- const gl::Rectangle &sourceArea,
- const gl::Rectangle &destArea,
- const gl::Rectangle *scissor,
- bool blitRenderTarget,
- bool blitDepth,
- bool blitStencil,
- GLenum filter,
- const gl::Framebuffer *sourceFramebuffer) override;
-
- GLenum getRenderTargetImplementationFormat(RenderTargetD3D *renderTarget) const override;
-
- Renderer9 *const mRenderer;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_FRAMBUFFER9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Image9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Image9.cpp
deleted file mode 100644
index 179629b362..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Image9.cpp
+++ /dev/null
@@ -1,920 +0,0 @@
-//
-// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Image9.cpp: Implements the rx::Image9 class, which acts as the interface to
-// the actual underlying surfaces of a Texture.
-
-#include "libANGLE/renderer/d3d/d3d9/Image9.h"
-#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h"
-#include "libANGLE/renderer/d3d/d3d9/formatutils9.h"
-#include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
-#include "libANGLE/renderer/d3d/d3d9/RenderTarget9.h"
-#include "libANGLE/renderer/d3d/d3d9/TextureStorage9.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/Renderbuffer.h"
-#include "common/utilities.h"
-
-namespace rx
-{
-
-Image9::Image9(Renderer9 *renderer)
-{
- mSurface = nullptr;
- mRenderer = nullptr;
-
- mD3DPool = D3DPOOL_SYSTEMMEM;
- mD3DFormat = D3DFMT_UNKNOWN;
-
- mRenderer = renderer;
-}
-
-Image9::~Image9()
-{
- SafeRelease(mSurface);
-}
-
-gl::Error Image9::generateMip(IDirect3DSurface9 *destSurface, IDirect3DSurface9 *sourceSurface)
-{
- D3DSURFACE_DESC destDesc;
- HRESULT result = destSurface->GetDesc(&destDesc);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory()
- << "Failed to query the source surface description for mipmap generation, "
- << gl::FmtHR(result);
- }
-
- D3DSURFACE_DESC sourceDesc;
- result = sourceSurface->GetDesc(&sourceDesc);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory()
- << "Failed to query the destination surface description for mipmap generation, "
- << gl::FmtHR(result);
- }
-
- ASSERT(sourceDesc.Format == destDesc.Format);
- ASSERT(sourceDesc.Width == 1 || sourceDesc.Width / 2 == destDesc.Width);
- ASSERT(sourceDesc.Height == 1 || sourceDesc.Height / 2 == destDesc.Height);
-
- const d3d9::D3DFormat &d3dFormatInfo = d3d9::GetD3DFormatInfo(sourceDesc.Format);
- ASSERT(d3dFormatInfo.info().mipGenerationFunction != nullptr);
-
- D3DLOCKED_RECT sourceLocked = {0};
- result = sourceSurface->LockRect(&sourceLocked, nullptr, D3DLOCK_READONLY);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to lock the source surface for mipmap generation, "
- << gl::FmtHR(result);
- }
-
- D3DLOCKED_RECT destLocked = {0};
- result = destSurface->LockRect(&destLocked, nullptr, 0);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- sourceSurface->UnlockRect();
- return gl::OutOfMemory() << "Failed to lock the destination surface for mipmap generation, "
- << gl::FmtHR(result);
- }
-
- const uint8_t *sourceData = reinterpret_cast<const uint8_t*>(sourceLocked.pBits);
- uint8_t *destData = reinterpret_cast<uint8_t*>(destLocked.pBits);
-
- ASSERT(sourceData && destData);
-
- d3dFormatInfo.info().mipGenerationFunction(sourceDesc.Width, sourceDesc.Height, 1, sourceData,
- sourceLocked.Pitch, 0, destData, destLocked.Pitch,
- 0);
-
- destSurface->UnlockRect();
- sourceSurface->UnlockRect();
-
- return gl::NoError();
-}
-
-gl::Error Image9::generateMipmap(Image9 *dest, Image9 *source)
-{
- IDirect3DSurface9 *sourceSurface = nullptr;
- ANGLE_TRY(source->getSurface(&sourceSurface));
-
- IDirect3DSurface9 *destSurface = nullptr;
- ANGLE_TRY(dest->getSurface(&destSurface));
-
- ANGLE_TRY(generateMip(destSurface, sourceSurface));
-
- dest->markDirty();
-
- return gl::NoError();
-}
-
-gl::Error Image9::copyLockableSurfaces(IDirect3DSurface9 *dest, IDirect3DSurface9 *source)
-{
- D3DLOCKED_RECT sourceLock = {0};
- D3DLOCKED_RECT destLock = {0};
-
- HRESULT result;
-
- result = source->LockRect(&sourceLock, nullptr, 0);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to lock source surface for copy, " << gl::FmtHR(result);
- }
-
- result = dest->LockRect(&destLock, nullptr, 0);
- if (FAILED(result))
- {
- source->UnlockRect();
- return gl::OutOfMemory() << "Failed to lock source surface for copy, " << gl::FmtHR(result);
- }
-
- ASSERT(sourceLock.pBits && destLock.pBits);
-
- D3DSURFACE_DESC desc;
- source->GetDesc(&desc);
-
- const d3d9::D3DFormat &d3dFormatInfo = d3d9::GetD3DFormatInfo(desc.Format);
- unsigned int rows = desc.Height / d3dFormatInfo.blockHeight;
-
- unsigned int bytes = d3d9::ComputeBlockSize(desc.Format, desc.Width, d3dFormatInfo.blockHeight);
- ASSERT(bytes <= static_cast<unsigned int>(sourceLock.Pitch) &&
- bytes <= static_cast<unsigned int>(destLock.Pitch));
-
- for(unsigned int i = 0; i < rows; i++)
- {
- memcpy((char*)destLock.pBits + destLock.Pitch * i, (char*)sourceLock.pBits + sourceLock.Pitch * i, bytes);
- }
-
- source->UnlockRect();
- dest->UnlockRect();
-
- return gl::NoError();
-}
-
-// static
-gl::Error Image9::CopyImage(const gl::Context *context,
- Image9 *dest,
- Image9 *source,
- const gl::Rectangle &sourceRect,
- const gl::Offset &destOffset,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha)
-{
- IDirect3DSurface9 *sourceSurface = nullptr;
- ANGLE_TRY(source->getSurface(&sourceSurface));
-
- IDirect3DSurface9 *destSurface = nullptr;
- ANGLE_TRY(dest->getSurface(&destSurface));
-
- D3DSURFACE_DESC destDesc;
- HRESULT result = destSurface->GetDesc(&destDesc);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory()
- << "Failed to query the source surface description for mipmap generation, "
- << gl::FmtHR(result);
- }
- const d3d9::D3DFormat &destD3DFormatInfo = d3d9::GetD3DFormatInfo(destDesc.Format);
-
- D3DSURFACE_DESC sourceDesc;
- result = sourceSurface->GetDesc(&sourceDesc);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory()
- << "Failed to query the destination surface description for mipmap generation, "
- << gl::FmtHR(result);
- }
- const d3d9::D3DFormat &sourceD3DFormatInfo = d3d9::GetD3DFormatInfo(sourceDesc.Format);
-
- D3DLOCKED_RECT sourceLocked = {0};
- result = sourceSurface->LockRect(&sourceLocked, nullptr, D3DLOCK_READONLY);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to lock the source surface for CopyImage, "
- << gl::FmtHR(result);
- }
-
- D3DLOCKED_RECT destLocked = {0};
- result = destSurface->LockRect(&destLocked, nullptr, 0);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- sourceSurface->UnlockRect();
- return gl::OutOfMemory() << "Failed to lock the destination surface for CopyImage, "
- << gl::FmtHR(result);
- }
-
- const uint8_t *sourceData = reinterpret_cast<const uint8_t *>(sourceLocked.pBits) +
- sourceRect.x * sourceD3DFormatInfo.pixelBytes +
- sourceRect.y * sourceLocked.Pitch;
- uint8_t *destData = reinterpret_cast<uint8_t *>(destLocked.pBits) +
- destOffset.x * destD3DFormatInfo.pixelBytes +
- destOffset.y * destLocked.Pitch;
- ASSERT(sourceData && destData);
-
- CopyImageCHROMIUM(sourceData, sourceLocked.Pitch, sourceD3DFormatInfo.pixelBytes,
- sourceD3DFormatInfo.info().colorReadFunction, destData, destLocked.Pitch,
- destD3DFormatInfo.pixelBytes, destD3DFormatInfo.info().colorWriteFunction,
- gl::GetUnsizedFormat(dest->getInternalFormat()),
- destD3DFormatInfo.info().componentType, sourceRect.width, sourceRect.height,
- unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha);
-
- destSurface->UnlockRect();
- sourceSurface->UnlockRect();
-
- return gl::NoError();
-}
-
-bool Image9::redefine(GLenum target, GLenum internalformat, const gl::Extents &size, bool forceRelease)
-{
- // 3D textures are not supported by the D3D9 backend.
- ASSERT(size.depth <= 1);
-
- // Only 2D and cube texture are supported by the D3D9 backend.
- ASSERT(target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP);
-
- if (mWidth != size.width ||
- mHeight != size.height ||
- mDepth != size.depth ||
- mInternalFormat != internalformat ||
- forceRelease)
- {
- mWidth = size.width;
- mHeight = size.height;
- mDepth = size.depth;
- mInternalFormat = internalformat;
-
- // compute the d3d format that will be used
- const d3d9::TextureFormat &d3d9FormatInfo = d3d9::GetTextureFormatInfo(internalformat);
- mD3DFormat = d3d9FormatInfo.texFormat;
- mRenderable = (d3d9FormatInfo.renderFormat != D3DFMT_UNKNOWN);
-
- SafeRelease(mSurface);
- mDirty = (d3d9FormatInfo.dataInitializerFunction != nullptr);
-
- return true;
- }
-
- return false;
-}
-
-gl::Error Image9::createSurface()
-{
- if (mSurface)
- {
- return gl::NoError();
- }
-
- IDirect3DTexture9 *newTexture = nullptr;
- IDirect3DSurface9 *newSurface = nullptr;
- const D3DPOOL poolToUse = D3DPOOL_SYSTEMMEM;
- const D3DFORMAT d3dFormat = getD3DFormat();
-
- if (mWidth != 0 && mHeight != 0)
- {
- int levelToFetch = 0;
- GLsizei requestWidth = mWidth;
- GLsizei requestHeight = mHeight;
- d3d9::MakeValidSize(true, d3dFormat, &requestWidth, &requestHeight, &levelToFetch);
-
- IDirect3DDevice9 *device = mRenderer->getDevice();
-
- HRESULT result = device->CreateTexture(requestWidth, requestHeight, levelToFetch + 1, 0,
- d3dFormat, poolToUse, &newTexture, nullptr);
-
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::OutOfMemory() << "Failed to create image surface, " << gl::FmtHR(result);
- }
-
- newTexture->GetSurfaceLevel(levelToFetch, &newSurface);
- SafeRelease(newTexture);
-
- const d3d9::TextureFormat &d3dFormatInfo = d3d9::GetTextureFormatInfo(mInternalFormat);
- if (d3dFormatInfo.dataInitializerFunction != nullptr)
- {
- RECT entireRect;
- entireRect.left = 0;
- entireRect.right = mWidth;
- entireRect.top = 0;
- entireRect.bottom = mHeight;
-
- D3DLOCKED_RECT lockedRect;
- result = newSurface->LockRect(&lockedRect, &entireRect, 0);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to lock image surface, " << gl::FmtHR(result);
- }
-
- d3dFormatInfo.dataInitializerFunction(mWidth, mHeight, 1, reinterpret_cast<uint8_t*>(lockedRect.pBits),
- lockedRect.Pitch, 0);
-
- result = newSurface->UnlockRect();
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to unlock image surface, " << gl::FmtHR(result);
- }
- }
- }
-
- mSurface = newSurface;
- mDirty = false;
- mD3DPool = poolToUse;
-
- return gl::NoError();
-}
-
-gl::Error Image9::lock(D3DLOCKED_RECT *lockedRect, const RECT &rect)
-{
- gl::Error error = createSurface();
- if (error.isError())
- {
- return error;
- }
-
- if (mSurface)
- {
- HRESULT result = mSurface->LockRect(lockedRect, &rect, 0);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to lock image surface, " << gl::FmtHR(result);
- }
-
- mDirty = true;
- }
-
- return gl::NoError();
-}
-
-void Image9::unlock()
-{
- if (mSurface)
- {
- HRESULT result = mSurface->UnlockRect();
- ASSERT(SUCCEEDED(result));
- }
-}
-
-D3DFORMAT Image9::getD3DFormat() const
-{
- // this should only happen if the image hasn't been redefined first
- // which would be a bug by the caller
- ASSERT(mD3DFormat != D3DFMT_UNKNOWN);
-
- return mD3DFormat;
-}
-
-bool Image9::isDirty() const
-{
- // Make sure to that this image is marked as dirty even if the staging texture hasn't been created yet
- // if initialization is required before use.
- return (mSurface ||
- d3d9::GetTextureFormatInfo(mInternalFormat).dataInitializerFunction != nullptr) &&
- mDirty;
-}
-
-gl::Error Image9::getSurface(IDirect3DSurface9 **outSurface)
-{
- gl::Error error = createSurface();
- if (error.isError())
- {
- return error;
- }
-
- *outSurface = mSurface;
- return gl::NoError();
-}
-
-gl::Error Image9::setManagedSurface2D(const gl::Context *context,
- TextureStorage *storage,
- int level)
-{
- IDirect3DSurface9 *surface = nullptr;
- TextureStorage9 *storage9 = GetAs<TextureStorage9>(storage);
- gl::Error error = storage9->getSurfaceLevel(context, GL_TEXTURE_2D, level, false, &surface);
- if (error.isError())
- {
- return error;
- }
- return setManagedSurface(surface);
-}
-
-gl::Error Image9::setManagedSurfaceCube(const gl::Context *context,
- TextureStorage *storage,
- int face,
- int level)
-{
- IDirect3DSurface9 *surface = nullptr;
- TextureStorage9 *storage9 = GetAs<TextureStorage9>(storage);
- gl::Error error = storage9->getSurfaceLevel(context, GL_TEXTURE_CUBE_MAP_POSITIVE_X + face,
- level, false, &surface);
- if (error.isError())
- {
- return error;
- }
- return setManagedSurface(surface);
-}
-
-gl::Error Image9::setManagedSurface(IDirect3DSurface9 *surface)
-{
- D3DSURFACE_DESC desc;
- surface->GetDesc(&desc);
- ASSERT(desc.Pool == D3DPOOL_MANAGED);
-
- if ((GLsizei)desc.Width == mWidth && (GLsizei)desc.Height == mHeight)
- {
- if (mSurface)
- {
- gl::Error error = copyLockableSurfaces(surface, mSurface);
- SafeRelease(mSurface);
- if (error.isError())
- {
- return error;
- }
- }
-
- mSurface = surface;
- mD3DPool = desc.Pool;
- }
-
- return gl::NoError();
-}
-
-gl::Error Image9::copyToStorage(const gl::Context *context,
- TextureStorage *storage,
- const gl::ImageIndex &index,
- const gl::Box &region)
-{
- gl::Error error = createSurface();
- if (error.isError())
- {
- return error;
- }
-
- TextureStorage9 *storage9 = GetAs<TextureStorage9>(storage);
-
- IDirect3DSurface9 *destSurface = nullptr;
-
- if (index.type == GL_TEXTURE_2D)
- {
- error =
- storage9->getSurfaceLevel(context, GL_TEXTURE_2D, index.mipIndex, true, &destSurface);
- if (error.isError())
- {
- return error;
- }
- }
- else
- {
- ASSERT(gl::IsCubeMapTextureTarget(index.type));
- error = storage9->getSurfaceLevel(context, index.type, index.mipIndex, true, &destSurface);
- if (error.isError())
- {
- return error;
- }
- }
-
- error = copyToSurface(destSurface, region);
- SafeRelease(destSurface);
- return error;
-}
-
-gl::Error Image9::copyToSurface(IDirect3DSurface9 *destSurface, const gl::Box &area)
-{
- ASSERT(area.width > 0 && area.height > 0 && area.depth == 1);
- ASSERT(destSurface);
-
- IDirect3DSurface9 *sourceSurface = nullptr;
- gl::Error error = getSurface(&sourceSurface);
- if (error.isError())
- {
- return error;
- }
-
- ASSERT(sourceSurface && sourceSurface != destSurface);
-
- RECT rect;
- rect.left = area.x;
- rect.top = area.y;
- rect.right = area.x + area.width;
- rect.bottom = area.y + area.height;
-
- POINT point = {rect.left, rect.top};
-
- IDirect3DDevice9 *device = mRenderer->getDevice();
-
- if (mD3DPool == D3DPOOL_MANAGED)
- {
- D3DSURFACE_DESC desc;
- sourceSurface->GetDesc(&desc);
-
- IDirect3DSurface9 *surf = 0;
- HRESULT result = device->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format,
- D3DPOOL_SYSTEMMEM, &surf, nullptr);
- if (FAILED(result))
- {
- return gl::OutOfMemory()
- << "Internal CreateOffscreenPlainSurface call failed, " << gl::FmtHR(result);
- }
-
- auto err = copyLockableSurfaces(surf, sourceSurface);
- result = device->UpdateSurface(surf, &rect, destSurface, &point);
- SafeRelease(surf);
- ANGLE_TRY(err);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Internal UpdateSurface call failed, " << gl::FmtHR(result);
- }
- }
- else
- {
- // UpdateSurface: source must be SYSTEMMEM, dest must be DEFAULT pools
- HRESULT result = device->UpdateSurface(sourceSurface, &rect, destSurface, &point);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Internal UpdateSurface call failed, " << gl::FmtHR(result);
- }
- }
-
- return gl::NoError();
-}
-
-// Store the pixel rectangle designated by xoffset,yoffset,width,height with pixels stored as format/type at input
-// into the target pixel rectangle.
-gl::Error Image9::loadData(const gl::Context *context,
- const gl::Box &area,
- const gl::PixelUnpackState &unpack,
- GLenum type,
- const void *input,
- bool applySkipImages)
-{
- // 3D textures are not supported by the D3D9 backend.
- ASSERT(area.z == 0 && area.depth == 1);
-
- const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(mInternalFormat);
- GLuint inputRowPitch = 0;
- ANGLE_TRY_RESULT(
- formatInfo.computeRowPitch(type, area.width, unpack.alignment, unpack.rowLength),
- inputRowPitch);
- ASSERT(!applySkipImages);
- ASSERT(unpack.skipPixels == 0);
- ASSERT(unpack.skipRows == 0);
-
- const d3d9::TextureFormat &d3dFormatInfo = d3d9::GetTextureFormatInfo(mInternalFormat);
- ASSERT(d3dFormatInfo.loadFunction != nullptr);
-
- RECT lockRect =
- {
- area.x, area.y,
- area.x + area.width, area.y + area.height
- };
-
- D3DLOCKED_RECT locked;
- gl::Error error = lock(&locked, lockRect);
- if (error.isError())
- {
- return error;
- }
-
- d3dFormatInfo.loadFunction(area.width, area.height, area.depth,
- reinterpret_cast<const uint8_t *>(input), inputRowPitch, 0,
- reinterpret_cast<uint8_t *>(locked.pBits), locked.Pitch, 0);
-
- unlock();
-
- return gl::NoError();
-}
-
-gl::Error Image9::loadCompressedData(const gl::Context *context,
- const gl::Box &area,
- const void *input)
-{
- // 3D textures are not supported by the D3D9 backend.
- ASSERT(area.z == 0 && area.depth == 1);
-
- const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(mInternalFormat);
- GLsizei inputRowPitch = 0;
- ANGLE_TRY_RESULT(formatInfo.computeRowPitch(GL_UNSIGNED_BYTE, area.width, 1, 0), inputRowPitch);
- GLsizei inputDepthPitch = 0;
- ANGLE_TRY_RESULT(formatInfo.computeDepthPitch(area.height, 0, inputDepthPitch),
- inputDepthPitch);
-
- const d3d9::TextureFormat &d3d9FormatInfo = d3d9::GetTextureFormatInfo(mInternalFormat);
-
- ASSERT(area.x % d3d9::GetD3DFormatInfo(d3d9FormatInfo.texFormat).blockWidth == 0);
- ASSERT(area.y % d3d9::GetD3DFormatInfo(d3d9FormatInfo.texFormat).blockHeight == 0);
-
- ASSERT(d3d9FormatInfo.loadFunction != nullptr);
-
- RECT lockRect =
- {
- area.x, area.y,
- area.x + area.width, area.y + area.height
- };
-
- D3DLOCKED_RECT locked;
- gl::Error error = lock(&locked, lockRect);
- if (error.isError())
- {
- return error;
- }
-
- d3d9FormatInfo.loadFunction(area.width, area.height, area.depth,
- reinterpret_cast<const uint8_t*>(input), inputRowPitch, inputDepthPitch,
- reinterpret_cast<uint8_t*>(locked.pBits), locked.Pitch, 0);
-
- unlock();
-
- return gl::NoError();
-}
-
-// This implements glCopyTex[Sub]Image2D for non-renderable internal texture formats and incomplete textures
-gl::Error Image9::copyFromRTInternal(const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- RenderTargetD3D *source)
-{
- ASSERT(source);
-
- // ES3.0 only behaviour to copy into a 3d texture
- ASSERT(destOffset.z == 0);
-
- RenderTarget9 *renderTarget = GetAs<RenderTarget9>(source);
-
- IDirect3DSurface9 *surface = renderTarget->getSurface();
- ASSERT(surface);
-
- IDirect3DDevice9 *device = mRenderer->getDevice();
-
- IDirect3DSurface9 *renderTargetData = nullptr;
- D3DSURFACE_DESC description;
- surface->GetDesc(&description);
-
- HRESULT result = device->CreateOffscreenPlainSurface(description.Width, description.Height,
- description.Format, D3DPOOL_SYSTEMMEM,
- &renderTargetData, nullptr);
-
- if (FAILED(result))
- {
- SafeRelease(surface);
- return gl::OutOfMemory() << "Could not create matching destination surface, "
- << gl::FmtHR(result);
- }
-
- result = device->GetRenderTargetData(surface, renderTargetData);
-
- if (FAILED(result))
- {
- SafeRelease(renderTargetData);
- SafeRelease(surface);
- return gl::OutOfMemory() << "GetRenderTargetData unexpectedly failed, "
- << gl::FmtHR(result);
- }
-
- int width = sourceArea.width;
- int height = sourceArea.height;
-
- RECT sourceRect = { sourceArea.x, sourceArea.y, sourceArea.x + width, sourceArea.y + height };
- RECT destRect = { destOffset.x, destOffset.y, destOffset.x + width, destOffset.y + height };
-
- D3DLOCKED_RECT sourceLock = {0};
- result = renderTargetData->LockRect(&sourceLock, &sourceRect, 0);
-
- if (FAILED(result))
- {
- SafeRelease(renderTargetData);
- SafeRelease(surface);
- return gl::OutOfMemory()
- << "Failed to lock the source surface (rectangle might be invalid), "
- << gl::FmtHR(result);
- }
-
- D3DLOCKED_RECT destLock = {0};
- gl::Error error = lock(&destLock, destRect);
- if (error.isError())
- {
- renderTargetData->UnlockRect();
- SafeRelease(renderTargetData);
- SafeRelease(surface);
- return error;
- }
-
- ASSERT(destLock.pBits && sourceLock.pBits);
-
- unsigned char *sourcePixels = (unsigned char*)sourceLock.pBits;
- unsigned char *destPixels = (unsigned char*)destLock.pBits;
-
- switch (description.Format)
- {
- case D3DFMT_X8R8G8B8:
- case D3DFMT_A8R8G8B8:
- switch (getD3DFormat())
- {
- case D3DFMT_X8R8G8B8:
- case D3DFMT_A8R8G8B8:
- for (int y = 0; y < height; y++)
- {
- memcpy(destPixels, sourcePixels, 4 * width);
- sourcePixels += sourceLock.Pitch;
- destPixels += destLock.Pitch;
- }
- break;
- case D3DFMT_L8:
- for (int y = 0; y < height; y++)
- {
- for (int x = 0; x < width; x++)
- {
- destPixels[x] = sourcePixels[x * 4 + 2];
- }
- sourcePixels += sourceLock.Pitch;
- destPixels += destLock.Pitch;
- }
- break;
- case D3DFMT_A8L8:
- for (int y = 0; y < height; y++)
- {
- for (int x = 0; x < width; x++)
- {
- destPixels[x * 2 + 0] = sourcePixels[x * 4 + 2];
- destPixels[x * 2 + 1] = sourcePixels[x * 4 + 3];
- }
- sourcePixels += sourceLock.Pitch;
- destPixels += destLock.Pitch;
- }
- break;
- default:
- UNREACHABLE();
- }
- break;
- case D3DFMT_R5G6B5:
- switch (getD3DFormat())
- {
- case D3DFMT_X8R8G8B8:
- for (int y = 0; y < height; y++)
- {
- for (int x = 0; x < width; x++)
- {
- unsigned short rgb = ((unsigned short*)sourcePixels)[x];
- unsigned char red = static_cast<unsigned char>((rgb & 0xF800) >> 8);
- unsigned char green = static_cast<unsigned char>((rgb & 0x07E0) >> 3);
- unsigned char blue = static_cast<unsigned char>((rgb & 0x001F) << 3);
- destPixels[x + 0] = blue | (blue >> 5);
- destPixels[x + 1] = green | (green >> 6);
- destPixels[x + 2] = red | (red >> 5);
- destPixels[x + 3] = 0xFF;
- }
- sourcePixels += sourceLock.Pitch;
- destPixels += destLock.Pitch;
- }
- break;
- case D3DFMT_L8:
- for (int y = 0; y < height; y++)
- {
- for (int x = 0; x < width; x++)
- {
- unsigned char red = sourcePixels[x * 2 + 1] & 0xF8;
- destPixels[x] = red | (red >> 5);
- }
- sourcePixels += sourceLock.Pitch;
- destPixels += destLock.Pitch;
- }
- break;
- default:
- UNREACHABLE();
- }
- break;
- case D3DFMT_A1R5G5B5:
- switch (getD3DFormat())
- {
- case D3DFMT_X8R8G8B8:
- for (int y = 0; y < height; y++)
- {
- for (int x = 0; x < width; x++)
- {
- unsigned short argb = ((unsigned short*)sourcePixels)[x];
- unsigned char red = static_cast<unsigned char>((argb & 0x7C00) >> 7);
- unsigned char green = static_cast<unsigned char>((argb & 0x03E0) >> 2);
- unsigned char blue = static_cast<unsigned char>((argb & 0x001F) << 3);
- destPixels[x + 0] = blue | (blue >> 5);
- destPixels[x + 1] = green | (green >> 5);
- destPixels[x + 2] = red | (red >> 5);
- destPixels[x + 3] = 0xFF;
- }
- sourcePixels += sourceLock.Pitch;
- destPixels += destLock.Pitch;
- }
- break;
- case D3DFMT_A8R8G8B8:
- for (int y = 0; y < height; y++)
- {
- for (int x = 0; x < width; x++)
- {
- unsigned short argb = ((unsigned short*)sourcePixels)[x];
- unsigned char red = static_cast<unsigned char>((argb & 0x7C00) >> 7);
- unsigned char green = static_cast<unsigned char>((argb & 0x03E0) >> 2);
- unsigned char blue = static_cast<unsigned char>((argb & 0x001F) << 3);
- unsigned char alpha = (signed short)argb >> 15;
- destPixels[x + 0] = blue | (blue >> 5);
- destPixels[x + 1] = green | (green >> 5);
- destPixels[x + 2] = red | (red >> 5);
- destPixels[x + 3] = alpha;
- }
- sourcePixels += sourceLock.Pitch;
- destPixels += destLock.Pitch;
- }
- break;
- case D3DFMT_L8:
- for (int y = 0; y < height; y++)
- {
- for (int x = 0; x < width; x++)
- {
- unsigned char red = sourcePixels[x * 2 + 1] & 0x7C;
- destPixels[x] = (red << 1) | (red >> 4);
- }
- sourcePixels += sourceLock.Pitch;
- destPixels += destLock.Pitch;
- }
- break;
- case D3DFMT_A8L8:
- for (int y = 0; y < height; y++)
- {
- for (int x = 0; x < width; x++)
- {
- unsigned char red = sourcePixels[x * 2 + 1] & 0x7C;
- destPixels[x * 2 + 0] = (red << 1) | (red >> 4);
- destPixels[x * 2 + 1] = (signed char)sourcePixels[x * 2 + 1] >> 7;
- }
- sourcePixels += sourceLock.Pitch;
- destPixels += destLock.Pitch;
- }
- break;
- default:
- UNREACHABLE();
- }
- break;
- default:
- UNREACHABLE();
- }
-
- unlock();
- renderTargetData->UnlockRect();
-
- SafeRelease(renderTargetData);
- SafeRelease(surface);
-
- mDirty = true;
- return gl::NoError();
-}
-
-gl::Error Image9::copyFromTexStorage(const gl::Context *context,
- const gl::ImageIndex &imageIndex,
- TextureStorage *source)
-{
- RenderTargetD3D *renderTarget = nullptr;
- gl::Error error = source->getRenderTarget(context, imageIndex, &renderTarget);
- if (error.isError())
- {
- return error;
- }
-
- gl::Rectangle sourceArea(0, 0, mWidth, mHeight);
- return copyFromRTInternal(gl::Offset(), sourceArea, renderTarget);
-}
-
-gl::Error Image9::copyFromFramebuffer(const gl::Context *context,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- const gl::Framebuffer *source)
-{
- const gl::FramebufferAttachment *srcAttachment = source->getReadColorbuffer();
- ASSERT(srcAttachment);
-
- RenderTargetD3D *renderTarget = nullptr;
- gl::Error error = srcAttachment->getRenderTarget(context, &renderTarget);
- if (error.isError())
- {
- return error;
- }
-
- ASSERT(renderTarget);
- return copyFromRTInternal(destOffset, sourceArea, renderTarget);
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Image9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Image9.h
deleted file mode 100644
index 01c60dc4fb..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Image9.h
+++ /dev/null
@@ -1,102 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Image9.h: Defines the rx::Image9 class, which acts as the interface to
-// the actual underlying surfaces of a Texture.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_IMAGE9_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_IMAGE9_H_
-
-#include "libANGLE/renderer/d3d/ImageD3D.h"
-#include "common/debug.h"
-
-namespace gl
-{
-class Framebuffer;
-}
-
-namespace rx
-{
-class Renderer9;
-
-class Image9 : public ImageD3D
-{
- public:
- Image9(Renderer9 *renderer);
- ~Image9() override;
-
- static gl::Error generateMipmap(Image9 *dest, Image9 *source);
- static gl::Error generateMip(IDirect3DSurface9 *destSurface, IDirect3DSurface9 *sourceSurface);
- static gl::Error copyLockableSurfaces(IDirect3DSurface9 *dest, IDirect3DSurface9 *source);
- static gl::Error CopyImage(const gl::Context *context,
- Image9 *dest,
- Image9 *source,
- const gl::Rectangle &sourceRect,
- const gl::Offset &destOffset,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha);
-
- bool redefine(GLenum target, GLenum internalformat, const gl::Extents &size, bool forceRelease) override;
-
- D3DFORMAT getD3DFormat() const;
-
- bool isDirty() const override;
-
- gl::Error setManagedSurface2D(const gl::Context *context,
- TextureStorage *storage,
- int level) override;
- gl::Error setManagedSurfaceCube(const gl::Context *context,
- TextureStorage *storage,
- int face,
- int level) override;
- gl::Error copyToStorage(const gl::Context *context,
- TextureStorage *storage,
- const gl::ImageIndex &index,
- const gl::Box &region) override;
-
- gl::Error loadData(const gl::Context *context,
- const gl::Box &area,
- const gl::PixelUnpackState &unpack,
- GLenum type,
- const void *input,
- bool applySkipImages) override;
- gl::Error loadCompressedData(const gl::Context *context,
- const gl::Box &area,
- const void *input) override;
-
- gl::Error copyFromTexStorage(const gl::Context *context,
- const gl::ImageIndex &imageIndex,
- TextureStorage *source) override;
- gl::Error copyFromFramebuffer(const gl::Context *context,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- const gl::Framebuffer *source) override;
-
- private:
- gl::Error getSurface(IDirect3DSurface9 **outSurface);
-
- gl::Error createSurface();
- gl::Error setManagedSurface(IDirect3DSurface9 *surface);
- gl::Error copyToSurface(IDirect3DSurface9 *dest, const gl::Box &area);
-
- gl::Error lock(D3DLOCKED_RECT *lockedRect, const RECT &rect);
- void unlock();
-
- gl::Error copyFromRTInternal(const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- RenderTargetD3D *source);
-
- Renderer9 *mRenderer;
-
- D3DPOOL mD3DPool; // can only be D3DPOOL_SYSTEMMEM or D3DPOOL_MANAGED since it needs to be lockable.
- D3DFORMAT mD3DFormat;
-
- IDirect3DSurface9 *mSurface;
-};
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_IMAGE9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp
deleted file mode 100644
index df86331766..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp
+++ /dev/null
@@ -1,168 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Indexffer9.cpp: Defines the D3D9 IndexBuffer implementation.
-
-#include "libANGLE/renderer/d3d/d3d9/IndexBuffer9.h"
-#include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
-
-namespace rx
-{
-
-IndexBuffer9::IndexBuffer9(Renderer9 *const renderer) : mRenderer(renderer)
-{
- mIndexBuffer = nullptr;
- mBufferSize = 0;
- mIndexType = 0;
- mDynamic = false;
-}
-
-IndexBuffer9::~IndexBuffer9()
-{
- SafeRelease(mIndexBuffer);
-}
-
-gl::Error IndexBuffer9::initialize(unsigned int bufferSize, GLenum indexType, bool dynamic)
-{
- SafeRelease(mIndexBuffer);
-
- updateSerial();
-
- if (bufferSize > 0)
- {
- D3DFORMAT format = D3DFMT_UNKNOWN;
- if (indexType == GL_UNSIGNED_SHORT || indexType == GL_UNSIGNED_BYTE)
- {
- format = D3DFMT_INDEX16;
- }
- else if (indexType == GL_UNSIGNED_INT)
- {
- ASSERT(mRenderer->getNativeExtensions().elementIndexUint);
- format = D3DFMT_INDEX32;
- }
- else UNREACHABLE();
-
- DWORD usageFlags = D3DUSAGE_WRITEONLY;
- if (dynamic)
- {
- usageFlags |= D3DUSAGE_DYNAMIC;
- }
-
- HRESULT result = mRenderer->createIndexBuffer(bufferSize, usageFlags, format, &mIndexBuffer);
- if (FAILED(result))
- {
- return gl::OutOfMemory()
- << "Failed to allocate internal index buffer of size " << bufferSize;
- }
- }
-
- mBufferSize = bufferSize;
- mIndexType = indexType;
- mDynamic = dynamic;
-
- return gl::NoError();
-}
-
-gl::Error IndexBuffer9::mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory)
-{
- if (!mIndexBuffer)
- {
- return gl::OutOfMemory() << "Internal index buffer is not initialized.";
- }
-
- DWORD lockFlags = mDynamic ? D3DLOCK_NOOVERWRITE : 0;
-
- void *mapPtr = nullptr;
- HRESULT result = mIndexBuffer->Lock(offset, size, &mapPtr, lockFlags);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to lock internal index buffer, " << gl::FmtHR(result);
- }
-
- *outMappedMemory = mapPtr;
- return gl::NoError();
-}
-
-gl::Error IndexBuffer9::unmapBuffer()
-{
- if (!mIndexBuffer)
- {
- return gl::OutOfMemory() << "Internal index buffer is not initialized.";
- }
-
- HRESULT result = mIndexBuffer->Unlock();
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to unlock internal index buffer, " << gl::FmtHR(result);
- }
-
- return gl::NoError();
-}
-
-GLenum IndexBuffer9::getIndexType() const
-{
- return mIndexType;
-}
-
-unsigned int IndexBuffer9::getBufferSize() const
-{
- return mBufferSize;
-}
-
-gl::Error IndexBuffer9::setSize(unsigned int bufferSize, GLenum indexType)
-{
- if (bufferSize > mBufferSize || indexType != mIndexType)
- {
- return initialize(bufferSize, indexType, mDynamic);
- }
- else
- {
- return gl::NoError();
- }
-}
-
-gl::Error IndexBuffer9::discard()
-{
- if (!mIndexBuffer)
- {
- return gl::OutOfMemory() << "Internal index buffer is not initialized.";
- }
-
- void *dummy;
- HRESULT result;
-
- result = mIndexBuffer->Lock(0, 1, &dummy, D3DLOCK_DISCARD);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to lock internal index buffer, " << gl::FmtHR(result);
- }
-
- result = mIndexBuffer->Unlock();
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to unlock internal index buffer, " << gl::FmtHR(result);
- }
-
- return gl::NoError();
-}
-
-D3DFORMAT IndexBuffer9::getIndexFormat() const
-{
- switch (mIndexType)
- {
- case GL_UNSIGNED_BYTE: return D3DFMT_INDEX16;
- case GL_UNSIGNED_SHORT: return D3DFMT_INDEX16;
- case GL_UNSIGNED_INT: return D3DFMT_INDEX32;
- default: UNREACHABLE(); return D3DFMT_UNKNOWN;
- }
-}
-
-IDirect3DIndexBuffer9 * IndexBuffer9::getBuffer() const
-{
- return mIndexBuffer;
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.h
deleted file mode 100644
index 5921d2a859..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.h
+++ /dev/null
@@ -1,49 +0,0 @@
-//
-// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Indexffer9.h: Defines the D3D9 IndexBuffer implementation.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_INDEXBUFFER9_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_INDEXBUFFER9_H_
-
-#include "libANGLE/renderer/d3d/IndexBuffer.h"
-
-namespace rx
-{
-class Renderer9;
-
-class IndexBuffer9 : public IndexBuffer
-{
- public:
- explicit IndexBuffer9(Renderer9 *const renderer);
- ~IndexBuffer9() override;
-
- gl::Error initialize(unsigned int bufferSize, GLenum indexType, bool dynamic) override;
-
- gl::Error mapBuffer(unsigned int offset, unsigned int size, void **outMappedMemory) override;
- gl::Error unmapBuffer() override;
-
- GLenum getIndexType() const override;
- unsigned int getBufferSize() const override;
- gl::Error setSize(unsigned int bufferSize, GLenum indexType) override;
-
- gl::Error discard() override;
-
- D3DFORMAT getIndexFormat() const;
- IDirect3DIndexBuffer9 *getBuffer() const;
-
- private:
- Renderer9 *const mRenderer;
-
- IDirect3DIndexBuffer9 *mIndexBuffer;
- unsigned int mBufferSize;
- GLenum mIndexType;
- bool mDynamic;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_INDEXBUFFER9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/NativeWindow9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/NativeWindow9.cpp
deleted file mode 100644
index 388b8aa168..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/NativeWindow9.cpp
+++ /dev/null
@@ -1,39 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// NativeWindow9.cpp: Defines NativeWindow9, a class for managing and
-// performing operations on an EGLNativeWindowType for the D3D9 renderer.
-
-#include "libANGLE/renderer/d3d/d3d9/NativeWindow9.h"
-
-namespace rx
-{
-NativeWindow9::NativeWindow9(EGLNativeWindowType window) : NativeWindowD3D(window)
-{
-}
-
-bool NativeWindow9::initialize()
-{
- return true;
-}
-
-bool NativeWindow9::getClientRect(LPRECT rect) const
-{
- return GetClientRect(getNativeWindow(), rect) == TRUE;
-}
-
-bool NativeWindow9::isIconic() const
-{
- return IsIconic(getNativeWindow()) == TRUE;
-}
-
-// static
-bool NativeWindow9::IsValidNativeWindow(EGLNativeWindowType window)
-{
- return IsWindow(window) == TRUE;
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/NativeWindow9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/NativeWindow9.h
deleted file mode 100644
index a56b08dc81..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/NativeWindow9.h
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// NativeWindow9.h: Defines NativeWindow9, a class for managing and
-// performing operations on an EGLNativeWindowType for the D3D9 renderer.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_NATIVEWINDOW9_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_NATIVEWINDOW9_H_
-
-#include "common/debug.h"
-#include "common/platform.h"
-
-#include "libANGLE/renderer/d3d/NativeWindowD3D.h"
-
-namespace rx
-{
-
-class NativeWindow9 : public NativeWindowD3D
-{
- public:
- explicit NativeWindow9(EGLNativeWindowType window);
-
- bool initialize() override;
- bool getClientRect(LPRECT rect) const override;
- bool isIconic() const override;
-
- static bool IsValidNativeWindow(EGLNativeWindowType window);
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_NATIVEWINDOW9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Query9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Query9.cpp
deleted file mode 100644
index 4ba053e6bd..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Query9.cpp
+++ /dev/null
@@ -1,188 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Query9.cpp: Defines the rx::Query9 class which implements rx::QueryImpl.
-
-#include "libANGLE/renderer/d3d/d3d9/Query9.h"
-#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h"
-#include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
-
-#include <GLES2/gl2ext.h>
-
-namespace rx
-{
-Query9::Query9(Renderer9 *renderer, GLenum type)
- : QueryImpl(type),
- mResult(GL_FALSE),
- mQueryFinished(false),
- mRenderer(renderer),
- mQuery(nullptr)
-{
-}
-
-Query9::~Query9()
-{
- SafeRelease(mQuery);
-}
-
-gl::Error Query9::begin()
-{
- D3DQUERYTYPE d3dQueryType = gl_d3d9::ConvertQueryType(getType());
- if (mQuery == nullptr)
- {
- HRESULT result = mRenderer->getDevice()->CreateQuery(d3dQueryType, &mQuery);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Internal query creation failed, " << gl::FmtHR(result);
- }
- }
-
- if (d3dQueryType != D3DQUERYTYPE_EVENT)
- {
- HRESULT result = mQuery->Issue(D3DISSUE_BEGIN);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to begin internal query, " << gl::FmtHR(result);
- }
- }
-
- return gl::NoError();
-}
-
-gl::Error Query9::end()
-{
- ASSERT(mQuery);
-
- HRESULT result = mQuery->Issue(D3DISSUE_END);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to end internal query, " << gl::FmtHR(result);
- }
-
- mQueryFinished = false;
- mResult = GL_FALSE;
-
- return gl::NoError();
-}
-
-gl::Error Query9::queryCounter()
-{
- UNIMPLEMENTED();
- return gl::InternalError() << "Unimplemented";
-}
-
-template <typename T>
-gl::Error Query9::getResultBase(T *params)
-{
- while (!mQueryFinished)
- {
- gl::Error error = testQuery();
- if (error.isError())
- {
- return error;
- }
-
- if (!mQueryFinished)
- {
- Sleep(0);
- }
- }
-
- ASSERT(mQueryFinished);
- *params = static_cast<T>(mResult);
- return gl::NoError();
-}
-
-gl::Error Query9::getResult(GLint *params)
-{
- return getResultBase(params);
-}
-
-gl::Error Query9::getResult(GLuint *params)
-{
- return getResultBase(params);
-}
-
-gl::Error Query9::getResult(GLint64 *params)
-{
- return getResultBase(params);
-}
-
-gl::Error Query9::getResult(GLuint64 *params)
-{
- return getResultBase(params);
-}
-
-gl::Error Query9::isResultAvailable(bool *available)
-{
- gl::Error error = testQuery();
- if (error.isError())
- {
- return error;
- }
-
- *available = mQueryFinished;
-
- return gl::NoError();
-}
-
-gl::Error Query9::testQuery()
-{
- if (!mQueryFinished)
- {
- ASSERT(mQuery);
-
- HRESULT result = S_OK;
- switch (getType())
- {
- case GL_ANY_SAMPLES_PASSED_EXT:
- case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
- {
- DWORD numPixels = 0;
- result = mQuery->GetData(&numPixels, sizeof(numPixels), D3DGETDATA_FLUSH);
- if (result == S_OK)
- {
- mQueryFinished = true;
- mResult = (numPixels > 0) ? GL_TRUE : GL_FALSE;
- }
- break;
- }
-
- case GL_COMMANDS_COMPLETED_CHROMIUM:
- {
- BOOL completed = FALSE;
- result = mQuery->GetData(&completed, sizeof(completed), D3DGETDATA_FLUSH);
- if (result == S_OK)
- {
- mQueryFinished = true;
- mResult = (completed == TRUE) ? GL_TRUE : GL_FALSE;
- }
- break;
- }
-
- default:
- UNREACHABLE();
- break;
- }
-
- if (d3d9::isDeviceLostError(result))
- {
- mRenderer->notifyDeviceLost();
- return gl::OutOfMemory() << "Failed to test get query result, device is lost.";
- }
- else if (mRenderer->testDeviceLost())
- {
- mRenderer->notifyDeviceLost();
- return gl::OutOfMemory() << "Failed to test get query result, device is lost.";
- }
- }
-
- return gl::NoError();
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Query9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Query9.h
deleted file mode 100644
index 6c7c22f096..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Query9.h
+++ /dev/null
@@ -1,48 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Query9.h: Defines the rx::Query9 class which implements rx::QueryImpl.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_QUERY9_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_QUERY9_H_
-
-#include "libANGLE/renderer/QueryImpl.h"
-
-namespace rx
-{
-class Renderer9;
-
-class Query9 : public QueryImpl
-{
- public:
- Query9(Renderer9 *renderer, GLenum type);
- ~Query9() override;
-
- gl::Error begin() override;
- gl::Error end() override;
- gl::Error queryCounter() override;
- gl::Error getResult(GLint *params) override;
- gl::Error getResult(GLuint *params) override;
- gl::Error getResult(GLint64 *params) override;
- gl::Error getResult(GLuint64 *params) override;
- gl::Error isResultAvailable(bool *available) override;
-
- private:
- gl::Error testQuery();
-
- template <typename T>
- gl::Error getResultBase(T *params);
-
- GLuint64 mResult;
- bool mQueryFinished;
-
- Renderer9 *mRenderer;
- IDirect3DQuery9 *mQuery;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_QUERY9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.cpp
deleted file mode 100644
index 3e54c27f43..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.cpp
+++ /dev/null
@@ -1,163 +0,0 @@
-//
-// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// RenderTarget9.cpp: Implements a D3D9-specific wrapper for IDirect3DSurface9
-// pointers retained by renderbuffers.
-
-#include "libANGLE/renderer/d3d/d3d9/RenderTarget9.h"
-#include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
-#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h"
-#include "libANGLE/renderer/d3d/d3d9/SwapChain9.h"
-#include "libANGLE/renderer/d3d/d3d9/formatutils9.h"
-
-namespace rx
-{
-
-// TODO: AddRef the incoming surface to take ownership instead of expecting that its ref is being given.
-TextureRenderTarget9::TextureRenderTarget9(IDirect3DBaseTexture9 *texture,
- size_t textureLevel,
- IDirect3DSurface9 *surface,
- GLenum internalFormat,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLsizei samples)
- : mWidth(width),
- mHeight(height),
- mDepth(depth),
- mInternalFormat(internalFormat),
- mD3DFormat(D3DFMT_UNKNOWN),
- mSamples(samples),
- mTexture(texture),
- mTextureLevel(textureLevel),
- mRenderTarget(surface)
-{
- ASSERT(mDepth == 1);
-
- if (mRenderTarget)
- {
- D3DSURFACE_DESC description;
- mRenderTarget->GetDesc(&description);
- mD3DFormat = description.Format;
- }
-}
-
-TextureRenderTarget9::~TextureRenderTarget9()
-{
- SafeRelease(mTexture);
- SafeRelease(mRenderTarget);
-}
-
-GLsizei TextureRenderTarget9::getWidth() const
-{
- return mWidth;
-}
-
-GLsizei TextureRenderTarget9::getHeight() const
-{
- return mHeight;
-}
-
-GLsizei TextureRenderTarget9::getDepth() const
-{
- return mDepth;
-}
-
-GLenum TextureRenderTarget9::getInternalFormat() const
-{
- return mInternalFormat;
-}
-
-GLsizei TextureRenderTarget9::getSamples() const
-{
- return mSamples;
-}
-
-IDirect3DBaseTexture9 *TextureRenderTarget9::getTexture() const
-{
- return mTexture;
-}
-
-size_t TextureRenderTarget9::getTextureLevel() const
-{
- return mTextureLevel;
-}
-
-IDirect3DSurface9 *TextureRenderTarget9::getSurface() const
-{
- // Caller is responsible for releasing the returned surface reference.
- // TODO: remove the AddRef to match RenderTarget11
- if (mRenderTarget)
- {
- mRenderTarget->AddRef();
- }
-
- return mRenderTarget;
-}
-
-D3DFORMAT TextureRenderTarget9::getD3DFormat() const
-{
- return mD3DFormat;
-}
-
-SurfaceRenderTarget9::SurfaceRenderTarget9(SwapChain9 *swapChain, bool depth)
- : mSwapChain(swapChain),
- mDepth(depth)
-{
-}
-
-SurfaceRenderTarget9::~SurfaceRenderTarget9()
-{
-}
-
-GLsizei SurfaceRenderTarget9::getWidth() const
-{
- return mSwapChain->getWidth();
-}
-
-GLsizei SurfaceRenderTarget9::getHeight() const
-{
- return mSwapChain->getHeight();
-}
-
-GLsizei SurfaceRenderTarget9::getDepth() const
-{
- return 1;
-}
-
-GLenum SurfaceRenderTarget9::getInternalFormat() const
-{
- return (mDepth ? mSwapChain->getDepthBufferInternalFormat()
- : mSwapChain->getRenderTargetInternalFormat());
-}
-
-GLsizei SurfaceRenderTarget9::getSamples() const
-{
- // Our EGL surfaces do not support multisampling.
- return 0;
-}
-
-IDirect3DSurface9 *SurfaceRenderTarget9::getSurface() const
-{
- return (mDepth ? mSwapChain->getDepthStencil() : mSwapChain->getRenderTarget());
-}
-
-IDirect3DBaseTexture9 *SurfaceRenderTarget9::getTexture() const
-{
- return (mDepth ? nullptr : mSwapChain->getOffscreenTexture());
-}
-
-size_t SurfaceRenderTarget9::getTextureLevel() const
-{
- return 0;
-}
-
-D3DFORMAT SurfaceRenderTarget9::getD3DFormat() const
-{
- return d3d9::GetTextureFormatInfo(getInternalFormat()).texFormat;
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.h
deleted file mode 100644
index bb3b5a4ee4..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.h
+++ /dev/null
@@ -1,98 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// RenderTarget9.h: Defines a D3D9-specific wrapper for IDirect3DSurface9 pointers
-// retained by Renderbuffers.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_RENDERTARGET9_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_RENDERTARGET9_H_
-
-#include "libANGLE/renderer/d3d/RenderTargetD3D.h"
-
-namespace rx
-{
-class Renderer9;
-class SwapChain9;
-
-class RenderTarget9 : public RenderTargetD3D
-{
- public:
- RenderTarget9() { }
- ~RenderTarget9() override {}
- // Retrieve the texture that backs this render target, may be null for swap chain render
- // targets.
- virtual IDirect3DBaseTexture9 *getTexture() const = 0;
- virtual size_t getTextureLevel() const = 0;
-
- virtual IDirect3DSurface9 *getSurface() const = 0;
-
- virtual D3DFORMAT getD3DFormat() const = 0;
-};
-
-class TextureRenderTarget9 : public RenderTarget9
-{
- public:
- TextureRenderTarget9(IDirect3DBaseTexture9 *texture,
- size_t textureLevel,
- IDirect3DSurface9 *surface,
- GLenum internalFormat,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLsizei samples);
- ~TextureRenderTarget9() override;
-
- GLsizei getWidth() const override;
- GLsizei getHeight() const override;
- GLsizei getDepth() const override;
- GLenum getInternalFormat() const override;
- GLsizei getSamples() const override;
-
- IDirect3DBaseTexture9 *getTexture() const override;
- size_t getTextureLevel() const override;
- IDirect3DSurface9 *getSurface() const override;
-
- D3DFORMAT getD3DFormat() const override;
-
- private:
- GLsizei mWidth;
- GLsizei mHeight;
- GLsizei mDepth;
- GLenum mInternalFormat;
- D3DFORMAT mD3DFormat;
- GLsizei mSamples;
-
- IDirect3DBaseTexture9 *mTexture;
- size_t mTextureLevel;
- IDirect3DSurface9 *mRenderTarget;
-};
-
-class SurfaceRenderTarget9 : public RenderTarget9
-{
- public:
- SurfaceRenderTarget9(SwapChain9 *swapChain, bool depth);
- ~SurfaceRenderTarget9() override;
-
- GLsizei getWidth() const override;
- GLsizei getHeight() const override;
- GLsizei getDepth() const override;
- GLenum getInternalFormat() const override;
- GLsizei getSamples() const override;
-
- IDirect3DBaseTexture9 *getTexture() const override;
- size_t getTextureLevel() const override;
- IDirect3DSurface9 *getSurface() const override;
-
- D3DFORMAT getD3DFormat() const override;
-
- private:
- SwapChain9 *mSwapChain;
- bool mDepth;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_RENDERTARGET9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
deleted file mode 100644
index 75c6298868..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
+++ /dev/null
@@ -1,3310 +0,0 @@
-//
-// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Renderer9.cpp: Implements a back-end specific class for the D3D9 renderer.
-
-#include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
-
-#include <EGL/eglext.h>
-#include <sstream>
-
-#include "common/utilities.h"
-#include "libANGLE/Buffer.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Display.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/Renderbuffer.h"
-#include "libANGLE/State.h"
-#include "libANGLE/Surface.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/features.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/d3d/CompilerD3D.h"
-#include "libANGLE/renderer/d3d/DeviceD3D.h"
-#include "libANGLE/renderer/d3d/FramebufferD3D.h"
-#include "libANGLE/renderer/d3d/IndexDataManager.h"
-#include "libANGLE/renderer/d3d/ProgramD3D.h"
-#include "libANGLE/renderer/d3d/RenderbufferD3D.h"
-#include "libANGLE/renderer/d3d/ShaderD3D.h"
-#include "libANGLE/renderer/d3d/SurfaceD3D.h"
-#include "libANGLE/renderer/d3d/TextureD3D.h"
-#include "libANGLE/renderer/d3d/d3d9/Blit9.h"
-#include "libANGLE/renderer/d3d/d3d9/Buffer9.h"
-#include "libANGLE/renderer/d3d/d3d9/Context9.h"
-#include "libANGLE/renderer/d3d/d3d9/Fence9.h"
-#include "libANGLE/renderer/d3d/d3d9/Framebuffer9.h"
-#include "libANGLE/renderer/d3d/d3d9/Image9.h"
-#include "libANGLE/renderer/d3d/d3d9/IndexBuffer9.h"
-#include "libANGLE/renderer/d3d/d3d9/NativeWindow9.h"
-#include "libANGLE/renderer/d3d/d3d9/Query9.h"
-#include "libANGLE/renderer/d3d/d3d9/RenderTarget9.h"
-#include "libANGLE/renderer/d3d/d3d9/ShaderExecutable9.h"
-#include "libANGLE/renderer/d3d/d3d9/SwapChain9.h"
-#include "libANGLE/renderer/d3d/d3d9/TextureStorage9.h"
-#include "libANGLE/renderer/d3d/d3d9/VertexArray9.h"
-#include "libANGLE/renderer/d3d/d3d9/VertexBuffer9.h"
-#include "libANGLE/renderer/d3d/d3d9/formatutils9.h"
-#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h"
-#include "third_party/trace_event/trace_event.h"
-
-#if !defined(ANGLE_COMPILE_OPTIMIZATION_LEVEL)
-#define ANGLE_COMPILE_OPTIMIZATION_LEVEL D3DCOMPILE_OPTIMIZATION_LEVEL3
-#endif
-
-// Enable ANGLE_SUPPORT_SHADER_MODEL_2 if you wish devices with only shader model 2.
-// Such a device would not be conformant.
-#ifndef ANGLE_SUPPORT_SHADER_MODEL_2
-#define ANGLE_SUPPORT_SHADER_MODEL_2 0
-#endif
-
-namespace rx
-{
-
-enum
-{
- MAX_VERTEX_CONSTANT_VECTORS_D3D9 = 256,
- MAX_PIXEL_CONSTANT_VECTORS_SM2 = 32,
- MAX_PIXEL_CONSTANT_VECTORS_SM3 = 224,
- MAX_VARYING_VECTORS_SM2 = 8,
- MAX_VARYING_VECTORS_SM3 = 10,
-
- MAX_TEXTURE_IMAGE_UNITS_VTF_SM3 = 4
-};
-
-Renderer9::Renderer9(egl::Display *display) : RendererD3D(display), mStateManager(this)
-{
- mD3d9Module = nullptr;
-
- mD3d9 = nullptr;
- mD3d9Ex = nullptr;
- mDevice = nullptr;
- mDeviceEx = nullptr;
- mDeviceWindow = nullptr;
- mBlit = nullptr;
-
- mAdapter = D3DADAPTER_DEFAULT;
-
- const egl::AttributeMap &attributes = display->getAttributeMap();
- EGLint requestedDeviceType = static_cast<EGLint>(attributes.get(
- EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE));
- switch (requestedDeviceType)
- {
- case EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE:
- mDeviceType = D3DDEVTYPE_HAL;
- break;
-
- case EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE:
- mDeviceType = D3DDEVTYPE_REF;
- break;
-
- case EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE:
- mDeviceType = D3DDEVTYPE_NULLREF;
- break;
-
- default:
- UNREACHABLE();
- }
-
- mMaskedClearSavedState = nullptr;
-
- mVertexDataManager = nullptr;
- mIndexDataManager = nullptr;
- mLineLoopIB = nullptr;
- mCountingIB = nullptr;
-
- mMaxNullColorbufferLRU = 0;
- for (int i = 0; i < NUM_NULL_COLORBUFFER_CACHE_ENTRIES; i++)
- {
- mNullColorbufferCache[i].lruCount = 0;
- mNullColorbufferCache[i].width = 0;
- mNullColorbufferCache[i].height = 0;
- mNullColorbufferCache[i].buffer = nullptr;
- }
-
- mAppliedVertexShader = nullptr;
- mAppliedPixelShader = nullptr;
- mAppliedProgramSerial = 0;
-
- gl::InitializeDebugAnnotations(&mAnnotator);
-
- mEGLDevice = nullptr;
-}
-
-Renderer9::~Renderer9()
-{
- if (mDevice)
- {
- // If the device is lost, reset it first to prevent leaving the driver in an unstable state
- if (testDeviceLost())
- {
- resetDevice();
- }
- }
-
- release();
-}
-
-void Renderer9::release()
-{
- RendererD3D::cleanup();
-
- gl::UninitializeDebugAnnotations();
-
- mTranslatedAttribCache.clear();
-
- releaseDeviceResources();
-
- SafeDelete(mEGLDevice);
- SafeRelease(mDevice);
- SafeRelease(mDeviceEx);
- SafeRelease(mD3d9);
- SafeRelease(mD3d9Ex);
-
- mCompiler.release();
-
- if (mDeviceWindow)
- {
- DestroyWindow(mDeviceWindow);
- mDeviceWindow = nullptr;
- }
-
- mD3d9Module = nullptr;
-}
-
-egl::Error Renderer9::initialize()
-{
- TRACE_EVENT0("gpu.angle", "GetModuleHandle_d3d9");
- mD3d9Module = GetModuleHandle(TEXT("d3d9.dll"));
-
- if (mD3d9Module == nullptr)
- {
- return egl::EglNotInitialized(D3D9_INIT_MISSING_DEP) << "No D3D9 module found.";
- }
-
- typedef HRESULT(WINAPI * Direct3DCreate9ExFunc)(UINT, IDirect3D9Ex **);
- Direct3DCreate9ExFunc Direct3DCreate9ExPtr =
- reinterpret_cast<Direct3DCreate9ExFunc>(GetProcAddress(mD3d9Module, "Direct3DCreate9Ex"));
-
- // Use Direct3D9Ex if available. Among other things, this version is less
- // inclined to report a lost context, for example when the user switches
- // desktop. Direct3D9Ex is available in Windows Vista and later if suitable drivers are
- // available.
- if (ANGLE_D3D9EX == ANGLE_ENABLED && Direct3DCreate9ExPtr &&
- SUCCEEDED(Direct3DCreate9ExPtr(D3D_SDK_VERSION, &mD3d9Ex)))
- {
- TRACE_EVENT0("gpu.angle", "D3d9Ex_QueryInterface");
- ASSERT(mD3d9Ex);
- mD3d9Ex->QueryInterface(__uuidof(IDirect3D9), reinterpret_cast<void **>(&mD3d9));
- ASSERT(mD3d9);
- }
- else
- {
- TRACE_EVENT0("gpu.angle", "Direct3DCreate9");
- mD3d9 = Direct3DCreate9(D3D_SDK_VERSION);
- }
-
- if (!mD3d9)
- {
- return egl::EglNotInitialized(D3D9_INIT_MISSING_DEP) << "Could not create D3D9 device.";
- }
-
- if (mDisplay->getNativeDisplayId() != nullptr)
- {
- // UNIMPLEMENTED(); // FIXME: Determine which adapter index the device context
- // corresponds to
- }
-
- HRESULT result;
-
- // Give up on getting device caps after about one second.
- {
- TRACE_EVENT0("gpu.angle", "GetDeviceCaps");
- for (int i = 0; i < 10; ++i)
- {
- result = mD3d9->GetDeviceCaps(mAdapter, mDeviceType, &mDeviceCaps);
- if (SUCCEEDED(result))
- {
- break;
- }
- else if (result == D3DERR_NOTAVAILABLE)
- {
- Sleep(100); // Give the driver some time to initialize/recover
- }
- else if (FAILED(result)) // D3DERR_OUTOFVIDEOMEMORY, E_OUTOFMEMORY,
- // D3DERR_INVALIDDEVICE, or another error we can't recover
- // from
- {
- return egl::EglNotInitialized(D3D9_INIT_OTHER_ERROR)
- << "Failed to get device caps, " << gl::FmtHR(result);
- }
- }
- }
-
-#if ANGLE_SUPPORT_SHADER_MODEL_2
- size_t minShaderModel = 2;
-#else
- size_t minShaderModel = 3;
-#endif
-
- if (mDeviceCaps.PixelShaderVersion < D3DPS_VERSION(minShaderModel, 0))
- {
- return egl::EglNotInitialized(D3D9_INIT_UNSUPPORTED_VERSION)
- << "Renderer does not support PS " << minShaderModel << ".0, aborting!";
- }
-
- // When DirectX9 is running with an older DirectX8 driver, a StretchRect from a regular texture
- // to a render target texture is not supported. This is required by
- // Texture2D::ensureRenderTarget.
- if ((mDeviceCaps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES) == 0)
- {
- return egl::EglNotInitialized(D3D9_INIT_UNSUPPORTED_STRETCHRECT)
- << "Renderer does not support StretctRect from textures.";
- }
-
- {
- TRACE_EVENT0("gpu.angle", "GetAdapterIdentifier");
- mD3d9->GetAdapterIdentifier(mAdapter, 0, &mAdapterIdentifier);
- }
-
- static const TCHAR windowName[] = TEXT("AngleHiddenWindow");
- static const TCHAR className[] = TEXT("STATIC");
-
- {
- TRACE_EVENT0("gpu.angle", "CreateWindowEx");
- mDeviceWindow =
- CreateWindowEx(WS_EX_NOACTIVATE, className, windowName, WS_DISABLED | WS_POPUP, 0, 0, 1,
- 1, HWND_MESSAGE, nullptr, GetModuleHandle(nullptr), nullptr);
- }
-
- D3DPRESENT_PARAMETERS presentParameters = getDefaultPresentParameters();
- DWORD behaviorFlags =
- D3DCREATE_FPU_PRESERVE | D3DCREATE_NOWINDOWCHANGES | D3DCREATE_MULTITHREADED;
-
- {
- TRACE_EVENT0("gpu.angle", "D3d9_CreateDevice");
- result = mD3d9->CreateDevice(
- mAdapter, mDeviceType, mDeviceWindow,
- behaviorFlags | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE,
- &presentParameters, &mDevice);
- }
- if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_DEVICELOST)
- {
- return egl::EglBadAlloc(D3D9_INIT_OUT_OF_MEMORY)
- << "CreateDevice failed: device lost of out of memory";
- }
-
- if (FAILED(result))
- {
- TRACE_EVENT0("gpu.angle", "D3d9_CreateDevice2");
- result = mD3d9->CreateDevice(mAdapter, mDeviceType, mDeviceWindow,
- behaviorFlags | D3DCREATE_SOFTWARE_VERTEXPROCESSING,
- &presentParameters, &mDevice);
-
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY ||
- result == D3DERR_NOTAVAILABLE || result == D3DERR_DEVICELOST);
- return egl::EglBadAlloc(D3D9_INIT_OUT_OF_MEMORY)
- << "CreateDevice2 failed: device lost, not available, or of out of memory";
- }
- }
-
- if (mD3d9Ex)
- {
- TRACE_EVENT0("gpu.angle", "mDevice_QueryInterface");
- result = mDevice->QueryInterface(__uuidof(IDirect3DDevice9Ex), (void **)&mDeviceEx);
- ASSERT(SUCCEEDED(result));
- }
-
- {
- TRACE_EVENT0("gpu.angle", "ShaderCache initialize");
- mVertexShaderCache.initialize(mDevice);
- mPixelShaderCache.initialize(mDevice);
- }
-
- D3DDISPLAYMODE currentDisplayMode;
- mD3d9->GetAdapterDisplayMode(mAdapter, &currentDisplayMode);
-
- // Check vertex texture support
- // Only Direct3D 10 ready devices support all the necessary vertex texture formats.
- // We test this using D3D9 by checking support for the R16F format.
- mVertexTextureSupport = mDeviceCaps.PixelShaderVersion >= D3DPS_VERSION(3, 0) &&
- SUCCEEDED(mD3d9->CheckDeviceFormat(
- mAdapter, mDeviceType, currentDisplayMode.Format,
- D3DUSAGE_QUERY_VERTEXTEXTURE, D3DRTYPE_TEXTURE, D3DFMT_R16F));
-
- ANGLE_TRY(initializeDevice());
-
- return egl::NoError();
-}
-
-// do any one-time device initialization
-// NOTE: this is also needed after a device lost/reset
-// to reset the scene status and ensure the default states are reset.
-egl::Error Renderer9::initializeDevice()
-{
- // Permanent non-default states
- mDevice->SetRenderState(D3DRS_POINTSPRITEENABLE, TRUE);
- mDevice->SetRenderState(D3DRS_LASTPIXEL, FALSE);
-
- if (mDeviceCaps.PixelShaderVersion >= D3DPS_VERSION(3, 0))
- {
- mDevice->SetRenderState(D3DRS_POINTSIZE_MAX, (DWORD &)mDeviceCaps.MaxPointSize);
- }
- else
- {
- mDevice->SetRenderState(D3DRS_POINTSIZE_MAX, 0x3F800000); // 1.0f
- }
-
- const gl::Caps &rendererCaps = getNativeCaps();
-
- mCurVertexSamplerStates.resize(rendererCaps.maxVertexTextureImageUnits);
- mCurPixelSamplerStates.resize(rendererCaps.maxTextureImageUnits);
-
- mCurVertexTextures.resize(rendererCaps.maxVertexTextureImageUnits);
- mCurPixelTextures.resize(rendererCaps.maxTextureImageUnits);
-
- markAllStateDirty();
-
- mSceneStarted = false;
-
- ASSERT(!mBlit);
- mBlit = new Blit9(this);
- ANGLE_TRY(mBlit->initialize());
-
- ASSERT(!mVertexDataManager && !mIndexDataManager);
- mVertexDataManager = new VertexDataManager(this);
- mIndexDataManager = new IndexDataManager(this);
-
- if (mVertexDataManager->initialize().isError())
- {
- return egl::EglBadAlloc() << "Error initializing VertexDataManager";
- }
-
- mTranslatedAttribCache.resize(getNativeCaps().maxVertexAttributes);
-
- mStateManager.initialize();
-
- return egl::NoError();
-}
-
-D3DPRESENT_PARAMETERS Renderer9::getDefaultPresentParameters()
-{
- D3DPRESENT_PARAMETERS presentParameters = {0};
-
- // The default swap chain is never actually used. Surface will create a new swap chain with the
- // proper parameters.
- presentParameters.AutoDepthStencilFormat = D3DFMT_UNKNOWN;
- presentParameters.BackBufferCount = 1;
- presentParameters.BackBufferFormat = D3DFMT_UNKNOWN;
- presentParameters.BackBufferWidth = 1;
- presentParameters.BackBufferHeight = 1;
- presentParameters.EnableAutoDepthStencil = FALSE;
- presentParameters.Flags = 0;
- presentParameters.hDeviceWindow = mDeviceWindow;
- presentParameters.MultiSampleQuality = 0;
- presentParameters.MultiSampleType = D3DMULTISAMPLE_NONE;
- presentParameters.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
- presentParameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
- presentParameters.Windowed = TRUE;
-
- return presentParameters;
-}
-
-egl::ConfigSet Renderer9::generateConfigs()
-{
- static const GLenum colorBufferFormats[] = {
- GL_BGR5_A1_ANGLEX, GL_BGRA8_EXT, GL_RGB565,
-
- };
-
- static const GLenum depthStencilBufferFormats[] = {
- GL_NONE,
- GL_DEPTH_COMPONENT32_OES,
- GL_DEPTH24_STENCIL8_OES,
- GL_DEPTH_COMPONENT24_OES,
- GL_DEPTH_COMPONENT16,
- };
-
- const gl::Caps &rendererCaps = getNativeCaps();
- const gl::TextureCapsMap &rendererTextureCaps = getNativeTextureCaps();
-
- D3DDISPLAYMODE currentDisplayMode;
- mD3d9->GetAdapterDisplayMode(mAdapter, &currentDisplayMode);
-
- // Determine the min and max swap intervals
- int minSwapInterval = 4;
- int maxSwapInterval = 0;
-
- if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_IMMEDIATE)
- {
- minSwapInterval = std::min(minSwapInterval, 0);
- maxSwapInterval = std::max(maxSwapInterval, 0);
- }
- if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_ONE)
- {
- minSwapInterval = std::min(minSwapInterval, 1);
- maxSwapInterval = std::max(maxSwapInterval, 1);
- }
- if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_TWO)
- {
- minSwapInterval = std::min(minSwapInterval, 2);
- maxSwapInterval = std::max(maxSwapInterval, 2);
- }
- if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_THREE)
- {
- minSwapInterval = std::min(minSwapInterval, 3);
- maxSwapInterval = std::max(maxSwapInterval, 3);
- }
- if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_FOUR)
- {
- minSwapInterval = std::min(minSwapInterval, 4);
- maxSwapInterval = std::max(maxSwapInterval, 4);
- }
-
- egl::ConfigSet configs;
- for (size_t formatIndex = 0; formatIndex < ArraySize(colorBufferFormats); formatIndex++)
- {
- GLenum colorBufferInternalFormat = colorBufferFormats[formatIndex];
- const gl::TextureCaps &colorBufferFormatCaps =
- rendererTextureCaps.get(colorBufferInternalFormat);
- if (colorBufferFormatCaps.renderable)
- {
- for (size_t depthStencilIndex = 0;
- depthStencilIndex < ArraySize(depthStencilBufferFormats); depthStencilIndex++)
- {
- GLenum depthStencilBufferInternalFormat =
- depthStencilBufferFormats[depthStencilIndex];
- const gl::TextureCaps &depthStencilBufferFormatCaps =
- rendererTextureCaps.get(depthStencilBufferInternalFormat);
- if (depthStencilBufferFormatCaps.renderable ||
- depthStencilBufferInternalFormat == GL_NONE)
- {
- const gl::InternalFormat &colorBufferFormatInfo =
- gl::GetSizedInternalFormatInfo(colorBufferInternalFormat);
- const gl::InternalFormat &depthStencilBufferFormatInfo =
- gl::GetSizedInternalFormatInfo(depthStencilBufferInternalFormat);
- const d3d9::TextureFormat &d3d9ColorBufferFormatInfo =
- d3d9::GetTextureFormatInfo(colorBufferInternalFormat);
-
- egl::Config config;
- config.renderTargetFormat = colorBufferInternalFormat;
- config.depthStencilFormat = depthStencilBufferInternalFormat;
- config.bufferSize = colorBufferFormatInfo.pixelBytes * 8;
- config.redSize = colorBufferFormatInfo.redBits;
- config.greenSize = colorBufferFormatInfo.greenBits;
- config.blueSize = colorBufferFormatInfo.blueBits;
- config.luminanceSize = colorBufferFormatInfo.luminanceBits;
- config.alphaSize = colorBufferFormatInfo.alphaBits;
- config.alphaMaskSize = 0;
- config.bindToTextureRGB = (colorBufferFormatInfo.format == GL_RGB);
- config.bindToTextureRGBA = (colorBufferFormatInfo.format == GL_RGBA ||
- colorBufferFormatInfo.format == GL_BGRA_EXT);
- config.colorBufferType = EGL_RGB_BUFFER;
- // Mark as slow if blits to the back-buffer won't be straight forward
- config.configCaveat =
- (currentDisplayMode.Format == d3d9ColorBufferFormatInfo.renderFormat)
- ? EGL_NONE
- : EGL_SLOW_CONFIG;
- config.configID = static_cast<EGLint>(configs.size() + 1);
- config.conformant = EGL_OPENGL_ES2_BIT;
- config.depthSize = depthStencilBufferFormatInfo.depthBits;
- config.level = 0;
- config.matchNativePixmap = EGL_NONE;
- config.maxPBufferWidth = rendererCaps.max2DTextureSize;
- config.maxPBufferHeight = rendererCaps.max2DTextureSize;
- config.maxPBufferPixels =
- rendererCaps.max2DTextureSize * rendererCaps.max2DTextureSize;
- config.maxSwapInterval = maxSwapInterval;
- config.minSwapInterval = minSwapInterval;
- config.nativeRenderable = EGL_FALSE;
- config.nativeVisualID = 0;
- config.nativeVisualType = EGL_NONE;
- config.renderableType = EGL_OPENGL_ES2_BIT;
- config.sampleBuffers = 0; // FIXME: enumerate multi-sampling
- config.samples = 0;
- config.stencilSize = depthStencilBufferFormatInfo.stencilBits;
- config.surfaceType =
- EGL_PBUFFER_BIT | EGL_WINDOW_BIT | EGL_SWAP_BEHAVIOR_PRESERVED_BIT;
- config.transparentType = EGL_NONE;
- config.transparentRedValue = 0;
- config.transparentGreenValue = 0;
- config.transparentBlueValue = 0;
- config.colorComponentType = gl_egl::GLComponentTypeToEGLColorComponentType(
- colorBufferFormatInfo.componentType);
-
- configs.add(config);
- }
- }
- }
- }
-
- ASSERT(configs.size() > 0);
- return configs;
-}
-
-void Renderer9::generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const
-{
- outExtensions->createContextRobustness = true;
-
- if (getShareHandleSupport())
- {
- outExtensions->d3dShareHandleClientBuffer = true;
- outExtensions->surfaceD3DTexture2DShareHandle = true;
- }
- outExtensions->d3dTextureClientBuffer = true;
-
- outExtensions->querySurfacePointer = true;
- outExtensions->windowFixedSize = true;
- outExtensions->postSubBuffer = true;
- outExtensions->deviceQuery = true;
-
- outExtensions->image = true;
- outExtensions->imageBase = true;
- outExtensions->glTexture2DImage = true;
- outExtensions->glRenderbufferImage = true;
-
- outExtensions->flexibleSurfaceCompatibility = true;
-
- // Contexts are virtualized so textures can be shared globally
- outExtensions->displayTextureShareGroup = true;
-
- // D3D9 can be used without an output surface
- outExtensions->surfacelessContext = true;
-
- outExtensions->robustResourceInitialization = true;
-}
-
-void Renderer9::startScene()
-{
- if (!mSceneStarted)
- {
- long result = mDevice->BeginScene();
- if (SUCCEEDED(result))
- {
- // This is defensive checking against the device being
- // lost at unexpected times.
- mSceneStarted = true;
- }
- }
-}
-
-void Renderer9::endScene()
-{
- if (mSceneStarted)
- {
- // EndScene can fail if the device was lost, for example due
- // to a TDR during a draw call.
- mDevice->EndScene();
- mSceneStarted = false;
- }
-}
-
-gl::Error Renderer9::flush()
-{
- IDirect3DQuery9 *query = nullptr;
- gl::Error error = allocateEventQuery(&query);
- if (error.isError())
- {
- return error;
- }
-
- HRESULT result = query->Issue(D3DISSUE_END);
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::OutOfMemory() << "Failed to issue event query, " << gl::FmtHR(result);
- }
-
- // Grab the query data once
- result = query->GetData(nullptr, 0, D3DGETDATA_FLUSH);
- freeEventQuery(query);
- if (FAILED(result))
- {
- if (d3d9::isDeviceLostError(result))
- {
- notifyDeviceLost();
- }
-
- return gl::OutOfMemory() << "Failed to get event query data, " << gl::FmtHR(result);
- }
-
- return gl::NoError();
-}
-
-gl::Error Renderer9::finish()
-{
- IDirect3DQuery9 *query = nullptr;
- gl::Error error = allocateEventQuery(&query);
- if (error.isError())
- {
- return error;
- }
-
- HRESULT result = query->Issue(D3DISSUE_END);
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::OutOfMemory() << "Failed to issue event query, " << gl::FmtHR(result);
- }
-
- // Grab the query data once
- result = query->GetData(nullptr, 0, D3DGETDATA_FLUSH);
- if (FAILED(result))
- {
- if (d3d9::isDeviceLostError(result))
- {
- notifyDeviceLost();
- }
-
- freeEventQuery(query);
- return gl::OutOfMemory() << "Failed to get event query data, " << gl::FmtHR(result);
- }
-
- // Loop until the query completes
- while (result == S_FALSE)
- {
- // Keep polling, but allow other threads to do something useful first
- ScheduleYield();
-
- result = query->GetData(nullptr, 0, D3DGETDATA_FLUSH);
-
- // explicitly check for device loss
- // some drivers seem to return S_FALSE even if the device is lost
- // instead of D3DERR_DEVICELOST like they should
- if (result == S_FALSE && testDeviceLost())
- {
- result = D3DERR_DEVICELOST;
- }
-
- if (FAILED(result))
- {
- if (d3d9::isDeviceLostError(result))
- {
- notifyDeviceLost();
- }
-
- freeEventQuery(query);
- return gl::OutOfMemory() << "Failed to get event query data, " << gl::FmtHR(result);
- }
- }
-
- freeEventQuery(query);
-
- return gl::NoError();
-}
-
-bool Renderer9::isValidNativeWindow(EGLNativeWindowType window) const
-{
- return NativeWindow9::IsValidNativeWindow(window);
-}
-
-NativeWindowD3D *Renderer9::createNativeWindow(EGLNativeWindowType window,
- const egl::Config *,
- const egl::AttributeMap &) const
-{
- return new NativeWindow9(window);
-}
-
-SwapChainD3D *Renderer9::createSwapChain(NativeWindowD3D *nativeWindow,
- HANDLE shareHandle,
- IUnknown *d3dTexture,
- GLenum backBufferFormat,
- GLenum depthBufferFormat,
- EGLint orientation,
- EGLint samples)
-{
- return new SwapChain9(this, GetAs<NativeWindow9>(nativeWindow), shareHandle, d3dTexture,
- backBufferFormat, depthBufferFormat, orientation);
-}
-
-egl::Error Renderer9::getD3DTextureInfo(const egl::Config *config,
- IUnknown *d3dTexture,
- EGLint *width,
- EGLint *height,
- GLenum *fboFormat) const
-{
- IDirect3DTexture9 *texture = nullptr;
- if (FAILED(d3dTexture->QueryInterface(&texture)))
- {
- return egl::EglBadParameter() << "Client buffer is not a IDirect3DTexture9";
- }
-
- IDirect3DDevice9 *textureDevice = nullptr;
- texture->GetDevice(&textureDevice);
- if (textureDevice != mDevice)
- {
- SafeRelease(texture);
- return egl::EglBadParameter() << "Texture's device does not match.";
- }
- SafeRelease(textureDevice);
-
- D3DSURFACE_DESC desc;
- texture->GetLevelDesc(0, &desc);
- SafeRelease(texture);
-
- if (width)
- {
- *width = static_cast<EGLint>(desc.Width);
- }
- if (height)
- {
- *height = static_cast<EGLint>(desc.Height);
- }
-
- // From table egl.restrictions in EGL_ANGLE_d3d_texture_client_buffer.
- switch (desc.Format)
- {
- case D3DFMT_R8G8B8:
- case D3DFMT_A8R8G8B8:
- case D3DFMT_A16B16G16R16F:
- case D3DFMT_A32B32G32R32F:
- break;
-
- default:
- return egl::EglBadParameter()
- << "Unknown client buffer texture format: " << desc.Format;
- }
-
- if (fboFormat)
- {
- const auto &d3dFormatInfo = d3d9::GetD3DFormatInfo(desc.Format);
- ASSERT(d3dFormatInfo.info().id != angle::Format::ID::NONE);
- *fboFormat = d3dFormatInfo.info().fboImplementationInternalFormat;
- }
-
- return egl::NoError();
-}
-
-egl::Error Renderer9::validateShareHandle(const egl::Config *config,
- HANDLE shareHandle,
- const egl::AttributeMap &attribs) const
-{
- if (shareHandle == nullptr)
- {
- return egl::EglBadParameter() << "NULL share handle.";
- }
-
- EGLint width = attribs.getAsInt(EGL_WIDTH, 0);
- EGLint height = attribs.getAsInt(EGL_HEIGHT, 0);
- ASSERT(width != 0 && height != 0);
-
- const d3d9::TextureFormat &backBufferd3dFormatInfo =
- d3d9::GetTextureFormatInfo(config->renderTargetFormat);
-
- IDirect3DTexture9 *texture = nullptr;
- HRESULT result = mDevice->CreateTexture(width, height, 1, D3DUSAGE_RENDERTARGET,
- backBufferd3dFormatInfo.texFormat, D3DPOOL_DEFAULT,
- &texture, &shareHandle);
- if (FAILED(result))
- {
- return egl::EglBadParameter() << "Failed to open share handle, " << gl::FmtHR(result);
- }
-
- DWORD levelCount = texture->GetLevelCount();
-
- D3DSURFACE_DESC desc;
- texture->GetLevelDesc(0, &desc);
- SafeRelease(texture);
-
- if (levelCount != 1 || desc.Width != static_cast<UINT>(width) ||
- desc.Height != static_cast<UINT>(height) ||
- desc.Format != backBufferd3dFormatInfo.texFormat)
- {
- return egl::EglBadParameter() << "Invalid texture parameters in share handle texture.";
- }
-
- return egl::NoError();
-}
-
-ContextImpl *Renderer9::createContext(const gl::ContextState &state)
-{
- return new Context9(state, this);
-}
-
-void *Renderer9::getD3DDevice()
-{
- return reinterpret_cast<void *>(mDevice);
-}
-
-gl::Error Renderer9::allocateEventQuery(IDirect3DQuery9 **outQuery)
-{
- if (mEventQueryPool.empty())
- {
- HRESULT result = mDevice->CreateQuery(D3DQUERYTYPE_EVENT, outQuery);
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::OutOfMemory() << "Failed to allocate event query, " << gl::FmtHR(result);
- }
- }
- else
- {
- *outQuery = mEventQueryPool.back();
- mEventQueryPool.pop_back();
- }
-
- return gl::NoError();
-}
-
-void Renderer9::freeEventQuery(IDirect3DQuery9 *query)
-{
- if (mEventQueryPool.size() > 1000)
- {
- SafeRelease(query);
- }
- else
- {
- mEventQueryPool.push_back(query);
- }
-}
-
-gl::Error Renderer9::createVertexShader(const DWORD *function,
- size_t length,
- IDirect3DVertexShader9 **outShader)
-{
- return mVertexShaderCache.create(function, length, outShader);
-}
-
-gl::Error Renderer9::createPixelShader(const DWORD *function,
- size_t length,
- IDirect3DPixelShader9 **outShader)
-{
- return mPixelShaderCache.create(function, length, outShader);
-}
-
-HRESULT Renderer9::createVertexBuffer(UINT Length,
- DWORD Usage,
- IDirect3DVertexBuffer9 **ppVertexBuffer)
-{
- D3DPOOL Pool = getBufferPool(Usage);
- return mDevice->CreateVertexBuffer(Length, Usage, 0, Pool, ppVertexBuffer, nullptr);
-}
-
-VertexBuffer *Renderer9::createVertexBuffer()
-{
- return new VertexBuffer9(this);
-}
-
-HRESULT Renderer9::createIndexBuffer(UINT Length,
- DWORD Usage,
- D3DFORMAT Format,
- IDirect3DIndexBuffer9 **ppIndexBuffer)
-{
- D3DPOOL Pool = getBufferPool(Usage);
- return mDevice->CreateIndexBuffer(Length, Usage, Format, Pool, ppIndexBuffer, nullptr);
-}
-
-IndexBuffer *Renderer9::createIndexBuffer()
-{
- return new IndexBuffer9(this);
-}
-
-StreamProducerImpl *Renderer9::createStreamProducerD3DTextureNV12(
- egl::Stream::ConsumerType consumerType,
- const egl::AttributeMap &attribs)
-{
- // Streams are not supported under D3D9
- UNREACHABLE();
- return nullptr;
-}
-
-bool Renderer9::supportsFastCopyBufferToTexture(GLenum internalFormat) const
-{
- // Pixel buffer objects are not supported in D3D9, since D3D9 is ES2-only and PBOs are ES3.
- return false;
-}
-
-gl::Error Renderer9::fastCopyBufferToTexture(const gl::Context *context,
- const gl::PixelUnpackState &unpack,
- unsigned int offset,
- RenderTargetD3D *destRenderTarget,
- GLenum destinationFormat,
- GLenum sourcePixelsType,
- const gl::Box &destArea)
-{
- // Pixel buffer objects are not supported in D3D9, since D3D9 is ES2-only and PBOs are ES3.
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error Renderer9::setSamplerState(const gl::Context *context,
- gl::SamplerType type,
- int index,
- gl::Texture *texture,
- const gl::SamplerState &samplerState)
-{
- CurSamplerState &appliedSampler = (type == gl::SAMPLER_PIXEL) ? mCurPixelSamplerStates[index]
- : mCurVertexSamplerStates[index];
-
- // Make sure to add the level offset for our tiny compressed texture workaround
- TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture);
-
- TextureStorage *storage = nullptr;
- ANGLE_TRY(textureD3D->getNativeTexture(context, &storage));
-
- // Storage should exist, texture should be complete
- ASSERT(storage);
-
- DWORD baseLevel = texture->getBaseLevel() + storage->getTopLevel();
-
- if (appliedSampler.forceSet || appliedSampler.baseLevel != baseLevel ||
- memcmp(&samplerState, &appliedSampler, sizeof(gl::SamplerState)) != 0)
- {
- int d3dSamplerOffset = (type == gl::SAMPLER_PIXEL) ? 0 : D3DVERTEXTEXTURESAMPLER0;
- int d3dSampler = index + d3dSamplerOffset;
-
- mDevice->SetSamplerState(d3dSampler, D3DSAMP_ADDRESSU,
- gl_d3d9::ConvertTextureWrap(samplerState.wrapS));
- mDevice->SetSamplerState(d3dSampler, D3DSAMP_ADDRESSV,
- gl_d3d9::ConvertTextureWrap(samplerState.wrapT));
-
- mDevice->SetSamplerState(
- d3dSampler, D3DSAMP_MAGFILTER,
- gl_d3d9::ConvertMagFilter(samplerState.magFilter, samplerState.maxAnisotropy));
-
- D3DTEXTUREFILTERTYPE d3dMinFilter, d3dMipFilter;
- float lodBias;
- gl_d3d9::ConvertMinFilter(samplerState.minFilter, &d3dMinFilter, &d3dMipFilter, &lodBias,
- samplerState.maxAnisotropy, baseLevel);
- mDevice->SetSamplerState(d3dSampler, D3DSAMP_MINFILTER, d3dMinFilter);
- mDevice->SetSamplerState(d3dSampler, D3DSAMP_MIPFILTER, d3dMipFilter);
- mDevice->SetSamplerState(d3dSampler, D3DSAMP_MAXMIPLEVEL, baseLevel);
- mDevice->SetSamplerState(d3dSampler, D3DSAMP_MIPMAPLODBIAS, static_cast<DWORD>(lodBias));
- if (getNativeExtensions().textureFilterAnisotropic)
- {
- DWORD maxAnisotropy =
- std::min(mDeviceCaps.MaxAnisotropy, static_cast<DWORD>(samplerState.maxAnisotropy));
- mDevice->SetSamplerState(d3dSampler, D3DSAMP_MAXANISOTROPY, maxAnisotropy);
- }
- }
-
- appliedSampler.forceSet = false;
- appliedSampler.samplerState = samplerState;
- appliedSampler.baseLevel = baseLevel;
-
- return gl::NoError();
-}
-
-gl::Error Renderer9::setTexture(const gl::Context *context,
- gl::SamplerType type,
- int index,
- gl::Texture *texture)
-{
- int d3dSamplerOffset = (type == gl::SAMPLER_PIXEL) ? 0 : D3DVERTEXTEXTURESAMPLER0;
- int d3dSampler = index + d3dSamplerOffset;
- IDirect3DBaseTexture9 *d3dTexture = nullptr;
- bool forceSetTexture = false;
-
- std::vector<uintptr_t> &appliedTextures =
- (type == gl::SAMPLER_PIXEL) ? mCurPixelTextures : mCurVertexTextures;
-
- if (texture)
- {
- TextureD3D *textureImpl = GetImplAs<TextureD3D>(texture);
-
- TextureStorage *texStorage = nullptr;
- ANGLE_TRY(textureImpl->getNativeTexture(context, &texStorage));
-
- // Texture should be complete and have a storage
- ASSERT(texStorage);
-
- TextureStorage9 *storage9 = GetAs<TextureStorage9>(texStorage);
- ANGLE_TRY(storage9->getBaseTexture(context, &d3dTexture));
-
- // If we get NULL back from getBaseTexture here, something went wrong
- // in the texture class and we're unexpectedly missing the d3d texture
- ASSERT(d3dTexture != nullptr);
-
- forceSetTexture = textureImpl->hasDirtyImages();
- textureImpl->resetDirty();
- }
-
- if (forceSetTexture || appliedTextures[index] != reinterpret_cast<uintptr_t>(d3dTexture))
- {
- mDevice->SetTexture(d3dSampler, d3dTexture);
- }
-
- appliedTextures[index] = reinterpret_cast<uintptr_t>(d3dTexture);
-
- return gl::NoError();
-}
-
-gl::Error Renderer9::updateState(const gl::Context *context, GLenum drawMode)
-{
- const auto &glState = context->getGLState();
-
- // Applies the render target surface, depth stencil surface, viewport rectangle and
- // scissor rectangle to the renderer
- gl::Framebuffer *framebuffer = glState.getDrawFramebuffer();
- ASSERT(framebuffer && !framebuffer->hasAnyDirtyBit() && framebuffer->cachedComplete());
-
- ANGLE_TRY(applyRenderTarget(context, framebuffer));
-
- // Setting viewport state
- setViewport(glState.getViewport(), glState.getNearPlane(), glState.getFarPlane(), drawMode,
- glState.getRasterizerState().frontFace, false);
-
- // Setting scissors state
- setScissorRectangle(glState.getScissor(), glState.isScissorTestEnabled());
-
- // Setting blend, depth stencil, and rasterizer states
- // Since framebuffer->getSamples will return the original samples which may be different with
- // the sample counts that we set in render target view, here we use renderTarget->getSamples to
- // get the actual samples.
- GLsizei samples = 0;
- const gl::FramebufferAttachment *firstColorAttachment = framebuffer->getFirstColorbuffer();
- if (firstColorAttachment)
- {
- ASSERT(firstColorAttachment->isAttached());
- RenderTarget9 *renderTarget = nullptr;
- ANGLE_TRY(firstColorAttachment->getRenderTarget(context, &renderTarget));
- samples = renderTarget->getSamples();
- }
- gl::RasterizerState rasterizer = glState.getRasterizerState();
- rasterizer.pointDrawMode = (drawMode == GL_POINTS);
- rasterizer.multiSample = (samples != 0);
-
- unsigned int mask = GetBlendSampleMask(glState, samples);
- ANGLE_TRY(setBlendDepthRasterStates(context, mask));
-
- mStateManager.resetDirtyBits();
-
- return gl::NoError();
-}
-
-void Renderer9::setScissorRectangle(const gl::Rectangle &scissor, bool enabled)
-{
- mStateManager.setScissorState(scissor, enabled);
-}
-
-gl::Error Renderer9::setBlendDepthRasterStates(const gl::Context *context, GLenum drawMode)
-{
- const auto &glState = context->getGLState();
- gl::Framebuffer *drawFramebuffer = glState.getDrawFramebuffer();
- ASSERT(!drawFramebuffer->hasAnyDirtyBit());
- // Since framebuffer->getSamples will return the original samples which may be different with
- // the sample counts that we set in render target view, here we use renderTarget->getSamples to
- // get the actual samples.
- GLsizei samples = 0;
- const gl::FramebufferAttachment *firstColorAttachment = drawFramebuffer->getFirstColorbuffer();
- if (firstColorAttachment)
- {
- ASSERT(firstColorAttachment->isAttached());
- RenderTarget9 *renderTarget = nullptr;
- ANGLE_TRY(firstColorAttachment->getRenderTarget(context, &renderTarget));
- samples = renderTarget->getSamples();
- }
- gl::RasterizerState rasterizer = glState.getRasterizerState();
- rasterizer.pointDrawMode = (drawMode == GL_POINTS);
- rasterizer.multiSample = (samples != 0);
-
- unsigned int mask = GetBlendSampleMask(glState, samples);
- return mStateManager.setBlendDepthRasterStates(glState, mask);
-}
-
-void Renderer9::setViewport(const gl::Rectangle &viewport,
- float zNear,
- float zFar,
- GLenum drawMode,
- GLenum frontFace,
- bool ignoreViewport)
-{
- mStateManager.setViewportState(viewport, zNear, zFar, drawMode, frontFace, ignoreViewport);
-}
-
-bool Renderer9::applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSize)
-{
- switch (mode)
- {
- case GL_POINTS:
- mPrimitiveType = D3DPT_POINTLIST;
- mPrimitiveCount = count;
- break;
- case GL_LINES:
- mPrimitiveType = D3DPT_LINELIST;
- mPrimitiveCount = count / 2;
- break;
- case GL_LINE_LOOP:
- mPrimitiveType = D3DPT_LINESTRIP;
- mPrimitiveCount =
- count - 1; // D3D doesn't support line loops, so we draw the last line separately
- break;
- case GL_LINE_STRIP:
- mPrimitiveType = D3DPT_LINESTRIP;
- mPrimitiveCount = count - 1;
- break;
- case GL_TRIANGLES:
- mPrimitiveType = D3DPT_TRIANGLELIST;
- mPrimitiveCount = count / 3;
- break;
- case GL_TRIANGLE_STRIP:
- mPrimitiveType = D3DPT_TRIANGLESTRIP;
- mPrimitiveCount = count - 2;
- break;
- case GL_TRIANGLE_FAN:
- mPrimitiveType = D3DPT_TRIANGLEFAN;
- mPrimitiveCount = count - 2;
- break;
- default:
- UNREACHABLE();
- return false;
- }
-
- return mPrimitiveCount > 0;
-}
-
-gl::Error Renderer9::getNullColorbuffer(const gl::Context *context,
- const gl::FramebufferAttachment *depthbuffer,
- const gl::FramebufferAttachment **outColorBuffer)
-{
- ASSERT(depthbuffer);
-
- const gl::Extents &size = depthbuffer->getSize();
-
- // search cached nullcolorbuffers
- for (int i = 0; i < NUM_NULL_COLORBUFFER_CACHE_ENTRIES; i++)
- {
- if (mNullColorbufferCache[i].buffer != nullptr &&
- mNullColorbufferCache[i].width == size.width &&
- mNullColorbufferCache[i].height == size.height)
- {
- mNullColorbufferCache[i].lruCount = ++mMaxNullColorbufferLRU;
- *outColorBuffer = mNullColorbufferCache[i].buffer;
- return gl::NoError();
- }
- }
-
- auto *implFactory = context->getImplementation();
-
- gl::Renderbuffer *nullRenderbuffer = new gl::Renderbuffer(implFactory->createRenderbuffer(), 0);
- gl::Error error = nullRenderbuffer->setStorage(context, GL_NONE, size.width, size.height);
- if (error.isError())
- {
- SafeDelete(nullRenderbuffer);
- return error;
- }
-
- gl::FramebufferAttachment *nullbuffer = new gl::FramebufferAttachment(
- context, GL_RENDERBUFFER, GL_NONE, gl::ImageIndex::MakeInvalid(), nullRenderbuffer);
-
- // add nullbuffer to the cache
- NullColorbufferCacheEntry *oldest = &mNullColorbufferCache[0];
- for (int i = 1; i < NUM_NULL_COLORBUFFER_CACHE_ENTRIES; i++)
- {
- if (mNullColorbufferCache[i].lruCount < oldest->lruCount)
- {
- oldest = &mNullColorbufferCache[i];
- }
- }
-
- delete oldest->buffer;
- oldest->buffer = nullbuffer;
- oldest->lruCount = ++mMaxNullColorbufferLRU;
- oldest->width = size.width;
- oldest->height = size.height;
-
- *outColorBuffer = nullbuffer;
- return gl::NoError();
-}
-
-gl::Error Renderer9::applyRenderTarget(const gl::Context *context,
- const gl::FramebufferAttachment *colorAttachment,
- const gl::FramebufferAttachment *depthStencilAttachment)
-{
- const gl::FramebufferAttachment *renderAttachment = colorAttachment;
-
- // if there is no color attachment we must synthesize a NULL colorattachment
- // to keep the D3D runtime happy. This should only be possible if depth texturing.
- if (renderAttachment == nullptr)
- {
- ANGLE_TRY(getNullColorbuffer(context, depthStencilAttachment, &renderAttachment));
- }
- ASSERT(renderAttachment != nullptr);
-
- size_t renderTargetWidth = 0;
- size_t renderTargetHeight = 0;
- D3DFORMAT renderTargetFormat = D3DFMT_UNKNOWN;
-
- RenderTarget9 *renderTarget = nullptr;
- ANGLE_TRY(renderAttachment->getRenderTarget(context, &renderTarget));
- ASSERT(renderTarget);
-
- bool renderTargetChanged = false;
- unsigned int renderTargetSerial = renderTarget->getSerial();
- if (renderTargetSerial != mAppliedRenderTargetSerial)
- {
- // Apply the render target on the device
- IDirect3DSurface9 *renderTargetSurface = renderTarget->getSurface();
- ASSERT(renderTargetSurface);
-
- mDevice->SetRenderTarget(0, renderTargetSurface);
- SafeRelease(renderTargetSurface);
-
- renderTargetWidth = renderTarget->getWidth();
- renderTargetHeight = renderTarget->getHeight();
- renderTargetFormat = renderTarget->getD3DFormat();
-
- mAppliedRenderTargetSerial = renderTargetSerial;
- renderTargetChanged = true;
- }
-
- RenderTarget9 *depthStencilRenderTarget = nullptr;
- unsigned int depthStencilSerial = 0;
-
- if (depthStencilAttachment != nullptr)
- {
- ANGLE_TRY(depthStencilAttachment->getRenderTarget(context, &depthStencilRenderTarget));
- ASSERT(depthStencilRenderTarget);
-
- depthStencilSerial = depthStencilRenderTarget->getSerial();
- }
-
- if (depthStencilSerial != mAppliedDepthStencilSerial || !mDepthStencilInitialized)
- {
- unsigned int depthSize = 0;
- unsigned int stencilSize = 0;
-
- // Apply the depth stencil on the device
- if (depthStencilRenderTarget)
- {
- IDirect3DSurface9 *depthStencilSurface = depthStencilRenderTarget->getSurface();
- ASSERT(depthStencilSurface);
-
- mDevice->SetDepthStencilSurface(depthStencilSurface);
- SafeRelease(depthStencilSurface);
-
- depthSize = depthStencilAttachment->getDepthSize();
- stencilSize = depthStencilAttachment->getStencilSize();
- }
- else
- {
- mDevice->SetDepthStencilSurface(nullptr);
- }
-
- mStateManager.updateDepthSizeIfChanged(mDepthStencilInitialized, depthSize);
- mStateManager.updateStencilSizeIfChanged(mDepthStencilInitialized, stencilSize);
-
- mAppliedDepthStencilSerial = depthStencilSerial;
- mDepthStencilInitialized = true;
- }
-
- if (renderTargetChanged || !mRenderTargetDescInitialized)
- {
- mStateManager.forceSetBlendState();
- mStateManager.forceSetScissorState();
- mStateManager.setRenderTargetBounds(renderTargetWidth, renderTargetHeight);
- mRenderTargetDescInitialized = true;
- }
-
- return gl::NoError();
-}
-
-gl::Error Renderer9::applyRenderTarget(const gl::Context *context,
- const gl::Framebuffer *framebuffer)
-{
- return applyRenderTarget(context, framebuffer->getColorbuffer(0),
- framebuffer->getDepthOrStencilbuffer());
-}
-
-gl::Error Renderer9::applyVertexBuffer(const gl::Context *context,
- GLenum mode,
- GLint first,
- GLsizei count,
- GLsizei instances,
- TranslatedIndexData * /*indexInfo*/)
-{
- const gl::State &state = context->getGLState();
- gl::Error error = mVertexDataManager->prepareVertexData(context, first, count,
- &mTranslatedAttribCache, instances);
- if (error.isError())
- {
- return error;
- }
-
- return mVertexDeclarationCache.applyDeclaration(
- mDevice, mTranslatedAttribCache, state.getProgram(), first, instances, &mRepeatDraw);
-}
-
-// Applies the indices and element array bindings to the Direct3D 9 device
-gl::Error Renderer9::applyIndexBuffer(const gl::Context *context,
- const void *indices,
- GLsizei count,
- GLenum mode,
- GLenum type,
- TranslatedIndexData *indexInfo)
-{
- gl::VertexArray *vao = context->getGLState().getVertexArray();
- gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get();
- const auto &lazyIndexRange = context->getParams<gl::HasIndexRange>();
-
- GLenum dstType = GetIndexTranslationDestType(type, lazyIndexRange, false);
-
- ANGLE_TRY(mIndexDataManager->prepareIndexData(context, type, dstType, count, elementArrayBuffer,
- indices, indexInfo));
-
- // Directly binding the storage buffer is not supported for d3d9
- ASSERT(indexInfo->storage == nullptr);
-
- if (indexInfo->serial != mAppliedIBSerial)
- {
- IndexBuffer9 *indexBuffer = GetAs<IndexBuffer9>(indexInfo->indexBuffer);
-
- mDevice->SetIndices(indexBuffer->getBuffer());
- mAppliedIBSerial = indexInfo->serial;
- }
-
- return gl::NoError();
-}
-
-gl::Error Renderer9::drawArraysImpl(const gl::Context *context,
- GLenum mode,
- GLint startVertex,
- GLsizei count,
- GLsizei instances)
-{
- ASSERT(!context->getGLState().isTransformFeedbackActiveUnpaused());
-
- startScene();
-
- if (mode == GL_LINE_LOOP)
- {
- return drawLineLoop(context, count, GL_NONE, nullptr, 0, nullptr);
- }
- else if (instances > 0)
- {
- StaticIndexBufferInterface *countingIB = nullptr;
- gl::Error error = getCountingIB(count, &countingIB);
- if (error.isError())
- {
- return error;
- }
-
- if (mAppliedIBSerial != countingIB->getSerial())
- {
- IndexBuffer9 *indexBuffer = GetAs<IndexBuffer9>(countingIB->getIndexBuffer());
-
- mDevice->SetIndices(indexBuffer->getBuffer());
- mAppliedIBSerial = countingIB->getSerial();
- }
-
- for (int i = 0; i < mRepeatDraw; i++)
- {
- mDevice->DrawIndexedPrimitive(mPrimitiveType, 0, 0, count, 0, mPrimitiveCount);
- }
-
- return gl::NoError();
- }
- else // Regular case
- {
- mDevice->DrawPrimitive(mPrimitiveType, 0, mPrimitiveCount);
- return gl::NoError();
- }
-}
-
-gl::Error Renderer9::drawElementsImpl(const gl::Context *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei instances)
-{
- TranslatedIndexData indexInfo;
-
- ANGLE_TRY(applyIndexBuffer(context, indices, count, mode, type, &indexInfo));
-
- const auto &lazyIndexRange = context->getParams<gl::HasIndexRange>();
- const gl::IndexRange &indexRange = lazyIndexRange.getIndexRange().value();
- size_t vertexCount = indexRange.vertexCount();
- ANGLE_TRY(applyVertexBuffer(context, mode, static_cast<GLsizei>(indexRange.start),
- static_cast<GLsizei>(vertexCount), instances, &indexInfo));
-
- startScene();
-
- int minIndex = static_cast<int>(indexRange.start);
-
- gl::VertexArray *vao = context->getGLState().getVertexArray();
- gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get();
-
- if (mode == GL_POINTS)
- {
- return drawIndexedPoints(context, count, type, indices, minIndex, elementArrayBuffer);
- }
- else if (mode == GL_LINE_LOOP)
- {
- return drawLineLoop(context, count, type, indices, minIndex, elementArrayBuffer);
- }
- else
- {
- for (int i = 0; i < mRepeatDraw; i++)
- {
- mDevice->DrawIndexedPrimitive(mPrimitiveType, -minIndex, minIndex,
- static_cast<UINT>(vertexCount), indexInfo.startIndex,
- mPrimitiveCount);
- }
- return gl::NoError();
- }
-}
-
-gl::Error Renderer9::drawLineLoop(const gl::Context *context,
- GLsizei count,
- GLenum type,
- const void *indices,
- int minIndex,
- gl::Buffer *elementArrayBuffer)
-{
- // Get the raw indices for an indexed draw
- if (type != GL_NONE && elementArrayBuffer)
- {
- BufferD3D *storage = GetImplAs<BufferD3D>(elementArrayBuffer);
- intptr_t offset = reinterpret_cast<intptr_t>(indices);
- const uint8_t *bufferData = nullptr;
- gl::Error error = storage->getData(context, &bufferData);
- if (error.isError())
- {
- return error;
- }
- indices = bufferData + offset;
- }
-
- unsigned int startIndex = 0;
-
- if (getNativeExtensions().elementIndexUint)
- {
- if (!mLineLoopIB)
- {
- mLineLoopIB = new StreamingIndexBufferInterface(this);
- gl::Error error =
- mLineLoopIB->reserveBufferSpace(INITIAL_INDEX_BUFFER_SIZE, GL_UNSIGNED_INT);
- if (error.isError())
- {
- SafeDelete(mLineLoopIB);
- return error;
- }
- }
-
- // Checked by Renderer9::applyPrimitiveType
- ASSERT(count >= 0);
-
- if (static_cast<unsigned int>(count) + 1 >
- (std::numeric_limits<unsigned int>::max() / sizeof(unsigned int)))
- {
- return gl::OutOfMemory() << "Failed to create a 32-bit looping index buffer for "
- "GL_LINE_LOOP, too many indices required.";
- }
-
- const unsigned int spaceNeeded =
- (static_cast<unsigned int>(count) + 1) * sizeof(unsigned int);
- gl::Error error = mLineLoopIB->reserveBufferSpace(spaceNeeded, GL_UNSIGNED_INT);
- if (error.isError())
- {
- return error;
- }
-
- void *mappedMemory = nullptr;
- unsigned int offset = 0;
- error = mLineLoopIB->mapBuffer(spaceNeeded, &mappedMemory, &offset);
- if (error.isError())
- {
- return error;
- }
-
- startIndex = static_cast<unsigned int>(offset) / 4;
- unsigned int *data = reinterpret_cast<unsigned int *>(mappedMemory);
-
- switch (type)
- {
- case GL_NONE: // Non-indexed draw
- for (int i = 0; i < count; i++)
- {
- data[i] = i;
- }
- data[count] = 0;
- break;
- case GL_UNSIGNED_BYTE:
- for (int i = 0; i < count; i++)
- {
- data[i] = static_cast<const GLubyte *>(indices)[i];
- }
- data[count] = static_cast<const GLubyte *>(indices)[0];
- break;
- case GL_UNSIGNED_SHORT:
- for (int i = 0; i < count; i++)
- {
- data[i] = static_cast<const GLushort *>(indices)[i];
- }
- data[count] = static_cast<const GLushort *>(indices)[0];
- break;
- case GL_UNSIGNED_INT:
- for (int i = 0; i < count; i++)
- {
- data[i] = static_cast<const GLuint *>(indices)[i];
- }
- data[count] = static_cast<const GLuint *>(indices)[0];
- break;
- default:
- UNREACHABLE();
- }
-
- error = mLineLoopIB->unmapBuffer();
- if (error.isError())
- {
- return error;
- }
- }
- else
- {
- if (!mLineLoopIB)
- {
- mLineLoopIB = new StreamingIndexBufferInterface(this);
- gl::Error error =
- mLineLoopIB->reserveBufferSpace(INITIAL_INDEX_BUFFER_SIZE, GL_UNSIGNED_SHORT);
- if (error.isError())
- {
- SafeDelete(mLineLoopIB);
- return error;
- }
- }
-
- // Checked by Renderer9::applyPrimitiveType
- ASSERT(count >= 0);
-
- if (static_cast<unsigned int>(count) + 1 >
- (std::numeric_limits<unsigned short>::max() / sizeof(unsigned short)))
- {
- return gl::OutOfMemory() << "Failed to create a 16-bit looping index buffer for "
- "GL_LINE_LOOP, too many indices required.";
- }
-
- const unsigned int spaceNeeded =
- (static_cast<unsigned int>(count) + 1) * sizeof(unsigned short);
- gl::Error error = mLineLoopIB->reserveBufferSpace(spaceNeeded, GL_UNSIGNED_SHORT);
- if (error.isError())
- {
- return error;
- }
-
- void *mappedMemory = nullptr;
- unsigned int offset;
- error = mLineLoopIB->mapBuffer(spaceNeeded, &mappedMemory, &offset);
- if (error.isError())
- {
- return error;
- }
-
- startIndex = static_cast<unsigned int>(offset) / 2;
- unsigned short *data = reinterpret_cast<unsigned short *>(mappedMemory);
-
- switch (type)
- {
- case GL_NONE: // Non-indexed draw
- for (int i = 0; i < count; i++)
- {
- data[i] = static_cast<unsigned short>(i);
- }
- data[count] = 0;
- break;
- case GL_UNSIGNED_BYTE:
- for (int i = 0; i < count; i++)
- {
- data[i] = static_cast<const GLubyte *>(indices)[i];
- }
- data[count] = static_cast<const GLubyte *>(indices)[0];
- break;
- case GL_UNSIGNED_SHORT:
- for (int i = 0; i < count; i++)
- {
- data[i] = static_cast<const GLushort *>(indices)[i];
- }
- data[count] = static_cast<const GLushort *>(indices)[0];
- break;
- case GL_UNSIGNED_INT:
- for (int i = 0; i < count; i++)
- {
- data[i] = static_cast<unsigned short>(static_cast<const GLuint *>(indices)[i]);
- }
- data[count] = static_cast<unsigned short>(static_cast<const GLuint *>(indices)[0]);
- break;
- default:
- UNREACHABLE();
- }
-
- error = mLineLoopIB->unmapBuffer();
- if (error.isError())
- {
- return error;
- }
- }
-
- if (mAppliedIBSerial != mLineLoopIB->getSerial())
- {
- IndexBuffer9 *indexBuffer = GetAs<IndexBuffer9>(mLineLoopIB->getIndexBuffer());
-
- mDevice->SetIndices(indexBuffer->getBuffer());
- mAppliedIBSerial = mLineLoopIB->getSerial();
- }
-
- mDevice->DrawIndexedPrimitive(D3DPT_LINESTRIP, -minIndex, minIndex, count, startIndex, count);
-
- return gl::NoError();
-}
-
-template <typename T>
-static gl::Error drawPoints(IDirect3DDevice9 *device,
- GLsizei count,
- const void *indices,
- int minIndex)
-{
- for (int i = 0; i < count; i++)
- {
- unsigned int indexValue =
- static_cast<unsigned int>(static_cast<const T *>(indices)[i]) - minIndex;
- device->DrawPrimitive(D3DPT_POINTLIST, indexValue, 1);
- }
-
- return gl::NoError();
-}
-
-gl::Error Renderer9::drawIndexedPoints(const gl::Context *context,
- GLsizei count,
- GLenum type,
- const void *indices,
- int minIndex,
- gl::Buffer *elementArrayBuffer)
-{
- // Drawing index point lists is unsupported in d3d9, fall back to a regular DrawPrimitive call
- // for each individual point. This call is not expected to happen often.
-
- if (elementArrayBuffer)
- {
- BufferD3D *storage = GetImplAs<BufferD3D>(elementArrayBuffer);
- intptr_t offset = reinterpret_cast<intptr_t>(indices);
-
- const uint8_t *bufferData = nullptr;
- gl::Error error = storage->getData(context, &bufferData);
- if (error.isError())
- {
- return error;
- }
-
- indices = bufferData + offset;
- }
-
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return drawPoints<GLubyte>(mDevice, count, indices, minIndex);
- case GL_UNSIGNED_SHORT:
- return drawPoints<GLushort>(mDevice, count, indices, minIndex);
- case GL_UNSIGNED_INT:
- return drawPoints<GLuint>(mDevice, count, indices, minIndex);
- default:
- UNREACHABLE();
- return gl::InternalError();
- }
-}
-
-gl::Error Renderer9::getCountingIB(size_t count, StaticIndexBufferInterface **outIB)
-{
- // Update the counting index buffer if it is not large enough or has not been created yet.
- if (count <= 65536) // 16-bit indices
- {
- const unsigned int spaceNeeded = static_cast<unsigned int>(count) * sizeof(unsigned short);
-
- if (!mCountingIB || mCountingIB->getBufferSize() < spaceNeeded)
- {
- SafeDelete(mCountingIB);
- mCountingIB = new StaticIndexBufferInterface(this);
- ANGLE_TRY(mCountingIB->reserveBufferSpace(spaceNeeded, GL_UNSIGNED_SHORT));
-
- void *mappedMemory = nullptr;
- ANGLE_TRY(mCountingIB->mapBuffer(spaceNeeded, &mappedMemory, nullptr));
-
- unsigned short *data = reinterpret_cast<unsigned short *>(mappedMemory);
- for (size_t i = 0; i < count; i++)
- {
- data[i] = static_cast<unsigned short>(i);
- }
-
- ANGLE_TRY(mCountingIB->unmapBuffer());
- }
- }
- else if (getNativeExtensions().elementIndexUint)
- {
- const unsigned int spaceNeeded = static_cast<unsigned int>(count) * sizeof(unsigned int);
-
- if (!mCountingIB || mCountingIB->getBufferSize() < spaceNeeded)
- {
- SafeDelete(mCountingIB);
- mCountingIB = new StaticIndexBufferInterface(this);
- ANGLE_TRY(mCountingIB->reserveBufferSpace(spaceNeeded, GL_UNSIGNED_INT));
-
- void *mappedMemory = nullptr;
- ANGLE_TRY(mCountingIB->mapBuffer(spaceNeeded, &mappedMemory, nullptr));
-
- unsigned int *data = reinterpret_cast<unsigned int *>(mappedMemory);
- for (unsigned int i = 0; i < count; i++)
- {
- data[i] = i;
- }
-
- ANGLE_TRY(mCountingIB->unmapBuffer());
- }
- }
- else
- {
- return gl::OutOfMemory()
- << "Could not create a counting index buffer for glDrawArraysInstanced.";
- }
-
- *outIB = mCountingIB;
- return gl::NoError();
-}
-
-gl::Error Renderer9::applyShaders(const gl::Context *context, GLenum drawMode)
-{
- const gl::State &state = context->getContextState().getState();
- // This method is called single-threaded.
- ANGLE_TRY(ensureHLSLCompilerInitialized());
-
- ProgramD3D *programD3D = GetImplAs<ProgramD3D>(state.getProgram());
- VertexArray9 *vao = GetImplAs<VertexArray9>(state.getVertexArray());
- programD3D->updateCachedInputLayout(vao->getCurrentStateSerial(), state);
-
- ShaderExecutableD3D *vertexExe = nullptr;
- ANGLE_TRY(programD3D->getVertexExecutableForCachedInputLayout(&vertexExe, nullptr));
-
- const gl::Framebuffer *drawFramebuffer = state.getDrawFramebuffer();
- programD3D->updateCachedOutputLayout(context, drawFramebuffer);
-
- ShaderExecutableD3D *pixelExe = nullptr;
- ANGLE_TRY(programD3D->getPixelExecutableForCachedOutputLayout(&pixelExe, nullptr));
-
- IDirect3DVertexShader9 *vertexShader =
- (vertexExe ? GetAs<ShaderExecutable9>(vertexExe)->getVertexShader() : nullptr);
- IDirect3DPixelShader9 *pixelShader =
- (pixelExe ? GetAs<ShaderExecutable9>(pixelExe)->getPixelShader() : nullptr);
-
- if (vertexShader != mAppliedVertexShader)
- {
- mDevice->SetVertexShader(vertexShader);
- mAppliedVertexShader = vertexShader;
- }
-
- if (pixelShader != mAppliedPixelShader)
- {
- mDevice->SetPixelShader(pixelShader);
- mAppliedPixelShader = pixelShader;
- }
-
- // D3D9 has a quirk where creating multiple shaders with the same content
- // can return the same shader pointer. Because GL programs store different data
- // per-program, checking the program serial guarantees we upload fresh
- // uniform data even if our shader pointers are the same.
- // https://code.google.com/p/angleproject/issues/detail?id=661
- unsigned int programSerial = programD3D->getSerial();
- if (programSerial != mAppliedProgramSerial)
- {
- programD3D->dirtyAllUniforms();
- mStateManager.forceSetDXUniformsState();
- mAppliedProgramSerial = programSerial;
- }
-
- ANGLE_TRY(applyUniforms(programD3D));
-
- // Driver uniforms
- mStateManager.setShaderConstants();
-
- return gl::NoError();
-}
-
-gl::Error Renderer9::applyUniforms(ProgramD3D *programD3D)
-{
- // Skip updates if we're not dirty. Note that D3D9 cannot have compute.
- if (!programD3D->areVertexUniformsDirty() && !programD3D->areFragmentUniformsDirty())
- {
- return gl::NoError();
- }
-
- const auto &uniformArray = programD3D->getD3DUniforms();
-
- for (const D3DUniform *targetUniform : uniformArray)
- {
- // Built-in uniforms must be skipped.
- if (!targetUniform->isReferencedByFragmentShader() &&
- !targetUniform->isReferencedByVertexShader())
- continue;
-
- const GLfloat *f = reinterpret_cast<const GLfloat *>(targetUniform->firstNonNullData());
- const GLint *i = reinterpret_cast<const GLint *>(targetUniform->firstNonNullData());
-
- switch (targetUniform->typeInfo.type)
- {
- case GL_SAMPLER_2D:
- case GL_SAMPLER_CUBE:
- case GL_SAMPLER_EXTERNAL_OES:
- break;
- case GL_BOOL:
- case GL_BOOL_VEC2:
- case GL_BOOL_VEC3:
- case GL_BOOL_VEC4:
- applyUniformnbv(targetUniform, i);
- break;
- case GL_FLOAT:
- case GL_FLOAT_VEC2:
- case GL_FLOAT_VEC3:
- case GL_FLOAT_VEC4:
- case GL_FLOAT_MAT2:
- case GL_FLOAT_MAT3:
- case GL_FLOAT_MAT4:
- applyUniformnfv(targetUniform, f);
- break;
- case GL_INT:
- case GL_INT_VEC2:
- case GL_INT_VEC3:
- case GL_INT_VEC4:
- applyUniformniv(targetUniform, i);
- break;
- default:
- UNREACHABLE();
- }
- }
-
- programD3D->markUniformsClean();
- return gl::NoError();
-}
-
-void Renderer9::applyUniformnfv(const D3DUniform *targetUniform, const GLfloat *v)
-{
- if (targetUniform->isReferencedByFragmentShader())
- {
- mDevice->SetPixelShaderConstantF(targetUniform->psRegisterIndex, v,
- targetUniform->registerCount);
- }
-
- if (targetUniform->isReferencedByVertexShader())
- {
- mDevice->SetVertexShaderConstantF(targetUniform->vsRegisterIndex, v,
- targetUniform->registerCount);
- }
-}
-
-void Renderer9::applyUniformniv(const D3DUniform *targetUniform, const GLint *v)
-{
- ASSERT(targetUniform->registerCount <= MAX_VERTEX_CONSTANT_VECTORS_D3D9);
- GLfloat vector[MAX_VERTEX_CONSTANT_VECTORS_D3D9][4];
-
- for (unsigned int i = 0; i < targetUniform->registerCount; i++)
- {
- vector[i][0] = (GLfloat)v[4 * i + 0];
- vector[i][1] = (GLfloat)v[4 * i + 1];
- vector[i][2] = (GLfloat)v[4 * i + 2];
- vector[i][3] = (GLfloat)v[4 * i + 3];
- }
-
- applyUniformnfv(targetUniform, (GLfloat *)vector);
-}
-
-void Renderer9::applyUniformnbv(const D3DUniform *targetUniform, const GLint *v)
-{
- ASSERT(targetUniform->registerCount <= MAX_VERTEX_CONSTANT_VECTORS_D3D9);
- GLfloat vector[MAX_VERTEX_CONSTANT_VECTORS_D3D9][4];
-
- for (unsigned int i = 0; i < targetUniform->registerCount; i++)
- {
- vector[i][0] = (v[4 * i + 0] == GL_FALSE) ? 0.0f : 1.0f;
- vector[i][1] = (v[4 * i + 1] == GL_FALSE) ? 0.0f : 1.0f;
- vector[i][2] = (v[4 * i + 2] == GL_FALSE) ? 0.0f : 1.0f;
- vector[i][3] = (v[4 * i + 3] == GL_FALSE) ? 0.0f : 1.0f;
- }
-
- applyUniformnfv(targetUniform, (GLfloat *)vector);
-}
-
-gl::Error Renderer9::clear(const gl::Context *context,
- const ClearParameters &clearParams,
- const gl::FramebufferAttachment *colorBuffer,
- const gl::FramebufferAttachment *depthStencilBuffer)
-{
- if (clearParams.colorType != GL_FLOAT)
- {
- // Clearing buffers with non-float values is not supported by Renderer9 and ES 2.0
- UNREACHABLE();
- return gl::InternalError();
- }
-
- bool clearColor = clearParams.clearColor[0];
- for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
- {
- if (clearParams.clearColor[i] != clearColor)
- {
- // Clearing individual buffers other than buffer zero is not supported by Renderer9 and
- // ES 2.0
- UNREACHABLE();
- return gl::InternalError();
- }
- }
-
- float depth = gl::clamp01(clearParams.depthValue);
- DWORD stencil = clearParams.stencilValue & 0x000000FF;
-
- unsigned int stencilUnmasked = 0x0;
- if (clearParams.clearStencil && depthStencilBuffer->getStencilSize() > 0)
- {
- ASSERT(depthStencilBuffer != nullptr);
-
- RenderTargetD3D *stencilRenderTarget = nullptr;
- gl::Error error = depthStencilBuffer->getRenderTarget(context, &stencilRenderTarget);
- if (error.isError())
- {
- return error;
- }
-
- RenderTarget9 *stencilRenderTarget9 = GetAs<RenderTarget9>(stencilRenderTarget);
- ASSERT(stencilRenderTarget9);
-
- const d3d9::D3DFormat &d3dFormatInfo =
- d3d9::GetD3DFormatInfo(stencilRenderTarget9->getD3DFormat());
- stencilUnmasked = (0x1 << d3dFormatInfo.stencilBits) - 1;
- }
-
- const bool needMaskedStencilClear =
- clearParams.clearStencil &&
- (clearParams.stencilWriteMask & stencilUnmasked) != stencilUnmasked;
-
- bool needMaskedColorClear = false;
- D3DCOLOR color = D3DCOLOR_ARGB(255, 0, 0, 0);
- if (clearColor)
- {
- ASSERT(colorBuffer != nullptr);
-
- RenderTargetD3D *colorRenderTarget = nullptr;
- gl::Error error = colorBuffer->getRenderTarget(context, &colorRenderTarget);
- if (error.isError())
- {
- return error;
- }
-
- RenderTarget9 *colorRenderTarget9 = GetAs<RenderTarget9>(colorRenderTarget);
- ASSERT(colorRenderTarget9);
-
- const gl::InternalFormat &formatInfo = *colorBuffer->getFormat().info;
- const d3d9::D3DFormat &d3dFormatInfo =
- d3d9::GetD3DFormatInfo(colorRenderTarget9->getD3DFormat());
-
- color =
- D3DCOLOR_ARGB(gl::unorm<8>((formatInfo.alphaBits == 0 && d3dFormatInfo.alphaBits > 0)
- ? 1.0f
- : clearParams.colorF.alpha),
- gl::unorm<8>((formatInfo.redBits == 0 && d3dFormatInfo.redBits > 0)
- ? 0.0f
- : clearParams.colorF.red),
- gl::unorm<8>((formatInfo.greenBits == 0 && d3dFormatInfo.greenBits > 0)
- ? 0.0f
- : clearParams.colorF.green),
- gl::unorm<8>((formatInfo.blueBits == 0 && d3dFormatInfo.blueBits > 0)
- ? 0.0f
- : clearParams.colorF.blue));
-
- if ((formatInfo.redBits > 0 && !clearParams.colorMaskRed) ||
- (formatInfo.greenBits > 0 && !clearParams.colorMaskGreen) ||
- (formatInfo.blueBits > 0 && !clearParams.colorMaskBlue) ||
- (formatInfo.alphaBits > 0 && !clearParams.colorMaskAlpha))
- {
- needMaskedColorClear = true;
- }
- }
-
- if (needMaskedColorClear || needMaskedStencilClear)
- {
- // State which is altered in all paths from this point to the clear call is saved.
- // State which is altered in only some paths will be flagged dirty in the case that
- // that path is taken.
- HRESULT hr;
- if (mMaskedClearSavedState == nullptr)
- {
- hr = mDevice->BeginStateBlock();
- ASSERT(SUCCEEDED(hr) || hr == D3DERR_OUTOFVIDEOMEMORY || hr == E_OUTOFMEMORY);
-
- mDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
- mDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS);
- mDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
- mDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
- mDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
- mDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
- mDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
- mDevice->SetRenderState(D3DRS_CLIPPLANEENABLE, 0);
- mDevice->SetRenderState(D3DRS_COLORWRITEENABLE, 0);
- mDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE);
- mDevice->SetPixelShader(nullptr);
- mDevice->SetVertexShader(nullptr);
- mDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
- mDevice->SetStreamSource(0, nullptr, 0, 0);
- mDevice->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE);
- mDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
- mDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
- mDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
- mDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR);
- mDevice->SetRenderState(D3DRS_TEXTUREFACTOR, color);
- mDevice->SetRenderState(D3DRS_MULTISAMPLEMASK, 0xFFFFFFFF);
-
- for (int i = 0; i < gl::MAX_VERTEX_ATTRIBS; i++)
- {
- mDevice->SetStreamSourceFreq(i, 1);
- }
-
- hr = mDevice->EndStateBlock(&mMaskedClearSavedState);
- ASSERT(SUCCEEDED(hr) || hr == D3DERR_OUTOFVIDEOMEMORY || hr == E_OUTOFMEMORY);
- }
-
- ASSERT(mMaskedClearSavedState != nullptr);
-
- if (mMaskedClearSavedState != nullptr)
- {
- hr = mMaskedClearSavedState->Capture();
- ASSERT(SUCCEEDED(hr));
- }
-
- mDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
- mDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS);
- mDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
- mDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
- mDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
- mDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
- mDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
- mDevice->SetRenderState(D3DRS_CLIPPLANEENABLE, 0);
-
- if (clearColor)
- {
- mDevice->SetRenderState(
- D3DRS_COLORWRITEENABLE,
- gl_d3d9::ConvertColorMask(clearParams.colorMaskRed, clearParams.colorMaskGreen,
- clearParams.colorMaskBlue, clearParams.colorMaskAlpha));
- }
- else
- {
- mDevice->SetRenderState(D3DRS_COLORWRITEENABLE, 0);
- }
-
- if (stencilUnmasked != 0x0 && clearParams.clearStencil)
- {
- mDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE);
- mDevice->SetRenderState(D3DRS_TWOSIDEDSTENCILMODE, FALSE);
- mDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS);
- mDevice->SetRenderState(D3DRS_STENCILREF, stencil);
- mDevice->SetRenderState(D3DRS_STENCILWRITEMASK, clearParams.stencilWriteMask);
- mDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_REPLACE);
- mDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_REPLACE);
- mDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE);
- }
- else
- {
- mDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE);
- }
-
- mDevice->SetPixelShader(nullptr);
- mDevice->SetVertexShader(nullptr);
- mDevice->SetFVF(D3DFVF_XYZRHW);
- mDevice->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE);
- mDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
- mDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
- mDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
- mDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR);
- mDevice->SetRenderState(D3DRS_TEXTUREFACTOR, color);
- mDevice->SetRenderState(D3DRS_MULTISAMPLEMASK, 0xFFFFFFFF);
-
- for (int i = 0; i < gl::MAX_VERTEX_ATTRIBS; i++)
- {
- mDevice->SetStreamSourceFreq(i, 1);
- }
-
- int renderTargetWidth = mStateManager.getRenderTargetWidth();
- int renderTargetHeight = mStateManager.getRenderTargetHeight();
-
- float quad[4][4]; // A quadrilateral covering the target, aligned to match the edges
- quad[0][0] = -0.5f;
- quad[0][1] = renderTargetHeight - 0.5f;
- quad[0][2] = 0.0f;
- quad[0][3] = 1.0f;
-
- quad[1][0] = renderTargetWidth - 0.5f;
- quad[1][1] = renderTargetHeight - 0.5f;
- quad[1][2] = 0.0f;
- quad[1][3] = 1.0f;
-
- quad[2][0] = -0.5f;
- quad[2][1] = -0.5f;
- quad[2][2] = 0.0f;
- quad[2][3] = 1.0f;
-
- quad[3][0] = renderTargetWidth - 0.5f;
- quad[3][1] = -0.5f;
- quad[3][2] = 0.0f;
- quad[3][3] = 1.0f;
-
- startScene();
- mDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, quad, sizeof(float[4]));
-
- if (clearParams.clearDepth)
- {
- mDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
- mDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
- mDevice->Clear(0, nullptr, D3DCLEAR_ZBUFFER, color, depth, stencil);
- }
-
- if (mMaskedClearSavedState != nullptr)
- {
- mMaskedClearSavedState->Apply();
- }
- }
- else if (clearColor || clearParams.clearDepth || clearParams.clearStencil)
- {
- DWORD dxClearFlags = 0;
- if (clearColor)
- {
- dxClearFlags |= D3DCLEAR_TARGET;
- }
- if (clearParams.clearDepth)
- {
- dxClearFlags |= D3DCLEAR_ZBUFFER;
- }
- if (clearParams.clearStencil)
- {
- dxClearFlags |= D3DCLEAR_STENCIL;
- }
-
- mDevice->Clear(0, nullptr, dxClearFlags, color, depth, stencil);
- }
-
- return gl::NoError();
-}
-
-void Renderer9::markAllStateDirty()
-{
- mAppliedRenderTargetSerial = 0;
- mAppliedDepthStencilSerial = 0;
- mDepthStencilInitialized = false;
- mRenderTargetDescInitialized = false;
-
- mStateManager.forceSetRasterState();
- mStateManager.forceSetDepthStencilState();
- mStateManager.forceSetBlendState();
- mStateManager.forceSetScissorState();
- mStateManager.forceSetViewportState();
-
- ASSERT(mCurVertexSamplerStates.size() == mCurVertexTextures.size());
- for (unsigned int i = 0; i < mCurVertexTextures.size(); i++)
- {
- mCurVertexSamplerStates[i].forceSet = true;
- mCurVertexTextures[i] = angle::DirtyPointer;
- }
-
- ASSERT(mCurPixelSamplerStates.size() == mCurPixelTextures.size());
- for (unsigned int i = 0; i < mCurPixelSamplerStates.size(); i++)
- {
- mCurPixelSamplerStates[i].forceSet = true;
- mCurPixelTextures[i] = angle::DirtyPointer;
- }
-
- mAppliedIBSerial = 0;
- mAppliedVertexShader = nullptr;
- mAppliedPixelShader = nullptr;
- mAppliedProgramSerial = 0;
- mStateManager.forceSetDXUniformsState();
-
- mVertexDeclarationCache.markStateDirty();
-}
-
-void Renderer9::releaseDeviceResources()
-{
- for (size_t i = 0; i < mEventQueryPool.size(); i++)
- {
- SafeRelease(mEventQueryPool[i]);
- }
- mEventQueryPool.clear();
-
- SafeRelease(mMaskedClearSavedState);
-
- mVertexShaderCache.clear();
- mPixelShaderCache.clear();
-
- SafeDelete(mBlit);
- SafeDelete(mVertexDataManager);
- SafeDelete(mIndexDataManager);
- SafeDelete(mLineLoopIB);
- SafeDelete(mCountingIB);
-
- for (int i = 0; i < NUM_NULL_COLORBUFFER_CACHE_ENTRIES; i++)
- {
- if (mNullColorbufferCache[i].buffer)
- {
- mNullColorbufferCache[i].buffer->detach(mDisplay->getProxyContext());
- }
- SafeDelete(mNullColorbufferCache[i].buffer);
- }
-}
-
-// set notify to true to broadcast a message to all contexts of the device loss
-bool Renderer9::testDeviceLost()
-{
- HRESULT status = getDeviceStatusCode();
- return FAILED(status);
-}
-
-HRESULT Renderer9::getDeviceStatusCode()
-{
- HRESULT status = D3D_OK;
-
- if (mDeviceEx)
- {
- status = mDeviceEx->CheckDeviceState(nullptr);
- }
- else if (mDevice)
- {
- status = mDevice->TestCooperativeLevel();
- }
-
- return status;
-}
-
-bool Renderer9::testDeviceResettable()
-{
- // On D3D9Ex, DEVICELOST represents a hung device that needs to be restarted
- // DEVICEREMOVED indicates the device has been stopped and must be recreated
- switch (getDeviceStatusCode())
- {
- case D3DERR_DEVICENOTRESET:
- case D3DERR_DEVICEHUNG:
- return true;
- case D3DERR_DEVICELOST:
- return (mDeviceEx != nullptr);
- case D3DERR_DEVICEREMOVED:
- ASSERT(mDeviceEx != nullptr);
- return isRemovedDeviceResettable();
- default:
- return false;
- }
-}
-
-bool Renderer9::resetDevice()
-{
- releaseDeviceResources();
-
- D3DPRESENT_PARAMETERS presentParameters = getDefaultPresentParameters();
-
- HRESULT result = D3D_OK;
- bool lost = testDeviceLost();
- bool removedDevice = (getDeviceStatusCode() == D3DERR_DEVICEREMOVED);
-
- // Device Removed is a feature which is only present with D3D9Ex
- ASSERT(mDeviceEx != nullptr || !removedDevice);
-
- for (int attempts = 3; lost && attempts > 0; attempts--)
- {
- if (removedDevice)
- {
- // Device removed, which may trigger on driver reinstallation,
- // may cause a longer wait other reset attempts before the
- // system is ready to handle creating a new device.
- Sleep(800);
- lost = !resetRemovedDevice();
- }
- else if (mDeviceEx)
- {
- Sleep(500); // Give the graphics driver some CPU time
- result = mDeviceEx->ResetEx(&presentParameters, nullptr);
- lost = testDeviceLost();
- }
- else
- {
- result = mDevice->TestCooperativeLevel();
- while (result == D3DERR_DEVICELOST)
- {
- Sleep(100); // Give the graphics driver some CPU time
- result = mDevice->TestCooperativeLevel();
- }
-
- if (result == D3DERR_DEVICENOTRESET)
- {
- result = mDevice->Reset(&presentParameters);
- }
- lost = testDeviceLost();
- }
- }
-
- if (FAILED(result))
- {
- ERR() << "Reset/ResetEx failed multiple times, " << gl::FmtHR(result);
- return false;
- }
-
- if (removedDevice && lost)
- {
- ERR() << "Device lost reset failed multiple times";
- return false;
- }
-
- // If the device was removed, we already finished re-initialization in resetRemovedDevice
- if (!removedDevice)
- {
- // reset device defaults
- if (initializeDevice().isError())
- {
- return false;
- }
- }
-
- return true;
-}
-
-bool Renderer9::isRemovedDeviceResettable() const
-{
- bool success = false;
-
-#if ANGLE_D3D9EX == ANGLE_ENABLED
- IDirect3D9Ex *d3d9Ex = nullptr;
- typedef HRESULT(WINAPI * Direct3DCreate9ExFunc)(UINT, IDirect3D9Ex **);
- Direct3DCreate9ExFunc Direct3DCreate9ExPtr =
- reinterpret_cast<Direct3DCreate9ExFunc>(GetProcAddress(mD3d9Module, "Direct3DCreate9Ex"));
-
- if (Direct3DCreate9ExPtr && SUCCEEDED(Direct3DCreate9ExPtr(D3D_SDK_VERSION, &d3d9Ex)))
- {
- D3DCAPS9 deviceCaps;
- HRESULT result = d3d9Ex->GetDeviceCaps(mAdapter, mDeviceType, &deviceCaps);
- success = SUCCEEDED(result);
- }
-
- SafeRelease(d3d9Ex);
-#else
- ASSERT(UNREACHABLE());
-#endif
-
- return success;
-}
-
-bool Renderer9::resetRemovedDevice()
-{
- // From http://msdn.microsoft.com/en-us/library/windows/desktop/bb172554(v=vs.85).aspx:
- // The hardware adapter has been removed. Application must destroy the device, do enumeration of
- // adapters and create another Direct3D device. If application continues rendering without
- // calling Reset, the rendering calls will succeed. Applies to Direct3D 9Ex only.
- release();
- return !initialize().isError();
-}
-
-VendorID Renderer9::getVendorId() const
-{
- return static_cast<VendorID>(mAdapterIdentifier.VendorId);
-}
-
-std::string Renderer9::getRendererDescription() const
-{
- std::ostringstream rendererString;
-
- rendererString << mAdapterIdentifier.Description;
- if (getShareHandleSupport())
- {
- rendererString << " Direct3D9Ex";
- }
- else
- {
- rendererString << " Direct3D9";
- }
-
- rendererString << " vs_" << D3DSHADER_VERSION_MAJOR(mDeviceCaps.VertexShaderVersion) << "_"
- << D3DSHADER_VERSION_MINOR(mDeviceCaps.VertexShaderVersion);
- rendererString << " ps_" << D3DSHADER_VERSION_MAJOR(mDeviceCaps.PixelShaderVersion) << "_"
- << D3DSHADER_VERSION_MINOR(mDeviceCaps.PixelShaderVersion);
-
- return rendererString.str();
-}
-
-DeviceIdentifier Renderer9::getAdapterIdentifier() const
-{
- DeviceIdentifier deviceIdentifier = {0};
- deviceIdentifier.VendorId = static_cast<UINT>(mAdapterIdentifier.VendorId);
- deviceIdentifier.DeviceId = static_cast<UINT>(mAdapterIdentifier.DeviceId);
- deviceIdentifier.SubSysId = static_cast<UINT>(mAdapterIdentifier.SubSysId);
- deviceIdentifier.Revision = static_cast<UINT>(mAdapterIdentifier.Revision);
- deviceIdentifier.FeatureLevel = 0;
-
- return deviceIdentifier;
-}
-
-unsigned int Renderer9::getReservedVertexUniformVectors() const
-{
- return d3d9_gl::GetReservedVertexUniformVectors();
-}
-
-unsigned int Renderer9::getReservedFragmentUniformVectors() const
-{
- return d3d9_gl::GetReservedFragmentUniformVectors();
-}
-
-bool Renderer9::getShareHandleSupport() const
-{
- // PIX doesn't seem to support using share handles, so disable them.
- return (mD3d9Ex != nullptr) && !gl::DebugAnnotationsActive();
-}
-
-int Renderer9::getMajorShaderModel() const
-{
- return D3DSHADER_VERSION_MAJOR(mDeviceCaps.PixelShaderVersion);
-}
-
-int Renderer9::getMinorShaderModel() const
-{
- return D3DSHADER_VERSION_MINOR(mDeviceCaps.PixelShaderVersion);
-}
-
-std::string Renderer9::getShaderModelSuffix() const
-{
- return "";
-}
-
-DWORD Renderer9::getCapsDeclTypes() const
-{
- return mDeviceCaps.DeclTypes;
-}
-
-D3DPOOL Renderer9::getBufferPool(DWORD usage) const
-{
- if (mD3d9Ex != nullptr)
- {
- return D3DPOOL_DEFAULT;
- }
- else
- {
- if (!(usage & D3DUSAGE_DYNAMIC))
- {
- return D3DPOOL_MANAGED;
- }
- }
-
- return D3DPOOL_DEFAULT;
-}
-
-gl::Error Renderer9::copyImage2D(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLint level)
-{
- RECT rect;
- rect.left = sourceRect.x;
- rect.top = sourceRect.y;
- rect.right = sourceRect.x + sourceRect.width;
- rect.bottom = sourceRect.y + sourceRect.height;
-
- return mBlit->copy2D(context, framebuffer, rect, destFormat, destOffset, storage, level);
-}
-
-gl::Error Renderer9::copyImageCube(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLenum target,
- GLint level)
-{
- RECT rect;
- rect.left = sourceRect.x;
- rect.top = sourceRect.y;
- rect.right = sourceRect.x + sourceRect.width;
- rect.bottom = sourceRect.y + sourceRect.height;
-
- return mBlit->copyCube(context, framebuffer, rect, destFormat, destOffset, storage, target,
- level);
-}
-
-gl::Error Renderer9::copyImage3D(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLint level)
-{
- // 3D textures are not available in the D3D9 backend.
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error Renderer9::copyImage2DArray(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLint level)
-{
- // 2D array textures are not available in the D3D9 backend.
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error Renderer9::copyTexture(const gl::Context *context,
- const gl::Texture *source,
- GLint sourceLevel,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLenum destTarget,
- GLint destLevel,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha)
-{
- RECT rect;
- rect.left = sourceRect.x;
- rect.top = sourceRect.y;
- rect.right = sourceRect.x + sourceRect.width;
- rect.bottom = sourceRect.y + sourceRect.height;
-
- return mBlit->copyTexture(context, source, sourceLevel, rect, destFormat, destOffset, storage,
- destTarget, destLevel, unpackFlipY, unpackPremultiplyAlpha,
- unpackUnmultiplyAlpha);
-}
-
-gl::Error Renderer9::copyCompressedTexture(const gl::Context *context,
- const gl::Texture *source,
- GLint sourceLevel,
- TextureStorage *storage,
- GLint destLevel)
-{
- UNIMPLEMENTED();
- return gl::InternalError();
-}
-
-gl::Error Renderer9::createRenderTarget(int width,
- int height,
- GLenum format,
- GLsizei samples,
- RenderTargetD3D **outRT)
-{
- const d3d9::TextureFormat &d3d9FormatInfo = d3d9::GetTextureFormatInfo(format);
-
- const gl::TextureCaps &textureCaps = getNativeTextureCaps().get(format);
- GLuint supportedSamples = textureCaps.getNearestSamples(samples);
-
- IDirect3DTexture9 *texture = nullptr;
- IDirect3DSurface9 *renderTarget = nullptr;
- if (width > 0 && height > 0)
- {
- bool requiresInitialization = false;
- HRESULT result = D3DERR_INVALIDCALL;
-
- const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(format);
- if (formatInfo.depthBits > 0 || formatInfo.stencilBits > 0)
- {
- result = mDevice->CreateDepthStencilSurface(
- width, height, d3d9FormatInfo.renderFormat,
- gl_d3d9::GetMultisampleType(supportedSamples), 0, FALSE, &renderTarget, nullptr);
- }
- else
- {
- requiresInitialization = (d3d9FormatInfo.dataInitializerFunction != nullptr);
- if (supportedSamples > 0)
- {
- result = mDevice->CreateRenderTarget(width, height, d3d9FormatInfo.renderFormat,
- gl_d3d9::GetMultisampleType(supportedSamples),
- 0, FALSE, &renderTarget, nullptr);
- }
- else
- {
- result = mDevice->CreateTexture(
- width, height, 1, D3DUSAGE_RENDERTARGET, d3d9FormatInfo.texFormat,
- getTexturePool(D3DUSAGE_RENDERTARGET), &texture, nullptr);
- if (!FAILED(result))
- {
- result = texture->GetSurfaceLevel(0, &renderTarget);
- }
- }
- }
-
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::OutOfMemory() << "Failed to create render target, " << gl::FmtHR(result);
- }
-
- if (requiresInitialization)
- {
- // This format requires that the data be initialized before the render target can be
- // used Unfortunately this requires a Get call on the d3d device but it is far better
- // than having to mark the render target as lockable and copy data to the gpu.
- IDirect3DSurface9 *prevRenderTarget = nullptr;
- mDevice->GetRenderTarget(0, &prevRenderTarget);
- mDevice->SetRenderTarget(0, renderTarget);
- mDevice->Clear(0, nullptr, D3DCLEAR_TARGET, D3DCOLOR_RGBA(0, 0, 0, 255), 0.0f, 0);
- mDevice->SetRenderTarget(0, prevRenderTarget);
- }
- }
-
- *outRT = new TextureRenderTarget9(texture, 0, renderTarget, format, width, height, 1,
- supportedSamples);
- return gl::NoError();
-}
-
-gl::Error Renderer9::createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT)
-{
- ASSERT(source != nullptr);
-
- RenderTargetD3D *newRT = nullptr;
- gl::Error error = createRenderTarget(source->getWidth(), source->getHeight(),
- source->getInternalFormat(), source->getSamples(), &newRT);
- if (error.isError())
- {
- return error;
- }
-
- RenderTarget9 *source9 = GetAs<RenderTarget9>(source);
- RenderTarget9 *dest9 = GetAs<RenderTarget9>(newRT);
-
- HRESULT result = mDevice->StretchRect(source9->getSurface(), nullptr, dest9->getSurface(),
- nullptr, D3DTEXF_NONE);
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::OutOfMemory() << "Failed to copy render target, " << gl::FmtHR(result);
- }
-
- *outRT = newRT;
- return gl::NoError();
-}
-
-gl::Error Renderer9::loadExecutable(const uint8_t *function,
- size_t length,
- gl::ShaderType type,
- const std::vector<D3DVarying> &streamOutVaryings,
- bool separatedOutputBuffers,
- ShaderExecutableD3D **outExecutable)
-{
- // Transform feedback is not supported in ES2 or D3D9
- ASSERT(streamOutVaryings.empty());
-
- switch (type)
- {
- case gl::SHADER_VERTEX:
- {
- IDirect3DVertexShader9 *vshader = nullptr;
- gl::Error error = createVertexShader((DWORD *)function, length, &vshader);
- if (error.isError())
- {
- return error;
- }
- *outExecutable = new ShaderExecutable9(function, length, vshader);
- }
- break;
- case gl::SHADER_FRAGMENT:
- {
- IDirect3DPixelShader9 *pshader = nullptr;
- gl::Error error = createPixelShader((DWORD *)function, length, &pshader);
- if (error.isError())
- {
- return error;
- }
- *outExecutable = new ShaderExecutable9(function, length, pshader);
- }
- break;
- default:
- UNREACHABLE();
- return gl::InternalError();
- }
-
- return gl::NoError();
-}
-
-gl::Error Renderer9::compileToExecutable(gl::InfoLog &infoLog,
- const std::string &shaderHLSL,
- gl::ShaderType type,
- const std::vector<D3DVarying> &streamOutVaryings,
- bool separatedOutputBuffers,
- const angle::CompilerWorkaroundsD3D &workarounds,
- ShaderExecutableD3D **outExectuable)
-{
- // Transform feedback is not supported in ES2 or D3D9
- ASSERT(streamOutVaryings.empty());
-
- std::stringstream profileStream;
-
- switch (type)
- {
- case gl::SHADER_VERTEX:
- profileStream << "vs";
- break;
- case gl::SHADER_FRAGMENT:
- profileStream << "ps";
- break;
- default:
- UNREACHABLE();
- return gl::InternalError();
- }
-
- profileStream << "_" << ((getMajorShaderModel() >= 3) ? 3 : 2);
- profileStream << "_"
- << "0";
-
- std::string profile = profileStream.str();
-
- UINT flags = ANGLE_COMPILE_OPTIMIZATION_LEVEL;
-
- if (workarounds.skipOptimization)
- {
- flags = D3DCOMPILE_SKIP_OPTIMIZATION;
- }
- else if (workarounds.useMaxOptimization)
- {
- flags = D3DCOMPILE_OPTIMIZATION_LEVEL3;
- }
-
- if (gl::DebugAnnotationsActive())
- {
-#ifndef NDEBUG
- flags = D3DCOMPILE_SKIP_OPTIMIZATION;
-#endif
-
- flags |= D3DCOMPILE_DEBUG;
- }
-
- // Sometimes D3DCompile will fail with the default compilation flags for complicated shaders
- // when it would otherwise pass with alternative options. Try the default flags first and if
- // compilation fails, try some alternatives.
- std::vector<CompileConfig> configs;
- configs.push_back(CompileConfig(flags, "default"));
- configs.push_back(CompileConfig(flags | D3DCOMPILE_AVOID_FLOW_CONTROL, "avoid flow control"));
- configs.push_back(CompileConfig(flags | D3DCOMPILE_PREFER_FLOW_CONTROL, "prefer flow control"));
-
- ID3DBlob *binary = nullptr;
- std::string debugInfo;
- gl::Error error = mCompiler.compileToBinary(infoLog, shaderHLSL, profile, configs, nullptr,
- &binary, &debugInfo);
- if (error.isError())
- {
- return error;
- }
-
- // It's possible that binary is NULL if the compiler failed in all configurations. Set the
- // executable to NULL and return GL_NO_ERROR to signify that there was a link error but the
- // internal state is still OK.
- if (!binary)
- {
- *outExectuable = nullptr;
- return gl::NoError();
- }
-
- error = loadExecutable(reinterpret_cast<const uint8_t *>(binary->GetBufferPointer()),
- binary->GetBufferSize(), type, streamOutVaryings, separatedOutputBuffers,
- outExectuable);
-
- SafeRelease(binary);
- if (error.isError())
- {
- return error;
- }
-
- if (!debugInfo.empty())
- {
- (*outExectuable)->appendDebugInfo(debugInfo);
- }
-
- return gl::NoError();
-}
-
-gl::Error Renderer9::ensureHLSLCompilerInitialized()
-{
- return mCompiler.ensureInitialized();
-}
-
-UniformStorageD3D *Renderer9::createUniformStorage(size_t storageSize)
-{
- return new UniformStorageD3D(storageSize);
-}
-
-gl::Error Renderer9::boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest)
-{
- return mBlit->boxFilter(source, dest);
-}
-
-D3DPOOL Renderer9::getTexturePool(DWORD usage) const
-{
- if (mD3d9Ex != nullptr)
- {
- return D3DPOOL_DEFAULT;
- }
- else
- {
- if (!(usage & (D3DUSAGE_DEPTHSTENCIL | D3DUSAGE_RENDERTARGET)))
- {
- return D3DPOOL_MANAGED;
- }
- }
-
- return D3DPOOL_DEFAULT;
-}
-
-gl::Error Renderer9::copyToRenderTarget(IDirect3DSurface9 *dest,
- IDirect3DSurface9 *source,
- bool fromManaged)
-{
- ASSERT(source && dest);
-
- HRESULT result = D3DERR_OUTOFVIDEOMEMORY;
-
- if (fromManaged)
- {
- D3DSURFACE_DESC desc;
- source->GetDesc(&desc);
-
- IDirect3DSurface9 *surf = 0;
- result = mDevice->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format,
- D3DPOOL_SYSTEMMEM, &surf, nullptr);
-
- if (SUCCEEDED(result))
- {
- ANGLE_TRY(Image9::copyLockableSurfaces(surf, source));
- result = mDevice->UpdateSurface(surf, nullptr, dest, nullptr);
- SafeRelease(surf);
- }
- }
- else
- {
- endScene();
- result = mDevice->StretchRect(source, nullptr, dest, nullptr, D3DTEXF_NONE);
- }
-
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::OutOfMemory() << "Failed to blit internal texture, " << gl::FmtHR(result);
- }
-
- return gl::NoError();
-}
-
-RendererClass Renderer9::getRendererClass() const
-{
- return RENDERER_D3D9;
-}
-
-ImageD3D *Renderer9::createImage()
-{
- return new Image9(this);
-}
-
-gl::Error Renderer9::generateMipmap(const gl::Context *context, ImageD3D *dest, ImageD3D *src)
-{
- Image9 *src9 = GetAs<Image9>(src);
- Image9 *dst9 = GetAs<Image9>(dest);
- return Image9::generateMipmap(dst9, src9);
-}
-
-gl::Error Renderer9::generateMipmapUsingD3D(const gl::Context *context,
- TextureStorage *storage,
- const gl::TextureState &textureState)
-{
- UNREACHABLE();
- return gl::NoError();
-}
-
-gl::Error Renderer9::copyImage(const gl::Context *context,
- ImageD3D *dest,
- ImageD3D *source,
- const gl::Rectangle &sourceRect,
- const gl::Offset &destOffset,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha)
-{
- Image9 *dest9 = GetAs<Image9>(dest);
- Image9 *src9 = GetAs<Image9>(source);
- return Image9::CopyImage(context, dest9, src9, sourceRect, destOffset, unpackFlipY,
- unpackPremultiplyAlpha, unpackUnmultiplyAlpha);
-}
-
-TextureStorage *Renderer9::createTextureStorage2D(SwapChainD3D *swapChain)
-{
- SwapChain9 *swapChain9 = GetAs<SwapChain9>(swapChain);
- return new TextureStorage9_2D(this, swapChain9);
-}
-
-TextureStorage *Renderer9::createTextureStorageEGLImage(EGLImageD3D *eglImage,
- RenderTargetD3D *renderTargetD3D)
-{
- return new TextureStorage9_EGLImage(this, eglImage, GetAs<RenderTarget9>(renderTargetD3D));
-}
-
-TextureStorage *Renderer9::createTextureStorageExternal(
- egl::Stream *stream,
- const egl::Stream::GLTextureDescription &desc)
-{
- UNIMPLEMENTED();
- return nullptr;
-}
-
-TextureStorage *Renderer9::createTextureStorage2D(GLenum internalformat,
- bool renderTarget,
- GLsizei width,
- GLsizei height,
- int levels,
- bool hintLevelZeroOnly)
-{
- return new TextureStorage9_2D(this, internalformat, renderTarget, width, height, levels);
-}
-
-TextureStorage *Renderer9::createTextureStorageCube(GLenum internalformat,
- bool renderTarget,
- int size,
- int levels,
- bool hintLevelZeroOnly)
-{
- return new TextureStorage9_Cube(this, internalformat, renderTarget, size, levels,
- hintLevelZeroOnly);
-}
-
-TextureStorage *Renderer9::createTextureStorage3D(GLenum internalformat,
- bool renderTarget,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- int levels)
-{
- // 3D textures are not supported by the D3D9 backend.
- UNREACHABLE();
-
- return nullptr;
-}
-
-TextureStorage *Renderer9::createTextureStorage2DArray(GLenum internalformat,
- bool renderTarget,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- int levels)
-{
- // 2D array textures are not supported by the D3D9 backend.
- UNREACHABLE();
-
- return nullptr;
-}
-
-TextureStorage *Renderer9::createTextureStorage2DMultisample(GLenum internalformat,
- GLsizei width,
- GLsizei height,
- int levels,
- int samples,
- bool fixedSampleLocations)
-{
- // 2D multisampled textures are not supported by the D3D9 backend.
- UNREACHABLE();
-
- return NULL;
-}
-
-bool Renderer9::getLUID(LUID *adapterLuid) const
-{
- adapterLuid->HighPart = 0;
- adapterLuid->LowPart = 0;
-
- if (mD3d9Ex)
- {
- mD3d9Ex->GetAdapterLUID(mAdapter, adapterLuid);
- return true;
- }
-
- return false;
-}
-
-VertexConversionType Renderer9::getVertexConversionType(gl::VertexFormatType vertexFormatType) const
-{
- return d3d9::GetVertexFormatInfo(getCapsDeclTypes(), vertexFormatType).conversionType;
-}
-
-GLenum Renderer9::getVertexComponentType(gl::VertexFormatType vertexFormatType) const
-{
- return d3d9::GetVertexFormatInfo(getCapsDeclTypes(), vertexFormatType).componentType;
-}
-
-gl::ErrorOrResult<unsigned int> Renderer9::getVertexSpaceRequired(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding,
- GLsizei count,
- GLsizei instances) const
-{
- if (!attrib.enabled)
- {
- return 16u;
- }
-
- gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib, GL_FLOAT);
- const d3d9::VertexFormat &d3d9VertexInfo =
- d3d9::GetVertexFormatInfo(getCapsDeclTypes(), vertexFormatType);
-
- unsigned int elementCount = 0;
- const unsigned int divisor = binding.getDivisor();
- if (instances == 0 || divisor == 0)
- {
- elementCount = static_cast<unsigned int>(count);
- }
- else
- {
- // Round up to divisor, if possible
- elementCount = UnsignedCeilDivide(static_cast<unsigned int>(instances), divisor);
- }
-
- if (d3d9VertexInfo.outputElementSize > std::numeric_limits<unsigned int>::max() / elementCount)
- {
- return gl::OutOfMemory() << "New vertex buffer size would result in an overflow.";
- }
-
- return static_cast<unsigned int>(d3d9VertexInfo.outputElementSize) * elementCount;
-}
-
-void Renderer9::generateCaps(gl::Caps *outCaps,
- gl::TextureCapsMap *outTextureCaps,
- gl::Extensions *outExtensions,
- gl::Limitations *outLimitations) const
-{
- d3d9_gl::GenerateCaps(mD3d9, mDevice, mDeviceType, mAdapter, outCaps, outTextureCaps,
- outExtensions, outLimitations);
-}
-
-angle::WorkaroundsD3D Renderer9::generateWorkarounds() const
-{
- return d3d9::GenerateWorkarounds();
-}
-
-egl::Error Renderer9::getEGLDevice(DeviceImpl **device)
-{
- if (mEGLDevice == nullptr)
- {
- ASSERT(mDevice != nullptr);
- mEGLDevice = new DeviceD3D();
- egl::Error error = mEGLDevice->initialize(reinterpret_cast<void *>(mDevice),
- EGL_D3D9_DEVICE_ANGLE, EGL_FALSE);
-
- if (error.isError())
- {
- SafeDelete(mEGLDevice);
- return error;
- }
- }
-
- *device = static_cast<DeviceImpl *>(mEGLDevice);
- return egl::NoError();
-}
-
-Renderer9::CurSamplerState::CurSamplerState()
- : forceSet(true), baseLevel(std::numeric_limits<size_t>::max()), samplerState()
-{
-}
-
-gl::Error Renderer9::genericDrawElements(const gl::Context *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei instances)
-{
- const auto &data = context->getContextState();
- gl::Program *program = context->getGLState().getProgram();
- ASSERT(program != nullptr);
- ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
- bool usesPointSize = programD3D->usesPointSize();
-
- programD3D->updateSamplerMapping();
-
- if (!applyPrimitiveType(mode, count, usesPointSize))
- {
- return gl::NoError();
- }
-
- ANGLE_TRY(updateState(context, mode));
- ANGLE_TRY(applyTextures(context));
- ANGLE_TRY(applyShaders(context, mode));
-
- if (!skipDraw(data.getState(), mode))
- {
- ANGLE_TRY(drawElementsImpl(context, mode, count, type, indices, instances));
- }
-
- return gl::NoError();
-}
-
-gl::Error Renderer9::genericDrawArrays(const gl::Context *context,
- GLenum mode,
- GLint first,
- GLsizei count,
- GLsizei instances)
-{
- gl::Program *program = context->getGLState().getProgram();
- ASSERT(program != nullptr);
- ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
- bool usesPointSize = programD3D->usesPointSize();
-
- programD3D->updateSamplerMapping();
-
- if (!applyPrimitiveType(mode, count, usesPointSize))
- {
- return gl::NoError();
- }
-
- ANGLE_TRY(updateState(context, mode));
- ANGLE_TRY(applyVertexBuffer(context, mode, first, count, instances, nullptr));
- ANGLE_TRY(applyTextures(context));
- ANGLE_TRY(applyShaders(context, mode));
-
- if (!skipDraw(context->getGLState(), mode))
- {
- ANGLE_TRY(drawArraysImpl(context, mode, first, count, instances));
- }
-
- return gl::NoError();
-}
-
-FramebufferImpl *Renderer9::createDefaultFramebuffer(const gl::FramebufferState &state)
-{
- return new Framebuffer9(state, this);
-}
-
-gl::Version Renderer9::getMaxSupportedESVersion() const
-{
- return gl::Version(2, 0);
-}
-
-gl::Error Renderer9::clearRenderTarget(RenderTargetD3D *renderTarget,
- const gl::ColorF &clearColorValue,
- const float clearDepthValue,
- const unsigned int clearStencilValue)
-{
- D3DCOLOR color =
- D3DCOLOR_ARGB(gl::unorm<8>(clearColorValue.alpha), gl::unorm<8>(clearColorValue.red),
- gl::unorm<8>(clearColorValue.green), gl::unorm<8>(clearColorValue.blue));
- float depth = clearDepthValue;
- DWORD stencil = clearStencilValue & 0x000000FF;
-
- unsigned int renderTargetSerial = renderTarget->getSerial();
- RenderTarget9 *renderTarget9 = GetAs<RenderTarget9>(renderTarget);
- IDirect3DSurface9 *renderTargetSurface = renderTarget9->getSurface();
- ASSERT(renderTargetSurface);
-
- DWORD dxClearFlags = 0;
-
- const gl::InternalFormat &internalFormatInfo =
- gl::GetSizedInternalFormatInfo(renderTarget->getInternalFormat());
- if (internalFormatInfo.depthBits > 0 || internalFormatInfo.stencilBits > 0)
- {
- dxClearFlags = D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL;
- if (mAppliedDepthStencilSerial != renderTargetSerial)
- {
- mDevice->SetDepthStencilSurface(renderTargetSurface);
- }
- }
- else
- {
- dxClearFlags = D3DCLEAR_TARGET;
- if (mAppliedRenderTargetSerial != renderTargetSerial)
- {
- mDevice->SetRenderTarget(0, renderTargetSurface);
- }
- }
- SafeRelease(renderTargetSurface);
-
- D3DVIEWPORT9 viewport;
- viewport.X = 0;
- viewport.Y = 0;
- viewport.Width = renderTarget->getWidth();
- viewport.Height = renderTarget->getHeight();
- mDevice->SetViewport(&viewport);
-
- mDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE);
-
- mDevice->Clear(0, nullptr, dxClearFlags, color, depth, stencil);
-
- markAllStateDirty();
-
- return gl::NoError();
-}
-
-bool Renderer9::canSelectViewInVertexShader() const
-{
- return false;
-}
-
-// For each Direct3D sampler of either the pixel or vertex stage,
-// looks up the corresponding OpenGL texture image unit and texture type,
-// and sets the texture and its addressing/filtering state (or NULL when inactive).
-// Sampler mapping needs to be up-to-date on the program object before this is called.
-gl::Error Renderer9::applyTextures(const gl::Context *context, gl::SamplerType shaderType)
-{
- const auto &glState = context->getGLState();
- const auto &caps = context->getCaps();
- ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
-
- ASSERT(!programD3D->isSamplerMappingDirty());
-
- // TODO(jmadill): Use the Program's sampler bindings.
- const auto &completeTextures = glState.getCompleteTextureCache();
-
- unsigned int samplerRange = programD3D->getUsedSamplerRange(shaderType);
- for (unsigned int samplerIndex = 0; samplerIndex < samplerRange; samplerIndex++)
- {
- GLint textureUnit = programD3D->getSamplerMapping(shaderType, samplerIndex, caps);
- ASSERT(textureUnit != -1);
- gl::Texture *texture = completeTextures[textureUnit];
-
- // A nullptr texture indicates incomplete.
- if (texture)
- {
- gl::Sampler *samplerObject = glState.getSampler(textureUnit);
-
- const gl::SamplerState &samplerState =
- samplerObject ? samplerObject->getSamplerState() : texture->getSamplerState();
-
- ANGLE_TRY(setSamplerState(context, shaderType, samplerIndex, texture, samplerState));
- ANGLE_TRY(setTexture(context, shaderType, samplerIndex, texture));
- }
- else
- {
- GLenum textureType = programD3D->getSamplerTextureType(shaderType, samplerIndex);
-
- // Texture is not sampler complete or it is in use by the framebuffer. Bind the
- // incomplete texture.
- gl::Texture *incompleteTexture = nullptr;
- ANGLE_TRY(getIncompleteTexture(context, textureType, &incompleteTexture));
- ANGLE_TRY(setSamplerState(context, shaderType, samplerIndex, incompleteTexture,
- incompleteTexture->getSamplerState()));
- ANGLE_TRY(setTexture(context, shaderType, samplerIndex, incompleteTexture));
- }
- }
-
- // Set all the remaining textures to NULL
- size_t samplerCount = (shaderType == gl::SAMPLER_PIXEL) ? caps.maxTextureImageUnits
- : caps.maxVertexTextureImageUnits;
-
- // TODO(jmadill): faster way?
- for (size_t samplerIndex = samplerRange; samplerIndex < samplerCount; samplerIndex++)
- {
- ANGLE_TRY(setTexture(context, shaderType, static_cast<int>(samplerIndex), nullptr));
- }
-
- return gl::NoError();
-}
-
-gl::Error Renderer9::applyTextures(const gl::Context *context)
-{
- ANGLE_TRY(applyTextures(context, gl::SAMPLER_VERTEX));
- ANGLE_TRY(applyTextures(context, gl::SAMPLER_PIXEL));
- return gl::NoError();
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.h
deleted file mode 100644
index 9ddee45f0f..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.h
+++ /dev/null
@@ -1,543 +0,0 @@
-//
-// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// Renderer9.h: Defines a back-end specific class for the D3D9 renderer.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_RENDERER9_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_RENDERER9_H_
-
-#include "common/angleutils.h"
-#include "common/mathutil.h"
-#include "libANGLE/renderer/d3d/HLSLCompiler.h"
-#include "libANGLE/renderer/d3d/RenderTargetD3D.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-#include "libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h"
-#include "libANGLE/renderer/d3d/d3d9/ShaderCache.h"
-#include "libANGLE/renderer/d3d/d3d9/StateManager9.h"
-#include "libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h"
-#include "libANGLE/renderer/driver_utils.h"
-
-namespace gl
-{
-class FramebufferAttachment;
-}
-
-namespace egl
-{
-class AttributeMap;
-}
-
-namespace rx
-{
-class Blit9;
-class Context9;
-class IndexDataManager;
-class ProgramD3D;
-class StreamingIndexBufferInterface;
-class StaticIndexBufferInterface;
-class VertexDataManager;
-struct ClearParameters;
-struct D3DUniform;
-struct TranslatedAttribute;
-
-enum D3D9InitError
-{
- D3D9_INIT_SUCCESS = 0,
- // Failed to load the D3D or ANGLE compiler
- D3D9_INIT_COMPILER_ERROR,
- // Failed to load a necessary DLL
- D3D9_INIT_MISSING_DEP,
- // Device creation error
- D3D9_INIT_CREATE_DEVICE_ERROR,
- // System does not meet minimum shader spec
- D3D9_INIT_UNSUPPORTED_VERSION,
- // System does not support stretchrect from textures
- D3D9_INIT_UNSUPPORTED_STRETCHRECT,
- // A call returned out of memory or device lost
- D3D9_INIT_OUT_OF_MEMORY,
- // Other unspecified error
- D3D9_INIT_OTHER_ERROR,
- NUM_D3D9_INIT_ERRORS
-};
-
-class Renderer9 : public RendererD3D
-{
- public:
- explicit Renderer9(egl::Display *display);
- ~Renderer9() override;
-
- egl::Error initialize() override;
- bool resetDevice() override;
-
- egl::ConfigSet generateConfigs() override;
- void generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const override;
-
- void startScene();
- void endScene();
-
- gl::Error flush();
- gl::Error finish();
-
- bool isValidNativeWindow(EGLNativeWindowType window) const override;
- NativeWindowD3D *createNativeWindow(EGLNativeWindowType window,
- const egl::Config *config,
- const egl::AttributeMap &attribs) const override;
-
- SwapChainD3D *createSwapChain(NativeWindowD3D *nativeWindow,
- HANDLE shareHandle,
- IUnknown *d3dTexture,
- GLenum backBufferFormat,
- GLenum depthBufferFormat,
- EGLint orientation,
- EGLint samples) override;
- egl::Error getD3DTextureInfo(const egl::Config *configuration,
- IUnknown *d3dTexture,
- EGLint *width,
- EGLint *height,
- GLenum *fboFormat) const override;
- egl::Error validateShareHandle(const egl::Config *config,
- HANDLE shareHandle,
- const egl::AttributeMap &attribs) const override;
-
- ContextImpl *createContext(const gl::ContextState &state) override;
-
- gl::Error allocateEventQuery(IDirect3DQuery9 **outQuery);
- void freeEventQuery(IDirect3DQuery9 *query);
-
- // resource creation
- gl::Error createVertexShader(const DWORD *function,
- size_t length,
- IDirect3DVertexShader9 **outShader);
- gl::Error createPixelShader(const DWORD *function,
- size_t length,
- IDirect3DPixelShader9 **outShader);
- HRESULT createVertexBuffer(UINT Length, DWORD Usage, IDirect3DVertexBuffer9 **ppVertexBuffer);
- HRESULT createIndexBuffer(UINT Length,
- DWORD Usage,
- D3DFORMAT Format,
- IDirect3DIndexBuffer9 **ppIndexBuffer);
- gl::Error setSamplerState(const gl::Context *context,
- gl::SamplerType type,
- int index,
- gl::Texture *texture,
- const gl::SamplerState &sampler);
- gl::Error setTexture(const gl::Context *context,
- gl::SamplerType type,
- int index,
- gl::Texture *texture);
-
- gl::Error updateState(const gl::Context *context, GLenum drawMode);
-
- void setScissorRectangle(const gl::Rectangle &scissor, bool enabled);
- void setViewport(const gl::Rectangle &viewport,
- float zNear,
- float zFar,
- GLenum drawMode,
- GLenum frontFace,
- bool ignoreViewport);
-
- gl::Error applyRenderTarget(const gl::Context *context, const gl::Framebuffer *frameBuffer);
- gl::Error applyRenderTarget(const gl::Context *context,
- const gl::FramebufferAttachment *colorAttachment,
- const gl::FramebufferAttachment *depthStencilAttachment);
- gl::Error applyUniforms(ProgramD3D *programD3D);
- bool applyPrimitiveType(GLenum primitiveType, GLsizei elementCount, bool usesPointSize);
- gl::Error applyVertexBuffer(const gl::Context *context,
- GLenum mode,
- GLint first,
- GLsizei count,
- GLsizei instances,
- TranslatedIndexData *indexInfo);
- gl::Error applyIndexBuffer(const gl::Context *context,
- const void *indices,
- GLsizei count,
- GLenum mode,
- GLenum type,
- TranslatedIndexData *indexInfo);
-
- gl::Error clear(const gl::Context *context,
- const ClearParameters &clearParams,
- const gl::FramebufferAttachment *colorBuffer,
- const gl::FramebufferAttachment *depthStencilBuffer);
-
- void markAllStateDirty();
-
- // lost device
- bool testDeviceLost() override;
- bool testDeviceResettable() override;
-
- VendorID getVendorId() const;
- std::string getRendererDescription() const;
- DeviceIdentifier getAdapterIdentifier() const override;
-
- IDirect3DDevice9 *getDevice() { return mDevice; }
- void *getD3DDevice() override;
-
- unsigned int getReservedVertexUniformVectors() const;
- unsigned int getReservedFragmentUniformVectors() const;
-
- bool getShareHandleSupport() const;
-
- int getMajorShaderModel() const override;
- int getMinorShaderModel() const override;
- std::string getShaderModelSuffix() const override;
-
- DWORD getCapsDeclTypes() const;
-
- // Pixel operations
- gl::Error copyImage2D(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLint level) override;
- gl::Error copyImageCube(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLenum target,
- GLint level) override;
- gl::Error copyImage3D(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLint level) override;
- gl::Error copyImage2DArray(const gl::Context *context,
- const gl::Framebuffer *framebuffer,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLint level) override;
-
- gl::Error copyTexture(const gl::Context *context,
- const gl::Texture *source,
- GLint sourceLevel,
- const gl::Rectangle &sourceRect,
- GLenum destFormat,
- const gl::Offset &destOffset,
- TextureStorage *storage,
- GLenum destTarget,
- GLint destLevel,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha) override;
- gl::Error copyCompressedTexture(const gl::Context *context,
- const gl::Texture *source,
- GLint sourceLevel,
- TextureStorage *storage,
- GLint destLevel) override;
-
- // RenderTarget creation
- gl::Error createRenderTarget(int width,
- int height,
- GLenum format,
- GLsizei samples,
- RenderTargetD3D **outRT) override;
- gl::Error createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) override;
-
- // Shader operations
- gl::Error loadExecutable(const uint8_t *function,
- size_t length,
- gl::ShaderType type,
- const std::vector<D3DVarying> &streamOutVaryings,
- bool separatedOutputBuffers,
- ShaderExecutableD3D **outExecutable) override;
- gl::Error compileToExecutable(gl::InfoLog &infoLog,
- const std::string &shaderHLSL,
- gl::ShaderType type,
- const std::vector<D3DVarying> &streamOutVaryings,
- bool separatedOutputBuffers,
- const angle::CompilerWorkaroundsD3D &workarounds,
- ShaderExecutableD3D **outExectuable) override;
- gl::Error ensureHLSLCompilerInitialized() override;
-
- UniformStorageD3D *createUniformStorage(size_t storageSize) override;
-
- // Image operations
- ImageD3D *createImage() override;
- gl::Error generateMipmap(const gl::Context *context, ImageD3D *dest, ImageD3D *source) override;
- gl::Error generateMipmapUsingD3D(const gl::Context *context,
- TextureStorage *storage,
- const gl::TextureState &textureState) override;
- gl::Error copyImage(const gl::Context *context,
- ImageD3D *dest,
- ImageD3D *source,
- const gl::Rectangle &sourceRect,
- const gl::Offset &destOffset,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha) override;
- TextureStorage *createTextureStorage2D(SwapChainD3D *swapChain) override;
- TextureStorage *createTextureStorageEGLImage(EGLImageD3D *eglImage,
- RenderTargetD3D *renderTargetD3D) override;
- TextureStorage *createTextureStorageExternal(
- egl::Stream *stream,
- const egl::Stream::GLTextureDescription &desc) override;
- TextureStorage *createTextureStorage2D(GLenum internalformat,
- bool renderTarget,
- GLsizei width,
- GLsizei height,
- int levels,
- bool hintLevelZeroOnly) override;
- TextureStorage *createTextureStorageCube(GLenum internalformat,
- bool renderTarget,
- int size,
- int levels,
- bool hintLevelZeroOnly) override;
- TextureStorage *createTextureStorage3D(GLenum internalformat,
- bool renderTarget,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- int levels) override;
- TextureStorage *createTextureStorage2DArray(GLenum internalformat,
- bool renderTarget,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- int levels) override;
-
- TextureStorage *createTextureStorage2DMultisample(GLenum internalformat,
- GLsizei width,
- GLsizei height,
- int levels,
- int samples,
- bool fixedSampleLocations) override;
-
- // Buffer creation
- VertexBuffer *createVertexBuffer() override;
- IndexBuffer *createIndexBuffer() override;
-
- // Stream Creation
- StreamProducerImpl *createStreamProducerD3DTextureNV12(
- egl::Stream::ConsumerType consumerType,
- const egl::AttributeMap &attribs) override;
-
- // Buffer-to-texture and Texture-to-buffer copies
- bool supportsFastCopyBufferToTexture(GLenum internalFormat) const override;
- gl::Error fastCopyBufferToTexture(const gl::Context *context,
- const gl::PixelUnpackState &unpack,
- unsigned int offset,
- RenderTargetD3D *destRenderTarget,
- GLenum destinationFormat,
- GLenum sourcePixelsType,
- const gl::Box &destArea) override;
-
- // D3D9-renderer specific methods
- gl::Error boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest);
-
- D3DPOOL getTexturePool(DWORD usage) const;
-
- bool getLUID(LUID *adapterLuid) const override;
- VertexConversionType getVertexConversionType(
- gl::VertexFormatType vertexFormatType) const override;
- GLenum getVertexComponentType(gl::VertexFormatType vertexFormatType) const override;
-
- // Warning: you should ensure binding really matches attrib.bindingIndex before using this
- // function.
- gl::ErrorOrResult<unsigned int> getVertexSpaceRequired(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding,
- GLsizei count,
- GLsizei instances) const override;
-
- gl::Error copyToRenderTarget(IDirect3DSurface9 *dest,
- IDirect3DSurface9 *source,
- bool fromManaged);
-
- RendererClass getRendererClass() const override;
-
- D3DDEVTYPE getD3D9DeviceType() const { return mDeviceType; }
-
- egl::Error getEGLDevice(DeviceImpl **device) override;
-
- StateManager9 *getStateManager() { return &mStateManager; }
-
- gl::Error genericDrawArrays(const gl::Context *context,
- GLenum mode,
- GLint first,
- GLsizei count,
- GLsizei instances);
-
- gl::Error genericDrawElements(const gl::Context *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei instances);
-
- // Necessary hack for default framebuffers in D3D.
- FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override;
-
- DebugAnnotator9 *getAnnotator() { return &mAnnotator; }
-
- gl::Version getMaxSupportedESVersion() const override;
-
- gl::Error clearRenderTarget(RenderTargetD3D *renderTarget,
- const gl::ColorF &clearColorValue,
- const float clearDepthValue,
- const unsigned int clearStencilValue) override;
-
- bool canSelectViewInVertexShader() const override;
-
- private:
- gl::Error drawArraysImpl(const gl::Context *context,
- GLenum mode,
- GLint startVertex,
- GLsizei count,
- GLsizei instances);
- gl::Error drawElementsImpl(const gl::Context *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei instances);
-
- gl::Error applyShaders(const gl::Context *context, GLenum drawMode);
-
- gl::Error applyTextures(const gl::Context *context);
- gl::Error applyTextures(const gl::Context *context, gl::SamplerType shaderType);
-
- void generateCaps(gl::Caps *outCaps,
- gl::TextureCapsMap *outTextureCaps,
- gl::Extensions *outExtensions,
- gl::Limitations *outLimitations) const override;
-
- angle::WorkaroundsD3D generateWorkarounds() const override;
-
- gl::Error setBlendDepthRasterStates(const gl::Context *context, GLenum drawMode);
-
- void release();
-
- void applyUniformnfv(const D3DUniform *targetUniform, const GLfloat *v);
- void applyUniformniv(const D3DUniform *targetUniform, const GLint *v);
- void applyUniformnbv(const D3DUniform *targetUniform, const GLint *v);
-
- gl::Error drawLineLoop(const gl::Context *context,
- GLsizei count,
- GLenum type,
- const void *indices,
- int minIndex,
- gl::Buffer *elementArrayBuffer);
- gl::Error drawIndexedPoints(const gl::Context *context,
- GLsizei count,
- GLenum type,
- const void *indices,
- int minIndex,
- gl::Buffer *elementArrayBuffer);
-
- gl::Error getCountingIB(size_t count, StaticIndexBufferInterface **outIB);
-
- gl::Error getNullColorbuffer(const gl::Context *context,
- const gl::FramebufferAttachment *depthbuffer,
- const gl::FramebufferAttachment **outColorBuffer);
-
- D3DPOOL getBufferPool(DWORD usage) const;
-
- HMODULE mD3d9Module;
-
- egl::Error initializeDevice();
- D3DPRESENT_PARAMETERS getDefaultPresentParameters();
- void releaseDeviceResources();
-
- HRESULT getDeviceStatusCode();
- bool isRemovedDeviceResettable() const;
- bool resetRemovedDevice();
-
- UINT mAdapter;
- D3DDEVTYPE mDeviceType;
- IDirect3D9 *mD3d9; // Always valid after successful initialization.
- IDirect3D9Ex *mD3d9Ex; // Might be null if D3D9Ex is not supported.
- IDirect3DDevice9 *mDevice;
- IDirect3DDevice9Ex *mDeviceEx; // Might be null if D3D9Ex is not supported.
-
- HLSLCompiler mCompiler;
-
- Blit9 *mBlit;
-
- HWND mDeviceWindow;
-
- D3DCAPS9 mDeviceCaps;
- D3DADAPTER_IDENTIFIER9 mAdapterIdentifier;
-
- D3DPRIMITIVETYPE mPrimitiveType;
- int mPrimitiveCount;
- GLsizei mRepeatDraw;
-
- bool mSceneStarted;
-
- bool mVertexTextureSupport;
-
- // current render target states
- unsigned int mAppliedRenderTargetSerial;
- unsigned int mAppliedDepthStencilSerial;
- bool mDepthStencilInitialized;
- bool mRenderTargetDescInitialized;
-
- IDirect3DStateBlock9 *mMaskedClearSavedState;
-
- StateManager9 mStateManager;
-
- // Currently applied sampler states
- struct CurSamplerState
- {
- CurSamplerState();
-
- bool forceSet;
- size_t baseLevel;
- gl::SamplerState samplerState;
- };
- std::vector<CurSamplerState> mCurVertexSamplerStates;
- std::vector<CurSamplerState> mCurPixelSamplerStates;
-
- // Currently applied textures
- std::vector<uintptr_t> mCurVertexTextures;
- std::vector<uintptr_t> mCurPixelTextures;
-
- unsigned int mAppliedIBSerial;
- IDirect3DVertexShader9 *mAppliedVertexShader;
- IDirect3DPixelShader9 *mAppliedPixelShader;
- unsigned int mAppliedProgramSerial;
-
- // A pool of event queries that are currently unused.
- std::vector<IDirect3DQuery9 *> mEventQueryPool;
- VertexShaderCache mVertexShaderCache;
- PixelShaderCache mPixelShaderCache;
-
- VertexDataManager *mVertexDataManager;
- VertexDeclarationCache mVertexDeclarationCache;
-
- IndexDataManager *mIndexDataManager;
- StreamingIndexBufferInterface *mLineLoopIB;
- StaticIndexBufferInterface *mCountingIB;
-
- enum
- {
- NUM_NULL_COLORBUFFER_CACHE_ENTRIES = 12
- };
- struct NullColorbufferCacheEntry
- {
- UINT lruCount;
- int width;
- int height;
- gl::FramebufferAttachment *buffer;
- } mNullColorbufferCache[NUM_NULL_COLORBUFFER_CACHE_ENTRIES];
- UINT mMaxNullColorbufferLRU;
-
- DeviceD3D *mEGLDevice;
- std::vector<TranslatedAttribute> mTranslatedAttribCache;
-
- DebugAnnotator9 mAnnotator;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_RENDERER9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderCache.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderCache.h
deleted file mode 100644
index 399770dd8d..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderCache.h
+++ /dev/null
@@ -1,106 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ShaderCache: Defines rx::ShaderCache, a cache of Direct3D shader objects
-// keyed by their byte code.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_SHADERCACHE_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_SHADERCACHE_H_
-
-#include "libANGLE/Error.h"
-
-#include "common/debug.h"
-
-#include <cstddef>
-#include <unordered_map>
-#include <string>
-
-namespace rx
-{
-template <typename ShaderObject>
-class ShaderCache : angle::NonCopyable
-{
- public:
- ShaderCache() : mDevice(nullptr) {}
-
- ~ShaderCache()
- {
- // Call clear while the device is still valid.
- ASSERT(mMap.empty());
- }
-
- void initialize(IDirect3DDevice9* device)
- {
- mDevice = device;
- }
-
- gl::Error create(const DWORD *function, size_t length, ShaderObject **outShaderObject)
- {
- std::string key(reinterpret_cast<const char*>(function), length);
- typename Map::iterator it = mMap.find(key);
- if (it != mMap.end())
- {
- it->second->AddRef();
- *outShaderObject = it->second;
- return gl::NoError();
- }
-
- ShaderObject *shader;
- HRESULT result = createShader(function, &shader);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to create shader, " << gl::FmtHR(result);
- }
-
- // Random eviction policy.
- if (mMap.size() >= kMaxMapSize)
- {
- SafeRelease(mMap.begin()->second);
- mMap.erase(mMap.begin());
- }
-
- shader->AddRef();
- mMap[key] = shader;
-
- *outShaderObject = shader;
- return gl::NoError();
- }
-
- void clear()
- {
- for (typename Map::iterator it = mMap.begin(); it != mMap.end(); ++it)
- {
- SafeRelease(it->second);
- }
-
- mMap.clear();
- }
-
- private:
- const static size_t kMaxMapSize = 100;
-
- HRESULT createShader(const DWORD *function, IDirect3DVertexShader9 **shader)
- {
- return mDevice->CreateVertexShader(function, shader);
- }
-
- HRESULT createShader(const DWORD *function, IDirect3DPixelShader9 **shader)
- {
- return mDevice->CreatePixelShader(function, shader);
- }
-
- typedef std::unordered_map<std::string, ShaderObject*> Map;
- Map mMap;
-
- IDirect3DDevice9 *mDevice;
-};
-
-typedef ShaderCache<IDirect3DVertexShader9> VertexShaderCache;
-typedef ShaderCache<IDirect3DPixelShader9> PixelShaderCache;
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_SHADERCACHE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.cpp
deleted file mode 100644
index 362c6c60a3..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-//
-// Copyright (c) 2012-2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ShaderExecutable9.cpp: Implements a D3D9-specific class to contain shader
-// executable implementation details.
-
-#include "libANGLE/renderer/d3d/d3d9/ShaderExecutable9.h"
-
-#include "common/debug.h"
-
-namespace rx
-{
-
-ShaderExecutable9::ShaderExecutable9(const void *function, size_t length, IDirect3DPixelShader9 *executable)
- : ShaderExecutableD3D(function, length)
-{
- mPixelExecutable = executable;
- mVertexExecutable = nullptr;
-}
-
-ShaderExecutable9::ShaderExecutable9(const void *function, size_t length, IDirect3DVertexShader9 *executable)
- : ShaderExecutableD3D(function, length)
-{
- mVertexExecutable = executable;
- mPixelExecutable = nullptr;
-}
-
-ShaderExecutable9::~ShaderExecutable9()
-{
- SafeRelease(mVertexExecutable);
- SafeRelease(mPixelExecutable);
-}
-
-IDirect3DVertexShader9 *ShaderExecutable9::getVertexShader() const
-{
- return mVertexExecutable;
-}
-
-IDirect3DPixelShader9 *ShaderExecutable9::getPixelShader() const
-{
- return mPixelExecutable;
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.h
deleted file mode 100644
index 0b6b87947e..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.h
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// Copyright (c) 2012-2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// ShaderExecutable9.h: Defines a D3D9-specific class to contain shader
-// executable implementation details.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_SHADEREXECUTABLE9_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_SHADEREXECUTABLE9_H_
-
-#include "libANGLE/renderer/d3d/ShaderExecutableD3D.h"
-
-namespace rx
-{
-
-class ShaderExecutable9 : public ShaderExecutableD3D
-{
- public:
- ShaderExecutable9(const void *function, size_t length, IDirect3DPixelShader9 *executable);
- ShaderExecutable9(const void *function, size_t length, IDirect3DVertexShader9 *executable);
- ~ShaderExecutable9() override;
-
- IDirect3DPixelShader9 *getPixelShader() const;
- IDirect3DVertexShader9 *getVertexShader() const;
-
- private:
- IDirect3DPixelShader9 *mPixelExecutable;
- IDirect3DVertexShader9 *mVertexExecutable;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_SHADEREXECUTABLE9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.cpp
deleted file mode 100644
index a3bdc14efb..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.cpp
+++ /dev/null
@@ -1,945 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// StateManager9.cpp: Defines a class for caching D3D9 state
-#include "libANGLE/renderer/d3d/d3d9/StateManager9.h"
-
-#include "common/bitset_utils.h"
-#include "common/utilities.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h"
-#include "libANGLE/renderer/d3d/d3d9/Framebuffer9.h"
-#include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
-
-namespace rx
-{
-
-StateManager9::StateManager9(Renderer9 *renderer9)
- : mUsingZeroColorMaskWorkaround(false),
- mCurBlendState(),
- mCurBlendColor(0, 0, 0, 0),
- mCurSampleMask(0),
- mCurRasterState(),
- mCurDepthSize(0),
- mCurDepthStencilState(),
- mCurStencilRef(0),
- mCurStencilBackRef(0),
- mCurFrontFaceCCW(0),
- mCurStencilSize(0),
- mCurScissorRect(),
- mCurScissorEnabled(false),
- mCurViewport(),
- mCurNear(0.0f),
- mCurFar(0.0f),
- mCurDepthFront(0.0f),
- mCurIgnoreViewport(false),
- mRenderer9(renderer9),
- mDirtyBits()
-{
- mBlendStateDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
- mBlendStateDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
- mBlendStateDirtyBits.set(DIRTY_BIT_BLEND_FUNCS_EQUATIONS);
- mBlendStateDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE);
- mBlendStateDirtyBits.set(DIRTY_BIT_COLOR_MASK);
- mBlendStateDirtyBits.set(DIRTY_BIT_DITHER);
- mBlendStateDirtyBits.set(DIRTY_BIT_SAMPLE_MASK);
-
- mRasterizerStateDirtyBits.set(DIRTY_BIT_CULL_MODE);
- mRasterizerStateDirtyBits.set(DIRTY_BIT_DEPTH_BIAS);
-
- mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_DEPTH_MASK);
- mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_DEPTH_FUNC);
- mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_TEST_ENABLED);
- mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
- mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK);
- mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
- mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
- mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT);
- mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK);
-
- mScissorStateDirtyBits.set(DIRTY_BIT_SCISSOR_ENABLED);
- mScissorStateDirtyBits.set(DIRTY_BIT_SCISSOR_RECT);
-}
-
-StateManager9::~StateManager9()
-{
-}
-
-void StateManager9::initialize()
-{
- mUsingZeroColorMaskWorkaround = IsAMD(mRenderer9->getVendorId());
-}
-
-void StateManager9::forceSetBlendState()
-{
- mDirtyBits |= mBlendStateDirtyBits;
-}
-
-void StateManager9::forceSetRasterState()
-{
- mDirtyBits |= mRasterizerStateDirtyBits;
-}
-
-void StateManager9::forceSetDepthStencilState()
-{
- mDirtyBits |= mDepthStencilStateDirtyBits;
-}
-
-void StateManager9::forceSetScissorState()
-{
- mDirtyBits |= mScissorStateDirtyBits;
-}
-
-void StateManager9::forceSetViewportState()
-{
- mForceSetViewport = true;
-}
-
-void StateManager9::forceSetDXUniformsState()
-{
- mDxUniformsDirty = true;
-}
-
-void StateManager9::updateStencilSizeIfChanged(bool depthStencilInitialized,
- unsigned int stencilSize)
-{
- if (!depthStencilInitialized || stencilSize != mCurStencilSize)
- {
- mCurStencilSize = stencilSize;
- forceSetDepthStencilState();
- }
-}
-
-void StateManager9::syncState(const gl::State &state, const gl::State::DirtyBits &dirtyBits)
-{
- if (!dirtyBits.any())
- {
- return;
- }
-
- for (auto dirtyBit : dirtyBits)
- {
- switch (dirtyBit)
- {
- case gl::State::DIRTY_BIT_BLEND_ENABLED:
- if (state.getBlendState().blend != mCurBlendState.blend)
- {
- mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
- // BlendColor and funcs and equations has to be set if blend is enabled
- mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
- mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS_EQUATIONS);
-
- // The color mask may have to be updated if the blend state changes
- if (mUsingZeroColorMaskWorkaround)
- {
- mDirtyBits.set(DIRTY_BIT_COLOR_MASK);
- }
- }
- break;
- case gl::State::DIRTY_BIT_BLEND_FUNCS:
- {
- const gl::BlendState &blendState = state.getBlendState();
- if (blendState.sourceBlendRGB != mCurBlendState.sourceBlendRGB ||
- blendState.destBlendRGB != mCurBlendState.destBlendRGB ||
- blendState.sourceBlendAlpha != mCurBlendState.sourceBlendAlpha ||
- blendState.destBlendAlpha != mCurBlendState.destBlendAlpha)
- {
- mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS_EQUATIONS);
- // BlendColor depends on the values of blend funcs
- mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
-
- // The color mask may have to be updated if the blend funcs change
- if (mUsingZeroColorMaskWorkaround)
- {
- mDirtyBits.set(DIRTY_BIT_COLOR_MASK);
- }
- }
- break;
- }
- case gl::State::DIRTY_BIT_BLEND_EQUATIONS:
- {
- const gl::BlendState &blendState = state.getBlendState();
- if (blendState.blendEquationRGB != mCurBlendState.blendEquationRGB ||
- blendState.blendEquationAlpha != mCurBlendState.blendEquationAlpha)
- {
- mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS_EQUATIONS);
-
- // The color mask may have to be updated if the blend funcs change
- if (mUsingZeroColorMaskWorkaround)
- {
- mDirtyBits.set(DIRTY_BIT_COLOR_MASK);
- }
- }
- break;
- }
- case gl::State::DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED:
- if (state.getBlendState().sampleAlphaToCoverage !=
- mCurBlendState.sampleAlphaToCoverage)
- {
- mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE);
- }
- break;
- case gl::State::DIRTY_BIT_COLOR_MASK:
- {
- const gl::BlendState &blendState = state.getBlendState();
- if (blendState.colorMaskRed != mCurBlendState.colorMaskRed ||
- blendState.colorMaskGreen != mCurBlendState.colorMaskGreen ||
- blendState.colorMaskBlue != mCurBlendState.colorMaskBlue ||
- blendState.colorMaskAlpha != mCurBlendState.colorMaskAlpha)
- {
- mDirtyBits.set(DIRTY_BIT_COLOR_MASK);
-
- // The color mask can cause the blend state to get out of sync when using the
- // zero color mask workaround
- if (mUsingZeroColorMaskWorkaround)
- {
- mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
- mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS_EQUATIONS);
- }
- }
- break;
- }
- case gl::State::DIRTY_BIT_DITHER_ENABLED:
- if (state.getBlendState().dither != mCurBlendState.dither)
- {
- mDirtyBits.set(DIRTY_BIT_DITHER);
- }
- break;
- case gl::State::DIRTY_BIT_BLEND_COLOR:
- if (state.getBlendColor() != mCurBlendColor)
- {
- mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
- }
- break;
- case gl::State::DIRTY_BIT_CULL_FACE_ENABLED:
- if (state.getRasterizerState().cullFace != mCurRasterState.cullFace)
- {
- mDirtyBits.set(DIRTY_BIT_CULL_MODE);
- }
- break;
- case gl::State::DIRTY_BIT_CULL_FACE:
- if (state.getRasterizerState().cullMode != mCurRasterState.cullMode)
- {
- mDirtyBits.set(DIRTY_BIT_CULL_MODE);
- }
- break;
- case gl::State::DIRTY_BIT_FRONT_FACE:
- if (state.getRasterizerState().frontFace != mCurRasterState.frontFace)
- {
- mDirtyBits.set(DIRTY_BIT_CULL_MODE);
-
- // Viewport state depends on rasterizer.frontface
- mDirtyBits.set(DIRTY_BIT_VIEWPORT);
- }
- break;
- case gl::State::DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED:
- if (state.getRasterizerState().polygonOffsetFill !=
- mCurRasterState.polygonOffsetFill)
- {
- mDirtyBits.set(DIRTY_BIT_DEPTH_BIAS);
- }
- break;
- case gl::State::DIRTY_BIT_POLYGON_OFFSET:
- {
- const gl::RasterizerState &rasterizerState = state.getRasterizerState();
- if (rasterizerState.polygonOffsetFactor != mCurRasterState.polygonOffsetFactor ||
- rasterizerState.polygonOffsetUnits != mCurRasterState.polygonOffsetUnits)
- {
- mDirtyBits.set(DIRTY_BIT_DEPTH_BIAS);
- }
- }
- case gl::State::DIRTY_BIT_DEPTH_MASK:
- if (state.getDepthStencilState().depthMask != mCurDepthStencilState.depthMask)
- {
- mDirtyBits.set(DIRTY_BIT_STENCIL_DEPTH_MASK);
- }
- break;
- case gl::State::DIRTY_BIT_DEPTH_TEST_ENABLED:
- if (state.getDepthStencilState().depthTest != mCurDepthStencilState.depthTest)
- {
- mDirtyBits.set(DIRTY_BIT_STENCIL_DEPTH_FUNC);
- }
- break;
- case gl::State::DIRTY_BIT_DEPTH_FUNC:
- if (state.getDepthStencilState().depthFunc != mCurDepthStencilState.depthFunc)
- {
- mDirtyBits.set(DIRTY_BIT_STENCIL_DEPTH_FUNC);
- }
- break;
- case gl::State::DIRTY_BIT_STENCIL_TEST_ENABLED:
- if (state.getDepthStencilState().stencilTest != mCurDepthStencilState.stencilTest)
- {
- mDirtyBits.set(DIRTY_BIT_STENCIL_TEST_ENABLED);
- // If we enable the stencil test, all of these must be set
- mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
- mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
- mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
- mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK);
- mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT);
- mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK);
- }
- break;
- case gl::State::DIRTY_BIT_STENCIL_FUNCS_FRONT:
- {
- const gl::DepthStencilState &depthStencilState = state.getDepthStencilState();
- if (depthStencilState.stencilFunc != mCurDepthStencilState.stencilFunc ||
- depthStencilState.stencilMask != mCurDepthStencilState.stencilMask ||
- state.getStencilRef() != mCurStencilRef)
- {
- mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
- }
- break;
- }
- case gl::State::DIRTY_BIT_STENCIL_FUNCS_BACK:
- {
- const gl::DepthStencilState &depthStencilState = state.getDepthStencilState();
- if (depthStencilState.stencilBackFunc != mCurDepthStencilState.stencilBackFunc ||
- depthStencilState.stencilBackMask != mCurDepthStencilState.stencilBackMask ||
- state.getStencilBackRef() != mCurStencilBackRef)
- {
- mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK);
- }
- break;
- }
- case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT:
- if (state.getDepthStencilState().stencilWritemask !=
- mCurDepthStencilState.stencilWritemask)
- {
- mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
- }
- break;
- case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_BACK:
- if (state.getDepthStencilState().stencilBackWritemask !=
- mCurDepthStencilState.stencilBackWritemask)
- {
- mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
- }
- break;
- case gl::State::DIRTY_BIT_STENCIL_OPS_FRONT:
- {
- const gl::DepthStencilState &depthStencilState = state.getDepthStencilState();
- if (depthStencilState.stencilFail != mCurDepthStencilState.stencilFail ||
- depthStencilState.stencilPassDepthFail !=
- mCurDepthStencilState.stencilPassDepthFail ||
- depthStencilState.stencilPassDepthPass !=
- mCurDepthStencilState.stencilPassDepthPass)
- {
- mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT);
- }
- break;
- }
- case gl::State::DIRTY_BIT_STENCIL_OPS_BACK:
- {
- const gl::DepthStencilState &depthStencilState = state.getDepthStencilState();
- if (depthStencilState.stencilBackFail != mCurDepthStencilState.stencilBackFail ||
- depthStencilState.stencilBackPassDepthFail !=
- mCurDepthStencilState.stencilBackPassDepthFail ||
- depthStencilState.stencilBackPassDepthPass !=
- mCurDepthStencilState.stencilBackPassDepthPass)
- {
- mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK);
- }
- break;
- }
- case gl::State::DIRTY_BIT_SCISSOR_TEST_ENABLED:
- if (state.isScissorTestEnabled() != mCurScissorEnabled)
- {
- mDirtyBits.set(DIRTY_BIT_SCISSOR_ENABLED);
- // If scissor is enabled, we have to set the scissor rect
- mDirtyBits.set(DIRTY_BIT_SCISSOR_RECT);
- }
- break;
- case gl::State::DIRTY_BIT_SCISSOR:
- if (state.getScissor() != mCurScissorRect)
- {
- mDirtyBits.set(DIRTY_BIT_SCISSOR_RECT);
- }
- break;
- case gl::State::DIRTY_BIT_DEPTH_RANGE:
- if (state.getNearPlane() != mCurNear || state.getFarPlane() != mCurFar)
- {
- mDirtyBits.set(DIRTY_BIT_VIEWPORT);
- }
- break;
- case gl::State::DIRTY_BIT_VIEWPORT:
- if (state.getViewport() != mCurViewport)
- {
- mDirtyBits.set(DIRTY_BIT_VIEWPORT);
- }
- break;
- default:
- break;
- }
- }
-}
-
-gl::Error StateManager9::setBlendDepthRasterStates(const gl::State &glState,
- unsigned int sampleMask)
-{
- const gl::Framebuffer *framebuffer = glState.getDrawFramebuffer();
-
- const gl::BlendState &blendState = glState.getBlendState();
- const gl::ColorF &blendColor = glState.getBlendColor();
- const gl::RasterizerState &rasterState = glState.getRasterizerState();
-
- const auto &depthStencilState = glState.getDepthStencilState();
- bool frontFaceCCW = (glState.getRasterizerState().frontFace == GL_CCW);
- unsigned int maxStencil = (1 << mCurStencilSize) - 1;
-
- // All the depth stencil states depends on the front face ccw variable
- if (frontFaceCCW != mCurFrontFaceCCW)
- {
- forceSetDepthStencilState();
- mCurFrontFaceCCW = frontFaceCCW;
- }
-
- for (auto dirtyBit : mDirtyBits)
- {
- switch (dirtyBit)
- {
- case DIRTY_BIT_BLEND_ENABLED:
- setBlendEnabled(blendState.blend);
- break;
- case DIRTY_BIT_BLEND_COLOR:
- setBlendColor(blendState, blendColor);
- break;
- case DIRTY_BIT_BLEND_FUNCS_EQUATIONS:
- setBlendFuncsEquations(blendState);
- break;
- case DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE:
- setSampleAlphaToCoverage(blendState.sampleAlphaToCoverage);
- break;
- case DIRTY_BIT_COLOR_MASK:
- setColorMask(framebuffer, blendState.colorMaskRed, blendState.colorMaskBlue,
- blendState.colorMaskGreen, blendState.colorMaskAlpha);
- break;
- case DIRTY_BIT_DITHER:
- setDither(blendState.dither);
- break;
- case DIRTY_BIT_CULL_MODE:
- setCullMode(rasterState.cullFace, rasterState.cullMode, rasterState.frontFace);
- break;
- case DIRTY_BIT_DEPTH_BIAS:
- setDepthBias(rasterState.polygonOffsetFill, rasterState.polygonOffsetFactor,
- rasterState.polygonOffsetUnits);
- break;
- case DIRTY_BIT_STENCIL_DEPTH_MASK:
- setDepthMask(depthStencilState.depthMask);
- break;
- case DIRTY_BIT_STENCIL_DEPTH_FUNC:
- setDepthFunc(depthStencilState.depthTest, depthStencilState.depthFunc);
- break;
- case DIRTY_BIT_STENCIL_TEST_ENABLED:
- setStencilTestEnabled(depthStencilState.stencilTest);
- break;
- case DIRTY_BIT_STENCIL_FUNCS_FRONT:
- setStencilFuncsFront(depthStencilState.stencilFunc, depthStencilState.stencilMask,
- glState.getStencilRef(), frontFaceCCW, maxStencil);
- break;
- case DIRTY_BIT_STENCIL_FUNCS_BACK:
- setStencilFuncsBack(depthStencilState.stencilBackFunc,
- depthStencilState.stencilBackMask, glState.getStencilBackRef(),
- frontFaceCCW, maxStencil);
- break;
- case DIRTY_BIT_STENCIL_WRITEMASK_FRONT:
- setStencilWriteMask(depthStencilState.stencilWritemask, frontFaceCCW);
- break;
- case DIRTY_BIT_STENCIL_WRITEMASK_BACK:
- setStencilBackWriteMask(depthStencilState.stencilBackWritemask, frontFaceCCW);
- break;
- case DIRTY_BIT_STENCIL_OPS_FRONT:
- setStencilOpsFront(depthStencilState.stencilFail,
- depthStencilState.stencilPassDepthFail,
- depthStencilState.stencilPassDepthPass, frontFaceCCW);
- break;
- case DIRTY_BIT_STENCIL_OPS_BACK:
- setStencilOpsBack(depthStencilState.stencilBackFail,
- depthStencilState.stencilBackPassDepthFail,
- depthStencilState.stencilBackPassDepthPass, frontFaceCCW);
- break;
- default:
- break;
- }
- }
-
- if (sampleMask != mCurSampleMask)
- {
- setSampleMask(sampleMask);
- }
-
- return gl::NoError();
-}
-
-void StateManager9::setViewportState(const gl::Rectangle &viewport,
- float zNear,
- float zFar,
- GLenum drawMode,
- GLenum frontFace,
- bool ignoreViewport)
-{
- if (!mDirtyBits.test(DIRTY_BIT_VIEWPORT) && mCurIgnoreViewport == ignoreViewport)
- return;
-
- gl::Rectangle actualViewport = viewport;
- float actualZNear = gl::clamp01(zNear);
- float actualZFar = gl::clamp01(zFar);
-
- if (ignoreViewport)
- {
- actualViewport.x = 0;
- actualViewport.y = 0;
- actualViewport.width = static_cast<int>(mRenderTargetBounds.width);
- actualViewport.height = static_cast<int>(mRenderTargetBounds.height);
- actualZNear = 0.0f;
- actualZFar = 1.0f;
- }
-
- D3DVIEWPORT9 dxViewport;
- dxViewport.X = gl::clamp(actualViewport.x, 0, static_cast<int>(mRenderTargetBounds.width));
- dxViewport.Y = gl::clamp(actualViewport.y, 0, static_cast<int>(mRenderTargetBounds.height));
- dxViewport.Width =
- gl::clamp(actualViewport.width, 0,
- static_cast<int>(mRenderTargetBounds.width) - static_cast<int>(dxViewport.X));
- dxViewport.Height =
- gl::clamp(actualViewport.height, 0,
- static_cast<int>(mRenderTargetBounds.height) - static_cast<int>(dxViewport.Y));
- dxViewport.MinZ = actualZNear;
- dxViewport.MaxZ = actualZFar;
-
- float depthFront = !gl::IsTriangleMode(drawMode) ? 0.0f : (frontFace == GL_CCW ? 1.0f : -1.0f);
-
- mRenderer9->getDevice()->SetViewport(&dxViewport);
-
- mCurViewport = actualViewport;
- mCurNear = actualZNear;
- mCurFar = actualZFar;
- mCurDepthFront = depthFront;
- mCurIgnoreViewport = ignoreViewport;
-
- // Setting shader constants
- dx_VertexConstants9 vc = {};
- dx_PixelConstants9 pc = {};
-
- vc.viewAdjust[0] =
- static_cast<float>((actualViewport.width - static_cast<int>(dxViewport.Width)) +
- 2 * (actualViewport.x - static_cast<int>(dxViewport.X)) - 1) /
- dxViewport.Width;
- vc.viewAdjust[1] =
- static_cast<float>((actualViewport.height - static_cast<int>(dxViewport.Height)) +
- 2 * (actualViewport.y - static_cast<int>(dxViewport.Y)) - 1) /
- dxViewport.Height;
- vc.viewAdjust[2] = static_cast<float>(actualViewport.width) / dxViewport.Width;
- vc.viewAdjust[3] = static_cast<float>(actualViewport.height) / dxViewport.Height;
-
- pc.viewCoords[0] = actualViewport.width * 0.5f;
- pc.viewCoords[1] = actualViewport.height * 0.5f;
- pc.viewCoords[2] = actualViewport.x + (actualViewport.width * 0.5f);
- pc.viewCoords[3] = actualViewport.y + (actualViewport.height * 0.5f);
-
- pc.depthFront[0] = (actualZFar - actualZNear) * 0.5f;
- pc.depthFront[1] = (actualZNear + actualZFar) * 0.5f;
- pc.depthFront[2] = depthFront;
-
- vc.depthRange[0] = actualZNear;
- vc.depthRange[1] = actualZFar;
- vc.depthRange[2] = actualZFar - actualZNear;
-
- pc.depthRange[0] = actualZNear;
- pc.depthRange[1] = actualZFar;
- pc.depthRange[2] = actualZFar - actualZNear;
-
- if (memcmp(&vc, &mVertexConstants, sizeof(dx_VertexConstants9)) != 0)
- {
- mVertexConstants = vc;
- mDxUniformsDirty = true;
- }
-
- if (memcmp(&pc, &mPixelConstants, sizeof(dx_PixelConstants9)) != 0)
- {
- mPixelConstants = pc;
- mDxUniformsDirty = true;
- }
-
- mForceSetViewport = false;
-}
-
-void StateManager9::setShaderConstants()
-{
- if (!mDxUniformsDirty)
- return;
-
- IDirect3DDevice9 *device = mRenderer9->getDevice();
- device->SetVertexShaderConstantF(0, reinterpret_cast<float *>(&mVertexConstants),
- sizeof(dx_VertexConstants9) / sizeof(float[4]));
- device->SetPixelShaderConstantF(0, reinterpret_cast<float *>(&mPixelConstants),
- sizeof(dx_PixelConstants9) / sizeof(float[4]));
- mDxUniformsDirty = false;
-}
-
-// This is separate from the main state loop because other functions
-// outside call only setScissorState to update scissor state
-void StateManager9::setScissorState(const gl::Rectangle &scissor, bool enabled)
-{
- if (mDirtyBits.test(DIRTY_BIT_SCISSOR_ENABLED))
- setScissorEnabled(enabled);
-
- if (mDirtyBits.test(DIRTY_BIT_SCISSOR_RECT))
- setScissorRect(scissor, enabled);
-}
-
-void StateManager9::setRenderTargetBounds(size_t width, size_t height)
-{
- mRenderTargetBounds.width = (int)width;
- mRenderTargetBounds.height = (int)height;
- forceSetViewportState();
-}
-
-void StateManager9::setScissorEnabled(bool scissorEnabled)
-{
- mRenderer9->getDevice()->SetRenderState(D3DRS_SCISSORTESTENABLE, scissorEnabled ? TRUE : FALSE);
- mCurScissorEnabled = scissorEnabled;
-}
-
-void StateManager9::setScissorRect(const gl::Rectangle &scissor, bool enabled)
-{
- if (!enabled)
- return;
-
- RECT rect;
- rect.left = gl::clamp(scissor.x, 0, static_cast<int>(mRenderTargetBounds.width));
- rect.top = gl::clamp(scissor.y, 0, static_cast<int>(mRenderTargetBounds.height));
- rect.right =
- gl::clamp(scissor.x + scissor.width, 0, static_cast<int>(mRenderTargetBounds.width));
- rect.bottom =
- gl::clamp(scissor.y + scissor.height, 0, static_cast<int>(mRenderTargetBounds.height));
- mRenderer9->getDevice()->SetScissorRect(&rect);
-}
-
-void StateManager9::setDepthFunc(bool depthTest, GLenum depthFunc)
-{
- if (depthTest)
- {
- IDirect3DDevice9 *device = mRenderer9->getDevice();
- device->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
- device->SetRenderState(D3DRS_ZFUNC, gl_d3d9::ConvertComparison(depthFunc));
- }
- else
- {
- mRenderer9->getDevice()->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
- }
-
- mCurDepthStencilState.depthTest = depthTest;
- mCurDepthStencilState.depthFunc = depthFunc;
-}
-
-void StateManager9::setStencilOpsFront(GLenum stencilFail,
- GLenum stencilPassDepthFail,
- GLenum stencilPassDepthPass,
- bool frontFaceCCW)
-{
- // TODO(dianx) It may be slightly more efficient todo these and other similar areas
- // with separate dirty bits.
- IDirect3DDevice9 *device = mRenderer9->getDevice();
- device->SetRenderState(frontFaceCCW ? D3DRS_STENCILFAIL : D3DRS_CCW_STENCILFAIL,
- gl_d3d9::ConvertStencilOp(stencilFail));
- device->SetRenderState(frontFaceCCW ? D3DRS_STENCILZFAIL : D3DRS_CCW_STENCILZFAIL,
- gl_d3d9::ConvertStencilOp(stencilPassDepthFail));
- device->SetRenderState(frontFaceCCW ? D3DRS_STENCILPASS : D3DRS_CCW_STENCILPASS,
- gl_d3d9::ConvertStencilOp(stencilPassDepthPass));
-
- mCurDepthStencilState.stencilFail = stencilFail;
- mCurDepthStencilState.stencilPassDepthFail = stencilPassDepthFail;
- mCurDepthStencilState.stencilPassDepthPass = stencilPassDepthPass;
-}
-
-void StateManager9::setStencilOpsBack(GLenum stencilBackFail,
- GLenum stencilBackPassDepthFail,
- GLenum stencilBackPassDepthPass,
- bool frontFaceCCW)
-{
- IDirect3DDevice9 *device = mRenderer9->getDevice();
- device->SetRenderState(!frontFaceCCW ? D3DRS_STENCILFAIL : D3DRS_CCW_STENCILFAIL,
- gl_d3d9::ConvertStencilOp(stencilBackFail));
- device->SetRenderState(!frontFaceCCW ? D3DRS_STENCILZFAIL : D3DRS_CCW_STENCILZFAIL,
- gl_d3d9::ConvertStencilOp(stencilBackPassDepthFail));
- device->SetRenderState(!frontFaceCCW ? D3DRS_STENCILPASS : D3DRS_CCW_STENCILPASS,
- gl_d3d9::ConvertStencilOp(stencilBackPassDepthPass));
-
- mCurDepthStencilState.stencilBackFail = stencilBackFail;
- mCurDepthStencilState.stencilBackPassDepthFail = stencilBackPassDepthFail;
- mCurDepthStencilState.stencilBackPassDepthPass = stencilBackPassDepthPass;
-}
-
-void StateManager9::setStencilBackWriteMask(GLuint stencilBackWriteMask, bool frontFaceCCW)
-{
- mRenderer9->getDevice()->SetRenderState(
- !frontFaceCCW ? D3DRS_STENCILWRITEMASK : D3DRS_CCW_STENCILWRITEMASK, stencilBackWriteMask);
-
- mCurDepthStencilState.stencilBackWritemask = stencilBackWriteMask;
-}
-
-void StateManager9::setStencilFuncsBack(GLenum stencilBackFunc,
- GLuint stencilBackMask,
- GLint stencilBackRef,
- bool frontFaceCCW,
- unsigned int maxStencil)
-{
- IDirect3DDevice9 *device = mRenderer9->getDevice();
- device->SetRenderState(!frontFaceCCW ? D3DRS_STENCILFUNC : D3DRS_CCW_STENCILFUNC,
- gl_d3d9::ConvertComparison(stencilBackFunc));
- device->SetRenderState(!frontFaceCCW ? D3DRS_STENCILREF : D3DRS_CCW_STENCILREF,
- (stencilBackRef < (int)maxStencil) ? stencilBackRef : maxStencil);
- device->SetRenderState(!frontFaceCCW ? D3DRS_STENCILMASK : D3DRS_CCW_STENCILMASK,
- stencilBackMask);
-
- mCurDepthStencilState.stencilBackFunc = stencilBackFunc;
- mCurStencilBackRef = stencilBackRef;
- mCurDepthStencilState.stencilBackMask = stencilBackMask;
-}
-
-void StateManager9::setStencilWriteMask(GLuint stencilWriteMask, bool frontFaceCCW)
-{
- mRenderer9->getDevice()->SetRenderState(
- frontFaceCCW ? D3DRS_STENCILWRITEMASK : D3DRS_CCW_STENCILWRITEMASK, stencilWriteMask);
- mCurDepthStencilState.stencilWritemask = stencilWriteMask;
-}
-
-void StateManager9::setStencilFuncsFront(GLenum stencilFunc,
- GLuint stencilMask,
- GLint stencilRef,
- bool frontFaceCCW,
- unsigned int maxStencil)
-{
- IDirect3DDevice9 *device = mRenderer9->getDevice();
- device->SetRenderState(frontFaceCCW ? D3DRS_STENCILFUNC : D3DRS_CCW_STENCILFUNC,
- gl_d3d9::ConvertComparison(stencilFunc));
- device->SetRenderState(frontFaceCCW ? D3DRS_STENCILREF : D3DRS_CCW_STENCILREF,
- (stencilRef < static_cast<int>(maxStencil)) ? stencilRef : maxStencil);
- device->SetRenderState(frontFaceCCW ? D3DRS_STENCILMASK : D3DRS_CCW_STENCILMASK, stencilMask);
-
- mCurDepthStencilState.stencilFunc = stencilFunc;
- mCurStencilRef = stencilRef;
- mCurDepthStencilState.stencilMask = stencilMask;
-}
-void StateManager9::setStencilTestEnabled(bool stencilTestEnabled)
-{
- if (stencilTestEnabled && mCurStencilSize > 0)
- {
- mRenderer9->getDevice()->SetRenderState(D3DRS_STENCILENABLE, TRUE);
- mRenderer9->getDevice()->SetRenderState(D3DRS_TWOSIDEDSTENCILMODE, TRUE);
- }
- else
- {
- mRenderer9->getDevice()->SetRenderState(D3DRS_STENCILENABLE, FALSE);
- }
-
- mCurDepthStencilState.stencilTest = stencilTestEnabled;
-}
-
-void StateManager9::setDepthMask(bool depthMask)
-{
- mRenderer9->getDevice()->SetRenderState(D3DRS_ZWRITEENABLE, depthMask ? TRUE : FALSE);
- mCurDepthStencilState.depthMask = depthMask;
-}
-
-// TODO(dianx) one bit for sampleAlphaToCoverage
-void StateManager9::setSampleAlphaToCoverage(bool enabled)
-{
- if (enabled)
- {
- UNREACHABLE();
- }
-}
-
-void StateManager9::setBlendColor(const gl::BlendState &blendState, const gl::ColorF &blendColor)
-{
- if (!blendState.blend)
- return;
-
- if (blendState.sourceBlendRGB != GL_CONSTANT_ALPHA &&
- blendState.sourceBlendRGB != GL_ONE_MINUS_CONSTANT_ALPHA &&
- blendState.destBlendRGB != GL_CONSTANT_ALPHA &&
- blendState.destBlendRGB != GL_ONE_MINUS_CONSTANT_ALPHA)
- {
- mRenderer9->getDevice()->SetRenderState(D3DRS_BLENDFACTOR,
- gl_d3d9::ConvertColor(blendColor));
- }
- else
- {
- mRenderer9->getDevice()->SetRenderState(
- D3DRS_BLENDFACTOR,
- D3DCOLOR_RGBA(gl::unorm<8>(blendColor.alpha), gl::unorm<8>(blendColor.alpha),
- gl::unorm<8>(blendColor.alpha), gl::unorm<8>(blendColor.alpha)));
- }
- mCurBlendColor = blendColor;
-}
-
-void StateManager9::setBlendFuncsEquations(const gl::BlendState &blendState)
-{
- if (!blendState.blend)
- return;
-
- IDirect3DDevice9 *device = mRenderer9->getDevice();
-
- device->SetRenderState(D3DRS_SRCBLEND, gl_d3d9::ConvertBlendFunc(blendState.sourceBlendRGB));
- device->SetRenderState(D3DRS_DESTBLEND, gl_d3d9::ConvertBlendFunc(blendState.destBlendRGB));
- device->SetRenderState(D3DRS_BLENDOP, gl_d3d9::ConvertBlendOp(blendState.blendEquationRGB));
-
- if (blendState.sourceBlendRGB != blendState.sourceBlendAlpha ||
- blendState.destBlendRGB != blendState.destBlendAlpha ||
- blendState.blendEquationRGB != blendState.blendEquationAlpha)
- {
- device->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE);
-
- device->SetRenderState(D3DRS_SRCBLENDALPHA,
- gl_d3d9::ConvertBlendFunc(blendState.sourceBlendAlpha));
- device->SetRenderState(D3DRS_DESTBLENDALPHA,
- gl_d3d9::ConvertBlendFunc(blendState.destBlendAlpha));
- device->SetRenderState(D3DRS_BLENDOPALPHA,
- gl_d3d9::ConvertBlendOp(blendState.blendEquationAlpha));
- }
- else
- {
- device->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, FALSE);
- }
-
- mCurBlendState.sourceBlendRGB = blendState.sourceBlendRGB;
- mCurBlendState.destBlendRGB = blendState.destBlendRGB;
- mCurBlendState.blendEquationRGB = blendState.blendEquationRGB;
- mCurBlendState.blendEquationAlpha = blendState.blendEquationAlpha;
-}
-
-void StateManager9::setBlendEnabled(bool enabled)
-{
- mRenderer9->getDevice()->SetRenderState(D3DRS_ALPHABLENDENABLE, enabled ? TRUE : FALSE);
- mCurBlendState.blend = enabled;
-}
-
-void StateManager9::setDither(bool dither)
-{
- mRenderer9->getDevice()->SetRenderState(D3DRS_DITHERENABLE, dither ? TRUE : FALSE);
- mCurBlendState.dither = dither;
-}
-
-// TODO(dianx) one bit for color mask
-void StateManager9::setColorMask(const gl::Framebuffer *framebuffer,
- bool red,
- bool blue,
- bool green,
- bool alpha)
-{
- // Set the color mask
-
- const auto *attachment = framebuffer->getFirstColorbuffer();
- const auto &format = attachment ? attachment->getFormat() : gl::Format::Invalid();
-
- DWORD colorMask = gl_d3d9::ConvertColorMask(
- format.info->redBits > 0 && red, format.info->greenBits > 0 && green,
- format.info->blueBits > 0 && blue, format.info->alphaBits > 0 && alpha);
-
- // Apparently some ATI cards have a bug where a draw with a zero color write mask can cause
- // later draws to have incorrect results. Instead, set a nonzero color write mask but modify the
- // blend state so that no drawing is done.
- // http://anglebug.com/169
- if (colorMask == 0 && mUsingZeroColorMaskWorkaround)
- {
- IDirect3DDevice9 *device = mRenderer9->getDevice();
- // Enable green channel, but set blending so nothing will be drawn.
- device->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_GREEN);
-
- device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
-
- device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
- device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
- device->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
-
- mCurBlendState.colorMaskRed = false;
- mCurBlendState.colorMaskGreen = true;
- mCurBlendState.colorMaskBlue = false;
- mCurBlendState.colorMaskAlpha = false;
-
- mCurBlendState.blend = true;
- mCurBlendState.sourceBlendRGB = GL_ZERO;
- mCurBlendState.sourceBlendAlpha = GL_ZERO;
- mCurBlendState.destBlendRGB = GL_ONE;
- mCurBlendState.destBlendAlpha = GL_ONE;
- mCurBlendState.blendEquationRGB = GL_FUNC_ADD;
- mCurBlendState.blendEquationAlpha = GL_FUNC_ADD;
- }
- else
- {
- mRenderer9->getDevice()->SetRenderState(D3DRS_COLORWRITEENABLE, colorMask);
-
- mCurBlendState.colorMaskRed = red;
- mCurBlendState.colorMaskGreen = green;
- mCurBlendState.colorMaskBlue = blue;
- mCurBlendState.colorMaskAlpha = alpha;
- }
-}
-
-void StateManager9::setSampleMask(unsigned int sampleMask)
-{
- IDirect3DDevice9 *device = mRenderer9->getDevice();
- // Set the multisample mask
- device->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, TRUE);
- device->SetRenderState(D3DRS_MULTISAMPLEMASK, static_cast<DWORD>(sampleMask));
-
- mCurSampleMask = sampleMask;
-}
-
-void StateManager9::setCullMode(bool cullFace, gl::CullFaceMode cullMode, GLenum frontFace)
-{
- if (cullFace)
- {
- mRenderer9->getDevice()->SetRenderState(D3DRS_CULLMODE,
- gl_d3d9::ConvertCullMode(cullMode, frontFace));
- }
- else
- {
- mRenderer9->getDevice()->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
- }
-
- mCurRasterState.cullFace = cullFace;
- mCurRasterState.cullMode = cullMode;
- mCurRasterState.frontFace = frontFace;
-}
-
-void StateManager9::setDepthBias(bool polygonOffsetFill,
- GLfloat polygonOffsetFactor,
- GLfloat polygonOffsetUnits)
-{
- if (polygonOffsetFill)
- {
- if (mCurDepthSize > 0)
- {
- IDirect3DDevice9 *device = mRenderer9->getDevice();
- device->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, *(DWORD *)&polygonOffsetFactor);
-
- float depthBias = ldexp(polygonOffsetUnits, -static_cast<int>(mCurDepthSize));
- device->SetRenderState(D3DRS_DEPTHBIAS, *(DWORD *)&depthBias);
- }
- }
- else
- {
- IDirect3DDevice9 *device = mRenderer9->getDevice();
- device->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, 0);
- device->SetRenderState(D3DRS_DEPTHBIAS, 0);
- }
-
- mCurRasterState.polygonOffsetFill = polygonOffsetFill;
- mCurRasterState.polygonOffsetFactor = polygonOffsetFactor;
- mCurRasterState.polygonOffsetUnits = polygonOffsetUnits;
-}
-
-void StateManager9::updateDepthSizeIfChanged(bool depthStencilInitialized, unsigned int depthSize)
-{
- if (!depthStencilInitialized || depthSize != mCurDepthSize)
- {
- mCurDepthSize = depthSize;
- forceSetRasterState();
- }
-}
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.h
deleted file mode 100644
index 63ce17cb1e..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.h
+++ /dev/null
@@ -1,209 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// StateManager9.h: Defines a class for caching D3D9 state
-
-#ifndef LIBANGLE_RENDERER_D3D9_STATEMANAGER9_H_
-#define LIBANGLE_RENDERER_D3D9_STATEMANAGER9_H_
-
-#include "libANGLE/angletypes.h"
-#include "libANGLE/ContextState.h"
-#include "libANGLE/State.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
-
-namespace rx
-{
-
-class Renderer9;
-
-struct dx_VertexConstants9
-{
- float depthRange[4];
- float viewAdjust[4];
- float viewCoords[4];
-};
-
-struct dx_PixelConstants9
-{
- float depthRange[4];
- float viewCoords[4];
- float depthFront[4];
-};
-
-class StateManager9 final : angle::NonCopyable
-{
- public:
- StateManager9(Renderer9 *renderer9);
- ~StateManager9();
-
- void initialize();
-
- void syncState(const gl::State &state, const gl::State::DirtyBits &dirtyBits);
-
- gl::Error setBlendDepthRasterStates(const gl::State &glState, unsigned int sampleMask);
- void setScissorState(const gl::Rectangle &scissor, bool enabled);
- void setViewportState(const gl::Rectangle &viewport,
- float zNear,
- float zFar,
- GLenum drawMode,
- GLenum frontFace,
- bool ignoreViewport);
-
- void setShaderConstants();
-
- void forceSetBlendState();
- void forceSetRasterState();
- void forceSetDepthStencilState();
- void forceSetScissorState();
- void forceSetViewportState();
- void forceSetDXUniformsState();
-
- void updateDepthSizeIfChanged(bool depthStencilInitialized, unsigned int depthSize);
- void updateStencilSizeIfChanged(bool depthStencilInitialized, unsigned int stencilSize);
-
- void setRenderTargetBounds(size_t width, size_t height);
-
- int getRenderTargetWidth() const { return mRenderTargetBounds.width; }
- int getRenderTargetHeight() const { return mRenderTargetBounds.height; }
-
- void resetDirtyBits() { mDirtyBits.reset(); }
-
- private:
- // Blend state functions
- void setBlendEnabled(bool enabled);
- void setBlendColor(const gl::BlendState &blendState, const gl::ColorF &blendColor);
- void setBlendFuncsEquations(const gl::BlendState &blendState);
- void setColorMask(const gl::Framebuffer *framebuffer,
- bool red,
- bool blue,
- bool green,
- bool alpha);
- void setSampleAlphaToCoverage(bool enabled);
- void setDither(bool dither);
- void setSampleMask(unsigned int sampleMask);
-
- // Current raster state functions
- void setCullMode(bool cullFace, gl::CullFaceMode cullMode, GLenum frontFace);
- void setDepthBias(bool polygonOffsetFill,
- GLfloat polygonOffsetFactor,
- GLfloat polygonOffsetUnits);
-
- // Depth stencil state functions
- void setStencilOpsFront(GLenum stencilFail,
- GLenum stencilPassDepthFail,
- GLenum stencilPassDepthPass,
- bool frontFaceCCW);
- void setStencilOpsBack(GLenum stencilBackFail,
- GLenum stencilBackPassDepthFail,
- GLenum stencilBackPassDepthPass,
- bool frontFaceCCW);
- void setStencilBackWriteMask(GLuint stencilBackWriteMask, bool frontFaceCCW);
- void setDepthFunc(bool depthTest, GLenum depthFunc);
- void setStencilTestEnabled(bool enabled);
- void setDepthMask(bool depthMask);
- void setStencilFuncsFront(GLenum stencilFunc,
- GLuint stencilMask,
- GLint stencilRef,
- bool frontFaceCCW,
- unsigned int maxStencil);
- void setStencilFuncsBack(GLenum stencilBackFunc,
- GLuint stencilBackMask,
- GLint stencilBackRef,
- bool frontFaceCCW,
- unsigned int maxStencil);
- void setStencilWriteMask(GLuint stencilWriteMask, bool frontFaceCCW);
-
- void setScissorEnabled(bool scissorEnabled);
- void setScissorRect(const gl::Rectangle &scissor, bool enabled);
-
- enum DirtyBitType
- {
- // Blend dirty bits
- DIRTY_BIT_BLEND_ENABLED,
- DIRTY_BIT_BLEND_COLOR,
- DIRTY_BIT_BLEND_FUNCS_EQUATIONS,
- DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE,
- DIRTY_BIT_COLOR_MASK,
- DIRTY_BIT_DITHER,
- DIRTY_BIT_SAMPLE_MASK,
-
- // Rasterizer dirty bits
- DIRTY_BIT_CULL_MODE,
- DIRTY_BIT_DEPTH_BIAS,
-
- // Depth stencil dirty bits
- DIRTY_BIT_STENCIL_DEPTH_MASK,
- DIRTY_BIT_STENCIL_DEPTH_FUNC,
- DIRTY_BIT_STENCIL_TEST_ENABLED,
- DIRTY_BIT_STENCIL_FUNCS_FRONT,
- DIRTY_BIT_STENCIL_FUNCS_BACK,
- DIRTY_BIT_STENCIL_WRITEMASK_FRONT,
- DIRTY_BIT_STENCIL_WRITEMASK_BACK,
- DIRTY_BIT_STENCIL_OPS_FRONT,
- DIRTY_BIT_STENCIL_OPS_BACK,
-
- // Scissor dirty bits
- DIRTY_BIT_SCISSOR_ENABLED,
- DIRTY_BIT_SCISSOR_RECT,
-
- // Viewport dirty bits
- DIRTY_BIT_VIEWPORT,
-
- DIRTY_BIT_MAX
- };
-
- using DirtyBits = angle::BitSet<DIRTY_BIT_MAX>;
-
- bool mUsingZeroColorMaskWorkaround;
-
- // Currently applied blend state
- gl::BlendState mCurBlendState;
- gl::ColorF mCurBlendColor;
- unsigned int mCurSampleMask;
- DirtyBits mBlendStateDirtyBits;
-
- // Currently applied raster state
- gl::RasterizerState mCurRasterState;
- unsigned int mCurDepthSize;
- DirtyBits mRasterizerStateDirtyBits;
-
- // Currently applied depth stencil state
- gl::DepthStencilState mCurDepthStencilState;
- int mCurStencilRef;
- int mCurStencilBackRef;
- bool mCurFrontFaceCCW;
- unsigned int mCurStencilSize;
- DirtyBits mDepthStencilStateDirtyBits;
-
- // Currently applied scissor states
- gl::Rectangle mCurScissorRect;
- bool mCurScissorEnabled;
- gl::Extents mRenderTargetBounds;
- DirtyBits mScissorStateDirtyBits;
-
- // Currently applied viewport states
- bool mForceSetViewport;
- gl::Rectangle mCurViewport;
- float mCurNear;
- float mCurFar;
- float mCurDepthFront;
- bool mCurIgnoreViewport;
-
- dx_VertexConstants9 mVertexConstants;
- dx_PixelConstants9 mPixelConstants;
- bool mDxUniformsDirty;
-
- // FIXME: Unsupported by D3D9
- static const D3DRENDERSTATETYPE D3DRS_CCW_STENCILREF = D3DRS_STENCILREF;
- static const D3DRENDERSTATETYPE D3DRS_CCW_STENCILMASK = D3DRS_STENCILMASK;
- static const D3DRENDERSTATETYPE D3DRS_CCW_STENCILWRITEMASK = D3DRS_STENCILWRITEMASK;
-
- Renderer9 *mRenderer9;
- DirtyBits mDirtyBits;
-};
-
-} // namespace rx
-#endif // LIBANGLE_RENDERER_D3D9_STATEMANAGER9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp
deleted file mode 100644
index bc81aa18ec..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp
+++ /dev/null
@@ -1,467 +0,0 @@
-//
-// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// SwapChain9.cpp: Implements a back-end specific class for the D3D9 swap chain.
-
-#include "libANGLE/renderer/d3d/d3d9/SwapChain9.h"
-
-#include "libANGLE/features.h"
-#include "libANGLE/renderer/d3d/d3d9/formatutils9.h"
-#include "libANGLE/renderer/d3d/d3d9/NativeWindow9.h"
-#include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
-#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h"
-
-namespace rx
-{
-
-SwapChain9::SwapChain9(Renderer9 *renderer,
- NativeWindow9 *nativeWindow,
- HANDLE shareHandle,
- IUnknown *d3dTexture,
- GLenum backBufferFormat,
- GLenum depthBufferFormat,
- EGLint orientation)
- : SwapChainD3D(shareHandle, d3dTexture, backBufferFormat, depthBufferFormat),
- mRenderer(renderer),
- mWidth(-1),
- mHeight(-1),
- mSwapInterval(-1),
- mNativeWindow(nativeWindow),
- mSwapChain(nullptr),
- mBackBuffer(nullptr),
- mRenderTarget(nullptr),
- mDepthStencil(nullptr),
- mOffscreenTexture(nullptr),
- mColorRenderTarget(this, false),
- mDepthStencilRenderTarget(this, true)
-{
- ASSERT(orientation == 0);
-}
-
-SwapChain9::~SwapChain9()
-{
- release();
-}
-
-void SwapChain9::release()
-{
- SafeRelease(mSwapChain);
- SafeRelease(mBackBuffer);
- SafeRelease(mDepthStencil);
- SafeRelease(mRenderTarget);
- SafeRelease(mOffscreenTexture);
-
- if (mNativeWindow->getNativeWindow())
- {
- mShareHandle = nullptr;
- }
-}
-
-static DWORD convertInterval(EGLint interval)
-{
-#if ANGLE_VSYNC == ANGLE_DISABLED
- return D3DPRESENT_INTERVAL_IMMEDIATE;
-#else
- switch(interval)
- {
- case 0: return D3DPRESENT_INTERVAL_IMMEDIATE;
- case 1: return D3DPRESENT_INTERVAL_ONE;
- case 2: return D3DPRESENT_INTERVAL_TWO;
- case 3: return D3DPRESENT_INTERVAL_THREE;
- case 4: return D3DPRESENT_INTERVAL_FOUR;
- default: UNREACHABLE();
- }
-
- return D3DPRESENT_INTERVAL_DEFAULT;
-#endif
-}
-
-EGLint SwapChain9::resize(const gl::Context *context, int backbufferWidth, int backbufferHeight)
-{
- // D3D9 does not support resizing swap chains without recreating them
- return reset(context, backbufferWidth, backbufferHeight, mSwapInterval);
-}
-
-EGLint SwapChain9::reset(const gl::Context *context,
- int backbufferWidth,
- int backbufferHeight,
- EGLint swapInterval)
-{
- IDirect3DDevice9 *device = mRenderer->getDevice();
-
- if (device == nullptr)
- {
- return EGL_BAD_ACCESS;
- }
-
- // Evict all non-render target textures to system memory and release all resources
- // before reallocating them to free up as much video memory as possible.
- device->EvictManagedResources();
-
- HRESULT result;
-
- // Release specific resources to free up memory for the new render target, while the
- // old render target still exists for the purpose of preserving its contents.
- SafeRelease(mSwapChain);
- SafeRelease(mBackBuffer);
- SafeRelease(mOffscreenTexture);
- SafeRelease(mDepthStencil);
-
- const d3d9::TextureFormat &backBufferd3dFormatInfo =
- d3d9::GetTextureFormatInfo(mOffscreenRenderTargetFormat);
- if (mD3DTexture != nullptr)
- {
- result = mD3DTexture->QueryInterface(&mOffscreenTexture);
- ASSERT(SUCCEEDED(result));
- }
- else
- {
- HANDLE *pShareHandle = nullptr;
- if (!mNativeWindow->getNativeWindow() && mRenderer->getShareHandleSupport())
- {
- pShareHandle = &mShareHandle;
- }
-
- result = device->CreateTexture(backbufferWidth, backbufferHeight, 1, D3DUSAGE_RENDERTARGET,
- backBufferd3dFormatInfo.texFormat, D3DPOOL_DEFAULT,
- &mOffscreenTexture, pShareHandle);
- if (FAILED(result))
- {
- ERR() << "Could not create offscreen texture, " << gl::FmtHR(result);
- release();
-
- if (d3d9::isDeviceLostError(result))
- {
- return EGL_CONTEXT_LOST;
- }
- else
- {
- return EGL_BAD_ALLOC;
- }
- }
- }
-
- IDirect3DSurface9 *oldRenderTarget = mRenderTarget;
-
- result = mOffscreenTexture->GetSurfaceLevel(0, &mRenderTarget);
- ASSERT(SUCCEEDED(result));
-
- if (oldRenderTarget)
- {
- RECT rect =
- {
- 0, 0,
- mWidth, mHeight
- };
-
- if (rect.right > static_cast<LONG>(backbufferWidth))
- {
- rect.right = backbufferWidth;
- }
-
- if (rect.bottom > static_cast<LONG>(backbufferHeight))
- {
- rect.bottom = backbufferHeight;
- }
-
- mRenderer->endScene();
-
- result = device->StretchRect(oldRenderTarget, &rect, mRenderTarget, &rect, D3DTEXF_NONE);
- ASSERT(SUCCEEDED(result));
-
- SafeRelease(oldRenderTarget);
- }
-
- const d3d9::TextureFormat &depthBufferd3dFormatInfo = d3d9::GetTextureFormatInfo(mDepthBufferFormat);
-
- // Don't create a swapchain for NULLREF devices
- D3DDEVTYPE deviceType = mRenderer->getD3D9DeviceType();
- EGLNativeWindowType window = mNativeWindow->getNativeWindow();
- if (window && deviceType != D3DDEVTYPE_NULLREF)
- {
- D3DPRESENT_PARAMETERS presentParameters = {0};
- presentParameters.AutoDepthStencilFormat = depthBufferd3dFormatInfo.renderFormat;
- presentParameters.BackBufferCount = 1;
- presentParameters.BackBufferFormat = backBufferd3dFormatInfo.renderFormat;
- presentParameters.EnableAutoDepthStencil = FALSE;
- presentParameters.Flags = 0;
- presentParameters.hDeviceWindow = window;
- presentParameters.MultiSampleQuality = 0; // FIXME: Unimplemented
- presentParameters.MultiSampleType = D3DMULTISAMPLE_NONE; // FIXME: Unimplemented
- presentParameters.PresentationInterval = convertInterval(swapInterval);
- presentParameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
- presentParameters.Windowed = TRUE;
- presentParameters.BackBufferWidth = backbufferWidth;
- presentParameters.BackBufferHeight = backbufferHeight;
-
- // http://crbug.com/140239
- // http://crbug.com/143434
- //
- // Some AMD/Intel switchable systems / drivers appear to round swap chain surfaces to a multiple of 64 pixels in width
- // when using the integrated Intel. This rounds the width up rather than down.
- //
- // Some non-switchable AMD GPUs / drivers do not respect the source rectangle to Present. Therefore, when the vendor ID
- // is not Intel, the back buffer width must be exactly the same width as the window or horizontal scaling will occur.
- if (IsIntel(mRenderer->getVendorId()))
- {
- presentParameters.BackBufferWidth = (presentParameters.BackBufferWidth + 63) / 64 * 64;
- }
-
- result = device->CreateAdditionalSwapChain(&presentParameters, &mSwapChain);
-
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_INVALIDCALL || result == D3DERR_DEVICELOST);
-
- ERR() << "Could not create additional swap chains or offscreen surfaces, "
- << gl::FmtHR(result);
- release();
-
- if (d3d9::isDeviceLostError(result))
- {
- return EGL_CONTEXT_LOST;
- }
- else
- {
- return EGL_BAD_ALLOC;
- }
- }
-
- result = mSwapChain->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &mBackBuffer);
- ASSERT(SUCCEEDED(result));
- InvalidateRect(window, nullptr, FALSE);
- }
-
- if (mDepthBufferFormat != GL_NONE)
- {
- result = device->CreateDepthStencilSurface(
- backbufferWidth, backbufferHeight, depthBufferd3dFormatInfo.renderFormat,
- D3DMULTISAMPLE_NONE, 0, FALSE, &mDepthStencil, nullptr);
-
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_INVALIDCALL);
-
- ERR() << "Could not create depthstencil surface for new swap chain, "
- << gl::FmtHR(result);
- release();
-
- if (d3d9::isDeviceLostError(result))
- {
- return EGL_CONTEXT_LOST;
- }
- else
- {
- return EGL_BAD_ALLOC;
- }
- }
- }
-
- mWidth = backbufferWidth;
- mHeight = backbufferHeight;
- mSwapInterval = swapInterval;
-
- return EGL_SUCCESS;
-}
-
-// parameters should be validated/clamped by caller
-EGLint SwapChain9::swapRect(const gl::Context *context,
- EGLint x,
- EGLint y,
- EGLint width,
- EGLint height)
-{
- if (!mSwapChain)
- {
- return EGL_SUCCESS;
- }
-
- IDirect3DDevice9 *device = mRenderer->getDevice();
-
- // Disable all pipeline operations
- device->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
- device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
- device->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
- device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
- device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
- device->SetRenderState(D3DRS_STENCILENABLE, FALSE);
- device->SetRenderState(D3DRS_CLIPPLANEENABLE, 0);
- device->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED);
- device->SetRenderState(D3DRS_SRGBWRITEENABLE, FALSE);
- device->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE);
- device->SetPixelShader(nullptr);
- device->SetVertexShader(nullptr);
-
- device->SetRenderTarget(0, mBackBuffer);
- device->SetDepthStencilSurface(nullptr);
-
- device->SetTexture(0, mOffscreenTexture);
- device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
- device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
- device->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
- device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
- device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
- device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
- device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
- device->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1);
-
- for (UINT streamIndex = 0; streamIndex < gl::MAX_VERTEX_ATTRIBS; streamIndex++)
- {
- device->SetStreamSourceFreq(streamIndex, 1);
- }
-
- D3DVIEWPORT9 viewport = {0, 0, static_cast<DWORD>(mWidth), static_cast<DWORD>(mHeight), 0.0f, 1.0f};
- device->SetViewport(&viewport);
-
- float x1 = x - 0.5f;
- float y1 = (mHeight - y - height) - 0.5f;
- float x2 = (x + width) - 0.5f;
- float y2 = (mHeight - y) - 0.5f;
-
- float u1 = x / float(mWidth);
- float v1 = y / float(mHeight);
- float u2 = (x + width) / float(mWidth);
- float v2 = (y + height) / float(mHeight);
-
- float quad[4][6] = {{x1, y1, 0.0f, 1.0f, u1, v2},
- {x2, y1, 0.0f, 1.0f, u2, v2},
- {x2, y2, 0.0f, 1.0f, u2, v1},
- {x1, y2, 0.0f, 1.0f, u1, v1}}; // x, y, z, rhw, u, v
-
- mRenderer->startScene();
- device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, quad, 6 * sizeof(float));
- mRenderer->endScene();
-
- device->SetTexture(0, nullptr);
-
- RECT rect =
- {
- static_cast<LONG>(x), static_cast<LONG>(mHeight - y - height),
- static_cast<LONG>(x + width), static_cast<LONG>(mHeight - y)
- };
-
- HRESULT result = mSwapChain->Present(&rect, &rect, nullptr, nullptr, 0);
-
- mRenderer->markAllStateDirty();
-
- if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_DRIVERINTERNALERROR)
- {
- return EGL_BAD_ALLOC;
- }
-
- // On Windows 8 systems, IDirect3DSwapChain9::Present sometimes returns 0x88760873 when the windows is
- // in the process of entering/exiting fullscreen. This code doesn't seem to have any documentation. The
- // device appears to be ok after emitting this error so simply return a failure to swap.
- if (result == static_cast<HRESULT>(0x88760873))
- {
- return EGL_BAD_MATCH;
- }
-
- // http://crbug.com/313210
- // If our swap failed, trigger a device lost event. Resetting will work around an AMD-specific
- // device removed bug with lost contexts when reinstalling drivers.
- if (FAILED(result))
- {
- mRenderer->notifyDeviceLost();
- return EGL_CONTEXT_LOST;
- }
-
- return EGL_SUCCESS;
-}
-
-// Increments refcount on surface.
-// caller must Release() the returned surface
-// TODO: remove the AddRef to match SwapChain11
-IDirect3DSurface9 *SwapChain9::getRenderTarget()
-{
- if (mRenderTarget)
- {
- mRenderTarget->AddRef();
- }
-
- return mRenderTarget;
-}
-
-// Increments refcount on surface.
-// caller must Release() the returned surface
-// TODO: remove the AddRef to match SwapChain11
-IDirect3DSurface9 *SwapChain9::getDepthStencil()
-{
- if (mDepthStencil)
- {
- mDepthStencil->AddRef();
- }
-
- return mDepthStencil;
-}
-
-// Increments refcount on texture.
-// caller must Release() the returned texture
-// TODO: remove the AddRef to match SwapChain11
-IDirect3DTexture9 *SwapChain9::getOffscreenTexture()
-{
- if (mOffscreenTexture)
- {
- mOffscreenTexture->AddRef();
- }
-
- return mOffscreenTexture;
-}
-
-void *SwapChain9::getKeyedMutex()
-{
- UNREACHABLE();
- return nullptr;
-}
-
-egl::Error SwapChain9::getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc)
-{
- UNREACHABLE();
- return egl::EglBadSurface();
-}
-
-void SwapChain9::recreate()
-{
- if (!mSwapChain)
- {
- return;
- }
-
- IDirect3DDevice9 *device = mRenderer->getDevice();
- if (device == nullptr)
- {
- return;
- }
-
- D3DPRESENT_PARAMETERS presentParameters;
- HRESULT result = mSwapChain->GetPresentParameters(&presentParameters);
- ASSERT(SUCCEEDED(result));
-
- IDirect3DSwapChain9 *newSwapChain = nullptr;
- result = device->CreateAdditionalSwapChain(&presentParameters, &newSwapChain);
- if (FAILED(result))
- {
- return;
- }
-
- SafeRelease(mSwapChain);
- mSwapChain = newSwapChain;
-
- SafeRelease(mBackBuffer);
- result = mSwapChain->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &mBackBuffer);
- ASSERT(SUCCEEDED(result));
-}
-
-RenderTargetD3D *SwapChain9::getColorRenderTarget()
-{
- return &mColorRenderTarget;
-}
-
-RenderTargetD3D *SwapChain9::getDepthStencilRenderTarget()
-{
- return &mDepthStencilRenderTarget;
-}
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.h
deleted file mode 100644
index 5753637c47..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.h
+++ /dev/null
@@ -1,81 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// SwapChain9.h: Defines a back-end specific class for the D3D9 swap chain.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_SWAPCHAIN9_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_SWAPCHAIN9_H_
-
-#include "common/angleutils.h"
-#include "libANGLE/renderer/d3d/SwapChainD3D.h"
-#include "libANGLE/renderer/d3d/d3d9/RenderTarget9.h"
-
-namespace rx
-{
-class NativeWindow9;
-class Renderer9;
-
-class SwapChain9 : public SwapChainD3D
-{
- public:
- SwapChain9(Renderer9 *renderer,
- NativeWindow9 *nativeWindow,
- HANDLE shareHandle,
- IUnknown *d3dTexture,
- GLenum backBufferFormat,
- GLenum depthBufferFormat,
- EGLint orientation);
- ~SwapChain9() override;
-
- EGLint resize(const gl::Context *context, EGLint backbufferWidth, EGLint backbufferHeight)
- override;
- EGLint reset(const gl::Context *context,
- EGLint backbufferWidth,
- EGLint backbufferHeight,
- EGLint swapInterval) override;
- EGLint swapRect(const gl::Context *context,
- EGLint x,
- EGLint y,
- EGLint width,
- EGLint height) override;
- void recreate() override;
-
- RenderTargetD3D *getColorRenderTarget() override;
- RenderTargetD3D *getDepthStencilRenderTarget() override;
-
- virtual IDirect3DSurface9 *getRenderTarget();
- virtual IDirect3DSurface9 *getDepthStencil();
- virtual IDirect3DTexture9 *getOffscreenTexture();
-
- EGLint getWidth() const { return mWidth; }
- EGLint getHeight() const { return mHeight; }
-
- void *getKeyedMutex() override;
-
- egl::Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc) override;
-
- private:
- void release();
-
- Renderer9 *mRenderer;
- EGLint mWidth;
- EGLint mHeight;
- EGLint mSwapInterval;
-
- NativeWindow9 *mNativeWindow;
-
- IDirect3DSwapChain9 *mSwapChain;
- IDirect3DSurface9 *mBackBuffer;
- IDirect3DSurface9 *mRenderTarget;
- IDirect3DSurface9 *mDepthStencil;
- IDirect3DTexture9* mOffscreenTexture;
-
- SurfaceRenderTarget9 mColorRenderTarget;
- SurfaceRenderTarget9 mDepthStencilRenderTarget;
-};
-
-}
-#endif // LIBANGLE_RENDERER_D3D_D3D9_SWAPCHAIN9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp
deleted file mode 100644
index 6404af6bba..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp
+++ /dev/null
@@ -1,647 +0,0 @@
-//
-// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// TextureStorage9.cpp: Implements the abstract rx::TextureStorage9 class and its concrete derived
-// classes TextureStorage9_2D and TextureStorage9_Cube, which act as the interface to the
-// D3D9 texture.
-
-#include "libANGLE/renderer/d3d/d3d9/TextureStorage9.h"
-
-#include "libANGLE/formatutils.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/renderer/d3d/EGLImageD3D.h"
-#include "libANGLE/renderer/d3d/TextureD3D.h"
-#include "libANGLE/renderer/d3d/d3d9/formatutils9.h"
-#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h"
-#include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
-#include "libANGLE/renderer/d3d/d3d9/RenderTarget9.h"
-#include "libANGLE/renderer/d3d/d3d9/SwapChain9.h"
-
-namespace rx
-{
-TextureStorage9::TextureStorage9(Renderer9 *renderer, DWORD usage)
- : mTopLevel(0),
- mMipLevels(0),
- mTextureWidth(0),
- mTextureHeight(0),
- mInternalFormat(GL_NONE),
- mTextureFormat(D3DFMT_UNKNOWN),
- mRenderer(renderer),
- mD3DUsage(usage),
- mD3DPool(mRenderer->getTexturePool(usage))
-{
-}
-
-TextureStorage9::~TextureStorage9()
-{
-}
-
-DWORD TextureStorage9::GetTextureUsage(GLenum internalformat, bool renderTarget)
-{
- DWORD d3dusage = 0;
-
- const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(internalformat);
- const d3d9::TextureFormat &d3dFormatInfo = d3d9::GetTextureFormatInfo(internalformat);
- if (formatInfo.depthBits > 0 || formatInfo.stencilBits > 0)
- {
- d3dusage |= D3DUSAGE_DEPTHSTENCIL;
- }
- else if (renderTarget && (d3dFormatInfo.renderFormat != D3DFMT_UNKNOWN))
- {
- d3dusage |= D3DUSAGE_RENDERTARGET;
- }
-
- return d3dusage;
-}
-
-
-bool TextureStorage9::isRenderTarget() const
-{
- return (mD3DUsage & (D3DUSAGE_RENDERTARGET | D3DUSAGE_DEPTHSTENCIL)) != 0;
-}
-
-bool TextureStorage9::isManaged() const
-{
- return (mD3DPool == D3DPOOL_MANAGED);
-}
-
-bool TextureStorage9::supportsNativeMipmapFunction() const
-{
- return false;
-}
-
-D3DPOOL TextureStorage9::getPool() const
-{
- return mD3DPool;
-}
-
-DWORD TextureStorage9::getUsage() const
-{
- return mD3DUsage;
-}
-
-int TextureStorage9::getTopLevel() const
-{
- return mTopLevel;
-}
-
-int TextureStorage9::getLevelCount() const
-{
- return static_cast<int>(mMipLevels) - mTopLevel;
-}
-
-gl::Error TextureStorage9::setData(const gl::Context *context,
- const gl::ImageIndex &index,
- ImageD3D *image,
- const gl::Box *destBox,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixelData)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-TextureStorage9_2D::TextureStorage9_2D(Renderer9 *renderer, SwapChain9 *swapchain)
- : TextureStorage9(renderer, D3DUSAGE_RENDERTARGET)
-{
- IDirect3DTexture9 *surfaceTexture = swapchain->getOffscreenTexture();
- mTexture = surfaceTexture;
- mMipLevels = surfaceTexture->GetLevelCount();
-
- mInternalFormat = swapchain->getRenderTargetInternalFormat();
-
- D3DSURFACE_DESC surfaceDesc;
- surfaceTexture->GetLevelDesc(0, &surfaceDesc);
- mTextureWidth = surfaceDesc.Width;
- mTextureHeight = surfaceDesc.Height;
- mTextureFormat = surfaceDesc.Format;
-
- mRenderTargets.resize(mMipLevels, nullptr);
-}
-
-TextureStorage9_2D::TextureStorage9_2D(Renderer9 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels)
- : TextureStorage9(renderer, GetTextureUsage(internalformat, renderTarget))
-{
- mTexture = nullptr;
-
- mInternalFormat = internalformat;
-
- const d3d9::TextureFormat &d3dFormatInfo = d3d9::GetTextureFormatInfo(internalformat);
- mTextureFormat = d3dFormatInfo.texFormat;
-
- d3d9::MakeValidSize(false, d3dFormatInfo.texFormat, &width, &height, &mTopLevel);
- mTextureWidth = width;
- mTextureHeight = height;
- mMipLevels = mTopLevel + levels;
-
- mRenderTargets.resize(levels, nullptr);
-}
-
-TextureStorage9_2D::~TextureStorage9_2D()
-{
- SafeRelease(mTexture);
- for (RenderTargetD3D *renderTarget : mRenderTargets)
- {
- SafeDelete(renderTarget);
- }
-}
-
-// Increments refcount on surface.
-// caller must Release() the returned surface
-gl::Error TextureStorage9_2D::getSurfaceLevel(const gl::Context *context,
- GLenum target,
- int level,
- bool dirty,
- IDirect3DSurface9 **outSurface)
-{
- ASSERT(target == GL_TEXTURE_2D);
-
- IDirect3DBaseTexture9 *baseTexture = nullptr;
- gl::Error error = getBaseTexture(context, &baseTexture);
- if (error.isError())
- {
- return error;
- }
-
- IDirect3DTexture9 *texture = static_cast<IDirect3DTexture9*>(baseTexture);
-
- HRESULT result = texture->GetSurfaceLevel(level + mTopLevel, outSurface);
-
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to get the surface from a texture, "
- << gl::FmtHR(result);
- }
-
- // With managed textures the driver needs to be informed of updates to the lower mipmap levels
- if (level + mTopLevel != 0 && isManaged() && dirty)
- {
- texture->AddDirtyRect(nullptr);
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage9_2D::getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT)
-{
- ASSERT(index.mipIndex < getLevelCount());
-
- if (!mRenderTargets[index.mipIndex] && isRenderTarget())
- {
- IDirect3DBaseTexture9 *baseTexture = nullptr;
- gl::Error error = getBaseTexture(context, &baseTexture);
- if (error.isError())
- {
- return error;
- }
-
- IDirect3DSurface9 *surface = nullptr;
- error = getSurfaceLevel(context, GL_TEXTURE_2D, index.mipIndex, false, &surface);
- if (error.isError())
- {
- return error;
- }
-
- size_t textureMipLevel = mTopLevel + index.mipIndex;
- size_t mipWidth = std::max<size_t>(mTextureWidth >> textureMipLevel, 1u);
- size_t mipHeight = std::max<size_t>(mTextureHeight >> textureMipLevel, 1u);
-
- baseTexture->AddRef();
- mRenderTargets[index.mipIndex] = new TextureRenderTarget9(
- baseTexture, textureMipLevel, surface, mInternalFormat, static_cast<GLsizei>(mipWidth),
- static_cast<GLsizei>(mipHeight), 1, 0);
- }
-
- ASSERT(outRT);
- *outRT = mRenderTargets[index.mipIndex];
- return gl::NoError();
-}
-
-gl::Error TextureStorage9_2D::generateMipmap(const gl::Context *context,
- const gl::ImageIndex &sourceIndex,
- const gl::ImageIndex &destIndex)
-{
- IDirect3DSurface9 *upper = nullptr;
- gl::Error error = getSurfaceLevel(context, GL_TEXTURE_2D, sourceIndex.mipIndex, false, &upper);
- if (error.isError())
- {
- return error;
- }
-
- IDirect3DSurface9 *lower = nullptr;
- error = getSurfaceLevel(context, GL_TEXTURE_2D, destIndex.mipIndex, true, &lower);
- if (error.isError())
- {
- SafeRelease(upper);
- return error;
- }
-
- ASSERT(upper && lower);
- error = mRenderer->boxFilter(upper, lower);
-
- SafeRelease(upper);
- SafeRelease(lower);
-
- return error;
-}
-
-gl::Error TextureStorage9_2D::getBaseTexture(const gl::Context *context,
- IDirect3DBaseTexture9 **outTexture)
-{
- // if the width or height is not positive this should be treated as an incomplete texture
- // we handle that here by skipping the d3d texture creation
- if (mTexture == nullptr && mTextureWidth > 0 && mTextureHeight > 0)
- {
- ASSERT(mMipLevels > 0);
-
- IDirect3DDevice9 *device = mRenderer->getDevice();
- HRESULT result = device->CreateTexture(static_cast<unsigned int>(mTextureWidth),
- static_cast<unsigned int>(mTextureHeight),
- static_cast<unsigned int>(mMipLevels), getUsage(),
- mTextureFormat, getPool(), &mTexture, nullptr);
-
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::OutOfMemory()
- << "Failed to create 2D storage texture, " << gl::FmtHR(result);
- }
- }
-
- *outTexture = mTexture;
- return gl::NoError();
-}
-
-gl::Error TextureStorage9_2D::copyToStorage(const gl::Context *context, TextureStorage *destStorage)
-{
- ASSERT(destStorage);
-
- TextureStorage9_2D *dest9 = GetAs<TextureStorage9_2D>(destStorage);
-
- int levels = getLevelCount();
- for (int i = 0; i < levels; ++i)
- {
- IDirect3DSurface9 *srcSurf = nullptr;
- gl::Error error = getSurfaceLevel(context, GL_TEXTURE_2D, i, false, &srcSurf);
- if (error.isError())
- {
- return error;
- }
-
- IDirect3DSurface9 *dstSurf = nullptr;
- error = dest9->getSurfaceLevel(context, GL_TEXTURE_2D, i, true, &dstSurf);
- if (error.isError())
- {
- SafeRelease(srcSurf);
- return error;
- }
-
- error = mRenderer->copyToRenderTarget(dstSurf, srcSurf, isManaged());
-
- SafeRelease(srcSurf);
- SafeRelease(dstSurf);
-
- if (error.isError())
- {
- return error;
- }
- }
-
- return gl::NoError();
-}
-
-TextureStorage9_EGLImage::TextureStorage9_EGLImage(Renderer9 *renderer,
- EGLImageD3D *image,
- RenderTarget9 *renderTarget9)
- : TextureStorage9(renderer, D3DUSAGE_RENDERTARGET), mImage(image)
-{
- mInternalFormat = renderTarget9->getInternalFormat();
- mTextureFormat = renderTarget9->getD3DFormat();
- mTextureWidth = renderTarget9->getWidth();
- mTextureHeight = renderTarget9->getHeight();
- mTopLevel = static_cast<int>(renderTarget9->getTextureLevel());
- mMipLevels = mTopLevel + 1;
-}
-
-TextureStorage9_EGLImage::~TextureStorage9_EGLImage()
-{
-}
-
-gl::Error TextureStorage9_EGLImage::getSurfaceLevel(const gl::Context *context,
- GLenum target,
- int level,
- bool,
- IDirect3DSurface9 **outSurface)
-{
- ASSERT(target == GL_TEXTURE_2D);
- ASSERT(level == 0);
-
- RenderTargetD3D *renderTargetD3D = nullptr;
- gl::Error error = mImage->getRenderTarget(context, &renderTargetD3D);
- if (error.isError())
- {
- return error;
- }
-
- RenderTarget9 *renderTarget9 = GetAs<RenderTarget9>(renderTargetD3D);
-
- *outSurface = renderTarget9->getSurface();
- return gl::NoError();
-}
-
-gl::Error TextureStorage9_EGLImage::getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT)
-{
- ASSERT(!index.hasLayer());
- ASSERT(index.mipIndex == 0);
-
- return mImage->getRenderTarget(context, outRT);
-}
-
-gl::Error TextureStorage9_EGLImage::getBaseTexture(const gl::Context *context,
- IDirect3DBaseTexture9 **outTexture)
-{
- RenderTargetD3D *renderTargetD3D = nullptr;
- gl::Error error = mImage->getRenderTarget(context, &renderTargetD3D);
- if (error.isError())
- {
- return error;
- }
-
- RenderTarget9 *renderTarget9 = GetAs<RenderTarget9>(renderTargetD3D);
- *outTexture = renderTarget9->getTexture();
- ASSERT(*outTexture != nullptr);
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage9_EGLImage::generateMipmap(const gl::Context *context,
- const gl::ImageIndex &,
- const gl::ImageIndex &)
-{
- UNREACHABLE();
- return gl::InternalError();
-}
-
-gl::Error TextureStorage9_EGLImage::copyToStorage(const gl::Context *context,
- TextureStorage *destStorage)
-{
- ASSERT(destStorage);
- ASSERT(getLevelCount() == 1);
-
- TextureStorage9 *dest9 = GetAs<TextureStorage9>(destStorage);
-
- IDirect3DBaseTexture9 *destBaseTexture9 = nullptr;
- gl::Error error = dest9->getBaseTexture(context, &destBaseTexture9);
- if (error.isError())
- {
- return error;
- }
-
- IDirect3DTexture9 *destTexture9 = static_cast<IDirect3DTexture9 *>(destBaseTexture9);
-
- IDirect3DSurface9 *destSurface = nullptr;
- HRESULT result = destTexture9->GetSurfaceLevel(destStorage->getTopLevel(), &destSurface);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to get the surface from a texture, "
- << gl::FmtHR(result);
- }
-
- RenderTargetD3D *sourceRenderTarget = nullptr;
- error = mImage->getRenderTarget(context, &sourceRenderTarget);
- if (error.isError())
- {
- SafeRelease(destSurface);
- return error;
- }
-
- RenderTarget9 *sourceRenderTarget9 = GetAs<RenderTarget9>(sourceRenderTarget);
- error =
- mRenderer->copyToRenderTarget(destSurface, sourceRenderTarget9->getSurface(), isManaged());
- if (error.isError())
- {
- SafeRelease(destSurface);
- return error;
- }
-
- if (destStorage->getTopLevel() != 0)
- {
- destTexture9->AddDirtyRect(nullptr);
- }
-
- SafeRelease(destSurface);
- return gl::NoError();
-}
-
-TextureStorage9_Cube::TextureStorage9_Cube(Renderer9 *renderer, GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly)
- : TextureStorage9(renderer, GetTextureUsage(internalformat, renderTarget))
-{
- mTexture = nullptr;
- for (size_t i = 0; i < gl::CUBE_FACE_COUNT; ++i)
- {
- mRenderTarget[i] = nullptr;
- }
-
- mInternalFormat = internalformat;
-
- const d3d9::TextureFormat &d3dFormatInfo = d3d9::GetTextureFormatInfo(internalformat);
- mTextureFormat = d3dFormatInfo.texFormat;
-
- int height = size;
- d3d9::MakeValidSize(false, d3dFormatInfo.texFormat, &size, &height, &mTopLevel);
- mTextureWidth = size;
- mTextureHeight = size;
- mMipLevels = mTopLevel + levels;
-}
-
-TextureStorage9_Cube::~TextureStorage9_Cube()
-{
- SafeRelease(mTexture);
-
- for (size_t i = 0; i < gl::CUBE_FACE_COUNT; ++i)
- {
- SafeDelete(mRenderTarget[i]);
- }
-}
-
-// Increments refcount on surface.
-// caller must Release() the returned surface
-gl::Error TextureStorage9_Cube::getSurfaceLevel(const gl::Context *context,
- GLenum target,
- int level,
- bool dirty,
- IDirect3DSurface9 **outSurface)
-{
- IDirect3DBaseTexture9 *baseTexture = nullptr;
- gl::Error error = getBaseTexture(context, &baseTexture);
- if (error.isError())
- {
- return error;
- }
-
- IDirect3DCubeTexture9 *texture = static_cast<IDirect3DCubeTexture9*>(baseTexture);
-
- D3DCUBEMAP_FACES face = gl_d3d9::ConvertCubeFace(target);
- HRESULT result = texture->GetCubeMapSurface(face, level, outSurface);
-
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to get the surface from a texture, "
- << gl::FmtHR(result);
- }
-
- // With managed textures the driver needs to be informed of updates to the lower mipmap levels
- if (level != 0 && isManaged() && dirty)
- {
- texture->AddDirtyRect(face, nullptr);
- }
-
- return gl::NoError();
-}
-
-gl::Error TextureStorage9_Cube::getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT)
-{
- ASSERT(outRT);
- ASSERT(index.mipIndex == 0);
- ASSERT(index.layerIndex >= 0 && static_cast<size_t>(index.layerIndex) < gl::CUBE_FACE_COUNT);
-
- if (mRenderTarget[index.layerIndex] == nullptr && isRenderTarget())
- {
- IDirect3DBaseTexture9 *baseTexture = nullptr;
- gl::Error error = getBaseTexture(context, &baseTexture);
- if (error.isError())
- {
- return error;
- }
-
- IDirect3DSurface9 *surface = nullptr;
- error = getSurfaceLevel(context, GL_TEXTURE_CUBE_MAP_POSITIVE_X + index.layerIndex,
- mTopLevel + index.mipIndex, false, &surface);
- if (error.isError())
- {
- return error;
- }
-
- baseTexture->AddRef();
- mRenderTarget[index.layerIndex] = new TextureRenderTarget9(
- baseTexture, mTopLevel + index.mipIndex, surface, mInternalFormat,
- static_cast<GLsizei>(mTextureWidth), static_cast<GLsizei>(mTextureHeight), 1, 0);
- }
-
- *outRT = mRenderTarget[index.layerIndex];
- return gl::NoError();
-}
-
-gl::Error TextureStorage9_Cube::generateMipmap(const gl::Context *context,
- const gl::ImageIndex &sourceIndex,
- const gl::ImageIndex &destIndex)
-{
- IDirect3DSurface9 *upper = nullptr;
- gl::Error error =
- getSurfaceLevel(context, sourceIndex.type, sourceIndex.mipIndex, false, &upper);
- if (error.isError())
- {
- return error;
- }
-
- IDirect3DSurface9 *lower = nullptr;
- error = getSurfaceLevel(context, destIndex.type, destIndex.mipIndex, true, &lower);
- if (error.isError())
- {
- SafeRelease(upper);
- return error;
- }
-
- ASSERT(upper && lower);
- error = mRenderer->boxFilter(upper, lower);
-
- SafeRelease(upper);
- SafeRelease(lower);
-
- return error;
-}
-
-gl::Error TextureStorage9_Cube::getBaseTexture(const gl::Context *context,
- IDirect3DBaseTexture9 **outTexture)
-{
- // if the size is not positive this should be treated as an incomplete texture
- // we handle that here by skipping the d3d texture creation
- if (mTexture == nullptr && mTextureWidth > 0 && mTextureHeight > 0)
- {
- ASSERT(mMipLevels > 0);
- ASSERT(mTextureWidth == mTextureHeight);
-
- IDirect3DDevice9 *device = mRenderer->getDevice();
- HRESULT result = device->CreateCubeTexture(
- static_cast<unsigned int>(mTextureWidth), static_cast<unsigned int>(mMipLevels),
- getUsage(), mTextureFormat, getPool(), &mTexture, nullptr);
-
- if (FAILED(result))
- {
- ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::OutOfMemory()
- << "Failed to create cube storage texture, " << gl::FmtHR(result);
- }
- }
-
- *outTexture = mTexture;
- return gl::NoError();
-}
-
-gl::Error TextureStorage9_Cube::copyToStorage(const gl::Context *context,
- TextureStorage *destStorage)
-{
- ASSERT(destStorage);
-
- TextureStorage9_Cube *dest9 = GetAs<TextureStorage9_Cube>(destStorage);
-
- int levels = getLevelCount();
- for (int f = 0; f < static_cast<int>(gl::CUBE_FACE_COUNT); f++)
- {
- for (int i = 0; i < levels; i++)
- {
- IDirect3DSurface9 *srcSurf = nullptr;
- gl::Error error =
- getSurfaceLevel(context, GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, false, &srcSurf);
- if (error.isError())
- {
- return error;
- }
-
- IDirect3DSurface9 *dstSurf = nullptr;
- error = dest9->getSurfaceLevel(context, GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, true,
- &dstSurf);
- if (error.isError())
- {
- SafeRelease(srcSurf);
- return error;
- }
-
- error = mRenderer->copyToRenderTarget(dstSurf, srcSurf, isManaged());
-
- SafeRelease(srcSurf);
- SafeRelease(dstSurf);
-
- if (error.isError())
- {
- return error;
- }
- }
- }
-
- return gl::NoError();
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h
deleted file mode 100644
index 2f51901931..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h
+++ /dev/null
@@ -1,154 +0,0 @@
-//
-// Copyright (c) 2012-2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// TextureStorage9.h: Defines the abstract rx::TextureStorage9 class and its concrete derived
-// classes TextureStorage9_2D and TextureStorage9_Cube, which act as the interface to the
-// D3D9 texture.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_TEXTURESTORAGE9_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_TEXTURESTORAGE9_H_
-
-#include "libANGLE/renderer/d3d/TextureStorage.h"
-#include "common/debug.h"
-
-namespace rx
-{
-class EGLImageD3D;
-class Renderer9;
-class SwapChain9;
-class RenderTargetD3D;
-class RenderTarget9;
-
-class TextureStorage9 : public TextureStorage
-{
- public:
- ~TextureStorage9() override;
-
- static DWORD GetTextureUsage(GLenum internalformat, bool renderTarget);
-
- D3DPOOL getPool() const;
- DWORD getUsage() const;
-
- virtual gl::Error getSurfaceLevel(const gl::Context *context,
- GLenum target,
- int level,
- bool dirty,
- IDirect3DSurface9 **outSurface) = 0;
- virtual gl::Error getBaseTexture(const gl::Context *context,
- IDirect3DBaseTexture9 **outTexture) = 0;
-
- int getTopLevel() const override;
- bool isRenderTarget() const override;
- bool isManaged() const override;
- bool supportsNativeMipmapFunction() const override;
- int getLevelCount() const override;
-
- gl::Error setData(const gl::Context *context,
- const gl::ImageIndex &index,
- ImageD3D *image,
- const gl::Box *destBox,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixelData) override;
-
- protected:
- int mTopLevel;
- size_t mMipLevels;
- size_t mTextureWidth;
- size_t mTextureHeight;
- GLenum mInternalFormat;
- D3DFORMAT mTextureFormat;
-
- Renderer9 *mRenderer;
-
- TextureStorage9(Renderer9 *renderer, DWORD usage);
-
- private:
- const DWORD mD3DUsage;
- const D3DPOOL mD3DPool;
-};
-
-class TextureStorage9_2D : public TextureStorage9
-{
- public:
- TextureStorage9_2D(Renderer9 *renderer, SwapChain9 *swapchain);
- TextureStorage9_2D(Renderer9 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels);
- ~TextureStorage9_2D() override;
-
- gl::Error getSurfaceLevel(const gl::Context *context,
- GLenum target,
- int level,
- bool dirty,
- IDirect3DSurface9 **outSurface) override;
- gl::Error getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT) override;
- gl::Error getBaseTexture(const gl::Context *context,
- IDirect3DBaseTexture9 **outTexture) override;
- gl::Error generateMipmap(const gl::Context *context,
- const gl::ImageIndex &sourceIndex,
- const gl::ImageIndex &destIndex) override;
- gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
-
- private:
- IDirect3DTexture9 *mTexture;
- std::vector<RenderTarget9 *> mRenderTargets;
-};
-
-class TextureStorage9_EGLImage final : public TextureStorage9
-{
- public:
- TextureStorage9_EGLImage(Renderer9 *renderer, EGLImageD3D *image, RenderTarget9 *renderTarget9);
- ~TextureStorage9_EGLImage() override;
-
- gl::Error getSurfaceLevel(const gl::Context *context,
- GLenum target,
- int level,
- bool dirty,
- IDirect3DSurface9 **outSurface) override;
- gl::Error getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT) override;
- gl::Error getBaseTexture(const gl::Context *context,
- IDirect3DBaseTexture9 **outTexture) override;
- gl::Error generateMipmap(const gl::Context *context,
- const gl::ImageIndex &sourceIndex,
- const gl::ImageIndex &destIndex) override;
- gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
-
- private:
- EGLImageD3D *mImage;
-};
-
-class TextureStorage9_Cube : public TextureStorage9
-{
- public:
- TextureStorage9_Cube(Renderer9 *renderer, GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly);
- ~TextureStorage9_Cube() override;
-
- gl::Error getSurfaceLevel(const gl::Context *context,
- GLenum target,
- int level,
- bool dirty,
- IDirect3DSurface9 **outSurface) override;
- gl::Error getRenderTarget(const gl::Context *context,
- const gl::ImageIndex &index,
- RenderTargetD3D **outRT) override;
- gl::Error getBaseTexture(const gl::Context *context,
- IDirect3DBaseTexture9 **outTexture) override;
- gl::Error generateMipmap(const gl::Context *context,
- const gl::ImageIndex &sourceIndex,
- const gl::ImageIndex &destIndex) override;
- gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
-
- private:
- IDirect3DCubeTexture9 *mTexture;
- RenderTarget9 *mRenderTarget[gl::CUBE_FACE_COUNT];
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_TEXTURESTORAGE9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexArray9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexArray9.h
deleted file mode 100644
index 0f4410b8de..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexArray9.h
+++ /dev/null
@@ -1,46 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// VertexArray9.h: Defines the rx::VertexArray9 class which implements rx::VertexArrayImpl.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_VERTEXARRAY9_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_VERTEXARRAY9_H_
-
-#include "libANGLE/Context.h"
-#include "libANGLE/renderer/VertexArrayImpl.h"
-#include "libANGLE/renderer/d3d/d3d9/Context9.h"
-#include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
-
-namespace rx
-{
-class Renderer9;
-
-class VertexArray9 : public VertexArrayImpl
-{
- public:
- VertexArray9(const gl::VertexArrayState &data) : VertexArrayImpl(data) {}
-
- void syncState(const gl::Context *context,
- const gl::VertexArray::DirtyBits &dirtyBits) override;
-
- ~VertexArray9() override {}
-
- Serial getCurrentStateSerial() const { return mCurrentStateSerial; }
-
- private:
- Serial mCurrentStateSerial;
-};
-
-inline void VertexArray9::syncState(const gl::Context *context,
- const gl::VertexArray::DirtyBits &dirtyBits)
-{
- ASSERT(dirtyBits.any());
- Renderer9 *renderer = GetImplAs<Context9>(context)->getRenderer();
- mCurrentStateSerial = renderer->generateSerial();
-}
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_VERTEXARRAY9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp
deleted file mode 100644
index c0b80a847c..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp
+++ /dev/null
@@ -1,169 +0,0 @@
-//
-// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// VertexBuffer9.cpp: Defines the D3D9 VertexBuffer implementation.
-
-#include "libANGLE/renderer/d3d/d3d9/VertexBuffer9.h"
-#include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
-#include "libANGLE/renderer/d3d/d3d9/formatutils9.h"
-#include "libANGLE/renderer/d3d/d3d9/vertexconversion.h"
-#include "libANGLE/renderer/d3d/BufferD3D.h"
-#include "libANGLE/VertexAttribute.h"
-#include "libANGLE/Buffer.h"
-
-namespace rx
-{
-
-VertexBuffer9::VertexBuffer9(Renderer9 *renderer) : mRenderer(renderer)
-{
- mVertexBuffer = nullptr;
- mBufferSize = 0;
- mDynamicUsage = false;
-}
-
-VertexBuffer9::~VertexBuffer9()
-{
- SafeRelease(mVertexBuffer);
-}
-
-gl::Error VertexBuffer9::initialize(unsigned int size, bool dynamicUsage)
-{
- SafeRelease(mVertexBuffer);
-
- updateSerial();
-
- if (size > 0)
- {
- DWORD flags = D3DUSAGE_WRITEONLY;
- if (dynamicUsage)
- {
- flags |= D3DUSAGE_DYNAMIC;
- }
-
- HRESULT result = mRenderer->createVertexBuffer(size, flags, &mVertexBuffer);
-
- if (FAILED(result))
- {
- return gl::OutOfMemory()
- << "Failed to allocate internal vertex buffer of size " << size;
- }
- }
-
- mBufferSize = size;
- mDynamicUsage = dynamicUsage;
- return gl::NoError();
-}
-
-gl::Error VertexBuffer9::storeVertexAttributes(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding,
- GLenum currentValueType,
- GLint start,
- GLsizei count,
- GLsizei instances,
- unsigned int offset,
- const uint8_t *sourceData)
-{
- if (!mVertexBuffer)
- {
- return gl::OutOfMemory() << "Internal vertex buffer is not initialized.";
- }
-
- int inputStride = static_cast<int>(gl::ComputeVertexAttributeStride(attrib, binding));
- int elementSize = static_cast<int>(gl::ComputeVertexAttributeTypeSize(attrib));
-
- DWORD lockFlags = mDynamicUsage ? D3DLOCK_NOOVERWRITE : 0;
-
- uint8_t *mapPtr = nullptr;
-
- auto errorOrMapSize = mRenderer->getVertexSpaceRequired(attrib, binding, count, instances);
- if (errorOrMapSize.isError())
- {
- return errorOrMapSize.getError();
- }
-
- unsigned int mapSize = errorOrMapSize.getResult();
-
- HRESULT result = mVertexBuffer->Lock(offset, mapSize, reinterpret_cast<void**>(&mapPtr), lockFlags);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to lock internal vertex buffer, " << gl::FmtHR(result);
- }
-
- const uint8_t *input = sourceData;
-
- if (instances == 0 || binding.getDivisor() == 0)
- {
- input += inputStride * start;
- }
-
- gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib, currentValueType);
- const d3d9::VertexFormat &d3dVertexInfo = d3d9::GetVertexFormatInfo(mRenderer->getCapsDeclTypes(), vertexFormatType);
- bool needsConversion = (d3dVertexInfo.conversionType & VERTEX_CONVERT_CPU) > 0;
-
- if (!needsConversion && inputStride == elementSize)
- {
- size_t copySize = static_cast<size_t>(count) * static_cast<size_t>(inputStride);
- memcpy(mapPtr, input, copySize);
- }
- else
- {
- d3dVertexInfo.copyFunction(input, inputStride, count, mapPtr);
- }
-
- mVertexBuffer->Unlock();
-
- return gl::NoError();
-}
-
-unsigned int VertexBuffer9::getBufferSize() const
-{
- return mBufferSize;
-}
-
-gl::Error VertexBuffer9::setBufferSize(unsigned int size)
-{
- if (size > mBufferSize)
- {
- return initialize(size, mDynamicUsage);
- }
- else
- {
- return gl::NoError();
- }
-}
-
-gl::Error VertexBuffer9::discard()
-{
- if (!mVertexBuffer)
- {
- return gl::OutOfMemory() << "Internal vertex buffer is not initialized.";
- }
-
- void *dummy;
- HRESULT result;
-
- result = mVertexBuffer->Lock(0, 1, &dummy, D3DLOCK_DISCARD);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to lock internal buffer for discarding, "
- << gl::FmtHR(result);
- }
-
- result = mVertexBuffer->Unlock();
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to unlock internal buffer for discarding, "
- << gl::FmtHR(result);
- }
-
- return gl::NoError();
-}
-
-IDirect3DVertexBuffer9 * VertexBuffer9::getBuffer() const
-{
- return mVertexBuffer;
-}
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.h
deleted file mode 100644
index 983616f4e4..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.h
+++ /dev/null
@@ -1,53 +0,0 @@
-//
-// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// VertexBuffer9.h: Defines the D3D9 VertexBuffer implementation.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_VERTEXBUFFER9_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_VERTEXBUFFER9_H_
-
-#include "libANGLE/renderer/d3d/VertexBuffer.h"
-
-namespace rx
-{
-class Renderer9;
-
-class VertexBuffer9 : public VertexBuffer
-{
- public:
- explicit VertexBuffer9(Renderer9 *renderer);
-
- gl::Error initialize(unsigned int size, bool dynamicUsage) override;
-
- // Warning: you should ensure binding really matches attrib.bindingIndex before using this
- // function.
- gl::Error storeVertexAttributes(const gl::VertexAttribute &attrib,
- const gl::VertexBinding &binding,
- GLenum currentValueType,
- GLint start,
- GLsizei count,
- GLsizei instances,
- unsigned int offset,
- const uint8_t *sourceData) override;
-
- unsigned int getBufferSize() const override;
- gl::Error setBufferSize(unsigned int size) override;
- gl::Error discard() override;
-
- IDirect3DVertexBuffer9 *getBuffer() const;
-
- private:
- ~VertexBuffer9() override;
- Renderer9 *mRenderer;
-
- IDirect3DVertexBuffer9 *mVertexBuffer;
- unsigned int mBufferSize;
- bool mDynamicUsage;
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_VERTEXBUFFER9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp
deleted file mode 100644
index abadf5c0b5..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp
+++ /dev/null
@@ -1,257 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// VertexDeclarationCache.cpp: Implements a helper class to construct and cache vertex declarations.
-
-#include "libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h"
-
-#include "libANGLE/VertexAttribute.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/d3d/ProgramD3D.h"
-#include "libANGLE/renderer/d3d/d3d9/VertexBuffer9.h"
-#include "libANGLE/renderer/d3d/d3d9/formatutils9.h"
-
-namespace rx
-{
-
-VertexDeclarationCache::VertexDeclarationCache() : mMaxLru(0)
-{
- for (int i = 0; i < NUM_VERTEX_DECL_CACHE_ENTRIES; i++)
- {
- mVertexDeclCache[i].vertexDeclaration = nullptr;
- mVertexDeclCache[i].lruCount = 0;
- }
-
- for (int i = 0; i < gl::MAX_VERTEX_ATTRIBS; i++)
- {
- mAppliedVBs[i].serial = 0;
- }
-
- mLastSetVDecl = nullptr;
- mInstancingEnabled = true;
-}
-
-VertexDeclarationCache::~VertexDeclarationCache()
-{
- for (int i = 0; i < NUM_VERTEX_DECL_CACHE_ENTRIES; i++)
- {
- SafeRelease(mVertexDeclCache[i].vertexDeclaration);
- }
-}
-
-gl::Error VertexDeclarationCache::applyDeclaration(
- IDirect3DDevice9 *device,
- const std::vector<TranslatedAttribute> &attributes,
- gl::Program *program,
- GLint start,
- GLsizei instances,
- GLsizei *repeatDraw)
-{
- ASSERT(gl::MAX_VERTEX_ATTRIBS >= attributes.size());
-
- *repeatDraw = 1;
-
- const size_t invalidAttribIndex = attributes.size();
- size_t indexedAttribute = invalidAttribIndex;
- size_t instancedAttribute = invalidAttribIndex;
-
- if (instances == 0)
- {
- for (size_t i = 0; i < attributes.size(); ++i)
- {
- if (attributes[i].divisor != 0)
- {
- // If a divisor is set, it still applies even if an instanced draw was not used, so treat
- // as a single-instance draw.
- instances = 1;
- break;
- }
- }
- }
-
- if (instances > 0)
- {
- // Find an indexed attribute to be mapped to D3D stream 0
- for (size_t i = 0; i < attributes.size(); i++)
- {
- if (attributes[i].active)
- {
- if (indexedAttribute == invalidAttribIndex && attributes[i].divisor == 0)
- {
- indexedAttribute = i;
- }
- else if (instancedAttribute == invalidAttribIndex && attributes[i].divisor != 0)
- {
- instancedAttribute = i;
- }
- if (indexedAttribute != invalidAttribIndex && instancedAttribute != invalidAttribIndex)
- break; // Found both an indexed and instanced attribute
- }
- }
-
- // The validation layer checks that there is at least one active attribute with a zero divisor as per
- // the GL_ANGLE_instanced_arrays spec.
- ASSERT(indexedAttribute != invalidAttribIndex);
- }
-
- D3DCAPS9 caps;
- device->GetDeviceCaps(&caps);
-
- D3DVERTEXELEMENT9 elements[gl::MAX_VERTEX_ATTRIBS + 1];
- D3DVERTEXELEMENT9 *element = &elements[0];
-
- ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
- const auto &semanticIndexes = programD3D->getAttribLocationToD3DSemantics();
-
- for (size_t i = 0; i < attributes.size(); i++)
- {
- if (attributes[i].active)
- {
- // Directly binding the storage buffer is not supported for d3d9
- ASSERT(attributes[i].storage == nullptr);
-
- int stream = static_cast<int>(i);
-
- if (instances > 0)
- {
- // Due to a bug on ATI cards we can't enable instancing when none of the attributes are instanced.
- if (instancedAttribute == invalidAttribIndex)
- {
- *repeatDraw = instances;
- }
- else
- {
- if (i == indexedAttribute)
- {
- stream = 0;
- }
- else if (i == 0)
- {
- stream = static_cast<int>(indexedAttribute);
- }
-
- UINT frequency = 1;
-
- if (attributes[i].divisor == 0)
- {
- frequency = D3DSTREAMSOURCE_INDEXEDDATA | instances;
- }
- else
- {
- frequency = D3DSTREAMSOURCE_INSTANCEDATA | attributes[i].divisor;
- }
-
- device->SetStreamSourceFreq(stream, frequency);
- mInstancingEnabled = true;
- }
- }
-
- VertexBuffer9 *vertexBuffer = GetAs<VertexBuffer9>(attributes[i].vertexBuffer.get());
-
- unsigned int offset = 0;
- ANGLE_TRY_RESULT(attributes[i].computeOffset(start), offset);
-
- if (mAppliedVBs[stream].serial != attributes[i].serial ||
- mAppliedVBs[stream].stride != attributes[i].stride ||
- mAppliedVBs[stream].offset != offset)
- {
- device->SetStreamSource(stream, vertexBuffer->getBuffer(), offset,
- attributes[i].stride);
- mAppliedVBs[stream].serial = attributes[i].serial;
- mAppliedVBs[stream].stride = attributes[i].stride;
- mAppliedVBs[stream].offset = offset;
- }
-
- gl::VertexFormatType vertexformatType =
- gl::GetVertexFormatType(*attributes[i].attribute, GL_FLOAT);
- const d3d9::VertexFormat &d3d9VertexInfo = d3d9::GetVertexFormatInfo(caps.DeclTypes, vertexformatType);
-
- element->Stream = static_cast<WORD>(stream);
- element->Offset = 0;
- element->Type = static_cast<BYTE>(d3d9VertexInfo.nativeFormat);
- element->Method = D3DDECLMETHOD_DEFAULT;
- element->Usage = D3DDECLUSAGE_TEXCOORD;
- element->UsageIndex = static_cast<BYTE>(semanticIndexes[i]);
- element++;
- }
- }
-
- if (instances == 0 || instancedAttribute == invalidAttribIndex)
- {
- if (mInstancingEnabled)
- {
- for (int i = 0; i < gl::MAX_VERTEX_ATTRIBS; i++)
- {
- device->SetStreamSourceFreq(i, 1);
- }
-
- mInstancingEnabled = false;
- }
- }
-
- static const D3DVERTEXELEMENT9 end = D3DDECL_END();
- *(element++) = end;
-
- for (int i = 0; i < NUM_VERTEX_DECL_CACHE_ENTRIES; i++)
- {
- VertexDeclCacheEntry *entry = &mVertexDeclCache[i];
- if (memcmp(entry->cachedElements, elements, (element - elements) * sizeof(D3DVERTEXELEMENT9)) == 0 && entry->vertexDeclaration)
- {
- entry->lruCount = ++mMaxLru;
- if(entry->vertexDeclaration != mLastSetVDecl)
- {
- device->SetVertexDeclaration(entry->vertexDeclaration);
- mLastSetVDecl = entry->vertexDeclaration;
- }
-
- return gl::NoError();
- }
- }
-
- VertexDeclCacheEntry *lastCache = mVertexDeclCache;
-
- for (int i = 0; i < NUM_VERTEX_DECL_CACHE_ENTRIES; i++)
- {
- if (mVertexDeclCache[i].lruCount < lastCache->lruCount)
- {
- lastCache = &mVertexDeclCache[i];
- }
- }
-
- if (lastCache->vertexDeclaration != nullptr)
- {
- SafeRelease(lastCache->vertexDeclaration);
- // mLastSetVDecl is set to the replacement, so we don't have to worry
- // about it.
- }
-
- memcpy(lastCache->cachedElements, elements, (element - elements) * sizeof(D3DVERTEXELEMENT9));
- HRESULT result = device->CreateVertexDeclaration(elements, &lastCache->vertexDeclaration);
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to create internal vertex declaration, "
- << gl::FmtHR(result);
- }
-
- device->SetVertexDeclaration(lastCache->vertexDeclaration);
- mLastSetVDecl = lastCache->vertexDeclaration;
- lastCache->lruCount = ++mMaxLru;
-
- return gl::NoError();
-}
-
-void VertexDeclarationCache::markStateDirty()
-{
- for (int i = 0; i < gl::MAX_VERTEX_ATTRIBS; i++)
- {
- mAppliedVBs[i].serial = 0;
- }
-
- mLastSetVDecl = nullptr;
- mInstancingEnabled = true; // Forces it to be disabled when not used
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h
deleted file mode 100644
index 7bd7cabae4..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h
+++ /dev/null
@@ -1,65 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// VertexDeclarationCache.h: Defines a helper class to construct and cache vertex declarations.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_VERTEXDECLARATIONCACHE_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_VERTEXDECLARATIONCACHE_H_
-
-#include "libANGLE/Error.h"
-#include "libANGLE/renderer/d3d/VertexDataManager.h"
-
-namespace gl
-{
-class VertexDataManager;
-class Program;
-}
-
-namespace rx
-{
-
-class VertexDeclarationCache
-{
- public:
- VertexDeclarationCache();
- ~VertexDeclarationCache();
-
- gl::Error applyDeclaration(IDirect3DDevice9 *device,
- const std::vector<TranslatedAttribute> &attributes,
- gl::Program *program,
- GLint start,
- GLsizei instances,
- GLsizei *repeatDraw);
-
- void markStateDirty();
-
- private:
- UINT mMaxLru;
-
- enum { NUM_VERTEX_DECL_CACHE_ENTRIES = 32 };
-
- struct VBData
- {
- unsigned int serial;
- unsigned int stride;
- unsigned int offset;
- };
-
- VBData mAppliedVBs[gl::MAX_VERTEX_ATTRIBS];
- IDirect3DVertexDeclaration9 *mLastSetVDecl;
- bool mInstancingEnabled;
-
- struct VertexDeclCacheEntry
- {
- D3DVERTEXELEMENT9 cachedElements[gl::MAX_VERTEX_ATTRIBS + 1];
- UINT lruCount;
- IDirect3DVertexDeclaration9 *vertexDeclaration;
- } mVertexDeclCache[NUM_VERTEX_DECL_CACHE_ENTRIES];
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_VERTEXDECLARATIONCACHE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/formatutils9.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/formatutils9.cpp
deleted file mode 100644
index d10fa1ee87..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/formatutils9.cpp
+++ /dev/null
@@ -1,652 +0,0 @@
-//
-// Copyright (c) 2013-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// formatutils9.cpp: Queries for GL image formats and their translations to D3D9
-// formats.
-
-#include "libANGLE/renderer/d3d/d3d9/formatutils9.h"
-
-#include "image_util/copyimage.h"
-#include "image_util/generatemip.h"
-#include "image_util/loadimage.h"
-
-#include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
-#include "libANGLE/renderer/d3d/d3d9/vertexconversion.h"
-
-using namespace angle;
-
-namespace rx
-{
-
-namespace d3d9
-{
-
-constexpr D3DFORMAT D3DFMT_INTZ = ((D3DFORMAT)(MAKEFOURCC('I', 'N', 'T', 'Z')));
-constexpr D3DFORMAT D3DFMT_NULL = ((D3DFORMAT)(MAKEFOURCC('N', 'U', 'L', 'L')));
-
-// A map to determine the pixel size and mip generation function of a given D3D format
-typedef std::map<D3DFORMAT, D3DFormat> D3D9FormatInfoMap;
-
-D3DFormat::D3DFormat()
- : pixelBytes(0),
- blockWidth(0),
- blockHeight(0),
- redBits(0),
- greenBits(0),
- blueBits(0),
- alphaBits(0),
- luminanceBits(0),
- depthBits(0),
- stencilBits(0),
- formatID(angle::Format::ID::NONE)
-{
-}
-
-D3DFormat::D3DFormat(GLuint bits,
- GLuint blockWidth,
- GLuint blockHeight,
- GLuint redBits,
- GLuint greenBits,
- GLuint blueBits,
- GLuint alphaBits,
- GLuint lumBits,
- GLuint depthBits,
- GLuint stencilBits,
- Format::ID formatID)
- : pixelBytes(bits / 8),
- blockWidth(blockWidth),
- blockHeight(blockHeight),
- redBits(redBits),
- greenBits(greenBits),
- blueBits(blueBits),
- alphaBits(alphaBits),
- luminanceBits(lumBits),
- depthBits(depthBits),
- stencilBits(stencilBits),
- formatID(formatID)
-{
-}
-
-const D3DFormat &GetD3DFormatInfo(D3DFORMAT format)
-{
- if (format == D3DFMT_NULL)
- {
- static const D3DFormat info(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Format::ID::NONE);
- return info;
- }
-
- if (format == D3DFMT_INTZ)
- {
- static const D3DFormat info(32, 1, 1, 0, 0, 0, 0, 0, 24, 8, Format::ID::D24_UNORM_S8_UINT);
- return info;
- }
-
- switch (format)
- {
- case D3DFMT_UNKNOWN:
- {
- static const D3DFormat info(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Format::ID::NONE);
- return info;
- }
-
- case D3DFMT_L8:
- {
- static const D3DFormat info(8, 1, 1, 0, 0, 0, 0, 8, 0, 0, Format::ID::L8_UNORM);
- return info;
- }
- case D3DFMT_A8:
- {
- static const D3DFormat info(8, 1, 1, 0, 0, 0, 8, 0, 0, 0, Format::ID::A8_UNORM);
- return info;
- }
- case D3DFMT_A8L8:
- {
- static const D3DFormat info(16, 1, 1, 0, 0, 0, 8, 8, 0, 0, Format::ID::L8A8_UNORM);
- return info;
- }
-
- case D3DFMT_A4R4G4B4:
- {
- static const D3DFormat info(16, 1, 1, 4, 4, 4, 4, 0, 0, 0, Format::ID::B4G4R4A4_UNORM);
- return info;
- }
- case D3DFMT_A1R5G5B5:
- {
- static const D3DFormat info(16, 1, 1, 5, 5, 5, 1, 0, 0, 0, Format::ID::B5G5R5A1_UNORM);
- return info;
- }
- case D3DFMT_R5G6B5:
- {
- static const D3DFormat info(16, 1, 1, 5, 6, 5, 0, 0, 0, 0, Format::ID::R5G6B5_UNORM);
- return info;
- }
- case D3DFMT_X8R8G8B8:
- {
- static const D3DFormat info(32, 1, 1, 8, 8, 8, 0, 0, 0, 0, Format::ID::B8G8R8X8_UNORM);
- return info;
- }
- case D3DFMT_A8R8G8B8:
- {
- static const D3DFormat info(32, 1, 1, 8, 8, 8, 8, 0, 0, 0, Format::ID::B8G8R8A8_UNORM);
- return info;
- }
-
- case D3DFMT_R16F:
- {
- static const D3DFormat info(16, 1, 1, 16, 0, 0, 0, 0, 0, 0, Format::ID::R16_FLOAT);
- return info;
- }
- case D3DFMT_G16R16F:
- {
- static const D3DFormat info(32, 1, 1, 16, 16, 0, 0, 0, 0, 0, Format::ID::R16G16_FLOAT);
- return info;
- }
- case D3DFMT_A16B16G16R16F:
- {
- static const D3DFormat info(64, 1, 1, 16, 16, 16, 16, 0, 0, 0,
- Format::ID::R16G16B16A16_FLOAT);
- return info;
- }
- case D3DFMT_R32F:
- {
- static const D3DFormat info(32, 1, 1, 32, 0, 0, 0, 0, 0, 0, Format::ID::R32_FLOAT);
- return info;
- }
- case D3DFMT_G32R32F:
- {
- static const D3DFormat info(64, 1, 1, 32, 32, 0, 0, 0, 0, 0, Format::ID::R32G32_FLOAT);
- return info;
- }
- case D3DFMT_A32B32G32R32F:
- {
- static const D3DFormat info(128, 1, 1, 32, 32, 32, 32, 0, 0, 0,
- Format::ID::R32G32B32A32_FLOAT);
- return info;
- }
-
- case D3DFMT_D16:
- {
- static const D3DFormat info(16, 1, 1, 0, 0, 0, 0, 0, 16, 0, Format::ID::D16_UNORM);
- return info;
- }
- case D3DFMT_D24S8:
- {
- static const D3DFormat info(32, 1, 1, 0, 0, 0, 0, 0, 24, 8,
- Format::ID::D24_UNORM_S8_UINT);
- return info;
- }
- case D3DFMT_D24X8:
- {
- static const D3DFormat info(32, 1, 1, 0, 0, 0, 0, 0, 24, 0, Format::ID::D16_UNORM);
- return info;
- }
- case D3DFMT_D32:
- {
- static const D3DFormat info(32, 1, 1, 0, 0, 0, 0, 0, 32, 0, Format::ID::D32_UNORM);
- return info;
- }
-
- case D3DFMT_DXT1:
- {
- static const D3DFormat info(64, 4, 4, 0, 0, 0, 0, 0, 0, 0,
- Format::ID::BC1_RGBA_UNORM_BLOCK);
- return info;
- }
- case D3DFMT_DXT3:
- {
- static const D3DFormat info(128, 4, 4, 0, 0, 0, 0, 0, 0, 0,
- Format::ID::BC2_RGBA_UNORM_BLOCK);
- return info;
- }
- case D3DFMT_DXT5:
- {
- static const D3DFormat info(128, 4, 4, 0, 0, 0, 0, 0, 0, 0,
- Format::ID::BC3_RGBA_UNORM_BLOCK);
- return info;
- }
-
- default:
- {
- static const D3DFormat defaultInfo;
- return defaultInfo;
- }
- }
-}
-
-typedef std::pair<GLint, InitializeTextureDataFunction> InternalFormatInitialzerPair;
-typedef std::map<GLint, InitializeTextureDataFunction> InternalFormatInitialzerMap;
-
-static InternalFormatInitialzerMap BuildInternalFormatInitialzerMap()
-{
- using namespace angle; // For image initialization functions
-
- InternalFormatInitialzerMap map;
-
- map.insert(InternalFormatInitialzerPair(GL_RGB16F, Initialize4ComponentData<GLhalf, 0x0000, 0x0000, 0x0000, gl::Float16One>));
- map.insert(InternalFormatInitialzerPair(GL_RGB32F, Initialize4ComponentData<GLfloat, 0x00000000, 0x00000000, 0x00000000, gl::Float32One>));
-
- return map;
-}
-
-static void UnreachableLoad(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)
-{
- UNREACHABLE();
-}
-
-typedef std::pair<GLenum, TextureFormat> D3D9FormatPair;
-typedef std::map<GLenum, TextureFormat> D3D9FormatMap;
-
-TextureFormat::TextureFormat()
- : texFormat(D3DFMT_UNKNOWN),
- renderFormat(D3DFMT_UNKNOWN),
- dataInitializerFunction(nullptr),
- loadFunction(UnreachableLoad)
-{
-}
-
-static inline void InsertD3D9FormatInfo(D3D9FormatMap *map, GLenum internalFormat, D3DFORMAT texFormat,
- D3DFORMAT renderFormat, LoadImageFunction loadFunction)
-{
- TextureFormat info;
- info.texFormat = texFormat;
- info.renderFormat = renderFormat;
-
- static const InternalFormatInitialzerMap dataInitializationMap = BuildInternalFormatInitialzerMap();
- InternalFormatInitialzerMap::const_iterator dataInitIter = dataInitializationMap.find(internalFormat);
- info.dataInitializerFunction =
- (dataInitIter != dataInitializationMap.end()) ? dataInitIter->second : nullptr;
-
- info.loadFunction = loadFunction;
-
- map->insert(std::make_pair(internalFormat, info));
-}
-
-static D3D9FormatMap BuildD3D9FormatMap()
-{
- using namespace angle; // For image loading functions
-
- D3D9FormatMap map;
-
- // clang-format off
- // | Internal format | Texture format | Render format | Load function |
- InsertD3D9FormatInfo(&map, GL_NONE, D3DFMT_NULL, D3DFMT_NULL, UnreachableLoad );
-
- // We choose to downsample the GL_DEPTH_COMPONENT32_OES format to a 24-bit format because D3DFMT_D32 is not widely
- // supported. We're allowed to do this because:
- // - The ES spec 2.0.25 sec 3.7.1 states that we're allowed to store texture formats with internal format
- // resolutions of our own choosing.
- // - OES_depth_texture states that downsampling of the depth formats is allowed.
- // - ANGLE_depth_texture does not state minimum required resolutions of the depth texture formats it
- // introduces.
- // In ES3 however, there are minimum resolutions for the texture formats and this would not be allowed.
-
- InsertD3D9FormatInfo(&map, GL_DEPTH_COMPONENT16, D3DFMT_INTZ, D3DFMT_D24S8, UnreachableLoad );
- InsertD3D9FormatInfo(&map, GL_DEPTH_COMPONENT32_OES, D3DFMT_INTZ, D3DFMT_D24X8, UnreachableLoad );
- InsertD3D9FormatInfo(&map, GL_DEPTH24_STENCIL8_OES, D3DFMT_INTZ, D3DFMT_D24S8, UnreachableLoad );
- InsertD3D9FormatInfo(&map, GL_STENCIL_INDEX8, D3DFMT_UNKNOWN, D3DFMT_D24S8, UnreachableLoad ); // TODO: What's the texture format?
-
- InsertD3D9FormatInfo(&map, GL_RGBA32F_EXT, D3DFMT_A32B32G32R32F, D3DFMT_A32B32G32R32F, LoadToNative<GLfloat, 4> );
- InsertD3D9FormatInfo(&map, GL_RGB32F_EXT, D3DFMT_A32B32G32R32F, D3DFMT_A32B32G32R32F, LoadToNative3To4<GLfloat, gl::Float32One>);
- InsertD3D9FormatInfo(&map, GL_RG32F_EXT, D3DFMT_G32R32F, D3DFMT_G32R32F, LoadToNative<GLfloat, 2> );
- InsertD3D9FormatInfo(&map, GL_R32F_EXT, D3DFMT_R32F, D3DFMT_R32F, LoadToNative<GLfloat, 1> );
- InsertD3D9FormatInfo(&map, GL_ALPHA32F_EXT, D3DFMT_A32B32G32R32F, D3DFMT_UNKNOWN, LoadA32FToRGBA32F );
- InsertD3D9FormatInfo(&map, GL_LUMINANCE32F_EXT, D3DFMT_A32B32G32R32F, D3DFMT_UNKNOWN, LoadL32FToRGBA32F );
- InsertD3D9FormatInfo(&map, GL_LUMINANCE_ALPHA32F_EXT, D3DFMT_A32B32G32R32F, D3DFMT_UNKNOWN, LoadLA32FToRGBA32F );
-
- InsertD3D9FormatInfo(&map, GL_RGBA16F_EXT, D3DFMT_A16B16G16R16F, D3DFMT_A16B16G16R16F, LoadToNative<GLhalf, 4> );
- InsertD3D9FormatInfo(&map, GL_RGB16F_EXT, D3DFMT_A16B16G16R16F, D3DFMT_A16B16G16R16F, LoadToNative3To4<GLhalf, gl::Float16One> );
- InsertD3D9FormatInfo(&map, GL_RG16F_EXT, D3DFMT_G16R16F, D3DFMT_G16R16F, LoadToNative<GLhalf, 2> );
- InsertD3D9FormatInfo(&map, GL_R16F_EXT, D3DFMT_R16F, D3DFMT_R16F, LoadToNative<GLhalf, 1> );
- InsertD3D9FormatInfo(&map, GL_ALPHA16F_EXT, D3DFMT_A16B16G16R16F, D3DFMT_UNKNOWN, LoadA16FToRGBA16F );
- InsertD3D9FormatInfo(&map, GL_LUMINANCE16F_EXT, D3DFMT_A16B16G16R16F, D3DFMT_UNKNOWN, LoadL16FToRGBA16F );
- InsertD3D9FormatInfo(&map, GL_LUMINANCE_ALPHA16F_EXT, D3DFMT_A16B16G16R16F, D3DFMT_UNKNOWN, LoadLA16FToRGBA16F );
-
- InsertD3D9FormatInfo(&map, GL_ALPHA8_EXT, D3DFMT_A8R8G8B8, D3DFMT_A8R8G8B8, LoadA8ToBGRA8 );
-
- InsertD3D9FormatInfo(&map, GL_RGB8_OES, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, LoadRGB8ToBGRX8 );
- InsertD3D9FormatInfo(&map, GL_RGB565, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, LoadR5G6B5ToBGRA8 );
- InsertD3D9FormatInfo(&map, GL_RGBA8_OES, D3DFMT_A8R8G8B8, D3DFMT_A8R8G8B8, LoadRGBA8ToBGRA8 );
- InsertD3D9FormatInfo(&map, GL_RGBA4, D3DFMT_A8R8G8B8, D3DFMT_A8R8G8B8, LoadRGBA4ToBGRA8 );
- InsertD3D9FormatInfo(&map, GL_RGB5_A1, D3DFMT_A8R8G8B8, D3DFMT_A8R8G8B8, LoadRGB5A1ToBGRA8 );
- InsertD3D9FormatInfo(&map, GL_R8_EXT, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, LoadR8ToBGRX8 );
- InsertD3D9FormatInfo(&map, GL_RG8_EXT, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, LoadRG8ToBGRX8 );
-
- InsertD3D9FormatInfo(&map, GL_BGRA8_EXT, D3DFMT_A8R8G8B8, D3DFMT_A8R8G8B8, LoadToNative<GLubyte, 4> );
- InsertD3D9FormatInfo(&map, GL_BGRA4_ANGLEX, D3DFMT_A8R8G8B8, D3DFMT_A8R8G8B8, LoadBGRA4ToBGRA8 );
- InsertD3D9FormatInfo(&map, GL_BGR5_A1_ANGLEX, D3DFMT_A8R8G8B8, D3DFMT_A8R8G8B8, LoadBGR5A1ToBGRA8 );
-
- InsertD3D9FormatInfo(&map, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, D3DFMT_DXT1, D3DFMT_UNKNOWN, LoadCompressedToNative<4, 4, 8> );
- InsertD3D9FormatInfo(&map, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, D3DFMT_DXT1, D3DFMT_UNKNOWN, LoadCompressedToNative<4, 4, 8> );
- InsertD3D9FormatInfo(&map, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, D3DFMT_DXT3, D3DFMT_UNKNOWN, LoadCompressedToNative<4, 4, 16> );
- InsertD3D9FormatInfo(&map, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, D3DFMT_DXT5, D3DFMT_UNKNOWN, LoadCompressedToNative<4, 4, 16> );
-
- // These formats require checking if the renderer supports D3DFMT_L8 or D3DFMT_A8L8 and
- // then changing the format and loading function appropriately.
- InsertD3D9FormatInfo(&map, GL_LUMINANCE8_EXT, D3DFMT_L8, D3DFMT_UNKNOWN, LoadToNative<GLubyte, 1> );
- InsertD3D9FormatInfo(&map, GL_LUMINANCE8_ALPHA8_EXT, D3DFMT_A8L8, D3DFMT_UNKNOWN, LoadToNative<GLubyte, 2> );
- // clang-format on
-
- return map;
-}
-
-const TextureFormat &GetTextureFormatInfo(GLenum internalFormat)
-{
- static const D3D9FormatMap formatMap = BuildD3D9FormatMap();
- D3D9FormatMap::const_iterator iter = formatMap.find(internalFormat);
- if (iter != formatMap.end())
- {
- return iter->second;
- }
- else
- {
- static const TextureFormat defaultInfo;
- return defaultInfo;
- }
-}
-
-static GLenum GetDeclTypeComponentType(D3DDECLTYPE declType)
-{
- switch (declType)
- {
- case D3DDECLTYPE_FLOAT1: return GL_FLOAT;
- case D3DDECLTYPE_FLOAT2: return GL_FLOAT;
- case D3DDECLTYPE_FLOAT3: return GL_FLOAT;
- case D3DDECLTYPE_FLOAT4: return GL_FLOAT;
- case D3DDECLTYPE_UBYTE4: return GL_UNSIGNED_INT;
- case D3DDECLTYPE_SHORT2: return GL_INT;
- case D3DDECLTYPE_SHORT4: return GL_INT;
- case D3DDECLTYPE_UBYTE4N: return GL_UNSIGNED_NORMALIZED;
- case D3DDECLTYPE_SHORT4N: return GL_SIGNED_NORMALIZED;
- case D3DDECLTYPE_USHORT4N: return GL_UNSIGNED_NORMALIZED;
- case D3DDECLTYPE_SHORT2N: return GL_SIGNED_NORMALIZED;
- case D3DDECLTYPE_USHORT2N: return GL_UNSIGNED_NORMALIZED;
- default: UNREACHABLE(); return GL_NONE;
- }
-}
-
-// Attribute format conversion
-enum { NUM_GL_VERTEX_ATTRIB_TYPES = 6 };
-
-struct TranslationDescription
-{
- DWORD capsFlag;
- VertexFormat preferredConversion;
- VertexFormat fallbackConversion;
-};
-
-// Mapping from OpenGL-ES vertex attrib type to D3D decl type:
-//
-// BYTE SHORT (Cast)
-// BYTE-norm FLOAT (Normalize) (can't be exactly represented as SHORT-norm)
-// UNSIGNED_BYTE UBYTE4 (Identity) or SHORT (Cast)
-// UNSIGNED_BYTE-norm UBYTE4N (Identity) or FLOAT (Normalize)
-// SHORT SHORT (Identity)
-// SHORT-norm SHORT-norm (Identity) or FLOAT (Normalize)
-// UNSIGNED_SHORT FLOAT (Cast)
-// UNSIGNED_SHORT-norm USHORT-norm (Identity) or FLOAT (Normalize)
-// FIXED (not in WebGL) FLOAT (FixedToFloat)
-// FLOAT FLOAT (Identity)
-
-// GLToCType maps from GL type (as GLenum) to the C typedef.
-template <GLenum GLType> struct GLToCType { };
-
-template <> struct GLToCType<GL_BYTE> { typedef GLbyte type; };
-template <> struct GLToCType<GL_UNSIGNED_BYTE> { typedef GLubyte type; };
-template <> struct GLToCType<GL_SHORT> { typedef GLshort type; };
-template <> struct GLToCType<GL_UNSIGNED_SHORT> { typedef GLushort type; };
-template <> struct GLToCType<GL_FIXED> { typedef GLuint type; };
-template <> struct GLToCType<GL_FLOAT> { typedef GLfloat type; };
-
-// This differs from D3DDECLTYPE in that it is unsized. (Size expansion is applied last.)
-enum D3DVertexType
-{
- D3DVT_FLOAT,
- D3DVT_SHORT,
- D3DVT_SHORT_NORM,
- D3DVT_UBYTE,
- D3DVT_UBYTE_NORM,
- D3DVT_USHORT_NORM
-};
-
-// D3DToCType maps from D3D vertex type (as enum D3DVertexType) to the corresponding C type.
-template <unsigned int D3DType> struct D3DToCType { };
-
-template <> struct D3DToCType<D3DVT_FLOAT> { typedef float type; };
-template <> struct D3DToCType<D3DVT_SHORT> { typedef short type; };
-template <> struct D3DToCType<D3DVT_SHORT_NORM> { typedef short type; };
-template <> struct D3DToCType<D3DVT_UBYTE> { typedef unsigned char type; };
-template <> struct D3DToCType<D3DVT_UBYTE_NORM> { typedef unsigned char type; };
-template <> struct D3DToCType<D3DVT_USHORT_NORM> { typedef unsigned short type; };
-
-// Encode the type/size combinations that D3D permits. For each type/size it expands to a widener that will provide the appropriate final size.
-template <unsigned int type, int size> struct WidenRule { };
-
-template <int size> struct WidenRule<D3DVT_FLOAT, size> : NoWiden<size> { };
-template <int size> struct WidenRule<D3DVT_SHORT, size> : WidenToEven<size> { };
-template <int size> struct WidenRule<D3DVT_SHORT_NORM, size> : WidenToEven<size> { };
-template <int size> struct WidenRule<D3DVT_UBYTE, size> : WidenToFour<size> { };
-template <int size> struct WidenRule<D3DVT_UBYTE_NORM, size> : WidenToFour<size> { };
-template <int size> struct WidenRule<D3DVT_USHORT_NORM, size> : WidenToEven<size> { };
-
-// VertexTypeFlags encodes the D3DCAPS9::DeclType flag and vertex declaration flag for each D3D vertex type & size combination.
-template <unsigned int d3dtype, int size> struct VertexTypeFlags { };
-
-template <unsigned int _capflag, unsigned int _declflag>
-struct VertexTypeFlagsHelper
-{
- enum { capflag = _capflag };
- enum { declflag = _declflag };
-};
-
-template <> struct VertexTypeFlags<D3DVT_FLOAT, 1> : VertexTypeFlagsHelper<0, D3DDECLTYPE_FLOAT1> { };
-template <> struct VertexTypeFlags<D3DVT_FLOAT, 2> : VertexTypeFlagsHelper<0, D3DDECLTYPE_FLOAT2> { };
-template <> struct VertexTypeFlags<D3DVT_FLOAT, 3> : VertexTypeFlagsHelper<0, D3DDECLTYPE_FLOAT3> { };
-template <> struct VertexTypeFlags<D3DVT_FLOAT, 4> : VertexTypeFlagsHelper<0, D3DDECLTYPE_FLOAT4> { };
-template <> struct VertexTypeFlags<D3DVT_SHORT, 2> : VertexTypeFlagsHelper<0, D3DDECLTYPE_SHORT2> { };
-template <> struct VertexTypeFlags<D3DVT_SHORT, 4> : VertexTypeFlagsHelper<0, D3DDECLTYPE_SHORT4> { };
-template <> struct VertexTypeFlags<D3DVT_SHORT_NORM, 2> : VertexTypeFlagsHelper<D3DDTCAPS_SHORT2N, D3DDECLTYPE_SHORT2N> { };
-template <> struct VertexTypeFlags<D3DVT_SHORT_NORM, 4> : VertexTypeFlagsHelper<D3DDTCAPS_SHORT4N, D3DDECLTYPE_SHORT4N> { };
-template <> struct VertexTypeFlags<D3DVT_UBYTE, 4> : VertexTypeFlagsHelper<D3DDTCAPS_UBYTE4, D3DDECLTYPE_UBYTE4> { };
-template <> struct VertexTypeFlags<D3DVT_UBYTE_NORM, 4> : VertexTypeFlagsHelper<D3DDTCAPS_UBYTE4N, D3DDECLTYPE_UBYTE4N> { };
-template <> struct VertexTypeFlags<D3DVT_USHORT_NORM, 2> : VertexTypeFlagsHelper<D3DDTCAPS_USHORT2N, D3DDECLTYPE_USHORT2N> { };
-template <> struct VertexTypeFlags<D3DVT_USHORT_NORM, 4> : VertexTypeFlagsHelper<D3DDTCAPS_USHORT4N, D3DDECLTYPE_USHORT4N> { };
-
-
-// VertexTypeMapping maps GL type & normalized flag to preferred and fallback D3D vertex types (as D3DVertexType enums).
-template <GLenum GLtype, bool normalized> struct VertexTypeMapping { };
-
-template <D3DVertexType Preferred, D3DVertexType Fallback = Preferred>
-struct VertexTypeMappingBase
-{
- enum { preferred = Preferred };
- enum { fallback = Fallback };
-};
-
-template <> struct VertexTypeMapping<GL_BYTE, false> : VertexTypeMappingBase<D3DVT_SHORT> { }; // Cast
-template <> struct VertexTypeMapping<GL_BYTE, true> : VertexTypeMappingBase<D3DVT_FLOAT> { }; // Normalize
-template <> struct VertexTypeMapping<GL_UNSIGNED_BYTE, false> : VertexTypeMappingBase<D3DVT_UBYTE, D3DVT_FLOAT> { }; // Identity, Cast
-template <> struct VertexTypeMapping<GL_UNSIGNED_BYTE, true> : VertexTypeMappingBase<D3DVT_UBYTE_NORM, D3DVT_FLOAT> { }; // Identity, Normalize
-template <> struct VertexTypeMapping<GL_SHORT, false> : VertexTypeMappingBase<D3DVT_SHORT> { }; // Identity
-template <> struct VertexTypeMapping<GL_SHORT, true> : VertexTypeMappingBase<D3DVT_SHORT_NORM, D3DVT_FLOAT> { }; // Cast, Normalize
-template <> struct VertexTypeMapping<GL_UNSIGNED_SHORT, false> : VertexTypeMappingBase<D3DVT_FLOAT> { }; // Cast
-template <> struct VertexTypeMapping<GL_UNSIGNED_SHORT, true> : VertexTypeMappingBase<D3DVT_USHORT_NORM, D3DVT_FLOAT> { }; // Cast, Normalize
-template <bool normalized> struct VertexTypeMapping<GL_FIXED, normalized> : VertexTypeMappingBase<D3DVT_FLOAT> { }; // FixedToFloat
-template <bool normalized> struct VertexTypeMapping<GL_FLOAT, normalized> : VertexTypeMappingBase<D3DVT_FLOAT> { }; // Identity
-
-
-// Given a GL type & norm flag and a D3D type, ConversionRule provides the type conversion rule (Cast, Normalize, Identity, FixedToFloat).
-// The conversion rules themselves are defined in vertexconversion.h.
-
-// Almost all cases are covered by Cast (including those that are actually Identity since Cast<T,T> knows it's an identity mapping).
-template <GLenum fromType, bool normalized, unsigned int toType>
-struct ConversionRule : Cast<typename GLToCType<fromType>::type, typename D3DToCType<toType>::type> { };
-
-// All conversions from normalized types to float use the Normalize operator.
-template <GLenum fromType> struct ConversionRule<fromType, true, D3DVT_FLOAT> : Normalize<typename GLToCType<fromType>::type> { };
-
-// Use a full specialization for this so that it preferentially matches ahead of the generic normalize-to-float rules.
-template <> struct ConversionRule<GL_FIXED, true, D3DVT_FLOAT> : FixedToFloat<GLint, 16> { };
-template <> struct ConversionRule<GL_FIXED, false, D3DVT_FLOAT> : FixedToFloat<GLint, 16> { };
-
-// A 2-stage construction is used for DefaultVertexValues because float must use SimpleDefaultValues (i.e. 0/1)
-// whether it is normalized or not.
-template <class T, bool normalized> struct DefaultVertexValuesStage2 { };
-
-template <class T> struct DefaultVertexValuesStage2<T, true> : NormalizedDefaultValues<T> { };
-template <class T> struct DefaultVertexValuesStage2<T, false> : SimpleDefaultValues<T> { };
-
-// Work out the default value rule for a D3D type (expressed as the C type) and
-template <class T, bool normalized> struct DefaultVertexValues : DefaultVertexValuesStage2<T, normalized> { };
-template <bool normalized> struct DefaultVertexValues<float, normalized> : SimpleDefaultValues<float> { };
-
-// Policy rules for use with Converter, to choose whether to use the preferred or fallback conversion.
-// The fallback conversion produces an output that all D3D9 devices must support.
-template <class T> struct UsePreferred { enum { type = T::preferred }; };
-template <class T> struct UseFallback { enum { type = T::fallback }; };
-
-// Converter ties it all together. Given an OpenGL type/norm/size and choice of preferred/fallback conversion,
-// it provides all the members of the appropriate VertexDataConverter, the D3DCAPS9::DeclTypes flag in cap flag
-// and the D3DDECLTYPE member needed for the vertex declaration in declflag.
-template <GLenum fromType, bool normalized, int size, template <class T> class PreferenceRule>
-struct Converter
- : VertexDataConverter<
- typename GLToCType<fromType>::type,
- WidenRule<PreferenceRule<VertexTypeMapping<fromType, normalized>>::type, size>,
- ConversionRule<fromType,
- normalized,
- PreferenceRule<VertexTypeMapping<fromType, normalized>>::type>,
- DefaultVertexValues<typename D3DToCType<PreferenceRule<
- VertexTypeMapping<fromType, normalized>>::type>::type,
- normalized>>
-{
-private:
- enum
- {
- d3dtype = PreferenceRule<VertexTypeMapping<fromType, normalized>>::type
- };
- enum
- {
- d3dsize = WidenRule<d3dtype, size>::finalWidth
- };
-
-public:
- enum { capflag = VertexTypeFlags<d3dtype, d3dsize>::capflag };
- enum { declflag = VertexTypeFlags<d3dtype, d3dsize>::declflag };
-};
-
-VertexFormat::VertexFormat()
- : conversionType(VERTEX_CONVERT_NONE),
- outputElementSize(0),
- copyFunction(nullptr),
- nativeFormat(D3DDECLTYPE_UNUSED),
- componentType(GL_NONE)
-{
-}
-
-// Initialize a TranslationInfo
-VertexFormat CreateVertexFormatInfo(bool identity, size_t elementSize, VertexCopyFunction copyFunc, D3DDECLTYPE nativeFormat)
-{
- VertexFormat formatInfo;
- formatInfo.conversionType = identity ? VERTEX_CONVERT_NONE : VERTEX_CONVERT_CPU;
- formatInfo.outputElementSize = elementSize;
- formatInfo.copyFunction = copyFunc;
- formatInfo.nativeFormat = nativeFormat;
- formatInfo.componentType = GetDeclTypeComponentType(nativeFormat);
- return formatInfo;
-}
-
-#define TRANSLATION(type, norm, size, preferred) \
- CreateVertexFormatInfo \
- ( \
- Converter<type, norm, size, preferred>::identity, \
- Converter<type, norm, size, preferred>::finalSize, \
- Converter<type, norm, size, preferred>::convertArray, \
- static_cast<D3DDECLTYPE>(Converter<type, norm, size, preferred>::declflag) \
- )
-
-#define TRANSLATION_FOR_TYPE_NORM_SIZE(type, norm, size) \
- { \
- Converter<type, norm, size, UsePreferred>::capflag, \
- TRANSLATION(type, norm, size, UsePreferred), \
- TRANSLATION(type, norm, size, UseFallback) \
- }
-
-#define TRANSLATIONS_FOR_TYPE(type) \
- { \
- { TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 1), TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 2), TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 3), TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 4) }, \
- { TRANSLATION_FOR_TYPE_NORM_SIZE(type, true, 1), TRANSLATION_FOR_TYPE_NORM_SIZE(type, true, 2), TRANSLATION_FOR_TYPE_NORM_SIZE(type, true, 3), TRANSLATION_FOR_TYPE_NORM_SIZE(type, true, 4) }, \
- }
-
-#define TRANSLATIONS_FOR_TYPE_NO_NORM(type) \
- { \
- { TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 1), TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 2), TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 3), TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 4) }, \
- { TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 1), TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 2), TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 3), TRANSLATION_FOR_TYPE_NORM_SIZE(type, false, 4) }, \
- }
-
-static inline unsigned int ComputeTypeIndex(GLenum type)
-{
- switch (type)
- {
- case GL_BYTE: return 0;
- case GL_UNSIGNED_BYTE: return 1;
- case GL_SHORT: return 2;
- case GL_UNSIGNED_SHORT: return 3;
- case GL_FIXED: return 4;
- case GL_FLOAT: return 5;
-
- default: UNREACHABLE(); return 5;
- }
-}
-
-const VertexFormat &GetVertexFormatInfo(DWORD supportedDeclTypes, gl::VertexFormatType vertexFormatType)
-{
- static bool initialized = false;
- static DWORD initializedDeclTypes = 0;
- static VertexFormat formatConverters[NUM_GL_VERTEX_ATTRIB_TYPES][2][4];
- if (initializedDeclTypes != supportedDeclTypes)
- {
- const TranslationDescription translations[NUM_GL_VERTEX_ATTRIB_TYPES][2][4] = // [GL types as enumerated by typeIndex()][normalized][size-1]
- {
- TRANSLATIONS_FOR_TYPE(GL_BYTE),
- TRANSLATIONS_FOR_TYPE(GL_UNSIGNED_BYTE),
- TRANSLATIONS_FOR_TYPE(GL_SHORT),
- TRANSLATIONS_FOR_TYPE(GL_UNSIGNED_SHORT),
- TRANSLATIONS_FOR_TYPE_NO_NORM(GL_FIXED),
- TRANSLATIONS_FOR_TYPE_NO_NORM(GL_FLOAT)
- };
- for (unsigned int i = 0; i < NUM_GL_VERTEX_ATTRIB_TYPES; i++)
- {
- for (unsigned int j = 0; j < 2; j++)
- {
- for (unsigned int k = 0; k < 4; k++)
- {
- if (translations[i][j][k].capsFlag == 0 || (supportedDeclTypes & translations[i][j][k].capsFlag) != 0)
- {
- formatConverters[i][j][k] = translations[i][j][k].preferredConversion;
- }
- else
- {
- formatConverters[i][j][k] = translations[i][j][k].fallbackConversion;
- }
- }
- }
- }
- initialized = true;
- initializedDeclTypes = supportedDeclTypes;
- }
-
- const gl::VertexFormat &vertexFormat = gl::GetVertexFormatFromType(vertexFormatType);
-
- // Pure integer attributes only supported in ES3.0
- ASSERT(!vertexFormat.pureInteger);
- return formatConverters[ComputeTypeIndex(vertexFormat.type)][vertexFormat.normalized][vertexFormat.components - 1];
-}
-
-}
-
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/formatutils9.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/formatutils9.h
deleted file mode 100644
index 1bef320b53..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/formatutils9.h
+++ /dev/null
@@ -1,94 +0,0 @@
-//
-// Copyright (c) 2013-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// formatutils9.h: Queries for GL image formats and their translations to D3D9
-// formats.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_FORMATUTILS9_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_FORMATUTILS9_H_
-
-#include <map>
-
-#include "common/platform.h"
-#include "libANGLE/angletypes.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/Format.h"
-#include "libANGLE/renderer/renderer_utils.h"
-#include "libANGLE/renderer/d3d/formatutilsD3D.h"
-
-namespace rx
-{
-
-class Renderer9;
-
-namespace d3d9
-{
-
-struct D3DFormat
-{
- D3DFormat();
- D3DFormat(GLuint pixelBytes,
- GLuint blockWidth,
- GLuint blockHeight,
- GLuint redBits,
- GLuint greenBits,
- GLuint blueBits,
- GLuint alphaBits,
- GLuint luminanceBits,
- GLuint depthBits,
- GLuint stencilBits,
- angle::Format::ID formatID);
-
- const angle::Format &info() const { return angle::Format::Get(formatID); }
-
- GLuint pixelBytes;
- GLuint blockWidth;
- GLuint blockHeight;
-
- GLuint redBits;
- GLuint greenBits;
- GLuint blueBits;
- GLuint alphaBits;
- GLuint luminanceBits;
-
- GLuint depthBits;
- GLuint stencilBits;
-
- angle::Format::ID formatID;
-};
-
-const D3DFormat &GetD3DFormatInfo(D3DFORMAT format);
-
-struct VertexFormat
-{
- VertexFormat();
-
- VertexConversionType conversionType;
- size_t outputElementSize;
- VertexCopyFunction copyFunction;
- D3DDECLTYPE nativeFormat;
- GLenum componentType;
-};
-const VertexFormat &GetVertexFormatInfo(DWORD supportedDeclTypes, gl::VertexFormatType vertexFormatType);
-
-struct TextureFormat
-{
- TextureFormat();
-
- D3DFORMAT texFormat;
- D3DFORMAT renderFormat;
-
- InitializeTextureDataFunction dataInitializerFunction;
-
- LoadImageFunction loadFunction;
-};
-const TextureFormat &GetTextureFormatInfo(GLenum internalFormat);
-
-}
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_FORMATUTILS9_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp
deleted file mode 100644
index fd451a6e51..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp
+++ /dev/null
@@ -1,671 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// renderer9_utils.cpp: Conversion functions and other utility routines
-// specific to the D3D9 renderer.
-
-#include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h"
-
-#include "common/mathutil.h"
-#include "common/debug.h"
-
-#include "libANGLE/formatutils.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/renderer/d3d/d3d9/formatutils9.h"
-#include "libANGLE/renderer/d3d/d3d9/RenderTarget9.h"
-#include "libANGLE/renderer/d3d/FramebufferD3D.h"
-#include "libANGLE/renderer/driver_utils.h"
-#include "platform/Platform.h"
-#include "platform/WorkaroundsD3D.h"
-
-#include "third_party/systeminfo/SystemInfo.h"
-
-namespace rx
-{
-
-namespace gl_d3d9
-{
-
-D3DCMPFUNC ConvertComparison(GLenum comparison)
-{
- D3DCMPFUNC d3dComp = D3DCMP_ALWAYS;
- switch (comparison)
- {
- case GL_NEVER: d3dComp = D3DCMP_NEVER; break;
- case GL_ALWAYS: d3dComp = D3DCMP_ALWAYS; break;
- case GL_LESS: d3dComp = D3DCMP_LESS; break;
- case GL_LEQUAL: d3dComp = D3DCMP_LESSEQUAL; break;
- case GL_EQUAL: d3dComp = D3DCMP_EQUAL; break;
- case GL_GREATER: d3dComp = D3DCMP_GREATER; break;
- case GL_GEQUAL: d3dComp = D3DCMP_GREATEREQUAL; break;
- case GL_NOTEQUAL: d3dComp = D3DCMP_NOTEQUAL; break;
- default: UNREACHABLE();
- }
-
- return d3dComp;
-}
-
-D3DCOLOR ConvertColor(gl::ColorF color)
-{
- return D3DCOLOR_RGBA(gl::unorm<8>(color.red),
- gl::unorm<8>(color.green),
- gl::unorm<8>(color.blue),
- gl::unorm<8>(color.alpha));
-}
-
-D3DBLEND ConvertBlendFunc(GLenum blend)
-{
- D3DBLEND d3dBlend = D3DBLEND_ZERO;
-
- switch (blend)
- {
- case GL_ZERO: d3dBlend = D3DBLEND_ZERO; break;
- case GL_ONE: d3dBlend = D3DBLEND_ONE; break;
- case GL_SRC_COLOR: d3dBlend = D3DBLEND_SRCCOLOR; break;
- case GL_ONE_MINUS_SRC_COLOR: d3dBlend = D3DBLEND_INVSRCCOLOR; break;
- case GL_DST_COLOR: d3dBlend = D3DBLEND_DESTCOLOR; break;
- case GL_ONE_MINUS_DST_COLOR: d3dBlend = D3DBLEND_INVDESTCOLOR; break;
- case GL_SRC_ALPHA: d3dBlend = D3DBLEND_SRCALPHA; break;
- case GL_ONE_MINUS_SRC_ALPHA: d3dBlend = D3DBLEND_INVSRCALPHA; break;
- case GL_DST_ALPHA: d3dBlend = D3DBLEND_DESTALPHA; break;
- case GL_ONE_MINUS_DST_ALPHA: d3dBlend = D3DBLEND_INVDESTALPHA; break;
- case GL_CONSTANT_COLOR: d3dBlend = D3DBLEND_BLENDFACTOR; break;
- case GL_ONE_MINUS_CONSTANT_COLOR: d3dBlend = D3DBLEND_INVBLENDFACTOR; break;
- case GL_CONSTANT_ALPHA: d3dBlend = D3DBLEND_BLENDFACTOR; break;
- case GL_ONE_MINUS_CONSTANT_ALPHA: d3dBlend = D3DBLEND_INVBLENDFACTOR; break;
- case GL_SRC_ALPHA_SATURATE: d3dBlend = D3DBLEND_SRCALPHASAT; break;
- default: UNREACHABLE();
- }
-
- return d3dBlend;
-}
-
-D3DBLENDOP ConvertBlendOp(GLenum blendOp)
-{
- D3DBLENDOP d3dBlendOp = D3DBLENDOP_ADD;
-
- switch (blendOp)
- {
- case GL_FUNC_ADD: d3dBlendOp = D3DBLENDOP_ADD; break;
- case GL_FUNC_SUBTRACT: d3dBlendOp = D3DBLENDOP_SUBTRACT; break;
- case GL_FUNC_REVERSE_SUBTRACT: d3dBlendOp = D3DBLENDOP_REVSUBTRACT; break;
- case GL_MIN_EXT: d3dBlendOp = D3DBLENDOP_MIN; break;
- case GL_MAX_EXT: d3dBlendOp = D3DBLENDOP_MAX; break;
- default: UNREACHABLE();
- }
-
- return d3dBlendOp;
-}
-
-D3DSTENCILOP ConvertStencilOp(GLenum stencilOp)
-{
- D3DSTENCILOP d3dStencilOp = D3DSTENCILOP_KEEP;
-
- switch (stencilOp)
- {
- case GL_ZERO: d3dStencilOp = D3DSTENCILOP_ZERO; break;
- case GL_KEEP: d3dStencilOp = D3DSTENCILOP_KEEP; break;
- case GL_REPLACE: d3dStencilOp = D3DSTENCILOP_REPLACE; break;
- case GL_INCR: d3dStencilOp = D3DSTENCILOP_INCRSAT; break;
- case GL_DECR: d3dStencilOp = D3DSTENCILOP_DECRSAT; break;
- case GL_INVERT: d3dStencilOp = D3DSTENCILOP_INVERT; break;
- case GL_INCR_WRAP: d3dStencilOp = D3DSTENCILOP_INCR; break;
- case GL_DECR_WRAP: d3dStencilOp = D3DSTENCILOP_DECR; break;
- default: UNREACHABLE();
- }
-
- return d3dStencilOp;
-}
-
-D3DTEXTUREADDRESS ConvertTextureWrap(GLenum wrap)
-{
- D3DTEXTUREADDRESS d3dWrap = D3DTADDRESS_WRAP;
-
- switch (wrap)
- {
- case GL_REPEAT: d3dWrap = D3DTADDRESS_WRAP; break;
- case GL_CLAMP_TO_EDGE: d3dWrap = D3DTADDRESS_CLAMP; break;
- case GL_MIRRORED_REPEAT: d3dWrap = D3DTADDRESS_MIRROR; break;
- default: UNREACHABLE();
- }
-
- return d3dWrap;
-}
-
-D3DCULL ConvertCullMode(gl::CullFaceMode cullFace, GLenum frontFace)
-{
- D3DCULL cull = D3DCULL_CCW;
- switch (cullFace)
- {
- case gl::CullFaceMode::Front:
- cull = (frontFace == GL_CCW ? D3DCULL_CW : D3DCULL_CCW);
- break;
- case gl::CullFaceMode::Back:
- cull = (frontFace == GL_CCW ? D3DCULL_CCW : D3DCULL_CW);
- break;
- case gl::CullFaceMode::FrontAndBack:
- cull = D3DCULL_NONE; // culling will be handled during draw
- break;
- default:
- UNREACHABLE();
- }
-
- return cull;
-}
-
-D3DCUBEMAP_FACES ConvertCubeFace(GLenum cubeFace)
-{
- D3DCUBEMAP_FACES face = D3DCUBEMAP_FACE_POSITIVE_X;
-
- switch (cubeFace)
- {
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- face = D3DCUBEMAP_FACE_POSITIVE_X;
- break;
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- face = D3DCUBEMAP_FACE_NEGATIVE_X;
- break;
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- face = D3DCUBEMAP_FACE_POSITIVE_Y;
- break;
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- face = D3DCUBEMAP_FACE_NEGATIVE_Y;
- break;
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- face = D3DCUBEMAP_FACE_POSITIVE_Z;
- break;
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- face = D3DCUBEMAP_FACE_NEGATIVE_Z;
- break;
- default: UNREACHABLE();
- }
-
- return face;
-}
-
-DWORD ConvertColorMask(bool red, bool green, bool blue, bool alpha)
-{
- return (red ? D3DCOLORWRITEENABLE_RED : 0) |
- (green ? D3DCOLORWRITEENABLE_GREEN : 0) |
- (blue ? D3DCOLORWRITEENABLE_BLUE : 0) |
- (alpha ? D3DCOLORWRITEENABLE_ALPHA : 0);
-}
-
-D3DTEXTUREFILTERTYPE ConvertMagFilter(GLenum magFilter, float maxAnisotropy)
-{
- if (maxAnisotropy > 1.0f)
- {
- return D3DTEXF_ANISOTROPIC;
- }
-
- D3DTEXTUREFILTERTYPE d3dMagFilter = D3DTEXF_POINT;
- switch (magFilter)
- {
- case GL_NEAREST: d3dMagFilter = D3DTEXF_POINT; break;
- case GL_LINEAR: d3dMagFilter = D3DTEXF_LINEAR; break;
- default: UNREACHABLE();
- }
-
- return d3dMagFilter;
-}
-
-void ConvertMinFilter(GLenum minFilter, D3DTEXTUREFILTERTYPE *d3dMinFilter, D3DTEXTUREFILTERTYPE *d3dMipFilter,
- float *d3dLodBias, float maxAnisotropy, size_t baseLevel)
-{
- switch (minFilter)
- {
- case GL_NEAREST:
- *d3dMinFilter = D3DTEXF_POINT;
- *d3dMipFilter = D3DTEXF_NONE;
- break;
- case GL_LINEAR:
- *d3dMinFilter = D3DTEXF_LINEAR;
- *d3dMipFilter = D3DTEXF_NONE;
- break;
- case GL_NEAREST_MIPMAP_NEAREST:
- *d3dMinFilter = D3DTEXF_POINT;
- *d3dMipFilter = D3DTEXF_POINT;
- break;
- case GL_LINEAR_MIPMAP_NEAREST:
- *d3dMinFilter = D3DTEXF_LINEAR;
- *d3dMipFilter = D3DTEXF_POINT;
- break;
- case GL_NEAREST_MIPMAP_LINEAR:
- *d3dMinFilter = D3DTEXF_POINT;
- *d3dMipFilter = D3DTEXF_LINEAR;
- break;
- case GL_LINEAR_MIPMAP_LINEAR:
- *d3dMinFilter = D3DTEXF_LINEAR;
- *d3dMipFilter = D3DTEXF_LINEAR;
- break;
- default:
- *d3dMinFilter = D3DTEXF_POINT;
- *d3dMipFilter = D3DTEXF_NONE;
- UNREACHABLE();
- }
-
- // Disabling mipmapping will always sample from level 0 of the texture. It is possible to work
- // around this by modifying D3DSAMP_MAXMIPLEVEL to force a specific mip level to become the
- // lowest sampled mip level and using a large negative value for D3DSAMP_MIPMAPLODBIAS to
- // ensure that only the base mip level is sampled.
- if (baseLevel > 0 && *d3dMipFilter == D3DTEXF_NONE)
- {
- *d3dMipFilter = D3DTEXF_POINT;
- *d3dLodBias = -static_cast<float>(gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
- }
- else
- {
- *d3dLodBias = 0.0f;
- }
-
- if (maxAnisotropy > 1.0f)
- {
- *d3dMinFilter = D3DTEXF_ANISOTROPIC;
- }
-}
-
-D3DQUERYTYPE ConvertQueryType(GLenum queryType)
-{
- switch (queryType)
- {
- case GL_ANY_SAMPLES_PASSED_EXT:
- case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
- return D3DQUERYTYPE_OCCLUSION;
- case GL_COMMANDS_COMPLETED_CHROMIUM:
- return D3DQUERYTYPE_EVENT;
- default:
- UNREACHABLE();
- return static_cast<D3DQUERYTYPE>(0);
- }
-}
-
-D3DMULTISAMPLE_TYPE GetMultisampleType(GLuint samples)
-{
- return (samples > 1) ? static_cast<D3DMULTISAMPLE_TYPE>(samples) : D3DMULTISAMPLE_NONE;
-}
-
-}
-
-namespace d3d9_gl
-{
-
-unsigned int GetReservedVertexUniformVectors()
-{
- return 3; // dx_ViewCoords, dx_ViewAdjust and dx_DepthRange.
-}
-
-unsigned int GetReservedFragmentUniformVectors()
-{
- return 3; // dx_ViewCoords, dx_DepthFront and dx_DepthRange.
-}
-
-GLsizei GetSamplesCount(D3DMULTISAMPLE_TYPE type)
-{
- return (type != D3DMULTISAMPLE_NONMASKABLE) ? type : 0;
-}
-
-bool IsFormatChannelEquivalent(D3DFORMAT d3dformat, GLenum format)
-{
- GLenum internalFormat = d3d9::GetD3DFormatInfo(d3dformat).info().glInternalFormat;
- GLenum convertedFormat = gl::GetSizedInternalFormatInfo(internalFormat).format;
- return convertedFormat == format;
-}
-
-static gl::TextureCaps GenerateTextureFormatCaps(GLenum internalFormat, IDirect3D9 *d3d9, D3DDEVTYPE deviceType,
- UINT adapter, D3DFORMAT adapterFormat)
-{
- gl::TextureCaps textureCaps;
-
- const d3d9::TextureFormat &d3dFormatInfo = d3d9::GetTextureFormatInfo(internalFormat);
- const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(internalFormat);
-
- if (d3dFormatInfo.texFormat != D3DFMT_UNKNOWN)
- {
- if (formatInfo.depthBits > 0 || formatInfo.stencilBits > 0)
- {
- textureCaps.texturable = SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, 0, D3DRTYPE_TEXTURE, d3dFormatInfo.texFormat));
- }
- else
- {
- textureCaps.texturable = SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, 0, D3DRTYPE_TEXTURE, d3dFormatInfo.texFormat)) &&
- SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, 0, D3DRTYPE_CUBETEXTURE, d3dFormatInfo.texFormat));
- }
-
- textureCaps.filterable = SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, D3DUSAGE_QUERY_FILTER, D3DRTYPE_TEXTURE, d3dFormatInfo.texFormat));
- }
-
- if (d3dFormatInfo.renderFormat != D3DFMT_UNKNOWN)
- {
- textureCaps.renderable = SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, D3DUSAGE_RENDERTARGET, D3DRTYPE_TEXTURE, d3dFormatInfo.renderFormat));
-
- if ((formatInfo.depthBits > 0 || formatInfo.stencilBits > 0) && !textureCaps.renderable)
- {
- textureCaps.renderable = SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, d3dFormatInfo.renderFormat));
- }
-
- textureCaps.sampleCounts.insert(1);
- for (unsigned int i = D3DMULTISAMPLE_2_SAMPLES; i <= D3DMULTISAMPLE_16_SAMPLES; i++)
- {
- D3DMULTISAMPLE_TYPE multisampleType = D3DMULTISAMPLE_TYPE(i);
-
- HRESULT result = d3d9->CheckDeviceMultiSampleType(
- adapter, deviceType, d3dFormatInfo.renderFormat, TRUE, multisampleType, nullptr);
- if (SUCCEEDED(result))
- {
- textureCaps.sampleCounts.insert(i);
- }
- }
- }
-
- return textureCaps;
-}
-
-void GenerateCaps(IDirect3D9 *d3d9,
- IDirect3DDevice9 *device,
- D3DDEVTYPE deviceType,
- UINT adapter,
- gl::Caps *caps,
- gl::TextureCapsMap *textureCapsMap,
- gl::Extensions *extensions,
- gl::Limitations *limitations)
-{
- D3DCAPS9 deviceCaps;
- if (FAILED(d3d9->GetDeviceCaps(adapter, deviceType, &deviceCaps)))
- {
- // Can't continue with out device caps
- return;
- }
-
- D3DDISPLAYMODE currentDisplayMode;
- d3d9->GetAdapterDisplayMode(adapter, &currentDisplayMode);
-
- GLuint maxSamples = 0;
- for (GLenum internalFormat : gl::GetAllSizedInternalFormats())
- {
- gl::TextureCaps textureCaps = GenerateTextureFormatCaps(internalFormat, d3d9, deviceType,
- adapter, currentDisplayMode.Format);
- textureCapsMap->insert(internalFormat, textureCaps);
-
- maxSamples = std::max(maxSamples, textureCaps.getMaxSamples());
-
- if (gl::GetSizedInternalFormatInfo(internalFormat).compressed)
- {
- caps->compressedTextureFormats.push_back(internalFormat);
- }
- }
-
- // GL core feature limits
- caps->maxElementIndex = static_cast<GLint64>(std::numeric_limits<unsigned int>::max());
-
- // 3D textures are unimplemented in D3D9
- caps->max3DTextureSize = 1;
-
- // Only one limit in GL, use the minimum dimension
- caps->max2DTextureSize = std::min(deviceCaps.MaxTextureWidth, deviceCaps.MaxTextureHeight);
-
- // D3D treats cube maps as a special case of 2D textures
- caps->maxCubeMapTextureSize = caps->max2DTextureSize;
-
- // Array textures are not available in D3D9
- caps->maxArrayTextureLayers = 1;
-
- // ES3-only feature
- caps->maxLODBias = 0.0f;
-
- // No specific limits on render target size, maximum 2D texture size is equivalent
- caps->maxRenderbufferSize = caps->max2DTextureSize;
-
- // Draw buffers are not supported in D3D9
- caps->maxDrawBuffers = 1;
- caps->maxColorAttachments = 1;
-
- // No specific limits on viewport size, maximum 2D texture size is equivalent
- caps->maxViewportWidth = caps->max2DTextureSize;
- caps->maxViewportHeight = caps->maxViewportWidth;
-
- // Point size is clamped to 1.0f when the shader model is less than 3
- caps->minAliasedPointSize = 1.0f;
- caps->maxAliasedPointSize = ((D3DSHADER_VERSION_MAJOR(deviceCaps.PixelShaderVersion) >= 3) ? deviceCaps.MaxPointSize : 1.0f);
-
- // Wide lines not supported
- caps->minAliasedLineWidth = 1.0f;
- caps->maxAliasedLineWidth = 1.0f;
-
- // Primitive count limits (unused in ES2)
- caps->maxElementsIndices = 0;
- caps->maxElementsVertices = 0;
-
- // Program and shader binary formats (no supported shader binary formats)
- caps->programBinaryFormats.push_back(GL_PROGRAM_BINARY_ANGLE);
-
- caps->vertexHighpFloat.setIEEEFloat();
- caps->vertexMediumpFloat.setIEEEFloat();
- caps->vertexLowpFloat.setIEEEFloat();
- caps->fragmentHighpFloat.setIEEEFloat();
- caps->fragmentMediumpFloat.setIEEEFloat();
- caps->fragmentLowpFloat.setIEEEFloat();
-
- // Some (most) hardware only supports single-precision floating-point numbers,
- // which can accurately represent integers up to +/-16777216
- caps->vertexHighpInt.setSimulatedInt(24);
- caps->vertexMediumpInt.setSimulatedInt(24);
- caps->vertexLowpInt.setSimulatedInt(24);
- caps->fragmentHighpInt.setSimulatedInt(24);
- caps->fragmentMediumpInt.setSimulatedInt(24);
- caps->fragmentLowpInt.setSimulatedInt(24);
-
- // WaitSync is ES3-only, set to zero
- caps->maxServerWaitTimeout = 0;
-
- // Vertex shader limits
- caps->maxVertexAttributes = 16;
- // Vertex Attrib Binding not supported.
- caps->maxVertexAttribBindings = caps->maxVertexAttributes;
-
- const size_t MAX_VERTEX_CONSTANT_VECTORS_D3D9 = 256;
- caps->maxVertexUniformVectors =
- MAX_VERTEX_CONSTANT_VECTORS_D3D9 - GetReservedVertexUniformVectors();
- caps->maxVertexUniformComponents = caps->maxVertexUniformVectors * 4;
-
- caps->maxVertexUniformBlocks = 0;
-
- // SM3 only supports 11 output variables, with a special 12th register for PSIZE.
- const size_t MAX_VERTEX_OUTPUT_VECTORS_SM3 = 9;
- const size_t MAX_VERTEX_OUTPUT_VECTORS_SM2 = 7;
- caps->maxVertexOutputComponents = ((deviceCaps.VertexShaderVersion >= D3DVS_VERSION(3, 0)) ? MAX_VERTEX_OUTPUT_VECTORS_SM3
- : MAX_VERTEX_OUTPUT_VECTORS_SM2) * 4;
-
- // Only Direct3D 10 ready devices support all the necessary vertex texture formats.
- // We test this using D3D9 by checking support for the R16F format.
- if (deviceCaps.VertexShaderVersion >= D3DVS_VERSION(3, 0) &&
- SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, currentDisplayMode.Format,
- D3DUSAGE_QUERY_VERTEXTEXTURE, D3DRTYPE_TEXTURE, D3DFMT_R16F)))
- {
- const size_t MAX_TEXTURE_IMAGE_UNITS_VTF_SM3 = 4;
- caps->maxVertexTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS_VTF_SM3;
- }
- else
- {
- caps->maxVertexTextureImageUnits = 0;
- }
-
- // Fragment shader limits
- const size_t MAX_PIXEL_CONSTANT_VECTORS_SM3 = 224;
- const size_t MAX_PIXEL_CONSTANT_VECTORS_SM2 = 32;
- caps->maxFragmentUniformVectors =
- ((deviceCaps.PixelShaderVersion >= D3DPS_VERSION(3, 0)) ? MAX_PIXEL_CONSTANT_VECTORS_SM3
- : MAX_PIXEL_CONSTANT_VECTORS_SM2) -
- GetReservedFragmentUniformVectors();
- caps->maxFragmentUniformComponents = caps->maxFragmentUniformVectors * 4;
- caps->maxFragmentUniformBlocks = 0;
- caps->maxFragmentInputComponents = caps->maxVertexOutputComponents;
- caps->maxTextureImageUnits = 16;
- caps->minProgramTexelOffset = 0;
- caps->maxProgramTexelOffset = 0;
-
- // Aggregate shader limits (unused in ES2)
- caps->maxUniformBufferBindings = 0;
- caps->maxUniformBlockSize = 0;
- caps->uniformBufferOffsetAlignment = 0;
- caps->maxCombinedUniformBlocks = 0;
- caps->maxCombinedVertexUniformComponents = 0;
- caps->maxCombinedFragmentUniformComponents = 0;
- caps->maxVaryingComponents = 0;
-
- // Aggregate shader limits
- caps->maxVaryingVectors = caps->maxVertexOutputComponents / 4;
- caps->maxCombinedTextureImageUnits = caps->maxVertexTextureImageUnits + caps->maxTextureImageUnits;
-
- // Transform feedback limits
- caps->maxTransformFeedbackInterleavedComponents = 0;
- caps->maxTransformFeedbackSeparateAttributes = 0;
- caps->maxTransformFeedbackSeparateComponents = 0;
-
- // Multisample limits
- caps->maxSamples = maxSamples;
-
- // GL extension support
- extensions->setTextureExtensionSupport(*textureCapsMap);
- extensions->elementIndexUint = deviceCaps.MaxVertexIndex >= (1 << 16);
- extensions->getProgramBinary = true;
- extensions->rgb8rgba8 = true;
- extensions->readFormatBGRA = true;
- extensions->pixelBufferObject = false;
- extensions->mapBuffer = false;
- extensions->mapBufferRange = false;
-
- // textureRG is emulated and not performant.
- extensions->textureRG = false;
-
- D3DADAPTER_IDENTIFIER9 adapterId = {};
- if (SUCCEEDED(d3d9->GetAdapterIdentifier(adapter, 0, &adapterId)))
- {
- // ATI cards on XP have problems with non-power-of-two textures.
- extensions->textureNPOT = !(deviceCaps.TextureCaps & D3DPTEXTURECAPS_POW2) &&
- !(deviceCaps.TextureCaps & D3DPTEXTURECAPS_CUBEMAP_POW2) &&
- !(deviceCaps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL) &&
- !(!isWindowsVistaOrGreater() && IsAMD(adapterId.VendorId));
-
- // Disable depth texture support on AMD cards (See ANGLE issue 839)
- if (IsAMD(adapterId.VendorId))
- {
- extensions->depthTextures = false;
- }
- }
- else
- {
- extensions->textureNPOT = false;
- }
-
- extensions->drawBuffers = false;
- extensions->textureStorage = true;
-
- // Must support a minimum of 2:1 anisotropy for max anisotropy to be considered supported, per the spec
- extensions->textureFilterAnisotropic = (deviceCaps.RasterCaps & D3DPRASTERCAPS_ANISOTROPY) != 0 && deviceCaps.MaxAnisotropy >= 2;
- extensions->maxTextureAnisotropy = static_cast<GLfloat>(deviceCaps.MaxAnisotropy);
-
- // Check occlusion query support by trying to create one
- IDirect3DQuery9 *occlusionQuery = nullptr;
- extensions->occlusionQueryBoolean = SUCCEEDED(device->CreateQuery(D3DQUERYTYPE_OCCLUSION, &occlusionQuery)) && occlusionQuery;
- SafeRelease(occlusionQuery);
-
- // Check event query support by trying to create one
- IDirect3DQuery9 *eventQuery = nullptr;
- extensions->fence = SUCCEEDED(device->CreateQuery(D3DQUERYTYPE_EVENT, &eventQuery)) && eventQuery;
- SafeRelease(eventQuery);
-
- extensions->disjointTimerQuery = false;
- extensions->robustness = true;
- // It seems that only DirectX 10 and higher enforce the well-defined behavior of always
- // returning zero values when out-of-bounds reads. See
- // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_robustness.txt
- extensions->robustBufferAccessBehavior = false;
- extensions->blendMinMax = true;
- extensions->framebufferBlit = true;
- extensions->framebufferMultisample = true;
- extensions->instancedArrays = deviceCaps.PixelShaderVersion >= D3DPS_VERSION(3, 0);
- extensions->packReverseRowOrder = true;
- extensions->standardDerivatives = (deviceCaps.PS20Caps.Caps & D3DPS20CAPS_GRADIENTINSTRUCTIONS) != 0;
- extensions->shaderTextureLOD = true;
- extensions->fragDepth = true;
- extensions->textureUsage = true;
- extensions->translatedShaderSource = true;
- extensions->fboRenderMipmap = false;
- extensions->discardFramebuffer = false; // It would be valid to set this to true, since glDiscardFramebufferEXT is just a hint
- extensions->colorBufferFloat = false;
- extensions->debugMarker = true;
- extensions->eglImage = true;
- extensions->eglImageExternal = true;
- extensions->unpackSubimage = true;
- extensions->packSubimage = true;
- extensions->syncQuery = extensions->fence;
- extensions->copyTexture = true;
-
- // D3D9 has no concept of separate masks and refs for front and back faces in the depth stencil
- // state.
- limitations->noSeparateStencilRefsAndMasks = true;
-
- // D3D9 shader models have limited support for looping, so the Appendix A
- // index/loop limitations are necessary. Workarounds that are needed to
- // support dynamic indexing of vectors on HLSL also don't work on D3D9.
- limitations->shadersRequireIndexedLoopValidation = true;
-
- // D3D9 cannot support constant color and alpha blend funcs together
- limitations->noSimultaneousConstantColorAndAlphaBlendFunc = true;
-}
-
-}
-
-namespace d3d9
-{
-
-GLuint ComputeBlockSize(D3DFORMAT format, GLuint width, GLuint height)
-{
- const D3DFormat &d3dFormatInfo = d3d9::GetD3DFormatInfo(format);
- GLuint numBlocksWide = (width + d3dFormatInfo.blockWidth - 1) / d3dFormatInfo.blockWidth;
- GLuint numBlocksHight = (height + d3dFormatInfo.blockHeight - 1) / d3dFormatInfo.blockHeight;
- return (d3dFormatInfo.pixelBytes * numBlocksWide * numBlocksHight);
-}
-
-void MakeValidSize(bool isImage, D3DFORMAT format, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset)
-{
- const D3DFormat &d3dFormatInfo = d3d9::GetD3DFormatInfo(format);
-
- int upsampleCount = 0;
- // Don't expand the size of full textures that are at least (blockWidth x blockHeight) already.
- if (isImage || *requestWidth < static_cast<GLsizei>(d3dFormatInfo.blockWidth) ||
- *requestHeight < static_cast<GLsizei>(d3dFormatInfo.blockHeight))
- {
- while (*requestWidth % d3dFormatInfo.blockWidth != 0 || *requestHeight % d3dFormatInfo.blockHeight != 0)
- {
- *requestWidth <<= 1;
- *requestHeight <<= 1;
- upsampleCount++;
- }
- }
- *levelOffset = upsampleCount;
-}
-
-angle::WorkaroundsD3D GenerateWorkarounds()
-{
- angle::WorkaroundsD3D workarounds;
- workarounds.mrtPerfWorkaround = true;
- workarounds.setDataFasterThanImageUpload = false;
- workarounds.useInstancedPointSpriteEmulation = false;
-
- // TODO(jmadill): Disable workaround when we have a fixed compiler DLL.
- workarounds.expandIntegerPowExpressions = true;
-
- // Call platform hooks for testing overrides.
- auto *platform = ANGLEPlatformCurrent();
- platform->overrideWorkaroundsD3D(platform, &workarounds);
-
- return workarounds;
-}
-
-} // namespace d3d9
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.h
deleted file mode 100644
index 5b65b8910a..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.h
+++ /dev/null
@@ -1,95 +0,0 @@
-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// renderer9_utils.h: Conversion functions and other utility routines
-// specific to the D3D9 renderer
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_RENDERER9UTILS_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_RENDERER9UTILS_H_
-
-#include "common/Color.h"
-#include "libANGLE/Caps.h"
-#include "libANGLE/Error.h"
-#include "platform/WorkaroundsD3D.h"
-
-namespace gl
-{
-class FramebufferAttachment;
-}
-
-namespace rx
-{
-class RenderTarget9;
-
-namespace gl_d3d9
-{
-
-D3DCMPFUNC ConvertComparison(GLenum comparison);
-D3DCOLOR ConvertColor(gl::ColorF color);
-D3DBLEND ConvertBlendFunc(GLenum blend);
-D3DBLENDOP ConvertBlendOp(GLenum blendOp);
-D3DSTENCILOP ConvertStencilOp(GLenum stencilOp);
-D3DTEXTUREADDRESS ConvertTextureWrap(GLenum wrap);
-D3DCULL ConvertCullMode(gl::CullFaceMode cullFace, GLenum frontFace);
-D3DCUBEMAP_FACES ConvertCubeFace(GLenum cubeFace);
-DWORD ConvertColorMask(bool red, bool green, bool blue, bool alpha);
-D3DTEXTUREFILTERTYPE ConvertMagFilter(GLenum magFilter, float maxAnisotropy);
-void ConvertMinFilter(GLenum minFilter, D3DTEXTUREFILTERTYPE *d3dMinFilter, D3DTEXTUREFILTERTYPE *d3dMipFilter,
- float *d3dLodBias, float maxAnisotropy, size_t baseLevel);
-D3DQUERYTYPE ConvertQueryType(GLenum queryType);
-
-D3DMULTISAMPLE_TYPE GetMultisampleType(GLuint samples);
-
-}
-
-namespace d3d9_gl
-{
-
-unsigned int GetReservedVertexUniformVectors();
-
-unsigned int GetReservedFragmentUniformVectors();
-
-GLsizei GetSamplesCount(D3DMULTISAMPLE_TYPE type);
-
-bool IsFormatChannelEquivalent(D3DFORMAT d3dformat, GLenum format);
-
-void GenerateCaps(IDirect3D9 *d3d9,
- IDirect3DDevice9 *device,
- D3DDEVTYPE deviceType,
- UINT adapter,
- gl::Caps *caps,
- gl::TextureCapsMap *textureCapsMap,
- gl::Extensions *extensions,
- gl::Limitations *limitations);
-}
-
-namespace d3d9
-{
-
-GLuint ComputeBlockSize(D3DFORMAT format, GLuint width, GLuint height);
-
-void MakeValidSize(bool isImage, D3DFORMAT format, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset);
-
-inline bool isDeviceLostError(HRESULT errorCode)
-{
- switch (errorCode)
- {
- case D3DERR_DRIVERINTERNALERROR:
- case D3DERR_DEVICELOST:
- case D3DERR_DEVICEHUNG:
- case D3DERR_DEVICEREMOVED:
- return true;
- default:
- return false;
- }
-}
-
-angle::WorkaroundsD3D GenerateWorkarounds();
-}
-
-} // namespace d3d9
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_RENDERER9UTILS_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/shaders/Blit.ps b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/shaders/Blit.ps
deleted file mode 100644
index ecc593cc78..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/shaders/Blit.ps
+++ /dev/null
@@ -1,67 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-sampler2D tex : s0;
-
-uniform float4 mult : c0;
-uniform float4 add : c1;
-
-// Passthrough Pixel Shader
-// Outputs texture 0 sampled at texcoord 0.
-float4 passthroughps(float4 texcoord : TEXCOORD0) : COLOR
-{
- return tex2D(tex, texcoord.xy);
-};
-
-// Luminance Conversion Pixel Shader
-// Performs a mad operation using the LA data from the texture with mult.xw and add.xw.
-// Returns data in the form of llla
-float4 luminanceps(float4 texcoord : TEXCOORD0) : COLOR
-{
- return (tex2D(tex, texcoord.xy).xw * mult.xw + add.xw).xxxy;
-};
-
-float4 luminancepremultps(float4 texcoord : TEXCOORD0) : COLOR
-{
- float4 luma = tex2D(tex, texcoord.xy).xxxw;
- luma.rgb *= luma.a;
- return luma * mult + add;
-};
-
-float4 luminanceunmultps(float4 texcoord : TEXCOORD0) : COLOR
-{
- float4 luma = tex2D(tex, texcoord.xy).xxxw;
- if (luma.a > 0.0f)
- {
- luma.rgb /= luma.a;
- }
- return luma * mult + add;
-};
-
-// RGB/A Component Mask Pixel Shader
-// Performs a mad operation using the texture's RGBA data with mult.xyzw and add.xyzw.
-// Returns data in the form of rgba
-float4 componentmaskps(float4 texcoord : TEXCOORD0) : COLOR
-{
- return tex2D(tex, texcoord.xy) * mult + add;
-};
-
-float4 componentmaskpremultps(float4 texcoord : TEXCOORD0) : COLOR
-{
- float4 color = tex2D(tex, texcoord.xy);
- color.rgb *= color.a;
- return color * mult + add;
-};
-
-float4 componentmaskunmultps(float4 texcoord : TEXCOORD0) : COLOR
-{
- float4 color = tex2D(tex, texcoord.xy);
- if (color.a > 0.0f)
- {
- color.rgb /= color.a;
- }
- return color * mult + add;
-};
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/shaders/Blit.vs b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/shaders/Blit.vs
deleted file mode 100644
index c68395a69c..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/shaders/Blit.vs
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-struct VS_OUTPUT
-{
- float4 position : POSITION;
- float4 texcoord : TEXCOORD0;
-};
-
-uniform float4 halfPixelSize : c0;
-uniform float4 texcoordOffset : c1;
-
-// Standard Vertex Shader
-// Input 0 is the homogenous position.
-// Outputs the homogenous position as-is.
-// Outputs a tex coord with (0,0) in the upper-left corner of the screen and (1,1) in the bottom right.
-// C0.X must be negative half-pixel width, C0.Y must be half-pixel height. C0.ZW must be 0.
-VS_OUTPUT standardvs(in float4 position : POSITION)
-{
- VS_OUTPUT Out;
-
- Out.position = position + halfPixelSize;
- Out.texcoord = ((position * float4(0.5, -0.5, 1.0, 1.0) + float4(0.5, 0.5, 0, 0)) * float4(texcoordOffset.zw, 1.0, 1.0)) + float4(texcoordOffset.xy, 0, 0);
-
- return Out;
-};
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/vertexconversion.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/vertexconversion.h
deleted file mode 100644
index aa05934bc8..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d9/vertexconversion.h
+++ /dev/null
@@ -1,200 +0,0 @@
-//
-// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// vertexconversion.h: A library of vertex conversion classes that can be used to build
-// the FormatConverter objects used by the buffer conversion system.
-
-#ifndef LIBANGLE_RENDERER_D3D_D3D9_VERTEXCONVERSION_H_
-#define LIBANGLE_RENDERER_D3D_D3D9_VERTEXCONVERSION_H_
-
-#include <limits>
-#include <cstdint>
-#include <cstddef>
-
-namespace rx
-{
-
-// Conversion types:
-// static const bool identity: true if this is an identity transform, false otherwise
-// static U convert(T): convert a single element from the input type to the output type
-// typedef ... OutputType: the type produced by this conversion
-
-template <class T>
-struct Identity
-{
- static const bool identity = true;
-
- typedef T OutputType;
-
- static T convert(T x)
- {
- return x;
- }
-};
-
-template <class FromT, class ToT>
-struct Cast
-{
- static const bool identity = false;
-
- typedef ToT OutputType;
-
- static ToT convert(FromT x)
- {
- return static_cast<ToT>(x);
- }
-};
-
-template <class T>
-struct Cast<T, T>
-{
- static const bool identity = true;
-
- typedef T OutputType;
-
- static T convert(T x)
- {
- return static_cast<T>(x);
- }
-};
-
-template <class T>
-struct Normalize
-{
- static const bool identity = false;
-
- typedef float OutputType;
-
- static float convert(T x)
- {
- typedef std::numeric_limits<T> NL;
- float f = static_cast<float>(x);
-
- if (NL::is_signed)
- {
- // const float => VC2008 computes it at compile time
- // static const float => VC2008 computes it the first time we get here, stores it to memory with static guard and all that.
- const float divisor = 1.0f/(2*static_cast<float>(NL::max())+1);
- return (2*f+1)*divisor;
- }
- else
- {
- return f/NL::max();
- }
- }
-};
-
-template <class FromType, std::size_t ScaleBits>
-struct FixedToFloat
-{
- static const bool identity = false;
-
- typedef float OutputType;
-
- static float convert(FromType x)
- {
- const float divisor = 1.0f / static_cast<float>(static_cast<FromType>(1) << ScaleBits);
- return static_cast<float>(x) * divisor;
- }
-};
-
-// Widen types:
-// static const unsigned int initialWidth: number of components before conversion
-// static const unsigned int finalWidth: number of components after conversion
-
-// Float is supported at any size.
-template <std::size_t N>
-struct NoWiden
-{
- static const std::size_t initialWidth = N;
- static const std::size_t finalWidth = N;
-};
-
-// SHORT, norm-SHORT, norm-UNSIGNED_SHORT are supported but only with 2 or 4 components
-template <std::size_t N>
-struct WidenToEven
-{
- static const std::size_t initialWidth = N;
- static const std::size_t finalWidth = N+(N&1);
-};
-
-template <std::size_t N>
-struct WidenToFour
-{
- static const std::size_t initialWidth = N;
- static const std::size_t finalWidth = 4;
-};
-
-// Most types have 0 and 1 that are just that.
-template <class T>
-struct SimpleDefaultValues
-{
- static T zero() { return static_cast<T>(0); }
- static T one() { return static_cast<T>(1); }
-};
-
-// But normalised types only store [0,1] or [-1,1] so 1.0 is represented by the max value.
-template <class T>
-struct NormalizedDefaultValues
-{
- static T zero() { return static_cast<T>(0); }
- static T one() { return std::numeric_limits<T>::max(); }
-};
-
-// Converter:
-// static const bool identity: true if this is an identity transform (with no widening)
-// static const std::size_t finalSize: number of bytes per output vertex
-// static void convertArray(const void *in, std::size_t stride, std::size_t n, void *out): convert an array of vertices. Input may be strided, but output will be unstrided.
-
-template <class InT,
- class WidenRule,
- class Converter,
- class DefaultValueRule = SimpleDefaultValues<InT>>
-struct VertexDataConverter
-{
- typedef typename Converter::OutputType OutputType;
- typedef InT InputType;
-
- static const bool identity = (WidenRule::initialWidth == WidenRule::finalWidth) && Converter::identity;
- static const std::size_t finalSize = WidenRule::finalWidth * sizeof(OutputType);
-
- static void convertArray(const uint8_t *input, size_t stride, size_t n, uint8_t *output)
- {
- OutputType *out = reinterpret_cast<OutputType*>(output);
-
- for (std::size_t i = 0; i < n; i++)
- {
- const InputType *ein = reinterpret_cast<const InputType*>(input + i * stride);
-
- copyComponent(out, ein, 0, static_cast<OutputType>(DefaultValueRule::zero()));
- copyComponent(out, ein, 1, static_cast<OutputType>(DefaultValueRule::zero()));
- copyComponent(out, ein, 2, static_cast<OutputType>(DefaultValueRule::zero()));
- copyComponent(out, ein, 3, static_cast<OutputType>(DefaultValueRule::one()));
-
- out += WidenRule::finalWidth;
- }
- }
-
- private:
- static void copyComponent(OutputType *out, const InputType *in, std::size_t elementindex, OutputType defaultvalue)
- {
- if (WidenRule::finalWidth > elementindex)
- {
- if (WidenRule::initialWidth > elementindex)
- {
- out[elementindex] = Converter::convert(in[elementindex]);
- }
- else
- {
- out[elementindex] = defaultvalue;
- }
- }
- }
-};
-
-}
-
-#endif // LIBANGLE_RENDERER_D3D_D3D9_VERTEXCONVERSION_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/formatutilsD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/formatutilsD3D.h
deleted file mode 100644
index a245a0432f..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/formatutilsD3D.h
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// formatutils9.h: Queries for GL image formats and their translations to D3D
-// formats.
-
-#ifndef LIBANGLE_RENDERER_D3D_FORMATUTILSD3D_H_
-#define LIBANGLE_RENDERER_D3D_FORMATUTILSD3D_H_
-
-#include "angle_gl.h"
-
-#include <cstddef>
-#include <stdint.h>
-
-#include <map>
-
-namespace gl
-{
-struct FormatType;
-}
-
-namespace rx
-{
-typedef void (*VertexCopyFunction)(const uint8_t *input, size_t stride, size_t count, uint8_t *output);
-
-enum VertexConversionType
-{
- VERTEX_CONVERT_NONE = 0,
- VERTEX_CONVERT_CPU = 1,
- VERTEX_CONVERT_GPU = 2,
- VERTEX_CONVERT_BOTH = 3
-};
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_D3D_FORMATUTILSD3D_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/driver_utils.cpp b/src/3rdparty/angle/src/libANGLE/renderer/driver_utils.cpp
deleted file mode 100644
index d97b8e7c22..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/driver_utils.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// driver_utils.h : provides more information about current driver.
-
-#include <algorithm>
-
-#include "libANGLE/renderer/driver_utils.h"
-
-namespace rx
-{
-// Intel
-// Referenced from https://cgit.freedesktop.org/vaapi/intel-driver/tree/src/i965_pciids.h
-namespace
-{
-// gen7
-const uint32_t Haswell[] = {
- 0x0402, 0x0406, 0x040A, 0x040B, 0x040E, 0x0C02, 0x0C06, 0x0C0A, 0x0C0B, 0x0C0E,
- 0x0A02, 0x0A06, 0x0A0A, 0x0A0B, 0x0A0E, 0x0D02, 0x0D06, 0x0D0A, 0x0D0B, 0x0D0E, // hsw_gt1
- 0x0412, 0x0416, 0x041A, 0x041B, 0x041E, 0x0C12, 0x0C16, 0x0C1A, 0x0C1B, 0x0C1E,
- 0x0A12, 0x0A16, 0x0A1A, 0x0A1B, 0x0A1E, 0x0D12, 0x0D16, 0x0D1A, 0x0D1B, 0x0D1E, // hsw_gt2
- 0x0422, 0x0426, 0x042A, 0x042B, 0x042E, 0x0C22, 0x0C26, 0x0C2A, 0x0C2B, 0x0C2E,
- 0x0A22, 0x0A26, 0x0A2A, 0x0A2B, 0x0A2E, 0x0D22, 0x0D26, 0x0D2A, 0x0D2B, 0x0D2E // hsw_gt3
-};
-
-// gen8
-const uint32_t Broadwell[] = {0x1602, 0x1606, 0x160A, 0x160B, 0x160D, 0x160E,
- 0x1612, 0x1616, 0x161A, 0x161B, 0x161D, 0x161E,
- 0x1622, 0x1626, 0x162A, 0x162B, 0x162D, 0x162E};
-
-const uint32_t CherryView[] = {0x22B0, 0x22B1, 0x22B2, 0x22B3};
-
-// gen9
-const uint32_t Skylake[] = {0x1902, 0x1906, 0x190A, 0x190B, 0x190E, 0x1912, 0x1913, 0x1915, 0x1916,
- 0x1917, 0x191A, 0x191B, 0x191D, 0x191E, 0x1921, 0x1923, 0x1926, 0x1927,
- 0x192A, 0x192B, 0x192D, 0x1932, 0x193A, 0x193B, 0x193D};
-
-const uint32_t Broxton[] = {0x0A84, 0x1A84, 0x1A85, 0x5A84, 0x5A85};
-
-// gen9p5
-const uint32_t Kabylake[] = {0x5916, 0x5913, 0x5906, 0x5926, 0x5921, 0x5915, 0x590E,
- 0x591E, 0x5912, 0x5917, 0x5902, 0x591B, 0x593B, 0x590B,
- 0x591A, 0x590A, 0x591D, 0x5908, 0x5923, 0x5927};
-
-} // anonymous namespace
-
-IntelDriverVersion::IntelDriverVersion(uint16_t lastPart) : mVersionPart(lastPart)
-{
-}
-
-bool IntelDriverVersion::operator==(const IntelDriverVersion &version)
-{
- return mVersionPart == version.mVersionPart;
-}
-
-bool IntelDriverVersion::operator!=(const IntelDriverVersion &version)
-{
- return !(*this == version);
-}
-
-bool IntelDriverVersion::operator<(const IntelDriverVersion &version)
-{
- // See http://www.intel.com/content/www/us/en/support/graphics-drivers/000005654.html to
- // understand the Intel graphics driver version number on Windows.
- // mVersionPart1 changes with OS version. mVersionPart2 changes with DirectX version.
- // mVersionPart3 stands for release year. mVersionPart4 is driver specific unique version
- // number.
- // For example: Intel driver version '20.19.15.4539'
- // 20 -> windows 10 driver
- // 19 -> DirectX 12 first version(12.0) supported
- // 15 -> Driver released in 2015
- // 4539 -> Driver specific unique version number
- // For linux, Intel graphics driver version is the mesa version. The version number has three
- // parts: major revision, minor revision, release number. So, for linux, we need to compare
- // three parts.
- // Currently, it's only used in windows. So, checking the last part is enough. Once it's needed
- // in other platforms, it's easy to be extended.
- return mVersionPart < version.mVersionPart;
-}
-
-bool IntelDriverVersion::operator>=(const IntelDriverVersion &version)
-{
- return !(*this < version);
-}
-
-bool IsHaswell(uint32_t DeviceId)
-{
- return std::find(std::begin(Haswell), std::end(Haswell), DeviceId) != std::end(Haswell);
-}
-
-bool IsBroadwell(uint32_t DeviceId)
-{
- return std::find(std::begin(Broadwell), std::end(Broadwell), DeviceId) != std::end(Broadwell);
-}
-
-bool IsCherryView(uint32_t DeviceId)
-{
- return std::find(std::begin(CherryView), std::end(CherryView), DeviceId) !=
- std::end(CherryView);
-}
-
-bool IsSkylake(uint32_t DeviceId)
-{
- return std::find(std::begin(Skylake), std::end(Skylake), DeviceId) != std::end(Skylake);
-}
-
-bool IsBroxton(uint32_t DeviceId)
-{
- return std::find(std::begin(Broxton), std::end(Broxton), DeviceId) != std::end(Broxton);
-}
-
-bool IsKabylake(uint32_t DeviceId)
-{
- return std::find(std::begin(Kabylake), std::end(Kabylake), DeviceId) != std::end(Kabylake);
-}
-
-} // namespace rx \ No newline at end of file
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/driver_utils.h b/src/3rdparty/angle/src/libANGLE/renderer/driver_utils.h
deleted file mode 100644
index 62bdc502fc..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/driver_utils.h
+++ /dev/null
@@ -1,73 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// driver_utils.h : provides more information about current driver.
-
-#ifndef LIBANGLE_RENDERER_DRIVER_UTILS_H_
-#define LIBANGLE_RENDERER_DRIVER_UTILS_H_
-
-#include "libANGLE/angletypes.h"
-
-namespace rx
-{
-
-enum VendorID : uint32_t
-{
- VENDOR_ID_UNKNOWN = 0x0,
- VENDOR_ID_AMD = 0x1002,
- VENDOR_ID_INTEL = 0x8086,
- VENDOR_ID_NVIDIA = 0x10DE,
- // This is Qualcomm PCI Vendor ID.
- // Android doesn't have a PCI bus, but all we need is a unique id.
- VENDOR_ID_QUALCOMM = 0x5143,
-};
-
-inline bool IsAMD(uint32_t vendor_id)
-{
- return vendor_id == VENDOR_ID_AMD;
-}
-
-inline bool IsIntel(uint32_t vendor_id)
-{
- return vendor_id == VENDOR_ID_INTEL;
-}
-
-inline bool IsNvidia(uint32_t vendor_id)
-{
- return vendor_id == VENDOR_ID_NVIDIA;
-}
-
-inline bool IsQualcomm(uint32_t vendor_id)
-{
- return vendor_id == VENDOR_ID_QUALCOMM;
-}
-
-// Intel
-class IntelDriverVersion
-{
- public:
- // Currently, We only provide the constructor with one parameter. It mainly used in Intel
- // version number on windows. If you want to use this class on other platforms, it's easy to
- // be extended.
- IntelDriverVersion(uint16_t lastPart);
- bool operator==(const IntelDriverVersion &);
- bool operator!=(const IntelDriverVersion &);
- bool operator<(const IntelDriverVersion &);
- bool operator>=(const IntelDriverVersion &);
-
- private:
- uint16_t mVersionPart;
-};
-
-bool IsHaswell(uint32_t DeviceId);
-bool IsBroadwell(uint32_t DeviceId);
-bool IsCherryView(uint32_t DeviceId);
-bool IsSkylake(uint32_t DeviceId);
-bool IsBroxton(uint32_t DeviceId);
-bool IsKabylake(uint32_t DeviceId);
-
-} // namespace rx
-#endif // LIBANGLE_RENDERER_DRIVER_UTILS_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/load_functions_data.json b/src/3rdparty/angle/src/libANGLE/renderer/load_functions_data.json
deleted file mode 100644
index 198274998c..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/load_functions_data.json
+++ /dev/null
@@ -1,602 +0,0 @@
-{
- "GL_RG8_SNORM": {
- "R8G8_SNORM": {
- "GL_BYTE": "LoadToNative<GLbyte, 2>"
- }
- },
- "GL_SRGB8": {
- "R8G8B8A8_UNORM_SRGB": {
- "GL_UNSIGNED_BYTE": "LoadToNative3To4<GLubyte, 0xFF>"
- }
- },
- "GL_RGBA8I": {
- "R8G8B8A8_SINT": {
- "GL_BYTE": "LoadToNative<GLbyte, 4>"
- }
- },
- "GL_R8_SNORM": {
- "R8_SNORM": {
- "GL_BYTE": "LoadToNative<GLbyte, 1>"
- }
- },
- "GL_RGBA8_SNORM": {
- "R8G8B8A8_SNORM": {
- "GL_BYTE": "LoadToNative<GLbyte, 4>"
- }
- },
- "GL_R16I": {
- "R16_SINT": {
- "GL_SHORT": "LoadToNative<GLshort, 1>"
- }
- },
- "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC": {
- "R8G8B8A8_UNORM_SRGB": {
- "GL_UNSIGNED_BYTE": "LoadETC2SRGBA8ToSRGBA8"
- }
- },
- "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2": {
- "R8G8B8A8_UNORM": {
- "GL_UNSIGNED_BYTE": "LoadETC2RGB8A1ToRGBA8"
- }
- },
- "GL_RGB32UI": {
- "R32G32B32A32_UINT": {
- "GL_UNSIGNED_INT": "LoadToNative3To4<GLuint, 0x00000001>"
- }
- },
- "GL_ALPHA32F_EXT": {
- "NONE": {
- "GL_FLOAT": "LoadA32FToRGBA32F"
- }
- },
- "GL_R16UI": {
- "R16_UINT": {
- "GL_UNSIGNED_SHORT": "LoadToNative<GLushort, 1>"
- }
- },
- "GL_RGB9_E5": {
- "R9G9B9E5_SHAREDEXP": {
- "GL_HALF_FLOAT": "LoadRGB16FToRGB9E5",
- "GL_UNSIGNED_INT_5_9_9_9_REV": "LoadToNative<GLuint, 1>",
- "GL_FLOAT": "LoadRGB32FToRGB9E5",
- "GL_HALF_FLOAT_OES": "LoadRGB16FToRGB9E5"
- }
- },
- "GL_COMPRESSED_R11_EAC": {
- "R8_UNORM": {
- "GL_UNSIGNED_BYTE": "LoadEACR11ToR8"
- }
- },
- "GL_RGBA32UI": {
- "R32G32B32A32_UINT": {
- "GL_UNSIGNED_INT": "LoadToNative<GLuint, 4>"
- }
- },
- "GL_RG8UI": {
- "R8G8_UINT": {
- "GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 2>"
- }
- },
- "GL_LUMINANCE32F_EXT": {
- "NONE": {
- "GL_FLOAT": "LoadL32FToRGBA32F"
- }
- },
- "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2": {
- "R8G8B8A8_UNORM_SRGB": {
- "GL_UNSIGNED_BYTE": "LoadETC2SRGB8A1ToRGBA8"
- }
- },
- "GL_R16F": {
- "R16_FLOAT": {
- "GL_HALF_FLOAT": "LoadToNative<GLhalf, 1>",
- "GL_FLOAT": "Load32FTo16F<1>",
- "GL_HALF_FLOAT_OES": "LoadToNative<GLhalf, 1>"
- }
- },
- "GL_RGBA8UI": {
- "R8G8B8A8_UINT": {
- "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>",
- "GL_FLOAT": "Load32FTo16F<4>",
- "GL_HALF_FLOAT_OES": "LoadToNative<GLhalf, 4>"
- }
- },
- "GL_LUMINANCE8_EXT": {
- "NONE": {
- "GL_UNSIGNED_BYTE": "LoadL8ToRGBA8"
- }
- },
- "GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE": {
- "NONE": {
- "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 16>"
- }
- },
- "GL_RGB": {
- "NONE": {
- "GL_UNSIGNED_BYTE": "UnreachableLoadFunction",
- "GL_UNSIGNED_SHORT_5_6_5": "UnreachableLoadFunction"
- }
- },
- "GL_RGB5_A1": {
- "R8G8B8A8_UNORM": {
- "GL_UNSIGNED_INT_2_10_10_10_REV": "LoadRGB10A2ToRGBA8",
- "GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 4>",
- "GL_UNSIGNED_SHORT_5_5_5_1": "LoadRGB5A1ToRGBA8"
- },
- "B5G5R5A1_UNORM": {
- "GL_UNSIGNED_INT_2_10_10_10_REV": "LoadRGB10A2ToBGR5A1",
- "GL_UNSIGNED_BYTE": "LoadRGBA8ToBGR5A1",
- "GL_UNSIGNED_SHORT_5_5_5_1": "LoadRGB5A1ToA1RGB5"
- }
- },
- "GL_RGB16UI": {
- "R16G16B16A16_UINT": {
- "GL_UNSIGNED_SHORT": "LoadToNative3To4<GLushort, 0x0001>"
- }
- },
- "GL_BGRA_EXT": {
- "NONE": {
- "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
- }
- },
- "GL_COMPRESSED_RGB8_ETC2": {
- "R8G8B8A8_UNORM": {
- "GL_UNSIGNED_BYTE": "LoadETC2RGB8ToRGBA8"
- }
- },
- "GL_RGBA32F": {
- "R32G32B32A32_FLOAT": {
- "GL_FLOAT": "LoadToNative<GLfloat, 4>"
- }
- },
- "GL_RGBA32I": {
- "R32G32B32A32_SINT": {
- "GL_INT": "LoadToNative<GLint, 4>"
- }
- },
- "GL_LUMINANCE8_ALPHA8_EXT": {
- "NONE": {
- "GL_UNSIGNED_BYTE": "LoadLA8ToRGBA8"
- }
- },
- "GL_RG8": {
- "R8G8_UNORM": {
- "GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 2>"
- }
- },
- "GL_RGB10_A2": {
- "R10G10B10A2_UNORM": {
- "GL_UNSIGNED_INT_2_10_10_10_REV": "LoadToNative<GLuint, 1>"
- }
- },
- "GL_COMPRESSED_SIGNED_RG11_EAC": {
- "R8G8_SNORM": {
- "GL_UNSIGNED_BYTE": "LoadEACRG11SToRG8"
- }
- },
- "GL_DEPTH_COMPONENT16": {
- "D16_UNORM": {
- "GL_UNSIGNED_INT": "LoadR32ToR16",
- "GL_UNSIGNED_SHORT": "LoadToNative<GLushort, 1>"
- }
- },
- "GL_RGB32I": {
- "R32G32B32A32_SINT": {
- "GL_INT": "LoadToNative3To4<GLint, 0x00000001>"
- }
- },
- "GL_R8": {
- "R8_UNORM": {
- "GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 1>"
- }
- },
- "GL_RGB32F": {
- "R32G32B32A32_FLOAT": {
- "GL_FLOAT": "LoadToNative3To4<GLfloat, gl::Float32One>"
- }
- },
- "GL_R11F_G11F_B10F": {
- "R11G11B10_FLOAT": {
- "GL_UNSIGNED_INT_10F_11F_11F_REV": "LoadToNative<GLuint, 1>",
- "GL_HALF_FLOAT": "LoadRGB16FToRG11B10F",
- "GL_FLOAT": "LoadRGB32FToRG11B10F",
- "GL_HALF_FLOAT_OES": "LoadRGB16FToRG11B10F"
- }
- },
- "GL_RGB8": {
- "R8G8B8A8_UNORM": {
- "GL_UNSIGNED_BYTE": "LoadToNative3To4<GLubyte, 0xFF>"
- }
- },
- "GL_LUMINANCE_ALPHA": {
- "R16G16B16A16_FLOAT": {
- "GL_HALF_FLOAT": "LoadLA16FToRGBA16F",
- "GL_HALF_FLOAT_OES": "LoadLA16FToRGBA16F"
- },
- "NONE": {
- "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
- },
- "R32G32B32A32_FLOAT": {
- "GL_FLOAT": "LoadLA32FToRGBA32F"
- }
- },
- "GL_RGBA16I": {
- "R16G16B16A16_SINT": {
- "GL_SHORT": "LoadToNative<GLshort, 4>"
- }
- },
- "GL_R8I": {
- "R8_SINT": {
- "GL_BYTE": "LoadToNative<GLbyte, 1>"
- }
- },
- "GL_RGB8_SNORM": {
- "R8G8B8A8_SNORM": {
- "GL_BYTE": "LoadToNative3To4<GLbyte, 0x7F>"
- }
- },
- "GL_RG32F": {
- "R32G32_FLOAT": {
- "GL_FLOAT": "LoadToNative<GLfloat, 2>"
- }
- },
- "GL_DEPTH_COMPONENT32F": {
- "D32_FLOAT": {
- "GL_FLOAT": "LoadD32FToD32F"
- }
- },
- "GL_RG32I": {
- "R32G32_SINT": {
- "GL_INT": "LoadToNative<GLint, 2>"
- }
- },
- "GL_ALPHA8_EXT": {
- "A8_UNORM": {
- "GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 1>"
- },
- "R8G8B8A8_UNORM": {
- "GL_UNSIGNED_BYTE": "LoadA8ToRGBA8"
- }
- },
- "GL_RG32UI": {
- "R32G32_UINT": {
- "GL_UNSIGNED_INT": "LoadToNative<GLuint, 2>"
- }
- },
- "GL_RGBA16UI": {
- "R16G16B16A16_UINT": {
- "GL_UNSIGNED_SHORT": "LoadToNative<GLushort, 4>"
- }
- },
- "GL_COMPRESSED_RGBA8_ETC2_EAC": {
- "R8G8B8A8_UNORM": {
- "GL_UNSIGNED_BYTE": "LoadETC2RGBA8ToRGBA8"
- }
- },
- "GL_RGB8I": {
- "R8G8B8A8_SINT": {
- "GL_BYTE": "LoadToNative3To4<GLbyte, 0x01>"
- }
- },
- "GL_COMPRESSED_SRGB8_ETC2": {
- "R8G8B8A8_UNORM_SRGB": {
- "GL_UNSIGNED_BYTE": "LoadETC2SRGB8ToRGBA8"
- }
- },
- "GL_DEPTH32F_STENCIL8": {
- "D32_FLOAT_S8X24_UINT": {
- "GL_FLOAT_32_UNSIGNED_INT_24_8_REV": "LoadD32FS8X24ToD32FS8X24"
- }
- },
- "GL_RG8I": {
- "R8G8_SINT": {
- "GL_BYTE": "LoadToNative<GLbyte, 2>"
- }
- },
- "GL_R32UI": {
- "R32_UINT": {
- "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_BGR565_ANGLEX": {
- "B5G6R5_UNORM": {
- "GL_UNSIGNED_SHORT_5_6_5": "LoadRGB565ToBGR565",
- "GL_UNSIGNED_BYTE": "LoadToNative<GLushort, 1>"
- }
- },
- "GL_COMPRESSED_RG11_EAC": {
- "R8G8_UNORM": {
- "GL_UNSIGNED_BYTE": "LoadEACRG11ToRG8"
- }
- },
- "GL_SRGB8_ALPHA8": {
- "R8G8B8A8_UNORM_SRGB": {
- "GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 4>"
- }
- },
- "GL_LUMINANCE_ALPHA16F_EXT": {
- "NONE": {
- "GL_HALF_FLOAT": "LoadLA16FToRGBA16F",
- "GL_HALF_FLOAT_OES": "LoadLA16FToRGBA16F"
- }
- },
- "GL_RGBA": {
- "NONE": {
- "GL_UNSIGNED_BYTE": "UnreachableLoadFunction",
- "GL_UNSIGNED_SHORT_4_4_4_4": "UnreachableLoadFunction",
- "GL_UNSIGNED_SHORT_5_5_5_1": "UnreachableLoadFunction"
- }
- },
- "GL_DEPTH24_STENCIL8": {
- "D24_UNORM_S8_UINT": {
- "GL_UNSIGNED_INT_24_8": "LoadR32ToR24G8"
- }
- },
- "GL_RGB16I": {
- "R16G16B16A16_SINT": {
- "GL_SHORT": "LoadToNative3To4<GLshort, 0x0001>"
- }
- },
- "GL_R8UI": {
- "R8_UINT": {
- "GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 1>"
- }
- },
- "GL_ALPHA": {
- "R16G16B16A16_FLOAT": {
- "GL_HALF_FLOAT": "LoadA16FToRGBA16F",
- "GL_HALF_FLOAT_OES": "LoadA16FToRGBA16F"
- },
- "NONE": {
- "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
- },
- "R32G32B32A32_FLOAT": {
- "GL_FLOAT": "LoadA32FToRGBA32F"
- }
- },
- "GL_RGB16F": {
- "R16G16B16A16_FLOAT": {
- "GL_HALF_FLOAT": "LoadToNative3To4<GLhalf, gl::Float16One>",
- "GL_FLOAT": "LoadRGB32FToRGBA16F",
- "GL_HALF_FLOAT_OES": "LoadToNative3To4<GLhalf, gl::Float16One>"
- }
- },
- "GL_COMPRESSED_SIGNED_R11_EAC": {
- "R8_SNORM": {
- "GL_UNSIGNED_BYTE": "LoadEACR11SToR8"
- }
- },
- "GL_COMPRESSED_RGB_S3TC_DXT1_EXT": {
- "NONE": {
- "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 8>"
- }
- },
- "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT": {
- "NONE": {
- "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 8>"
- }
- },
- "GL_STENCIL_INDEX8": {
- "NONE": {
- "GL_UNSIGNED_BYTE": "UnimplementedLoadFunction"
- }
- },
- "GL_LUMINANCE_ALPHA32F_EXT": {
- "NONE": {
- "GL_FLOAT": "LoadLA32FToRGBA32F"
- }
- },
- "GL_RGB8UI": {
- "R8G8B8A8_UINT": {
- "GL_UNSIGNED_BYTE": "LoadToNative3To4<GLubyte, 0x01>"
- }
- },
- "GL_DEPTH_COMPONENT24": {
- "D24_UNORM_S8_UINT": {
- "GL_UNSIGNED_INT": "LoadR32ToR24G8"
- }
- },
- "GL_R32I": {
- "R32_SINT": {
- "GL_INT": "LoadToNative<GLint, 1>"
- }
- },
- "GL_DEPTH_COMPONENT32_OES": {
- "NONE": {
- "GL_UNSIGNED_INT": "LoadR32ToR24G8"
- }
- },
- "GL_R32F": {
- "R32_FLOAT": {
- "GL_FLOAT": "LoadToNative<GLfloat, 1>"
- }
- },
- "GL_RG16F": {
- "R16G16_FLOAT": {
- "GL_HALF_FLOAT": "LoadToNative<GLhalf, 2>",
- "GL_FLOAT": "Load32FTo16F<2>",
- "GL_HALF_FLOAT_OES": "LoadToNative<GLhalf, 2>"
- }
- },
- "GL_RGB565": {
- "R8G8B8A8_UNORM": {
- "GL_UNSIGNED_BYTE": "LoadToNative3To4<GLubyte, 0xFF>",
- "GL_UNSIGNED_SHORT_5_6_5": "LoadR5G6B5ToRGBA8"
- },
- "B5G6R5_UNORM": {
- "GL_UNSIGNED_BYTE": "LoadRGB8ToBGR565",
- "GL_UNSIGNED_SHORT_5_6_5": "LoadToNative<GLushort, 1>"
- }
- },
- "GL_LUMINANCE16F_EXT": {
- "NONE": {
- "GL_HALF_FLOAT": "LoadL16FToRGBA16F",
- "GL_HALF_FLOAT_OES": "LoadL16FToRGBA16F"
- }
- },
- "GL_RG16UI": {
- "R16G16_UINT": {
- "GL_UNSIGNED_SHORT": "LoadToNative<GLushort, 2>"
- }
- },
- "GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE": {
- "NONE": {
- "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 16>"
- }
- },
- "GL_RG16I": {
- "R16G16_SINT": {
- "GL_SHORT": "LoadToNative<GLshort, 2>"
- }
- },
- "GL_BGRA8_EXT": {
- "NONE": {
- "GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 4>"
- }
- },
- "GL_ALPHA16F_EXT": {
- "NONE": {
- "GL_HALF_FLOAT": "LoadA16FToRGBA16F",
- "GL_HALF_FLOAT_OES": "LoadA16FToRGBA16F"
- }
- },
- "GL_RGBA4": {
- "R8G8B8A8_UNORM": {
- "GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 4>",
- "GL_UNSIGNED_SHORT_4_4_4_4": "LoadRGBA4ToRGBA8"
- },
- "B4G4R4A4_UNORM": {
- "GL_UNSIGNED_BYTE": "LoadRGBA8ToBGRA4",
- "GL_UNSIGNED_SHORT_4_4_4_4": "LoadRGBA4ToARGB4"
- }
- },
- "GL_RGBA8": {
- "R8G8B8A8_UNORM": {
- "GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 4>"
- }
- },
- "GL_LUMINANCE": {
- "R16G16B16A16_FLOAT": {
- "GL_HALF_FLOAT": "LoadL16FToRGBA16F",
- "GL_HALF_FLOAT_OES": "LoadL16FToRGBA16F"
- },
- "NONE": {
- "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
- },
- "R32G32B32A32_FLOAT": {
- "GL_FLOAT": "LoadL32FToRGBA32F"
- }
- },
- "GL_RGB10_A2UI": {
- "R10G10B10A2_UINT": {
- "GL_UNSIGNED_INT_2_10_10_10_REV": "LoadToNative<GLuint, 1>"
- }
- },
- "GL_ETC1_RGB8_OES": {
- "R8G8B8A8_UNORM": {
- "GL_UNSIGNED_BYTE": "LoadETC1RGB8ToRGBA8"
- }
- },
- "GL_ETC1_RGB8_LOSSY_DECODE_ANGLE": {
- "BC1_RGB_UNORM_BLOCK": {
- "GL_UNSIGNED_BYTE": "LoadETC1RGB8ToBC1"
- }
- },
- "GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE": {
- "BC1_RGB_UNORM_BLOCK": {
- "GL_UNSIGNED_BYTE": "LoadETC2RGB8ToBC1"
- }
- },
- "GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE": {
- "BC1_RGB_UNORM_SRGB_BLOCK": {
- "GL_UNSIGNED_BYTE": "LoadETC2SRGB8ToBC1"
- }
- },
- "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE": {
- "BC1_RGBA_UNORM_BLOCK": {
- "GL_UNSIGNED_BYTE": "LoadETC2RGB8A1ToBC1"
- }
- },
- "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE": {
- "BC1_RGBA_UNORM_SRGB_BLOCK": {
- "GL_UNSIGNED_BYTE": "LoadETC2SRGB8A1ToBC1"
- }
- },
- "GL_R16_EXT": {
- "R16_UNORM": {
- "GL_UNSIGNED_SHORT": "LoadToNative<GLushort, 1>"
- }
- },
- "GL_RG16_EXT": {
- "R16G16_UNORM": {
- "GL_UNSIGNED_SHORT": "LoadToNative<GLushort, 2>"
- }
- },
- "GL_RGB16_EXT": {
- "R16G16B16A16_UNORM": {
- "GL_UNSIGNED_SHORT": "LoadToNative3To4<GLushort, 0xFFFF>"
- }
- },
- "GL_RGBA16_EXT": {
- "R16G16B16A16_UNORM": {
- "GL_UNSIGNED_SHORT": "LoadToNative<GLushort, 4>"
- }
- },
- "GL_R16_SNORM_EXT": {
- "R16_SNORM": {
- "GL_SHORT": "LoadToNative<GLushort, 1>"
- }
- },
- "GL_RG16_SNORM_EXT": {
- "R16G16_SNORM": {
- "GL_SHORT": "LoadToNative<GLushort, 2>"
- }
- },
- "GL_RGB16_SNORM_EXT": {
- "R16G16B16A16_SNORM": {
- "GL_SHORT": "LoadToNative3To4<GLushort, 0x7FFF>"
- }
- },
- "GL_RGBA16_SNORM_EXT": {
- "R16G16B16A16_SNORM": {
- "GL_SHORT": "LoadToNative<GLushort, 4>"
- }
- },
- "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT": {
- "NONE": {
- "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 16>"
- }
- },
- "GL_COMPRESSED_SRGB_S3TC_DXT1_EXT": {
- "NONE": {
- "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 8>"
- }
- },
- "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT": {
- "NONE": {
- "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 8>"
- }
- },
- "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT": {
- "NONE": {
- "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 16>"
- }
- }
-}
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/load_functions_table.h b/src/3rdparty/angle/src/libANGLE/renderer/load_functions_table.h
deleted file mode 100644
index f3da31c100..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/load_functions_table.h
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// load_functions_table:
-// Contains load functions table depending on internal format and ANGLE format.
-//
-
-#ifndef LIBANGLE_RENDERER_LOADFUNCTIONSTABLE_H_
-#define LIBANGLE_RENDERER_LOADFUNCTIONSTABLE_H_
-
-#include "libANGLE/renderer/Format.h"
-
-namespace angle
-{
-
-rx::LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, Format::ID angleFormat);
-
-} // namespace angle
-
-#endif // LIBANGLE_RENDERER_LOADFUNCTIONSTABLE_H_
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/load_functions_table_autogen.cpp b/src/3rdparty/angle/src/libANGLE/renderer/load_functions_table_autogen.cpp
deleted file mode 100644
index ed9fe2864c..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/load_functions_table_autogen.cpp
+++ /dev/null
@@ -1,2459 +0,0 @@
-// GENERATED FILE - DO NOT EDIT.
-// Generated by gen_load_functions_table.py using data from load_functions_data.json
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// load_functions_table:
-// Contains the GetLoadFunctionsMap for texture_format_util.h
-//
-
-#include "libANGLE/renderer/load_functions_table.h"
-
-#include "image_util/copyimage.h"
-#include "image_util/generatemip.h"
-#include "image_util/loadimage.h"
-
-using namespace rx;
-
-namespace angle
-{
-
-namespace
-{
-
-// ES3 image loading functions vary based on:
-// - the GL internal format (supplied to glTex*Image*D)
-// - the GL data type given (supplied to glTex*Image*D)
-// - the target DXGI_FORMAT that the image will be loaded into (which is chosen based on the D3D
-// device's capabilities)
-// This map type determines which loading function to use, based on these three parameters.
-// Source formats and types are taken from Tables 3.2 and 3.3 of the ES 3 spec.
-void UnimplementedLoadFunction(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)
-{
- UNIMPLEMENTED();
-}
-
-void UnreachableLoadFunction(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)
-{
- UNREACHABLE();
-}
-
-LoadImageFunctionInfo ALPHA_to_R16G16B16A16_FLOAT(GLenum type)
-{
- switch (type)
- {
- case GL_HALF_FLOAT:
- return LoadImageFunctionInfo(LoadA16FToRGBA16F, true);
- case GL_HALF_FLOAT_OES:
- return LoadImageFunctionInfo(LoadA16FToRGBA16F, true);
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo ALPHA_to_R32G32B32A32_FLOAT(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT:
- return LoadImageFunctionInfo(LoadA32FToRGBA32F, true);
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo ALPHA_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo ALPHA16F_EXT_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_HALF_FLOAT:
- return LoadImageFunctionInfo(LoadA16FToRGBA16F, true);
- case GL_HALF_FLOAT_OES:
- return LoadImageFunctionInfo(LoadA16FToRGBA16F, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo ALPHA32F_EXT_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT:
- return LoadImageFunctionInfo(LoadA32FToRGBA32F, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo ALPHA8_EXT_to_A8_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLubyte, 1>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo ALPHA8_EXT_to_R8G8B8A8_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadA8ToRGBA8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo BGR565_ANGLEX_to_B5G6R5_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
- case GL_UNSIGNED_SHORT_5_6_5:
- return LoadImageFunctionInfo(LoadRGB565ToBGR565, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-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);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo BGRA4_ANGLEX_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
- case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
- return LoadImageFunctionInfo(LoadRGBA4ToRGBA8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo BGRA8_EXT_to_default(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)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo COMPRESSED_R11_EAC_to_R8_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadEACR11ToR8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo COMPRESSED_RG11_EAC_to_R8G8_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadEACRG11ToRG8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo COMPRESSED_RGB8_ETC2_to_R8G8B8A8_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadETC2RGB8ToRGBA8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGB_UNORM_BLOCK(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadETC2RGB8ToBC1, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_R8G8B8A8_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadETC2RGB8A1ToRGBA8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo
-COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGBA_UNORM_BLOCK(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadETC2RGB8A1ToBC1, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo COMPRESSED_RGBA8_ETC2_EAC_to_R8G8B8A8_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadETC2RGBA8ToRGBA8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo COMPRESSED_RGBA_S3TC_DXT1_EXT_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 8>, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo COMPRESSED_RGBA_S3TC_DXT3_ANGLE_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_S3TC_DXT5_ANGLE_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_RGB_S3TC_DXT1_EXT_to_default(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_R8_SNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadEACR11SToR8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo COMPRESSED_SIGNED_RG11_EAC_to_R8G8_SNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadEACRG11SToRG8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ETC2_EAC_to_R8G8B8A8_UNORM_SRGB(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadETC2SRGBA8ToSRGBA8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo COMPRESSED_SRGB8_ETC2_to_R8G8B8A8_UNORM_SRGB(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadETC2SRGB8ToRGBA8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGB_UNORM_SRGB_BLOCK(
- GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadETC2SRGB8ToBC1, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_R8G8B8A8_UNORM_SRGB(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadETC2SRGB8A1ToRGBA8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo
-COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGBA_UNORM_SRGB_BLOCK(
- GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadETC2SRGB8A1ToBC1, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 8>, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT_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_SRGB_ALPHA_S3TC_DXT5_EXT_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_SRGB_S3TC_DXT1_EXT_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 8>, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo DEPTH24_STENCIL8_to_D24_UNORM_S8_UINT(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_INT_24_8:
- return LoadImageFunctionInfo(LoadR32ToR24G8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo DEPTH32F_STENCIL8_to_D32_FLOAT_S8X24_UINT(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
- return LoadImageFunctionInfo(LoadD32FS8X24ToD32FS8X24, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo DEPTH_COMPONENT16_to_D16_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_INT:
- return LoadImageFunctionInfo(LoadR32ToR16, true);
- case GL_UNSIGNED_SHORT:
- return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo DEPTH_COMPONENT24_to_D24_UNORM_S8_UINT(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_INT:
- return LoadImageFunctionInfo(LoadR32ToR24G8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo DEPTH_COMPONENT32F_to_D32_FLOAT(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT:
- return LoadImageFunctionInfo(LoadD32FToD32F, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo DEPTH_COMPONENT32_OES_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_INT:
- return LoadImageFunctionInfo(LoadR32ToR24G8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo ETC1_RGB8_LOSSY_DECODE_ANGLE_to_BC1_RGB_UNORM_BLOCK(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadETC1RGB8ToBC1, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo ETC1_RGB8_OES_to_R8G8B8A8_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadETC1RGB8ToRGBA8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo LUMINANCE_to_R16G16B16A16_FLOAT(GLenum type)
-{
- switch (type)
- {
- case GL_HALF_FLOAT:
- return LoadImageFunctionInfo(LoadL16FToRGBA16F, true);
- case GL_HALF_FLOAT_OES:
- return LoadImageFunctionInfo(LoadL16FToRGBA16F, true);
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo LUMINANCE_to_R32G32B32A32_FLOAT(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT:
- return LoadImageFunctionInfo(LoadL32FToRGBA32F, true);
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo LUMINANCE_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo LUMINANCE16F_EXT_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_HALF_FLOAT:
- return LoadImageFunctionInfo(LoadL16FToRGBA16F, true);
- case GL_HALF_FLOAT_OES:
- return LoadImageFunctionInfo(LoadL16FToRGBA16F, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo LUMINANCE32F_EXT_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT:
- return LoadImageFunctionInfo(LoadL32FToRGBA32F, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo LUMINANCE8_ALPHA8_EXT_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadLA8ToRGBA8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo LUMINANCE8_EXT_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadL8ToRGBA8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo LUMINANCE_ALPHA_to_R16G16B16A16_FLOAT(GLenum type)
-{
- switch (type)
- {
- case GL_HALF_FLOAT:
- return LoadImageFunctionInfo(LoadLA16FToRGBA16F, true);
- case GL_HALF_FLOAT_OES:
- return LoadImageFunctionInfo(LoadLA16FToRGBA16F, true);
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo LUMINANCE_ALPHA_to_R32G32B32A32_FLOAT(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT:
- return LoadImageFunctionInfo(LoadLA32FToRGBA32F, true);
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo LUMINANCE_ALPHA_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo LUMINANCE_ALPHA16F_EXT_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_HALF_FLOAT:
- return LoadImageFunctionInfo(LoadLA16FToRGBA16F, true);
- case GL_HALF_FLOAT_OES:
- return LoadImageFunctionInfo(LoadLA16FToRGBA16F, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo LUMINANCE_ALPHA32F_EXT_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT:
- return LoadImageFunctionInfo(LoadLA32FToRGBA32F, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo R11F_G11F_B10F_to_R11G11B10_FLOAT(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT:
- return LoadImageFunctionInfo(LoadRGB32FToRG11B10F, true);
- case GL_HALF_FLOAT:
- return LoadImageFunctionInfo(LoadRGB16FToRG11B10F, true);
- case GL_HALF_FLOAT_OES:
- return LoadImageFunctionInfo(LoadRGB16FToRG11B10F, true);
- case GL_UNSIGNED_INT_10F_11F_11F_REV:
- return LoadImageFunctionInfo(LoadToNative<GLuint, 1>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo R16F_to_R16_FLOAT(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT:
- return LoadImageFunctionInfo(Load32FTo16F<1>, true);
- case GL_HALF_FLOAT:
- return LoadImageFunctionInfo(LoadToNative<GLhalf, 1>, false);
- case GL_HALF_FLOAT_OES:
- return LoadImageFunctionInfo(LoadToNative<GLhalf, 1>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo R16I_to_R16_SINT(GLenum type)
-{
- switch (type)
- {
- case GL_SHORT:
- return LoadImageFunctionInfo(LoadToNative<GLshort, 1>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo R16UI_to_R16_UINT(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_SHORT:
- return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo R16_EXT_to_R16_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_SHORT:
- return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo R16_SNORM_EXT_to_R16_SNORM(GLenum type)
-{
- switch (type)
- {
- case GL_SHORT:
- return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo R32F_to_R32_FLOAT(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT:
- return LoadImageFunctionInfo(LoadToNative<GLfloat, 1>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo R32I_to_R32_SINT(GLenum type)
-{
- switch (type)
- {
- case GL_INT:
- return LoadImageFunctionInfo(LoadToNative<GLint, 1>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo R32UI_to_R32_UINT(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_INT:
- return LoadImageFunctionInfo(LoadToNative<GLuint, 1>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo R8_to_R8_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLubyte, 1>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo R8I_to_R8_SINT(GLenum type)
-{
- switch (type)
- {
- case GL_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLbyte, 1>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo R8UI_to_R8_UINT(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLubyte, 1>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo R8_SNORM_to_R8_SNORM(GLenum type)
-{
- switch (type)
- {
- case GL_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLbyte, 1>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RG16F_to_R16G16_FLOAT(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT:
- return LoadImageFunctionInfo(Load32FTo16F<2>, true);
- case GL_HALF_FLOAT:
- return LoadImageFunctionInfo(LoadToNative<GLhalf, 2>, false);
- case GL_HALF_FLOAT_OES:
- return LoadImageFunctionInfo(LoadToNative<GLhalf, 2>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RG16I_to_R16G16_SINT(GLenum type)
-{
- switch (type)
- {
- case GL_SHORT:
- return LoadImageFunctionInfo(LoadToNative<GLshort, 2>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RG16UI_to_R16G16_UINT(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_SHORT:
- return LoadImageFunctionInfo(LoadToNative<GLushort, 2>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RG16_EXT_to_R16G16_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_SHORT:
- return LoadImageFunctionInfo(LoadToNative<GLushort, 2>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RG16_SNORM_EXT_to_R16G16_SNORM(GLenum type)
-{
- switch (type)
- {
- case GL_SHORT:
- return LoadImageFunctionInfo(LoadToNative<GLushort, 2>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RG32F_to_R32G32_FLOAT(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT:
- return LoadImageFunctionInfo(LoadToNative<GLfloat, 2>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RG32I_to_R32G32_SINT(GLenum type)
-{
- switch (type)
- {
- case GL_INT:
- return LoadImageFunctionInfo(LoadToNative<GLint, 2>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RG32UI_to_R32G32_UINT(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_INT:
- return LoadImageFunctionInfo(LoadToNative<GLuint, 2>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RG8_to_R8G8_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLubyte, 2>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RG8I_to_R8G8_SINT(GLenum type)
-{
- switch (type)
- {
- case GL_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLbyte, 2>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RG8UI_to_R8G8_UINT(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLubyte, 2>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RG8_SNORM_to_R8G8_SNORM(GLenum type)
-{
- switch (type)
- {
- case GL_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLbyte, 2>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- case GL_UNSIGNED_SHORT_5_6_5:
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB10_A2_to_R10G10B10A2_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_INT_2_10_10_10_REV:
- return LoadImageFunctionInfo(LoadToNative<GLuint, 1>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB10_A2UI_to_R10G10B10A2_UINT(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_INT_2_10_10_10_REV:
- return LoadImageFunctionInfo(LoadToNative<GLuint, 1>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB16F_to_R16G16B16A16_FLOAT(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT:
- return LoadImageFunctionInfo(LoadRGB32FToRGBA16F, true);
- case GL_HALF_FLOAT:
- return LoadImageFunctionInfo(LoadToNative3To4<GLhalf, gl::Float16One>, true);
- case GL_HALF_FLOAT_OES:
- return LoadImageFunctionInfo(LoadToNative3To4<GLhalf, gl::Float16One>, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB16I_to_R16G16B16A16_SINT(GLenum type)
-{
- switch (type)
- {
- case GL_SHORT:
- return LoadImageFunctionInfo(LoadToNative3To4<GLshort, 0x0001>, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB16UI_to_R16G16B16A16_UINT(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_SHORT:
- return LoadImageFunctionInfo(LoadToNative3To4<GLushort, 0x0001>, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB16_EXT_to_R16G16B16A16_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_SHORT:
- return LoadImageFunctionInfo(LoadToNative3To4<GLushort, 0xFFFF>, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB16_SNORM_EXT_to_R16G16B16A16_SNORM(GLenum type)
-{
- switch (type)
- {
- case GL_SHORT:
- return LoadImageFunctionInfo(LoadToNative3To4<GLushort, 0x7FFF>, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB32F_to_R32G32B32A32_FLOAT(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT:
- return LoadImageFunctionInfo(LoadToNative3To4<GLfloat, gl::Float32One>, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB32I_to_R32G32B32A32_SINT(GLenum type)
-{
- switch (type)
- {
- case GL_INT:
- return LoadImageFunctionInfo(LoadToNative3To4<GLint, 0x00000001>, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB32UI_to_R32G32B32A32_UINT(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_INT:
- return LoadImageFunctionInfo(LoadToNative3To4<GLuint, 0x00000001>, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB565_to_B5G6R5_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:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB565_to_R8G8B8A8_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadToNative3To4<GLubyte, 0xFF>, true);
- case GL_UNSIGNED_SHORT_5_6_5:
- return LoadImageFunctionInfo(LoadR5G6B5ToRGBA8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB5_A1_to_B5G5R5A1_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadRGBA8ToBGR5A1, true);
- case GL_UNSIGNED_INT_2_10_10_10_REV:
- return LoadImageFunctionInfo(LoadRGB10A2ToBGR5A1, true);
- case GL_UNSIGNED_SHORT_5_5_5_1:
- return LoadImageFunctionInfo(LoadRGB5A1ToA1RGB5, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB5_A1_to_R8G8B8A8_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
- case GL_UNSIGNED_INT_2_10_10_10_REV:
- return LoadImageFunctionInfo(LoadRGB10A2ToRGBA8, true);
- case GL_UNSIGNED_SHORT_5_5_5_1:
- return LoadImageFunctionInfo(LoadRGB5A1ToRGBA8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB8_to_R8G8B8A8_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadToNative3To4<GLubyte, 0xFF>, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB8I_to_R8G8B8A8_SINT(GLenum type)
-{
- switch (type)
- {
- case GL_BYTE:
- return LoadImageFunctionInfo(LoadToNative3To4<GLbyte, 0x01>, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB8UI_to_R8G8B8A8_UINT(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadToNative3To4<GLubyte, 0x01>, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB8_SNORM_to_R8G8B8A8_SNORM(GLenum type)
-{
- switch (type)
- {
- case GL_BYTE:
- return LoadImageFunctionInfo(LoadToNative3To4<GLbyte, 0x7F>, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGB9_E5_to_R9G9B9E5_SHAREDEXP(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT:
- return LoadImageFunctionInfo(LoadRGB32FToRGB9E5, true);
- case GL_HALF_FLOAT:
- return LoadImageFunctionInfo(LoadRGB16FToRGB9E5, true);
- case GL_HALF_FLOAT_OES:
- return LoadImageFunctionInfo(LoadRGB16FToRGB9E5, true);
- case GL_UNSIGNED_INT_5_9_9_9_REV:
- return LoadImageFunctionInfo(LoadToNative<GLuint, 1>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGBA_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- case GL_UNSIGNED_SHORT_4_4_4_4:
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- case GL_UNSIGNED_SHORT_5_5_5_1:
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGBA16F_to_R16G16B16A16_FLOAT(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT:
- return LoadImageFunctionInfo(Load32FTo16F<4>, true);
- case GL_HALF_FLOAT:
- return LoadImageFunctionInfo(LoadToNative<GLhalf, 4>, false);
- case GL_HALF_FLOAT_OES:
- return LoadImageFunctionInfo(LoadToNative<GLhalf, 4>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGBA16I_to_R16G16B16A16_SINT(GLenum type)
-{
- switch (type)
- {
- case GL_SHORT:
- return LoadImageFunctionInfo(LoadToNative<GLshort, 4>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGBA16UI_to_R16G16B16A16_UINT(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_SHORT:
- return LoadImageFunctionInfo(LoadToNative<GLushort, 4>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGBA16_EXT_to_R16G16B16A16_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_SHORT:
- return LoadImageFunctionInfo(LoadToNative<GLushort, 4>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGBA16_SNORM_EXT_to_R16G16B16A16_SNORM(GLenum type)
-{
- switch (type)
- {
- case GL_SHORT:
- return LoadImageFunctionInfo(LoadToNative<GLushort, 4>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGBA32F_to_R32G32B32A32_FLOAT(GLenum type)
-{
- switch (type)
- {
- case GL_FLOAT:
- return LoadImageFunctionInfo(LoadToNative<GLfloat, 4>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGBA32I_to_R32G32B32A32_SINT(GLenum type)
-{
- switch (type)
- {
- case GL_INT:
- return LoadImageFunctionInfo(LoadToNative<GLint, 4>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGBA32UI_to_R32G32B32A32_UINT(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_INT:
- return LoadImageFunctionInfo(LoadToNative<GLuint, 4>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGBA4_to_B4G4R4A4_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadRGBA8ToBGRA4, true);
- case GL_UNSIGNED_SHORT_4_4_4_4:
- return LoadImageFunctionInfo(LoadRGBA4ToARGB4, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGBA4_to_R8G8B8A8_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
- case GL_UNSIGNED_SHORT_4_4_4_4:
- return LoadImageFunctionInfo(LoadRGBA4ToRGBA8, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGBA8_to_R8G8B8A8_UNORM(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGBA8I_to_R8G8B8A8_SINT(GLenum type)
-{
- switch (type)
- {
- case GL_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLbyte, 4>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGBA8UI_to_R8G8B8A8_UINT(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo RGBA8_SNORM_to_R8G8B8A8_SNORM(GLenum type)
-{
- switch (type)
- {
- case GL_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLbyte, 4>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo SRGB8_to_R8G8B8A8_UNORM_SRGB(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadToNative3To4<GLubyte, 0xFF>, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo SRGB8_ALPHA8_to_R8G8B8A8_UNORM_SRGB(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-LoadImageFunctionInfo STENCIL_INDEX8_to_default(GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(UnimplementedLoadFunction, true);
- default:
- UNREACHABLE();
- return LoadImageFunctionInfo(UnreachableLoadFunction, true);
- }
-}
-
-} // namespace
-
-LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, Format::ID angleFormat)
-{
- // clang-format off
- switch (internalFormat)
- {
- case GL_ALPHA:
- {
- switch (angleFormat)
- {
- case Format::ID::R16G16B16A16_FLOAT:
- return ALPHA_to_R16G16B16A16_FLOAT;
- case Format::ID::R32G32B32A32_FLOAT:
- return ALPHA_to_R32G32B32A32_FLOAT;
- default:
- return ALPHA_to_default;
- }
- }
- case GL_ALPHA16F_EXT:
- return ALPHA16F_EXT_to_default;
- case GL_ALPHA32F_EXT:
- return ALPHA32F_EXT_to_default;
- case GL_ALPHA8_EXT:
- {
- switch (angleFormat)
- {
- case Format::ID::A8_UNORM:
- return ALPHA8_EXT_to_A8_UNORM;
- case Format::ID::R8G8B8A8_UNORM:
- return ALPHA8_EXT_to_R8G8B8A8_UNORM;
- default:
- break;
- }
- }
- case GL_BGR565_ANGLEX:
- {
- switch (angleFormat)
- {
- case Format::ID::B5G6R5_UNORM:
- return BGR565_ANGLEX_to_B5G6R5_UNORM;
- default:
- break;
- }
- }
- case GL_BGR5_A1_ANGLEX:
- return BGR5_A1_ANGLEX_to_default;
- case GL_BGRA4_ANGLEX:
- return BGRA4_ANGLEX_to_default;
- case GL_BGRA8_EXT:
- return BGRA8_EXT_to_default;
- case GL_BGRA_EXT:
- return BGRA_EXT_to_default;
- case GL_COMPRESSED_R11_EAC:
- {
- switch (angleFormat)
- {
- case Format::ID::R8_UNORM:
- return COMPRESSED_R11_EAC_to_R8_UNORM;
- default:
- break;
- }
- }
- case GL_COMPRESSED_RG11_EAC:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8_UNORM:
- return COMPRESSED_RG11_EAC_to_R8G8_UNORM;
- default:
- break;
- }
- }
- case GL_COMPRESSED_RGB8_ETC2:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8B8A8_UNORM:
- return COMPRESSED_RGB8_ETC2_to_R8G8B8A8_UNORM;
- default:
- break;
- }
- }
- case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
- {
- switch (angleFormat)
- {
- case Format::ID::BC1_RGB_UNORM_BLOCK:
- return COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGB_UNORM_BLOCK;
- default:
- break;
- }
- }
- case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8B8A8_UNORM:
- return COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_R8G8B8A8_UNORM;
- default:
- break;
- }
- }
- case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
- {
- switch (angleFormat)
- {
- case Format::ID::BC1_RGBA_UNORM_BLOCK:
- return COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGBA_UNORM_BLOCK;
- default:
- break;
- }
- }
- case GL_COMPRESSED_RGBA8_ETC2_EAC:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8B8A8_UNORM:
- return COMPRESSED_RGBA8_ETC2_EAC_to_R8G8B8A8_UNORM;
- default:
- break;
- }
- }
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- return COMPRESSED_RGBA_S3TC_DXT1_EXT_to_default;
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
- return COMPRESSED_RGBA_S3TC_DXT3_ANGLE_to_default;
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
- return COMPRESSED_RGBA_S3TC_DXT5_ANGLE_to_default;
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
- return COMPRESSED_RGB_S3TC_DXT1_EXT_to_default;
- case GL_COMPRESSED_SIGNED_R11_EAC:
- {
- switch (angleFormat)
- {
- case Format::ID::R8_SNORM:
- return COMPRESSED_SIGNED_R11_EAC_to_R8_SNORM;
- default:
- break;
- }
- }
- case GL_COMPRESSED_SIGNED_RG11_EAC:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8_SNORM:
- return COMPRESSED_SIGNED_RG11_EAC_to_R8G8_SNORM;
- default:
- break;
- }
- }
- case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8B8A8_UNORM_SRGB:
- return COMPRESSED_SRGB8_ALPHA8_ETC2_EAC_to_R8G8B8A8_UNORM_SRGB;
- default:
- break;
- }
- }
- case GL_COMPRESSED_SRGB8_ETC2:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8B8A8_UNORM_SRGB:
- return COMPRESSED_SRGB8_ETC2_to_R8G8B8A8_UNORM_SRGB;
- default:
- break;
- }
- }
- case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
- {
- switch (angleFormat)
- {
- case Format::ID::BC1_RGB_UNORM_SRGB_BLOCK:
- return COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGB_UNORM_SRGB_BLOCK;
- default:
- break;
- }
- }
- case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8B8A8_UNORM_SRGB:
- return COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_R8G8B8A8_UNORM_SRGB;
- default:
- break;
- }
- }
- case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
- {
- switch (angleFormat)
- {
- case Format::ID::BC1_RGBA_UNORM_SRGB_BLOCK:
- return COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGBA_UNORM_SRGB_BLOCK;
- default:
- break;
- }
- }
- case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
- return COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT_to_default;
- case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
- return COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT_to_default;
- case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
- return COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT_to_default;
- case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
- return COMPRESSED_SRGB_S3TC_DXT1_EXT_to_default;
- case GL_DEPTH24_STENCIL8:
- {
- switch (angleFormat)
- {
- case Format::ID::D24_UNORM_S8_UINT:
- return DEPTH24_STENCIL8_to_D24_UNORM_S8_UINT;
- default:
- break;
- }
- }
- case GL_DEPTH32F_STENCIL8:
- {
- switch (angleFormat)
- {
- case Format::ID::D32_FLOAT_S8X24_UINT:
- return DEPTH32F_STENCIL8_to_D32_FLOAT_S8X24_UINT;
- default:
- break;
- }
- }
- case GL_DEPTH_COMPONENT16:
- {
- switch (angleFormat)
- {
- case Format::ID::D16_UNORM:
- return DEPTH_COMPONENT16_to_D16_UNORM;
- default:
- break;
- }
- }
- case GL_DEPTH_COMPONENT24:
- {
- switch (angleFormat)
- {
- case Format::ID::D24_UNORM_S8_UINT:
- return DEPTH_COMPONENT24_to_D24_UNORM_S8_UINT;
- default:
- break;
- }
- }
- case GL_DEPTH_COMPONENT32F:
- {
- switch (angleFormat)
- {
- case Format::ID::D32_FLOAT:
- return DEPTH_COMPONENT32F_to_D32_FLOAT;
- default:
- break;
- }
- }
- case GL_DEPTH_COMPONENT32_OES:
- return DEPTH_COMPONENT32_OES_to_default;
- case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
- {
- switch (angleFormat)
- {
- case Format::ID::BC1_RGB_UNORM_BLOCK:
- return ETC1_RGB8_LOSSY_DECODE_ANGLE_to_BC1_RGB_UNORM_BLOCK;
- default:
- break;
- }
- }
- case GL_ETC1_RGB8_OES:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8B8A8_UNORM:
- return ETC1_RGB8_OES_to_R8G8B8A8_UNORM;
- default:
- break;
- }
- }
- case GL_LUMINANCE:
- {
- switch (angleFormat)
- {
- case Format::ID::R16G16B16A16_FLOAT:
- return LUMINANCE_to_R16G16B16A16_FLOAT;
- case Format::ID::R32G32B32A32_FLOAT:
- return LUMINANCE_to_R32G32B32A32_FLOAT;
- default:
- return LUMINANCE_to_default;
- }
- }
- case GL_LUMINANCE16F_EXT:
- return LUMINANCE16F_EXT_to_default;
- case GL_LUMINANCE32F_EXT:
- return LUMINANCE32F_EXT_to_default;
- case GL_LUMINANCE8_ALPHA8_EXT:
- return LUMINANCE8_ALPHA8_EXT_to_default;
- case GL_LUMINANCE8_EXT:
- return LUMINANCE8_EXT_to_default;
- case GL_LUMINANCE_ALPHA:
- {
- switch (angleFormat)
- {
- case Format::ID::R16G16B16A16_FLOAT:
- return LUMINANCE_ALPHA_to_R16G16B16A16_FLOAT;
- case Format::ID::R32G32B32A32_FLOAT:
- return LUMINANCE_ALPHA_to_R32G32B32A32_FLOAT;
- default:
- return LUMINANCE_ALPHA_to_default;
- }
- }
- case GL_LUMINANCE_ALPHA16F_EXT:
- return LUMINANCE_ALPHA16F_EXT_to_default;
- case GL_LUMINANCE_ALPHA32F_EXT:
- return LUMINANCE_ALPHA32F_EXT_to_default;
- case GL_R11F_G11F_B10F:
- {
- switch (angleFormat)
- {
- case Format::ID::R11G11B10_FLOAT:
- return R11F_G11F_B10F_to_R11G11B10_FLOAT;
- default:
- break;
- }
- }
- case GL_R16F:
- {
- switch (angleFormat)
- {
- case Format::ID::R16_FLOAT:
- return R16F_to_R16_FLOAT;
- default:
- break;
- }
- }
- case GL_R16I:
- {
- switch (angleFormat)
- {
- case Format::ID::R16_SINT:
- return R16I_to_R16_SINT;
- default:
- break;
- }
- }
- case GL_R16UI:
- {
- switch (angleFormat)
- {
- case Format::ID::R16_UINT:
- return R16UI_to_R16_UINT;
- default:
- break;
- }
- }
- case GL_R16_EXT:
- {
- switch (angleFormat)
- {
- case Format::ID::R16_UNORM:
- return R16_EXT_to_R16_UNORM;
- default:
- break;
- }
- }
- case GL_R16_SNORM_EXT:
- {
- switch (angleFormat)
- {
- case Format::ID::R16_SNORM:
- return R16_SNORM_EXT_to_R16_SNORM;
- default:
- break;
- }
- }
- case GL_R32F:
- {
- switch (angleFormat)
- {
- case Format::ID::R32_FLOAT:
- return R32F_to_R32_FLOAT;
- default:
- break;
- }
- }
- case GL_R32I:
- {
- switch (angleFormat)
- {
- case Format::ID::R32_SINT:
- return R32I_to_R32_SINT;
- default:
- break;
- }
- }
- case GL_R32UI:
- {
- switch (angleFormat)
- {
- case Format::ID::R32_UINT:
- return R32UI_to_R32_UINT;
- default:
- break;
- }
- }
- case GL_R8:
- {
- switch (angleFormat)
- {
- case Format::ID::R8_UNORM:
- return R8_to_R8_UNORM;
- default:
- break;
- }
- }
- case GL_R8I:
- {
- switch (angleFormat)
- {
- case Format::ID::R8_SINT:
- return R8I_to_R8_SINT;
- default:
- break;
- }
- }
- case GL_R8UI:
- {
- switch (angleFormat)
- {
- case Format::ID::R8_UINT:
- return R8UI_to_R8_UINT;
- default:
- break;
- }
- }
- case GL_R8_SNORM:
- {
- switch (angleFormat)
- {
- case Format::ID::R8_SNORM:
- return R8_SNORM_to_R8_SNORM;
- default:
- break;
- }
- }
- case GL_RG16F:
- {
- switch (angleFormat)
- {
- case Format::ID::R16G16_FLOAT:
- return RG16F_to_R16G16_FLOAT;
- default:
- break;
- }
- }
- case GL_RG16I:
- {
- switch (angleFormat)
- {
- case Format::ID::R16G16_SINT:
- return RG16I_to_R16G16_SINT;
- default:
- break;
- }
- }
- case GL_RG16UI:
- {
- switch (angleFormat)
- {
- case Format::ID::R16G16_UINT:
- return RG16UI_to_R16G16_UINT;
- default:
- break;
- }
- }
- case GL_RG16_EXT:
- {
- switch (angleFormat)
- {
- case Format::ID::R16G16_UNORM:
- return RG16_EXT_to_R16G16_UNORM;
- default:
- break;
- }
- }
- case GL_RG16_SNORM_EXT:
- {
- switch (angleFormat)
- {
- case Format::ID::R16G16_SNORM:
- return RG16_SNORM_EXT_to_R16G16_SNORM;
- default:
- break;
- }
- }
- case GL_RG32F:
- {
- switch (angleFormat)
- {
- case Format::ID::R32G32_FLOAT:
- return RG32F_to_R32G32_FLOAT;
- default:
- break;
- }
- }
- case GL_RG32I:
- {
- switch (angleFormat)
- {
- case Format::ID::R32G32_SINT:
- return RG32I_to_R32G32_SINT;
- default:
- break;
- }
- }
- case GL_RG32UI:
- {
- switch (angleFormat)
- {
- case Format::ID::R32G32_UINT:
- return RG32UI_to_R32G32_UINT;
- default:
- break;
- }
- }
- case GL_RG8:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8_UNORM:
- return RG8_to_R8G8_UNORM;
- default:
- break;
- }
- }
- case GL_RG8I:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8_SINT:
- return RG8I_to_R8G8_SINT;
- default:
- break;
- }
- }
- case GL_RG8UI:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8_UINT:
- return RG8UI_to_R8G8_UINT;
- default:
- break;
- }
- }
- case GL_RG8_SNORM:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8_SNORM:
- return RG8_SNORM_to_R8G8_SNORM;
- default:
- break;
- }
- }
- case GL_RGB:
- return RGB_to_default;
- case GL_RGB10_A2:
- {
- switch (angleFormat)
- {
- case Format::ID::R10G10B10A2_UNORM:
- return RGB10_A2_to_R10G10B10A2_UNORM;
- default:
- break;
- }
- }
- case GL_RGB10_A2UI:
- {
- switch (angleFormat)
- {
- case Format::ID::R10G10B10A2_UINT:
- return RGB10_A2UI_to_R10G10B10A2_UINT;
- default:
- break;
- }
- }
- case GL_RGB16F:
- {
- switch (angleFormat)
- {
- case Format::ID::R16G16B16A16_FLOAT:
- return RGB16F_to_R16G16B16A16_FLOAT;
- default:
- break;
- }
- }
- case GL_RGB16I:
- {
- switch (angleFormat)
- {
- case Format::ID::R16G16B16A16_SINT:
- return RGB16I_to_R16G16B16A16_SINT;
- default:
- break;
- }
- }
- case GL_RGB16UI:
- {
- switch (angleFormat)
- {
- case Format::ID::R16G16B16A16_UINT:
- return RGB16UI_to_R16G16B16A16_UINT;
- default:
- break;
- }
- }
- case GL_RGB16_EXT:
- {
- switch (angleFormat)
- {
- case Format::ID::R16G16B16A16_UNORM:
- return RGB16_EXT_to_R16G16B16A16_UNORM;
- default:
- break;
- }
- }
- case GL_RGB16_SNORM_EXT:
- {
- switch (angleFormat)
- {
- case Format::ID::R16G16B16A16_SNORM:
- return RGB16_SNORM_EXT_to_R16G16B16A16_SNORM;
- default:
- break;
- }
- }
- case GL_RGB32F:
- {
- switch (angleFormat)
- {
- case Format::ID::R32G32B32A32_FLOAT:
- return RGB32F_to_R32G32B32A32_FLOAT;
- default:
- break;
- }
- }
- case GL_RGB32I:
- {
- switch (angleFormat)
- {
- case Format::ID::R32G32B32A32_SINT:
- return RGB32I_to_R32G32B32A32_SINT;
- default:
- break;
- }
- }
- case GL_RGB32UI:
- {
- switch (angleFormat)
- {
- case Format::ID::R32G32B32A32_UINT:
- return RGB32UI_to_R32G32B32A32_UINT;
- default:
- break;
- }
- }
- case GL_RGB565:
- {
- switch (angleFormat)
- {
- case Format::ID::B5G6R5_UNORM:
- return RGB565_to_B5G6R5_UNORM;
- case Format::ID::R8G8B8A8_UNORM:
- return RGB565_to_R8G8B8A8_UNORM;
- default:
- break;
- }
- }
- case GL_RGB5_A1:
- {
- switch (angleFormat)
- {
- case Format::ID::B5G5R5A1_UNORM:
- return RGB5_A1_to_B5G5R5A1_UNORM;
- case Format::ID::R8G8B8A8_UNORM:
- return RGB5_A1_to_R8G8B8A8_UNORM;
- default:
- break;
- }
- }
- case GL_RGB8:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8B8A8_UNORM:
- return RGB8_to_R8G8B8A8_UNORM;
- default:
- break;
- }
- }
- case GL_RGB8I:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8B8A8_SINT:
- return RGB8I_to_R8G8B8A8_SINT;
- default:
- break;
- }
- }
- case GL_RGB8UI:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8B8A8_UINT:
- return RGB8UI_to_R8G8B8A8_UINT;
- default:
- break;
- }
- }
- case GL_RGB8_SNORM:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8B8A8_SNORM:
- return RGB8_SNORM_to_R8G8B8A8_SNORM;
- default:
- break;
- }
- }
- case GL_RGB9_E5:
- {
- switch (angleFormat)
- {
- case Format::ID::R9G9B9E5_SHAREDEXP:
- return RGB9_E5_to_R9G9B9E5_SHAREDEXP;
- default:
- break;
- }
- }
- case GL_RGBA:
- return RGBA_to_default;
- case GL_RGBA16F:
- {
- switch (angleFormat)
- {
- case Format::ID::R16G16B16A16_FLOAT:
- return RGBA16F_to_R16G16B16A16_FLOAT;
- default:
- break;
- }
- }
- case GL_RGBA16I:
- {
- switch (angleFormat)
- {
- case Format::ID::R16G16B16A16_SINT:
- return RGBA16I_to_R16G16B16A16_SINT;
- default:
- break;
- }
- }
- case GL_RGBA16UI:
- {
- switch (angleFormat)
- {
- case Format::ID::R16G16B16A16_UINT:
- return RGBA16UI_to_R16G16B16A16_UINT;
- default:
- break;
- }
- }
- case GL_RGBA16_EXT:
- {
- switch (angleFormat)
- {
- case Format::ID::R16G16B16A16_UNORM:
- return RGBA16_EXT_to_R16G16B16A16_UNORM;
- default:
- break;
- }
- }
- case GL_RGBA16_SNORM_EXT:
- {
- switch (angleFormat)
- {
- case Format::ID::R16G16B16A16_SNORM:
- return RGBA16_SNORM_EXT_to_R16G16B16A16_SNORM;
- default:
- break;
- }
- }
- case GL_RGBA32F:
- {
- switch (angleFormat)
- {
- case Format::ID::R32G32B32A32_FLOAT:
- return RGBA32F_to_R32G32B32A32_FLOAT;
- default:
- break;
- }
- }
- case GL_RGBA32I:
- {
- switch (angleFormat)
- {
- case Format::ID::R32G32B32A32_SINT:
- return RGBA32I_to_R32G32B32A32_SINT;
- default:
- break;
- }
- }
- case GL_RGBA32UI:
- {
- switch (angleFormat)
- {
- case Format::ID::R32G32B32A32_UINT:
- return RGBA32UI_to_R32G32B32A32_UINT;
- default:
- break;
- }
- }
- case GL_RGBA4:
- {
- switch (angleFormat)
- {
- case Format::ID::B4G4R4A4_UNORM:
- return RGBA4_to_B4G4R4A4_UNORM;
- case Format::ID::R8G8B8A8_UNORM:
- return RGBA4_to_R8G8B8A8_UNORM;
- default:
- break;
- }
- }
- case GL_RGBA8:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8B8A8_UNORM:
- return RGBA8_to_R8G8B8A8_UNORM;
- default:
- break;
- }
- }
- case GL_RGBA8I:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8B8A8_SINT:
- return RGBA8I_to_R8G8B8A8_SINT;
- default:
- break;
- }
- }
- case GL_RGBA8UI:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8B8A8_UINT:
- return RGBA8UI_to_R8G8B8A8_UINT;
- default:
- break;
- }
- }
- case GL_RGBA8_SNORM:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8B8A8_SNORM:
- return RGBA8_SNORM_to_R8G8B8A8_SNORM;
- default:
- break;
- }
- }
- case GL_SRGB8:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8B8A8_UNORM_SRGB:
- return SRGB8_to_R8G8B8A8_UNORM_SRGB;
- default:
- break;
- }
- }
- case GL_SRGB8_ALPHA8:
- {
- switch (angleFormat)
- {
- case Format::ID::R8G8B8A8_UNORM_SRGB:
- return SRGB8_ALPHA8_to_R8G8B8A8_UNORM_SRGB;
- default:
- break;
- }
- }
- case GL_STENCIL_INDEX8:
- return STENCIL_INDEX8_to_default;
-
- default:
- {
- static LoadFunctionMap emptyLoadFunctionsMap;
- return emptyLoadFunctionsMap;
- }
- }
- // clang-format on
-
-} // GetLoadFunctionsMap
-
-} // namespace angle
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/renderer_utils.cpp b/src/3rdparty/angle/src/libANGLE/renderer/renderer_utils.cpp
deleted file mode 100644
index 55471c1d20..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/renderer_utils.cpp
+++ /dev/null
@@ -1,549 +0,0 @@
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// renderer_utils:
-// Helper methods pertaining to most or all back-ends.
-//
-
-#include "libANGLE/renderer/renderer_utils.h"
-
-#include "image_util/copyimage.h"
-#include "image_util/imageformats.h"
-
-#include "libANGLE/AttributeMap.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/renderer/ContextImpl.h"
-#include "libANGLE/renderer/Format.h"
-
-#include <string.h>
-
-namespace rx
-{
-
-namespace
-{
-typedef std::pair<gl::FormatType, ColorWriteFunction> FormatWriteFunctionPair;
-typedef std::map<gl::FormatType, ColorWriteFunction> FormatWriteFunctionMap;
-
-static inline void InsertFormatWriteFunctionMapping(FormatWriteFunctionMap *map,
- GLenum format,
- GLenum type,
- ColorWriteFunction writeFunc)
-{
- map->insert(FormatWriteFunctionPair(gl::FormatType(format, type), writeFunc));
-}
-
-static FormatWriteFunctionMap BuildFormatWriteFunctionMap()
-{
- using namespace angle; // For image writing functions
-
- FormatWriteFunctionMap map;
-
- // clang-format off
- // | Format | Type | Color write function |
- InsertFormatWriteFunctionMapping(&map, GL_RGBA, GL_UNSIGNED_BYTE, WriteColor<R8G8B8A8, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RGBA, GL_BYTE, WriteColor<R8G8B8A8S, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, WriteColor<R4G4B4A4, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, WriteColor<R5G5B5A1, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, WriteColor<R10G10B10A2, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RGBA, GL_FLOAT, WriteColor<R32G32B32A32F, GLfloat>);
- InsertFormatWriteFunctionMapping(&map, GL_RGBA, GL_HALF_FLOAT, WriteColor<R16G16B16A16F, GLfloat>);
- InsertFormatWriteFunctionMapping(&map, GL_RGBA, GL_HALF_FLOAT_OES, WriteColor<R16G16B16A16F, GLfloat>);
- InsertFormatWriteFunctionMapping(&map, GL_RGBA, GL_UNSIGNED_SHORT,
- WriteColor<R16G16B16A16, GLfloat>);
- InsertFormatWriteFunctionMapping(&map, GL_RGBA, GL_SHORT, WriteColor<R16G16B16A16S, GLfloat>);
-
- InsertFormatWriteFunctionMapping(&map, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, WriteColor<R8G8B8A8, GLuint> );
- InsertFormatWriteFunctionMapping(&map, GL_RGBA_INTEGER, GL_BYTE, WriteColor<R8G8B8A8S, GLint> );
- InsertFormatWriteFunctionMapping(&map, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, WriteColor<R16G16B16A16, GLuint> );
- InsertFormatWriteFunctionMapping(&map, GL_RGBA_INTEGER, GL_SHORT, WriteColor<R16G16B16A16S, GLint> );
- InsertFormatWriteFunctionMapping(&map, GL_RGBA_INTEGER, GL_UNSIGNED_INT, WriteColor<R32G32B32A32, GLuint> );
- InsertFormatWriteFunctionMapping(&map, GL_RGBA_INTEGER, GL_INT, WriteColor<R32G32B32A32S, GLint> );
- InsertFormatWriteFunctionMapping(&map, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV, WriteColor<R10G10B10A2, GLuint> );
-
- InsertFormatWriteFunctionMapping(&map, GL_RGB, GL_UNSIGNED_BYTE, WriteColor<R8G8B8, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RGB, GL_BYTE, WriteColor<R8G8B8S, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, WriteColor<R5G6B5, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, WriteColor<R11G11B10F, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, WriteColor<R9G9B9E5, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RGB, GL_FLOAT, WriteColor<R32G32B32F, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RGB, GL_HALF_FLOAT, WriteColor<R16G16B16F, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RGB, GL_HALF_FLOAT_OES, WriteColor<R16G16B16F, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RGB, GL_UNSIGNED_SHORT,
- WriteColor<R16G16B16, GLfloat>);
- InsertFormatWriteFunctionMapping(&map, GL_RGB, GL_SHORT, WriteColor<R16G16B16S, GLfloat>);
-
- InsertFormatWriteFunctionMapping(&map, GL_RGB_INTEGER, GL_UNSIGNED_BYTE, WriteColor<R8G8B8, GLuint> );
- InsertFormatWriteFunctionMapping(&map, GL_RGB_INTEGER, GL_BYTE, WriteColor<R8G8B8S, GLint> );
- InsertFormatWriteFunctionMapping(&map, GL_RGB_INTEGER, GL_UNSIGNED_SHORT, WriteColor<R16G16B16, GLuint> );
- InsertFormatWriteFunctionMapping(&map, GL_RGB_INTEGER, GL_SHORT, WriteColor<R16G16B16S, GLint> );
- InsertFormatWriteFunctionMapping(&map, GL_RGB_INTEGER, GL_UNSIGNED_INT, WriteColor<R32G32B32, GLuint> );
- InsertFormatWriteFunctionMapping(&map, GL_RGB_INTEGER, GL_INT, WriteColor<R32G32B32S, GLint> );
-
- InsertFormatWriteFunctionMapping(&map, GL_RG, GL_UNSIGNED_BYTE, WriteColor<R8G8, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RG, GL_BYTE, WriteColor<R8G8S, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RG, GL_FLOAT, WriteColor<R32G32F, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RG, GL_HALF_FLOAT, WriteColor<R16G16F, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RG, GL_HALF_FLOAT_OES, WriteColor<R16G16F, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RG, GL_UNSIGNED_SHORT, WriteColor<R16G16, GLfloat>);
- InsertFormatWriteFunctionMapping(&map, GL_RG, GL_SHORT, WriteColor<R16G16S, GLfloat>);
-
- InsertFormatWriteFunctionMapping(&map, GL_RG_INTEGER, GL_UNSIGNED_BYTE, WriteColor<R8G8, GLuint> );
- InsertFormatWriteFunctionMapping(&map, GL_RG_INTEGER, GL_BYTE, WriteColor<R8G8S, GLint> );
- InsertFormatWriteFunctionMapping(&map, GL_RG_INTEGER, GL_UNSIGNED_SHORT, WriteColor<R16G16, GLuint> );
- InsertFormatWriteFunctionMapping(&map, GL_RG_INTEGER, GL_SHORT, WriteColor<R16G16S, GLint> );
- InsertFormatWriteFunctionMapping(&map, GL_RG_INTEGER, GL_UNSIGNED_INT, WriteColor<R32G32, GLuint> );
- InsertFormatWriteFunctionMapping(&map, GL_RG_INTEGER, GL_INT, WriteColor<R32G32S, GLint> );
-
- InsertFormatWriteFunctionMapping(&map, GL_RED, GL_UNSIGNED_BYTE, WriteColor<R8, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RED, GL_BYTE, WriteColor<R8S, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RED, GL_FLOAT, WriteColor<R32F, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RED, GL_HALF_FLOAT, WriteColor<R16F, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RED, GL_HALF_FLOAT_OES, WriteColor<R16F, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_RED, GL_UNSIGNED_SHORT, WriteColor<R16, GLfloat>);
- InsertFormatWriteFunctionMapping(&map, GL_RED, GL_SHORT, WriteColor<R16S, GLfloat>);
-
- InsertFormatWriteFunctionMapping(&map, GL_RED_INTEGER, GL_UNSIGNED_BYTE, WriteColor<R8, GLuint> );
- InsertFormatWriteFunctionMapping(&map, GL_RED_INTEGER, GL_BYTE, WriteColor<R8S, GLint> );
- InsertFormatWriteFunctionMapping(&map, GL_RED_INTEGER, GL_UNSIGNED_SHORT, WriteColor<R16, GLuint> );
- InsertFormatWriteFunctionMapping(&map, GL_RED_INTEGER, GL_SHORT, WriteColor<R16S, GLint> );
- InsertFormatWriteFunctionMapping(&map, GL_RED_INTEGER, GL_UNSIGNED_INT, WriteColor<R32, GLuint> );
- InsertFormatWriteFunctionMapping(&map, GL_RED_INTEGER, GL_INT, WriteColor<R32S, GLint> );
-
- InsertFormatWriteFunctionMapping(&map, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, WriteColor<L8A8, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_LUMINANCE, GL_UNSIGNED_BYTE, WriteColor<L8, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_ALPHA, GL_UNSIGNED_BYTE, WriteColor<A8, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_LUMINANCE_ALPHA, GL_FLOAT, WriteColor<L32A32F, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_LUMINANCE, GL_FLOAT, WriteColor<L32F, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_ALPHA, GL_FLOAT, WriteColor<A32F, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT, WriteColor<L16A16F, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES, WriteColor<L16A16F, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_LUMINANCE, GL_HALF_FLOAT, WriteColor<L16F, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_LUMINANCE, GL_HALF_FLOAT_OES, WriteColor<L16F, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_ALPHA, GL_HALF_FLOAT, WriteColor<A16F, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_ALPHA, GL_HALF_FLOAT_OES, WriteColor<A16F, GLfloat> );
-
- InsertFormatWriteFunctionMapping(&map, GL_BGRA_EXT, GL_UNSIGNED_BYTE, WriteColor<B8G8R8A8, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_BGRA_EXT, GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT, WriteColor<A4R4G4B4, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_BGRA_EXT, GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT, WriteColor<A1R5G5B5, GLfloat> );
-
- InsertFormatWriteFunctionMapping(&map, GL_SRGB_EXT, GL_UNSIGNED_BYTE, WriteColor<R8G8B8, GLfloat> );
- InsertFormatWriteFunctionMapping(&map, GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, WriteColor<R8G8B8A8, GLfloat> );
-
- InsertFormatWriteFunctionMapping(&map, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_UNSIGNED_BYTE, nullptr );
- InsertFormatWriteFunctionMapping(&map, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_UNSIGNED_BYTE, nullptr );
- InsertFormatWriteFunctionMapping(&map, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, GL_UNSIGNED_BYTE, nullptr );
- InsertFormatWriteFunctionMapping(&map, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, GL_UNSIGNED_BYTE, nullptr );
-
- InsertFormatWriteFunctionMapping(&map, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, nullptr );
- InsertFormatWriteFunctionMapping(&map, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr );
- InsertFormatWriteFunctionMapping(&map, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr );
-
- InsertFormatWriteFunctionMapping(&map, GL_STENCIL, GL_UNSIGNED_BYTE, nullptr );
-
- InsertFormatWriteFunctionMapping(&map, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, nullptr );
- InsertFormatWriteFunctionMapping(&map, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, nullptr );
- // clang-format on
-
- return map;
-}
-
-void CopyColor(gl::ColorF *color)
-{
- // No-op
-}
-
-void PremultiplyAlpha(gl::ColorF *color)
-{
- color->red *= color->alpha;
- color->green *= color->alpha;
- color->blue *= color->alpha;
-}
-
-void UnmultiplyAlpha(gl::ColorF *color)
-{
- if (color->alpha != 0.0f)
- {
- float invAlpha = 1.0f / color->alpha;
- color->red *= invAlpha;
- color->green *= invAlpha;
- color->blue *= invAlpha;
- }
-}
-
-void ClipChannelsR(gl::ColorF *color)
-{
- color->green = 0.0f;
- color->blue = 0.0f;
- color->alpha = 1.0f;
-}
-
-void ClipChannelsRG(gl::ColorF *color)
-{
- color->blue = 0.0f;
- color->alpha = 1.0f;
-}
-
-void ClipChannelsRGB(gl::ColorF *color)
-{
- color->alpha = 1.0f;
-}
-
-void ClipChannelsLuminance(gl::ColorF *color)
-{
- color->alpha = 1.0f;
-}
-
-void ClipChannelsAlpha(gl::ColorF *color)
-{
- color->red = 0.0f;
- color->green = 0.0f;
- color->blue = 0.0f;
-}
-
-void ClipChannelsNoOp(gl::ColorF *color)
-{
-}
-
-void WriteUintColor(const gl::ColorF &color,
- ColorWriteFunction colorWriteFunction,
- uint8_t *destPixelData)
-{
- gl::ColorUI destColor(
- static_cast<unsigned int>(color.red * 255), static_cast<unsigned int>(color.green * 255),
- static_cast<unsigned int>(color.blue * 255), static_cast<unsigned int>(color.alpha * 255));
- colorWriteFunction(reinterpret_cast<const uint8_t *>(&destColor), destPixelData);
-}
-
-void WriteFloatColor(const gl::ColorF &color,
- ColorWriteFunction colorWriteFunction,
- uint8_t *destPixelData)
-{
- colorWriteFunction(reinterpret_cast<const uint8_t *>(&color), destPixelData);
-}
-
-} // anonymous namespace
-
-PackPixelsParams::PackPixelsParams()
- : format(GL_NONE), type(GL_NONE), outputPitch(0), packBuffer(nullptr), offset(0)
-{
-}
-
-PackPixelsParams::PackPixelsParams(const gl::Rectangle &areaIn,
- GLenum formatIn,
- GLenum typeIn,
- GLuint outputPitchIn,
- const gl::PixelPackState &packIn,
- gl::Buffer *packBufferIn,
- ptrdiff_t offsetIn)
- : area(areaIn),
- format(formatIn),
- type(typeIn),
- outputPitch(outputPitchIn),
- packBuffer(packBufferIn),
- pack(),
- offset(offsetIn)
-{
- pack.alignment = packIn.alignment;
- pack.reverseRowOrder = packIn.reverseRowOrder;
-}
-
-void PackPixels(const PackPixelsParams &params,
- const angle::Format &sourceFormat,
- int inputPitchIn,
- const uint8_t *sourceIn,
- uint8_t *destWithoutOffset)
-{
- uint8_t *destWithOffset = destWithoutOffset + params.offset;
-
- const uint8_t *source = sourceIn;
- int inputPitch = inputPitchIn;
-
- if (params.pack.reverseRowOrder)
- {
- source += inputPitch * (params.area.height - 1);
- inputPitch = -inputPitch;
- }
-
- const auto &sourceGLInfo = gl::GetSizedInternalFormatInfo(sourceFormat.glInternalFormat);
-
- if (sourceGLInfo.format == params.format && sourceGLInfo.type == params.type)
- {
- // Direct copy possible
- for (int y = 0; y < params.area.height; ++y)
- {
- memcpy(destWithOffset + y * params.outputPitch, source + y * inputPitch,
- params.area.width * sourceGLInfo.pixelBytes);
- }
- return;
- }
-
- ASSERT(sourceGLInfo.sized);
-
- gl::FormatType formatType(params.format, params.type);
- ColorCopyFunction fastCopyFunc =
- GetFastCopyFunction(sourceFormat.fastCopyFunctions, formatType);
- const auto &destFormatInfo = gl::GetInternalFormatInfo(formatType.format, formatType.type);
-
- if (fastCopyFunc)
- {
- // Fast copy is possible through some special function
- for (int y = 0; y < params.area.height; ++y)
- {
- for (int x = 0; x < params.area.width; ++x)
- {
- uint8_t *dest =
- destWithOffset + y * params.outputPitch + x * destFormatInfo.pixelBytes;
- const uint8_t *src = source + y * inputPitch + x * sourceGLInfo.pixelBytes;
-
- fastCopyFunc(src, dest);
- }
- }
- return;
- }
-
- ColorWriteFunction colorWriteFunction = GetColorWriteFunction(formatType);
-
- // Maximum size of any Color<T> type used.
- uint8_t temp[16];
- static_assert(sizeof(temp) >= sizeof(gl::ColorF) && sizeof(temp) >= sizeof(gl::ColorUI) &&
- sizeof(temp) >= sizeof(gl::ColorI),
- "Unexpected size of gl::Color struct.");
-
- const auto &colorReadFunction = sourceFormat.colorReadFunction;
-
- for (int y = 0; y < params.area.height; ++y)
- {
- for (int x = 0; x < params.area.width; ++x)
- {
- uint8_t *dest = destWithOffset + y * params.outputPitch + x * destFormatInfo.pixelBytes;
- const uint8_t *src = source + y * inputPitch + x * sourceGLInfo.pixelBytes;
-
- // readFunc and writeFunc will be using the same type of color, CopyTexImage
- // will not allow the copy otherwise.
- colorReadFunction(src, temp);
- colorWriteFunction(temp, dest);
- }
- }
-}
-
-ColorWriteFunction GetColorWriteFunction(const gl::FormatType &formatType)
-{
- static const FormatWriteFunctionMap formatTypeMap = BuildFormatWriteFunctionMap();
- auto iter = formatTypeMap.find(formatType);
- ASSERT(iter != formatTypeMap.end());
- if (iter != formatTypeMap.end())
- {
- return iter->second;
- }
- else
- {
- return nullptr;
- }
-}
-
-ColorCopyFunction GetFastCopyFunction(const FastCopyFunctionMap &fastCopyFunctions,
- const gl::FormatType &formatType)
-{
- return fastCopyFunctions.get(formatType);
-}
-
-bool FastCopyFunctionMap::has(const gl::FormatType &formatType) const
-{
- return (get(formatType) != nullptr);
-}
-
-ColorCopyFunction FastCopyFunctionMap::get(const gl::FormatType &formatType) const
-{
- for (size_t index = 0; index < mSize; ++index)
- {
- if (mData[index].format == formatType.format && mData[index].type == formatType.type)
- {
- return mData[index].func;
- }
- }
-
- return nullptr;
-}
-
-bool ShouldUseDebugLayers(const egl::AttributeMap &attribs)
-{
- EGLAttrib debugSetting =
- attribs.get(EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE, EGL_DONT_CARE);
-
-// Prefer to enable debug layers if compiling in Debug, and disabled in Release.
-#if !defined(NDEBUG)
- return (debugSetting != EGL_FALSE);
-#else
- return (debugSetting == EGL_TRUE);
-#endif // !defined(NDEBUG)
-}
-
-void CopyImageCHROMIUM(const uint8_t *sourceData,
- size_t sourceRowPitch,
- size_t sourcePixelBytes,
- ColorReadFunction colorReadFunction,
- uint8_t *destData,
- size_t destRowPitch,
- size_t destPixelBytes,
- ColorWriteFunction colorWriteFunction,
- GLenum destUnsizedFormat,
- GLenum destComponentType,
- size_t width,
- size_t height,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha)
-{
- using ConversionFunction = void (*)(gl::ColorF *);
- ConversionFunction conversionFunction = CopyColor;
- if (unpackPremultiplyAlpha != unpackUnmultiplyAlpha)
- {
- if (unpackPremultiplyAlpha)
- {
- conversionFunction = PremultiplyAlpha;
- }
- else
- {
- conversionFunction = UnmultiplyAlpha;
- }
- }
-
- auto clipChannelsFunction = ClipChannelsNoOp;
- switch (destUnsizedFormat)
- {
- case GL_RED:
- clipChannelsFunction = ClipChannelsR;
- break;
- case GL_RG:
- clipChannelsFunction = ClipChannelsRG;
- break;
- case GL_RGB:
- clipChannelsFunction = ClipChannelsRGB;
- break;
- case GL_LUMINANCE:
- clipChannelsFunction = ClipChannelsLuminance;
- break;
- case GL_ALPHA:
- clipChannelsFunction = ClipChannelsAlpha;
- break;
- }
-
- auto writeFunction = (destComponentType == GL_UNSIGNED_INT) ? WriteUintColor : WriteFloatColor;
-
- for (size_t y = 0; y < height; y++)
- {
- for (size_t x = 0; x < width; x++)
- {
- const uint8_t *sourcePixelData = sourceData + y * sourceRowPitch + x * sourcePixelBytes;
-
- gl::ColorF sourceColor;
- colorReadFunction(sourcePixelData, reinterpret_cast<uint8_t *>(&sourceColor));
-
- conversionFunction(&sourceColor);
- clipChannelsFunction(&sourceColor);
-
- size_t destY = 0;
- if (unpackFlipY)
- {
- destY += (height - 1);
- destY -= y;
- }
- else
- {
- destY += y;
- }
-
- uint8_t *destPixelData = destData + destY * destRowPitch + x * destPixelBytes;
- writeFunction(sourceColor, colorWriteFunction, destPixelData);
- }
- }
-}
-
-// IncompleteTextureSet implementation.
-IncompleteTextureSet::IncompleteTextureSet()
-{
-}
-
-IncompleteTextureSet::~IncompleteTextureSet()
-{
-}
-
-void IncompleteTextureSet::onDestroy(const gl::Context *context)
-{
- // Clear incomplete textures.
- for (auto &incompleteTexture : mIncompleteTextures)
- {
- ANGLE_SWALLOW_ERR(incompleteTexture.second->onDestroy(context));
- incompleteTexture.second.set(context, nullptr);
- }
- mIncompleteTextures.clear();
-}
-
-gl::Error IncompleteTextureSet::getIncompleteTexture(
- const gl::Context *context,
- GLenum type,
- MultisampleTextureInitializer *multisampleInitializer,
- gl::Texture **textureOut)
-{
- auto iter = mIncompleteTextures.find(type);
- if (iter != mIncompleteTextures.end())
- {
- *textureOut = iter->second.get();
- return gl::NoError();
- }
-
- ContextImpl *implFactory = context->getImplementation();
-
- const GLubyte color[] = {0, 0, 0, 255};
- const gl::Extents colorSize(1, 1, 1);
- gl::PixelUnpackState unpack;
- unpack.alignment = 1;
- const gl::Box area(0, 0, 0, 1, 1, 1);
-
- // If a texture is external use a 2D texture for the incomplete texture
- GLenum createType = (type == GL_TEXTURE_EXTERNAL_OES) ? GL_TEXTURE_2D : type;
-
- gl::Texture *tex = new gl::Texture(implFactory, std::numeric_limits<GLuint>::max(), createType);
- angle::UniqueObjectPointer<gl::Texture, gl::Context> t(tex, context);
-
- if (createType == GL_TEXTURE_2D_MULTISAMPLE)
- {
- ANGLE_TRY(t->setStorageMultisample(context, createType, 1, GL_RGBA8, colorSize, true));
- }
- else
- {
- ANGLE_TRY(t->setStorage(context, createType, 1, GL_RGBA8, colorSize));
- }
-
- if (type == GL_TEXTURE_CUBE_MAP)
- {
- for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
- face++)
- {
- ANGLE_TRY(
- t->setSubImage(context, unpack, face, 0, area, GL_RGBA, GL_UNSIGNED_BYTE, color));
- }
- }
- else if (type == GL_TEXTURE_2D_MULTISAMPLE)
- {
- // Call a specialized clear function to init a multisample texture.
- ANGLE_TRY(multisampleInitializer->initializeMultisampleTextureToBlack(context, t.get()));
- }
- else
- {
- ANGLE_TRY(
- t->setSubImage(context, unpack, createType, 0, area, GL_RGBA, GL_UNSIGNED_BYTE, color));
- }
-
- t->syncState();
-
- mIncompleteTextures[type].set(context, t.release());
- *textureOut = mIncompleteTextures[type].get();
- return gl::NoError();
-}
-
-} // namespace rx
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/renderer_utils.h b/src/3rdparty/angle/src/libANGLE/renderer/renderer_utils.h
deleted file mode 100644
index 5a1cb38a6a..0000000000
--- a/src/3rdparty/angle/src/libANGLE/renderer/renderer_utils.h
+++ /dev/null
@@ -1,254 +0,0 @@
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// renderer_utils:
-// Helper methods pertaining to most or all back-ends.
-//
-
-#ifndef LIBANGLE_RENDERER_RENDERER_UTILS_H_
-#define LIBANGLE_RENDERER_RENDERER_UTILS_H_
-
-#include <cstdint>
-
-#include <limits>
-#include <map>
-
-#include "common/angleutils.h"
-#include "libANGLE/angletypes.h"
-
-namespace angle
-{
-struct Format;
-} // namespace angle
-
-namespace gl
-{
-struct FormatType;
-struct InternalFormat;
-} // namespace gl
-
-namespace egl
-{
-class AttributeMap;
-} // namespace egl
-
-namespace rx
-{
-
-class ResourceSerial
-{
- public:
- constexpr ResourceSerial() : mValue(kDirty) {}
- explicit constexpr ResourceSerial(uintptr_t value) : mValue(value) {}
- constexpr bool operator==(ResourceSerial other) const { return mValue == other.mValue; }
- constexpr bool operator!=(ResourceSerial other) const { return mValue != other.mValue; }
-
- void dirty() { mValue = kDirty; }
- void clear() { mValue = kEmpty; }
-
- constexpr bool valid() const { return mValue != kEmpty && mValue != kDirty; }
- constexpr bool empty() const { return mValue == kEmpty; }
-
- private:
- constexpr static uintptr_t kDirty = std::numeric_limits<uintptr_t>::max();
- constexpr static uintptr_t kEmpty = 0;
-
- uintptr_t mValue;
-};
-
-class SerialFactory;
-
-class Serial final
-{
- public:
- constexpr Serial() : mValue(kInvalid) {}
- constexpr Serial(const Serial &other) = default;
- Serial &operator=(const Serial &other) = default;
-
- constexpr bool operator==(const Serial &other) const
- {
- return mValue != kInvalid && mValue == other.mValue;
- }
- constexpr bool operator!=(const Serial &other) const
- {
- return mValue == kInvalid || mValue != other.mValue;
- }
- constexpr bool operator>(const Serial &other) const { return mValue > other.mValue; }
- constexpr bool operator>=(const Serial &other) const { return mValue >= other.mValue; }
- constexpr bool operator<(const Serial &other) const { return mValue < other.mValue; }
- constexpr bool operator<=(const Serial &other) const { return mValue <= other.mValue; }
-
- private:
- friend class SerialFactory;
- constexpr explicit Serial(uint64_t value) : mValue(value) {}
- uint64_t mValue;
- static constexpr uint64_t kInvalid = 0;
-};
-
-class SerialFactory final : angle::NonCopyable
-{
- public:
- SerialFactory() : mSerial(1) {}
-
- Serial generate()
- {
- ASSERT(mSerial != std::numeric_limits<uint64_t>::max());
- return Serial(mSerial++);
- }
-
- private:
- uint64_t mSerial;
-};
-
-using MipGenerationFunction = void (*)(size_t sourceWidth,
- size_t sourceHeight,
- size_t sourceDepth,
- const uint8_t *sourceData,
- size_t sourceRowPitch,
- size_t sourceDepthPitch,
- uint8_t *destData,
- size_t destRowPitch,
- size_t destDepthPitch);
-
-typedef void (*ColorReadFunction)(const uint8_t *source, uint8_t *dest);
-typedef void (*ColorWriteFunction)(const uint8_t *source, uint8_t *dest);
-typedef void (*ColorCopyFunction)(const uint8_t *source, uint8_t *dest);
-
-class FastCopyFunctionMap
-{
- public:
- struct Entry
- {
- GLenum format;
- GLenum type;
- ColorCopyFunction func;
- };
-
- constexpr FastCopyFunctionMap() : FastCopyFunctionMap(nullptr, 0) {}
-
- constexpr FastCopyFunctionMap(const Entry *data, size_t size) : mSize(size), mData(data) {}
-
- bool has(const gl::FormatType &formatType) const;
- ColorCopyFunction get(const gl::FormatType &formatType) const;
-
- private:
- size_t mSize;
- const Entry *mData;
-};
-
-struct PackPixelsParams
-{
- PackPixelsParams();
- PackPixelsParams(const gl::Rectangle &area,
- GLenum format,
- GLenum type,
- GLuint outputPitch,
- const gl::PixelPackState &pack,
- gl::Buffer *packBufferIn,
- ptrdiff_t offset);
-
- gl::Rectangle area;
- GLenum format;
- GLenum type;
- GLuint outputPitch;
- gl::Buffer *packBuffer;
- gl::PixelPackState pack;
- ptrdiff_t offset;
-};
-
-void PackPixels(const PackPixelsParams &params,
- const angle::Format &sourceFormat,
- int inputPitch,
- const uint8_t *source,
- uint8_t *destination);
-
-ColorWriteFunction GetColorWriteFunction(const gl::FormatType &formatType);
-ColorCopyFunction GetFastCopyFunction(const FastCopyFunctionMap &fastCopyFunctions,
- const gl::FormatType &formatType);
-
-using InitializeTextureDataFunction = void (*)(size_t width,
- size_t height,
- size_t depth,
- uint8_t *output,
- size_t outputRowPitch,
- size_t outputDepthPitch);
-
-using LoadImageFunction = void (*)(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);
-
-struct LoadImageFunctionInfo
-{
- LoadImageFunctionInfo() : loadFunction(nullptr), requiresConversion(false) {}
- LoadImageFunctionInfo(LoadImageFunction loadFunction, bool requiresConversion)
- : loadFunction(loadFunction), requiresConversion(requiresConversion)
- {
- }
-
- LoadImageFunction loadFunction;
- bool requiresConversion;
-};
-
-using LoadFunctionMap = LoadImageFunctionInfo (*)(GLenum);
-
-bool ShouldUseDebugLayers(const egl::AttributeMap &attribs);
-
-void CopyImageCHROMIUM(const uint8_t *sourceData,
- size_t sourceRowPitch,
- size_t sourcePixelBytes,
- ColorReadFunction readFunction,
- uint8_t *destData,
- size_t destRowPitch,
- size_t destPixelBytes,
- ColorWriteFunction colorWriteFunction,
- GLenum destUnsizedFormat,
- GLenum destComponentType,
- size_t width,
- size_t height,
- bool unpackFlipY,
- bool unpackPremultiplyAlpha,
- bool unpackUnmultiplyAlpha);
-
-// Incomplete textures are 1x1 textures filled with black, used when samplers are incomplete.
-// This helper class encapsulates handling incomplete textures. Because the GL back-end
-// can take advantage of the driver's incomplete textures, and because clearing multisample
-// textures is so difficult, we can keep an instance of this class in the back-end instead
-// of moving the logic to the Context front-end.
-
-// This interface allows us to call-back to init a multisample texture.
-class MultisampleTextureInitializer
-{
- public:
- virtual ~MultisampleTextureInitializer() {}
- virtual gl::Error initializeMultisampleTextureToBlack(const gl::Context *context,
- gl::Texture *glTexture) = 0;
-};
-
-class IncompleteTextureSet final : angle::NonCopyable
-{
- public:
- IncompleteTextureSet();
- ~IncompleteTextureSet();
-
- void onDestroy(const gl::Context *context);
-
- gl::Error getIncompleteTexture(const gl::Context *context,
- GLenum type,
- MultisampleTextureInitializer *multisampleInitializer,
- gl::Texture **textureOut);
-
- private:
- gl::TextureMap mIncompleteTextures;
-};
-
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_RENDERER_UTILS_H_
diff --git a/src/3rdparty/angle/src/libANGLE/signal_utils.h b/src/3rdparty/angle/src/libANGLE/signal_utils.h
deleted file mode 100644
index 3dd1332013..0000000000
--- a/src/3rdparty/angle/src/libANGLE/signal_utils.h
+++ /dev/null
@@ -1,187 +0,0 @@
-//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// signal_utils:
-// Helper classes for tracking dependent state changes between objects.
-// These changes are signaled to the dependent class via channels.
-// See design document:
-// https://docs.google.com/document/d/15Edfotqg6_l1skTEL8ADQudF_oIdNa7i8Po43k6jMd4/
-
-#ifndef LIBANGLE_SIGNAL_UTILS_H_
-#define LIBANGLE_SIGNAL_UTILS_H_
-
-#include <set>
-
-#include "common/angleutils.h"
-#include "common/debug.h"
-
-namespace angle
-{
-
-// Interface that the depending class inherits from.
-template <typename ChannelID = uint32_t, typename... MessageT>
-class SignalReceiver
-{
- public:
- virtual ~SignalReceiver() = default;
- virtual void signal(ChannelID channelID, MessageT... message) = 0;
-};
-
-template <typename ChannelID, typename... MessageT>
-class ChannelBinding;
-
-// The host class owns the channel. It uses the channel to fire signals to the receiver.
-template <typename ChannelID = uint32_t, typename... MessageT>
-class BroadcastChannel final : NonCopyable
-{
- public:
- BroadcastChannel();
- ~BroadcastChannel();
-
- void signal(MessageT... message) const;
-
- void reset();
-
- bool empty() const;
-
- private:
- // Only the ChannelBinding class should add or remove receivers.
- friend class ChannelBinding<ChannelID, MessageT...>;
- void addReceiver(ChannelBinding<ChannelID, MessageT...> *receiver);
- void removeReceiver(ChannelBinding<ChannelID, MessageT...> *receiver);
-
- std::vector<ChannelBinding<ChannelID, MessageT...> *> mReceivers;
-};
-
-template <typename ChannelID, typename... MessageT>
-BroadcastChannel<ChannelID, MessageT...>::BroadcastChannel()
-{
-}
-
-template <typename ChannelID, typename... MessageT>
-BroadcastChannel<ChannelID, MessageT...>::~BroadcastChannel()
-{
- reset();
-}
-
-template <typename ChannelID, typename... MessageT>
-void BroadcastChannel<ChannelID, MessageT...>::addReceiver(
- ChannelBinding<ChannelID, MessageT...> *receiver)
-{
- ASSERT(std::find(mReceivers.begin(), mReceivers.end(), receiver) == mReceivers.end());
- mReceivers.push_back(receiver);
-}
-
-template <typename ChannelID, typename... MessageT>
-void BroadcastChannel<ChannelID, MessageT...>::removeReceiver(
- ChannelBinding<ChannelID, MessageT...> *receiver)
-{
- auto iter = std::find(mReceivers.begin(), mReceivers.end(), receiver);
- ASSERT(iter != mReceivers.end());
- mReceivers.erase(iter);
-}
-
-template <typename ChannelID, typename... MessageT>
-void BroadcastChannel<ChannelID, MessageT...>::signal(MessageT... message) const
-{
- if (mReceivers.empty())
- return;
-
- for (const auto *receiver : mReceivers)
- {
- receiver->signal(message...);
- }
-}
-
-template <typename ChannelID, typename... MessageT>
-void BroadcastChannel<ChannelID, MessageT...>::reset()
-{
- for (auto receiver : mReceivers)
- {
- receiver->onChannelClosed();
- }
- mReceivers.clear();
-}
-
-template <typename ChannelID, typename... MessageT>
-bool BroadcastChannel<ChannelID, MessageT...>::empty() const
-{
- return mReceivers.empty();
-}
-
-// The dependent class keeps bindings to the host's BroadcastChannel.
-template <typename ChannelID = uint32_t, typename... MessageT>
-class ChannelBinding final
-{
- public:
- ChannelBinding(SignalReceiver<ChannelID, MessageT...> *receiver, ChannelID channelID);
- ~ChannelBinding();
- ChannelBinding(const ChannelBinding &other) = default;
- ChannelBinding &operator=(const ChannelBinding &other) = default;
-
- void bind(BroadcastChannel<ChannelID, MessageT...> *channel);
- void reset();
- void signal(MessageT... message) const;
- void onChannelClosed();
-
- private:
- BroadcastChannel<ChannelID, MessageT...> *mChannel;
- SignalReceiver<ChannelID, MessageT...> *mReceiver;
- ChannelID mChannelID;
-};
-
-template <typename ChannelID, typename... MessageT>
-ChannelBinding<ChannelID, MessageT...>::ChannelBinding(
- SignalReceiver<ChannelID, MessageT...> *receiver,
- ChannelID channelID)
- : mChannel(nullptr), mReceiver(receiver), mChannelID(channelID)
-{
- ASSERT(receiver);
-}
-
-template <typename ChannelID, typename... MessageT>
-ChannelBinding<ChannelID, MessageT...>::~ChannelBinding()
-{
- reset();
-}
-
-template <typename ChannelID, typename... MessageT>
-void ChannelBinding<ChannelID, MessageT...>::bind(BroadcastChannel<ChannelID, MessageT...> *channel)
-{
- ASSERT(mReceiver);
- if (mChannel)
- {
- mChannel->removeReceiver(this);
- }
-
- mChannel = channel;
-
- if (mChannel)
- {
- mChannel->addReceiver(this);
- }
-}
-
-template <typename ChannelID, typename... MessageT>
-void ChannelBinding<ChannelID, MessageT...>::reset()
-{
- bind(nullptr);
-}
-
-template <typename ChannelID, typename... MessageT>
-void ChannelBinding<ChannelID, MessageT...>::signal(MessageT... message) const
-{
- mReceiver->signal(mChannelID, message...);
-}
-
-template <typename ChannelID, typename... MessageT>
-void ChannelBinding<ChannelID, MessageT...>::onChannelClosed()
-{
- mChannel = nullptr;
-}
-
-} // namespace angle
-
-#endif // LIBANGLE_SIGNAL_UTILS_H_
diff --git a/src/3rdparty/angle/src/libANGLE/validationEGL.cpp b/src/3rdparty/angle/src/libANGLE/validationEGL.cpp
deleted file mode 100644
index 13a3a9e280..0000000000
--- a/src/3rdparty/angle/src/libANGLE/validationEGL.cpp
+++ /dev/null
@@ -1,2501 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationEGL.cpp: Validation functions for generic EGL entry point parameters
-
-#include "libANGLE/validationEGL.h"
-
-#include "common/utilities.h"
-#include "libANGLE/Config.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/Device.h"
-#include "libANGLE/Display.h"
-#include "libANGLE/Image.h"
-#include "libANGLE/Stream.h"
-#include "libANGLE/Surface.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/formatutils.h"
-
-#include <EGL/eglext.h>
-
-namespace egl
-{
-namespace
-{
-size_t GetMaximumMipLevel(const gl::Context *context, GLenum target)
-{
- const gl::Caps &caps = context->getCaps();
-
- size_t maxDimension = 0;
- switch (target)
- {
- case GL_TEXTURE_2D:
- maxDimension = caps.max2DTextureSize;
- break;
- case GL_TEXTURE_RECTANGLE_ANGLE:
- maxDimension = caps.maxRectangleTextureSize;
- break;
- case GL_TEXTURE_CUBE_MAP:
- maxDimension = caps.maxCubeMapTextureSize;
- break;
- case GL_TEXTURE_3D:
- maxDimension = caps.max3DTextureSize;
- break;
- case GL_TEXTURE_2D_ARRAY:
- maxDimension = caps.max2DTextureSize;
- break;
- default:
- UNREACHABLE();
- }
-
- return gl::log2(static_cast<int>(maxDimension));
-}
-
-bool TextureHasNonZeroMipLevelsSpecified(const gl::Context *context, const gl::Texture *texture)
-{
- size_t maxMip = GetMaximumMipLevel(context, texture->getTarget());
- for (size_t level = 1; level < maxMip; level++)
- {
- if (texture->getTarget() == GL_TEXTURE_CUBE_MAP)
- {
- for (GLenum face = gl::FirstCubeMapTextureTarget; face <= gl::LastCubeMapTextureTarget;
- face++)
- {
- if (texture->getFormat(face, level).valid())
- {
- return true;
- }
- }
- }
- else
- {
- if (texture->getFormat(texture->getTarget(), level).valid())
- {
- return true;
- }
- }
- }
-
- return false;
-}
-
-bool CubeTextureHasUnspecifiedLevel0Face(const gl::Texture *texture)
-{
- ASSERT(texture->getTarget() == GL_TEXTURE_CUBE_MAP);
- for (GLenum face = gl::FirstCubeMapTextureTarget; face <= gl::LastCubeMapTextureTarget; face++)
- {
- if (!texture->getFormat(face, 0).valid())
- {
- return true;
- }
- }
-
- return false;
-}
-
-Error ValidateStreamAttribute(const EGLAttrib attribute,
- const EGLAttrib value,
- const DisplayExtensions &extensions)
-{
- switch (attribute)
- {
- case EGL_STREAM_STATE_KHR:
- case EGL_PRODUCER_FRAME_KHR:
- case EGL_CONSUMER_FRAME_KHR:
- return EglBadAccess() << "Attempt to initialize readonly parameter";
- case EGL_CONSUMER_LATENCY_USEC_KHR:
- // Technically not in spec but a latency < 0 makes no sense so we check it
- if (value < 0)
- {
- return EglBadParameter() << "Latency must be positive";
- }
- break;
- case EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR:
- if (!extensions.streamConsumerGLTexture)
- {
- return EglBadAttribute() << "Consumer GL extension not enabled";
- }
- // Again not in spec but it should be positive anyways
- if (value < 0)
- {
- return EglBadParameter() << "Timeout must be positive";
- }
- break;
- default:
- return EglBadAttribute() << "Invalid stream attribute";
- }
- return NoError();
-}
-
-Error ValidateCreateImageKHRMipLevelCommon(gl::Context *context,
- const gl::Texture *texture,
- EGLAttrib level)
-{
- // Note that the spec EGL_KHR_create_image spec does not explicitly specify an error
- // when the level is outside the base/max level range, but it does mention that the
- // level "must be a part of the complete texture object <buffer>". It can be argued
- // that out-of-range levels are not a part of the complete texture.
- const GLuint effectiveBaseLevel = texture->getTextureState().getEffectiveBaseLevel();
- if (level > 0 &&
- (!texture->isMipmapComplete() || static_cast<GLuint>(level) < effectiveBaseLevel ||
- static_cast<GLuint>(level) > texture->getTextureState().getMipmapMaxLevel()))
- {
- return EglBadParameter() << "texture must be complete if level is non-zero.";
- }
-
- if (level == 0 && !texture->isMipmapComplete() &&
- TextureHasNonZeroMipLevelsSpecified(context, texture))
- {
- return EglBadParameter() << "if level is zero and the texture is incomplete, it must "
- "have no mip levels specified except zero.";
- }
-
- return NoError();
-}
-
-Error ValidateConfigAttribute(const Display *display, EGLAttrib attribute)
-{
- switch (attribute)
- {
- case EGL_BUFFER_SIZE:
- case EGL_ALPHA_SIZE:
- case EGL_BLUE_SIZE:
- case EGL_GREEN_SIZE:
- case EGL_RED_SIZE:
- case EGL_DEPTH_SIZE:
- case EGL_STENCIL_SIZE:
- case EGL_CONFIG_CAVEAT:
- case EGL_CONFIG_ID:
- case EGL_LEVEL:
- case EGL_NATIVE_RENDERABLE:
- case EGL_NATIVE_VISUAL_ID:
- case EGL_NATIVE_VISUAL_TYPE:
- case EGL_SAMPLES:
- case EGL_SAMPLE_BUFFERS:
- case EGL_SURFACE_TYPE:
- case EGL_TRANSPARENT_TYPE:
- case EGL_TRANSPARENT_BLUE_VALUE:
- case EGL_TRANSPARENT_GREEN_VALUE:
- case EGL_TRANSPARENT_RED_VALUE:
- case EGL_BIND_TO_TEXTURE_RGB:
- case EGL_BIND_TO_TEXTURE_RGBA:
- case EGL_MIN_SWAP_INTERVAL:
- case EGL_MAX_SWAP_INTERVAL:
- case EGL_LUMINANCE_SIZE:
- case EGL_ALPHA_MASK_SIZE:
- case EGL_COLOR_BUFFER_TYPE:
- case EGL_RENDERABLE_TYPE:
- case EGL_MATCH_NATIVE_PIXMAP:
- case EGL_CONFORMANT:
- case EGL_MAX_PBUFFER_WIDTH:
- case EGL_MAX_PBUFFER_HEIGHT:
- case EGL_MAX_PBUFFER_PIXELS:
- break;
-
- case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
- if (!display->getExtensions().surfaceOrientation)
- {
- return EglBadAttribute() << "EGL_ANGLE_surface_orientation is not enabled.";
- }
- break;
-
- case EGL_COLOR_COMPONENT_TYPE_EXT:
- if (!display->getExtensions().pixelFormatFloat)
- {
- return EglBadAttribute() << "EGL_EXT_pixel_format_float is not enabled.";
- }
- break;
-
- default:
- return EglBadAttribute() << "Unknown attribute.";
- }
-
- return NoError();
-}
-
-Error ValidateConfigAttributes(const Display *display, const AttributeMap &attributes)
-{
- for (const auto &attrib : attributes)
- {
- ANGLE_TRY(ValidateConfigAttribute(display, attrib.first));
- }
-
- return NoError();
-}
-
-Error ValidatePlatformType(const ClientExtensions &clientExtensions, EGLAttrib platformType)
-{
- switch (platformType)
- {
- case EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE:
- break;
-
- case EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE:
- case EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE:
- if (!clientExtensions.platformANGLED3D)
- {
- return EglBadAttribute() << "Direct3D platform is unsupported.";
- }
- break;
-
- case EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE:
- case EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE:
- if (!clientExtensions.platformANGLEOpenGL)
- {
- return EglBadAttribute() << "OpenGL platform is unsupported.";
- }
- break;
-
- case EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE:
- if (!clientExtensions.platformANGLENULL)
- {
- return EglBadAttribute() << "Display type EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE "
- "requires EGL_ANGLE_platform_angle_null.";
- }
- break;
-
- case EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE:
- if (!clientExtensions.platformANGLEVulkan)
- {
- return EglBadAttribute() << "Vulkan platform is unsupported.";
- }
- break;
-
- default:
- return EglBadAttribute() << "Unknown platform type.";
- }
-
- return NoError();
-}
-
-Error ValidateGetPlatformDisplayCommon(EGLenum platform,
- void *native_display,
- const AttributeMap &attribMap)
-{
- const ClientExtensions &clientExtensions = Display::GetClientExtensions();
-
- switch (platform)
- {
- case EGL_PLATFORM_ANGLE_ANGLE:
- if (!clientExtensions.platformANGLE)
- {
- return EglBadParameter() << "Platform ANGLE extension is not active";
- }
- break;
- case EGL_PLATFORM_DEVICE_EXT:
- if (!clientExtensions.platformDevice)
- {
- return EglBadParameter() << "Platform Device extension is not active";
- }
- break;
- default:
- return EglBadConfig() << "Bad platform type.";
- }
-
- if (platform == EGL_PLATFORM_ANGLE_ANGLE)
- {
- EGLAttrib platformType = EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE;
- EGLAttrib deviceType = EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE;
- bool enableAutoTrimSpecified = false;
- bool deviceTypeSpecified = false;
- bool presentPathSpecified = false;
-
- Optional<EGLAttrib> majorVersion;
- Optional<EGLAttrib> minorVersion;
-
- for (const auto &curAttrib : attribMap)
- {
- const EGLAttrib value = curAttrib.second;
-
- switch (curAttrib.first)
- {
- case EGL_PLATFORM_ANGLE_TYPE_ANGLE:
- {
- ANGLE_TRY(ValidatePlatformType(clientExtensions, value));
- platformType = value;
- break;
- }
-
- case EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE:
- if (value != EGL_DONT_CARE)
- {
- majorVersion = value;
- }
- break;
-
- case EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE:
- if (value != EGL_DONT_CARE)
- {
- minorVersion = value;
- }
- break;
-
- case EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE:
- switch (value)
- {
- case EGL_TRUE:
- case EGL_FALSE:
- break;
- default:
- return EglBadAttribute() << "Invalid automatic trim attribute";
- }
- enableAutoTrimSpecified = true;
- break;
-
- case EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE:
- if (!clientExtensions.experimentalPresentPath)
- {
- return EglBadAttribute()
- << "EGL_ANGLE_experimental_present_path extension not active";
- }
-
- switch (value)
- {
- case EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE:
- case EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE:
- break;
- default:
- return EglBadAttribute()
- << "Invalid value for EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE";
- }
- presentPathSpecified = true;
- break;
-
- case EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE:
- switch (value)
- {
- case EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE:
- case EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE:
- case EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE:
- deviceTypeSpecified = true;
- break;
-
- case EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE:
- // This is a hidden option, accepted by the OpenGL back-end.
- break;
-
- default:
- return EglBadAttribute() << "Invalid value for "
- "EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE "
- "attrib";
- }
- deviceType = value;
- break;
-
- case EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE:
- if (!clientExtensions.platformANGLE)
- {
- return EglBadAttribute() << "EGL_ANGLE_platform_angle extension not active";
- }
- if (value != EGL_TRUE && value != EGL_FALSE && value != EGL_DONT_CARE)
- {
- return EglBadAttribute() << "EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE "
- "must be EGL_TRUE, EGL_FALSE, or "
- "EGL_DONT_CARE.";
- }
- break;
-
- default:
- break;
- }
- }
-
- if (!majorVersion.valid() && minorVersion.valid())
- {
- return EglBadAttribute()
- << "Must specify major version if you specify a minor version.";
- }
-
- if (deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE &&
- platformType != EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
- {
- return EglBadAttribute() << "EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE requires a "
- "device type of EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE.";
- }
-
- if (enableAutoTrimSpecified && platformType != EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
- {
- return EglBadAttribute() << "EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE "
- "requires a device type of "
- "EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE.";
- }
-
- if (presentPathSpecified && platformType != EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
- {
- return EglBadAttribute() << "EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE requires a "
- "device type of EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE.";
- }
-
- if (deviceTypeSpecified && platformType != EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE &&
- platformType != EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
- {
- return EglBadAttribute() << "EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE requires a "
- "device type of EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE or "
- "EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE.";
- }
-
- if (platformType == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
- {
- if ((majorVersion.valid() && majorVersion.value() != 1) ||
- (minorVersion.valid() && minorVersion.value() != 0))
- {
- return EglBadAttribute() << "EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE currently "
- "only supports Vulkan 1.0.";
- }
- }
- }
- else if (platform == EGL_PLATFORM_DEVICE_EXT)
- {
- Device *eglDevice = reinterpret_cast<Device *>(native_display);
- if (eglDevice == nullptr || !Device::IsValidDevice(eglDevice))
- {
- return EglBadAttribute() << "native_display should be a valid EGL device if "
- "platform equals EGL_PLATFORM_DEVICE_EXT";
- }
- }
- else
- {
- UNREACHABLE();
- }
-
- return NoError();
-}
-
-} // namespace
-
-Error ValidateDisplay(const Display *display)
-{
- if (display == EGL_NO_DISPLAY)
- {
- return EglBadDisplay() << "display is EGL_NO_DISPLAY.";
- }
-
- if (!Display::isValidDisplay(display))
- {
- return EglBadDisplay() << "display is not a valid display.";
- }
-
- if (!display->isInitialized())
- {
- return EglNotInitialized() << "display is not initialized.";
- }
-
- if (display->isDeviceLost())
- {
- return EglContextLost() << "display had a context loss";
- }
-
- return NoError();
-}
-
-Error ValidateSurface(const Display *display, const Surface *surface)
-{
- ANGLE_TRY(ValidateDisplay(display));
-
- if (!display->isValidSurface(surface))
- {
- return EglBadSurface();
- }
-
- return NoError();
-}
-
-Error ValidateConfig(const Display *display, const Config *config)
-{
- ANGLE_TRY(ValidateDisplay(display));
-
- if (!display->isValidConfig(config))
- {
- return EglBadConfig();
- }
-
- return NoError();
-}
-
-Error ValidateContext(const Display *display, const gl::Context *context)
-{
- ANGLE_TRY(ValidateDisplay(display));
-
- if (!display->isValidContext(context))
- {
- return EglBadContext();
- }
-
- return NoError();
-}
-
-Error ValidateImage(const Display *display, const Image *image)
-{
- ANGLE_TRY(ValidateDisplay(display));
-
- if (!display->isValidImage(image))
- {
- return EglBadParameter() << "image is not valid.";
- }
-
- return NoError();
-}
-
-Error ValidateStream(const Display *display, const Stream *stream)
-{
- ANGLE_TRY(ValidateDisplay(display));
-
- const DisplayExtensions &displayExtensions = display->getExtensions();
- if (!displayExtensions.stream)
- {
- return EglBadAccess() << "Stream extension not active";
- }
-
- if (stream == EGL_NO_STREAM_KHR || !display->isValidStream(stream))
- {
- return EglBadStream() << "Invalid stream";
- }
-
- return NoError();
-}
-
-Error ValidateCreateContext(Display *display, Config *configuration, gl::Context *shareContext,
- const AttributeMap& attributes)
-{
- ANGLE_TRY(ValidateConfig(display, configuration));
-
- // Get the requested client version (default is 1) and check it is 2 or 3.
- EGLAttrib clientMajorVersion = 1;
- EGLAttrib clientMinorVersion = 0;
- EGLAttrib contextFlags = 0;
- bool resetNotification = false;
- for (AttributeMap::const_iterator attributeIter = attributes.begin(); attributeIter != attributes.end(); attributeIter++)
- {
- EGLAttrib attribute = attributeIter->first;
- EGLAttrib value = attributeIter->second;
-
- switch (attribute)
- {
- case EGL_CONTEXT_CLIENT_VERSION:
- clientMajorVersion = value;
- break;
-
- case EGL_CONTEXT_MINOR_VERSION:
- clientMinorVersion = value;
- break;
-
- case EGL_CONTEXT_FLAGS_KHR:
- contextFlags = value;
- break;
-
- case EGL_CONTEXT_OPENGL_DEBUG:
- break;
-
- case EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR:
- // Only valid for OpenGL (non-ES) contexts
- return EglBadAttribute();
-
- case EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT:
- if (!display->getExtensions().createContextRobustness)
- {
- return EglBadAttribute();
- }
- if (value != EGL_TRUE && value != EGL_FALSE)
- {
- return EglBadAttribute();
- }
- break;
-
- case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR:
- return EglBadAttribute() << "EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR is not"
- << " valid for GLES with EGL 1.4 and KHR_create_context. Use"
- << " EXT_create_context_robustness.";
- case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT:
- if (!display->getExtensions().createContextRobustness)
- {
- return EglBadAttribute();
- }
- if (value == EGL_LOSE_CONTEXT_ON_RESET_EXT)
- {
- resetNotification = true;
- }
- else if (value != EGL_NO_RESET_NOTIFICATION_EXT)
- {
- return EglBadAttribute();
- }
- break;
-
- case EGL_CONTEXT_OPENGL_NO_ERROR_KHR:
- if (!display->getExtensions().createContextNoError)
- {
- return EglBadAttribute() << "Invalid Context attribute.";
- }
- if (value != EGL_TRUE && value != EGL_FALSE)
- {
- return EglBadAttribute() << "Attribute must be EGL_TRUE or EGL_FALSE.";
- }
- break;
-
- case EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE:
- if (!display->getExtensions().createContextWebGLCompatibility)
- {
- return EglBadAttribute() << "Attribute "
- "EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE requires "
- "EGL_ANGLE_create_context_webgl_compatibility.";
- }
- if (value != EGL_TRUE && value != EGL_FALSE)
- {
- return EglBadAttribute()
- << "EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE must be EGL_TRUE or EGL_FALSE.";
- }
- break;
-
- case EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM:
- if (!display->getExtensions().createContextBindGeneratesResource)
- {
- return EglBadAttribute()
- << "Attribute EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM requires "
- "EGL_CHROMIUM_create_context_bind_generates_resource.";
- }
- if (value != EGL_TRUE && value != EGL_FALSE)
- {
- return EglBadAttribute() << "EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM "
- "must be EGL_TRUE or EGL_FALSE.";
- }
- break;
-
- case EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE:
- if (!display->getExtensions().displayTextureShareGroup)
- {
- return EglBadAttribute() << "Attribute "
- "EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE requires "
- "EGL_ANGLE_display_texture_share_group.";
- }
- if (value != EGL_TRUE && value != EGL_FALSE)
- {
- return EglBadAttribute()
- << "EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE must be EGL_TRUE or EGL_FALSE.";
- }
- if (shareContext &&
- (shareContext->usingDisplayTextureShareGroup() != (value == EGL_TRUE)))
- {
- return EglBadAttribute() << "All contexts within a share group must be "
- "created with the same value of "
- "EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE.";
- }
- break;
-
- case EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE:
- if (!display->getExtensions().createContextClientArrays)
- {
- return EglBadAttribute()
- << "Attribute EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE requires "
- "EGL_ANGLE_create_context_client_arrays.";
- }
- if (value != EGL_TRUE && value != EGL_FALSE)
- {
- return EglBadAttribute() << "EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE must "
- "be EGL_TRUE or EGL_FALSE.";
- }
- break;
-
- case EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE:
- if (!display->getExtensions().programCacheControl)
- {
- return EglBadAttribute()
- << "Attribute EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE "
- "requires EGL_ANGLE_program_cache_control.";
- }
- if (value != EGL_TRUE && value != EGL_FALSE)
- {
- return EglBadAttribute() << "EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE must "
- "be EGL_TRUE or EGL_FALSE.";
- }
- break;
-
- case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
- if (!display->getExtensions().robustResourceInitialization)
- {
- return EglBadAttribute() << "Attribute EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE "
- "requires EGL_ANGLE_robust_resource_initialization.";
- }
- if (value != EGL_TRUE && value != EGL_FALSE)
- {
- return EglBadAttribute() << "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE must be "
- "either EGL_TRUE or EGL_FALSE.";
- }
- break;
-
- default:
- return EglBadAttribute() << "Unknown attribute.";
- }
- }
-
- switch (clientMajorVersion)
- {
- case 2:
- if (clientMinorVersion != 0)
- {
- return EglBadConfig();
- }
- break;
- case 3:
- if (clientMinorVersion != 0 && clientMinorVersion != 1)
- {
- return EglBadConfig();
- }
- if (!(configuration->conformant & EGL_OPENGL_ES3_BIT_KHR))
- {
- return EglBadConfig();
- }
- if (display->getMaxSupportedESVersion() <
- gl::Version(static_cast<GLuint>(clientMajorVersion),
- static_cast<GLuint>(clientMinorVersion)))
- {
- return EglBadConfig() << "Requested GLES version is not supported.";
- }
- break;
- default:
- return EglBadConfig();
- break;
- }
-
- // Note: EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR does not apply to ES
- const EGLint validContextFlags = (EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR |
- EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR);
- if ((contextFlags & ~validContextFlags) != 0)
- {
- return EglBadAttribute();
- }
-
- if (shareContext)
- {
- // Shared context is invalid or is owned by another display
- if (!display->isValidContext(shareContext))
- {
- return EglBadMatch();
- }
-
- if (shareContext->isResetNotificationEnabled() != resetNotification)
- {
- return EglBadMatch();
- }
-
- if (shareContext->getClientMajorVersion() != clientMajorVersion ||
- shareContext->getClientMinorVersion() != clientMinorVersion)
- {
- return EglBadContext();
- }
- }
-
- return NoError();
-}
-
-Error ValidateCreateWindowSurface(Display *display, Config *config, EGLNativeWindowType window,
- const AttributeMap& attributes)
-{
- ANGLE_TRY(ValidateConfig(display, config));
-
- if (!display->isValidNativeWindow(window))
- {
- return EglBadNativeWindow();
- }
-
- const DisplayExtensions &displayExtensions = display->getExtensions();
-
- for (AttributeMap::const_iterator attributeIter = attributes.begin(); attributeIter != attributes.end(); attributeIter++)
- {
- EGLAttrib attribute = attributeIter->first;
- EGLAttrib value = attributeIter->second;
-
- switch (attribute)
- {
- case EGL_RENDER_BUFFER:
- switch (value)
- {
- case EGL_BACK_BUFFER:
- break;
- case EGL_SINGLE_BUFFER:
- return EglBadMatch(); // Rendering directly to front buffer not supported
- default:
- return EglBadAttribute();
- }
- break;
-
- case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
- if (!displayExtensions.postSubBuffer)
- {
- return EglBadAttribute();
- }
- break;
-
- case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
- if (!displayExtensions.flexibleSurfaceCompatibility)
- {
- return EglBadAttribute();
- }
- break;
-
- case EGL_WIDTH:
- case EGL_HEIGHT:
- if (!displayExtensions.windowFixedSize)
- {
- return EglBadAttribute();
- }
- if (value < 0)
- {
- return EglBadParameter();
- }
- break;
-
- case EGL_FIXED_SIZE_ANGLE:
- if (!displayExtensions.windowFixedSize)
- {
- return EglBadAttribute();
- }
- break;
-
- case EGL_SURFACE_ORIENTATION_ANGLE:
- if (!displayExtensions.surfaceOrientation)
- {
- return EglBadAttribute() << "EGL_ANGLE_surface_orientation is not enabled.";
- }
- break;
-
- case EGL_VG_COLORSPACE:
- return EglBadMatch();
-
- case EGL_VG_ALPHA_FORMAT:
- return EglBadMatch();
-
- case EGL_DIRECT_COMPOSITION_ANGLE:
- if (!displayExtensions.directComposition)
- {
- return EglBadAttribute();
- }
- break;
-
- case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
- if (!display->getExtensions().robustResourceInitialization)
- {
- return EglBadAttribute() << "Attribute EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE "
- "requires EGL_ANGLE_robust_resource_initialization.";
- }
- if (value != EGL_TRUE && value != EGL_FALSE)
- {
- return EglBadAttribute() << "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE must be "
- "either EGL_TRUE or EGL_FALSE.";
- }
- break;
-
- default:
- return EglBadAttribute();
- }
- }
-
- if (Display::hasExistingWindowSurface(window))
- {
- return EglBadAlloc();
- }
-
- return NoError();
-}
-
-Error ValidateCreatePbufferSurface(Display *display, Config *config, const AttributeMap& attributes)
-{
- ANGLE_TRY(ValidateConfig(display, config));
-
- const DisplayExtensions &displayExtensions = display->getExtensions();
-
- for (AttributeMap::const_iterator attributeIter = attributes.begin(); attributeIter != attributes.end(); attributeIter++)
- {
- EGLAttrib attribute = attributeIter->first;
- EGLAttrib value = attributeIter->second;
-
- switch (attribute)
- {
- case EGL_WIDTH:
- case EGL_HEIGHT:
- if (value < 0)
- {
- return EglBadParameter();
- }
- break;
-
- case EGL_LARGEST_PBUFFER:
- break;
-
- case EGL_TEXTURE_FORMAT:
- switch (value)
- {
- case EGL_NO_TEXTURE:
- case EGL_TEXTURE_RGB:
- case EGL_TEXTURE_RGBA:
- break;
- default:
- return EglBadAttribute();
- }
- break;
-
- case EGL_TEXTURE_TARGET:
- switch (value)
- {
- case EGL_NO_TEXTURE:
- case EGL_TEXTURE_2D:
- break;
- default:
- return EglBadAttribute();
- }
- break;
-
- case EGL_MIPMAP_TEXTURE:
- break;
-
- case EGL_VG_COLORSPACE:
- break;
-
- case EGL_VG_ALPHA_FORMAT:
- break;
-
- case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
- if (!displayExtensions.flexibleSurfaceCompatibility)
- {
- return EglBadAttribute()
- << "EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE cannot be used "
- "without EGL_ANGLE_flexible_surface_compatibility support.";
- }
- break;
-
- case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
- if (!display->getExtensions().robustResourceInitialization)
- {
- return EglBadAttribute() << "Attribute EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE "
- "requires EGL_ANGLE_robust_resource_initialization.";
- }
- if (value != EGL_TRUE && value != EGL_FALSE)
- {
- return EglBadAttribute() << "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE must be "
- "either EGL_TRUE or EGL_FALSE.";
- }
- break;
-
- default:
- return EglBadAttribute();
- }
- }
-
- if (!(config->surfaceType & EGL_PBUFFER_BIT))
- {
- return EglBadMatch();
- }
-
- const Caps &caps = display->getCaps();
-
- EGLAttrib textureFormat = attributes.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE);
- EGLAttrib textureTarget = attributes.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE);
-
- if ((textureFormat != EGL_NO_TEXTURE && textureTarget == EGL_NO_TEXTURE) ||
- (textureFormat == EGL_NO_TEXTURE && textureTarget != EGL_NO_TEXTURE))
- {
- return EglBadMatch();
- }
-
- if ((textureFormat == EGL_TEXTURE_RGB && config->bindToTextureRGB != EGL_TRUE) ||
- (textureFormat == EGL_TEXTURE_RGBA && config->bindToTextureRGBA != EGL_TRUE))
- {
- return EglBadAttribute();
- }
-
- EGLint width = static_cast<EGLint>(attributes.get(EGL_WIDTH, 0));
- EGLint height = static_cast<EGLint>(attributes.get(EGL_HEIGHT, 0));
- if (textureFormat != EGL_NO_TEXTURE && !caps.textureNPOT && (!gl::isPow2(width) || !gl::isPow2(height)))
- {
- return EglBadMatch();
- }
-
- return NoError();
-}
-
-Error ValidateCreatePbufferFromClientBuffer(Display *display, EGLenum buftype, EGLClientBuffer buffer,
- Config *config, const AttributeMap& attributes)
-{
- ANGLE_TRY(ValidateConfig(display, config));
-
- const DisplayExtensions &displayExtensions = display->getExtensions();
-
- switch (buftype)
- {
- case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE:
- if (!displayExtensions.d3dShareHandleClientBuffer)
- {
- return EglBadParameter();
- }
- if (buffer == nullptr)
- {
- return EglBadParameter();
- }
- break;
-
- case EGL_D3D_TEXTURE_ANGLE:
- if (!displayExtensions.d3dTextureClientBuffer)
- {
- return EglBadParameter();
- }
- if (buffer == nullptr)
- {
- return EglBadParameter();
- }
- break;
-
- default:
- return EglBadParameter();
- }
-
- for (AttributeMap::const_iterator attributeIter = attributes.begin(); attributeIter != attributes.end(); attributeIter++)
- {
- EGLAttrib attribute = attributeIter->first;
- EGLAttrib value = attributeIter->second;
-
- switch (attribute)
- {
- case EGL_WIDTH:
- case EGL_HEIGHT:
- if (!displayExtensions.d3dShareHandleClientBuffer)
- {
- return EglBadParameter();
- }
- if (value < 0)
- {
- return EglBadParameter();
- }
- break;
-
- case EGL_TEXTURE_FORMAT:
- switch (value)
- {
- case EGL_NO_TEXTURE:
- case EGL_TEXTURE_RGB:
- case EGL_TEXTURE_RGBA:
- break;
- default:
- return EglBadAttribute();
- }
- break;
-
- case EGL_TEXTURE_TARGET:
- switch (value)
- {
- case EGL_NO_TEXTURE:
- case EGL_TEXTURE_2D:
- break;
- default:
- return EglBadAttribute();
- }
- break;
-
- case EGL_MIPMAP_TEXTURE:
- break;
-
- case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
- if (!displayExtensions.flexibleSurfaceCompatibility)
- {
- return EglBadAttribute()
- << "EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE cannot be used "
- "without EGL_ANGLE_flexible_surface_compatibility support.";
- }
- break;
-
- default:
- return EglBadAttribute();
- }
- }
-
- if (!(config->surfaceType & EGL_PBUFFER_BIT))
- {
- return EglBadMatch();
- }
-
- EGLAttrib textureFormat = attributes.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE);
- EGLAttrib textureTarget = attributes.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE);
- if ((textureFormat != EGL_NO_TEXTURE && textureTarget == EGL_NO_TEXTURE) ||
- (textureFormat == EGL_NO_TEXTURE && textureTarget != EGL_NO_TEXTURE))
- {
- return EglBadMatch();
- }
-
- if ((textureFormat == EGL_TEXTURE_RGB && config->bindToTextureRGB != EGL_TRUE) ||
- (textureFormat == EGL_TEXTURE_RGBA && config->bindToTextureRGBA != EGL_TRUE))
- {
- return EglBadAttribute();
- }
-
- if (buftype == EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE)
- {
- EGLint width = static_cast<EGLint>(attributes.get(EGL_WIDTH, 0));
- EGLint height = static_cast<EGLint>(attributes.get(EGL_HEIGHT, 0));
-
- if (width == 0 || height == 0)
- {
- return EglBadAttribute();
- }
-
- const Caps &caps = display->getCaps();
- if (textureFormat != EGL_NO_TEXTURE && !caps.textureNPOT && (!gl::isPow2(width) || !gl::isPow2(height)))
- {
- return EglBadMatch();
- }
- }
-
- ANGLE_TRY(display->validateClientBuffer(config, buftype, buffer, attributes));
-
- return NoError();
-}
-
-Error ValidateMakeCurrent(Display *display, EGLSurface draw, EGLSurface read, gl::Context *context)
-{
- if (context == EGL_NO_CONTEXT && (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE))
- {
- return EglBadMatch() << "If ctx is EGL_NO_CONTEXT, surfaces must be EGL_NO_SURFACE";
- }
-
- // If ctx is EGL_NO_CONTEXT and either draw or read are not EGL_NO_SURFACE, an EGL_BAD_MATCH
- // error is generated. EGL_KHR_surfaceless_context allows both surfaces to be EGL_NO_SURFACE.
- if (context != EGL_NO_CONTEXT && (draw == EGL_NO_SURFACE || read == EGL_NO_SURFACE))
- {
- if (display->getExtensions().surfacelessContext)
- {
- if ((draw == EGL_NO_SURFACE) != (read == EGL_NO_SURFACE))
- {
- return EglBadMatch() << "If ctx is not EGL_NOT_CONTEXT, draw or read must "
- "both be EGL_NO_SURFACE, or both not";
- }
- }
- else
- {
- return EglBadMatch()
- << "If ctx is not EGL_NO_CONTEXT, surfaces must not be EGL_NO_SURFACE";
- }
- }
-
- // If either of draw or read is a valid surface and the other is EGL_NO_SURFACE, an
- // EGL_BAD_MATCH error is generated.
- if ((read == EGL_NO_SURFACE) != (draw == EGL_NO_SURFACE))
- {
- return EglBadMatch()
- << "read and draw must both be valid surfaces, or both be EGL_NO_SURFACE";
- }
-
- if (display == EGL_NO_DISPLAY || !Display::isValidDisplay(display))
- {
- return EglBadDisplay() << "'dpy' not a valid EGLDisplay handle";
- }
-
- // EGL 1.5 spec: dpy can be uninitialized if all other parameters are null
- if (!display->isInitialized() &&
- (context != EGL_NO_CONTEXT || draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE))
- {
- return EglNotInitialized() << "'dpy' not initialized";
- }
-
- if (context != EGL_NO_CONTEXT)
- {
- ANGLE_TRY(ValidateContext(display, context));
- }
-
- if (display->isInitialized() && display->testDeviceLost())
- {
- return EglContextLost();
- }
-
- Surface *drawSurface = static_cast<Surface *>(draw);
- if (draw != EGL_NO_SURFACE)
- {
- ANGLE_TRY(ValidateSurface(display, drawSurface));
- }
-
- Surface *readSurface = static_cast<Surface *>(read);
- if (read != EGL_NO_SURFACE)
- {
- ANGLE_TRY(ValidateSurface(display, readSurface));
- }
-
- if (readSurface)
- {
- ANGLE_TRY(ValidateCompatibleConfigs(display, readSurface->getConfig(), readSurface,
- context->getConfig(), readSurface->getType()));
- }
-
- if (draw != read)
- {
- UNIMPLEMENTED(); // FIXME
-
- if (drawSurface)
- {
- ANGLE_TRY(ValidateCompatibleConfigs(display, drawSurface->getConfig(), drawSurface,
- context->getConfig(), drawSurface->getType()));
- }
- }
- return NoError();
-}
-
-Error ValidateCompatibleConfigs(const Display *display,
- const Config *config1,
- const Surface *surface,
- const Config *config2,
- EGLint surfaceType)
-{
-
- if (!surface->flexibleSurfaceCompatibilityRequested())
- {
- // Config compatibility is defined in section 2.2 of the EGL 1.5 spec
-
- bool colorBufferCompat = config1->colorBufferType == config2->colorBufferType;
- if (!colorBufferCompat)
- {
- return EglBadMatch() << "Color buffer types are not compatible.";
- }
-
- bool colorCompat =
- config1->redSize == config2->redSize && config1->greenSize == config2->greenSize &&
- config1->blueSize == config2->blueSize && config1->alphaSize == config2->alphaSize &&
- config1->luminanceSize == config2->luminanceSize;
- if (!colorCompat)
- {
- return EglBadMatch() << "Color buffer sizes are not compatible.";
- }
-
- bool componentTypeCompat = config1->colorComponentType == config2->colorComponentType;
- if (!componentTypeCompat)
- {
- return EglBadMatch() << "Color buffer component types are not compatible.";
- }
-
- bool dsCompat = config1->depthSize == config2->depthSize &&
- config1->stencilSize == config2->stencilSize;
- if (!dsCompat)
- {
- return EglBadMatch() << "Depth-stencil buffer types are not compatible.";
- }
- }
-
- bool surfaceTypeCompat = (config1->surfaceType & config2->surfaceType & surfaceType) != 0;
- if (!surfaceTypeCompat)
- {
- return EglBadMatch() << "Surface types are not compatible.";
- }
-
- return NoError();
-}
-
-Error ValidateCreateImageKHR(const Display *display,
- gl::Context *context,
- EGLenum target,
- EGLClientBuffer buffer,
- const AttributeMap &attributes)
-{
- ANGLE_TRY(ValidateContext(display, context));
-
- const DisplayExtensions &displayExtensions = display->getExtensions();
-
- if (!displayExtensions.imageBase && !displayExtensions.image)
- {
- // It is out of spec what happens when calling an extension function when the extension is
- // not available.
- // EGL_BAD_DISPLAY seems like a reasonable error.
- return EglBadDisplay() << "EGL_KHR_image not supported.";
- }
-
- // TODO(geofflang): Complete validation from EGL_KHR_image_base:
- // If the resource specified by <dpy>, <ctx>, <target>, <buffer> and <attrib_list> is itself an
- // EGLImage sibling, the error EGL_BAD_ACCESS is generated.
-
- for (AttributeMap::const_iterator attributeIter = attributes.begin();
- attributeIter != attributes.end(); attributeIter++)
- {
- EGLAttrib attribute = attributeIter->first;
- EGLAttrib value = attributeIter->second;
-
- switch (attribute)
- {
- case EGL_IMAGE_PRESERVED_KHR:
- switch (value)
- {
- case EGL_TRUE:
- case EGL_FALSE:
- break;
-
- default:
- return EglBadParameter()
- << "EGL_IMAGE_PRESERVED_KHR must be EGL_TRUE or EGL_FALSE.";
- }
- break;
-
- case EGL_GL_TEXTURE_LEVEL_KHR:
- if (!displayExtensions.glTexture2DImage &&
- !displayExtensions.glTextureCubemapImage && !displayExtensions.glTexture3DImage)
- {
- return EglBadParameter() << "EGL_GL_TEXTURE_LEVEL_KHR cannot be used "
- "without KHR_gl_texture_*_image support.";
- }
-
- if (value < 0)
- {
- return EglBadParameter() << "EGL_GL_TEXTURE_LEVEL_KHR cannot be negative.";
- }
- break;
-
- case EGL_GL_TEXTURE_ZOFFSET_KHR:
- if (!displayExtensions.glTexture3DImage)
- {
- return EglBadParameter() << "EGL_GL_TEXTURE_ZOFFSET_KHR cannot be used "
- "without KHR_gl_texture_3D_image support.";
- }
- break;
-
- default:
- return EglBadParameter()
- << "invalid attribute: 0x" << std::hex << std::uppercase << attribute;
- }
- }
-
- switch (target)
- {
- case EGL_GL_TEXTURE_2D_KHR:
- {
- if (!displayExtensions.glTexture2DImage)
- {
- return EglBadParameter() << "KHR_gl_texture_2D_image not supported.";
- }
-
- if (buffer == 0)
- {
- return EglBadParameter() << "buffer cannot reference a 2D texture with the name 0.";
- }
-
- const gl::Texture *texture =
- context->getTexture(egl_gl::EGLClientBufferToGLObjectHandle(buffer));
- if (texture == nullptr || texture->getTarget() != GL_TEXTURE_2D)
- {
- return EglBadParameter() << "target is not a 2D texture.";
- }
-
- if (texture->getBoundSurface() != nullptr)
- {
- return EglBadAccess() << "texture has a surface bound to it.";
- }
-
- EGLAttrib level = attributes.get(EGL_GL_TEXTURE_LEVEL_KHR, 0);
- if (texture->getWidth(GL_TEXTURE_2D, static_cast<size_t>(level)) == 0 ||
- texture->getHeight(GL_TEXTURE_2D, static_cast<size_t>(level)) == 0)
- {
- return EglBadParameter()
- << "target 2D texture does not have a valid size at specified level.";
- }
-
- ANGLE_TRY(ValidateCreateImageKHRMipLevelCommon(context, texture, level));
- }
- break;
-
- case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:
- case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:
- case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:
- case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:
- case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:
- case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:
- {
- if (!displayExtensions.glTextureCubemapImage)
- {
- return EglBadParameter() << "KHR_gl_texture_cubemap_image not supported.";
- }
-
- if (buffer == 0)
- {
- return EglBadParameter()
- << "buffer cannot reference a cubemap texture with the name 0.";
- }
-
- const gl::Texture *texture =
- context->getTexture(egl_gl::EGLClientBufferToGLObjectHandle(buffer));
- if (texture == nullptr || texture->getTarget() != GL_TEXTURE_CUBE_MAP)
- {
- return EglBadParameter() << "target is not a cubemap texture.";
- }
-
- if (texture->getBoundSurface() != nullptr)
- {
- return EglBadAccess() << "texture has a surface bound to it.";
- }
-
- EGLAttrib level = attributes.get(EGL_GL_TEXTURE_LEVEL_KHR, 0);
- GLenum cubeMapFace = egl_gl::EGLCubeMapTargetToGLCubeMapTarget(target);
- if (texture->getWidth(cubeMapFace, static_cast<size_t>(level)) == 0 ||
- texture->getHeight(cubeMapFace, static_cast<size_t>(level)) == 0)
- {
- return EglBadParameter() << "target cubemap texture does not have a valid "
- "size at specified level and face.";
- }
-
- ANGLE_TRY(ValidateCreateImageKHRMipLevelCommon(context, texture, level));
-
- if (level == 0 && !texture->isMipmapComplete() &&
- CubeTextureHasUnspecifiedLevel0Face(texture))
- {
- return EglBadParameter() << "if level is zero and the texture is incomplete, "
- "it must have all of its faces specified at level "
- "zero.";
- }
- }
- break;
-
- case EGL_GL_TEXTURE_3D_KHR:
- {
- if (!displayExtensions.glTexture3DImage)
- {
- return EglBadParameter() << "KHR_gl_texture_3D_image not supported.";
- }
-
- if (buffer == 0)
- {
- return EglBadParameter() << "buffer cannot reference a 3D texture with the name 0.";
- }
-
- const gl::Texture *texture =
- context->getTexture(egl_gl::EGLClientBufferToGLObjectHandle(buffer));
- if (texture == nullptr || texture->getTarget() != GL_TEXTURE_3D)
- {
- return EglBadParameter() << "target is not a 3D texture.";
- }
-
- if (texture->getBoundSurface() != nullptr)
- {
- return EglBadAccess() << "texture has a surface bound to it.";
- }
-
- EGLAttrib level = attributes.get(EGL_GL_TEXTURE_LEVEL_KHR, 0);
- EGLAttrib zOffset = attributes.get(EGL_GL_TEXTURE_ZOFFSET_KHR, 0);
- if (texture->getWidth(GL_TEXTURE_3D, static_cast<size_t>(level)) == 0 ||
- texture->getHeight(GL_TEXTURE_3D, static_cast<size_t>(level)) == 0 ||
- texture->getDepth(GL_TEXTURE_3D, static_cast<size_t>(level)) == 0)
- {
- return EglBadParameter()
- << "target 3D texture does not have a valid size at specified level.";
- }
-
- if (static_cast<size_t>(zOffset) >=
- texture->getDepth(GL_TEXTURE_3D, static_cast<size_t>(level)))
- {
- return EglBadParameter() << "target 3D texture does not have enough layers "
- "for the specified Z offset at the specified "
- "level.";
- }
-
- ANGLE_TRY(ValidateCreateImageKHRMipLevelCommon(context, texture, level));
- }
- break;
-
- case EGL_GL_RENDERBUFFER_KHR:
- {
- if (!displayExtensions.glRenderbufferImage)
- {
- return EglBadParameter() << "KHR_gl_renderbuffer_image not supported.";
- }
-
- if (attributes.contains(EGL_GL_TEXTURE_LEVEL_KHR))
- {
- return EglBadParameter() << "EGL_GL_TEXTURE_LEVEL_KHR cannot be used in "
- "conjunction with a renderbuffer target.";
- }
-
- if (buffer == 0)
- {
- return EglBadParameter()
- << "buffer cannot reference a renderbuffer with the name 0.";
- }
-
- const gl::Renderbuffer *renderbuffer =
- context->getRenderbuffer(egl_gl::EGLClientBufferToGLObjectHandle(buffer));
- if (renderbuffer == nullptr)
- {
- return EglBadParameter() << "target is not a renderbuffer.";
- }
-
- if (renderbuffer->getSamples() > 0)
- {
- return EglBadParameter() << "target renderbuffer cannot be multisampled.";
- }
- }
- break;
-
- default:
- return EglBadParameter()
- << "invalid target: 0x" << std::hex << std::uppercase << target;
- }
-
- return NoError();
-}
-
-Error ValidateDestroyImageKHR(const Display *display, const Image *image)
-{
- ANGLE_TRY(ValidateImage(display, image));
-
- if (!display->getExtensions().imageBase && !display->getExtensions().image)
- {
- // It is out of spec what happens when calling an extension function when the extension is
- // not available.
- // EGL_BAD_DISPLAY seems like a reasonable error.
- return EglBadDisplay();
- }
-
- return NoError();
-}
-
-Error ValidateCreateDeviceANGLE(EGLint device_type,
- void *native_device,
- const EGLAttrib *attrib_list)
-{
- const ClientExtensions &clientExtensions = Display::GetClientExtensions();
- if (!clientExtensions.deviceCreation)
- {
- return EglBadAccess() << "Device creation extension not active";
- }
-
- if (attrib_list != nullptr && attrib_list[0] != EGL_NONE)
- {
- return EglBadAttribute() << "Invalid attrib_list parameter";
- }
-
- switch (device_type)
- {
- case EGL_D3D11_DEVICE_ANGLE:
- if (!clientExtensions.deviceCreationD3D11)
- {
- return EglBadAttribute() << "D3D11 device creation extension not active";
- }
- break;
- default:
- return EglBadAttribute() << "Invalid device_type parameter";
- }
-
- return NoError();
-}
-
-Error ValidateReleaseDeviceANGLE(Device *device)
-{
- const ClientExtensions &clientExtensions = Display::GetClientExtensions();
- if (!clientExtensions.deviceCreation)
- {
- return EglBadAccess() << "Device creation extension not active";
- }
-
- if (device == EGL_NO_DEVICE_EXT || !Device::IsValidDevice(device))
- {
- return EglBadDevice() << "Invalid device parameter";
- }
-
- Display *owningDisplay = device->getOwningDisplay();
- if (owningDisplay != nullptr)
- {
- return EglBadDevice() << "Device must have been created using eglCreateDevice";
- }
-
- return NoError();
-}
-
-Error ValidateCreateStreamKHR(const Display *display, const AttributeMap &attributes)
-{
- ANGLE_TRY(ValidateDisplay(display));
-
- const DisplayExtensions &displayExtensions = display->getExtensions();
- if (!displayExtensions.stream)
- {
- return EglBadAlloc() << "Stream extension not active";
- }
-
- for (const auto &attributeIter : attributes)
- {
- EGLAttrib attribute = attributeIter.first;
- EGLAttrib value = attributeIter.second;
-
- ANGLE_TRY(ValidateStreamAttribute(attribute, value, displayExtensions));
- }
-
- return NoError();
-}
-
-Error ValidateDestroyStreamKHR(const Display *display, const Stream *stream)
-{
- ANGLE_TRY(ValidateStream(display, stream));
- return NoError();
-}
-
-Error ValidateStreamAttribKHR(const Display *display,
- const Stream *stream,
- EGLint attribute,
- EGLint value)
-{
- ANGLE_TRY(ValidateStream(display, stream));
-
- if (stream->getState() == EGL_STREAM_STATE_DISCONNECTED_KHR)
- {
- return EglBadState() << "Bad stream state";
- }
-
- return ValidateStreamAttribute(attribute, value, display->getExtensions());
-}
-
-Error ValidateQueryStreamKHR(const Display *display,
- const Stream *stream,
- EGLenum attribute,
- EGLint *value)
-{
- ANGLE_TRY(ValidateStream(display, stream));
-
- switch (attribute)
- {
- case EGL_STREAM_STATE_KHR:
- case EGL_CONSUMER_LATENCY_USEC_KHR:
- break;
- case EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR:
- if (!display->getExtensions().streamConsumerGLTexture)
- {
- return EglBadAttribute() << "Consumer GLTexture extension not active";
- }
- break;
- default:
- return EglBadAttribute() << "Invalid attribute";
- }
-
- return NoError();
-}
-
-Error ValidateQueryStreamu64KHR(const Display *display,
- const Stream *stream,
- EGLenum attribute,
- EGLuint64KHR *value)
-{
- ANGLE_TRY(ValidateStream(display, stream));
-
- switch (attribute)
- {
- case EGL_CONSUMER_FRAME_KHR:
- case EGL_PRODUCER_FRAME_KHR:
- break;
- default:
- return EglBadAttribute() << "Invalid attribute";
- }
-
- return NoError();
-}
-
-Error ValidateStreamConsumerGLTextureExternalKHR(const Display *display,
- gl::Context *context,
- const Stream *stream)
-{
- ANGLE_TRY(ValidateDisplay(display));
- ANGLE_TRY(ValidateContext(display, context));
-
- const DisplayExtensions &displayExtensions = display->getExtensions();
- if (!displayExtensions.streamConsumerGLTexture)
- {
- return EglBadAccess() << "Stream consumer extension not active";
- }
-
- if (!context->getExtensions().eglStreamConsumerExternal)
- {
- return EglBadAccess() << "EGL stream consumer external GL extension not enabled";
- }
-
- if (stream == EGL_NO_STREAM_KHR || !display->isValidStream(stream))
- {
- return EglBadStream() << "Invalid stream";
- }
-
- if (stream->getState() != EGL_STREAM_STATE_CREATED_KHR)
- {
- return EglBadState() << "Invalid stream state";
- }
-
- // Lookup the texture and ensure it is correct
- gl::Texture *texture = context->getGLState().getTargetTexture(GL_TEXTURE_EXTERNAL_OES);
- if (texture == nullptr || texture->getId() == 0)
- {
- return EglBadAccess() << "No external texture bound";
- }
-
- return NoError();
-}
-
-Error ValidateStreamConsumerAcquireKHR(const Display *display,
- gl::Context *context,
- const Stream *stream)
-{
- ANGLE_TRY(ValidateDisplay(display));
-
- const DisplayExtensions &displayExtensions = display->getExtensions();
- if (!displayExtensions.streamConsumerGLTexture)
- {
- return EglBadAccess() << "Stream consumer extension not active";
- }
-
- if (stream == EGL_NO_STREAM_KHR || !display->isValidStream(stream))
- {
- return EglBadStream() << "Invalid stream";
- }
-
- if (!context)
- {
- return EglBadAccess() << "No GL context current to calling thread.";
- }
-
- ANGLE_TRY(ValidateContext(display, context));
-
- if (!stream->isConsumerBoundToContext(context))
- {
- return EglBadAccess() << "Current GL context not associated with stream consumer";
- }
-
- if (stream->getConsumerType() != Stream::ConsumerType::GLTextureRGB &&
- stream->getConsumerType() != Stream::ConsumerType::GLTextureYUV)
- {
- return EglBadAccess() << "Invalid stream consumer type";
- }
-
- // Note: technically EGL_STREAM_STATE_EMPTY_KHR is a valid state when the timeout is non-zero.
- // However, the timeout is effectively ignored since it has no useful functionality with the
- // current producers that are implemented, so we don't allow that state
- if (stream->getState() != EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR &&
- stream->getState() != EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR)
- {
- return EglBadState() << "Invalid stream state";
- }
-
- return NoError();
-}
-
-Error ValidateStreamConsumerReleaseKHR(const Display *display,
- gl::Context *context,
- const Stream *stream)
-{
- ANGLE_TRY(ValidateDisplay(display));
-
- const DisplayExtensions &displayExtensions = display->getExtensions();
- if (!displayExtensions.streamConsumerGLTexture)
- {
- return EglBadAccess() << "Stream consumer extension not active";
- }
-
- if (stream == EGL_NO_STREAM_KHR || !display->isValidStream(stream))
- {
- return EglBadStream() << "Invalid stream";
- }
-
- if (!context)
- {
- return EglBadAccess() << "No GL context current to calling thread.";
- }
-
- ANGLE_TRY(ValidateContext(display, context));
-
- if (!stream->isConsumerBoundToContext(context))
- {
- return EglBadAccess() << "Current GL context not associated with stream consumer";
- }
-
- if (stream->getConsumerType() != Stream::ConsumerType::GLTextureRGB &&
- stream->getConsumerType() != Stream::ConsumerType::GLTextureYUV)
- {
- return EglBadAccess() << "Invalid stream consumer type";
- }
-
- if (stream->getState() != EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR &&
- stream->getState() != EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR)
- {
- return EglBadState() << "Invalid stream state";
- }
-
- return NoError();
-}
-
-Error ValidateStreamConsumerGLTextureExternalAttribsNV(const Display *display,
- gl::Context *context,
- const Stream *stream,
- const AttributeMap &attribs)
-{
- ANGLE_TRY(ValidateDisplay(display));
-
- const DisplayExtensions &displayExtensions = display->getExtensions();
- if (!displayExtensions.streamConsumerGLTexture)
- {
- return EglBadAccess() << "Stream consumer extension not active";
- }
-
- // Although technically not a requirement in spec, the context needs to be checked for support
- // for external textures or future logic will cause assertations. This extension is also
- // effectively useless without external textures.
- if (!context->getExtensions().eglStreamConsumerExternal)
- {
- return EglBadAccess() << "EGL stream consumer external GL extension not enabled";
- }
-
- if (stream == EGL_NO_STREAM_KHR || !display->isValidStream(stream))
- {
- return EglBadStream() << "Invalid stream";
- }
-
- if (!context)
- {
- return EglBadAccess() << "No GL context current to calling thread.";
- }
-
- ANGLE_TRY(ValidateContext(display, context));
-
- if (stream->getState() != EGL_STREAM_STATE_CREATED_KHR)
- {
- return EglBadState() << "Invalid stream state";
- }
-
- const gl::Caps &glCaps = context->getCaps();
-
- EGLAttrib colorBufferType = EGL_RGB_BUFFER;
- EGLAttrib planeCount = -1;
- EGLAttrib plane[3];
- for (int i = 0; i < 3; i++)
- {
- plane[i] = -1;
- }
- for (const auto &attributeIter : attribs)
- {
- EGLAttrib attribute = attributeIter.first;
- EGLAttrib value = attributeIter.second;
-
- switch (attribute)
- {
- case EGL_COLOR_BUFFER_TYPE:
- if (value != EGL_RGB_BUFFER && value != EGL_YUV_BUFFER_EXT)
- {
- return EglBadParameter() << "Invalid color buffer type";
- }
- colorBufferType = value;
- break;
- case EGL_YUV_NUMBER_OF_PLANES_EXT:
- // planeCount = -1 is a tag for the default plane count so the value must be checked
- // to be positive here to ensure future logic doesn't break on invalid negative
- // inputs
- if (value < 0)
- {
- return EglBadMatch() << "Invalid plane count";
- }
- planeCount = value;
- break;
- default:
- if (attribute >= EGL_YUV_PLANE0_TEXTURE_UNIT_NV &&
- attribute <= EGL_YUV_PLANE2_TEXTURE_UNIT_NV)
- {
- if ((value < 0 ||
- value >= static_cast<EGLAttrib>(glCaps.maxCombinedTextureImageUnits)) &&
- value != EGL_NONE)
- {
- return EglBadAccess() << "Invalid texture unit";
- }
- plane[attribute - EGL_YUV_PLANE0_TEXTURE_UNIT_NV] = value;
- }
- else
- {
- return EglBadAttribute() << "Invalid attribute";
- }
- }
- }
-
- if (colorBufferType == EGL_RGB_BUFFER)
- {
- if (planeCount > 0)
- {
- return EglBadMatch() << "Plane count must be 0 for RGB buffer";
- }
- for (int i = 0; i < 3; i++)
- {
- if (plane[i] != -1)
- {
- return EglBadMatch() << "Planes cannot be specified";
- }
- }
-
- // Lookup the texture and ensure it is correct
- gl::Texture *texture = context->getGLState().getTargetTexture(GL_TEXTURE_EXTERNAL_OES);
- if (texture == nullptr || texture->getId() == 0)
- {
- return EglBadAccess() << "No external texture bound";
- }
- }
- else
- {
- if (planeCount == -1)
- {
- planeCount = 2;
- }
- if (planeCount < 1 || planeCount > 3)
- {
- return EglBadMatch() << "Invalid YUV plane count";
- }
- for (EGLAttrib i = planeCount; i < 3; i++)
- {
- if (plane[i] != -1)
- {
- return EglBadMatch() << "Invalid plane specified";
- }
- }
-
- // Set to ensure no texture is referenced more than once
- std::set<gl::Texture *> textureSet;
- for (EGLAttrib i = 0; i < planeCount; i++)
- {
- if (plane[i] == -1)
- {
- return EglBadMatch() << "Not all planes specified";
- }
- if (plane[i] != EGL_NONE)
- {
- gl::Texture *texture = context->getGLState().getSamplerTexture(
- static_cast<unsigned int>(plane[i]), GL_TEXTURE_EXTERNAL_OES);
- if (texture == nullptr || texture->getId() == 0)
- {
- return EglBadAccess()
- << "No external texture bound at one or more specified texture units";
- }
- if (textureSet.find(texture) != textureSet.end())
- {
- return EglBadAccess() << "Multiple planes bound to same texture object";
- }
- textureSet.insert(texture);
- }
- }
- }
-
- return NoError();
-}
-
-Error ValidateCreateStreamProducerD3DTextureNV12ANGLE(const Display *display,
- const Stream *stream,
- const AttributeMap &attribs)
-{
- ANGLE_TRY(ValidateDisplay(display));
-
- const DisplayExtensions &displayExtensions = display->getExtensions();
- if (!displayExtensions.streamProducerD3DTextureNV12)
- {
- return EglBadAccess() << "Stream producer extension not active";
- }
-
- ANGLE_TRY(ValidateStream(display, stream));
-
- if (!attribs.isEmpty())
- {
- return EglBadAttribute() << "Invalid attribute";
- }
-
- if (stream->getState() != EGL_STREAM_STATE_CONNECTING_KHR)
- {
- return EglBadState() << "Stream not in connecting state";
- }
-
- if (stream->getConsumerType() != Stream::ConsumerType::GLTextureYUV ||
- stream->getPlaneCount() != 2)
- {
- return EglBadMatch() << "Incompatible stream consumer type";
- }
-
- return NoError();
-}
-
-Error ValidateStreamPostD3DTextureNV12ANGLE(const Display *display,
- const Stream *stream,
- void *texture,
- const AttributeMap &attribs)
-{
- ANGLE_TRY(ValidateDisplay(display));
-
- const DisplayExtensions &displayExtensions = display->getExtensions();
- if (!displayExtensions.streamProducerD3DTextureNV12)
- {
- return EglBadAccess() << "Stream producer extension not active";
- }
-
- ANGLE_TRY(ValidateStream(display, stream));
-
- for (auto &attributeIter : attribs)
- {
- EGLAttrib attribute = attributeIter.first;
- EGLAttrib value = attributeIter.second;
-
- switch (attribute)
- {
- case EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE:
- if (value < 0)
- {
- return EglBadParameter() << "Invalid subresource index";
- }
- break;
- default:
- return EglBadAttribute() << "Invalid attribute";
- }
- }
-
- if (stream->getState() != EGL_STREAM_STATE_EMPTY_KHR &&
- stream->getState() != EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR &&
- stream->getState() != EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR)
- {
- return EglBadState() << "Stream not fully configured";
- }
-
- if (stream->getProducerType() != Stream::ProducerType::D3D11TextureNV12)
- {
- return EglBadMatch() << "Incompatible stream producer";
- }
-
- if (texture == nullptr)
- {
- return EglBadParameter() << "Texture is null";
- }
-
- return stream->validateD3D11NV12Texture(texture);
-}
-
-Error ValidateGetSyncValuesCHROMIUM(const Display *display,
- const Surface *surface,
- const EGLuint64KHR *ust,
- const EGLuint64KHR *msc,
- const EGLuint64KHR *sbc)
-{
- ANGLE_TRY(ValidateDisplay(display));
-
- const DisplayExtensions &displayExtensions = display->getExtensions();
- if (!displayExtensions.getSyncValues)
- {
- return EglBadAccess() << "getSyncValues extension not active";
- }
-
- if (display->isDeviceLost())
- {
- return EglContextLost() << "Context is lost.";
- }
-
- if (surface == EGL_NO_SURFACE)
- {
- return EglBadSurface() << "getSyncValues surface cannot be EGL_NO_SURFACE";
- }
-
- if (!surface->directComposition())
- {
- return EglBadSurface() << "getSyncValues surface requires Direct Composition to be enabled";
- }
-
- if (ust == nullptr)
- {
- return EglBadParameter() << "ust is null";
- }
-
- if (msc == nullptr)
- {
- return EglBadParameter() << "msc is null";
- }
-
- if (sbc == nullptr)
- {
- return EglBadParameter() << "sbc is null";
- }
-
- return NoError();
-}
-
-Error ValidateSwapBuffersWithDamageEXT(const Display *display,
- const Surface *surface,
- EGLint *rects,
- EGLint n_rects)
-{
- Error error = ValidateSurface(display, surface);
- if (error.isError())
- {
- return error;
- }
-
- if (!display->getExtensions().swapBuffersWithDamage)
- {
- // It is out of spec what happens when calling an extension function when the extension is
- // not available. EGL_BAD_DISPLAY seems like a reasonable error.
- return EglBadDisplay() << "EGL_EXT_swap_buffers_with_damage is not available.";
- }
-
- if (surface == EGL_NO_SURFACE)
- {
- return EglBadSurface() << "Swap surface cannot be EGL_NO_SURFACE.";
- }
-
- if (n_rects < 0)
- {
- return EglBadParameter() << "n_rects cannot be negative.";
- }
-
- if (n_rects > 0 && rects == nullptr)
- {
- return EglBadParameter() << "n_rects cannot be greater than zero when rects is NULL.";
- }
-
- // TODO(jmadill): Validate Surface is bound to the thread.
-
- return NoError();
-}
-
-Error ValidateGetConfigAttrib(const Display *display, const Config *config, EGLint attribute)
-{
- ANGLE_TRY(ValidateConfig(display, config));
- ANGLE_TRY(ValidateConfigAttribute(display, static_cast<EGLAttrib>(attribute)));
- return NoError();
-}
-
-Error ValidateChooseConfig(const Display *display,
- const AttributeMap &attribs,
- EGLint configSize,
- EGLint *numConfig)
-{
- ANGLE_TRY(ValidateDisplay(display));
- ANGLE_TRY(ValidateConfigAttributes(display, attribs));
-
- if (numConfig == nullptr)
- {
- return EglBadParameter() << "num_config cannot be null.";
- }
-
- return NoError();
-}
-
-Error ValidateGetConfigs(const Display *display, EGLint configSize, EGLint *numConfig)
-{
- ANGLE_TRY(ValidateDisplay(display));
-
- if (numConfig == nullptr)
- {
- return EglBadParameter() << "num_config cannot be null.";
- }
-
- return NoError();
-}
-
-Error ValidateGetPlatformDisplay(EGLenum platform,
- void *native_display,
- const EGLAttrib *attrib_list)
-{
- const auto &attribMap = AttributeMap::CreateFromAttribArray(attrib_list);
- return ValidateGetPlatformDisplayCommon(platform, native_display, attribMap);
-}
-
-Error ValidateGetPlatformDisplayEXT(EGLenum platform,
- void *native_display,
- const EGLint *attrib_list)
-{
- const auto &attribMap = AttributeMap::CreateFromIntArray(attrib_list);
- return ValidateGetPlatformDisplayCommon(platform, native_display, attribMap);
-}
-
-Error ValidateProgramCacheGetAttribANGLE(const Display *display, EGLenum attrib)
-{
- ANGLE_TRY(ValidateDisplay(display));
-
- if (!display->getExtensions().programCacheControl)
- {
- return EglBadAccess() << "Extension not supported";
- }
-
- switch (attrib)
- {
- case EGL_PROGRAM_CACHE_KEY_LENGTH_ANGLE:
- case EGL_PROGRAM_CACHE_SIZE_ANGLE:
- break;
-
- default:
- return EglBadParameter() << "Invalid program cache attribute.";
- }
-
- return NoError();
-}
-
-Error ValidateProgramCacheQueryANGLE(const Display *display,
- EGLint index,
- void *key,
- EGLint *keysize,
- void *binary,
- EGLint *binarysize)
-{
- ANGLE_TRY(ValidateDisplay(display));
-
- if (!display->getExtensions().programCacheControl)
- {
- return EglBadAccess() << "Extension not supported";
- }
-
- if (index < 0 || index >= display->programCacheGetAttrib(EGL_PROGRAM_CACHE_SIZE_ANGLE))
- {
- return EglBadParameter() << "Program index out of range.";
- }
-
- if (keysize == nullptr || binarysize == nullptr)
- {
- return EglBadParameter() << "keysize and binarysize must always be valid pointers.";
- }
-
- if (binary && *keysize != static_cast<EGLint>(gl::kProgramHashLength))
- {
- return EglBadParameter() << "Invalid program key size.";
- }
-
- if ((key == nullptr) != (binary == nullptr))
- {
- return EglBadParameter() << "key and binary must both be null or both non-null.";
- }
-
- return NoError();
-}
-
-Error ValidateProgramCachePopulateANGLE(const Display *display,
- const void *key,
- EGLint keysize,
- const void *binary,
- EGLint binarysize)
-{
- ANGLE_TRY(ValidateDisplay(display));
-
- if (!display->getExtensions().programCacheControl)
- {
- return EglBadAccess() << "Extension not supported";
- }
-
- if (keysize != static_cast<EGLint>(gl::kProgramHashLength))
- {
- return EglBadParameter() << "Invalid program key size.";
- }
-
- if (key == nullptr || binary == nullptr)
- {
- return EglBadParameter() << "null pointer in arguments.";
- }
-
- // Upper bound for binarysize is arbitrary.
- if (binarysize <= 0 || binarysize > egl::kProgramCacheSizeAbsoluteMax)
- {
- return EglBadParameter() << "binarysize out of valid range.";
- }
-
- return NoError();
-}
-
-Error ValidateProgramCacheResizeANGLE(const Display *display, EGLint limit, EGLenum mode)
-{
- ANGLE_TRY(ValidateDisplay(display));
-
- if (!display->getExtensions().programCacheControl)
- {
- return EglBadAccess() << "Extension not supported";
- }
-
- if (limit < 0)
- {
- return EglBadParameter() << "limit must be non-negative.";
- }
-
- switch (mode)
- {
- case EGL_PROGRAM_CACHE_RESIZE_ANGLE:
- case EGL_PROGRAM_CACHE_TRIM_ANGLE:
- break;
-
- default:
- return EglBadParameter() << "Invalid cache resize mode.";
- }
-
- return NoError();
-}
-
-Error ValidateSurfaceAttrib(const Display *display,
- const Surface *surface,
- EGLint attribute,
- EGLint value)
-{
- ANGLE_TRY(ValidateDisplay(display));
- ANGLE_TRY(ValidateSurface(display, surface));
-
- if (surface == EGL_NO_SURFACE)
- {
- return EglBadSurface() << "Surface cannot be EGL_NO_SURFACE.";
- }
-
- switch (attribute)
- {
- case EGL_MIPMAP_LEVEL:
- break;
-
- case EGL_MULTISAMPLE_RESOLVE:
- switch (value)
- {
- case EGL_MULTISAMPLE_RESOLVE_DEFAULT:
- break;
-
- case EGL_MULTISAMPLE_RESOLVE_BOX:
- if ((surface->getConfig()->surfaceType & EGL_MULTISAMPLE_RESOLVE_BOX_BIT) == 0)
- {
- return EglBadMatch()
- << "Surface does not support EGL_MULTISAMPLE_RESOLVE_BOX.";
- }
- break;
-
- default:
- return EglBadAttribute() << "Invalid multisample resolve type.";
- }
-
- case EGL_SWAP_BEHAVIOR:
- switch (value)
- {
- case EGL_BUFFER_PRESERVED:
- if ((surface->getConfig()->surfaceType & EGL_SWAP_BEHAVIOR_PRESERVED_BIT) == 0)
- {
- return EglBadMatch()
- << "Surface does not support EGL_SWAP_BEHAVIOR_PRESERVED.";
- }
- break;
-
- case EGL_BUFFER_DESTROYED:
- break;
-
- default:
- return EglBadAttribute() << "Invalid swap behaviour.";
- }
-
- default:
- return EglBadAttribute() << "Invalid surface attribute.";
- }
-
- return NoError();
-}
-
-Error ValidateQuerySurface(const Display *display,
- const Surface *surface,
- EGLint attribute,
- EGLint *value)
-{
- ANGLE_TRY(ValidateDisplay(display));
- ANGLE_TRY(ValidateSurface(display, surface));
-
- if (surface == EGL_NO_SURFACE)
- {
- return EglBadSurface() << "Surface cannot be EGL_NO_SURFACE.";
- }
-
- switch (attribute)
- {
- case EGL_GL_COLORSPACE:
- case EGL_VG_ALPHA_FORMAT:
- case EGL_VG_COLORSPACE:
- case EGL_CONFIG_ID:
- case EGL_HEIGHT:
- case EGL_HORIZONTAL_RESOLUTION:
- case EGL_LARGEST_PBUFFER:
- case EGL_MIPMAP_TEXTURE:
- case EGL_MIPMAP_LEVEL:
- case EGL_MULTISAMPLE_RESOLVE:
- case EGL_PIXEL_ASPECT_RATIO:
- case EGL_RENDER_BUFFER:
- case EGL_SWAP_BEHAVIOR:
- case EGL_TEXTURE_FORMAT:
- case EGL_TEXTURE_TARGET:
- case EGL_VERTICAL_RESOLUTION:
- case EGL_WIDTH:
- break;
-
- case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
- if (!display->getExtensions().postSubBuffer)
- {
- return EglBadAttribute() << "EGL_POST_SUB_BUFFER_SUPPORTED_NV cannot be used "
- "without EGL_ANGLE_surface_orientation support.";
- }
- break;
-
- case EGL_FIXED_SIZE_ANGLE:
- if (!display->getExtensions().windowFixedSize)
- {
- return EglBadAttribute() << "EGL_FIXED_SIZE_ANGLE cannot be used without "
- "EGL_ANGLE_window_fixed_size support.";
- }
- break;
-
- case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
- if (!display->getExtensions().flexibleSurfaceCompatibility)
- {
- return EglBadAttribute()
- << "EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE cannot be "
- "used without EGL_ANGLE_flexible_surface_compatibility support.";
- }
- break;
-
- case EGL_SURFACE_ORIENTATION_ANGLE:
- if (!display->getExtensions().surfaceOrientation)
- {
- return EglBadAttribute() << "EGL_SURFACE_ORIENTATION_ANGLE cannot be "
- "queried without "
- "EGL_ANGLE_surface_orientation support.";
- }
- break;
-
- case EGL_DIRECT_COMPOSITION_ANGLE:
- if (!display->getExtensions().directComposition)
- {
- return EglBadAttribute() << "EGL_DIRECT_COMPOSITION_ANGLE cannot be "
- "used without "
- "EGL_ANGLE_direct_composition support.";
- }
- break;
-
- case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
- if (!display->getExtensions().robustResourceInitialization)
- {
- return EglBadAttribute() << "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE cannot be "
- "used without EGL_ANGLE_robust_resource_initialization "
- "support.";
- }
- break;
-
- default:
- return EglBadAttribute() << "Invalid surface attribute.";
- }
-
- return NoError();
-}
-
-Error ValidateQueryContext(const Display *display,
- const gl::Context *context,
- EGLint attribute,
- EGLint *value)
-{
- ANGLE_TRY(ValidateDisplay(display));
- ANGLE_TRY(ValidateContext(display, context));
-
- switch (attribute)
- {
- case EGL_CONFIG_ID:
- case EGL_CONTEXT_CLIENT_TYPE:
- case EGL_CONTEXT_CLIENT_VERSION:
- case EGL_RENDER_BUFFER:
- break;
-
- case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
- if (!display->getExtensions().robustResourceInitialization)
- {
- return EglBadAttribute() << "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE cannot be "
- "used without EGL_ANGLE_robust_resource_initialization "
- "support.";
- }
- break;
-
- default:
- return EglBadAttribute() << "Invalid context attribute.";
- }
-
- return NoError();
-}
-
-} // namespace egl
diff --git a/src/3rdparty/angle/src/libANGLE/validationEGL.h b/src/3rdparty/angle/src/libANGLE/validationEGL.h
deleted file mode 100644
index 3ab8232c7f..0000000000
--- a/src/3rdparty/angle/src/libANGLE/validationEGL.h
+++ /dev/null
@@ -1,182 +0,0 @@
-//
-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationEGL.h: Validation functions for generic EGL entry point parameters
-
-#ifndef LIBANGLE_VALIDATIONEGL_H_
-#define LIBANGLE_VALIDATIONEGL_H_
-
-#include "libANGLE/Error.h"
-
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-
-namespace gl
-{
-class Context;
-}
-
-namespace egl
-{
-
-class AttributeMap;
-struct ClientExtensions;
-struct Config;
-class Device;
-class Display;
-class Image;
-class Stream;
-class Surface;
-
-// Object validation
-Error ValidateDisplay(const Display *display);
-Error ValidateSurface(const Display *display, const Surface *surface);
-Error ValidateConfig(const Display *display, const Config *config);
-Error ValidateContext(const Display *display, const gl::Context *context);
-Error ValidateImage(const Display *display, const Image *image);
-
-// Entry point validation
-Error ValidateCreateContext(Display *display, Config *configuration, gl::Context *shareContext,
- const AttributeMap& attributes);
-
-Error ValidateCreateWindowSurface(Display *display, Config *config, EGLNativeWindowType window,
- const AttributeMap& attributes);
-
-Error ValidateCreatePbufferSurface(Display *display, Config *config, const AttributeMap& attributes);
-Error ValidateCreatePbufferFromClientBuffer(Display *display, EGLenum buftype, EGLClientBuffer buffer,
- Config *config, const AttributeMap& attributes);
-
-Error ValidateMakeCurrent(Display *display, EGLSurface draw, EGLSurface read, gl::Context *context);
-
-Error ValidateCreateImageKHR(const Display *display,
- gl::Context *context,
- EGLenum target,
- EGLClientBuffer buffer,
- const AttributeMap &attributes);
-Error ValidateDestroyImageKHR(const Display *display, const Image *image);
-
-Error ValidateCreateDeviceANGLE(EGLint device_type,
- void *native_device,
- const EGLAttrib *attrib_list);
-Error ValidateReleaseDeviceANGLE(Device *device);
-
-Error ValidateCreateStreamKHR(const Display *display, const AttributeMap &attributes);
-Error ValidateDestroyStreamKHR(const Display *display, const Stream *stream);
-Error ValidateStreamAttribKHR(const Display *display,
- const Stream *stream,
- EGLint attribute,
- EGLint value);
-Error ValidateQueryStreamKHR(const Display *display,
- const Stream *stream,
- EGLenum attribute,
- EGLint *value);
-Error ValidateQueryStreamu64KHR(const Display *display,
- const Stream *stream,
- EGLenum attribute,
- EGLuint64KHR *value);
-Error ValidateStreamConsumerGLTextureExternalKHR(const Display *display,
- gl::Context *context,
- const Stream *stream);
-Error ValidateStreamConsumerAcquireKHR(const Display *display,
- gl::Context *context,
- const Stream *stream);
-Error ValidateStreamConsumerReleaseKHR(const Display *display,
- gl::Context *context,
- const Stream *stream);
-Error ValidateStreamConsumerGLTextureExternalAttribsNV(const Display *display,
- gl::Context *context,
- const Stream *stream,
- const AttributeMap &attribs);
-Error ValidateCreateStreamProducerD3DTextureNV12ANGLE(const Display *display,
- const Stream *stream,
- const AttributeMap &attribs);
-Error ValidateStreamPostD3DTextureNV12ANGLE(const Display *display,
- const Stream *stream,
- void *texture,
- const AttributeMap &attribs);
-
-Error ValidateGetSyncValuesCHROMIUM(const Display *display,
- const Surface *surface,
- const EGLuint64KHR *ust,
- const EGLuint64KHR *msc,
- const EGLuint64KHR *sbc);
-
-Error ValidateSwapBuffersWithDamageEXT(const Display *display,
- const Surface *surface,
- EGLint *rects,
- EGLint n_rects);
-
-Error ValidateGetConfigAttrib(const Display *display, const Config *config, EGLint attribute);
-Error ValidateChooseConfig(const Display *display,
- const AttributeMap &attribs,
- EGLint configSize,
- EGLint *numConfig);
-Error ValidateGetConfigs(const Display *display, EGLint configSize, EGLint *numConfig);
-
-// Other validation
-Error ValidateCompatibleConfigs(const Display *display,
- const Config *config1,
- const Surface *surface,
- const Config *config2,
- EGLint surfaceType);
-
-Error ValidateGetPlatformDisplay(EGLenum platform,
- void *native_display,
- const EGLAttrib *attrib_list);
-Error ValidateGetPlatformDisplayEXT(EGLenum platform,
- void *native_display,
- const EGLint *attrib_list);
-
-Error ValidateProgramCacheGetAttribANGLE(const Display *display, EGLenum attrib);
-
-Error ValidateProgramCacheQueryANGLE(const Display *display,
- EGLint index,
- void *key,
- EGLint *keysize,
- void *binary,
- EGLint *binarysize);
-
-Error ValidateProgramCachePopulateANGLE(const Display *display,
- const void *key,
- EGLint keysize,
- const void *binary,
- EGLint binarysize);
-
-Error ValidateProgramCacheResizeANGLE(const Display *display, EGLint limit, EGLenum mode);
-
-Error ValidateSurfaceAttrib(const Display *display,
- const Surface *surface,
- EGLint attribute,
- EGLint value);
-Error ValidateQuerySurface(const Display *display,
- const Surface *surface,
- EGLint attribute,
- EGLint *value);
-Error ValidateQueryContext(const Display *display,
- const gl::Context *context,
- EGLint attribute,
- EGLint *value);
-
-} // namespace egl
-
-#define ANGLE_EGL_TRY(THREAD, EXPR) \
- { \
- auto ANGLE_LOCAL_VAR = (EXPR); \
- if (ANGLE_LOCAL_VAR.isError()) \
- return THREAD->setError(ANGLE_LOCAL_VAR); \
- }
-
-#define ANGLE_EGL_TRY_RETURN(THREAD, EXPR, RETVAL) \
- { \
- auto ANGLE_LOCAL_VAR = (EXPR); \
- if (ANGLE_LOCAL_VAR.isError()) \
- { \
- THREAD->setError(ANGLE_LOCAL_VAR); \
- return RETVAL; \
- } \
- }
-
-#endif // LIBANGLE_VALIDATIONEGL_H_
diff --git a/src/3rdparty/angle/src/libANGLE/validationES.cpp b/src/3rdparty/angle/src/libANGLE/validationES.cpp
deleted file mode 100644
index 069ca045f8..0000000000
--- a/src/3rdparty/angle/src/libANGLE/validationES.cpp
+++ /dev/null
@@ -1,5828 +0,0 @@
-//
-// Copyright (c) 2013-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationES.h: Validation functions for generic OpenGL ES entry point parameters
-
-#include "libANGLE/validationES.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/Display.h"
-#include "libANGLE/ErrorStrings.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/Image.h"
-#include "libANGLE/Program.h"
-#include "libANGLE/Query.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/TransformFeedback.h"
-#include "libANGLE/VertexArray.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/queryconversions.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-
-#include "common/mathutil.h"
-#include "common/utilities.h"
-
-using namespace angle;
-
-namespace gl
-{
-namespace
-{
-
-bool ValidateDrawAttribs(ValidationContext *context,
- GLint primcount,
- GLint maxVertex,
- GLint vertexCount)
-{
- const gl::State &state = context->getGLState();
- const gl::Program *program = state.getProgram();
-
- bool webglCompatibility = context->getExtensions().webglCompatibility;
-
- const VertexArray *vao = state.getVertexArray();
- const auto &vertexAttribs = vao->getVertexAttributes();
- const auto &vertexBindings = vao->getVertexBindings();
- size_t maxEnabledAttrib = vao->getMaxEnabledAttribute();
- for (size_t attributeIndex = 0; attributeIndex < maxEnabledAttrib; ++attributeIndex)
- {
- const VertexAttribute &attrib = vertexAttribs[attributeIndex];
-
- // No need to range check for disabled attribs.
- if (!attrib.enabled)
- {
- continue;
- }
-
- // If we have no buffer, then we either get an error, or there are no more checks to be
- // done.
- const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
- gl::Buffer *buffer = binding.getBuffer().get();
- if (!buffer)
- {
- if (webglCompatibility || !state.areClientArraysEnabled())
- {
- // [WebGL 1.0] Section 6.5 Enabled Vertex Attributes and Range Checking
- // If a vertex attribute is enabled as an array via enableVertexAttribArray but
- // no buffer is bound to that attribute via bindBuffer and vertexAttribPointer,
- // then calls to drawArrays or drawElements will generate an INVALID_OPERATION
- // error.
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), VertexArrayNoBuffer);
- return false;
- }
- else if (attrib.pointer == nullptr)
- {
- // This is an application error that would normally result in a crash,
- // but we catch it and return an error
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), VertexArrayNoBufferPointer);
- return false;
- }
- continue;
- }
-
- // This needs to come after the check for client arrays as even unused attributes cannot use
- // client-side arrays
- if (!program->isAttribLocationActive(attributeIndex))
- {
- continue;
- }
-
- // If we're drawing zero vertices, we have enough data.
- if (vertexCount <= 0 || primcount <= 0)
- {
- continue;
- }
-
- GLint maxVertexElement = 0;
- GLuint divisor = binding.getDivisor();
- if (divisor == 0)
- {
- maxVertexElement = maxVertex;
- }
- else
- {
- maxVertexElement = (primcount - 1) / divisor;
- }
-
- // We do manual overflow checks here instead of using safe_math.h because it was
- // a bottleneck. Thanks to some properties of GL we know inequalities that can
- // help us make the overflow checks faster.
-
- // The max possible attribSize is 16 for a vector of 4 32 bit values.
- constexpr uint64_t kMaxAttribSize = 16;
- constexpr uint64_t kIntMax = std::numeric_limits<int>::max();
- constexpr uint64_t kUint64Max = std::numeric_limits<uint64_t>::max();
-
- // We know attribStride is given as a GLsizei which is typedefed to int.
- // We also know an upper bound for attribSize.
- static_assert(std::is_same<int, GLsizei>::value, "");
- uint64_t attribStride = ComputeVertexAttributeStride(attrib, binding);
- uint64_t attribSize = ComputeVertexAttributeTypeSize(attrib);
- ASSERT(attribStride <= kIntMax && attribSize <= kMaxAttribSize);
-
- // Computing the max offset using uint64_t without attrib.offset is overflow
- // safe. Note: Last vertex element does not take the full stride!
- static_assert(kIntMax * kIntMax < kUint64Max - kMaxAttribSize, "");
- uint64_t attribDataSizeNoOffset = maxVertexElement * attribStride + attribSize;
-
- // An overflow can happen when adding the offset, check for it.
- uint64_t attribOffset = ComputeVertexAttributeOffset(attrib, binding);
- if (attribDataSizeNoOffset > kUint64Max - attribOffset)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), IntegerOverflow);
- return false;
- }
- uint64_t attribDataSizeWithOffset = attribDataSizeNoOffset + attribOffset;
-
- // [OpenGL ES 3.0.2] section 2.9.4 page 40:
- // We can return INVALID_OPERATION if our vertex attribute does not have
- // enough backing data.
- if (attribDataSizeWithOffset > static_cast<uint64_t>(buffer->getSize()))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InsufficientVertexBufferSize);
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidReadPixelsTypeEnum(ValidationContext *context, GLenum type)
-{
- switch (type)
- {
- // Types referenced in Table 3.4 of the ES 2.0.25 spec
- case GL_UNSIGNED_BYTE:
- case GL_UNSIGNED_SHORT_4_4_4_4:
- case GL_UNSIGNED_SHORT_5_5_5_1:
- case GL_UNSIGNED_SHORT_5_6_5:
- return context->getClientVersion() >= ES_2_0;
-
- // Types referenced in Table 3.2 of the ES 3.0.5 spec (Except depth stencil)
- case GL_BYTE:
- case GL_INT:
- case GL_SHORT:
- case GL_UNSIGNED_INT:
- case GL_UNSIGNED_INT_10F_11F_11F_REV:
- case GL_UNSIGNED_INT_24_8:
- case GL_UNSIGNED_INT_2_10_10_10_REV:
- case GL_UNSIGNED_INT_5_9_9_9_REV:
- case GL_UNSIGNED_SHORT:
- case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
- case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
- return context->getClientVersion() >= ES_3_0;
-
- case GL_FLOAT:
- return context->getClientVersion() >= ES_3_0 || context->getExtensions().textureFloat ||
- context->getExtensions().colorBufferHalfFloat;
-
- case GL_HALF_FLOAT:
- return context->getClientVersion() >= ES_3_0 ||
- context->getExtensions().textureHalfFloat;
-
- case GL_HALF_FLOAT_OES:
- return context->getExtensions().colorBufferHalfFloat;
-
- default:
- return false;
- }
-}
-
-bool ValidReadPixelsFormatEnum(ValidationContext *context, GLenum format)
-{
- switch (format)
- {
- // Formats referenced in Table 3.4 of the ES 2.0.25 spec (Except luminance)
- case GL_RGBA:
- case GL_RGB:
- case GL_ALPHA:
- return context->getClientVersion() >= ES_2_0;
-
- // Formats referenced in Table 3.2 of the ES 3.0.5 spec
- case GL_RG:
- case GL_RED:
- case GL_RGBA_INTEGER:
- case GL_RGB_INTEGER:
- case GL_RG_INTEGER:
- case GL_RED_INTEGER:
- return context->getClientVersion() >= ES_3_0;
-
- case GL_SRGB_ALPHA_EXT:
- case GL_SRGB_EXT:
- return context->getExtensions().sRGB;
-
- case GL_BGRA_EXT:
- return context->getExtensions().readFormatBGRA;
-
- default:
- return false;
- }
-}
-
-bool ValidReadPixelsFormatType(ValidationContext *context,
- GLenum framebufferComponentType,
- GLenum format,
- GLenum type)
-{
- switch (framebufferComponentType)
- {
- case GL_UNSIGNED_NORMALIZED:
- // TODO(geofflang): Don't accept BGRA here. Some chrome internals appear to try to use
- // ReadPixels with BGRA even if the extension is not present
- return (format == GL_RGBA && type == GL_UNSIGNED_BYTE) ||
- (context->getExtensions().readFormatBGRA && format == GL_BGRA_EXT &&
- type == GL_UNSIGNED_BYTE);
-
- case GL_SIGNED_NORMALIZED:
- return (format == GL_RGBA && type == GL_UNSIGNED_BYTE);
-
- case GL_INT:
- return (format == GL_RGBA_INTEGER && type == GL_INT);
-
- case GL_UNSIGNED_INT:
- return (format == GL_RGBA_INTEGER && type == GL_UNSIGNED_INT);
-
- case GL_FLOAT:
- return (format == GL_RGBA && type == GL_FLOAT);
-
- default:
- UNREACHABLE();
- return false;
- }
-}
-
-template <typename ParamType>
-bool ValidateTextureWrapModeValue(Context *context, ParamType *params, bool restrictedWrapModes)
-{
- switch (ConvertToGLenum(params[0]))
- {
- case GL_CLAMP_TO_EDGE:
- break;
-
- case GL_REPEAT:
- case GL_MIRRORED_REPEAT:
- if (restrictedWrapModes)
- {
- // OES_EGL_image_external and ANGLE_texture_rectangle specifies this error.
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidWrapModeTexture);
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTextureWrap);
- return false;
- }
-
- return true;
-}
-
-template <typename ParamType>
-bool ValidateTextureMinFilterValue(Context *context, ParamType *params, bool restrictedMinFilter)
-{
- switch (ConvertToGLenum(params[0]))
- {
- case GL_NEAREST:
- case GL_LINEAR:
- break;
-
- case GL_NEAREST_MIPMAP_NEAREST:
- case GL_LINEAR_MIPMAP_NEAREST:
- case GL_NEAREST_MIPMAP_LINEAR:
- case GL_LINEAR_MIPMAP_LINEAR:
- if (restrictedMinFilter)
- {
- // OES_EGL_image_external specifies this error.
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFilterTexture);
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTextureFilterParam);
- return false;
- }
-
- return true;
-}
-
-template <typename ParamType>
-bool ValidateTextureMagFilterValue(Context *context, ParamType *params)
-{
- switch (ConvertToGLenum(params[0]))
- {
- case GL_NEAREST:
- case GL_LINEAR:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTextureFilterParam);
- return false;
- }
-
- return true;
-}
-
-template <typename ParamType>
-bool ValidateTextureCompareModeValue(Context *context, ParamType *params)
-{
- // Acceptable mode parameters from GLES 3.0.2 spec, table 3.17
- switch (ConvertToGLenum(params[0]))
- {
- case GL_NONE:
- case GL_COMPARE_REF_TO_TEXTURE:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), UnknownParameter);
- return false;
- }
-
- return true;
-}
-
-template <typename ParamType>
-bool ValidateTextureCompareFuncValue(Context *context, ParamType *params)
-{
- // Acceptable function parameters from GLES 3.0.2 spec, table 3.17
- switch (ConvertToGLenum(params[0]))
- {
- case GL_LEQUAL:
- case GL_GEQUAL:
- case GL_LESS:
- case GL_GREATER:
- case GL_EQUAL:
- case GL_NOTEQUAL:
- case GL_ALWAYS:
- case GL_NEVER:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), UnknownParameter);
- return false;
- }
-
- return true;
-}
-
-template <typename ParamType>
-bool ValidateTextureSRGBDecodeValue(Context *context, ParamType *params)
-{
- if (!context->getExtensions().textureSRGBDecode)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), ExtensionNotEnabled);
- return false;
- }
-
- switch (ConvertToGLenum(params[0]))
- {
- case GL_DECODE_EXT:
- case GL_SKIP_DECODE_EXT:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), UnknownParameter);
- return false;
- }
-
- return true;
-}
-
-bool ValidateFragmentShaderColorBufferTypeMatch(ValidationContext *context)
-{
- const Program *program = context->getGLState().getProgram();
- const Framebuffer *framebuffer = context->getGLState().getDrawFramebuffer();
-
- const auto &programOutputTypes = program->getOutputVariableTypes();
- for (size_t drawBufferIdx = 0; drawBufferIdx < programOutputTypes.size(); drawBufferIdx++)
- {
- GLenum outputType = programOutputTypes[drawBufferIdx];
- GLenum inputType = framebuffer->getDrawbufferWriteType(drawBufferIdx);
- if (outputType != GL_NONE && inputType != GL_NONE && inputType != outputType)
- {
- context->handleError(InvalidOperation() << "Fragment shader output type does not "
- "match the bound framebuffer attachment "
- "type.");
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateVertexShaderAttributeTypeMatch(ValidationContext *context)
-{
- const auto &glState = context->getGLState();
- const Program *program = context->getGLState().getProgram();
- const VertexArray *vao = context->getGLState().getVertexArray();
- const auto &vertexAttribs = vao->getVertexAttributes();
- const auto &currentValues = glState.getVertexAttribCurrentValues();
-
- for (const sh::Attribute &shaderAttribute : program->getAttributes())
- {
- // gl_VertexID and gl_InstanceID are active attributes but don't have a bound attribute.
- if (shaderAttribute.isBuiltIn())
- {
- continue;
- }
-
- GLenum shaderInputType = VariableComponentType(shaderAttribute.type);
-
- const auto &attrib = vertexAttribs[shaderAttribute.location];
- GLenum vertexType = attrib.enabled ? GetVertexAttributeBaseType(attrib)
- : currentValues[shaderAttribute.location].Type;
-
- if (shaderInputType != GL_NONE && vertexType != GL_NONE && shaderInputType != vertexType)
- {
- context->handleError(InvalidOperation() << "Vertex shader input type does not "
- "match the type of the bound vertex "
- "attribute.");
- return false;
- }
- }
-
- return true;
-}
-
-} // anonymous namespace
-
-bool ValidTextureTarget(const ValidationContext *context, GLenum target)
-{
- switch (target)
- {
- case GL_TEXTURE_2D:
- case GL_TEXTURE_CUBE_MAP:
- return true;
-
- case GL_TEXTURE_RECTANGLE_ANGLE:
- return context->getExtensions().textureRectangle;
-
- case GL_TEXTURE_3D:
- case GL_TEXTURE_2D_ARRAY:
- return (context->getClientMajorVersion() >= 3);
-
- case GL_TEXTURE_2D_MULTISAMPLE:
- return (context->getClientVersion() >= Version(3, 1));
-
- default:
- return false;
- }
-}
-
-bool ValidTexture2DTarget(const ValidationContext *context, GLenum target)
-{
- switch (target)
- {
- case GL_TEXTURE_2D:
- case GL_TEXTURE_CUBE_MAP:
- return true;
-
- case GL_TEXTURE_RECTANGLE_ANGLE:
- return context->getExtensions().textureRectangle;
-
- default:
- return false;
- }
-}
-
-bool ValidTexture3DTarget(const ValidationContext *context, GLenum target)
-{
- switch (target)
- {
- case GL_TEXTURE_3D:
- case GL_TEXTURE_2D_ARRAY:
- return (context->getClientMajorVersion() >= 3);
-
- default:
- return false;
- }
-}
-
-// Most texture GL calls are not compatible with external textures, so we have a separate validation
-// function for use in the GL calls that do
-bool ValidTextureExternalTarget(const ValidationContext *context, GLenum target)
-{
- return (target == GL_TEXTURE_EXTERNAL_OES) &&
- (context->getExtensions().eglImageExternal ||
- context->getExtensions().eglStreamConsumerExternal);
-}
-
-// This function differs from ValidTextureTarget in that the target must be
-// usable as the destination of a 2D operation-- so a cube face is valid, but
-// GL_TEXTURE_CUBE_MAP is not.
-// Note: duplicate of IsInternalTextureTarget
-bool ValidTexture2DDestinationTarget(const ValidationContext *context, GLenum target)
-{
- switch (target)
- {
- case GL_TEXTURE_2D:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- return true;
- case GL_TEXTURE_RECTANGLE_ANGLE:
- return context->getExtensions().textureRectangle;
- default:
- return false;
- }
-}
-
-bool ValidateDrawElementsInstancedBase(ValidationContext *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const GLvoid *indices,
- GLsizei primcount)
-{
- if (primcount < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativePrimcount);
- return false;
- }
-
- if (!ValidateDrawElementsCommon(context, mode, count, type, indices, primcount))
- {
- return false;
- }
-
- // No-op zero primitive count
- return (primcount > 0);
-}
-
-bool ValidateDrawArraysInstancedBase(Context *context,
- GLenum mode,
- GLint first,
- GLsizei count,
- GLsizei primcount)
-{
- if (primcount < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativePrimcount);
- return false;
- }
-
- if (!ValidateDrawArraysCommon(context, mode, first, count, primcount))
- {
- return false;
- }
-
- // No-op if zero primitive count
- return (primcount > 0);
-}
-
-bool ValidateDrawInstancedANGLE(ValidationContext *context)
-{
- // Verify there is at least one active attribute with a divisor of zero
- const State &state = context->getGLState();
-
- Program *program = state.getProgram();
-
- const auto &attribs = state.getVertexArray()->getVertexAttributes();
- const auto &bindings = state.getVertexArray()->getVertexBindings();
- for (size_t attributeIndex = 0; attributeIndex < MAX_VERTEX_ATTRIBS; attributeIndex++)
- {
- const VertexAttribute &attrib = attribs[attributeIndex];
- const VertexBinding &binding = bindings[attrib.bindingIndex];
- if (program->isAttribLocationActive(attributeIndex) && binding.getDivisor() == 0)
- {
- return true;
- }
- }
-
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), NoZeroDivisor);
- return false;
-}
-
-bool ValidTexture3DDestinationTarget(const ValidationContext *context, GLenum target)
-{
- switch (target)
- {
- case GL_TEXTURE_3D:
- case GL_TEXTURE_2D_ARRAY:
- return true;
- default:
- return false;
- }
-}
-
-bool ValidTexLevelDestinationTarget(const ValidationContext *context, GLenum target)
-{
- switch (target)
- {
- case GL_TEXTURE_2D:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- case GL_TEXTURE_3D:
- case GL_TEXTURE_2D_ARRAY:
- case GL_TEXTURE_2D_MULTISAMPLE:
- return true;
- case GL_TEXTURE_RECTANGLE_ANGLE:
- return context->getExtensions().textureRectangle;
- default:
- return false;
- }
-}
-
-bool ValidFramebufferTarget(const ValidationContext *context, GLenum target)
-{
- static_assert(GL_DRAW_FRAMEBUFFER_ANGLE == GL_DRAW_FRAMEBUFFER &&
- GL_READ_FRAMEBUFFER_ANGLE == GL_READ_FRAMEBUFFER,
- "ANGLE framebuffer enums must equal the ES3 framebuffer enums.");
-
- switch (target)
- {
- case GL_FRAMEBUFFER:
- return true;
-
- case GL_READ_FRAMEBUFFER:
- case GL_DRAW_FRAMEBUFFER:
- return (context->getExtensions().framebufferBlit ||
- context->getClientMajorVersion() >= 3);
-
- default:
- return false;
- }
-}
-
-bool ValidBufferType(const ValidationContext *context, BufferBinding target)
-{
- switch (target)
- {
- case BufferBinding::ElementArray:
- case BufferBinding::Array:
- return true;
-
- case BufferBinding::PixelPack:
- case BufferBinding::PixelUnpack:
- return (context->getExtensions().pixelBufferObject ||
- context->getClientMajorVersion() >= 3);
-
- case BufferBinding::CopyRead:
- case BufferBinding::CopyWrite:
- case BufferBinding::TransformFeedback:
- case BufferBinding::Uniform:
- return (context->getClientMajorVersion() >= 3);
-
- case BufferBinding::AtomicCounter:
- case BufferBinding::ShaderStorage:
- case BufferBinding::DrawIndirect:
- case BufferBinding::DispatchIndirect:
- return context->getClientVersion() >= Version(3, 1);
-
- default:
- return false;
- }
-}
-
-bool ValidMipLevel(const ValidationContext *context, GLenum target, GLint level)
-{
- const auto &caps = context->getCaps();
- size_t maxDimension = 0;
- switch (target)
- {
- case GL_TEXTURE_2D:
- maxDimension = caps.max2DTextureSize;
- break;
- case GL_TEXTURE_CUBE_MAP:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- maxDimension = caps.maxCubeMapTextureSize;
- break;
- case GL_TEXTURE_RECTANGLE_ANGLE:
- return level == 0;
- case GL_TEXTURE_3D:
- maxDimension = caps.max3DTextureSize;
- break;
- case GL_TEXTURE_2D_ARRAY:
- maxDimension = caps.max2DTextureSize;
- break;
- case GL_TEXTURE_2D_MULTISAMPLE:
- maxDimension = caps.max2DTextureSize;
- break;
- default:
- UNREACHABLE();
- }
-
- return level <= gl::log2(static_cast<int>(maxDimension)) && level >= 0;
-}
-
-bool ValidImageSizeParameters(ValidationContext *context,
- GLenum target,
- GLint level,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- bool isSubImage)
-{
- if (width < 0 || height < 0 || depth < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeSize);
- return false;
- }
- // TexSubImage parameters can be NPOT without textureNPOT extension,
- // as long as the destination texture is POT.
- bool hasNPOTSupport =
- context->getExtensions().textureNPOT || context->getClientVersion() >= Version(3, 0);
- if (!isSubImage && !hasNPOTSupport &&
- (level != 0 && (!gl::isPow2(width) || !gl::isPow2(height) || !gl::isPow2(depth))))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), TextureNotPow2);
- return false;
- }
-
- if (!ValidMipLevel(context, target, level))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidMipLevel);
- return false;
- }
-
- return true;
-}
-
-bool CompressedTextureFormatRequiresExactSize(GLenum internalFormat)
-{
- // List of compressed format that require that the texture size is smaller than or a multiple of
- // the compressed block size.
- switch (internalFormat)
- {
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
- case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
- case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
- case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
- case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
- case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
- case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_RGBA8_LOSSY_DECODE_ETC2_EAC_ANGLE:
- case GL_COMPRESSED_SRGB8_ALPHA8_LOSSY_DECODE_ETC2_EAC_ANGLE:
- return true;
-
- default:
- return false;
- }
-}
-
-bool ValidCompressedDimension(GLsizei size, GLuint blockSize, bool smallerThanBlockSizeAllowed)
-{
- return (smallerThanBlockSizeAllowed && (size > 0) && (blockSize % size == 0)) ||
- (size % blockSize == 0);
-}
-
-bool ValidCompressedImageSize(const ValidationContext *context,
- GLenum internalFormat,
- GLint level,
- GLsizei width,
- GLsizei height)
-{
- const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(internalFormat);
- if (!formatInfo.compressed)
- {
- return false;
- }
-
- if (width < 0 || height < 0)
- {
- return false;
- }
-
- if (CompressedTextureFormatRequiresExactSize(internalFormat))
- {
- // The ANGLE extensions allow specifying compressed textures with sizes smaller than the
- // block size for level 0 but WebGL disallows this.
- bool smallerThanBlockSizeAllowed =
- level > 0 || !context->getExtensions().webglCompatibility;
-
- if (!ValidCompressedDimension(width, formatInfo.compressedBlockWidth,
- smallerThanBlockSizeAllowed) ||
- !ValidCompressedDimension(height, formatInfo.compressedBlockHeight,
- smallerThanBlockSizeAllowed))
- {
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidCompressedSubImageSize(const ValidationContext *context,
- GLenum internalFormat,
- GLint xoffset,
- GLint yoffset,
- GLsizei width,
- GLsizei height,
- size_t textureWidth,
- size_t textureHeight)
-{
- const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(internalFormat);
- if (!formatInfo.compressed)
- {
- return false;
- }
-
- if (xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
- {
- return false;
- }
-
- if (CompressedTextureFormatRequiresExactSize(internalFormat))
- {
- if (xoffset % formatInfo.compressedBlockWidth != 0 ||
- yoffset % formatInfo.compressedBlockHeight != 0)
- {
- return false;
- }
-
- // Allowed to either have data that is a multiple of block size or is smaller than the block
- // size but fills the entire mip
- bool fillsEntireMip = xoffset == 0 && yoffset == 0 &&
- static_cast<size_t>(width) == textureWidth &&
- static_cast<size_t>(height) == textureHeight;
- bool sizeMultipleOfBlockSize = (width % formatInfo.compressedBlockWidth) == 0 &&
- (height % formatInfo.compressedBlockHeight) == 0;
- if (!sizeMultipleOfBlockSize && !fillsEntireMip)
- {
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidImageDataSize(ValidationContext *context,
- GLenum textureTarget,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLenum format,
- GLenum type,
- const void *pixels,
- GLsizei imageSize)
-{
- gl::Buffer *pixelUnpackBuffer =
- context->getGLState().getTargetBuffer(BufferBinding::PixelUnpack);
- if (pixelUnpackBuffer == nullptr && imageSize < 0)
- {
- // Checks are not required
- return true;
- }
-
- // ...the data would be unpacked from the buffer object such that the memory reads required
- // would exceed the data store size.
- const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(format, type);
- ASSERT(formatInfo.internalFormat != GL_NONE);
- const gl::Extents size(width, height, depth);
- const auto &unpack = context->getGLState().getUnpackState();
-
- bool targetIs3D = textureTarget == GL_TEXTURE_3D || textureTarget == GL_TEXTURE_2D_ARRAY;
- auto endByteOrErr = formatInfo.computePackUnpackEndByte(type, size, unpack, targetIs3D);
- if (endByteOrErr.isError())
- {
- context->handleError(endByteOrErr.getError());
- return false;
- }
-
- GLuint endByte = endByteOrErr.getResult();
-
- if (pixelUnpackBuffer)
- {
- CheckedNumeric<size_t> checkedEndByte(endByteOrErr.getResult());
- CheckedNumeric<size_t> checkedOffset(reinterpret_cast<size_t>(pixels));
- checkedEndByte += checkedOffset;
-
- if (!checkedEndByte.IsValid() ||
- (checkedEndByte.ValueOrDie() > static_cast<size_t>(pixelUnpackBuffer->getSize())))
- {
- // Overflow past the end of the buffer
- context->handleError(InvalidOperation());
- return false;
- }
- }
- else
- {
- ASSERT(imageSize >= 0);
- if (pixels == nullptr && imageSize != 0)
- {
- context->handleError(InvalidOperation()
- << "imageSize must be 0 if no texture data is provided.");
- return false;
- }
-
- if (pixels != nullptr && endByte > static_cast<GLuint>(imageSize))
- {
- context->handleError(InvalidOperation() << "imageSize must be at least " << endByte);
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidQueryType(const Context *context, GLenum queryType)
-{
- static_assert(GL_ANY_SAMPLES_PASSED == GL_ANY_SAMPLES_PASSED_EXT,
- "GL extension enums not equal.");
- static_assert(GL_ANY_SAMPLES_PASSED_CONSERVATIVE == GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT,
- "GL extension enums not equal.");
-
- switch (queryType)
- {
- case GL_ANY_SAMPLES_PASSED:
- case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
- return context->getClientMajorVersion() >= 3 ||
- context->getExtensions().occlusionQueryBoolean;
- case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
- return (context->getClientMajorVersion() >= 3);
- case GL_TIME_ELAPSED_EXT:
- return context->getExtensions().disjointTimerQuery;
- case GL_COMMANDS_COMPLETED_CHROMIUM:
- return context->getExtensions().syncQuery;
- default:
- return false;
- }
-}
-
-bool ValidateWebGLVertexAttribPointer(ValidationContext *context,
- GLenum type,
- GLboolean normalized,
- GLsizei stride,
- const void *ptr,
- bool pureInteger)
-{
- ASSERT(context->getExtensions().webglCompatibility);
- // WebGL 1.0 [Section 6.11] Vertex Attribute Data Stride
- // The WebGL API supports vertex attribute data strides up to 255 bytes. A call to
- // vertexAttribPointer will generate an INVALID_VALUE error if the value for the stride
- // parameter exceeds 255.
- constexpr GLsizei kMaxWebGLStride = 255;
- if (stride > kMaxWebGLStride)
- {
- context->handleError(InvalidValue()
- << "Stride is over the maximum stride allowed by WebGL.");
- return false;
- }
-
- // WebGL 1.0 [Section 6.4] Buffer Offset and Stride Requirements
- // The offset arguments to drawElements and vertexAttribPointer, and the stride argument to
- // vertexAttribPointer, must be a multiple of the size of the data type passed to the call,
- // or an INVALID_OPERATION error is generated.
- VertexFormatType internalType = GetVertexFormatType(type, normalized, 1, pureInteger);
- size_t typeSize = GetVertexFormatTypeSize(internalType);
-
- ASSERT(isPow2(typeSize) && typeSize > 0);
- size_t sizeMask = (typeSize - 1);
- if ((reinterpret_cast<intptr_t>(ptr) & sizeMask) != 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), OffsetMustBeMultipleOfType);
- return false;
- }
-
- if ((stride & sizeMask) != 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), StrideMustBeMultipleOfType);
- return false;
- }
-
- return true;
-}
-
-Program *GetValidProgram(ValidationContext *context, GLuint id)
-{
- // ES3 spec (section 2.11.1) -- "Commands that accept shader or program object names will
- // generate the error INVALID_VALUE if the provided name is not the name of either a shader
- // or program object and INVALID_OPERATION if the provided name identifies an object
- // that is not the expected type."
-
- Program *validProgram = context->getProgram(id);
-
- if (!validProgram)
- {
- if (context->getShader(id))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExpectedProgramName);
- }
- else
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidProgramName);
- }
- }
-
- return validProgram;
-}
-
-Shader *GetValidShader(ValidationContext *context, GLuint id)
-{
- // See ValidProgram for spec details.
-
- Shader *validShader = context->getShader(id);
-
- if (!validShader)
- {
- if (context->getProgram(id))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExpectedShaderName);
- }
- else
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidShaderName);
- }
- }
-
- return validShader;
-}
-
-bool ValidateAttachmentTarget(gl::Context *context, GLenum attachment)
-{
- if (attachment >= GL_COLOR_ATTACHMENT1_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
- {
- if (context->getClientMajorVersion() < 3 && !context->getExtensions().drawBuffers)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidAttachment);
- return false;
- }
-
- // Color attachment 0 is validated below because it is always valid
- const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
- if (colorAttachment >= context->getCaps().maxColorAttachments)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidAttachment);
- return false;
- }
- }
- else
- {
- switch (attachment)
- {
- case GL_COLOR_ATTACHMENT0:
- case GL_DEPTH_ATTACHMENT:
- case GL_STENCIL_ATTACHMENT:
- break;
-
- case GL_DEPTH_STENCIL_ATTACHMENT:
- if (!context->getExtensions().webglCompatibility &&
- context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidAttachment);
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidAttachment);
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateRenderbufferStorageParametersBase(ValidationContext *context,
- GLenum target,
- GLsizei samples,
- GLenum internalformat,
- GLsizei width,
- GLsizei height)
-{
- switch (target)
- {
- case GL_RENDERBUFFER:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidRenderbufferTarget);
- return false;
- }
-
- if (width < 0 || height < 0 || samples < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidRenderbufferWidthHeight);
- return false;
- }
-
- // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
- GLenum convertedInternalFormat = context->getConvertedRenderbufferFormat(internalformat);
-
- const TextureCaps &formatCaps = context->getTextureCaps().get(convertedInternalFormat);
- if (!formatCaps.renderable)
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- // ANGLE_framebuffer_multisample does not explicitly state that the internal format must be
- // sized but it does state that the format must be in the ES2.0 spec table 4.5 which contains
- // only sized internal formats.
- const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(convertedInternalFormat);
- if (formatInfo.internalFormat == GL_NONE)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidRenderbufferInternalFormat);
- return false;
- }
-
- if (static_cast<GLuint>(std::max(width, height)) > context->getCaps().maxRenderbufferSize)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- GLuint handle = context->getGLState().getRenderbufferId();
- if (handle == 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidRenderbufferTarget);
- return false;
- }
-
- return true;
-}
-
-bool ValidateFramebufferRenderbufferParameters(gl::Context *context,
- GLenum target,
- GLenum attachment,
- GLenum renderbuffertarget,
- GLuint renderbuffer)
-{
- if (!ValidFramebufferTarget(context, target))
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- gl::Framebuffer *framebuffer = context->getGLState().getTargetFramebuffer(target);
-
- ASSERT(framebuffer);
- if (framebuffer->id() == 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), DefaultFramebufferTarget);
- return false;
- }
-
- if (!ValidateAttachmentTarget(context, attachment))
- {
- return false;
- }
-
- // [OpenGL ES 2.0.25] Section 4.4.3 page 112
- // [OpenGL ES 3.0.2] Section 4.4.2 page 201
- // 'renderbuffer' must be either zero or the name of an existing renderbuffer object of
- // type 'renderbuffertarget', otherwise an INVALID_OPERATION error is generated.
- if (renderbuffer != 0)
- {
- if (!context->getRenderbuffer(renderbuffer))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidRenderbufferTarget);
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateBlitFramebufferParameters(ValidationContext *context,
- GLint srcX0,
- GLint srcY0,
- GLint srcX1,
- GLint srcY1,
- GLint dstX0,
- GLint dstY0,
- GLint dstX1,
- GLint dstY1,
- GLbitfield mask,
- GLenum filter)
-{
- switch (filter)
- {
- case GL_NEAREST:
- break;
- case GL_LINEAR:
- break;
- default:
- context->handleError(InvalidEnum());
- return false;
- }
-
- if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- if (mask == 0)
- {
- // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
- // buffers are copied.
- return false;
- }
-
- // ES3.0 spec, section 4.3.2 states that linear filtering is only available for the
- // color buffer, leaving only nearest being unfiltered from above
- if ((mask & ~GL_COLOR_BUFFER_BIT) != 0 && filter != GL_NEAREST)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- const auto &glState = context->getGLState();
- gl::Framebuffer *readFramebuffer = glState.getReadFramebuffer();
- gl::Framebuffer *drawFramebuffer = glState.getDrawFramebuffer();
-
- if (!readFramebuffer || !drawFramebuffer)
- {
- context->handleError(InvalidFramebufferOperation());
- return false;
- }
-
- if (readFramebuffer->id() == drawFramebuffer->id())
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- if (readFramebuffer->checkStatus(context) != GL_FRAMEBUFFER_COMPLETE)
- {
- context->handleError(InvalidFramebufferOperation());
- return false;
- }
-
- if (drawFramebuffer->checkStatus(context) != GL_FRAMEBUFFER_COMPLETE)
- {
- context->handleError(InvalidFramebufferOperation());
- return false;
- }
-
- if (drawFramebuffer->getSamples(context) != 0)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- bool sameBounds = srcX0 == dstX0 && srcY0 == dstY0 && srcX1 == dstX1 && srcY1 == dstY1;
-
- if (mask & GL_COLOR_BUFFER_BIT)
- {
- const gl::FramebufferAttachment *readColorBuffer = readFramebuffer->getReadColorbuffer();
- const Extensions &extensions = context->getExtensions();
-
- if (readColorBuffer)
- {
- const Format &readFormat = readColorBuffer->getFormat();
-
- for (size_t drawbufferIdx = 0;
- drawbufferIdx < drawFramebuffer->getDrawbufferStateCount(); ++drawbufferIdx)
- {
- const FramebufferAttachment *attachment =
- drawFramebuffer->getDrawBuffer(drawbufferIdx);
- if (attachment)
- {
- const Format &drawFormat = attachment->getFormat();
-
- // The GL ES 3.0.2 spec (pg 193) states that:
- // 1) If the read buffer is fixed point format, the draw buffer must be as well
- // 2) If the read buffer is an unsigned integer format, the draw buffer must be
- // as well
- // 3) If the read buffer is a signed integer format, the draw buffer must be as
- // well
- // Changes with EXT_color_buffer_float:
- // Case 1) is changed to fixed point OR floating point
- GLenum readComponentType = readFormat.info->componentType;
- GLenum drawComponentType = drawFormat.info->componentType;
- bool readFixedPoint = (readComponentType == GL_UNSIGNED_NORMALIZED ||
- readComponentType == GL_SIGNED_NORMALIZED);
- bool drawFixedPoint = (drawComponentType == GL_UNSIGNED_NORMALIZED ||
- drawComponentType == GL_SIGNED_NORMALIZED);
-
- if (extensions.colorBufferFloat)
- {
- bool readFixedOrFloat = (readFixedPoint || readComponentType == GL_FLOAT);
- bool drawFixedOrFloat = (drawFixedPoint || drawComponentType == GL_FLOAT);
-
- if (readFixedOrFloat != drawFixedOrFloat)
- {
- context->handleError(InvalidOperation()
- << "If the read buffer contains fixed-point or "
- "floating-point values, the draw buffer must "
- "as well.");
- return false;
- }
- }
- else if (readFixedPoint != drawFixedPoint)
- {
- context->handleError(InvalidOperation()
- << "If the read buffer contains fixed-point values, "
- "the draw buffer must as well.");
- return false;
- }
-
- if (readComponentType == GL_UNSIGNED_INT &&
- drawComponentType != GL_UNSIGNED_INT)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- if (readComponentType == GL_INT && drawComponentType != GL_INT)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- if (readColorBuffer->getSamples() > 0 &&
- (!Format::EquivalentForBlit(readFormat, drawFormat) || !sameBounds))
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- if (context->getExtensions().webglCompatibility &&
- *readColorBuffer == *attachment)
- {
- context->handleError(
- InvalidOperation()
- << "Read and write color attachments cannot be the same image.");
- return false;
- }
- }
- }
-
- if ((readFormat.info->componentType == GL_INT ||
- readFormat.info->componentType == GL_UNSIGNED_INT) &&
- filter == GL_LINEAR)
- {
- context->handleError(InvalidOperation());
- return false;
- }
- }
- // WebGL 2.0 BlitFramebuffer when blitting from a missing attachment
- // In OpenGL ES it is undefined what happens when an operation tries to blit from a missing
- // attachment and WebGL defines it to be an error. We do the check unconditionally as the
- // situation is an application error that would lead to a crash in ANGLE.
- else if (drawFramebuffer->hasEnabledDrawBuffer())
- {
- context->handleError(
- InvalidOperation()
- << "Attempt to read from a missing color attachment of a complete framebuffer.");
- return false;
- }
- }
-
- GLenum masks[] = {GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT};
- GLenum attachments[] = {GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT};
- for (size_t i = 0; i < 2; i++)
- {
- if (mask & masks[i])
- {
- const gl::FramebufferAttachment *readBuffer =
- readFramebuffer->getAttachment(attachments[i]);
- const gl::FramebufferAttachment *drawBuffer =
- drawFramebuffer->getAttachment(attachments[i]);
-
- if (readBuffer && drawBuffer)
- {
- if (!Format::EquivalentForBlit(readBuffer->getFormat(), drawBuffer->getFormat()))
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- if (readBuffer->getSamples() > 0 && !sameBounds)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- if (context->getExtensions().webglCompatibility && *readBuffer == *drawBuffer)
- {
- context->handleError(
- InvalidOperation()
- << "Read and write depth stencil attachments cannot be the same image.");
- return false;
- }
- }
- // WebGL 2.0 BlitFramebuffer when blitting from a missing attachment
- else if (drawBuffer)
- {
- context->handleError(InvalidOperation() << "Attempt to read from a missing "
- "depth/stencil attachment of a "
- "complete framebuffer.");
- return false;
- }
- }
- }
-
- // ANGLE_multiview, Revision 1:
- // Calling BlitFramebuffer will result in an INVALID_FRAMEBUFFER_OPERATION error if the
- // multi-view layout of the current draw framebuffer or read framebuffer is not NONE.
- if (readFramebuffer->getMultiviewLayout() != GL_NONE)
- {
- context->handleError(InvalidFramebufferOperation()
- << "Attempt to read from a multi-view framebuffer.");
- return false;
- }
- if (drawFramebuffer->getMultiviewLayout() != GL_NONE)
- {
- context->handleError(InvalidFramebufferOperation()
- << "Attempt to write to a multi-view framebuffer.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateReadPixelsRobustANGLE(Context *context,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLenum type,
- GLsizei bufSize,
- GLsizei *length,
- GLsizei *columns,
- GLsizei *rows,
- void *pixels)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateReadPixelsBase(context, x, y, width, height, format, type, bufSize, length,
- columns, rows, pixels))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateReadnPixelsEXT(Context *context,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLenum type,
- GLsizei bufSize,
- void *pixels)
-{
- if (bufSize < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeBufferSize);
- return false;
- }
-
- return ValidateReadPixelsBase(context, x, y, width, height, format, type, bufSize, nullptr,
- nullptr, nullptr, pixels);
-}
-
-bool ValidateReadnPixelsRobustANGLE(Context *context,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLenum type,
- GLsizei bufSize,
- GLsizei *length,
- GLsizei *columns,
- GLsizei *rows,
- void *data)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateReadPixelsBase(context, x, y, width, height, format, type, bufSize, length,
- columns, rows, data))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGenQueriesEXT(gl::Context *context, GLsizei n, GLuint *ids)
-{
- if (!context->getExtensions().occlusionQueryBoolean &&
- !context->getExtensions().disjointTimerQuery)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), QueryExtensionNotEnabled);
- return false;
- }
-
- return ValidateGenOrDelete(context, n);
-}
-
-bool ValidateDeleteQueriesEXT(gl::Context *context, GLsizei n, const GLuint *ids)
-{
- if (!context->getExtensions().occlusionQueryBoolean &&
- !context->getExtensions().disjointTimerQuery)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), QueryExtensionNotEnabled);
- return false;
- }
-
- return ValidateGenOrDelete(context, n);
-}
-
-bool ValidateIsQueryEXT(gl::Context *context, GLuint id)
-{
- if (!context->getExtensions().occlusionQueryBoolean &&
- !context->getExtensions().disjointTimerQuery)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), QueryExtensionNotEnabled);
- return false;
- }
-
- return true;
-}
-
-bool ValidateBeginQueryBase(gl::Context *context, GLenum target, GLuint id)
-{
- if (!ValidQueryType(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidQueryType);
- return false;
- }
-
- if (id == 0)
- {
- context->handleError(InvalidOperation() << "Query id is 0");
- return false;
- }
-
- // From EXT_occlusion_query_boolean: If BeginQueryEXT is called with an <id>
- // of zero, if the active query object name for <target> is non-zero (for the
- // targets ANY_SAMPLES_PASSED_EXT and ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, if
- // the active query for either target is non-zero), if <id> is the name of an
- // existing query object whose type does not match <target>, or if <id> is the
- // active query object name for any query type, the error INVALID_OPERATION is
- // generated.
-
- // Ensure no other queries are active
- // NOTE: If other queries than occlusion are supported, we will need to check
- // separately that:
- // a) The query ID passed is not the current active query for any target/type
- // b) There are no active queries for the requested target (and in the case
- // of GL_ANY_SAMPLES_PASSED_EXT and GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT,
- // no query may be active for either if glBeginQuery targets either.
-
- if (context->getGLState().isQueryActive(target))
- {
- context->handleError(InvalidOperation() << "Other query is active");
- return false;
- }
-
- Query *queryObject = context->getQuery(id, true, target);
-
- // check that name was obtained with glGenQueries
- if (!queryObject)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidQueryId);
- return false;
- }
-
- // check for type mismatch
- if (queryObject->getType() != target)
- {
- context->handleError(InvalidOperation() << "Query type does not match target");
- return false;
- }
-
- return true;
-}
-
-bool ValidateBeginQueryEXT(gl::Context *context, GLenum target, GLuint id)
-{
- if (!context->getExtensions().occlusionQueryBoolean &&
- !context->getExtensions().disjointTimerQuery && !context->getExtensions().syncQuery)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), QueryExtensionNotEnabled);
- return false;
- }
-
- return ValidateBeginQueryBase(context, target, id);
-}
-
-bool ValidateEndQueryBase(gl::Context *context, GLenum target)
-{
- if (!ValidQueryType(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidQueryType);
- return false;
- }
-
- const Query *queryObject = context->getGLState().getActiveQuery(target);
-
- if (queryObject == nullptr)
- {
- context->handleError(InvalidOperation() << "Query target not active");
- return false;
- }
-
- return true;
-}
-
-bool ValidateEndQueryEXT(gl::Context *context, GLenum target)
-{
- if (!context->getExtensions().occlusionQueryBoolean &&
- !context->getExtensions().disjointTimerQuery && !context->getExtensions().syncQuery)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), QueryExtensionNotEnabled);
- return false;
- }
-
- return ValidateEndQueryBase(context, target);
-}
-
-bool ValidateQueryCounterEXT(Context *context, GLuint id, GLenum target)
-{
- if (!context->getExtensions().disjointTimerQuery)
- {
- context->handleError(InvalidOperation() << "Disjoint timer query not enabled");
- return false;
- }
-
- if (target != GL_TIMESTAMP_EXT)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidQueryTarget);
- return false;
- }
-
- Query *queryObject = context->getQuery(id, true, target);
- if (queryObject == nullptr)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidQueryId);
- return false;
- }
-
- if (context->getGLState().isQueryActive(queryObject))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), QueryActive);
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetQueryivBase(Context *context, GLenum target, GLenum pname, GLsizei *numParams)
-{
- if (numParams)
- {
- *numParams = 0;
- }
-
- if (!ValidQueryType(context, target) && target != GL_TIMESTAMP_EXT)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidQueryType);
- return false;
- }
-
- switch (pname)
- {
- case GL_CURRENT_QUERY_EXT:
- if (target == GL_TIMESTAMP_EXT)
- {
- context->handleError(InvalidEnum() << "Cannot use current query for timestamp");
- return false;
- }
- break;
- case GL_QUERY_COUNTER_BITS_EXT:
- if (!context->getExtensions().disjointTimerQuery ||
- (target != GL_TIMESTAMP_EXT && target != GL_TIME_ELAPSED_EXT))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidPname);
- return false;
- }
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidPname);
- return false;
- }
-
- if (numParams)
- {
- // All queries return only one value
- *numParams = 1;
- }
-
- return true;
-}
-
-bool ValidateGetQueryivEXT(Context *context, GLenum target, GLenum pname, GLint *params)
-{
- if (!context->getExtensions().occlusionQueryBoolean &&
- !context->getExtensions().disjointTimerQuery && !context->getExtensions().syncQuery)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- return ValidateGetQueryivBase(context, target, pname, nullptr);
-}
-
-bool ValidateGetQueryivRobustANGLE(Context *context,
- GLenum target,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetQueryivBase(context, target, pname, length))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetQueryObjectValueBase(Context *context, GLuint id, GLenum pname, GLsizei *numParams)
-{
- if (numParams)
- {
- *numParams = 0;
- }
-
- Query *queryObject = context->getQuery(id, false, GL_NONE);
-
- if (!queryObject)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidQueryId);
- return false;
- }
-
- if (context->getGLState().isQueryActive(queryObject))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), QueryActive);
- return false;
- }
-
- switch (pname)
- {
- case GL_QUERY_RESULT_EXT:
- case GL_QUERY_RESULT_AVAILABLE_EXT:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- if (numParams)
- {
- *numParams = 1;
- }
-
- return true;
-}
-
-bool ValidateGetQueryObjectivEXT(Context *context, GLuint id, GLenum pname, GLint *params)
-{
- if (!context->getExtensions().disjointTimerQuery)
- {
- context->handleError(InvalidOperation() << "Timer query extension not enabled");
- return false;
- }
- return ValidateGetQueryObjectValueBase(context, id, pname, nullptr);
-}
-
-bool ValidateGetQueryObjectivRobustANGLE(Context *context,
- GLuint id,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params)
-{
- if (!context->getExtensions().disjointTimerQuery)
- {
- context->handleError(InvalidOperation() << "Timer query extension not enabled");
- return false;
- }
-
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetQueryObjectValueBase(context, id, pname, length))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetQueryObjectuivEXT(Context *context, GLuint id, GLenum pname, GLuint *params)
-{
- if (!context->getExtensions().disjointTimerQuery &&
- !context->getExtensions().occlusionQueryBoolean && !context->getExtensions().syncQuery)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
- return ValidateGetQueryObjectValueBase(context, id, pname, nullptr);
-}
-
-bool ValidateGetQueryObjectuivRobustANGLE(Context *context,
- GLuint id,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLuint *params)
-{
- if (!context->getExtensions().disjointTimerQuery &&
- !context->getExtensions().occlusionQueryBoolean && !context->getExtensions().syncQuery)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetQueryObjectValueBase(context, id, pname, length))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetQueryObjecti64vEXT(Context *context, GLuint id, GLenum pname, GLint64 *params)
-{
- if (!context->getExtensions().disjointTimerQuery)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
- return ValidateGetQueryObjectValueBase(context, id, pname, nullptr);
-}
-
-bool ValidateGetQueryObjecti64vRobustANGLE(Context *context,
- GLuint id,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint64 *params)
-{
- if (!context->getExtensions().disjointTimerQuery)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetQueryObjectValueBase(context, id, pname, length))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetQueryObjectui64vEXT(Context *context, GLuint id, GLenum pname, GLuint64 *params)
-{
- if (!context->getExtensions().disjointTimerQuery)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
- return ValidateGetQueryObjectValueBase(context, id, pname, nullptr);
-}
-
-bool ValidateGetQueryObjectui64vRobustANGLE(Context *context,
- GLuint id,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLuint64 *params)
-{
- if (!context->getExtensions().disjointTimerQuery)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetQueryObjectValueBase(context, id, pname, length))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateUniformCommonBase(ValidationContext *context,
- gl::Program *program,
- GLint location,
- GLsizei count,
- const LinkedUniform **uniformOut)
-{
- // TODO(Jiajia): Add image uniform check in future.
- if (count < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeCount);
- return false;
- }
-
- if (!program)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidProgramName);
- return false;
- }
-
- if (!program->isLinked())
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ProgramNotLinked);
- return false;
- }
-
- if (location == -1)
- {
- // Silently ignore the uniform command
- return false;
- }
-
- const auto &uniformLocations = program->getUniformLocations();
- size_t castedLocation = static_cast<size_t>(location);
- if (castedLocation >= uniformLocations.size())
- {
- context->handleError(InvalidOperation() << "Invalid uniform location");
- return false;
- }
-
- const auto &uniformLocation = uniformLocations[castedLocation];
- if (uniformLocation.ignored)
- {
- // Silently ignore the uniform command
- return false;
- }
-
- if (!uniformLocation.used())
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- const auto &uniform = program->getUniformByIndex(uniformLocation.index);
-
- // attempting to write an array to a non-array uniform is an INVALID_OPERATION
- if (!uniform.isArray() && count > 1)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- *uniformOut = &uniform;
- return true;
-}
-
-bool ValidateUniform1ivValue(ValidationContext *context,
- GLenum uniformType,
- GLsizei count,
- const GLint *value)
-{
- // Value type is GL_INT, because we only get here from glUniform1i{v}.
- // It is compatible with INT or BOOL.
- // Do these cheap tests first, for a little extra speed.
- if (GL_INT == uniformType || GL_BOOL == uniformType)
- {
- return true;
- }
-
- if (IsSamplerType(uniformType))
- {
- // Check that the values are in range.
- const GLint max = context->getCaps().maxCombinedTextureImageUnits;
- for (GLsizei i = 0; i < count; ++i)
- {
- if (value[i] < 0 || value[i] >= max)
- {
- context->handleError(InvalidValue() << "sampler uniform value out of range");
- return false;
- }
- }
- return true;
- }
-
- context->handleError(InvalidOperation() << "wrong type of value for uniform");
- return false;
-}
-
-bool ValidateUniformValue(ValidationContext *context, GLenum valueType, GLenum uniformType)
-{
- // Check that the value type is compatible with uniform type.
- // Do the cheaper test first, for a little extra speed.
- if (valueType == uniformType || VariableBoolVectorType(valueType) == uniformType)
- {
- return true;
- }
-
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), UniformSizeMismatch);
- return false;
-}
-
-bool ValidateUniformMatrixValue(ValidationContext *context, GLenum valueType, GLenum uniformType)
-{
- // Check that the value type is compatible with uniform type.
- if (valueType == uniformType)
- {
- return true;
- }
-
- context->handleError(InvalidOperation() << "wrong type of value for uniform");
- return false;
-}
-
-bool ValidateUniform(ValidationContext *context, GLenum valueType, GLint location, GLsizei count)
-{
- const LinkedUniform *uniform = nullptr;
- gl::Program *programObject = context->getGLState().getProgram();
- return ValidateUniformCommonBase(context, programObject, location, count, &uniform) &&
- ValidateUniformValue(context, valueType, uniform->type);
-}
-
-bool ValidateUniform1iv(ValidationContext *context,
- GLint location,
- GLsizei count,
- const GLint *value)
-{
- const LinkedUniform *uniform = nullptr;
- gl::Program *programObject = context->getGLState().getProgram();
- return ValidateUniformCommonBase(context, programObject, location, count, &uniform) &&
- ValidateUniform1ivValue(context, uniform->type, count, value);
-}
-
-bool ValidateUniformMatrix(ValidationContext *context,
- GLenum valueType,
- GLint location,
- GLsizei count,
- GLboolean transpose)
-{
- if (ConvertToBool(transpose) && context->getClientMajorVersion() < 3)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- const LinkedUniform *uniform = nullptr;
- gl::Program *programObject = context->getGLState().getProgram();
- return ValidateUniformCommonBase(context, programObject, location, count, &uniform) &&
- ValidateUniformMatrixValue(context, valueType, uniform->type);
-}
-
-bool ValidateStateQuery(ValidationContext *context,
- GLenum pname,
- GLenum *nativeType,
- unsigned int *numParams)
-{
- if (!context->getQueryParameterInfo(pname, nativeType, numParams))
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- const Caps &caps = context->getCaps();
-
- if (pname >= GL_DRAW_BUFFER0 && pname <= GL_DRAW_BUFFER15)
- {
- unsigned int colorAttachment = (pname - GL_DRAW_BUFFER0);
-
- if (colorAttachment >= caps.maxDrawBuffers)
- {
- context->handleError(InvalidOperation());
- return false;
- }
- }
-
- switch (pname)
- {
- case GL_TEXTURE_BINDING_2D:
- case GL_TEXTURE_BINDING_CUBE_MAP:
- case GL_TEXTURE_BINDING_3D:
- case GL_TEXTURE_BINDING_2D_ARRAY:
- case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
- break;
- case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
- if (!context->getExtensions().textureRectangle)
- {
- context->handleError(InvalidEnum()
- << "ANGLE_texture_rectangle extension not present");
- return false;
- }
- break;
- case GL_TEXTURE_BINDING_EXTERNAL_OES:
- if (!context->getExtensions().eglStreamConsumerExternal &&
- !context->getExtensions().eglImageExternal)
- {
- context->handleError(InvalidEnum() << "Neither NV_EGL_stream_consumer_external "
- "nor GL_OES_EGL_image_external "
- "extensions enabled");
- return false;
- }
- break;
-
- case GL_IMPLEMENTATION_COLOR_READ_TYPE:
- case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
- {
- if (context->getGLState().getReadFramebuffer()->checkStatus(context) !=
- GL_FRAMEBUFFER_COMPLETE)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- const Framebuffer *framebuffer = context->getGLState().getReadFramebuffer();
- ASSERT(framebuffer);
-
- if (framebuffer->getReadBufferState() == GL_NONE)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ReadBufferNone);
- return false;
- }
-
- const FramebufferAttachment *attachment = framebuffer->getReadColorbuffer();
- if (!attachment)
- {
- context->handleError(InvalidOperation());
- return false;
- }
- }
- break;
-
- default:
- break;
- }
-
- // pname is valid, but there are no parameters to return
- if (*numParams == 0)
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateRobustStateQuery(ValidationContext *context,
- GLenum pname,
- GLsizei bufSize,
- GLenum *nativeType,
- unsigned int *numParams)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateStateQuery(context, pname, nativeType, numParams))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *numParams))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateCopyTexImageParametersBase(ValidationContext *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- bool isSubImage,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLint border,
- Format *textureFormatOut)
-{
- if (xoffset < 0 || yoffset < 0 || zoffset < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeOffset);
- return false;
- }
-
- if (width < 0 || height < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeSize);
- return false;
- }
-
- if (std::numeric_limits<GLsizei>::max() - xoffset < width ||
- std::numeric_limits<GLsizei>::max() - yoffset < height)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- if (border != 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidBorder);
- return false;
- }
-
- if (!ValidMipLevel(context, target, level))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidMipLevel);
- return false;
- }
-
- const auto &state = context->getGLState();
- Framebuffer *readFramebuffer = state.getReadFramebuffer();
- if (readFramebuffer->checkStatus(context) != GL_FRAMEBUFFER_COMPLETE)
- {
- context->handleError(InvalidFramebufferOperation());
- return false;
- }
-
- if (readFramebuffer->id() != 0 && readFramebuffer->getSamples(context) != 0)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- if (readFramebuffer->getReadBufferState() == GL_NONE)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ReadBufferNone);
- return false;
- }
-
- // WebGL 1.0 [Section 6.26] Reading From a Missing Attachment
- // In OpenGL ES it is undefined what happens when an operation tries to read from a missing
- // attachment and WebGL defines it to be an error. We do the check unconditionally as the
- // situation is an application error that would lead to a crash in ANGLE.
- const FramebufferAttachment *source = readFramebuffer->getReadColorbuffer();
- if (source == nullptr)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MissingReadAttachment);
- return false;
- }
-
- // ANGLE_multiview spec, Revision 1:
- // Calling CopyTexSubImage3D, CopyTexImage2D, or CopyTexSubImage2D will result in an
- // INVALID_FRAMEBUFFER_OPERATION error if the multi-view layout of the current read framebuffer
- // is not NONE.
- if (source->getMultiviewLayout() != GL_NONE)
- {
- context->handleError(InvalidFramebufferOperation()
- << "The active read framebuffer object has multiview attachments.");
- return false;
- }
-
- const gl::Caps &caps = context->getCaps();
-
- GLuint maxDimension = 0;
- switch (target)
- {
- case GL_TEXTURE_2D:
- maxDimension = caps.max2DTextureSize;
- break;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- maxDimension = caps.maxCubeMapTextureSize;
- break;
-
- case GL_TEXTURE_RECTANGLE_ANGLE:
- maxDimension = caps.maxRectangleTextureSize;
- break;
-
- case GL_TEXTURE_2D_ARRAY:
- maxDimension = caps.max2DTextureSize;
- break;
-
- case GL_TEXTURE_3D:
- maxDimension = caps.max3DTextureSize;
- break;
-
- default:
- context->handleError(InvalidEnum());
- return false;
- }
-
- gl::Texture *texture =
- state.getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
- if (!texture)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), TextureNotBound);
- return false;
- }
-
- if (texture->getImmutableFormat() && !isSubImage)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- const gl::InternalFormat &formatInfo =
- isSubImage ? *texture->getFormat(target, level).info
- : gl::GetInternalFormatInfo(internalformat, GL_UNSIGNED_BYTE);
-
- if (formatInfo.depthBits > 0 || formatInfo.compressed)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- if (isSubImage)
- {
- if (static_cast<size_t>(xoffset + width) > texture->getWidth(target, level) ||
- static_cast<size_t>(yoffset + height) > texture->getHeight(target, level) ||
- static_cast<size_t>(zoffset) >= texture->getDepth(target, level))
- {
- context->handleError(InvalidValue());
- return false;
- }
- }
- else
- {
- if (IsCubeMapTextureTarget(target) && width != height)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), CubemapIncomplete);
- return false;
- }
-
- if (!formatInfo.textureSupport(context->getClientVersion(), context->getExtensions()))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- int maxLevelDimension = (maxDimension >> level);
- if (static_cast<int>(width) > maxLevelDimension ||
- static_cast<int>(height) > maxLevelDimension)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), ResourceMaxTextureSize);
- return false;
- }
- }
-
- if (textureFormatOut)
- {
- *textureFormatOut = texture->getFormat(target, level);
- }
-
- // Detect texture copying feedback loops for WebGL.
- if (context->getExtensions().webglCompatibility)
- {
- if (readFramebuffer->formsCopyingFeedbackLoopWith(texture->id(), level, zoffset))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), FeedbackLoop);
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateDrawBase(ValidationContext *context, GLenum mode, GLsizei count)
-{
- switch (mode)
- {
- case GL_POINTS:
- case GL_LINES:
- case GL_LINE_LOOP:
- case GL_LINE_STRIP:
- case GL_TRIANGLES:
- case GL_TRIANGLE_STRIP:
- case GL_TRIANGLE_FAN:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidDrawMode);
- return false;
- }
-
- if (count < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeCount);
- return false;
- }
-
- const State &state = context->getGLState();
-
- const Extensions &extensions = context->getExtensions();
-
- // WebGL buffers cannot be mapped/unmapped because the MapBufferRange, FlushMappedBufferRange,
- // and UnmapBuffer entry points are removed from the WebGL 2.0 API.
- // https://www.khronos.org/registry/webgl/specs/latest/2.0/#5.14
- if (!extensions.webglCompatibility)
- {
- // Check for mapped buffers
- // TODO(jmadill): Optimize this check for non - WebGL contexts.
- if (state.hasMappedBuffer(BufferBinding::Array))
- {
- context->handleError(InvalidOperation());
- return false;
- }
- }
-
- // Note: these separate values are not supported in WebGL, due to D3D's limitations. See
- // Section 6.10 of the WebGL 1.0 spec.
- Framebuffer *framebuffer = state.getDrawFramebuffer();
- if (context->getLimitations().noSeparateStencilRefsAndMasks || extensions.webglCompatibility)
- {
- const FramebufferAttachment *dsAttachment =
- framebuffer->getStencilOrDepthStencilAttachment();
- GLuint stencilBits = dsAttachment ? dsAttachment->getStencilSize() : 0;
- GLuint minimumRequiredStencilMask = (1 << stencilBits) - 1;
- const DepthStencilState &depthStencilState = state.getDepthStencilState();
-
- bool differentRefs = state.getStencilRef() != state.getStencilBackRef();
- bool differentWritemasks =
- (depthStencilState.stencilWritemask & minimumRequiredStencilMask) !=
- (depthStencilState.stencilBackWritemask & minimumRequiredStencilMask);
- bool differentMasks = (depthStencilState.stencilMask & minimumRequiredStencilMask) !=
- (depthStencilState.stencilBackMask & minimumRequiredStencilMask);
-
- if (differentRefs || differentWritemasks || differentMasks)
- {
- if (!extensions.webglCompatibility)
- {
- ERR() << "This ANGLE implementation does not support separate front/back stencil "
- "writemasks, reference values, or stencil mask values.";
- }
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), StencilReferenceMaskOrMismatch);
- return false;
- }
- }
-
- if (framebuffer->checkStatus(context) != GL_FRAMEBUFFER_COMPLETE)
- {
- context->handleError(InvalidFramebufferOperation());
- return false;
- }
-
- gl::Program *program = state.getProgram();
- if (!program)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ProgramNotBound);
- return false;
- }
-
- // In OpenGL ES spec for UseProgram at section 7.3, trying to render without
- // vertex shader stage or fragment shader stage is a undefined behaviour.
- // But ANGLE should clearly generate an INVALID_OPERATION error instead of
- // produce undefined result.
- if (program->isLinked() &&
- (!program->hasLinkedVertexShader() || !program->hasLinkedFragmentShader()))
- {
- context->handleError(InvalidOperation() << "It is a undefined behaviour to render without "
- "vertex shader stage or fragment shader stage.");
- return false;
- }
-
- if (!program->validateSamplers(nullptr, context->getCaps()))
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- if (extensions.multiview)
- {
- const int programNumViews = program->usesMultiview() ? program->getNumViews() : 1;
- const int framebufferNumViews = framebuffer->getNumViews();
- if (framebufferNumViews != programNumViews)
- {
- context->handleError(InvalidOperation() << "The number of views in the active program "
- "and draw framebuffer does not match.");
- return false;
- }
-
- const TransformFeedback *transformFeedbackObject = state.getCurrentTransformFeedback();
- if (transformFeedbackObject != nullptr && transformFeedbackObject->isActive() &&
- framebufferNumViews > 1)
- {
- context->handleError(InvalidOperation()
- << "There is an active transform feedback object "
- "when the number of views in the active draw "
- "framebuffer is greater than 1.");
- return false;
- }
-
- if (extensions.disjointTimerQuery && framebufferNumViews > 1 &&
- state.isQueryActive(GL_TIME_ELAPSED_EXT))
- {
- context->handleError(InvalidOperation() << "There is an active query for target "
- "GL_TIME_ELAPSED_EXT when the number of "
- "views in the active draw framebuffer is "
- "greater than 1.");
- return false;
- }
- }
-
- // Uniform buffer validation
- for (unsigned int uniformBlockIndex = 0;
- uniformBlockIndex < program->getActiveUniformBlockCount(); uniformBlockIndex++)
- {
- const gl::InterfaceBlock &uniformBlock = program->getUniformBlockByIndex(uniformBlockIndex);
- GLuint blockBinding = program->getUniformBlockBinding(uniformBlockIndex);
- const OffsetBindingPointer<Buffer> &uniformBuffer =
- state.getIndexedUniformBuffer(blockBinding);
-
- if (uniformBuffer.get() == nullptr)
- {
- // undefined behaviour
- context->handleError(
- InvalidOperation()
- << "It is undefined behaviour to have a used but unbound uniform buffer.");
- return false;
- }
-
- size_t uniformBufferSize = uniformBuffer.getSize();
- if (uniformBufferSize == 0)
- {
- // Bind the whole buffer.
- uniformBufferSize = static_cast<size_t>(uniformBuffer->getSize());
- }
-
- if (uniformBufferSize < uniformBlock.dataSize)
- {
- // undefined behaviour
- context->handleError(
- InvalidOperation()
- << "It is undefined behaviour to use a uniform buffer that is too small.");
- return false;
- }
- }
-
- // Do some additonal WebGL-specific validation
- if (extensions.webglCompatibility)
- {
- // Detect rendering feedback loops for WebGL.
- if (framebuffer->formsRenderingFeedbackLoopWith(state))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), FeedbackLoop);
- return false;
- }
-
- // Detect that the vertex shader input types match the attribute types
- if (!ValidateVertexShaderAttributeTypeMatch(context))
- {
- return false;
- }
-
- // Detect that the color buffer types match the fragment shader output types
- if (!ValidateFragmentShaderColorBufferTypeMatch(context))
- {
- return false;
- }
- }
-
- // No-op if zero count
- return (count > 0);
-}
-
-bool ValidateDrawArraysCommon(ValidationContext *context,
- GLenum mode,
- GLint first,
- GLsizei count,
- GLsizei primcount)
-{
- if (first < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeStart);
- return false;
- }
-
- const State &state = context->getGLState();
- gl::TransformFeedback *curTransformFeedback = state.getCurrentTransformFeedback();
- if (curTransformFeedback && curTransformFeedback->isActive() &&
- !curTransformFeedback->isPaused() && curTransformFeedback->getPrimitiveMode() != mode)
- {
- // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
- // that does not match the current transform feedback object's draw mode (if transform
- // feedback
- // is active), (3.0.2, section 2.14, pg 86)
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidDrawModeTransformFeedback);
- return false;
- }
-
- if (!ValidateDrawBase(context, mode, count))
- {
- return false;
- }
-
- // Check the computation of maxVertex doesn't overflow.
- // - first < 0 or count < 0 have been checked as an error condition
- // - count > 0 has been checked in ValidateDrawBase as it makes the call a noop
- // From this we know maxVertex will be positive, and only need to check if it overflows GLint.
- ASSERT(count > 0 && first >= 0);
- int64_t maxVertex = static_cast<int64_t>(first) + static_cast<int64_t>(count) - 1;
- if (maxVertex > static_cast<int64_t>(std::numeric_limits<GLint>::max()))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), IntegerOverflow);
- return false;
- }
-
- if (!ValidateDrawAttribs(context, primcount, static_cast<GLint>(maxVertex), count))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateDrawArraysInstancedANGLE(Context *context,
- GLenum mode,
- GLint first,
- GLsizei count,
- GLsizei primcount)
-{
- if (!context->getExtensions().instancedArrays)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- if (!ValidateDrawArraysInstancedBase(context, mode, first, count, primcount))
- {
- return false;
- }
-
- return ValidateDrawInstancedANGLE(context);
-}
-
-bool ValidateDrawElementsBase(ValidationContext *context, GLenum type)
-{
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- case GL_UNSIGNED_SHORT:
- break;
- case GL_UNSIGNED_INT:
- if (context->getClientMajorVersion() < 3 && !context->getExtensions().elementIndexUint)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), TypeNotUnsignedShortByte);
- return false;
- }
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), TypeNotUnsignedShortByte);
- return false;
- }
-
- const State &state = context->getGLState();
-
- gl::TransformFeedback *curTransformFeedback = state.getCurrentTransformFeedback();
- if (curTransformFeedback && curTransformFeedback->isActive() &&
- !curTransformFeedback->isPaused())
- {
- // It is an invalid operation to call DrawElements, DrawRangeElements or
- // DrawElementsInstanced
- // while transform feedback is active, (3.0.2, section 2.14, pg 86)
- context->handleError(InvalidOperation());
- return false;
- }
-
- return true;
-}
-
-bool ValidateDrawElementsCommon(ValidationContext *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei primcount)
-{
- if (!ValidateDrawElementsBase(context, type))
- return false;
-
- const State &state = context->getGLState();
-
- if (!ValidateDrawBase(context, mode, count))
- {
- return false;
- }
-
- // WebGL buffers cannot be mapped/unmapped because the MapBufferRange, FlushMappedBufferRange,
- // and UnmapBuffer entry points are removed from the WebGL 2.0 API.
- // https://www.khronos.org/registry/webgl/specs/latest/2.0/#5.14
- if (!context->getExtensions().webglCompatibility)
- {
- // Check for mapped buffers
- // TODO(jmadill): Optimize this check for non - WebGL contexts.
- if (state.hasMappedBuffer(gl::BufferBinding::ElementArray))
- {
- context->handleError(InvalidOperation() << "Index buffer is mapped.");
- return false;
- }
- }
-
- const gl::VertexArray *vao = state.getVertexArray();
- gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get();
-
- GLuint typeBytes = gl::GetTypeInfo(type).bytes;
-
- if (context->getExtensions().webglCompatibility)
- {
- ASSERT(isPow2(typeBytes) && typeBytes > 0);
- if ((reinterpret_cast<uintptr_t>(indices) & static_cast<uintptr_t>(typeBytes - 1)) != 0)
- {
- // [WebGL 1.0] Section 6.4 Buffer Offset and Stride Requirements
- // The offset arguments to drawElements and [...], must be a multiple of the size of the
- // data type passed to the call, or an INVALID_OPERATION error is generated.
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), OffsetMustBeMultipleOfType);
- return false;
- }
-
- // [WebGL 1.0] Section 6.4 Buffer Offset and Stride Requirements
- // In addition the offset argument to drawElements must be non-negative or an INVALID_VALUE
- // error is generated.
- if (reinterpret_cast<intptr_t>(indices) < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeOffset);
- return false;
- }
- }
-
- if (context->getExtensions().webglCompatibility ||
- !context->getGLState().areClientArraysEnabled())
- {
- if (!elementArrayBuffer && count > 0)
- {
- // [WebGL 1.0] Section 6.2 No Client Side Arrays
- // If drawElements is called with a count greater than zero, and no WebGLBuffer is bound
- // to the ELEMENT_ARRAY_BUFFER binding point, an INVALID_OPERATION error is generated.
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MustHaveElementArrayBinding);
- return false;
- }
- }
-
- if (count > 0)
- {
- if (elementArrayBuffer)
- {
- // The max possible type size is 8 and count is on 32 bits so doing the multiplication
- // in a 64 bit integer is safe. Also we are guaranteed that here count > 0.
- static_assert(std::is_same<int, GLsizei>::value, "GLsizei isn't the expected type");
- constexpr uint64_t kMaxTypeSize = 8;
- constexpr uint64_t kIntMax = std::numeric_limits<int>::max();
- constexpr uint64_t kUint64Max = std::numeric_limits<uint64_t>::max();
- static_assert(kIntMax < kUint64Max / kMaxTypeSize, "");
-
- uint64_t typeSize = typeBytes;
- uint64_t elementCount = static_cast<uint64_t>(count);
- ASSERT(elementCount > 0 && typeSize <= kMaxTypeSize);
-
- // Doing the multiplication here is overflow-safe
- uint64_t elementDataSizeNoOffset = typeSize * elementCount;
-
- // The offset can be any value, check for overflows
- uint64_t offset = static_cast<uint64_t>(reinterpret_cast<uintptr_t>(indices));
- if (elementDataSizeNoOffset > kUint64Max - offset)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), IntegerOverflow);
- return false;
- }
-
- uint64_t elementDataSizeWithOffset = elementDataSizeNoOffset + offset;
- if (elementDataSizeWithOffset > static_cast<uint64_t>(elementArrayBuffer->getSize()))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InsufficientBufferSize);
- return false;
- }
-
- ASSERT(isPow2(typeSize) && typeSize > 0);
- if ((elementArrayBuffer->getSize() & (typeSize - 1)) != 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MismatchedByteCountType);
- return false;
- }
- }
- else if (!indices)
- {
- // This is an application error that would normally result in a crash,
- // but we catch it and return an error
- context->handleError(InvalidOperation() << "No element array buffer and no pointer.");
- return false;
- }
- }
-
- if (context->getExtensions().robustBufferAccessBehavior)
- {
- // Here we use maxVertex = 0 and vertexCount = 1 to avoid retrieving IndexRange when robust
- // access is enabled.
- if (!ValidateDrawAttribs(context, primcount, 0, 1))
- {
- return false;
- }
- }
- else
- {
- // Use the parameter buffer to retrieve and cache the index range.
- const auto &params = context->getParams<HasIndexRange>();
- const auto &indexRangeOpt = params.getIndexRange();
- if (!indexRangeOpt.valid())
- {
- // Unexpected error.
- return false;
- }
-
- // If we use an index greater than our maximum supported index range, return an error.
- // The ES3 spec does not specify behaviour here, it is undefined, but ANGLE should always
- // return an error if possible here.
- if (static_cast<GLuint64>(indexRangeOpt.value().end) >= context->getCaps().maxElementIndex)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExceedsMaxElement);
- return false;
- }
-
- if (!ValidateDrawAttribs(context, primcount, static_cast<GLint>(indexRangeOpt.value().end),
- static_cast<GLint>(indexRangeOpt.value().vertexCount())))
- {
- return false;
- }
-
- // No op if there are no real indices in the index data (all are primitive restart).
- return (indexRangeOpt.value().vertexIndexCount > 0);
- }
-
- return true;
-}
-
-bool ValidateDrawElementsInstancedCommon(ValidationContext *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei primcount)
-{
- return ValidateDrawElementsInstancedBase(context, mode, count, type, indices, primcount);
-}
-
-bool ValidateDrawElementsInstancedANGLE(Context *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei primcount)
-{
- if (!context->getExtensions().instancedArrays)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- if (!ValidateDrawElementsInstancedBase(context, mode, count, type, indices, primcount))
- {
- return false;
- }
-
- return ValidateDrawInstancedANGLE(context);
-}
-
-bool ValidateFramebufferTextureBase(Context *context,
- GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level)
-{
- if (!ValidFramebufferTarget(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFramebufferTarget);
- return false;
- }
-
- if (!ValidateAttachmentTarget(context, attachment))
- {
- return false;
- }
-
- if (texture != 0)
- {
- gl::Texture *tex = context->getTexture(texture);
-
- if (tex == NULL)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- if (level < 0)
- {
- context->handleError(InvalidValue());
- return false;
- }
- }
-
- const gl::Framebuffer *framebuffer = context->getGLState().getTargetFramebuffer(target);
- ASSERT(framebuffer);
-
- if (framebuffer->id() == 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), DefaultFramebufferTarget);
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetUniformBase(Context *context, GLuint program, GLint location)
-{
- if (program == 0)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- gl::Program *programObject = GetValidProgram(context, program);
- if (!programObject)
- {
- return false;
- }
-
- if (!programObject || !programObject->isLinked())
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ProgramNotLinked);
- return false;
- }
-
- if (!programObject->isValidUniformLocation(location))
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- return true;
-}
-
-static bool ValidateSizedGetUniform(Context *context,
- GLuint program,
- GLint location,
- GLsizei bufSize,
- GLsizei *length)
-{
- if (length)
- {
- *length = 0;
- }
-
- if (!ValidateGetUniformBase(context, program, location))
- {
- return false;
- }
-
- if (bufSize < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeBufferSize);
- return false;
- }
-
- gl::Program *programObject = context->getProgram(program);
- ASSERT(programObject);
-
- // sized queries -- ensure the provided buffer is large enough
- const LinkedUniform &uniform = programObject->getUniformByLocation(location);
- size_t requiredBytes = VariableExternalSize(uniform.type);
- if (static_cast<size_t>(bufSize) < requiredBytes)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InsufficientBufferSize);
- return false;
- }
-
- if (length)
- {
- *length = VariableComponentCount(uniform.type);
- }
-
- return true;
-}
-
-bool ValidateGetnUniformfvEXT(Context *context,
- GLuint program,
- GLint location,
- GLsizei bufSize,
- GLfloat *params)
-{
- return ValidateSizedGetUniform(context, program, location, bufSize, nullptr);
-}
-
-bool ValidateGetnUniformivEXT(Context *context,
- GLuint program,
- GLint location,
- GLsizei bufSize,
- GLint *params)
-{
- return ValidateSizedGetUniform(context, program, location, bufSize, nullptr);
-}
-
-bool ValidateGetUniformfvRobustANGLE(Context *context,
- GLuint program,
- GLint location,
- GLsizei bufSize,
- GLsizei *length,
- GLfloat *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- // bufSize is validated in ValidateSizedGetUniform
- return ValidateSizedGetUniform(context, program, location, bufSize, length);
-}
-
-bool ValidateGetUniformivRobustANGLE(Context *context,
- GLuint program,
- GLint location,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- // bufSize is validated in ValidateSizedGetUniform
- return ValidateSizedGetUniform(context, program, location, bufSize, length);
-}
-
-bool ValidateGetUniformuivRobustANGLE(Context *context,
- GLuint program,
- GLint location,
- GLsizei bufSize,
- GLsizei *length,
- GLuint *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- // bufSize is validated in ValidateSizedGetUniform
- return ValidateSizedGetUniform(context, program, location, bufSize, length);
-}
-
-bool ValidateDiscardFramebufferBase(Context *context,
- GLenum target,
- GLsizei numAttachments,
- const GLenum *attachments,
- bool defaultFramebuffer)
-{
- if (numAttachments < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeAttachments);
- return false;
- }
-
- for (GLsizei i = 0; i < numAttachments; ++i)
- {
- if (attachments[i] >= GL_COLOR_ATTACHMENT0 && attachments[i] <= GL_COLOR_ATTACHMENT31)
- {
- if (defaultFramebuffer)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), DefaultFramebufferInvalidAttachment);
- return false;
- }
-
- if (attachments[i] >= GL_COLOR_ATTACHMENT0 + context->getCaps().maxColorAttachments)
- {
- context->handleError(InvalidOperation() << "Requested color attachment is "
- "greater than the maximum supported "
- "color attachments");
- return false;
- }
- }
- else
- {
- switch (attachments[i])
- {
- case GL_DEPTH_ATTACHMENT:
- case GL_STENCIL_ATTACHMENT:
- case GL_DEPTH_STENCIL_ATTACHMENT:
- if (defaultFramebuffer)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(),
- DefaultFramebufferInvalidAttachment);
- return false;
- }
- break;
- case GL_COLOR:
- case GL_DEPTH:
- case GL_STENCIL:
- if (!defaultFramebuffer)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(),
- DefaultFramebufferInvalidAttachment);
- return false;
- }
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidAttachment);
- return false;
- }
- }
- }
-
- return true;
-}
-
-bool ValidateInsertEventMarkerEXT(Context *context, GLsizei length, const char *marker)
-{
- // Note that debug marker calls must not set error state
-
- if (length < 0)
- {
- return false;
- }
-
- if (marker == nullptr)
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidatePushGroupMarkerEXT(Context *context, GLsizei length, const char *marker)
-{
- // Note that debug marker calls must not set error state
-
- if (length < 0)
- {
- return false;
- }
-
- if (length > 0 && marker == nullptr)
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateEGLImageTargetTexture2DOES(Context *context,
- GLenum target,
- egl::Image *image)
-{
- if (!context->getExtensions().eglImage && !context->getExtensions().eglImageExternal)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- switch (target)
- {
- case GL_TEXTURE_2D:
- if (!context->getExtensions().eglImage)
- {
- context->handleError(InvalidEnum()
- << "GL_TEXTURE_2D texture target requires GL_OES_EGL_image.");
- }
- break;
-
- case GL_TEXTURE_EXTERNAL_OES:
- if (!context->getExtensions().eglImageExternal)
- {
- context->handleError(InvalidEnum() << "GL_TEXTURE_EXTERNAL_OES texture target "
- "requires GL_OES_EGL_image_external.");
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTextureTarget);
- return false;
- }
-
- ASSERT(context->getCurrentDisplay());
- if (!context->getCurrentDisplay()->isValidImage(image))
- {
- context->handleError(InvalidValue() << "EGL image is not valid.");
- return false;
- }
-
- if (image->getSamples() > 0)
- {
- context->handleError(InvalidOperation()
- << "cannot create a 2D texture from a multisampled EGL image.");
- return false;
- }
-
- const TextureCaps &textureCaps =
- context->getTextureCaps().get(image->getFormat().info->sizedInternalFormat);
- if (!textureCaps.texturable)
- {
- context->handleError(InvalidOperation()
- << "EGL image internal format is not supported as a texture.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateEGLImageTargetRenderbufferStorageOES(Context *context,
- GLenum target,
- egl::Image *image)
-{
- if (!context->getExtensions().eglImage)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- switch (target)
- {
- case GL_RENDERBUFFER:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidRenderbufferTarget);
- return false;
- }
-
- ASSERT(context->getCurrentDisplay());
- if (!context->getCurrentDisplay()->isValidImage(image))
- {
- context->handleError(InvalidValue() << "EGL image is not valid.");
- return false;
- }
-
- const TextureCaps &textureCaps =
- context->getTextureCaps().get(image->getFormat().info->sizedInternalFormat);
- if (!textureCaps.renderable)
- {
- context->handleError(InvalidOperation()
- << "EGL image internal format is not supported as a renderbuffer.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateBindVertexArrayBase(Context *context, GLuint array)
-{
- if (!context->isVertexArrayGenerated(array))
- {
- // The default VAO should always exist
- ASSERT(array != 0);
- context->handleError(InvalidOperation());
- return false;
- }
-
- return true;
-}
-
-bool ValidateProgramBinaryBase(Context *context,
- GLuint program,
- GLenum binaryFormat,
- const void *binary,
- GLint length)
-{
- Program *programObject = GetValidProgram(context, program);
- if (programObject == nullptr)
- {
- return false;
- }
-
- const std::vector<GLenum> &programBinaryFormats = context->getCaps().programBinaryFormats;
- if (std::find(programBinaryFormats.begin(), programBinaryFormats.end(), binaryFormat) ==
- programBinaryFormats.end())
- {
- context->handleError(InvalidEnum() << "Program binary format is not valid.");
- return false;
- }
-
- if (context->hasActiveTransformFeedback(program))
- {
- // ES 3.0.4 section 2.15 page 91
- context->handleError(InvalidOperation() << "Cannot change program binary while program "
- "is associated with an active transform "
- "feedback object.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetProgramBinaryBase(Context *context,
- GLuint program,
- GLsizei bufSize,
- GLsizei *length,
- GLenum *binaryFormat,
- void *binary)
-{
- Program *programObject = GetValidProgram(context, program);
- if (programObject == nullptr)
- {
- return false;
- }
-
- if (!programObject->isLinked())
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ProgramNotLinked);
- return false;
- }
-
- if (context->getCaps().programBinaryFormats.empty())
- {
- context->handleError(InvalidOperation() << "No program binary formats supported.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateDrawBuffersBase(ValidationContext *context, GLsizei n, const GLenum *bufs)
-{
- // INVALID_VALUE is generated if n is negative or greater than value of MAX_DRAW_BUFFERS
- if (n < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeCount);
- return false;
- }
- if (static_cast<GLuint>(n) > context->getCaps().maxDrawBuffers)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), IndexExceedsMaxDrawBuffer);
- return false;
- }
-
- ASSERT(context->getGLState().getDrawFramebuffer());
- GLuint frameBufferId = context->getGLState().getDrawFramebuffer()->id();
- GLuint maxColorAttachment = GL_COLOR_ATTACHMENT0_EXT + context->getCaps().maxColorAttachments;
-
- // This should come first before the check for the default frame buffer
- // because when we switch to ES3.1+, invalid enums will return INVALID_ENUM
- // rather than INVALID_OPERATION
- for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
- {
- const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
-
- if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != GL_BACK &&
- (bufs[colorAttachment] < GL_COLOR_ATTACHMENT0 ||
- bufs[colorAttachment] > GL_COLOR_ATTACHMENT31))
- {
- // Value in bufs is not NONE, BACK, or GL_COLOR_ATTACHMENTi
- // The 3.0.4 spec says to generate GL_INVALID_OPERATION here, but this
- // was changed to GL_INVALID_ENUM in 3.1, which dEQP also expects.
- // 3.1 is still a bit ambiguous about the error, but future specs are
- // expected to clarify that GL_INVALID_ENUM is the correct error.
- context->handleError(InvalidEnum() << "Invalid buffer value");
- return false;
- }
- else if (bufs[colorAttachment] >= maxColorAttachment)
- {
- context->handleError(InvalidOperation()
- << "Buffer value is greater than MAX_DRAW_BUFFERS");
- return false;
- }
- else if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment &&
- frameBufferId != 0)
- {
- // INVALID_OPERATION-GL is bound to buffer and ith argument
- // is not COLOR_ATTACHMENTi or NONE
- context->handleError(InvalidOperation()
- << "Ith value does not match COLOR_ATTACHMENTi or NONE");
- return false;
- }
- }
-
- // INVALID_OPERATION is generated if GL is bound to the default framebuffer
- // and n is not 1 or bufs is bound to value other than BACK and NONE
- if (frameBufferId == 0)
- {
- if (n != 1)
- {
- context->handleError(InvalidOperation()
- << "n must be 1 when GL is bound to the default framebuffer");
- return false;
- }
-
- if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
- {
- context->handleError(
- InvalidOperation()
- << "Only NONE or BACK are valid values when drawing to the default framebuffer");
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateGetBufferPointervBase(Context *context,
- BufferBinding target,
- GLenum pname,
- GLsizei *length,
- void **params)
-{
- if (length)
- {
- *length = 0;
- }
-
- if (context->getClientMajorVersion() < 3 && !context->getExtensions().mapBuffer)
- {
- context->handleError(
- InvalidOperation()
- << "Context does not support OpenGL ES 3.0 or GL_OES_mapbuffer is not enabled.");
- return false;
- }
-
- if (!ValidBufferType(context, target))
- {
- context->handleError(InvalidEnum() << "Buffer target not valid");
- return false;
- }
-
- switch (pname)
- {
- case GL_BUFFER_MAP_POINTER:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- // GLES 3.0 section 2.10.1: "Attempts to attempts to modify or query buffer object state for a
- // target bound to zero generate an INVALID_OPERATION error."
- // GLES 3.1 section 6.6 explicitly specifies this error.
- if (context->getGLState().getTargetBuffer(target) == nullptr)
- {
- context->handleError(InvalidOperation()
- << "Cannot get pointer for reserved buffer name zero.");
- return false;
- }
-
- if (length)
- {
- *length = 1;
- }
-
- return true;
-}
-
-bool ValidateUnmapBufferBase(Context *context, BufferBinding target)
-{
- if (!ValidBufferType(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidBufferTypes);
- return false;
- }
-
- Buffer *buffer = context->getGLState().getTargetBuffer(target);
-
- if (buffer == nullptr || !buffer->isMapped())
- {
- context->handleError(InvalidOperation() << "Buffer not mapped.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateMapBufferRangeBase(Context *context,
- BufferBinding target,
- GLintptr offset,
- GLsizeiptr length,
- GLbitfield access)
-{
- if (!ValidBufferType(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidBufferTypes);
- return false;
- }
-
- if (offset < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeOffset);
- return false;
- }
-
- if (length < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeLength);
- return false;
- }
-
- Buffer *buffer = context->getGLState().getTargetBuffer(target);
-
- if (!buffer)
- {
- context->handleError(InvalidOperation() << "Attempted to map buffer object zero.");
- return false;
- }
-
- // Check for buffer overflow
- CheckedNumeric<size_t> checkedOffset(offset);
- auto checkedSize = checkedOffset + length;
-
- if (!checkedSize.IsValid() || checkedSize.ValueOrDie() > static_cast<size_t>(buffer->getSize()))
- {
- context->handleError(InvalidValue() << "Mapped range does not fit into buffer dimensions.");
- return false;
- }
-
- // Check for invalid bits in the mask
- GLbitfield allAccessBits = GL_MAP_READ_BIT | GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT |
- GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_FLUSH_EXPLICIT_BIT |
- GL_MAP_UNSYNCHRONIZED_BIT;
-
- if (access & ~(allAccessBits))
- {
- context->handleError(InvalidValue()
- << "Invalid access bits: 0x" << std::hex << std::uppercase << access);
- return false;
- }
-
- if (length == 0)
- {
- context->handleError(InvalidOperation() << "Buffer mapping length is zero.");
- return false;
- }
-
- if (buffer->isMapped())
- {
- context->handleError(InvalidOperation() << "Buffer is already mapped.");
- return false;
- }
-
- // Check for invalid bit combinations
- if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
- {
- context->handleError(InvalidOperation()
- << "Need to map buffer for either reading or writing.");
- return false;
- }
-
- GLbitfield writeOnlyBits =
- GL_MAP_INVALIDATE_RANGE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_UNSYNCHRONIZED_BIT;
-
- if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
- {
- context->handleError(InvalidOperation()
- << "Invalid access bits when mapping buffer for reading: 0x"
- << std::hex << std::uppercase << access);
- return false;
- }
-
- if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
- {
- context->handleError(
- InvalidOperation()
- << "The explicit flushing bit may only be set if the buffer is mapped for writing.");
- return false;
- }
-
- return ValidateMapBufferBase(context, target);
-}
-
-bool ValidateFlushMappedBufferRangeBase(Context *context,
- BufferBinding target,
- GLintptr offset,
- GLsizeiptr length)
-{
- if (offset < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeOffset);
- return false;
- }
-
- if (length < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeLength);
- return false;
- }
-
- if (!ValidBufferType(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidBufferTypes);
- return false;
- }
-
- Buffer *buffer = context->getGLState().getTargetBuffer(target);
-
- if (buffer == nullptr)
- {
- context->handleError(InvalidOperation() << "Attempted to flush buffer object zero.");
- return false;
- }
-
- if (!buffer->isMapped() || (buffer->getAccessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
- {
- context->handleError(InvalidOperation()
- << "Attempted to flush a buffer not mapped for explicit flushing.");
- return false;
- }
-
- // Check for buffer overflow
- CheckedNumeric<size_t> checkedOffset(offset);
- auto checkedSize = checkedOffset + length;
-
- if (!checkedSize.IsValid() ||
- checkedSize.ValueOrDie() > static_cast<size_t>(buffer->getMapLength()))
- {
- context->handleError(InvalidValue()
- << "Flushed range does not fit into buffer mapping dimensions.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateGenOrDelete(Context *context, GLint n)
-{
- if (n < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeCount);
- return false;
- }
- return true;
-}
-
-bool ValidateRobustEntryPoint(ValidationContext *context, GLsizei bufSize)
-{
- if (!context->getExtensions().robustClientMemory)
- {
- context->handleError(InvalidOperation()
- << "GL_ANGLE_robust_client_memory is not available.");
- return false;
- }
-
- if (bufSize < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeBufferSize);
- return false;
- }
-
- return true;
-}
-
-bool ValidateRobustBufferSize(ValidationContext *context, GLsizei bufSize, GLsizei numParams)
-{
- if (bufSize < numParams)
- {
- context->handleError(InvalidOperation() << numParams << " parameters are required but "
- << bufSize << " were provided.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetFramebufferAttachmentParameterivBase(ValidationContext *context,
- GLenum target,
- GLenum attachment,
- GLenum pname,
- GLsizei *numParams)
-{
- if (!ValidFramebufferTarget(context, target))
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- int clientVersion = context->getClientMajorVersion();
-
- switch (pname)
- {
- case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
- case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
- 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)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
- if (clientVersion < 3 && !context->getExtensions().sRGB)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
- case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
- case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
- case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
- case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
- case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
- case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
- if (clientVersion < 3)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
-
- default:
- context->handleError(InvalidEnum());
- return false;
- }
-
- // Determine if the attachment is a valid enum
- switch (attachment)
- {
- case GL_BACK:
- case GL_DEPTH:
- case GL_STENCIL:
- if (clientVersion < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidAttachment);
- return false;
- }
- break;
-
- case GL_DEPTH_STENCIL_ATTACHMENT:
- if (clientVersion < 3 && !context->isWebGL1())
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidAttachment);
- return false;
- }
- break;
-
- case GL_COLOR_ATTACHMENT0:
- case GL_DEPTH_ATTACHMENT:
- case GL_STENCIL_ATTACHMENT:
- break;
-
- default:
- if ((clientVersion < 3 && !context->getExtensions().drawBuffers) ||
- attachment < GL_COLOR_ATTACHMENT0_EXT ||
- (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getCaps().maxColorAttachments)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidAttachment);
- return false;
- }
- break;
- }
-
- const Framebuffer *framebuffer = context->getGLState().getTargetFramebuffer(target);
- ASSERT(framebuffer);
-
- if (framebuffer->id() == 0)
- {
- if (clientVersion < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), DefaultFramebufferTarget);
- return false;
- }
-
- switch (attachment)
- {
- case GL_BACK:
- case GL_DEPTH:
- case GL_STENCIL:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidAttachment);
- return false;
- }
- }
- else
- {
- if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
- {
- // Valid attachment query
- }
- else
- {
- switch (attachment)
- {
- case GL_DEPTH_ATTACHMENT:
- case GL_STENCIL_ATTACHMENT:
- break;
-
- case GL_DEPTH_STENCIL_ATTACHMENT:
- if (!framebuffer->hasValidDepthStencil() && !context->isWebGL1())
- {
- context->handleError(InvalidOperation());
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidAttachment);
- return false;
- }
- }
- }
-
- const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
- if (attachmentObject)
- {
- ASSERT(attachmentObject->type() == GL_RENDERBUFFER ||
- attachmentObject->type() == GL_TEXTURE ||
- attachmentObject->type() == GL_FRAMEBUFFER_DEFAULT);
-
- switch (pname)
- {
- case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
- if (attachmentObject->type() != GL_RENDERBUFFER &&
- attachmentObject->type() != GL_TEXTURE)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), FramebufferIncompleteAttachment);
- return false;
- }
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
- if (attachmentObject->type() != GL_TEXTURE)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), FramebufferIncompleteAttachment);
- return false;
- }
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
- if (attachmentObject->type() != GL_TEXTURE)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), FramebufferIncompleteAttachment);
- return false;
- }
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
- if (attachment == GL_DEPTH_STENCIL_ATTACHMENT)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidAttachment);
- return false;
- }
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
- if (attachmentObject->type() != GL_TEXTURE)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), FramebufferIncompleteAttachment);
- return false;
- }
- break;
-
- default:
- break;
- }
- }
- else
- {
- // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
- // is NONE, then querying any other pname will generate INVALID_ENUM.
-
- // ES 3.0.2 spec pg 235 states that if the attachment type is none,
- // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
- // INVALID_OPERATION for all other pnames
-
- switch (pname)
- {
- case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
- if (clientVersion < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(),
- InvalidFramebufferAttachmentParameter);
- return false;
- }
- break;
-
- default:
- if (clientVersion < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(),
- InvalidFramebufferAttachmentParameter);
- return false;
- }
- else
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(),
- InvalidFramebufferAttachmentParameter);
- return false;
- }
- }
- }
-
- 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;
- }
- }
-
- return true;
-}
-
-bool ValidateGetFramebufferAttachmentParameterivRobustANGLE(ValidationContext *context,
- GLenum target,
- GLenum attachment,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *numParams)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetFramebufferAttachmentParameterivBase(context, target, attachment, pname,
- numParams))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *numParams))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetBufferParameterivRobustANGLE(ValidationContext *context,
- BufferBinding target,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetBufferParameterBase(context, target, pname, false, length))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetBufferParameteri64vRobustANGLE(ValidationContext *context,
- BufferBinding target,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint64 *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetBufferParameterBase(context, target, pname, false, length))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetProgramivBase(ValidationContext *context,
- GLuint program,
- GLenum pname,
- GLsizei *numParams)
-{
- // Currently, all GetProgramiv queries return 1 parameter
- if (numParams)
- {
- *numParams = 1;
- }
-
- Program *programObject = GetValidProgram(context, program);
- if (!programObject)
- {
- return false;
- }
-
- switch (pname)
- {
- case GL_DELETE_STATUS:
- case GL_LINK_STATUS:
- case GL_VALIDATE_STATUS:
- case GL_INFO_LOG_LENGTH:
- case GL_ATTACHED_SHADERS:
- case GL_ACTIVE_ATTRIBUTES:
- case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
- case GL_ACTIVE_UNIFORMS:
- case GL_ACTIVE_UNIFORM_MAX_LENGTH:
- break;
-
- case GL_PROGRAM_BINARY_LENGTH:
- if (context->getClientMajorVersion() < 3 && !context->getExtensions().getProgramBinary)
- {
- context->handleError(InvalidEnum() << "Querying GL_PROGRAM_BINARY_LENGTH "
- "requires GL_OES_get_program_binary or "
- "ES 3.0.");
- return false;
- }
- break;
-
- case GL_ACTIVE_UNIFORM_BLOCKS:
- case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
- case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
- case GL_TRANSFORM_FEEDBACK_VARYINGS:
- case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
- case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), ES3Required);
- return false;
- }
- break;
-
- case GL_PROGRAM_SEPARABLE:
- case GL_COMPUTE_WORK_GROUP_SIZE:
- case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
- if (context->getClientVersion() < Version(3, 1))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), ES31Required);
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetProgramivRobustANGLE(Context *context,
- GLuint program,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *numParams)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetProgramivBase(context, program, pname, numParams))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *numParams))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetRenderbufferParameterivRobustANGLE(Context *context,
- GLenum target,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetRenderbufferParameterivBase(context, target, pname, length))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetShaderivRobustANGLE(Context *context,
- GLuint shader,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetShaderivBase(context, shader, pname, length))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetTexParameterfvRobustANGLE(Context *context,
- GLenum target,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLfloat *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetTexParameterBase(context, target, pname, length))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetTexParameterivRobustANGLE(Context *context,
- GLenum target,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetTexParameterBase(context, target, pname, length))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateTexParameterfvRobustANGLE(Context *context,
- GLenum target,
- GLenum pname,
- GLsizei bufSize,
- const GLfloat *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- return ValidateTexParameterBase(context, target, pname, bufSize, params);
-}
-
-bool ValidateTexParameterivRobustANGLE(Context *context,
- GLenum target,
- GLenum pname,
- GLsizei bufSize,
- const GLint *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- return ValidateTexParameterBase(context, target, pname, bufSize, params);
-}
-
-bool ValidateGetSamplerParameterfvRobustANGLE(Context *context,
- GLuint sampler,
- GLenum pname,
- GLuint bufSize,
- GLsizei *length,
- GLfloat *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetSamplerParameterBase(context, sampler, pname, length))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetSamplerParameterivRobustANGLE(Context *context,
- GLuint sampler,
- GLenum pname,
- GLuint bufSize,
- GLsizei *length,
- GLint *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetSamplerParameterBase(context, sampler, pname, length))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateSamplerParameterfvRobustANGLE(Context *context,
- GLuint sampler,
- GLenum pname,
- GLsizei bufSize,
- const GLfloat *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- return ValidateSamplerParameterBase(context, sampler, pname, bufSize, params);
-}
-
-bool ValidateSamplerParameterivRobustANGLE(Context *context,
- GLuint sampler,
- GLenum pname,
- GLsizei bufSize,
- const GLint *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- return ValidateSamplerParameterBase(context, sampler, pname, bufSize, params);
-}
-
-bool ValidateGetVertexAttribfvRobustANGLE(Context *context,
- GLuint index,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLfloat *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetVertexAttribBase(context, index, pname, length, false, false))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetVertexAttribivRobustANGLE(Context *context,
- GLuint index,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetVertexAttribBase(context, index, pname, length, false, false))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetVertexAttribPointervRobustANGLE(Context *context,
- GLuint index,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- void **pointer)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetVertexAttribBase(context, index, pname, length, true, false))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetVertexAttribIivRobustANGLE(Context *context,
- GLuint index,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetVertexAttribBase(context, index, pname, length, false, true))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetVertexAttribIuivRobustANGLE(Context *context,
- GLuint index,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLuint *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetVertexAttribBase(context, index, pname, length, false, true))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetActiveUniformBlockivRobustANGLE(Context *context,
- GLuint program,
- GLuint uniformBlockIndex,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetActiveUniformBlockivBase(context, program, uniformBlockIndex, pname, length))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetInternalFormativRobustANGLE(Context *context,
- GLenum target,
- GLenum internalformat,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetInternalFormativBase(context, target, internalformat, pname, bufSize, length))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateVertexFormatBase(ValidationContext *context,
- GLuint attribIndex,
- GLint size,
- GLenum type,
- GLboolean pureInteger)
-{
- const Caps &caps = context->getCaps();
- if (attribIndex >= caps.maxVertexAttributes)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), IndexExceedsMaxVertexAttribute);
- return false;
- }
-
- if (size < 1 || size > 4)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidVertexAttrSize);
- return false;
- }
-
- switch (type)
- {
- case GL_BYTE:
- case GL_UNSIGNED_BYTE:
- case GL_SHORT:
- case GL_UNSIGNED_SHORT:
- break;
-
- case GL_INT:
- case GL_UNSIGNED_INT:
- if (context->getClientMajorVersion() < 3)
- {
- context->handleError(InvalidEnum()
- << "Vertex type not supported before OpenGL ES 3.0.");
- return false;
- }
- break;
-
- case GL_FIXED:
- case GL_FLOAT:
- if (pureInteger)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTypePureInt);
- return false;
- }
- break;
-
- case GL_HALF_FLOAT:
- if (context->getClientMajorVersion() < 3)
- {
- context->handleError(InvalidEnum()
- << "Vertex type not supported before OpenGL ES 3.0.");
- return false;
- }
- if (pureInteger)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTypePureInt);
- return false;
- }
- break;
-
- case GL_INT_2_10_10_10_REV:
- case GL_UNSIGNED_INT_2_10_10_10_REV:
- if (context->getClientMajorVersion() < 3)
- {
- context->handleError(InvalidEnum()
- << "Vertex type not supported before OpenGL ES 3.0.");
- return false;
- }
- if (pureInteger)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTypePureInt);
- return false;
- }
- if (size != 4)
- {
- context->handleError(InvalidOperation() << "Type is INT_2_10_10_10_REV or "
- "UNSIGNED_INT_2_10_10_10_REV and "
- "size is not 4.");
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidType);
- return false;
- }
-
- return true;
-}
-
-// Perform validation from WebGL 2 section 5.10 "Invalid Clears":
-// In the WebGL 2 API, trying to perform a clear when there is a mismatch between the type of the
-// specified clear value and the type of a buffer that is being cleared generates an
-// INVALID_OPERATION error instead of producing undefined results
-bool ValidateWebGLFramebufferAttachmentClearType(ValidationContext *context,
- GLint drawbuffer,
- const GLenum *validComponentTypes,
- size_t validComponentTypeCount)
-{
- const FramebufferAttachment *attachment =
- context->getGLState().getDrawFramebuffer()->getDrawBuffer(drawbuffer);
- if (attachment)
- {
- GLenum componentType = attachment->getFormat().info->componentType;
- const GLenum *end = validComponentTypes + validComponentTypeCount;
- if (std::find(validComponentTypes, end, componentType) == end)
- {
- context->handleError(
- InvalidOperation()
- << "No defined conversion between clear value and attachment format.");
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateRobustCompressedTexImageBase(ValidationContext *context,
- GLsizei imageSize,
- GLsizei dataSize)
-{
- if (!ValidateRobustEntryPoint(context, dataSize))
- {
- return false;
- }
-
- gl::Buffer *pixelUnpackBuffer =
- context->getGLState().getTargetBuffer(BufferBinding::PixelUnpack);
- if (pixelUnpackBuffer == nullptr)
- {
- if (dataSize < imageSize)
- {
- context->handleError(InvalidOperation() << "dataSize must be at least " << imageSize);
- }
- }
- return true;
-}
-
-bool ValidateGetBufferParameterBase(ValidationContext *context,
- BufferBinding target,
- GLenum pname,
- bool pointerVersion,
- GLsizei *numParams)
-{
- if (numParams)
- {
- *numParams = 0;
- }
-
- if (!ValidBufferType(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidBufferTypes);
- return false;
- }
-
- const Buffer *buffer = context->getGLState().getTargetBuffer(target);
- if (!buffer)
- {
- // A null buffer means that "0" is bound to the requested buffer target
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), BufferNotBound);
- return false;
- }
-
- const Extensions &extensions = context->getExtensions();
-
- switch (pname)
- {
- case GL_BUFFER_USAGE:
- case GL_BUFFER_SIZE:
- break;
-
- case GL_BUFFER_ACCESS_OES:
- if (!extensions.mapBuffer)
- {
- context->handleError(InvalidEnum()
- << "pname requires OpenGL ES 3.0 or GL_OES_mapbuffer.");
- return false;
- }
- break;
-
- case GL_BUFFER_MAPPED:
- static_assert(GL_BUFFER_MAPPED == GL_BUFFER_MAPPED_OES, "GL enums should be equal.");
- if (context->getClientMajorVersion() < 3 && !extensions.mapBuffer &&
- !extensions.mapBufferRange)
- {
- context->handleError(InvalidEnum() << "pname requires OpenGL ES 3.0, "
- "GL_OES_mapbuffer or "
- "GL_EXT_map_buffer_range.");
- return false;
- }
- break;
-
- case GL_BUFFER_MAP_POINTER:
- if (!pointerVersion)
- {
- context->handleError(
- InvalidEnum()
- << "GL_BUFFER_MAP_POINTER can only be queried with GetBufferPointerv.");
- return false;
- }
- break;
-
- case GL_BUFFER_ACCESS_FLAGS:
- case GL_BUFFER_MAP_OFFSET:
- case GL_BUFFER_MAP_LENGTH:
- if (context->getClientMajorVersion() < 3 && !extensions.mapBufferRange)
- {
- context->handleError(InvalidEnum()
- << "pname requires OpenGL ES 3.0 or GL_EXT_map_buffer_range.");
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- // All buffer parameter queries return one value.
- if (numParams)
- {
- *numParams = 1;
- }
-
- return true;
-}
-
-bool ValidateGetRenderbufferParameterivBase(Context *context,
- GLenum target,
- GLenum pname,
- GLsizei *length)
-{
- if (length)
- {
- *length = 0;
- }
-
- if (target != GL_RENDERBUFFER)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidRenderbufferTarget);
- return false;
- }
-
- Renderbuffer *renderbuffer = context->getGLState().getCurrentRenderbuffer();
- if (renderbuffer == nullptr)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), RenderbufferNotBound);
- return false;
- }
-
- switch (pname)
- {
- case GL_RENDERBUFFER_WIDTH:
- case GL_RENDERBUFFER_HEIGHT:
- case GL_RENDERBUFFER_INTERNAL_FORMAT:
- case GL_RENDERBUFFER_RED_SIZE:
- case GL_RENDERBUFFER_GREEN_SIZE:
- case GL_RENDERBUFFER_BLUE_SIZE:
- case GL_RENDERBUFFER_ALPHA_SIZE:
- case GL_RENDERBUFFER_DEPTH_SIZE:
- case GL_RENDERBUFFER_STENCIL_SIZE:
- break;
-
- case GL_RENDERBUFFER_SAMPLES_ANGLE:
- if (!context->getExtensions().framebufferMultisample)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), ExtensionNotEnabled);
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- if (length)
- {
- *length = 1;
- }
- return true;
-}
-
-bool ValidateGetShaderivBase(Context *context, GLuint shader, GLenum pname, GLsizei *length)
-{
- if (length)
- {
- *length = 0;
- }
-
- if (GetValidShader(context, shader) == nullptr)
- {
- return false;
- }
-
- switch (pname)
- {
- case GL_SHADER_TYPE:
- case GL_DELETE_STATUS:
- case GL_COMPILE_STATUS:
- case GL_INFO_LOG_LENGTH:
- case GL_SHADER_SOURCE_LENGTH:
- break;
-
- case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
- if (!context->getExtensions().translatedShaderSource)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), ExtensionNotEnabled);
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- if (length)
- {
- *length = 1;
- }
- return true;
-}
-
-bool ValidateGetTexParameterBase(Context *context, GLenum target, GLenum pname, GLsizei *length)
-{
- if (length)
- {
- *length = 0;
- }
-
- if (!ValidTextureTarget(context, target) && !ValidTextureExternalTarget(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTextureTarget);
- return false;
- }
-
- if (context->getTargetTexture(target) == nullptr)
- {
- // Should only be possible for external textures
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), TextureNotBound);
- return false;
- }
-
- switch (pname)
- {
- case GL_TEXTURE_MAG_FILTER:
- case GL_TEXTURE_MIN_FILTER:
- case GL_TEXTURE_WRAP_S:
- case GL_TEXTURE_WRAP_T:
- break;
-
- case GL_TEXTURE_USAGE_ANGLE:
- if (!context->getExtensions().textureUsage)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), ExtensionNotEnabled);
- return false;
- }
- break;
-
- case GL_TEXTURE_MAX_ANISOTROPY_EXT:
- if (!context->getExtensions().textureFilterAnisotropic)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), ExtensionNotEnabled);
- return false;
- }
- break;
-
- case GL_TEXTURE_IMMUTABLE_FORMAT:
- if (context->getClientMajorVersion() < 3 && !context->getExtensions().textureStorage)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), ExtensionNotEnabled);
- return false;
- }
- break;
-
- case GL_TEXTURE_WRAP_R:
- case GL_TEXTURE_IMMUTABLE_LEVELS:
- case GL_TEXTURE_SWIZZLE_R:
- case GL_TEXTURE_SWIZZLE_G:
- case GL_TEXTURE_SWIZZLE_B:
- case GL_TEXTURE_SWIZZLE_A:
- case GL_TEXTURE_BASE_LEVEL:
- case GL_TEXTURE_MAX_LEVEL:
- case GL_TEXTURE_MIN_LOD:
- case GL_TEXTURE_MAX_LOD:
- case GL_TEXTURE_COMPARE_MODE:
- case GL_TEXTURE_COMPARE_FUNC:
- if (context->getClientMajorVersion() < 3)
- {
- context->handleError(InvalidEnum() << "pname requires OpenGL ES 3.0.");
- return false;
- }
- break;
-
- case GL_TEXTURE_SRGB_DECODE_EXT:
- if (!context->getExtensions().textureSRGBDecode)
- {
- context->handleError(InvalidEnum() << "GL_EXT_texture_sRGB_decode is not enabled.");
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- if (length)
- {
- *length = 1;
- }
- return true;
-}
-
-bool ValidateGetVertexAttribBase(Context *context,
- GLuint index,
- GLenum pname,
- GLsizei *length,
- bool pointer,
- bool pureIntegerEntryPoint)
-{
- if (length)
- {
- *length = 0;
- }
-
- if (pureIntegerEntryPoint && context->getClientMajorVersion() < 3)
- {
- context->handleError(InvalidOperation() << "Context does not support OpenGL ES 3.0.");
- return false;
- }
-
- if (index >= context->getCaps().maxVertexAttributes)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), IndexExceedsMaxVertexAttribute);
- return false;
- }
-
- if (pointer)
- {
- if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
- }
- else
- {
- switch (pname)
- {
- case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
- case GL_VERTEX_ATTRIB_ARRAY_SIZE:
- case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
- case GL_VERTEX_ATTRIB_ARRAY_TYPE:
- case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
- case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
- case GL_CURRENT_VERTEX_ATTRIB:
- break;
-
- case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
- static_assert(
- GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE,
- "ANGLE extension enums not equal to GL enums.");
- if (context->getClientMajorVersion() < 3 &&
- !context->getExtensions().instancedArrays)
- {
- context->handleError(InvalidEnum() << "GL_VERTEX_ATTRIB_ARRAY_DIVISOR "
- "requires OpenGL ES 3.0 or "
- "GL_ANGLE_instanced_arrays.");
- return false;
- }
- break;
-
- case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
- if (context->getClientMajorVersion() < 3)
- {
- context->handleError(
- InvalidEnum() << "GL_VERTEX_ATTRIB_ARRAY_INTEGER requires OpenGL ES 3.0.");
- return false;
- }
- break;
-
- case GL_VERTEX_ATTRIB_BINDING:
- case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
- if (context->getClientVersion() < ES_3_1)
- {
- context->handleError(InvalidEnum()
- << "Vertex Attrib Bindings require OpenGL ES 3.1.");
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
- }
-
- if (length)
- {
- if (pname == GL_CURRENT_VERTEX_ATTRIB)
- {
- *length = 4;
- }
- else
- {
- *length = 1;
- }
- }
-
- return true;
-}
-
-bool ValidateReadPixelsBase(Context *context,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLenum type,
- GLsizei bufSize,
- GLsizei *length,
- GLsizei *columns,
- GLsizei *rows,
- void *pixels)
-{
- if (length != nullptr)
- {
- *length = 0;
- }
- if (rows != nullptr)
- {
- *rows = 0;
- }
- if (columns != nullptr)
- {
- *columns = 0;
- }
-
- if (width < 0 || height < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeSize);
- return false;
- }
-
- Framebuffer *readFramebuffer = context->getGLState().getReadFramebuffer();
-
- if (readFramebuffer->checkStatus(context) != GL_FRAMEBUFFER_COMPLETE)
- {
- context->handleError(InvalidFramebufferOperation());
- return false;
- }
-
- if (readFramebuffer->id() != 0 && readFramebuffer->getSamples(context) != 0)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- const Framebuffer *framebuffer = context->getGLState().getReadFramebuffer();
- ASSERT(framebuffer);
-
- if (framebuffer->getReadBufferState() == GL_NONE)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ReadBufferNone);
- return false;
- }
-
- const FramebufferAttachment *readBuffer = framebuffer->getReadColorbuffer();
- // WebGL 1.0 [Section 6.26] Reading From a Missing Attachment
- // In OpenGL ES it is undefined what happens when an operation tries to read from a missing
- // attachment and WebGL defines it to be an error. We do the check unconditionnaly as the
- // situation is an application error that would lead to a crash in ANGLE.
- if (readBuffer == nullptr)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MissingReadAttachment);
- return false;
- }
-
- // ANGLE_multiview, Revision 1:
- // ReadPixels generates an INVALID_FRAMEBUFFER_OPERATION error if the multi-view layout of the
- // current read framebuffer is not NONE.
- if (readBuffer->getMultiviewLayout() != GL_NONE)
- {
- context->handleError(InvalidFramebufferOperation()
- << "Attempting to read from a multi-view framebuffer.");
- return false;
- }
-
- if (context->getExtensions().webglCompatibility)
- {
- // The ES 2.0 spec states that the format must be "among those defined in table 3.4,
- // excluding formats LUMINANCE and LUMINANCE_ALPHA.". This requires validating the format
- // and type before validating the combination of format and type. However, the
- // dEQP-GLES3.functional.negative_api.buffer.read_pixels passes GL_LUMINANCE as a format and
- // verifies that GL_INVALID_OPERATION is generated.
- // TODO(geofflang): Update this check to be done in all/no cases once this is resolved in
- // dEQP/WebGL.
- if (!ValidReadPixelsFormatEnum(context, format))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFormat);
- return false;
- }
-
- if (!ValidReadPixelsTypeEnum(context, type))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidType);
- return false;
- }
- }
-
- GLenum currentFormat = framebuffer->getImplementationColorReadFormat(context);
- GLenum currentType = framebuffer->getImplementationColorReadType(context);
- GLenum currentComponentType = readBuffer->getFormat().info->componentType;
-
- bool validFormatTypeCombination =
- ValidReadPixelsFormatType(context, currentComponentType, format, type);
-
- if (!(currentFormat == format && currentType == type) && !validFormatTypeCombination)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MismatchedTypeAndFormat);
- return false;
- }
-
- // Check for pixel pack buffer related API errors
- gl::Buffer *pixelPackBuffer = context->getGLState().getTargetBuffer(BufferBinding::PixelPack);
- if (pixelPackBuffer != nullptr && pixelPackBuffer->isMapped())
- {
- // ...the buffer object's data store is currently mapped.
- context->handleError(InvalidOperation() << "Pixel pack buffer is mapped.");
- return false;
- }
-
- // .. the data would be packed to the buffer object such that the memory writes required
- // would exceed the data store size.
- const InternalFormat &formatInfo = GetInternalFormatInfo(format, type);
- const gl::Extents size(width, height, 1);
- const auto &pack = context->getGLState().getPackState();
-
- auto endByteOrErr = formatInfo.computePackUnpackEndByte(type, size, pack, false);
- if (endByteOrErr.isError())
- {
- context->handleError(endByteOrErr.getError());
- return false;
- }
-
- size_t endByte = endByteOrErr.getResult();
- if (bufSize >= 0)
- {
- if (pixelPackBuffer == nullptr && static_cast<size_t>(bufSize) < endByte)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InsufficientBufferSize);
- return false;
- }
- }
-
- if (pixelPackBuffer != nullptr)
- {
- CheckedNumeric<size_t> checkedEndByte(endByte);
- CheckedNumeric<size_t> checkedOffset(reinterpret_cast<size_t>(pixels));
- checkedEndByte += checkedOffset;
-
- if (checkedEndByte.ValueOrDie() > static_cast<size_t>(pixelPackBuffer->getSize()))
- {
- // Overflow past the end of the buffer
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ParamOverflow);
- return false;
- }
- }
-
- if (pixelPackBuffer == nullptr && length != nullptr)
- {
- if (endByte > static_cast<size_t>(std::numeric_limits<GLsizei>::max()))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), IntegerOverflow);
- return false;
- }
-
- *length = static_cast<GLsizei>(endByte);
- }
-
- auto getClippedExtent = [](GLint start, GLsizei length, int bufferSize) {
- angle::CheckedNumeric<int> clippedExtent(length);
- if (start < 0)
- {
- // "subtract" the area that is less than 0
- clippedExtent += start;
- }
-
- const int readExtent = start + length;
- if (readExtent > bufferSize)
- {
- // Subtract the region to the right of the read buffer
- clippedExtent -= (readExtent - bufferSize);
- }
-
- if (!clippedExtent.IsValid())
- {
- return 0;
- }
-
- return std::max(clippedExtent.ValueOrDie(), 0);
- };
-
- if (columns != nullptr)
- {
- *columns = getClippedExtent(x, width, readBuffer->getSize().width);
- }
-
- if (rows != nullptr)
- {
- *rows = getClippedExtent(y, height, readBuffer->getSize().height);
- }
-
- return true;
-}
-
-template <typename ParamType>
-bool ValidateTexParameterBase(Context *context,
- GLenum target,
- GLenum pname,
- GLsizei bufSize,
- const ParamType *params)
-{
- if (!ValidTextureTarget(context, target) && !ValidTextureExternalTarget(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTextureTarget);
- return false;
- }
-
- if (context->getTargetTexture(target) == nullptr)
- {
- // Should only be possible for external textures
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), TextureNotBound);
- return false;
- }
-
- const GLsizei minBufSize = 1;
- if (bufSize >= 0 && bufSize < minBufSize)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InsufficientBufferSize);
- return false;
- }
-
- switch (pname)
- {
- case GL_TEXTURE_WRAP_R:
- case GL_TEXTURE_SWIZZLE_R:
- case GL_TEXTURE_SWIZZLE_G:
- case GL_TEXTURE_SWIZZLE_B:
- case GL_TEXTURE_SWIZZLE_A:
- case GL_TEXTURE_BASE_LEVEL:
- case GL_TEXTURE_MAX_LEVEL:
- case GL_TEXTURE_COMPARE_MODE:
- case GL_TEXTURE_COMPARE_FUNC:
- case GL_TEXTURE_MIN_LOD:
- case GL_TEXTURE_MAX_LOD:
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), ES3Required);
- return false;
- }
- if (target == GL_TEXTURE_EXTERNAL_OES &&
- !context->getExtensions().eglImageExternalEssl3)
- {
- context->handleError(InvalidEnum() << "ES3 texture parameters are not "
- "available without "
- "GL_OES_EGL_image_external_essl3.");
- return false;
- }
- break;
-
- default:
- break;
- }
-
- if (target == GL_TEXTURE_2D_MULTISAMPLE)
- {
- switch (pname)
- {
- case GL_TEXTURE_MIN_FILTER:
- case GL_TEXTURE_MAG_FILTER:
- case GL_TEXTURE_WRAP_S:
- case GL_TEXTURE_WRAP_T:
- case GL_TEXTURE_WRAP_R:
- case GL_TEXTURE_MIN_LOD:
- case GL_TEXTURE_MAX_LOD:
- case GL_TEXTURE_COMPARE_MODE:
- case GL_TEXTURE_COMPARE_FUNC:
- context->handleError(InvalidEnum()
- << "Invalid parameter for 2D multisampled textures.");
- return false;
- }
- }
-
- switch (pname)
- {
- case GL_TEXTURE_WRAP_S:
- case GL_TEXTURE_WRAP_T:
- case GL_TEXTURE_WRAP_R:
- {
- bool restrictedWrapModes =
- target == GL_TEXTURE_EXTERNAL_OES || target == GL_TEXTURE_RECTANGLE_ANGLE;
- if (!ValidateTextureWrapModeValue(context, params, restrictedWrapModes))
- {
- return false;
- }
- }
- break;
-
- case GL_TEXTURE_MIN_FILTER:
- {
- bool restrictedMinFilter =
- target == GL_TEXTURE_EXTERNAL_OES || target == GL_TEXTURE_RECTANGLE_ANGLE;
- if (!ValidateTextureMinFilterValue(context, params, restrictedMinFilter))
- {
- return false;
- }
- }
- break;
-
- case GL_TEXTURE_MAG_FILTER:
- if (!ValidateTextureMagFilterValue(context, params))
- {
- return false;
- }
- break;
-
- case GL_TEXTURE_USAGE_ANGLE:
- if (!context->getExtensions().textureUsage)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- switch (ConvertToGLenum(params[0]))
- {
- case GL_NONE:
- case GL_FRAMEBUFFER_ATTACHMENT_ANGLE:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
- break;
-
- case GL_TEXTURE_MAX_ANISOTROPY_EXT:
- if (!context->getExtensions().textureFilterAnisotropic)
- {
- context->handleError(InvalidEnum() << "GL_EXT_texture_anisotropic is not enabled.");
- return false;
- }
-
- // we assume the parameter passed to this validation method is truncated, not rounded
- if (params[0] < 1)
- {
- context->handleError(InvalidValue() << "Max anisotropy must be at least 1.");
- return false;
- }
- break;
-
- case GL_TEXTURE_MIN_LOD:
- case GL_TEXTURE_MAX_LOD:
- // any value is permissible
- break;
-
- case GL_TEXTURE_COMPARE_MODE:
- if (!ValidateTextureCompareModeValue(context, params))
- {
- return false;
- }
- break;
-
- case GL_TEXTURE_COMPARE_FUNC:
- if (!ValidateTextureCompareFuncValue(context, params))
- {
- return false;
- }
- break;
-
- case GL_TEXTURE_SWIZZLE_R:
- case GL_TEXTURE_SWIZZLE_G:
- case GL_TEXTURE_SWIZZLE_B:
- case GL_TEXTURE_SWIZZLE_A:
- switch (ConvertToGLenum(params[0]))
- {
- case GL_RED:
- case GL_GREEN:
- case GL_BLUE:
- case GL_ALPHA:
- case GL_ZERO:
- case GL_ONE:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
- break;
-
- case GL_TEXTURE_BASE_LEVEL:
- if (ConvertToGLint(params[0]) < 0)
- {
- context->handleError(InvalidValue() << "Base level must be at least 0.");
- return false;
- }
- if (target == GL_TEXTURE_EXTERNAL_OES && static_cast<GLuint>(params[0]) != 0)
- {
- context->handleError(InvalidOperation()
- << "Base level must be 0 for external textures.");
- return false;
- }
- if (target == GL_TEXTURE_2D_MULTISAMPLE && static_cast<GLuint>(params[0]) != 0)
- {
- context->handleError(InvalidOperation()
- << "Base level must be 0 for multisampled textures.");
- return false;
- }
- if (target == GL_TEXTURE_RECTANGLE_ANGLE && static_cast<GLuint>(params[0]) != 0)
- {
- context->handleError(InvalidOperation()
- << "Base level must be 0 for rectangle textures.");
- return false;
- }
- break;
-
- case GL_TEXTURE_MAX_LEVEL:
- if (ConvertToGLint(params[0]) < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidMipLevel);
- return false;
- }
- break;
-
- case GL_DEPTH_STENCIL_TEXTURE_MODE:
- if (context->getClientVersion() < Version(3, 1))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumRequiresGLES31);
- return false;
- }
- switch (ConvertToGLenum(params[0]))
- {
- case GL_DEPTH_COMPONENT:
- case GL_STENCIL_INDEX:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
- break;
-
- case GL_TEXTURE_SRGB_DECODE_EXT:
- if (!ValidateTextureSRGBDecodeValue(context, params))
- {
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- return true;
-}
-
-template bool ValidateTexParameterBase(Context *, GLenum, GLenum, GLsizei, const GLfloat *);
-template bool ValidateTexParameterBase(Context *, GLenum, GLenum, GLsizei, const GLint *);
-
-bool ValidateVertexAttribIndex(ValidationContext *context, GLuint index)
-{
- if (index >= MAX_VERTEX_ATTRIBS)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), IndexExceedsMaxVertexAttribute);
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetActiveUniformBlockivBase(Context *context,
- GLuint program,
- GLuint uniformBlockIndex,
- GLenum pname,
- GLsizei *length)
-{
- if (length)
- {
- *length = 0;
- }
-
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
- if (!programObject)
- {
- return false;
- }
-
- if (uniformBlockIndex >= programObject->getActiveUniformBlockCount())
- {
- context->handleError(InvalidValue()
- << "uniformBlockIndex exceeds active uniform block count.");
- return false;
- }
-
- switch (pname)
- {
- case GL_UNIFORM_BLOCK_BINDING:
- case GL_UNIFORM_BLOCK_DATA_SIZE:
- case GL_UNIFORM_BLOCK_NAME_LENGTH:
- case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
- case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
- case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
- case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- if (length)
- {
- if (pname == GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES)
- {
- const InterfaceBlock &uniformBlock =
- programObject->getUniformBlockByIndex(uniformBlockIndex);
- *length = static_cast<GLsizei>(uniformBlock.memberIndexes.size());
- }
- else
- {
- *length = 1;
- }
- }
-
- return true;
-}
-
-template <typename ParamType>
-bool ValidateSamplerParameterBase(Context *context,
- GLuint sampler,
- GLenum pname,
- GLsizei bufSize,
- ParamType *params)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (!context->isSampler(sampler))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidSampler);
- return false;
- }
-
- const GLsizei minBufSize = 1;
- if (bufSize >= 0 && bufSize < minBufSize)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InsufficientBufferSize);
- return false;
- }
-
- switch (pname)
- {
- case GL_TEXTURE_WRAP_S:
- case GL_TEXTURE_WRAP_T:
- case GL_TEXTURE_WRAP_R:
- if (!ValidateTextureWrapModeValue(context, params, false))
- {
- return false;
- }
- break;
-
- case GL_TEXTURE_MIN_FILTER:
- if (!ValidateTextureMinFilterValue(context, params, false))
- {
- return false;
- }
- break;
-
- case GL_TEXTURE_MAG_FILTER:
- if (!ValidateTextureMagFilterValue(context, params))
- {
- return false;
- }
- break;
-
- case GL_TEXTURE_MIN_LOD:
- case GL_TEXTURE_MAX_LOD:
- // any value is permissible
- break;
-
- case GL_TEXTURE_COMPARE_MODE:
- if (!ValidateTextureCompareModeValue(context, params))
- {
- return false;
- }
- break;
-
- case GL_TEXTURE_COMPARE_FUNC:
- if (!ValidateTextureCompareFuncValue(context, params))
- {
- return false;
- }
- break;
-
- case GL_TEXTURE_SRGB_DECODE_EXT:
- if (!ValidateTextureSRGBDecodeValue(context, params))
- {
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- return true;
-}
-
-template bool ValidateSamplerParameterBase(Context *, GLuint, GLenum, GLsizei, GLfloat *);
-template bool ValidateSamplerParameterBase(Context *, GLuint, GLenum, GLsizei, GLint *);
-
-bool ValidateGetSamplerParameterBase(Context *context,
- GLuint sampler,
- GLenum pname,
- GLsizei *length)
-{
- if (length)
- {
- *length = 0;
- }
-
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (!context->isSampler(sampler))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidSampler);
- return false;
- }
-
- switch (pname)
- {
- case GL_TEXTURE_WRAP_S:
- case GL_TEXTURE_WRAP_T:
- case GL_TEXTURE_WRAP_R:
- case GL_TEXTURE_MIN_FILTER:
- case GL_TEXTURE_MAG_FILTER:
- case GL_TEXTURE_MIN_LOD:
- case GL_TEXTURE_MAX_LOD:
- case GL_TEXTURE_COMPARE_MODE:
- case GL_TEXTURE_COMPARE_FUNC:
- break;
-
- case GL_TEXTURE_SRGB_DECODE_EXT:
- if (!context->getExtensions().textureSRGBDecode)
- {
- context->handleError(InvalidEnum() << "GL_EXT_texture_sRGB_decode is not enabled.");
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- if (length)
- {
- *length = 1;
- }
- return true;
-}
-
-bool ValidateGetInternalFormativBase(Context *context,
- GLenum target,
- GLenum internalformat,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *numParams)
-{
- if (numParams)
- {
- *numParams = 0;
- }
-
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- const TextureCaps &formatCaps = context->getTextureCaps().get(internalformat);
- if (!formatCaps.renderable)
- {
- context->handleError(InvalidEnum() << "Internal format is not renderable.");
- return false;
- }
-
- switch (target)
- {
- case GL_RENDERBUFFER:
- break;
-
- case GL_TEXTURE_2D_MULTISAMPLE:
- if (context->getClientVersion() < ES_3_1)
- {
- context->handleError(InvalidOperation()
- << "Texture target requires at least OpenGL ES 3.1.");
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTarget);
- return false;
- }
-
- if (bufSize < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InsufficientBufferSize);
- return false;
- }
-
- GLsizei maxWriteParams = 0;
- switch (pname)
- {
- case GL_NUM_SAMPLE_COUNTS:
- maxWriteParams = 1;
- break;
-
- case GL_SAMPLES:
- maxWriteParams = static_cast<GLsizei>(formatCaps.sampleCounts.size());
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- if (numParams)
- {
- // glGetInternalFormativ will not overflow bufSize
- *numParams = std::min(bufSize, maxWriteParams);
- }
-
- return true;
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/validationES.h b/src/3rdparty/angle/src/libANGLE/validationES.h
deleted file mode 100644
index e29432b8c3..0000000000
--- a/src/3rdparty/angle/src/libANGLE/validationES.h
+++ /dev/null
@@ -1,601 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationES.h: Validation functions for generic OpenGL ES entry point parameters
-
-#ifndef LIBANGLE_VALIDATION_ES_H_
-#define LIBANGLE_VALIDATION_ES_H_
-
-#include "common/mathutil.h"
-#include "libANGLE/PackedGLEnums.h"
-
-#include <GLES2/gl2.h>
-#include <GLES3/gl3.h>
-#include <GLES3/gl31.h>
-
-namespace egl
-{
-class Display;
-class Image;
-}
-
-namespace gl
-{
-class Context;
-struct Format;
-struct LinkedUniform;
-class Program;
-class Shader;
-class ValidationContext;
-
-bool ValidTextureTarget(const ValidationContext *context, GLenum target);
-bool ValidTexture2DTarget(const ValidationContext *context, GLenum target);
-bool ValidTexture3DTarget(const ValidationContext *context, GLenum target);
-bool ValidTextureExternalTarget(const ValidationContext *context, GLenum target);
-bool ValidTexture2DDestinationTarget(const ValidationContext *context, GLenum target);
-bool ValidTexture3DDestinationTarget(const ValidationContext *context, GLenum target);
-bool ValidTexLevelDestinationTarget(const ValidationContext *context, GLenum target);
-bool ValidFramebufferTarget(const ValidationContext *context, GLenum target);
-bool ValidBufferType(const ValidationContext *context, BufferBinding target);
-bool ValidBufferParameter(const ValidationContext *context, GLenum pname, GLsizei *numParams);
-bool ValidMipLevel(const ValidationContext *context, GLenum target, GLint level);
-bool ValidImageSizeParameters(ValidationContext *context,
- GLenum target,
- GLint level,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- bool isSubImage);
-bool ValidCompressedImageSize(const ValidationContext *context,
- GLenum internalFormat,
- GLint level,
- GLsizei width,
- GLsizei height);
-bool ValidCompressedSubImageSize(const ValidationContext *context,
- GLenum internalFormat,
- GLint xoffset,
- GLint yoffset,
- GLsizei width,
- GLsizei height,
- size_t textureWidth,
- size_t textureHeight);
-bool ValidImageDataSize(ValidationContext *context,
- GLenum textureTarget,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLenum format,
- GLenum type,
- const void *pixels,
- GLsizei imageSize);
-
-bool ValidQueryType(const Context *context, GLenum queryType);
-
-bool ValidateWebGLVertexAttribPointer(ValidationContext *context,
- GLenum type,
- GLboolean normalized,
- GLsizei stride,
- const void *ptr,
- bool pureInteger);
-
-// Returns valid program if id is a valid program name
-// Errors INVALID_OPERATION if valid shader is given and returns NULL
-// Errors INVALID_VALUE otherwise and returns NULL
-Program *GetValidProgram(ValidationContext *context, GLuint id);
-
-// Returns valid shader if id is a valid shader name
-// Errors INVALID_OPERATION if valid program is given and returns NULL
-// Errors INVALID_VALUE otherwise and returns NULL
-Shader *GetValidShader(ValidationContext *context, GLuint id);
-
-bool ValidateAttachmentTarget(Context *context, GLenum attachment);
-bool ValidateRenderbufferStorageParametersBase(ValidationContext *context,
- GLenum target,
- GLsizei samples,
- GLenum internalformat,
- GLsizei width,
- GLsizei height);
-bool ValidateFramebufferRenderbufferParameters(Context *context,
- GLenum target,
- GLenum attachment,
- GLenum renderbuffertarget,
- GLuint renderbuffer);
-
-bool ValidateBlitFramebufferParameters(ValidationContext *context,
- GLint srcX0,
- GLint srcY0,
- GLint srcX1,
- GLint srcY1,
- GLint dstX0,
- GLint dstY0,
- GLint dstX1,
- GLint dstY1,
- GLbitfield mask,
- GLenum filter);
-
-bool ValidateReadPixelsBase(Context *context,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLenum type,
- GLsizei bufSize,
- GLsizei *length,
- GLsizei *columns,
- GLsizei *rows,
- void *pixels);
-bool ValidateReadPixelsRobustANGLE(Context *context,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLenum type,
- GLsizei bufSize,
- GLsizei *length,
- GLsizei *columns,
- GLsizei *rows,
- void *pixels);
-bool ValidateReadnPixelsEXT(Context *context,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLenum type,
- GLsizei bufSize,
- void *pixels);
-bool ValidateReadnPixelsRobustANGLE(Context *context,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLenum type,
- GLsizei bufSize,
- GLsizei *length,
- GLsizei *columns,
- GLsizei *rows,
- void *data);
-
-bool ValidateGenQueriesEXT(gl::Context *context, GLsizei n, GLuint *ids);
-bool ValidateDeleteQueriesEXT(gl::Context *context, GLsizei n, const GLuint *ids);
-bool ValidateIsQueryEXT(gl::Context *context, GLuint id);
-bool ValidateBeginQueryBase(Context *context, GLenum target, GLuint id);
-bool ValidateBeginQueryEXT(Context *context, GLenum target, GLuint id);
-bool ValidateEndQueryBase(Context *context, GLenum target);
-bool ValidateEndQueryEXT(Context *context, GLenum target);
-bool ValidateQueryCounterEXT(Context *context, GLuint id, GLenum target);
-bool ValidateGetQueryivBase(Context *context, GLenum target, GLenum pname, GLsizei *numParams);
-bool ValidateGetQueryivEXT(Context *context, GLenum target, GLenum pname, GLint *params);
-bool ValidateGetQueryivRobustANGLE(Context *context,
- GLenum target,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params);
-bool ValidateGetQueryObjectValueBase(Context *context,
- GLenum target,
- GLenum pname,
- GLsizei *numParams);
-bool ValidateGetQueryObjectivEXT(Context *context, GLuint id, GLenum pname, GLint *params);
-bool ValidateGetQueryObjectivRobustANGLE(Context *context,
- GLuint id,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params);
-bool ValidateGetQueryObjectuivEXT(Context *context, GLuint id, GLenum pname, GLuint *params);
-bool ValidateGetQueryObjectuivRobustANGLE(Context *context,
- GLuint id,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLuint *params);
-bool ValidateGetQueryObjecti64vEXT(Context *context, GLuint id, GLenum pname, GLint64 *params);
-bool ValidateGetQueryObjecti64vRobustANGLE(Context *context,
- GLuint id,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint64 *params);
-bool ValidateGetQueryObjectui64vEXT(Context *context, GLuint id, GLenum pname, GLuint64 *params);
-bool ValidateGetQueryObjectui64vRobustANGLE(Context *context,
- GLuint id,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLuint64 *params);
-
-bool ValidateUniformCommonBase(ValidationContext *context,
- gl::Program *program,
- GLint location,
- GLsizei count,
- const LinkedUniform **uniformOut);
-bool ValidateUniform1ivValue(ValidationContext *context,
- GLenum uniformType,
- GLsizei count,
- const GLint *value);
-bool ValidateUniformValue(ValidationContext *context, GLenum valueType, GLenum uniformType);
-bool ValidateUniformMatrixValue(ValidationContext *context, GLenum valueType, GLenum uniformType);
-bool ValidateUniform(ValidationContext *context, GLenum uniformType, GLint location, GLsizei count);
-bool ValidateUniformMatrix(ValidationContext *context,
- GLenum matrixType,
- GLint location,
- GLsizei count,
- GLboolean transpose);
-
-bool ValidateStateQuery(ValidationContext *context,
- GLenum pname,
- GLenum *nativeType,
- unsigned int *numParams);
-
-bool ValidateRobustStateQuery(ValidationContext *context,
- GLenum pname,
- GLsizei bufSize,
- GLenum *nativeType,
- unsigned int *numParams);
-
-bool ValidateCopyTexImageParametersBase(ValidationContext *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- bool isSubImage,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLint border,
- Format *textureFormatOut);
-
-bool ValidateDrawBase(ValidationContext *context, GLenum mode, GLsizei count);
-bool ValidateDrawArraysCommon(ValidationContext *context,
- GLenum mode,
- GLint first,
- GLsizei count,
- GLsizei primcount);
-bool ValidateDrawArraysInstancedBase(Context *context,
- GLenum mode,
- GLint first,
- GLsizei count,
- GLsizei primcount);
-bool ValidateDrawArraysInstancedANGLE(Context *context,
- GLenum mode,
- GLint first,
- GLsizei count,
- GLsizei primcount);
-
-bool ValidateDrawElementsBase(ValidationContext *context, GLenum type);
-bool ValidateDrawElementsCommon(ValidationContext *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei primcount);
-
-bool ValidateDrawElementsInstancedCommon(ValidationContext *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei primcount);
-bool ValidateDrawElementsInstancedANGLE(Context *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei primcount);
-
-bool ValidateFramebufferTextureBase(Context *context,
- GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level);
-
-bool ValidateGetUniformBase(Context *context, GLuint program, GLint location);
-bool ValidateGetnUniformfvEXT(Context *context,
- GLuint program,
- GLint location,
- GLsizei bufSize,
- GLfloat *params);
-bool ValidateGetnUniformivEXT(Context *context,
- GLuint program,
- GLint location,
- GLsizei bufSize,
- GLint *params);
-bool ValidateGetUniformfvRobustANGLE(Context *context,
- GLuint program,
- GLint location,
- GLsizei bufSize,
- GLsizei *length,
- GLfloat *params);
-bool ValidateGetUniformivRobustANGLE(Context *context,
- GLuint program,
- GLint location,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params);
-bool ValidateGetUniformuivRobustANGLE(Context *context,
- GLuint program,
- GLint location,
- GLsizei bufSize,
- GLsizei *length,
- GLuint *params);
-
-bool ValidateDiscardFramebufferBase(Context *context,
- GLenum target,
- GLsizei numAttachments,
- const GLenum *attachments,
- bool defaultFramebuffer);
-
-bool ValidateInsertEventMarkerEXT(Context *context, GLsizei length, const char *marker);
-bool ValidatePushGroupMarkerEXT(Context *context, GLsizei length, const char *marker);
-
-bool ValidateEGLImageTargetTexture2DOES(Context *context,
- GLenum target,
- egl::Image *image);
-bool ValidateEGLImageTargetRenderbufferStorageOES(Context *context,
- GLenum target,
- egl::Image *image);
-
-bool ValidateBindVertexArrayBase(Context *context, GLuint array);
-
-bool ValidateProgramBinaryBase(Context *context,
- GLuint program,
- GLenum binaryFormat,
- const void *binary,
- GLint length);
-bool ValidateGetProgramBinaryBase(Context *context,
- GLuint program,
- GLsizei bufSize,
- GLsizei *length,
- GLenum *binaryFormat,
- void *binary);
-
-bool ValidateDrawBuffersBase(ValidationContext *context, GLsizei n, const GLenum *bufs);
-
-bool ValidateGetBufferPointervBase(Context *context,
- BufferBinding target,
- GLenum pname,
- GLsizei *length,
- void **params);
-bool ValidateUnmapBufferBase(Context *context, BufferBinding target);
-bool ValidateMapBufferRangeBase(Context *context,
- BufferBinding target,
- GLintptr offset,
- GLsizeiptr length,
- GLbitfield access);
-bool ValidateFlushMappedBufferRangeBase(Context *context,
- BufferBinding target,
- GLintptr offset,
- GLsizeiptr length);
-
-bool ValidateGenOrDelete(Context *context, GLint n);
-
-bool ValidateRobustEntryPoint(ValidationContext *context, GLsizei bufSize);
-bool ValidateRobustBufferSize(ValidationContext *context, GLsizei bufSize, GLsizei numParams);
-
-bool ValidateGetFramebufferAttachmentParameterivBase(ValidationContext *context,
- GLenum target,
- GLenum attachment,
- GLenum pname,
- GLsizei *numParams);
-bool ValidateGetFramebufferAttachmentParameterivRobustANGLE(ValidationContext *context,
- GLenum target,
- GLenum attachment,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *numParams);
-
-bool ValidateGetBufferParameterBase(ValidationContext *context,
- BufferBinding target,
- GLenum pname,
- bool pointerVersion,
- GLsizei *numParams);
-bool ValidateGetBufferParameterivRobustANGLE(ValidationContext *context,
- BufferBinding target,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params);
-
-bool ValidateGetBufferParameteri64vRobustANGLE(ValidationContext *context,
- BufferBinding target,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint64 *params);
-
-bool ValidateGetProgramivBase(ValidationContext *context,
- GLuint program,
- GLenum pname,
- GLsizei *numParams);
-bool ValidateGetProgramivRobustANGLE(Context *context,
- GLuint program,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *numParams);
-
-bool ValidateGetRenderbufferParameterivBase(Context *context,
- GLenum target,
- GLenum pname,
- GLsizei *length);
-bool ValidateGetRenderbufferParameterivRobustANGLE(Context *context,
- GLenum target,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params);
-
-bool ValidateGetShaderivBase(Context *context, GLuint shader, GLenum pname, GLsizei *length);
-bool ValidateGetShaderivRobustANGLE(Context *context,
- GLuint shader,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params);
-
-bool ValidateGetTexParameterBase(Context *context, GLenum target, GLenum pname, GLsizei *length);
-bool ValidateGetTexParameterfvRobustANGLE(Context *context,
- GLenum target,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLfloat *params);
-bool ValidateGetTexParameterivRobustANGLE(Context *context,
- GLenum target,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params);
-
-template <typename ParamType>
-bool ValidateTexParameterBase(Context *context,
- GLenum target,
- GLenum pname,
- GLsizei bufSize,
- const ParamType *params);
-bool ValidateTexParameterfvRobustANGLE(Context *context,
- GLenum target,
- GLenum pname,
- GLsizei bufSize,
- const GLfloat *params);
-bool ValidateTexParameterivRobustANGLE(Context *context,
- GLenum target,
- GLenum pname,
- GLsizei bufSize,
- const GLint *params);
-
-bool ValidateGetSamplerParameterfvRobustANGLE(Context *context,
- GLuint sampler,
- GLenum pname,
- GLuint bufSize,
- GLsizei *length,
- GLfloat *params);
-bool ValidateGetSamplerParameterivRobustANGLE(Context *context,
- GLuint sampler,
- GLenum pname,
- GLuint bufSize,
- GLsizei *length,
- GLint *params);
-
-bool ValidateSamplerParameterfvRobustANGLE(Context *context,
- GLuint sampler,
- GLenum pname,
- GLsizei bufSize,
- const GLfloat *params);
-bool ValidateSamplerParameterivRobustANGLE(Context *context,
- GLuint sampler,
- GLenum pname,
- GLsizei bufSize,
- const GLint *params);
-
-bool ValidateGetVertexAttribBase(Context *context,
- GLuint index,
- GLenum pname,
- GLsizei *length,
- bool pointer,
- bool pureIntegerEntryPoint);
-bool ValidateGetVertexAttribfvRobustANGLE(Context *context,
- GLuint index,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLfloat *params);
-
-bool ValidateGetVertexAttribivRobustANGLE(Context *context,
- GLuint index,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params);
-
-bool ValidateGetVertexAttribPointervRobustANGLE(Context *context,
- GLuint index,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- void **pointer);
-
-bool ValidateGetVertexAttribIivRobustANGLE(Context *context,
- GLuint index,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params);
-
-bool ValidateGetVertexAttribIuivRobustANGLE(Context *context,
- GLuint index,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLuint *params);
-
-bool ValidateGetActiveUniformBlockivRobustANGLE(Context *context,
- GLuint program,
- GLuint uniformBlockIndex,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params);
-
-bool ValidateGetInternalFormativRobustANGLE(Context *context,
- GLenum target,
- GLenum internalformat,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params);
-
-bool ValidateVertexFormatBase(ValidationContext *context,
- GLuint attribIndex,
- GLint size,
- GLenum type,
- GLboolean pureInteger);
-
-bool ValidateWebGLFramebufferAttachmentClearType(ValidationContext *context,
- GLint drawbuffer,
- const GLenum *validComponentTypes,
- size_t validComponentTypeCount);
-
-bool ValidateRobustCompressedTexImageBase(ValidationContext *context,
- GLsizei imageSize,
- GLsizei dataSize);
-
-bool ValidateVertexAttribIndex(ValidationContext *context, GLuint index);
-
-bool ValidateGetActiveUniformBlockivBase(Context *context,
- GLuint program,
- GLuint uniformBlockIndex,
- GLenum pname,
- GLsizei *length);
-
-bool ValidateGetSamplerParameterBase(Context *context,
- GLuint sampler,
- GLenum pname,
- GLsizei *length);
-
-template <typename ParamType>
-bool ValidateSamplerParameterBase(Context *context,
- GLuint sampler,
- GLenum pname,
- GLsizei bufSize,
- ParamType *params);
-
-bool ValidateGetInternalFormativBase(Context *context,
- GLenum target,
- GLenum internalformat,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *numParams);
-
-} // namespace gl
-
-#endif // LIBANGLE_VALIDATION_ES_H_
diff --git a/src/3rdparty/angle/src/libANGLE/validationES2.cpp b/src/3rdparty/angle/src/libANGLE/validationES2.cpp
deleted file mode 100644
index 5e505aa607..0000000000
--- a/src/3rdparty/angle/src/libANGLE/validationES2.cpp
+++ /dev/null
@@ -1,6351 +0,0 @@
-//
-// Copyright (c) 2013-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationES2.cpp: Validation functions for OpenGL ES 2.0 entry point parameters
-
-#include "libANGLE/validationES2.h"
-
-#include <cstdint>
-
-#include "common/mathutil.h"
-#include "common/string_utils.h"
-#include "common/utilities.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/ErrorStrings.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/Renderbuffer.h"
-#include "libANGLE/Shader.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/Uniform.h"
-#include "libANGLE/VertexArray.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES3.h"
-
-namespace gl
-{
-
-namespace
-{
-
-bool IsPartialBlit(gl::Context *context,
- const FramebufferAttachment *readBuffer,
- const FramebufferAttachment *writeBuffer,
- GLint srcX0,
- GLint srcY0,
- GLint srcX1,
- GLint srcY1,
- GLint dstX0,
- GLint dstY0,
- GLint dstX1,
- GLint dstY1)
-{
- const Extents &writeSize = writeBuffer->getSize();
- const Extents &readSize = readBuffer->getSize();
-
- if (srcX0 != 0 || srcY0 != 0 || dstX0 != 0 || dstY0 != 0 || dstX1 != writeSize.width ||
- dstY1 != writeSize.height || srcX1 != readSize.width || srcY1 != readSize.height)
- {
- return true;
- }
-
- if (context->getGLState().isScissorTestEnabled())
- {
- const Rectangle &scissor = context->getGLState().getScissor();
- return scissor.x > 0 || scissor.y > 0 || scissor.width < writeSize.width ||
- scissor.height < writeSize.height;
- }
-
- return false;
-}
-
-template <typename T>
-bool ValidatePathInstances(gl::Context *context,
- GLsizei numPaths,
- const void *paths,
- GLuint pathBase)
-{
- const auto *array = static_cast<const T *>(paths);
-
- for (GLsizei i = 0; i < numPaths; ++i)
- {
- const GLuint pathName = array[i] + pathBase;
- if (context->hasPath(pathName) && !context->hasPathData(pathName))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), NoSuchPath);
- return false;
- }
- }
- return true;
-}
-
-bool ValidateInstancedPathParameters(gl::Context *context,
- GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLenum transformType,
- const GLfloat *transformValues)
-{
- if (!context->getExtensions().pathRendering)
- {
- context->handleError(InvalidOperation() << "GL_CHROMIUM_path_rendering is not available.");
- return false;
- }
-
- if (paths == nullptr)
- {
- context->handleError(InvalidValue() << "No path name array.");
- return false;
- }
-
- if (numPaths < 0)
- {
- context->handleError(InvalidValue() << "Invalid (negative) numPaths.");
- return false;
- }
-
- if (!angle::IsValueInRangeForNumericType<std::uint32_t>(numPaths))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), IntegerOverflow);
- return false;
- }
-
- std::uint32_t pathNameTypeSize = 0;
- std::uint32_t componentCount = 0;
-
- switch (pathNameType)
- {
- case GL_UNSIGNED_BYTE:
- pathNameTypeSize = sizeof(GLubyte);
- if (!ValidatePathInstances<GLubyte>(context, numPaths, paths, pathBase))
- return false;
- break;
-
- case GL_BYTE:
- pathNameTypeSize = sizeof(GLbyte);
- if (!ValidatePathInstances<GLbyte>(context, numPaths, paths, pathBase))
- return false;
- break;
-
- case GL_UNSIGNED_SHORT:
- pathNameTypeSize = sizeof(GLushort);
- if (!ValidatePathInstances<GLushort>(context, numPaths, paths, pathBase))
- return false;
- break;
-
- case GL_SHORT:
- pathNameTypeSize = sizeof(GLshort);
- if (!ValidatePathInstances<GLshort>(context, numPaths, paths, pathBase))
- return false;
- break;
-
- case GL_UNSIGNED_INT:
- pathNameTypeSize = sizeof(GLuint);
- if (!ValidatePathInstances<GLuint>(context, numPaths, paths, pathBase))
- return false;
- break;
-
- case GL_INT:
- pathNameTypeSize = sizeof(GLint);
- if (!ValidatePathInstances<GLint>(context, numPaths, paths, pathBase))
- return false;
- break;
-
- default:
- context->handleError(InvalidEnum() << "Invalid path name type.");
- return false;
- }
-
- switch (transformType)
- {
- case GL_NONE:
- componentCount = 0;
- break;
- case GL_TRANSLATE_X_CHROMIUM:
- case GL_TRANSLATE_Y_CHROMIUM:
- componentCount = 1;
- break;
- case GL_TRANSLATE_2D_CHROMIUM:
- componentCount = 2;
- break;
- case GL_TRANSLATE_3D_CHROMIUM:
- componentCount = 3;
- break;
- case GL_AFFINE_2D_CHROMIUM:
- case GL_TRANSPOSE_AFFINE_2D_CHROMIUM:
- componentCount = 6;
- break;
- case GL_AFFINE_3D_CHROMIUM:
- case GL_TRANSPOSE_AFFINE_3D_CHROMIUM:
- componentCount = 12;
- break;
- default:
- context->handleError(InvalidEnum() << "Invalid transformation.");
- return false;
- }
- if (componentCount != 0 && transformValues == nullptr)
- {
- context->handleError(InvalidValue() << "No transform array given.");
- return false;
- }
-
- angle::CheckedNumeric<std::uint32_t> checkedSize(0);
- checkedSize += (numPaths * pathNameTypeSize);
- checkedSize += (numPaths * sizeof(GLfloat) * componentCount);
- if (!checkedSize.IsValid())
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), IntegerOverflow);
- return false;
- }
-
- return true;
-}
-
-bool IsValidCopyTextureSourceInternalFormatEnum(GLenum internalFormat)
-{
- // Table 1.1 from the CHROMIUM_copy_texture spec
- switch (GetUnsizedFormat(internalFormat))
- {
- case GL_RED:
- case GL_ALPHA:
- case GL_LUMINANCE:
- case GL_LUMINANCE_ALPHA:
- case GL_RGB:
- case GL_RGBA:
- case GL_RGB8:
- case GL_RGBA8:
- case GL_BGRA_EXT:
- case GL_BGRA8_EXT:
- return true;
-
- default:
- return false;
- }
-}
-
-bool IsValidCopySubTextureSourceInternalFormat(GLenum internalFormat)
-{
- return IsValidCopyTextureSourceInternalFormatEnum(internalFormat);
-}
-
-bool IsValidCopyTextureDestinationInternalFormatEnum(GLint internalFormat)
-{
- // Table 1.0 from the CHROMIUM_copy_texture spec
- switch (internalFormat)
- {
- case GL_RGB:
- case GL_RGBA:
- case GL_RGB8:
- case GL_RGBA8:
- case GL_BGRA_EXT:
- case GL_BGRA8_EXT:
- case GL_SRGB_EXT:
- case GL_SRGB_ALPHA_EXT:
- case GL_R8:
- case GL_R8UI:
- case GL_RG8:
- case GL_RG8UI:
- case GL_SRGB8:
- case GL_RGB565:
- case GL_RGB8UI:
- case GL_RGB10_A2:
- case GL_SRGB8_ALPHA8:
- case GL_RGB5_A1:
- case GL_RGBA4:
- case GL_RGBA8UI:
- case GL_RGB9_E5:
- case GL_R16F:
- case GL_R32F:
- case GL_RG16F:
- case GL_RG32F:
- case GL_RGB16F:
- case GL_RGB32F:
- case GL_RGBA16F:
- case GL_RGBA32F:
- case GL_R11F_G11F_B10F:
- case GL_LUMINANCE:
- case GL_LUMINANCE_ALPHA:
- case GL_ALPHA:
- return true;
-
- default:
- return false;
- }
-}
-
-bool IsValidCopySubTextureDestionationInternalFormat(GLenum internalFormat)
-{
- return IsValidCopyTextureDestinationInternalFormatEnum(internalFormat);
-}
-
-bool IsValidCopyTextureDestinationFormatType(Context *context, GLint internalFormat, GLenum type)
-{
- if (!IsValidCopyTextureDestinationInternalFormatEnum(internalFormat))
- {
- return false;
- }
-
- if (!ValidES3FormatCombination(GetUnsizedFormat(internalFormat), type, internalFormat))
- {
- context->handleError(InvalidOperation()
- << "Invalid combination of type and internalFormat.");
- return false;
- }
-
- const InternalFormat &internalFormatInfo = GetInternalFormatInfo(internalFormat, type);
- if (!internalFormatInfo.textureSupport(context->getClientVersion(), context->getExtensions()))
- {
- return false;
- }
-
- return true;
-}
-
-bool IsValidCopyTextureDestinationTargetEnum(Context *context, GLenum target)
-{
- switch (target)
- {
- case GL_TEXTURE_2D:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- return true;
-
- case GL_TEXTURE_RECTANGLE_ANGLE:
- return context->getExtensions().textureRectangle;
-
- default:
- return false;
- }
-}
-
-bool IsValidCopyTextureDestinationTarget(Context *context, GLenum textureType, GLenum target)
-{
- if (IsCubeMapTextureTarget(target))
- {
- return textureType == GL_TEXTURE_CUBE_MAP;
- }
- else
- {
- return textureType == target;
- }
-}
-
-bool IsValidCopyTextureSourceTarget(Context *context, GLenum target)
-{
- switch (target)
- {
- case GL_TEXTURE_2D:
- return true;
- case GL_TEXTURE_RECTANGLE_ANGLE:
- return context->getExtensions().textureRectangle;
-
- // TODO(geofflang): accept GL_TEXTURE_EXTERNAL_OES if the texture_external extension is
- // supported
-
- default:
- return false;
- }
-}
-
-bool IsValidCopyTextureSourceLevel(Context *context, GLenum target, GLint level)
-{
- if (!ValidMipLevel(context, target, level))
- {
- return false;
- }
-
- if (level > 0 && context->getClientVersion() < ES_3_0)
- {
- return false;
- }
-
- return true;
-}
-
-bool IsValidCopyTextureDestinationLevel(Context *context,
- GLenum target,
- GLint level,
- GLsizei width,
- GLsizei height)
-{
- if (!ValidMipLevel(context, target, level))
- {
- return false;
- }
-
- const Caps &caps = context->getCaps();
- if (target == GL_TEXTURE_2D)
- {
- if (static_cast<GLuint>(width) > (caps.max2DTextureSize >> level) ||
- static_cast<GLuint>(height) > (caps.max2DTextureSize >> level))
- {
- return false;
- }
- }
- else if (target == GL_TEXTURE_RECTANGLE_ANGLE)
- {
- ASSERT(level == 0);
- if (static_cast<GLuint>(width) > caps.maxRectangleTextureSize ||
- static_cast<GLuint>(height) > caps.maxRectangleTextureSize)
- {
- return false;
- }
- }
- else if (IsCubeMapTextureTarget(target))
- {
- if (static_cast<GLuint>(width) > (caps.maxCubeMapTextureSize >> level) ||
- static_cast<GLuint>(height) > (caps.maxCubeMapTextureSize >> level))
- {
- return false;
- }
- }
-
- return true;
-}
-
-bool IsValidStencilFunc(GLenum func)
-{
- switch (func)
- {
- case GL_NEVER:
- case GL_ALWAYS:
- case GL_LESS:
- case GL_LEQUAL:
- case GL_EQUAL:
- case GL_GEQUAL:
- case GL_GREATER:
- case GL_NOTEQUAL:
- return true;
-
- default:
- return false;
- }
-}
-
-bool IsValidStencilFace(GLenum face)
-{
- switch (face)
- {
- case GL_FRONT:
- case GL_BACK:
- case GL_FRONT_AND_BACK:
- return true;
-
- default:
- return false;
- }
-}
-
-bool IsValidStencilOp(GLenum op)
-{
- switch (op)
- {
- case GL_ZERO:
- case GL_KEEP:
- case GL_REPLACE:
- case GL_INCR:
- case GL_DECR:
- case GL_INVERT:
- case GL_INCR_WRAP:
- case GL_DECR_WRAP:
- return true;
-
- default:
- return false;
- }
-}
-
-bool ValidateES2CopyTexImageParameters(ValidationContext *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- bool isSubImage,
- GLint xoffset,
- GLint yoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLint border)
-{
- if (!ValidTexture2DDestinationTarget(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTextureTarget);
- return false;
- }
-
- if (!ValidImageSizeParameters(context, target, level, width, height, 1, isSubImage))
- {
- context->handleError(InvalidValue() << "Invalid texture dimensions.");
- return false;
- }
-
- Format textureFormat = Format::Invalid();
- if (!ValidateCopyTexImageParametersBase(context, target, level, internalformat, isSubImage,
- xoffset, yoffset, 0, x, y, width, height, border,
- &textureFormat))
- {
- return false;
- }
-
- const gl::Framebuffer *framebuffer = context->getGLState().getReadFramebuffer();
- GLenum colorbufferFormat =
- framebuffer->getReadColorbuffer()->getFormat().info->sizedInternalFormat;
- const auto &formatInfo = *textureFormat.info;
-
- // [OpenGL ES 2.0.24] table 3.9
- if (isSubImage)
- {
- switch (formatInfo.format)
- {
- case GL_ALPHA:
- if (colorbufferFormat != GL_ALPHA8_EXT && colorbufferFormat != GL_RGBA4 &&
- colorbufferFormat != GL_RGB5_A1 && colorbufferFormat != GL_RGBA8_OES &&
- colorbufferFormat != GL_BGRA8_EXT && colorbufferFormat != GL_BGR5_A1_ANGLEX)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- }
- break;
- case GL_LUMINANCE:
- if (colorbufferFormat != GL_R8_EXT && colorbufferFormat != GL_RG8_EXT &&
- colorbufferFormat != GL_RGB565 && colorbufferFormat != GL_RGB8_OES &&
- colorbufferFormat != GL_RGBA4 && colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_RGBA8_OES && colorbufferFormat != GL_BGRA8_EXT &&
- colorbufferFormat != GL_BGR5_A1_ANGLEX)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- }
- break;
- case GL_RED_EXT:
- if (colorbufferFormat != GL_R8_EXT && colorbufferFormat != GL_RG8_EXT &&
- colorbufferFormat != GL_RGB565 && colorbufferFormat != GL_RGB8_OES &&
- colorbufferFormat != GL_RGBA4 && colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_RGBA8_OES && colorbufferFormat != GL_R32F &&
- colorbufferFormat != GL_RG32F && colorbufferFormat != GL_RGB32F &&
- colorbufferFormat != GL_RGBA32F && colorbufferFormat != GL_BGRA8_EXT &&
- colorbufferFormat != GL_BGR5_A1_ANGLEX)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- }
- break;
- case GL_RG_EXT:
- if (colorbufferFormat != GL_RG8_EXT && colorbufferFormat != GL_RGB565 &&
- colorbufferFormat != GL_RGB8_OES && colorbufferFormat != GL_RGBA4 &&
- colorbufferFormat != GL_RGB5_A1 && colorbufferFormat != GL_RGBA8_OES &&
- colorbufferFormat != GL_RG32F && colorbufferFormat != GL_RGB32F &&
- colorbufferFormat != GL_RGBA32F && colorbufferFormat != GL_BGRA8_EXT &&
- colorbufferFormat != GL_BGR5_A1_ANGLEX)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- }
- break;
- case GL_RGB:
- if (colorbufferFormat != GL_RGB565 && colorbufferFormat != GL_RGB8_OES &&
- colorbufferFormat != GL_RGBA4 && colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_RGBA8_OES && colorbufferFormat != GL_RGB32F &&
- colorbufferFormat != GL_RGBA32F && colorbufferFormat != GL_BGRA8_EXT &&
- colorbufferFormat != GL_BGR5_A1_ANGLEX)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- }
- break;
- case GL_LUMINANCE_ALPHA:
- case GL_RGBA:
- if (colorbufferFormat != GL_RGBA4 && colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_RGBA8_OES && colorbufferFormat != GL_RGBA32F &&
- colorbufferFormat != GL_BGRA8_EXT && colorbufferFormat != GL_BGR5_A1_ANGLEX)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- }
- break;
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
- case GL_ETC1_RGB8_OES:
- case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
- case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- case GL_DEPTH_COMPONENT:
- case GL_DEPTH_STENCIL_OES:
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- }
-
- if (formatInfo.type == GL_FLOAT && !context->getExtensions().textureFloat)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- }
- }
- else
- {
- switch (internalformat)
- {
- case GL_ALPHA:
- if (colorbufferFormat != GL_ALPHA8_EXT && colorbufferFormat != GL_RGBA4 &&
- colorbufferFormat != GL_RGB5_A1 && colorbufferFormat != GL_BGRA8_EXT &&
- colorbufferFormat != GL_RGBA8_OES && colorbufferFormat != GL_BGR5_A1_ANGLEX)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- }
- break;
- case GL_LUMINANCE:
- if (colorbufferFormat != GL_R8_EXT && colorbufferFormat != GL_RG8_EXT &&
- colorbufferFormat != GL_RGB565 && colorbufferFormat != GL_RGB8_OES &&
- colorbufferFormat != GL_RGBA4 && colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_BGRA8_EXT && colorbufferFormat != GL_RGBA8_OES &&
- colorbufferFormat != GL_BGR5_A1_ANGLEX)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- }
- break;
- case GL_RED_EXT:
- if (colorbufferFormat != GL_R8_EXT && colorbufferFormat != GL_RG8_EXT &&
- colorbufferFormat != GL_RGB565 && colorbufferFormat != GL_RGB8_OES &&
- colorbufferFormat != GL_RGBA4 && colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_BGRA8_EXT && colorbufferFormat != GL_RGBA8_OES &&
- colorbufferFormat != GL_BGR5_A1_ANGLEX)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- }
- break;
- case GL_RG_EXT:
- if (colorbufferFormat != GL_RG8_EXT && colorbufferFormat != GL_RGB565 &&
- colorbufferFormat != GL_RGB8_OES && colorbufferFormat != GL_RGBA4 &&
- colorbufferFormat != GL_RGB5_A1 && colorbufferFormat != GL_BGRA8_EXT &&
- colorbufferFormat != GL_RGBA8_OES && colorbufferFormat != GL_BGR5_A1_ANGLEX)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- }
- break;
- case GL_RGB:
- if (colorbufferFormat != GL_RGB565 && colorbufferFormat != GL_RGB8_OES &&
- colorbufferFormat != GL_RGBA4 && colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_BGRA8_EXT && colorbufferFormat != GL_RGBA8_OES &&
- colorbufferFormat != GL_BGR5_A1_ANGLEX)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- }
- break;
- case GL_LUMINANCE_ALPHA:
- case GL_RGBA:
- if (colorbufferFormat != GL_RGBA4 && colorbufferFormat != GL_RGB5_A1 &&
- colorbufferFormat != GL_BGRA8_EXT && colorbufferFormat != GL_RGBA8_OES &&
- colorbufferFormat != GL_BGR5_A1_ANGLEX)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- }
- break;
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- if (context->getExtensions().textureCompressionDXT1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- }
- else
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
- break;
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
- if (context->getExtensions().textureCompressionDXT3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- }
- else
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
- break;
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
- if (context->getExtensions().textureCompressionDXT5)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- }
- else
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
- break;
- case GL_ETC1_RGB8_OES:
- if (context->getExtensions().compressedETC1RGB8Texture)
- {
- context->handleError(InvalidOperation());
- return false;
- }
- else
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
- case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
- case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
- if (context->getExtensions().lossyETCDecode)
- {
- context->handleError(InvalidOperation()
- << "ETC lossy decode formats can't be copied to.");
- return false;
- }
- else
- {
- context->handleError(InvalidEnum()
- << "ANGLE_lossy_etc_decode extension is not supported.");
- return false;
- }
- break;
- case GL_DEPTH_COMPONENT:
- case GL_DEPTH_COMPONENT16:
- case GL_DEPTH_COMPONENT32_OES:
- case GL_DEPTH_STENCIL_OES:
- case GL_DEPTH24_STENCIL8_OES:
- if (context->getExtensions().depthTextures)
- {
- context->handleError(InvalidOperation());
- return false;
- }
- else
- {
- context->handleError(InvalidEnum());
- return false;
- }
- default:
- context->handleError(InvalidEnum());
- return false;
- }
- }
-
- // If width or height is zero, it is a no-op. Return false without setting an error.
- return (width > 0 && height > 0);
-}
-
-bool ValidCap(const Context *context, GLenum cap, bool queryOnly)
-{
- switch (cap)
- {
- // EXT_multisample_compatibility
- case GL_MULTISAMPLE_EXT:
- case GL_SAMPLE_ALPHA_TO_ONE_EXT:
- return context->getExtensions().multisampleCompatibility;
-
- case GL_CULL_FACE:
- case GL_POLYGON_OFFSET_FILL:
- case GL_SAMPLE_ALPHA_TO_COVERAGE:
- case GL_SAMPLE_COVERAGE:
- case GL_SCISSOR_TEST:
- case GL_STENCIL_TEST:
- case GL_DEPTH_TEST:
- case GL_BLEND:
- case GL_DITHER:
- return true;
-
- case GL_PRIMITIVE_RESTART_FIXED_INDEX:
- case GL_RASTERIZER_DISCARD:
- return (context->getClientMajorVersion() >= 3);
-
- case GL_DEBUG_OUTPUT_SYNCHRONOUS:
- case GL_DEBUG_OUTPUT:
- return context->getExtensions().debug;
-
- case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
- return queryOnly && context->getExtensions().bindGeneratesResource;
-
- case GL_CLIENT_ARRAYS_ANGLE:
- return queryOnly && context->getExtensions().clientArrays;
-
- case GL_FRAMEBUFFER_SRGB_EXT:
- return context->getExtensions().sRGBWriteControl;
-
- case GL_SAMPLE_MASK:
- return context->getClientVersion() >= Version(3, 1);
-
- case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
- return queryOnly && context->getExtensions().robustResourceInitialization;
-
- default:
- return false;
- }
-}
-
-// Return true if a character belongs to the ASCII subset as defined in GLSL ES 1.0 spec section
-// 3.1.
-bool IsValidESSLCharacter(unsigned char c)
-{
- // Printing characters are valid except " $ ` @ \ ' DEL.
- if (c >= 32 && c <= 126 && c != '"' && c != '$' && c != '`' && c != '@' && c != '\\' &&
- c != '\'')
- {
- return true;
- }
-
- // Horizontal tab, line feed, vertical tab, form feed, carriage return are also valid.
- if (c >= 9 && c <= 13)
- {
- return true;
- }
-
- return false;
-}
-
-bool IsValidESSLString(const char *str, size_t len)
-{
- for (size_t i = 0; i < len; i++)
- {
- if (!IsValidESSLCharacter(str[i]))
- {
- return false;
- }
- }
-
- return true;
-}
-
-bool IsValidESSLShaderSourceString(const char *str, size_t len, bool lineContinuationAllowed)
-{
- enum class ParseState
- {
- // Have not seen an ASCII non-whitespace character yet on
- // this line. Possible that we might see a preprocessor
- // directive.
- BEGINING_OF_LINE,
-
- // Have seen at least one ASCII non-whitespace character
- // on this line.
- MIDDLE_OF_LINE,
-
- // Handling a preprocessor directive. Passes through all
- // characters up to the end of the line. Disables comment
- // processing.
- IN_PREPROCESSOR_DIRECTIVE,
-
- // Handling a single-line comment. The comment text is
- // replaced with a single space.
- IN_SINGLE_LINE_COMMENT,
-
- // Handling a multi-line comment. Newlines are passed
- // through to preserve line numbers.
- IN_MULTI_LINE_COMMENT
- };
-
- ParseState state = ParseState::BEGINING_OF_LINE;
- size_t pos = 0;
-
- while (pos < len)
- {
- char c = str[pos];
- char next = pos + 1 < len ? str[pos + 1] : 0;
-
- // Check for newlines
- if (c == '\n' || c == '\r')
- {
- if (state != ParseState::IN_MULTI_LINE_COMMENT)
- {
- state = ParseState::BEGINING_OF_LINE;
- }
-
- pos++;
- continue;
- }
-
- switch (state)
- {
- case ParseState::BEGINING_OF_LINE:
- if (c == ' ')
- {
- // Maintain the BEGINING_OF_LINE state until a non-space is seen
- pos++;
- }
- else if (c == '#')
- {
- state = ParseState::IN_PREPROCESSOR_DIRECTIVE;
- pos++;
- }
- else
- {
- // Don't advance, re-process this character with the MIDDLE_OF_LINE state
- state = ParseState::MIDDLE_OF_LINE;
- }
- break;
-
- case ParseState::MIDDLE_OF_LINE:
- if (c == '/' && next == '/')
- {
- state = ParseState::IN_SINGLE_LINE_COMMENT;
- pos++;
- }
- else if (c == '/' && next == '*')
- {
- state = ParseState::IN_MULTI_LINE_COMMENT;
- pos++;
- }
- else if (lineContinuationAllowed && c == '\\' && (next == '\n' || next == '\r'))
- {
- // Skip line continuation characters
- }
- else if (!IsValidESSLCharacter(c))
- {
- return false;
- }
- pos++;
- break;
-
- case ParseState::IN_PREPROCESSOR_DIRECTIVE:
- // Line-continuation characters may not be permitted.
- // Otherwise, just pass it through. Do not parse comments in this state.
- if (!lineContinuationAllowed && c == '\\')
- {
- return false;
- }
- pos++;
- break;
-
- case ParseState::IN_SINGLE_LINE_COMMENT:
- // Line-continuation characters are processed before comment processing.
- // Advance string if a new line character is immediately behind
- // line-continuation character.
- if (c == '\\' && (next == '\n' || next == '\r'))
- {
- pos++;
- }
- pos++;
- break;
-
- case ParseState::IN_MULTI_LINE_COMMENT:
- if (c == '*' && next == '/')
- {
- state = ParseState::MIDDLE_OF_LINE;
- pos++;
- }
- pos++;
- break;
- }
- }
-
- return true;
-}
-
-bool ValidateWebGLNamePrefix(ValidationContext *context, const GLchar *name)
-{
- ASSERT(context->isWebGL());
-
- // WebGL 1.0 [Section 6.16] GLSL Constructs
- // Identifiers starting with "webgl_" and "_webgl_" are reserved for use by WebGL.
- if (strncmp(name, "webgl_", 6) == 0 || strncmp(name, "_webgl_", 7) == 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), WebglBindAttribLocationReservedPrefix);
- return false;
- }
-
- return true;
-}
-
-bool ValidateWebGLNameLength(ValidationContext *context, size_t length)
-{
- ASSERT(context->isWebGL());
-
- if (context->isWebGL1() && length > 256)
- {
- // WebGL 1.0 [Section 6.21] Maxmimum Uniform and Attribute Location Lengths
- // WebGL imposes a limit of 256 characters on the lengths of uniform and attribute
- // locations.
- ANGLE_VALIDATION_ERR(context, InvalidValue(), WebglNameLengthLimitExceeded);
-
- return false;
- }
- else if (length > 1024)
- {
- // WebGL 2.0 [Section 4.3.2] WebGL 2.0 imposes a limit of 1024 characters on the lengths of
- // uniform and attribute locations.
- ANGLE_VALIDATION_ERR(context, InvalidValue(), Webgl2NameLengthLimitExceeded);
- return false;
- }
-
- return true;
-}
-
-} // anonymous namespace
-
-bool ValidateES2TexImageParameters(Context *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- bool isCompressed,
- bool isSubImage,
- GLint xoffset,
- GLint yoffset,
- GLsizei width,
- GLsizei height,
- GLint border,
- GLenum format,
- GLenum type,
- GLsizei imageSize,
- const void *pixels)
-{
- if (!ValidTexture2DDestinationTarget(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTextureTarget);
- return false;
- }
-
- if (!ValidImageSizeParameters(context, target, level, width, height, 1, isSubImage))
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- if (!ValidMipLevel(context, target, level))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidMipLevel);
- return false;
- }
-
- if (xoffset < 0 || std::numeric_limits<GLsizei>::max() - xoffset < width ||
- std::numeric_limits<GLsizei>::max() - yoffset < height)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), ResourceMaxTextureSize);
- 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->handleError(InvalidOperation());
- return false;
- }
-
- const gl::Caps &caps = context->getCaps();
-
- if (target == GL_TEXTURE_2D)
- {
- if (static_cast<GLuint>(width) > (caps.max2DTextureSize >> level) ||
- static_cast<GLuint>(height) > (caps.max2DTextureSize >> level))
- {
- context->handleError(InvalidValue());
- return false;
- }
- }
- else if (target == GL_TEXTURE_RECTANGLE_ANGLE)
- {
- ASSERT(level == 0);
- if (static_cast<GLuint>(width) > caps.maxRectangleTextureSize ||
- static_cast<GLuint>(height) > caps.maxRectangleTextureSize)
- {
- context->handleError(InvalidValue());
- return false;
- }
- if (isCompressed)
- {
- context->handleError(InvalidEnum()
- << "Rectangle texture cannot have a compressed format.");
- return false;
- }
- }
- else if (IsCubeMapTextureTarget(target))
- {
- if (!isSubImage && width != height)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), CubemapFacesEqualDimensions);
- return false;
- }
-
- if (static_cast<GLuint>(width) > (caps.maxCubeMapTextureSize >> level) ||
- static_cast<GLuint>(height) > (caps.maxCubeMapTextureSize >> level))
- {
- context->handleError(InvalidValue());
- return false;
- }
- }
- else
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- gl::Texture *texture =
- context->getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
- if (!texture)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), BufferNotBound);
- return false;
- }
-
- if (isSubImage)
- {
- const InternalFormat &textureInternalFormat = *texture->getFormat(target, level).info;
- if (textureInternalFormat.internalFormat == GL_NONE)
- {
- context->handleError(InvalidOperation() << "Texture level does not exist.");
- return false;
- }
-
- if (format != GL_NONE)
- {
- if (GetInternalFormatInfo(format, type).sizedInternalFormat !=
- textureInternalFormat.sizedInternalFormat)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), TypeMismatch);
- return false;
- }
- }
-
- if (static_cast<size_t>(xoffset + width) > texture->getWidth(target, level) ||
- static_cast<size_t>(yoffset + height) > texture->getHeight(target, level))
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- if (width > 0 && height > 0 && pixels == nullptr &&
- context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack) == nullptr)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), PixelDataNull);
- return false;
- }
- }
- else
- {
- if (texture->getImmutableFormat())
- {
- context->handleError(InvalidOperation());
- return false;
- }
- }
-
- // Verify zero border
- if (border != 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidBorder);
- return false;
- }
-
- if (isCompressed)
- {
- GLenum actualInternalFormat =
- isSubImage ? texture->getFormat(target, level).info->sizedInternalFormat
- : internalformat;
- switch (actualInternalFormat)
- {
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- if (!context->getExtensions().textureCompressionDXT1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidInternalFormat);
- return false;
- }
- break;
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
- if (!context->getExtensions().textureCompressionDXT3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidInternalFormat);
- return false;
- }
- break;
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
- if (!context->getExtensions().textureCompressionDXT5)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidInternalFormat);
- return false;
- }
- break;
- case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
- case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
- case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
- case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
- if (!context->getExtensions().textureCompressionS3TCsRGB)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidInternalFormat);
- return false;
- }
- break;
- case GL_ETC1_RGB8_OES:
- if (!context->getExtensions().compressedETC1RGB8Texture)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidInternalFormat);
- return false;
- }
- if (isSubImage)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidInternalFormat);
- return false;
- }
- break;
- case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
- case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
- if (!context->getExtensions().lossyETCDecode)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidInternalFormat);
- return false;
- }
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidInternalFormat);
- return false;
- }
-
- if (isSubImage)
- {
- if (!ValidCompressedSubImageSize(context, actualInternalFormat, xoffset, yoffset, width,
- height, texture->getWidth(target, level),
- texture->getHeight(target, level)))
- {
- context->handleError(InvalidOperation() << "Invalid compressed format dimension.");
- return false;
- }
-
- if (format != actualInternalFormat)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidFormat);
- return false;
- }
- }
- else
- {
- if (!ValidCompressedImageSize(context, actualInternalFormat, level, width, height))
- {
- context->handleError(InvalidOperation() << "Invalid compressed format dimension.");
- return false;
- }
- }
- }
- else
- {
- // validate <type> by itself (used as secondary key below)
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- case GL_UNSIGNED_SHORT_5_6_5:
- case GL_UNSIGNED_SHORT_4_4_4_4:
- case GL_UNSIGNED_SHORT_5_5_5_1:
- case GL_UNSIGNED_SHORT:
- case GL_UNSIGNED_INT:
- case GL_UNSIGNED_INT_24_8_OES:
- case GL_HALF_FLOAT_OES:
- case GL_FLOAT:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidType);
- return false;
- }
-
- // validate <format> + <type> combinations
- // - invalid <format> -> sets INVALID_ENUM
- // - invalid <format>+<type> combination -> sets INVALID_OPERATION
- switch (format)
- {
- case GL_ALPHA:
- case GL_LUMINANCE:
- case GL_LUMINANCE_ALPHA:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- case GL_FLOAT:
- case GL_HALF_FLOAT_OES:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MismatchedTypeAndFormat);
- return false;
- }
- break;
- case GL_RED:
- case GL_RG:
- if (!context->getExtensions().textureRG)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- break;
- case GL_FLOAT:
- case GL_HALF_FLOAT_OES:
- if (!context->getExtensions().textureFloat)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MismatchedTypeAndFormat);
- return false;
- }
- break;
- case GL_RGB:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- case GL_UNSIGNED_SHORT_5_6_5:
- case GL_FLOAT:
- case GL_HALF_FLOAT_OES:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MismatchedTypeAndFormat);
- return false;
- }
- break;
- case GL_RGBA:
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- case GL_UNSIGNED_SHORT_4_4_4_4:
- case GL_UNSIGNED_SHORT_5_5_5_1:
- case GL_FLOAT:
- case GL_HALF_FLOAT_OES:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MismatchedTypeAndFormat);
- return false;
- }
- break;
- case GL_BGRA_EXT:
- if (!context->getExtensions().textureFormatBGRA8888)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MismatchedTypeAndFormat);
- return false;
- }
- break;
- case GL_SRGB_EXT:
- case GL_SRGB_ALPHA_EXT:
- if (!context->getExtensions().sRGB)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- switch (type)
- {
- case GL_UNSIGNED_BYTE:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MismatchedTypeAndFormat);
- return false;
- }
- break;
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are
- // handled below
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
- break;
- case GL_DEPTH_COMPONENT:
- switch (type)
- {
- case GL_UNSIGNED_SHORT:
- case GL_UNSIGNED_INT:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MismatchedTypeAndFormat);
- return false;
- }
- break;
- case GL_DEPTH_STENCIL_OES:
- switch (type)
- {
- case GL_UNSIGNED_INT_24_8_OES:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MismatchedTypeAndFormat);
- return false;
- }
- break;
- default:
- context->handleError(InvalidEnum());
- return false;
- }
-
- switch (format)
- {
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- if (context->getExtensions().textureCompressionDXT1)
- {
- context->handleError(InvalidOperation());
- return false;
- }
- else
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
- if (context->getExtensions().textureCompressionDXT3)
- {
- context->handleError(InvalidOperation());
- return false;
- }
- else
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
- if (context->getExtensions().textureCompressionDXT5)
- {
- context->handleError(InvalidOperation());
- return false;
- }
- else
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
- case GL_ETC1_RGB8_OES:
- if (context->getExtensions().compressedETC1RGB8Texture)
- {
- context->handleError(InvalidOperation());
- return false;
- }
- else
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
- case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
- case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
- if (context->getExtensions().lossyETCDecode)
- {
- context->handleError(InvalidOperation()
- << "ETC lossy decode formats can't work with this type.");
- return false;
- }
- else
- {
- context->handleError(InvalidEnum()
- << "ANGLE_lossy_etc_decode extension is not supported.");
- return false;
- }
- break;
- case GL_DEPTH_COMPONENT:
- case GL_DEPTH_STENCIL_OES:
- if (!context->getExtensions().depthTextures)
- {
- context->handleError(InvalidValue());
- return false;
- }
- if (target != GL_TEXTURE_2D)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MismatchedTargetAndFormat);
- return false;
- }
- // OES_depth_texture supports loading depth data and multiple levels,
- // but ANGLE_depth_texture does not
- if (pixels != nullptr)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), PixelDataNotNull);
- return false;
- }
- if (level != 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), LevelNotZero);
- return false;
- }
- break;
- default:
- break;
- }
-
- if (!isSubImage)
- {
- switch (internalformat)
- {
- case GL_RGBA32F:
- if (!context->getExtensions().colorBufferFloatRGBA)
- {
- context->handleError(InvalidValue()
- << "Sized GL_RGBA32F internal format requires "
- "GL_CHROMIUM_color_buffer_float_rgba");
- return false;
- }
- if (type != GL_FLOAT)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MismatchedTypeAndFormat);
- return false;
- }
- if (format != GL_RGBA)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MismatchedTypeAndFormat);
- return false;
- }
- break;
-
- case GL_RGB32F:
- if (!context->getExtensions().colorBufferFloatRGB)
- {
- context->handleError(InvalidValue()
- << "Sized GL_RGB32F internal format requires "
- "GL_CHROMIUM_color_buffer_float_rgb");
- return false;
- }
- if (type != GL_FLOAT)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MismatchedTypeAndFormat);
- return false;
- }
- if (format != GL_RGB)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MismatchedTypeAndFormat);
- return false;
- }
- break;
-
- default:
- break;
- }
- }
-
- if (type == GL_FLOAT)
- {
- if (!context->getExtensions().textureFloat)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- }
- else if (type == GL_HALF_FLOAT_OES)
- {
- if (!context->getExtensions().textureHalfFloat)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- }
- }
-
- GLenum sizeCheckFormat = isSubImage ? format : internalformat;
- if (!ValidImageDataSize(context, target, width, height, 1, sizeCheckFormat, type, pixels,
- imageSize))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateES2TexStorageParameters(Context *context,
- GLenum target,
- GLsizei levels,
- GLenum internalformat,
- GLsizei width,
- GLsizei height)
-{
- if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP &&
- target != GL_TEXTURE_RECTANGLE_ANGLE)
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- if (width < 1 || height < 1 || levels < 1)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- if (target == GL_TEXTURE_CUBE_MAP && width != height)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(internalformat);
- if (formatInfo.format == GL_NONE || formatInfo.type == GL_NONE)
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- const gl::Caps &caps = context->getCaps();
-
- switch (target)
- {
- case GL_TEXTURE_2D:
- if (static_cast<GLuint>(width) > caps.max2DTextureSize ||
- static_cast<GLuint>(height) > caps.max2DTextureSize)
- {
- context->handleError(InvalidValue());
- return false;
- }
- break;
- case GL_TEXTURE_RECTANGLE_ANGLE:
- if (static_cast<GLuint>(width) > caps.maxRectangleTextureSize ||
- static_cast<GLuint>(height) > caps.maxRectangleTextureSize || levels != 1)
- {
- context->handleError(InvalidValue());
- return false;
- }
- if (formatInfo.compressed)
- {
- context->handleError(InvalidEnum()
- << "Rectangle texture cannot have a compressed format.");
- return false;
- }
- break;
- case GL_TEXTURE_CUBE_MAP:
- if (static_cast<GLuint>(width) > caps.maxCubeMapTextureSize ||
- static_cast<GLuint>(height) > caps.maxCubeMapTextureSize)
- {
- context->handleError(InvalidValue());
- return false;
- }
- break;
- default:
- context->handleError(InvalidEnum());
- return false;
- }
-
- if (levels != 1 && !context->getExtensions().textureNPOT)
- {
- if (!gl::isPow2(width) || !gl::isPow2(height))
- {
- context->handleError(InvalidOperation());
- return false;
- }
- }
-
- switch (internalformat)
- {
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- if (!context->getExtensions().textureCompressionDXT1)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
- if (!context->getExtensions().textureCompressionDXT3)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
- if (!context->getExtensions().textureCompressionDXT5)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
- case GL_ETC1_RGB8_OES:
- if (!context->getExtensions().compressedETC1RGB8Texture)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
- case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
- case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
- case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
- if (!context->getExtensions().lossyETCDecode)
- {
- context->handleError(InvalidEnum()
- << "ANGLE_lossy_etc_decode extension is not supported.");
- return false;
- }
- break;
- case GL_RGBA32F_EXT:
- case GL_RGB32F_EXT:
- case GL_ALPHA32F_EXT:
- case GL_LUMINANCE32F_EXT:
- case GL_LUMINANCE_ALPHA32F_EXT:
- if (!context->getExtensions().textureFloat)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
- case GL_RGBA16F_EXT:
- case GL_RGB16F_EXT:
- case GL_ALPHA16F_EXT:
- case GL_LUMINANCE16F_EXT:
- case GL_LUMINANCE_ALPHA16F_EXT:
- if (!context->getExtensions().textureHalfFloat)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
- case GL_R8_EXT:
- case GL_RG8_EXT:
- if (!context->getExtensions().textureRG)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
- case GL_R16F_EXT:
- case GL_RG16F_EXT:
- if (!context->getExtensions().textureRG || !context->getExtensions().textureHalfFloat)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
- case GL_R32F_EXT:
- case GL_RG32F_EXT:
- if (!context->getExtensions().textureRG || !context->getExtensions().textureFloat)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
- case GL_DEPTH_COMPONENT16:
- case GL_DEPTH_COMPONENT32_OES:
- case GL_DEPTH24_STENCIL8_OES:
- if (!context->getExtensions().depthTextures)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- if (target != GL_TEXTURE_2D)
- {
- context->handleError(InvalidOperation());
- return false;
- }
- // ANGLE_depth_texture only supports 1-level textures
- if (levels != 1)
- {
- context->handleError(InvalidOperation());
- return false;
- }
- break;
- default:
- break;
- }
-
- gl::Texture *texture = context->getTargetTexture(target);
- if (!texture || texture->id() == 0)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- if (texture->getImmutableFormat())
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- return true;
-}
-
-bool ValidateDiscardFramebufferEXT(Context *context,
- GLenum target,
- GLsizei numAttachments,
- const GLenum *attachments)
-{
- if (!context->getExtensions().discardFramebuffer)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- bool defaultFramebuffer = false;
-
- switch (target)
- {
- case GL_FRAMEBUFFER:
- defaultFramebuffer =
- (context->getGLState().getTargetFramebuffer(GL_FRAMEBUFFER)->id() == 0);
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFramebufferTarget);
- return false;
- }
-
- return ValidateDiscardFramebufferBase(context, target, numAttachments, attachments,
- defaultFramebuffer);
-}
-
-bool ValidateBindVertexArrayOES(Context *context, GLuint array)
-{
- if (!context->getExtensions().vertexArrayObject)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- return ValidateBindVertexArrayBase(context, array);
-}
-
-bool ValidateDeleteVertexArraysOES(Context *context, GLsizei n, const GLuint *arrays)
-{
- if (!context->getExtensions().vertexArrayObject)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- return ValidateGenOrDelete(context, n);
-}
-
-bool ValidateGenVertexArraysOES(Context *context, GLsizei n, GLuint *arrays)
-{
- if (!context->getExtensions().vertexArrayObject)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- return ValidateGenOrDelete(context, n);
-}
-
-bool ValidateIsVertexArrayOES(Context *context, GLuint array)
-{
- if (!context->getExtensions().vertexArrayObject)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- return true;
-}
-
-bool ValidateProgramBinaryOES(Context *context,
- GLuint program,
- GLenum binaryFormat,
- const void *binary,
- GLint length)
-{
- if (!context->getExtensions().getProgramBinary)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- return ValidateProgramBinaryBase(context, program, binaryFormat, binary, length);
-}
-
-bool ValidateGetProgramBinaryOES(Context *context,
- GLuint program,
- GLsizei bufSize,
- GLsizei *length,
- GLenum *binaryFormat,
- void *binary)
-{
- if (!context->getExtensions().getProgramBinary)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- return ValidateGetProgramBinaryBase(context, program, bufSize, length, binaryFormat, binary);
-}
-
-static bool ValidDebugSource(GLenum source, bool mustBeThirdPartyOrApplication)
-{
- switch (source)
- {
- case GL_DEBUG_SOURCE_API:
- case GL_DEBUG_SOURCE_SHADER_COMPILER:
- case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
- case GL_DEBUG_SOURCE_OTHER:
- // Only THIRD_PARTY and APPLICATION sources are allowed to be manually inserted
- return !mustBeThirdPartyOrApplication;
-
- case GL_DEBUG_SOURCE_THIRD_PARTY:
- case GL_DEBUG_SOURCE_APPLICATION:
- return true;
-
- default:
- return false;
- }
-}
-
-static bool ValidDebugType(GLenum type)
-{
- switch (type)
- {
- case GL_DEBUG_TYPE_ERROR:
- case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
- case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
- case GL_DEBUG_TYPE_PERFORMANCE:
- case GL_DEBUG_TYPE_PORTABILITY:
- case GL_DEBUG_TYPE_OTHER:
- case GL_DEBUG_TYPE_MARKER:
- case GL_DEBUG_TYPE_PUSH_GROUP:
- case GL_DEBUG_TYPE_POP_GROUP:
- return true;
-
- default:
- return false;
- }
-}
-
-static bool ValidDebugSeverity(GLenum severity)
-{
- switch (severity)
- {
- case GL_DEBUG_SEVERITY_HIGH:
- case GL_DEBUG_SEVERITY_MEDIUM:
- case GL_DEBUG_SEVERITY_LOW:
- case GL_DEBUG_SEVERITY_NOTIFICATION:
- return true;
-
- default:
- return false;
- }
-}
-
-bool ValidateDebugMessageControlKHR(Context *context,
- GLenum source,
- GLenum type,
- GLenum severity,
- GLsizei count,
- const GLuint *ids,
- GLboolean enabled)
-{
- if (!context->getExtensions().debug)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- if (!ValidDebugSource(source, false) && source != GL_DONT_CARE)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidDebugSource);
- return false;
- }
-
- if (!ValidDebugType(type) && type != GL_DONT_CARE)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidDebugType);
- return false;
- }
-
- if (!ValidDebugSeverity(severity) && severity != GL_DONT_CARE)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidDebugSeverity);
- return false;
- }
-
- if (count > 0)
- {
- if (source == GL_DONT_CARE || type == GL_DONT_CARE)
- {
- context->handleError(
- InvalidOperation()
- << "If count is greater than zero, source and severity cannot be GL_DONT_CARE.");
- return false;
- }
-
- if (severity != GL_DONT_CARE)
- {
- context->handleError(
- InvalidOperation()
- << "If count is greater than zero, severity must be GL_DONT_CARE.");
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateDebugMessageInsertKHR(Context *context,
- GLenum source,
- GLenum type,
- GLuint id,
- GLenum severity,
- GLsizei length,
- const GLchar *buf)
-{
- if (!context->getExtensions().debug)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- if (!context->getGLState().getDebug().isOutputEnabled())
- {
- // If the DEBUG_OUTPUT state is disabled calls to DebugMessageInsert are discarded and do
- // not generate an error.
- return false;
- }
-
- if (!ValidDebugSeverity(severity))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidDebugSource);
- return false;
- }
-
- if (!ValidDebugType(type))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidDebugType);
- return false;
- }
-
- if (!ValidDebugSource(source, true))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidDebugSource);
- return false;
- }
-
- size_t messageLength = (length < 0) ? strlen(buf) : length;
- if (messageLength > context->getExtensions().maxDebugMessageLength)
- {
- context->handleError(InvalidValue()
- << "Message length is larger than GL_MAX_DEBUG_MESSAGE_LENGTH.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateDebugMessageCallbackKHR(Context *context,
- GLDEBUGPROCKHR callback,
- const void *userParam)
-{
- if (!context->getExtensions().debug)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetDebugMessageLogKHR(Context *context,
- GLuint count,
- GLsizei bufSize,
- GLenum *sources,
- GLenum *types,
- GLuint *ids,
- GLenum *severities,
- GLsizei *lengths,
- GLchar *messageLog)
-{
- if (!context->getExtensions().debug)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- if (bufSize < 0 && messageLog != nullptr)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeBufferSize);
- return false;
- }
-
- return true;
-}
-
-bool ValidatePushDebugGroupKHR(Context *context,
- GLenum source,
- GLuint id,
- GLsizei length,
- const GLchar *message)
-{
- if (!context->getExtensions().debug)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- if (!ValidDebugSource(source, true))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidDebugSource);
- return false;
- }
-
- size_t messageLength = (length < 0) ? strlen(message) : length;
- if (messageLength > context->getExtensions().maxDebugMessageLength)
- {
- context->handleError(InvalidValue()
- << "Message length is larger than GL_MAX_DEBUG_MESSAGE_LENGTH.");
- return false;
- }
-
- size_t currentStackSize = context->getGLState().getDebug().getGroupStackDepth();
- if (currentStackSize >= context->getExtensions().maxDebugGroupStackDepth)
- {
- context
- ->handleError(StackOverflow()
- << "Cannot push more than GL_MAX_DEBUG_GROUP_STACK_DEPTH debug groups.");
- return false;
- }
-
- return true;
-}
-
-bool ValidatePopDebugGroupKHR(Context *context)
-{
- if (!context->getExtensions().debug)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- size_t currentStackSize = context->getGLState().getDebug().getGroupStackDepth();
- if (currentStackSize <= 1)
- {
- context->handleError(StackUnderflow() << "Cannot pop the default debug group.");
- return false;
- }
-
- return true;
-}
-
-static bool ValidateObjectIdentifierAndName(Context *context, GLenum identifier, GLuint name)
-{
- switch (identifier)
- {
- case GL_BUFFER:
- if (context->getBuffer(name) == nullptr)
- {
- context->handleError(InvalidValue() << "name is not a valid buffer.");
- return false;
- }
- return true;
-
- case GL_SHADER:
- if (context->getShader(name) == nullptr)
- {
- context->handleError(InvalidValue() << "name is not a valid shader.");
- return false;
- }
- return true;
-
- case GL_PROGRAM:
- if (context->getProgram(name) == nullptr)
- {
- context->handleError(InvalidValue() << "name is not a valid program.");
- return false;
- }
- return true;
-
- case GL_VERTEX_ARRAY:
- if (context->getVertexArray(name) == nullptr)
- {
- context->handleError(InvalidValue() << "name is not a valid vertex array.");
- return false;
- }
- return true;
-
- case GL_QUERY:
- if (context->getQuery(name) == nullptr)
- {
- context->handleError(InvalidValue() << "name is not a valid query.");
- return false;
- }
- return true;
-
- case GL_TRANSFORM_FEEDBACK:
- if (context->getTransformFeedback(name) == nullptr)
- {
- context->handleError(InvalidValue() << "name is not a valid transform feedback.");
- return false;
- }
- return true;
-
- case GL_SAMPLER:
- if (context->getSampler(name) == nullptr)
- {
- context->handleError(InvalidValue() << "name is not a valid sampler.");
- return false;
- }
- return true;
-
- case GL_TEXTURE:
- if (context->getTexture(name) == nullptr)
- {
- context->handleError(InvalidValue() << "name is not a valid texture.");
- return false;
- }
- return true;
-
- case GL_RENDERBUFFER:
- if (context->getRenderbuffer(name) == nullptr)
- {
- context->handleError(InvalidValue() << "name is not a valid renderbuffer.");
- return false;
- }
- return true;
-
- case GL_FRAMEBUFFER:
- if (context->getFramebuffer(name) == nullptr)
- {
- context->handleError(InvalidValue() << "name is not a valid framebuffer.");
- return false;
- }
- return true;
-
- default:
- context->handleError(InvalidEnum() << "Invalid identifier.");
- return false;
- }
-}
-
-static bool ValidateLabelLength(Context *context, GLsizei length, const GLchar *label)
-{
- size_t labelLength = 0;
-
- if (length < 0)
- {
- if (label != nullptr)
- {
- labelLength = strlen(label);
- }
- }
- else
- {
- labelLength = static_cast<size_t>(length);
- }
-
- if (labelLength > context->getExtensions().maxLabelLength)
- {
- context->handleError(InvalidValue() << "Label length is larger than GL_MAX_LABEL_LENGTH.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateObjectLabelKHR(Context *context,
- GLenum identifier,
- GLuint name,
- GLsizei length,
- const GLchar *label)
-{
- if (!context->getExtensions().debug)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- if (!ValidateObjectIdentifierAndName(context, identifier, name))
- {
- return false;
- }
-
- if (!ValidateLabelLength(context, length, label))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetObjectLabelKHR(Context *context,
- GLenum identifier,
- GLuint name,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *label)
-{
- if (!context->getExtensions().debug)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- if (bufSize < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeBufferSize);
- return false;
- }
-
- if (!ValidateObjectIdentifierAndName(context, identifier, name))
- {
- return false;
- }
-
- return true;
-}
-
-static bool ValidateObjectPtrName(Context *context, const void *ptr)
-{
- if (context->getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr))) == nullptr)
- {
- context->handleError(InvalidValue() << "name is not a valid sync.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateObjectPtrLabelKHR(Context *context,
- const void *ptr,
- GLsizei length,
- const GLchar *label)
-{
- if (!context->getExtensions().debug)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- if (!ValidateObjectPtrName(context, ptr))
- {
- return false;
- }
-
- if (!ValidateLabelLength(context, length, label))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetObjectPtrLabelKHR(Context *context,
- const void *ptr,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *label)
-{
- if (!context->getExtensions().debug)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- if (bufSize < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeBufferSize);
- return false;
- }
-
- if (!ValidateObjectPtrName(context, ptr))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetPointervKHR(Context *context, GLenum pname, void **params)
-{
- if (!context->getExtensions().debug)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExtensionNotEnabled);
- return false;
- }
-
- // TODO: represent this in Context::getQueryParameterInfo.
- switch (pname)
- {
- case GL_DEBUG_CALLBACK_FUNCTION:
- case GL_DEBUG_CALLBACK_USER_PARAM:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- return true;
-}
-
-bool ValidateBlitFramebufferANGLE(Context *context,
- GLint srcX0,
- GLint srcY0,
- GLint srcX1,
- GLint srcY1,
- GLint dstX0,
- GLint dstY0,
- GLint dstX1,
- GLint dstY1,
- GLbitfield mask,
- GLenum filter)
-{
- if (!context->getExtensions().framebufferBlit)
- {
- context->handleError(InvalidOperation() << "Blit extension not available.");
- return false;
- }
-
- if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
- {
- // TODO(jmadill): Determine if this should be available on other implementations.
- context->handleError(InvalidOperation() << "Scaling and flipping in "
- "BlitFramebufferANGLE not supported by this "
- "implementation.");
- return false;
- }
-
- if (filter == GL_LINEAR)
- {
- context->handleError(InvalidEnum() << "Linear blit not supported in this extension");
- return false;
- }
-
- Framebuffer *readFramebuffer = context->getGLState().getReadFramebuffer();
- Framebuffer *drawFramebuffer = context->getGLState().getDrawFramebuffer();
-
- if (mask & GL_COLOR_BUFFER_BIT)
- {
- const FramebufferAttachment *readColorAttachment = readFramebuffer->getReadColorbuffer();
- const FramebufferAttachment *drawColorAttachment = drawFramebuffer->getFirstColorbuffer();
-
- if (readColorAttachment && drawColorAttachment)
- {
- if (!(readColorAttachment->type() == GL_TEXTURE &&
- readColorAttachment->getTextureImageIndex().type == GL_TEXTURE_2D) &&
- readColorAttachment->type() != GL_RENDERBUFFER &&
- readColorAttachment->type() != GL_FRAMEBUFFER_DEFAULT)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- for (size_t drawbufferIdx = 0;
- drawbufferIdx < drawFramebuffer->getDrawbufferStateCount(); ++drawbufferIdx)
- {
- const FramebufferAttachment *attachment =
- drawFramebuffer->getDrawBuffer(drawbufferIdx);
- if (attachment)
- {
- if (!(attachment->type() == GL_TEXTURE &&
- attachment->getTextureImageIndex().type == GL_TEXTURE_2D) &&
- attachment->type() != GL_RENDERBUFFER &&
- attachment->type() != GL_FRAMEBUFFER_DEFAULT)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- // Return an error if the destination formats do not match
- if (!Format::EquivalentForBlit(attachment->getFormat(),
- readColorAttachment->getFormat()))
- {
- context->handleError(InvalidOperation());
- return false;
- }
- }
- }
-
- if (readFramebuffer->getSamples(context) != 0 &&
- IsPartialBlit(context, readColorAttachment, drawColorAttachment, srcX0, srcY0,
- srcX1, srcY1, dstX0, dstY0, dstX1, dstY1))
- {
- context->handleError(InvalidOperation());
- return false;
- }
- }
- }
-
- GLenum masks[] = {GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT};
- GLenum attachments[] = {GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT};
- for (size_t i = 0; i < 2; i++)
- {
- if (mask & masks[i])
- {
- const FramebufferAttachment *readBuffer =
- readFramebuffer->getAttachment(attachments[i]);
- const FramebufferAttachment *drawBuffer =
- drawFramebuffer->getAttachment(attachments[i]);
-
- if (readBuffer && drawBuffer)
- {
- if (IsPartialBlit(context, readBuffer, drawBuffer, srcX0, srcY0, srcX1, srcY1,
- dstX0, dstY0, dstX1, dstY1))
- {
- // only whole-buffer copies are permitted
- context->handleError(InvalidOperation() << "Only whole-buffer depth and "
- "stencil blits are supported by "
- "this extension.");
- return false;
- }
-
- if (readBuffer->getSamples() != 0 || drawBuffer->getSamples() != 0)
- {
- context->handleError(InvalidOperation());
- return false;
- }
- }
- }
- }
-
- return ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0,
- dstX1, dstY1, mask, filter);
-}
-
-bool ValidateClear(ValidationContext *context, GLbitfield mask)
-{
- Framebuffer *fbo = context->getGLState().getDrawFramebuffer();
- if (fbo->checkStatus(context) != GL_FRAMEBUFFER_COMPLETE)
- {
- context->handleError(InvalidFramebufferOperation());
- return false;
- }
-
- if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidClearMask);
- return false;
- }
-
- if (context->getExtensions().webglCompatibility && (mask & GL_COLOR_BUFFER_BIT) != 0)
- {
- constexpr GLenum validComponentTypes[] = {GL_FLOAT, GL_UNSIGNED_NORMALIZED,
- GL_SIGNED_NORMALIZED};
-
- for (GLuint drawBufferIdx = 0; drawBufferIdx < fbo->getDrawbufferStateCount();
- drawBufferIdx++)
- {
- if (!ValidateWebGLFramebufferAttachmentClearType(
- context, drawBufferIdx, validComponentTypes, ArraySize(validComponentTypes)))
- {
- return false;
- }
- }
- }
-
- return true;
-}
-
-bool ValidateDrawBuffersEXT(ValidationContext *context, GLsizei n, const GLenum *bufs)
-{
- if (!context->getExtensions().drawBuffers)
- {
- context->handleError(InvalidOperation() << "Extension not supported.");
- return false;
- }
-
- return ValidateDrawBuffersBase(context, n, bufs);
-}
-
-bool ValidateTexImage2D(Context *context,
- GLenum target,
- GLint level,
- GLint internalformat,
- GLsizei width,
- GLsizei height,
- GLint border,
- GLenum format,
- GLenum type,
- const void *pixels)
-{
- if (context->getClientMajorVersion() < 3)
- {
- return ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
- 0, 0, width, height, border, format, type, -1, pixels);
- }
-
- ASSERT(context->getClientMajorVersion() >= 3);
- return ValidateES3TexImage2DParameters(context, target, level, internalformat, false, false, 0,
- 0, 0, width, height, 1, border, format, type, -1,
- pixels);
-}
-
-bool ValidateTexImage2DRobust(Context *context,
- GLenum target,
- GLint level,
- GLint internalformat,
- GLsizei width,
- GLsizei height,
- GLint border,
- GLenum format,
- GLenum type,
- GLsizei bufSize,
- const void *pixels)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (context->getClientMajorVersion() < 3)
- {
- return ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
- 0, 0, width, height, border, format, type, bufSize,
- pixels);
- }
-
- ASSERT(context->getClientMajorVersion() >= 3);
- return ValidateES3TexImage2DParameters(context, target, level, internalformat, false, false, 0,
- 0, 0, width, height, 1, border, format, type, bufSize,
- pixels);
-}
-
-bool ValidateTexSubImage2D(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLenum type,
- const void *pixels)
-{
-
- if (context->getClientMajorVersion() < 3)
- {
- return ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true, xoffset,
- yoffset, width, height, 0, format, type, -1, pixels);
- }
-
- ASSERT(context->getClientMajorVersion() >= 3);
- return ValidateES3TexImage2DParameters(context, target, level, GL_NONE, false, true, xoffset,
- yoffset, 0, width, height, 1, 0, format, type, -1,
- pixels);
-}
-
-bool ValidateTexSubImage2DRobustANGLE(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLenum type,
- GLsizei bufSize,
- const void *pixels)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (context->getClientMajorVersion() < 3)
- {
- return ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true, xoffset,
- yoffset, width, height, 0, format, type, bufSize,
- pixels);
- }
-
- ASSERT(context->getClientMajorVersion() >= 3);
- return ValidateES3TexImage2DParameters(context, target, level, GL_NONE, false, true, xoffset,
- yoffset, 0, width, height, 1, 0, format, type, bufSize,
- pixels);
-}
-
-bool ValidateCompressedTexImage2D(Context *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLint border,
- GLsizei imageSize,
- const void *data)
-{
- if (context->getClientMajorVersion() < 3)
- {
- if (!ValidateES2TexImageParameters(context, target, level, internalformat, true, false, 0,
- 0, width, height, border, GL_NONE, GL_NONE, -1, data))
- {
- return false;
- }
- }
- else
- {
- ASSERT(context->getClientMajorVersion() >= 3);
- if (!ValidateES3TexImage2DParameters(context, target, level, internalformat, true, false, 0,
- 0, 0, width, height, 1, border, GL_NONE, GL_NONE, -1,
- data))
- {
- return false;
- }
- }
-
- const InternalFormat &formatInfo = GetSizedInternalFormatInfo(internalformat);
- auto blockSizeOrErr = formatInfo.computeCompressedImageSize(gl::Extents(width, height, 1));
- if (blockSizeOrErr.isError())
- {
- context->handleError(blockSizeOrErr.getError());
- return false;
- }
-
- if (imageSize < 0 || static_cast<GLuint>(imageSize) != blockSizeOrErr.getResult())
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), CompressedTextureDimensionsMustMatchData);
- return false;
- }
-
- if (target == GL_TEXTURE_RECTANGLE_ANGLE)
- {
- context->handleError(InvalidEnum() << "Rectangle texture cannot have a compressed format.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateCompressedTexImage2DRobustANGLE(Context *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLint border,
- GLsizei imageSize,
- GLsizei dataSize,
- const void *data)
-{
- if (!ValidateRobustCompressedTexImageBase(context, imageSize, dataSize))
- {
- return false;
- }
-
- return ValidateCompressedTexImage2D(context, target, level, internalformat, width, height,
- border, imageSize, data);
-}
-bool ValidateCompressedTexSubImage2DRobustANGLE(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLsizei imageSize,
- GLsizei dataSize,
- const void *data)
-{
- if (!ValidateRobustCompressedTexImageBase(context, imageSize, dataSize))
- {
- return false;
- }
-
- return ValidateCompressedTexSubImage2D(context, target, level, xoffset, yoffset, width, height,
- format, imageSize, data);
-}
-
-bool ValidateCompressedTexSubImage2D(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLsizei imageSize,
- const void *data)
-{
- if (context->getClientMajorVersion() < 3)
- {
- if (!ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true, xoffset,
- yoffset, width, height, 0, format, GL_NONE, -1, data))
- {
- return false;
- }
- }
- else
- {
- ASSERT(context->getClientMajorVersion() >= 3);
- if (!ValidateES3TexImage2DParameters(context, target, level, GL_NONE, true, true, xoffset,
- yoffset, 0, width, height, 1, 0, format, GL_NONE, -1,
- data))
- {
- return false;
- }
- }
-
- const InternalFormat &formatInfo = GetSizedInternalFormatInfo(format);
- auto blockSizeOrErr = formatInfo.computeCompressedImageSize(gl::Extents(width, height, 1));
- if (blockSizeOrErr.isError())
- {
- context->handleError(blockSizeOrErr.getError());
- return false;
- }
-
- if (imageSize < 0 || static_cast<GLuint>(imageSize) != blockSizeOrErr.getResult())
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetBufferPointervOES(Context *context,
- BufferBinding target,
- GLenum pname,
- void **params)
-{
- return ValidateGetBufferPointervBase(context, target, pname, nullptr, params);
-}
-
-bool ValidateMapBufferOES(Context *context, BufferBinding target, GLenum access)
-{
- if (!context->getExtensions().mapBuffer)
- {
- context->handleError(InvalidOperation() << "Map buffer extension not available.");
- return false;
- }
-
- if (!ValidBufferType(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidBufferTypes);
- return false;
- }
-
- Buffer *buffer = context->getGLState().getTargetBuffer(target);
-
- if (buffer == nullptr)
- {
- context->handleError(InvalidOperation() << "Attempted to map buffer object zero.");
- return false;
- }
-
- if (access != GL_WRITE_ONLY_OES)
- {
- context->handleError(InvalidEnum() << "Non-write buffer mapping not supported.");
- return false;
- }
-
- if (buffer->isMapped())
- {
- context->handleError(InvalidOperation() << "Buffer is already mapped.");
- return false;
- }
-
- return ValidateMapBufferBase(context, target);
-}
-
-bool ValidateUnmapBufferOES(Context *context, BufferBinding target)
-{
- if (!context->getExtensions().mapBuffer)
- {
- context->handleError(InvalidOperation() << "Map buffer extension not available.");
- return false;
- }
-
- return ValidateUnmapBufferBase(context, target);
-}
-
-bool ValidateMapBufferRangeEXT(Context *context,
- BufferBinding target,
- GLintptr offset,
- GLsizeiptr length,
- GLbitfield access)
-{
- if (!context->getExtensions().mapBufferRange)
- {
- context->handleError(InvalidOperation() << "Map buffer range extension not available.");
- return false;
- }
-
- return ValidateMapBufferRangeBase(context, target, offset, length, access);
-}
-
-bool ValidateMapBufferBase(Context *context, BufferBinding target)
-{
- Buffer *buffer = context->getGLState().getTargetBuffer(target);
- ASSERT(buffer != nullptr);
-
- // Check if this buffer is currently being used as a transform feedback output buffer
- TransformFeedback *transformFeedback = context->getGLState().getCurrentTransformFeedback();
- if (transformFeedback != nullptr && transformFeedback->isActive())
- {
- for (size_t i = 0; i < transformFeedback->getIndexedBufferCount(); i++)
- {
- const auto &transformFeedbackBuffer = transformFeedback->getIndexedBuffer(i);
- if (transformFeedbackBuffer.get() == buffer)
- {
- context->handleError(InvalidOperation()
- << "Buffer is currently bound for transform feedback.");
- return false;
- }
- }
- }
-
- return true;
-}
-
-bool ValidateFlushMappedBufferRangeEXT(Context *context,
- BufferBinding target,
- GLintptr offset,
- GLsizeiptr length)
-{
- if (!context->getExtensions().mapBufferRange)
- {
- context->handleError(InvalidOperation() << "Map buffer range extension not available.");
- return false;
- }
-
- return ValidateFlushMappedBufferRangeBase(context, target, offset, length);
-}
-
-bool ValidateBindTexture(Context *context, GLenum target, GLuint texture)
-{
- Texture *textureObject = context->getTexture(texture);
- if (textureObject && textureObject->getTarget() != target && texture != 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), TypeMismatch);
- return false;
- }
-
- if (!context->getGLState().isBindGeneratesResourceEnabled() &&
- !context->isTextureGenerated(texture))
- {
- context->handleError(InvalidOperation() << "Texture was not generated");
- return false;
- }
-
- switch (target)
- {
- case GL_TEXTURE_2D:
- case GL_TEXTURE_CUBE_MAP:
- break;
-
- case GL_TEXTURE_RECTANGLE_ANGLE:
- if (!context->getExtensions().textureRectangle)
- {
- context->handleError(InvalidEnum()
- << "Context does not support GL_ANGLE_texture_rectangle");
- return false;
- }
- break;
-
- case GL_TEXTURE_3D:
- case GL_TEXTURE_2D_ARRAY:
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), ES3Required);
- return false;
- }
- break;
-
- case GL_TEXTURE_2D_MULTISAMPLE:
- if (context->getClientVersion() < Version(3, 1))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), ES31Required);
- return false;
- }
- break;
-
- case GL_TEXTURE_EXTERNAL_OES:
- if (!context->getExtensions().eglImageExternal &&
- !context->getExtensions().eglStreamConsumerExternal)
- {
- context->handleError(InvalidEnum() << "External texture extension not enabled");
- return false;
- }
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTextureTarget);
- return false;
- }
-
- return true;
-}
-
-bool ValidateBindUniformLocationCHROMIUM(Context *context,
- GLuint program,
- GLint location,
- const GLchar *name)
-{
- if (!context->getExtensions().bindUniformLocation)
- {
- context->handleError(InvalidOperation()
- << "GL_CHROMIUM_bind_uniform_location is not available.");
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
- if (!programObject)
- {
- return false;
- }
-
- if (location < 0)
- {
- context->handleError(InvalidValue() << "Location cannot be less than 0.");
- return false;
- }
-
- const Caps &caps = context->getCaps();
- if (static_cast<size_t>(location) >=
- (caps.maxVertexUniformVectors + caps.maxFragmentUniformVectors) * 4)
- {
- context->handleError(InvalidValue() << "Location must be less than "
- "(MAX_VERTEX_UNIFORM_VECTORS + "
- "MAX_FRAGMENT_UNIFORM_VECTORS) * 4");
- return false;
- }
-
- // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
- // shader-related entry points
- if (context->getExtensions().webglCompatibility && !IsValidESSLString(name, strlen(name)))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidNameCharacters);
- return false;
- }
-
- if (strncmp(name, "gl_", 3) == 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NameBeginsWithGL);
- return false;
- }
-
- return true;
-}
-
-bool ValidateCoverageModulationCHROMIUM(Context *context, GLenum components)
-{
- if (!context->getExtensions().framebufferMixedSamples)
- {
- context->handleError(InvalidOperation()
- << "GL_CHROMIUM_framebuffer_mixed_samples is not available.");
- return false;
- }
- switch (components)
- {
- case GL_RGB:
- case GL_RGBA:
- case GL_ALPHA:
- case GL_NONE:
- break;
- default:
- context->handleError(
- InvalidEnum()
- << "GLenum components is not one of GL_RGB, GL_RGBA, GL_ALPHA or GL_NONE.");
- return false;
- }
-
- return true;
-}
-
-// CHROMIUM_path_rendering
-
-bool ValidateMatrix(Context *context, GLenum matrixMode, const GLfloat *matrix)
-{
- if (!context->getExtensions().pathRendering)
- {
- context->handleError(InvalidOperation() << "GL_CHROMIUM_path_rendering is not available.");
- return false;
- }
- if (matrixMode != GL_PATH_MODELVIEW_CHROMIUM && matrixMode != GL_PATH_PROJECTION_CHROMIUM)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidMatrixMode);
- return false;
- }
- if (matrix == nullptr)
- {
- context->handleError(InvalidOperation() << "Invalid matrix.");
- return false;
- }
- return true;
-}
-
-bool ValidateMatrixMode(Context *context, GLenum matrixMode)
-{
- if (!context->getExtensions().pathRendering)
- {
- context->handleError(InvalidOperation() << "GL_CHROMIUM_path_rendering is not available.");
- return false;
- }
- if (matrixMode != GL_PATH_MODELVIEW_CHROMIUM && matrixMode != GL_PATH_PROJECTION_CHROMIUM)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidMatrixMode);
- return false;
- }
- return true;
-}
-
-bool ValidateGenPaths(Context *context, GLsizei range)
-{
- if (!context->getExtensions().pathRendering)
- {
- context->handleError(InvalidOperation() << "GL_CHROMIUM_path_rendering is not available.");
- return false;
- }
-
- // range = 0 is undefined in NV_path_rendering.
- // we add stricter semantic check here and require a non zero positive range.
- if (range <= 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidRange);
- return false;
- }
-
- if (!angle::IsValueInRangeForNumericType<std::uint32_t>(range))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), IntegerOverflow);
- return false;
- }
-
- return true;
-}
-
-bool ValidateDeletePaths(Context *context, GLuint path, GLsizei range)
-{
- if (!context->getExtensions().pathRendering)
- {
- context->handleError(InvalidOperation() << "GL_CHROMIUM_path_rendering is not available.");
- return false;
- }
-
- // range = 0 is undefined in NV_path_rendering.
- // we add stricter semantic check here and require a non zero positive range.
- if (range <= 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidRange);
- return false;
- }
-
- angle::CheckedNumeric<std::uint32_t> checkedRange(path);
- checkedRange += range;
-
- if (!angle::IsValueInRangeForNumericType<std::uint32_t>(range) || !checkedRange.IsValid())
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), IntegerOverflow);
- return false;
- }
- return true;
-}
-
-bool ValidatePathCommands(Context *context,
- GLuint path,
- GLsizei numCommands,
- const GLubyte *commands,
- GLsizei numCoords,
- GLenum coordType,
- const void *coords)
-{
- if (!context->getExtensions().pathRendering)
- {
- context->handleError(InvalidOperation() << "GL_CHROMIUM_path_rendering is not available.");
- return false;
- }
- if (!context->hasPath(path))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), NoSuchPath);
- return false;
- }
-
- if (numCommands < 0)
- {
- context->handleError(InvalidValue() << "Invalid number of commands.");
- return false;
- }
- else if (numCommands > 0)
- {
- if (!commands)
- {
- context->handleError(InvalidValue() << "No commands array given.");
- return false;
- }
- }
-
- if (numCoords < 0)
- {
- context->handleError(InvalidValue() << "Invalid number of coordinates.");
- return false;
- }
- else if (numCoords > 0)
- {
- if (!coords)
- {
- context->handleError(InvalidValue() << "No coordinate array given.");
- return false;
- }
- }
-
- std::uint32_t coordTypeSize = 0;
- switch (coordType)
- {
- case GL_BYTE:
- coordTypeSize = sizeof(GLbyte);
- break;
-
- case GL_UNSIGNED_BYTE:
- coordTypeSize = sizeof(GLubyte);
- break;
-
- case GL_SHORT:
- coordTypeSize = sizeof(GLshort);
- break;
-
- case GL_UNSIGNED_SHORT:
- coordTypeSize = sizeof(GLushort);
- break;
-
- case GL_FLOAT:
- coordTypeSize = sizeof(GLfloat);
- break;
-
- default:
- context->handleError(InvalidEnum() << "Invalid coordinate type.");
- return false;
- }
-
- angle::CheckedNumeric<std::uint32_t> checkedSize(numCommands);
- checkedSize += (coordTypeSize * numCoords);
- if (!checkedSize.IsValid())
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), IntegerOverflow);
- return false;
- }
-
- // early return skips command data validation when it doesn't exist.
- if (!commands)
- return true;
-
- GLsizei expectedNumCoords = 0;
- for (GLsizei i = 0; i < numCommands; ++i)
- {
- switch (commands[i])
- {
- case GL_CLOSE_PATH_CHROMIUM: // no coordinates.
- break;
- case GL_MOVE_TO_CHROMIUM:
- case GL_LINE_TO_CHROMIUM:
- expectedNumCoords += 2;
- break;
- case GL_QUADRATIC_CURVE_TO_CHROMIUM:
- expectedNumCoords += 4;
- break;
- case GL_CUBIC_CURVE_TO_CHROMIUM:
- expectedNumCoords += 6;
- break;
- case GL_CONIC_CURVE_TO_CHROMIUM:
- expectedNumCoords += 5;
- break;
- default:
- context->handleError(InvalidEnum() << "Invalid command.");
- return false;
- }
- }
- if (expectedNumCoords != numCoords)
- {
- context->handleError(InvalidValue() << "Invalid number of coordinates.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateSetPathParameter(Context *context, GLuint path, GLenum pname, GLfloat value)
-{
- if (!context->getExtensions().pathRendering)
- {
- context->handleError(InvalidOperation() << "GL_CHROMIUM_path_rendering is not available.");
- return false;
- }
- if (!context->hasPath(path))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), NoSuchPath);
- return false;
- }
-
- switch (pname)
- {
- case GL_PATH_STROKE_WIDTH_CHROMIUM:
- if (value < 0.0f)
- {
- context->handleError(InvalidValue() << "Invalid stroke width.");
- return false;
- }
- break;
- case GL_PATH_END_CAPS_CHROMIUM:
- switch (static_cast<GLenum>(value))
- {
- case GL_FLAT_CHROMIUM:
- case GL_SQUARE_CHROMIUM:
- case GL_ROUND_CHROMIUM:
- break;
- default:
- context->handleError(InvalidEnum() << "Invalid end caps.");
- return false;
- }
- break;
- case GL_PATH_JOIN_STYLE_CHROMIUM:
- switch (static_cast<GLenum>(value))
- {
- case GL_MITER_REVERT_CHROMIUM:
- case GL_BEVEL_CHROMIUM:
- case GL_ROUND_CHROMIUM:
- break;
- default:
- context->handleError(InvalidEnum() << "Invalid join style.");
- return false;
- }
- case GL_PATH_MITER_LIMIT_CHROMIUM:
- if (value < 0.0f)
- {
- context->handleError(InvalidValue() << "Invalid miter limit.");
- return false;
- }
- break;
-
- case GL_PATH_STROKE_BOUND_CHROMIUM:
- // no errors, only clamping.
- break;
-
- default:
- context->handleError(InvalidEnum() << "Invalid path parameter.");
- return false;
- }
- return true;
-}
-
-bool ValidateGetPathParameter(Context *context, GLuint path, GLenum pname, GLfloat *value)
-{
- if (!context->getExtensions().pathRendering)
- {
- context->handleError(InvalidOperation() << "GL_CHROMIUM_path_rendering is not available.");
- return false;
- }
-
- if (!context->hasPath(path))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), NoSuchPath);
- return false;
- }
- if (!value)
- {
- context->handleError(InvalidValue() << "No value array.");
- return false;
- }
-
- switch (pname)
- {
- case GL_PATH_STROKE_WIDTH_CHROMIUM:
- case GL_PATH_END_CAPS_CHROMIUM:
- case GL_PATH_JOIN_STYLE_CHROMIUM:
- case GL_PATH_MITER_LIMIT_CHROMIUM:
- case GL_PATH_STROKE_BOUND_CHROMIUM:
- break;
-
- default:
- context->handleError(InvalidEnum() << "Invalid path parameter.");
- return false;
- }
-
- return true;
-}
-
-bool ValidatePathStencilFunc(Context *context, GLenum func, GLint ref, GLuint mask)
-{
- if (!context->getExtensions().pathRendering)
- {
- context->handleError(InvalidOperation() << "GL_CHROMIUM_path_rendering is not available.");
- return false;
- }
-
- switch (func)
- {
- case GL_NEVER:
- case GL_ALWAYS:
- case GL_LESS:
- case GL_LEQUAL:
- case GL_EQUAL:
- case GL_GEQUAL:
- case GL_GREATER:
- case GL_NOTEQUAL:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidStencil);
- return false;
- }
-
- return true;
-}
-
-// Note that the spec specifies that for the path drawing commands
-// if the path object is not an existing path object the command
-// does nothing and no error is generated.
-// However if the path object exists but has not been specified any
-// commands then an error is generated.
-
-bool ValidateStencilFillPath(Context *context, GLuint path, GLenum fillMode, GLuint mask)
-{
- if (!context->getExtensions().pathRendering)
- {
- context->handleError(InvalidOperation() << "GL_CHROMIUM_path_rendering is not available.");
- return false;
- }
- if (context->hasPath(path) && !context->hasPathData(path))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), NoSuchPath);
- return false;
- }
-
- switch (fillMode)
- {
- case GL_COUNT_UP_CHROMIUM:
- case GL_COUNT_DOWN_CHROMIUM:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFillMode);
- return false;
- }
-
- if (!isPow2(mask + 1))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidStencilBitMask);
- return false;
- }
-
- return true;
-}
-
-bool ValidateStencilStrokePath(Context *context, GLuint path, GLint reference, GLuint mask)
-{
- if (!context->getExtensions().pathRendering)
- {
- context->handleError(InvalidOperation() << "GL_CHROMIUM_path_rendering is not available.");
- return false;
- }
- if (context->hasPath(path) && !context->hasPathData(path))
- {
- context->handleError(InvalidOperation() << "No such path or path has no data.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateCoverPath(Context *context, GLuint path, GLenum coverMode)
-{
- if (!context->getExtensions().pathRendering)
- {
- context->handleError(InvalidOperation() << "GL_CHROMIUM_path_rendering is not available.");
- return false;
- }
- if (context->hasPath(path) && !context->hasPathData(path))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), NoSuchPath);
- return false;
- }
-
- switch (coverMode)
- {
- case GL_CONVEX_HULL_CHROMIUM:
- case GL_BOUNDING_BOX_CHROMIUM:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidCoverMode);
- return false;
- }
- return true;
-}
-
-bool ValidateStencilThenCoverFillPath(Context *context,
- GLuint path,
- GLenum fillMode,
- GLuint mask,
- GLenum coverMode)
-{
- return ValidateStencilFillPath(context, path, fillMode, mask) &&
- ValidateCoverPath(context, path, coverMode);
-}
-
-bool ValidateStencilThenCoverStrokePath(Context *context,
- GLuint path,
- GLint reference,
- GLuint mask,
- GLenum coverMode)
-{
- return ValidateStencilStrokePath(context, path, reference, mask) &&
- ValidateCoverPath(context, path, coverMode);
-}
-
-bool ValidateIsPath(Context *context)
-{
- if (!context->getExtensions().pathRendering)
- {
- context->handleError(InvalidOperation() << "GL_CHROMIUM_path_rendering is not available.");
- return false;
- }
- return true;
-}
-
-bool ValidateCoverFillPathInstanced(Context *context,
- GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues)
-{
- if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
- transformType, transformValues))
- return false;
-
- switch (coverMode)
- {
- case GL_CONVEX_HULL_CHROMIUM:
- case GL_BOUNDING_BOX_CHROMIUM:
- case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidCoverMode);
- return false;
- }
-
- return true;
-}
-
-bool ValidateCoverStrokePathInstanced(Context *context,
- GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues)
-{
- if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
- transformType, transformValues))
- return false;
-
- switch (coverMode)
- {
- case GL_CONVEX_HULL_CHROMIUM:
- case GL_BOUNDING_BOX_CHROMIUM:
- case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidCoverMode);
- return false;
- }
-
- return true;
-}
-
-bool ValidateStencilFillPathInstanced(Context *context,
- GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLenum fillMode,
- GLuint mask,
- GLenum transformType,
- const GLfloat *transformValues)
-{
-
- if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
- transformType, transformValues))
- return false;
-
- switch (fillMode)
- {
- case GL_COUNT_UP_CHROMIUM:
- case GL_COUNT_DOWN_CHROMIUM:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFillMode);
- return false;
- }
- if (!isPow2(mask + 1))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidStencilBitMask);
- return false;
- }
- return true;
-}
-
-bool ValidateStencilStrokePathInstanced(Context *context,
- GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLint reference,
- GLuint mask,
- GLenum transformType,
- const GLfloat *transformValues)
-{
- if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
- transformType, transformValues))
- return false;
-
- // no more validation here.
-
- return true;
-}
-
-bool ValidateStencilThenCoverFillPathInstanced(Context *context,
- GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLenum fillMode,
- GLuint mask,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues)
-{
- if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
- transformType, transformValues))
- return false;
-
- switch (coverMode)
- {
- case GL_CONVEX_HULL_CHROMIUM:
- case GL_BOUNDING_BOX_CHROMIUM:
- case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidCoverMode);
- return false;
- }
-
- switch (fillMode)
- {
- case GL_COUNT_UP_CHROMIUM:
- case GL_COUNT_DOWN_CHROMIUM:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFillMode);
- return false;
- }
- if (!isPow2(mask + 1))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidStencilBitMask);
- return false;
- }
-
- return true;
-}
-
-bool ValidateStencilThenCoverStrokePathInstanced(Context *context,
- GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLint reference,
- GLuint mask,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues)
-{
- if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
- transformType, transformValues))
- return false;
-
- switch (coverMode)
- {
- case GL_CONVEX_HULL_CHROMIUM:
- case GL_BOUNDING_BOX_CHROMIUM:
- case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidCoverMode);
- return false;
- }
-
- return true;
-}
-
-bool ValidateBindFragmentInputLocation(Context *context,
- GLuint program,
- GLint location,
- const GLchar *name)
-{
- if (!context->getExtensions().pathRendering)
- {
- context->handleError(InvalidOperation() << "GL_CHROMIUM_path_rendering is not available.");
- return false;
- }
-
- const GLint MaxLocation = context->getCaps().maxVaryingVectors * 4;
- if (location >= MaxLocation)
- {
- context->handleError(InvalidValue() << "Location exceeds max varying.");
- return false;
- }
-
- const auto *programObject = context->getProgram(program);
- if (!programObject)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ProgramNotBound);
- return false;
- }
-
- if (!name)
- {
- context->handleError(InvalidValue() << "No name given.");
- return false;
- }
-
- if (angle::BeginsWith(name, "gl_"))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), NameBeginsWithGL);
- return false;
- }
-
- return true;
-}
-
-bool ValidateProgramPathFragmentInputGen(Context *context,
- GLuint program,
- GLint location,
- GLenum genMode,
- GLint components,
- const GLfloat *coeffs)
-{
- if (!context->getExtensions().pathRendering)
- {
- context->handleError(InvalidOperation() << "GL_CHROMIUM_path_rendering is not available.");
- return false;
- }
-
- const auto *programObject = context->getProgram(program);
- if (!programObject || programObject->isFlaggedForDeletion())
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ProgramDoesNotExist);
- return false;
- }
-
- if (!programObject->isLinked())
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ProgramNotLinked);
- return false;
- }
-
- switch (genMode)
- {
- case GL_NONE:
- if (components != 0)
- {
- context->handleError(InvalidValue() << "Invalid components.");
- return false;
- }
- break;
-
- case GL_OBJECT_LINEAR_CHROMIUM:
- case GL_EYE_LINEAR_CHROMIUM:
- case GL_CONSTANT_CHROMIUM:
- if (components < 1 || components > 4)
- {
- context->handleError(InvalidValue() << "Invalid components.");
- return false;
- }
- if (!coeffs)
- {
- context->handleError(InvalidValue() << "No coefficients array given.");
- return false;
- }
- break;
-
- default:
- context->handleError(InvalidEnum() << "Invalid gen mode.");
- return false;
- }
-
- // If the location is -1 then the command is silently ignored
- // and no further validation is needed.
- if (location == -1)
- return true;
-
- const auto &binding = programObject->getFragmentInputBindingInfo(context, location);
-
- if (!binding.valid)
- {
- context->handleError(InvalidOperation() << "No such binding.");
- return false;
- }
-
- if (binding.type != GL_NONE)
- {
- GLint expectedComponents = 0;
- switch (binding.type)
- {
- case GL_FLOAT:
- expectedComponents = 1;
- break;
- case GL_FLOAT_VEC2:
- expectedComponents = 2;
- break;
- case GL_FLOAT_VEC3:
- expectedComponents = 3;
- break;
- case GL_FLOAT_VEC4:
- expectedComponents = 4;
- break;
- default:
- context->handleError(
- InvalidOperation()
- << "Fragment input type is not a floating point scalar or vector.");
- return false;
- }
- if (expectedComponents != components && genMode != GL_NONE)
- {
- context->handleError(InvalidOperation() << "Unexpected number of components");
- return false;
- }
- }
- return true;
-}
-
-bool ValidateCopyTextureCHROMIUM(Context *context,
- GLuint sourceId,
- GLint sourceLevel,
- GLenum destTarget,
- GLuint destId,
- GLint destLevel,
- GLint internalFormat,
- GLenum destType,
- GLboolean unpackFlipY,
- GLboolean unpackPremultiplyAlpha,
- GLboolean unpackUnmultiplyAlpha)
-{
- if (!context->getExtensions().copyTexture)
- {
- context->handleError(InvalidOperation()
- << "GL_CHROMIUM_copy_texture extension not available.");
- return false;
- }
-
- const Texture *source = context->getTexture(sourceId);
- if (source == nullptr)
- {
- context->handleError(InvalidValue() << "Source texture is not a valid texture object.");
- return false;
- }
-
- if (!IsValidCopyTextureSourceTarget(context, source->getTarget()))
- {
- context->handleError(InvalidValue() << "Source texture a valid texture type.");
- return false;
- }
-
- GLenum sourceTarget = source->getTarget();
- ASSERT(sourceTarget != GL_TEXTURE_CUBE_MAP);
-
- if (!IsValidCopyTextureSourceLevel(context, source->getTarget(), sourceLevel))
- {
- context->handleError(InvalidValue() << "Source texture level is not valid.");
- return false;
- }
-
- GLsizei sourceWidth = static_cast<GLsizei>(source->getWidth(sourceTarget, sourceLevel));
- GLsizei sourceHeight = static_cast<GLsizei>(source->getHeight(sourceTarget, sourceLevel));
- if (sourceWidth == 0 || sourceHeight == 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidInternalFormat);
- return false;
- }
-
- const InternalFormat &sourceFormat = *source->getFormat(sourceTarget, sourceLevel).info;
- if (!IsValidCopyTextureSourceInternalFormatEnum(sourceFormat.internalFormat))
- {
- context->handleError(InvalidOperation() << "Source texture internal format is invalid.");
- return false;
- }
-
- if (!IsValidCopyTextureDestinationTargetEnum(context, destTarget))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTextureTarget);
- return false;
- }
-
- const Texture *dest = context->getTexture(destId);
- if (dest == nullptr)
- {
- context->handleError(InvalidValue()
- << "Destination texture is not a valid texture object.");
- return false;
- }
-
- if (!IsValidCopyTextureDestinationTarget(context, dest->getTarget(), destTarget))
- {
- context->handleError(InvalidValue() << "Destination texture a valid texture type.");
- return false;
- }
-
- if (!IsValidCopyTextureDestinationLevel(context, destTarget, destLevel, sourceWidth,
- sourceHeight))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidMipLevel);
- return false;
- }
-
- if (!IsValidCopyTextureDestinationFormatType(context, internalFormat, destType))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), MismatchedTypeAndFormat);
- return false;
- }
-
- if (IsCubeMapTextureTarget(destTarget) && sourceWidth != sourceHeight)
- {
- context->handleError(
- InvalidValue() << "Destination width and height must be equal for cube map textures.");
- return false;
- }
-
- if (dest->getImmutableFormat())
- {
- context->handleError(InvalidOperation() << "Destination texture is immutable.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateCopySubTextureCHROMIUM(Context *context,
- GLuint sourceId,
- GLint sourceLevel,
- GLenum destTarget,
- GLuint destId,
- GLint destLevel,
- GLint xoffset,
- GLint yoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLboolean unpackFlipY,
- GLboolean unpackPremultiplyAlpha,
- GLboolean unpackUnmultiplyAlpha)
-{
- if (!context->getExtensions().copyTexture)
- {
- context->handleError(InvalidOperation()
- << "GL_CHROMIUM_copy_texture extension not available.");
- return false;
- }
-
- const Texture *source = context->getTexture(sourceId);
- if (source == nullptr)
- {
- context->handleError(InvalidValue() << "Source texture is not a valid texture object.");
- return false;
- }
-
- if (!IsValidCopyTextureSourceTarget(context, source->getTarget()))
- {
- context->handleError(InvalidValue() << "Source texture a valid texture type.");
- return false;
- }
-
- GLenum sourceTarget = source->getTarget();
- ASSERT(sourceTarget != GL_TEXTURE_CUBE_MAP);
-
- if (!IsValidCopyTextureSourceLevel(context, source->getTarget(), sourceLevel))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidMipLevel);
- return false;
- }
-
- if (source->getWidth(sourceTarget, sourceLevel) == 0 ||
- source->getHeight(sourceTarget, sourceLevel) == 0)
- {
- context->handleError(InvalidValue()
- << "The source level of the source texture must be defined.");
- return false;
- }
-
- if (x < 0 || y < 0)
- {
- context->handleError(InvalidValue() << "x and y cannot be negative.");
- return false;
- }
-
- if (width < 0 || height < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeSize);
- return false;
- }
-
- if (static_cast<size_t>(x + width) > source->getWidth(sourceTarget, sourceLevel) ||
- static_cast<size_t>(y + height) > source->getHeight(sourceTarget, sourceLevel))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), SourceTextureTooSmall);
- return false;
- }
-
- const Format &sourceFormat = source->getFormat(sourceTarget, sourceLevel);
- if (!IsValidCopySubTextureSourceInternalFormat(sourceFormat.info->internalFormat))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidInternalFormat);
- return false;
- }
-
- if (!IsValidCopyTextureDestinationTargetEnum(context, destTarget))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTextureTarget);
- return false;
- }
-
- const Texture *dest = context->getTexture(destId);
- if (dest == nullptr)
- {
- context->handleError(InvalidValue()
- << "Destination texture is not a valid texture object.");
- return false;
- }
-
- if (!IsValidCopyTextureDestinationTarget(context, dest->getTarget(), destTarget))
- {
- context->handleError(InvalidValue() << "Destination texture a valid texture type.");
- return false;
- }
-
- if (!IsValidCopyTextureDestinationLevel(context, destTarget, destLevel, width, height))
- {
- context->handleError(InvalidValue() << "Destination texture level is not valid.");
- return false;
- }
-
- if (dest->getWidth(destTarget, destLevel) == 0 || dest->getHeight(destTarget, destLevel) == 0)
- {
- context
- ->handleError(InvalidOperation()
- << "The destination level of the destination texture must be defined.");
- return false;
- }
-
- const InternalFormat &destFormat = *dest->getFormat(destTarget, destLevel).info;
- if (!IsValidCopySubTextureDestionationInternalFormat(destFormat.internalFormat))
- {
- context->handleError(InvalidOperation()
- << "Destination internal format and type combination is not valid.");
- return false;
- }
-
- if (xoffset < 0 || yoffset < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeOffset);
- return false;
- }
-
- if (static_cast<size_t>(xoffset + width) > dest->getWidth(destTarget, destLevel) ||
- static_cast<size_t>(yoffset + height) > dest->getHeight(destTarget, destLevel))
- {
- context->handleError(InvalidValue() << "Destination texture not large enough to copy to.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateCompressedCopyTextureCHROMIUM(Context *context, GLuint sourceId, GLuint destId)
-{
- if (!context->getExtensions().copyCompressedTexture)
- {
- context->handleError(InvalidOperation()
- << "GL_CHROMIUM_copy_compressed_texture extension not available.");
- return false;
- }
-
- const gl::Texture *source = context->getTexture(sourceId);
- if (source == nullptr)
- {
- context->handleError(InvalidValue() << "Source texture is not a valid texture object.");
- return false;
- }
-
- if (source->getTarget() != GL_TEXTURE_2D)
- {
- context->handleError(InvalidValue() << "Source texture must be of type GL_TEXTURE_2D.");
- return false;
- }
-
- if (source->getWidth(GL_TEXTURE_2D, 0) == 0 || source->getHeight(GL_TEXTURE_2D, 0) == 0)
- {
- context->handleError(InvalidValue() << "Source texture must level 0 defined.");
- return false;
- }
-
- const gl::Format &sourceFormat = source->getFormat(GL_TEXTURE_2D, 0);
- if (!sourceFormat.info->compressed)
- {
- context->handleError(InvalidOperation()
- << "Source texture must have a compressed internal format.");
- return false;
- }
-
- const gl::Texture *dest = context->getTexture(destId);
- if (dest == nullptr)
- {
- context->handleError(InvalidValue()
- << "Destination texture is not a valid texture object.");
- return false;
- }
-
- if (dest->getTarget() != GL_TEXTURE_2D)
- {
- context->handleError(InvalidValue()
- << "Destination texture must be of type GL_TEXTURE_2D.");
- return false;
- }
-
- if (dest->getImmutableFormat())
- {
- context->handleError(InvalidOperation() << "Destination cannot be immutable.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateCreateShader(Context *context, GLenum type)
-{
- switch (type)
- {
- case GL_VERTEX_SHADER:
- case GL_FRAGMENT_SHADER:
- break;
-
- case GL_COMPUTE_SHADER:
- if (context->getClientVersion() < Version(3, 1))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), ES31Required);
- return false;
- }
- break;
-
- case GL_GEOMETRY_SHADER_EXT:
- if (!context->getExtensions().geometryShader)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidShaderType);
- return false;
- }
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidShaderType);
- return false;
- }
-
- return true;
-}
-
-bool ValidateBufferData(ValidationContext *context,
- BufferBinding target,
- GLsizeiptr size,
- const void *data,
- BufferUsage usage)
-{
- if (size < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeSize);
- return false;
- }
-
- switch (usage)
- {
- case BufferUsage::StreamDraw:
- case BufferUsage::StaticDraw:
- case BufferUsage::DynamicDraw:
- break;
-
- case BufferUsage::StreamRead:
- case BufferUsage::StaticRead:
- case BufferUsage::DynamicRead:
- case BufferUsage::StreamCopy:
- case BufferUsage::StaticCopy:
- case BufferUsage::DynamicCopy:
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidBufferUsage);
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidBufferUsage);
- return false;
- }
-
- if (!ValidBufferType(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidBufferTypes);
- return false;
- }
-
- Buffer *buffer = context->getGLState().getTargetBuffer(target);
-
- if (!buffer)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), BufferNotBound);
- return false;
- }
-
- return true;
-}
-
-bool ValidateBufferSubData(ValidationContext *context,
- BufferBinding target,
- GLintptr offset,
- GLsizeiptr size,
- const void *data)
-{
- if (size < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeSize);
- return false;
- }
-
- if (offset < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeOffset);
- return false;
- }
-
- if (!ValidBufferType(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidBufferTypes);
- return false;
- }
-
- Buffer *buffer = context->getGLState().getTargetBuffer(target);
-
- if (!buffer)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), BufferNotBound);
- return false;
- }
-
- if (buffer->isMapped())
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- // Check for possible overflow of size + offset
- angle::CheckedNumeric<size_t> checkedSize(size);
- checkedSize += offset;
- if (!checkedSize.IsValid())
- {
- context->handleError(OutOfMemory());
- return false;
- }
-
- if (size + offset > buffer->getSize())
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InsufficientBufferSize);
- return false;
- }
-
- return true;
-}
-
-bool ValidateRequestExtensionANGLE(Context *context, const GLchar *name)
-{
- if (!context->getExtensions().requestExtension)
- {
- context->handleError(InvalidOperation() << "GL_ANGLE_request_extension is not available.");
- return false;
- }
-
- if (!context->isExtensionRequestable(name))
- {
- context->handleError(InvalidOperation() << "Extension " << name << " is not requestable.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateActiveTexture(ValidationContext *context, GLenum texture)
-{
- if (texture < GL_TEXTURE0 ||
- texture > GL_TEXTURE0 + context->getCaps().maxCombinedTextureImageUnits - 1)
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- return true;
-}
-
-bool ValidateAttachShader(ValidationContext *context, GLuint program, GLuint shader)
-{
- Program *programObject = GetValidProgram(context, program);
- if (!programObject)
- {
- return false;
- }
-
- Shader *shaderObject = GetValidShader(context, shader);
- if (!shaderObject)
- {
- return false;
- }
-
- switch (shaderObject->getType())
- {
- case GL_VERTEX_SHADER:
- {
- if (programObject->getAttachedVertexShader())
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ShaderAttachmentHasShader);
- return false;
- }
- break;
- }
- case GL_FRAGMENT_SHADER:
- {
- if (programObject->getAttachedFragmentShader())
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ShaderAttachmentHasShader);
- return false;
- }
- break;
- }
- case GL_COMPUTE_SHADER:
- {
- if (programObject->getAttachedComputeShader())
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ShaderAttachmentHasShader);
- return false;
- }
- break;
- }
- case GL_GEOMETRY_SHADER_EXT:
- {
- if (programObject->getAttachedGeometryShader())
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ShaderAttachmentHasShader);
- return false;
- }
- break;
- }
- default:
- UNREACHABLE();
- break;
- }
-
- return true;
-}
-
-bool ValidateBindAttribLocation(ValidationContext *context,
- GLuint program,
- GLuint index,
- const GLchar *name)
-{
- if (index >= MAX_VERTEX_ATTRIBS)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), IndexExceedsMaxVertexAttribute);
- return false;
- }
-
- if (strncmp(name, "gl_", 3) == 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), NameBeginsWithGL);
- return false;
- }
-
- if (context->isWebGL())
- {
- const size_t length = strlen(name);
-
- if (!IsValidESSLString(name, length))
- {
- // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters
- // for shader-related entry points
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidNameCharacters);
- return false;
- }
-
- if (!ValidateWebGLNameLength(context, length) || !ValidateWebGLNamePrefix(context, name))
- {
- return false;
- }
- }
-
- return GetValidProgram(context, program) != nullptr;
-}
-
-bool ValidateBindBuffer(ValidationContext *context, BufferBinding target, GLuint buffer)
-{
- if (!ValidBufferType(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidBufferTypes);
- return false;
- }
-
- if (!context->getGLState().isBindGeneratesResourceEnabled() &&
- !context->isBufferGenerated(buffer))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ObjectNotGenerated);
- return false;
- }
-
- return true;
-}
-
-bool ValidateBindFramebuffer(ValidationContext *context, GLenum target, GLuint framebuffer)
-{
- if (!ValidFramebufferTarget(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFramebufferTarget);
- return false;
- }
-
- if (!context->getGLState().isBindGeneratesResourceEnabled() &&
- !context->isFramebufferGenerated(framebuffer))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ObjectNotGenerated);
- return false;
- }
-
- return true;
-}
-
-bool ValidateBindRenderbuffer(ValidationContext *context, GLenum target, GLuint renderbuffer)
-{
- if (target != GL_RENDERBUFFER)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidRenderbufferTarget);
- return false;
- }
-
- if (!context->getGLState().isBindGeneratesResourceEnabled() &&
- !context->isRenderbufferGenerated(renderbuffer))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ObjectNotGenerated);
- return false;
- }
-
- return true;
-}
-
-static bool ValidBlendEquationMode(const ValidationContext *context, GLenum mode)
-{
- switch (mode)
- {
- case GL_FUNC_ADD:
- case GL_FUNC_SUBTRACT:
- case GL_FUNC_REVERSE_SUBTRACT:
- return true;
-
- case GL_MIN:
- case GL_MAX:
- return context->getClientVersion() >= ES_3_0 || context->getExtensions().blendMinMax;
-
- default:
- return false;
- }
-}
-
-bool ValidateBlendColor(ValidationContext *context,
- GLfloat red,
- GLfloat green,
- GLfloat blue,
- GLfloat alpha)
-{
- return true;
-}
-
-bool ValidateBlendEquation(ValidationContext *context, GLenum mode)
-{
- if (!ValidBlendEquationMode(context, mode))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidBlendEquation);
- return false;
- }
-
- return true;
-}
-
-bool ValidateBlendEquationSeparate(ValidationContext *context, GLenum modeRGB, GLenum modeAlpha)
-{
- if (!ValidBlendEquationMode(context, modeRGB))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidBlendEquation);
- return false;
- }
-
- if (!ValidBlendEquationMode(context, modeAlpha))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidBlendEquation);
- return false;
- }
-
- return true;
-}
-
-bool ValidateBlendFunc(ValidationContext *context, GLenum sfactor, GLenum dfactor)
-{
- return ValidateBlendFuncSeparate(context, sfactor, dfactor, sfactor, dfactor);
-}
-
-static bool ValidSrcBlendFunc(GLenum srcBlend)
-{
- switch (srcBlend)
- {
- case GL_ZERO:
- case GL_ONE:
- case GL_SRC_COLOR:
- case GL_ONE_MINUS_SRC_COLOR:
- case GL_DST_COLOR:
- case GL_ONE_MINUS_DST_COLOR:
- case GL_SRC_ALPHA:
- case GL_ONE_MINUS_SRC_ALPHA:
- case GL_DST_ALPHA:
- case GL_ONE_MINUS_DST_ALPHA:
- case GL_CONSTANT_COLOR:
- case GL_ONE_MINUS_CONSTANT_COLOR:
- case GL_CONSTANT_ALPHA:
- case GL_ONE_MINUS_CONSTANT_ALPHA:
- case GL_SRC_ALPHA_SATURATE:
- return true;
-
- default:
- return false;
- }
-}
-
-static bool ValidDstBlendFunc(GLenum dstBlend, GLint contextMajorVersion)
-{
- switch (dstBlend)
- {
- case GL_ZERO:
- case GL_ONE:
- case GL_SRC_COLOR:
- case GL_ONE_MINUS_SRC_COLOR:
- case GL_DST_COLOR:
- case GL_ONE_MINUS_DST_COLOR:
- case GL_SRC_ALPHA:
- case GL_ONE_MINUS_SRC_ALPHA:
- case GL_DST_ALPHA:
- case GL_ONE_MINUS_DST_ALPHA:
- case GL_CONSTANT_COLOR:
- case GL_ONE_MINUS_CONSTANT_COLOR:
- case GL_CONSTANT_ALPHA:
- case GL_ONE_MINUS_CONSTANT_ALPHA:
- return true;
-
- case GL_SRC_ALPHA_SATURATE:
- return (contextMajorVersion >= 3);
-
- default:
- return false;
- }
-}
-
-bool ValidateBlendFuncSeparate(ValidationContext *context,
- GLenum srcRGB,
- GLenum dstRGB,
- GLenum srcAlpha,
- GLenum dstAlpha)
-{
- if (!ValidSrcBlendFunc(srcRGB))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidBlendFunction);
- return false;
- }
-
- if (!ValidDstBlendFunc(dstRGB, context->getClientMajorVersion()))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidBlendFunction);
- return false;
- }
-
- if (!ValidSrcBlendFunc(srcAlpha))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidBlendFunction);
- return false;
- }
-
- if (!ValidDstBlendFunc(dstAlpha, context->getClientMajorVersion()))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidBlendFunction);
- return false;
- }
-
- if (context->getLimitations().noSimultaneousConstantColorAndAlphaBlendFunc ||
- context->getExtensions().webglCompatibility)
- {
- bool constantColorUsed =
- (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
- dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
-
- bool constantAlphaUsed =
- (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
- dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
-
- if (constantColorUsed && constantAlphaUsed)
- {
- const char *msg;
- if (context->getExtensions().webglCompatibility)
- {
- msg = kErrorInvalidConstantColor;
- }
- else
- {
- msg =
- "Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and "
- "GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR not supported by this "
- "implementation.";
- ERR() << msg;
- }
- context->handleError(InvalidOperation() << msg);
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateGetString(Context *context, GLenum name)
-{
- switch (name)
- {
- case GL_VENDOR:
- case GL_RENDERER:
- case GL_VERSION:
- case GL_SHADING_LANGUAGE_VERSION:
- case GL_EXTENSIONS:
- break;
-
- case GL_REQUESTABLE_EXTENSIONS_ANGLE:
- if (!context->getExtensions().requestExtension)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidName);
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidName);
- return false;
- }
-
- return true;
-}
-
-bool ValidateLineWidth(ValidationContext *context, GLfloat width)
-{
- if (width <= 0.0f || isNaN(width))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidWidth);
- return false;
- }
-
- return true;
-}
-
-bool ValidateVertexAttribPointer(ValidationContext *context,
- GLuint index,
- GLint size,
- GLenum type,
- GLboolean normalized,
- GLsizei stride,
- const void *ptr)
-{
- if (!ValidateVertexFormatBase(context, index, size, type, false))
- {
- return false;
- }
-
- if (stride < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeStride);
- return false;
- }
-
- const Caps &caps = context->getCaps();
- if (context->getClientVersion() >= ES_3_1)
- {
- if (stride > caps.maxVertexAttribStride)
- {
- context->handleError(InvalidValue()
- << "stride cannot be greater than MAX_VERTEX_ATTRIB_STRIDE.");
- return false;
- }
-
- if (index >= caps.maxVertexAttribBindings)
- {
- context->handleError(InvalidValue()
- << "index must be smaller than MAX_VERTEX_ATTRIB_BINDINGS.");
- return false;
- }
- }
-
- // [OpenGL ES 3.0.2] Section 2.8 page 24:
- // An INVALID_OPERATION error is generated when a non-zero vertex array object
- // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
- // and the pointer argument is not NULL.
- bool nullBufferAllowed = context->getGLState().areClientArraysEnabled() &&
- context->getGLState().getVertexArray()->id() == 0;
- if (!nullBufferAllowed && context->getGLState().getTargetBuffer(BufferBinding::Array) == 0 &&
- ptr != nullptr)
- {
- context
- ->handleError(InvalidOperation()
- << "Client data cannot be used with a non-default vertex array object.");
- return false;
- }
-
- if (context->getExtensions().webglCompatibility)
- {
- // WebGL 1.0 [Section 6.14] Fixed point support
- // The WebGL API does not support the GL_FIXED data type.
- if (type == GL_FIXED)
- {
- context->handleError(InvalidEnum() << "GL_FIXED is not supported in WebGL.");
- return false;
- }
-
- if (!ValidateWebGLVertexAttribPointer(context, type, normalized, stride, ptr, false))
- {
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateDepthRangef(ValidationContext *context, GLfloat zNear, GLfloat zFar)
-{
- if (context->getExtensions().webglCompatibility && zNear > zFar)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidDepthRange);
- return false;
- }
-
- return true;
-}
-
-bool ValidateRenderbufferStorage(ValidationContext *context,
- GLenum target,
- GLenum internalformat,
- GLsizei width,
- GLsizei height)
-{
- return ValidateRenderbufferStorageParametersBase(context, target, 0, internalformat, width,
- height);
-}
-
-bool ValidateRenderbufferStorageMultisampleANGLE(ValidationContext *context,
- GLenum target,
- GLsizei samples,
- GLenum internalformat,
- GLsizei width,
- GLsizei height)
-{
- if (!context->getExtensions().framebufferMultisample)
- {
- context->handleError(InvalidOperation()
- << "GL_ANGLE_framebuffer_multisample not available");
- return false;
- }
-
- // ANGLE_framebuffer_multisample states that the value of samples must be less than or equal
- // to MAX_SAMPLES_ANGLE (Context::getCaps().maxSamples) otherwise GL_INVALID_OPERATION is
- // generated.
- if (static_cast<GLuint>(samples) > context->getCaps().maxSamples)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- // ANGLE_framebuffer_multisample states GL_OUT_OF_MEMORY is generated on a failure to create
- // the specified storage. This is different than ES 3.0 in which a sample number higher
- // than the maximum sample number supported by this format generates a GL_INVALID_VALUE.
- // The TextureCaps::getMaxSamples method is only guarenteed to be valid when the context is ES3.
- if (context->getClientMajorVersion() >= 3)
- {
- const TextureCaps &formatCaps = context->getTextureCaps().get(internalformat);
- if (static_cast<GLuint>(samples) > formatCaps.getMaxSamples())
- {
- context->handleError(OutOfMemory());
- return false;
- }
- }
-
- return ValidateRenderbufferStorageParametersBase(context, target, samples, internalformat,
- width, height);
-}
-
-bool ValidateCheckFramebufferStatus(ValidationContext *context, GLenum target)
-{
- if (!ValidFramebufferTarget(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFramebufferTarget);
- return false;
- }
-
- return true;
-}
-
-bool ValidateClearColor(ValidationContext *context,
- GLfloat red,
- GLfloat green,
- GLfloat blue,
- GLfloat alpha)
-{
- return true;
-}
-
-bool ValidateClearDepthf(ValidationContext *context, GLfloat depth)
-{
- return true;
-}
-
-bool ValidateClearStencil(ValidationContext *context, GLint s)
-{
- return true;
-}
-
-bool ValidateColorMask(ValidationContext *context,
- GLboolean red,
- GLboolean green,
- GLboolean blue,
- GLboolean alpha)
-{
- return true;
-}
-
-bool ValidateCompileShader(ValidationContext *context, GLuint shader)
-{
- return true;
-}
-
-bool ValidateCreateProgram(ValidationContext *context)
-{
- return true;
-}
-
-bool ValidateCullFace(ValidationContext *context, CullFaceMode mode)
-{
- switch (mode)
- {
- case CullFaceMode::Front:
- case CullFaceMode::Back:
- case CullFaceMode::FrontAndBack:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidCullMode);
- return false;
- }
-
- return true;
-}
-
-bool ValidateDeleteProgram(ValidationContext *context, GLuint program)
-{
- if (program == 0)
- {
- return false;
- }
-
- if (!context->getProgram(program))
- {
- if (context->getShader(program))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExpectedProgramName);
- return false;
- }
- else
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidProgramName);
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateDeleteShader(ValidationContext *context, GLuint shader)
-{
- if (shader == 0)
- {
- return false;
- }
-
- if (!context->getShader(shader))
- {
- if (context->getProgram(shader))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidShaderName);
- return false;
- }
- else
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), ExpectedShaderName);
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateDepthFunc(ValidationContext *context, GLenum func)
-{
- switch (func)
- {
- case GL_NEVER:
- case GL_ALWAYS:
- case GL_LESS:
- case GL_LEQUAL:
- case GL_EQUAL:
- case GL_GREATER:
- case GL_GEQUAL:
- case GL_NOTEQUAL:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- return true;
-}
-
-bool ValidateDepthMask(ValidationContext *context, GLboolean flag)
-{
- return true;
-}
-
-bool ValidateDetachShader(ValidationContext *context, GLuint program, GLuint shader)
-{
- Program *programObject = GetValidProgram(context, program);
- if (!programObject)
- {
- return false;
- }
-
- Shader *shaderObject = GetValidShader(context, shader);
- if (!shaderObject)
- {
- return false;
- }
-
- const Shader *attachedShader = nullptr;
-
- switch (shaderObject->getType())
- {
- case GL_VERTEX_SHADER:
- {
- attachedShader = programObject->getAttachedVertexShader();
- break;
- }
- case GL_FRAGMENT_SHADER:
- {
- attachedShader = programObject->getAttachedFragmentShader();
- break;
- }
- case GL_COMPUTE_SHADER:
- {
- attachedShader = programObject->getAttachedComputeShader();
- break;
- }
- case GL_GEOMETRY_SHADER_EXT:
- {
- attachedShader = programObject->getAttachedGeometryShader();
- break;
- }
- default:
- UNREACHABLE();
- return false;
- }
-
- if (attachedShader != shaderObject)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ShaderToDetachMustBeAttached);
- return false;
- }
-
- return true;
-}
-
-bool ValidateDisableVertexAttribArray(ValidationContext *context, GLuint index)
-{
- if (index >= MAX_VERTEX_ATTRIBS)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), IndexExceedsMaxVertexAttribute);
- return false;
- }
-
- return true;
-}
-
-bool ValidateEnableVertexAttribArray(ValidationContext *context, GLuint index)
-{
- if (index >= MAX_VERTEX_ATTRIBS)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), IndexExceedsMaxVertexAttribute);
- return false;
- }
-
- return true;
-}
-
-bool ValidateFinish(ValidationContext *context)
-{
- return true;
-}
-
-bool ValidateFlush(ValidationContext *context)
-{
- return true;
-}
-
-bool ValidateFrontFace(ValidationContext *context, GLenum mode)
-{
- switch (mode)
- {
- case GL_CW:
- case GL_CCW:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetActiveAttrib(ValidationContext *context,
- GLuint program,
- GLuint index,
- GLsizei bufsize,
- GLsizei *length,
- GLint *size,
- GLenum *type,
- GLchar *name)
-{
- if (bufsize < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeBufferSize);
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
-
- if (!programObject)
- {
- return false;
- }
-
- if (index >= static_cast<GLuint>(programObject->getActiveAttributeCount()))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), IndexExceedsMaxActiveUniform);
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetActiveUniform(ValidationContext *context,
- GLuint program,
- GLuint index,
- GLsizei bufsize,
- GLsizei *length,
- GLint *size,
- GLenum *type,
- GLchar *name)
-{
- if (bufsize < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeBufferSize);
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
-
- if (!programObject)
- {
- return false;
- }
-
- if (index >= static_cast<GLuint>(programObject->getActiveUniformCount()))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), IndexExceedsMaxActiveUniform);
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetAttachedShaders(ValidationContext *context,
- GLuint program,
- GLsizei maxcount,
- GLsizei *count,
- GLuint *shaders)
-{
- if (maxcount < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeMaxCount);
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
-
- if (!programObject)
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetAttribLocation(ValidationContext *context, GLuint program, const GLchar *name)
-{
- // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
- // shader-related entry points
- if (context->getExtensions().webglCompatibility && !IsValidESSLString(name, strlen(name)))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidNameCharacters);
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
-
- if (!programObject)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ProgramNotBound);
- return false;
- }
-
- if (!programObject->isLinked())
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ProgramNotLinked);
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetBooleanv(ValidationContext *context, GLenum pname, GLboolean *params)
-{
- GLenum nativeType;
- unsigned int numParams = 0;
- return ValidateStateQuery(context, pname, &nativeType, &numParams);
-}
-
-bool ValidateGetError(ValidationContext *context)
-{
- return true;
-}
-
-bool ValidateGetFloatv(ValidationContext *context, GLenum pname, GLfloat *params)
-{
- GLenum nativeType;
- unsigned int numParams = 0;
- return ValidateStateQuery(context, pname, &nativeType, &numParams);
-}
-
-bool ValidateGetIntegerv(ValidationContext *context, GLenum pname, GLint *params)
-{
- GLenum nativeType;
- unsigned int numParams = 0;
- return ValidateStateQuery(context, pname, &nativeType, &numParams);
-}
-
-bool ValidateGetProgramInfoLog(ValidationContext *context,
- GLuint program,
- GLsizei bufsize,
- GLsizei *length,
- GLchar *infolog)
-{
- if (bufsize < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeBufferSize);
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
- if (!programObject)
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetShaderInfoLog(ValidationContext *context,
- GLuint shader,
- GLsizei bufsize,
- GLsizei *length,
- GLchar *infolog)
-{
- if (bufsize < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeBufferSize);
- return false;
- }
-
- Shader *shaderObject = GetValidShader(context, shader);
- if (!shaderObject)
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetShaderPrecisionFormat(ValidationContext *context,
- GLenum shadertype,
- GLenum precisiontype,
- GLint *range,
- GLint *precision)
-{
- switch (shadertype)
- {
- case GL_VERTEX_SHADER:
- case GL_FRAGMENT_SHADER:
- break;
- case GL_COMPUTE_SHADER:
- context->handleError(InvalidOperation()
- << "compute shader precision not yet implemented.");
- return false;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidShaderType);
- return false;
- }
-
- switch (precisiontype)
- {
- case GL_LOW_FLOAT:
- case GL_MEDIUM_FLOAT:
- case GL_HIGH_FLOAT:
- case GL_LOW_INT:
- case GL_MEDIUM_INT:
- case GL_HIGH_INT:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidPrecision);
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetShaderSource(ValidationContext *context,
- GLuint shader,
- GLsizei bufsize,
- GLsizei *length,
- GLchar *source)
-{
- if (bufsize < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeBufferSize);
- return false;
- }
-
- Shader *shaderObject = GetValidShader(context, shader);
- if (!shaderObject)
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetUniformLocation(ValidationContext *context, GLuint program, const GLchar *name)
-{
- if (strstr(name, "gl_") == name)
- {
- return false;
- }
-
- // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
- // shader-related entry points
- if (context->getExtensions().webglCompatibility && !IsValidESSLString(name, strlen(name)))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidNameCharacters);
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
-
- if (!programObject)
- {
- return false;
- }
-
- if (!programObject->isLinked())
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ProgramNotLinked);
- return false;
- }
-
- return true;
-}
-
-bool ValidateHint(ValidationContext *context, GLenum target, GLenum mode)
-{
- switch (mode)
- {
- case GL_FASTEST:
- case GL_NICEST:
- case GL_DONT_CARE:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- switch (target)
- {
- case GL_GENERATE_MIPMAP_HINT:
- break;
-
- case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
- if (context->getClientVersion() < ES_3_0 &&
- !context->getExtensions().standardDerivatives)
- {
- context->handleError(InvalidEnum() << "hint requires OES_standard_derivatives.");
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- return true;
-}
-
-bool ValidateIsBuffer(ValidationContext *context, GLuint buffer)
-{
- return true;
-}
-
-bool ValidateIsFramebuffer(ValidationContext *context, GLuint framebuffer)
-{
- return true;
-}
-
-bool ValidateIsProgram(ValidationContext *context, GLuint program)
-{
- return true;
-}
-
-bool ValidateIsRenderbuffer(ValidationContext *context, GLuint renderbuffer)
-{
- return true;
-}
-
-bool ValidateIsShader(ValidationContext *context, GLuint shader)
-{
- return true;
-}
-
-bool ValidateIsTexture(ValidationContext *context, GLuint texture)
-{
- return true;
-}
-
-bool ValidatePixelStorei(ValidationContext *context, GLenum pname, GLint param)
-{
- if (context->getClientMajorVersion() < 3)
- {
- switch (pname)
- {
- case GL_UNPACK_IMAGE_HEIGHT:
- case GL_UNPACK_SKIP_IMAGES:
- context->handleError(InvalidEnum());
- return false;
-
- case GL_UNPACK_ROW_LENGTH:
- case GL_UNPACK_SKIP_ROWS:
- case GL_UNPACK_SKIP_PIXELS:
- if (!context->getExtensions().unpackSubimage)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
-
- case GL_PACK_ROW_LENGTH:
- case GL_PACK_SKIP_ROWS:
- case GL_PACK_SKIP_PIXELS:
- if (!context->getExtensions().packSubimage)
- {
- context->handleError(InvalidEnum());
- return false;
- }
- break;
- }
- }
-
- if (param < 0)
- {
- context->handleError(InvalidValue() << "Cannot use negative values in PixelStorei");
- return false;
- }
-
- switch (pname)
- {
- case GL_UNPACK_ALIGNMENT:
- if (param != 1 && param != 2 && param != 4 && param != 8)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidUnpackAlignment);
- return false;
- }
- break;
-
- case GL_PACK_ALIGNMENT:
- if (param != 1 && param != 2 && param != 4 && param != 8)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidUnpackAlignment);
- return false;
- }
- break;
-
- case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
- if (!context->getExtensions().packReverseRowOrder)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- }
- break;
-
- case GL_UNPACK_ROW_LENGTH:
- case GL_UNPACK_IMAGE_HEIGHT:
- case GL_UNPACK_SKIP_IMAGES:
- case GL_UNPACK_SKIP_ROWS:
- case GL_UNPACK_SKIP_PIXELS:
- case GL_PACK_ROW_LENGTH:
- case GL_PACK_SKIP_ROWS:
- case GL_PACK_SKIP_PIXELS:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- return true;
-}
-
-bool ValidatePolygonOffset(ValidationContext *context, GLfloat factor, GLfloat units)
-{
- return true;
-}
-
-bool ValidateReleaseShaderCompiler(ValidationContext *context)
-{
- return true;
-}
-
-bool ValidateSampleCoverage(ValidationContext *context, GLfloat value, GLboolean invert)
-{
- return true;
-}
-
-bool ValidateScissor(ValidationContext *context, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- if (width < 0 || height < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeSize);
- return false;
- }
-
- return true;
-}
-
-bool ValidateShaderBinary(ValidationContext *context,
- GLsizei n,
- const GLuint *shaders,
- GLenum binaryformat,
- const void *binary,
- GLsizei length)
-{
- const std::vector<GLenum> &shaderBinaryFormats = context->getCaps().shaderBinaryFormats;
- if (std::find(shaderBinaryFormats.begin(), shaderBinaryFormats.end(), binaryformat) ==
- shaderBinaryFormats.end())
- {
- context->handleError(InvalidEnum() << "Invalid shader binary format.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateShaderSource(ValidationContext *context,
- GLuint shader,
- GLsizei count,
- const GLchar *const *string,
- const GLint *length)
-{
- if (count < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeCount);
- return false;
- }
-
- // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
- // shader-related entry points
- if (context->getExtensions().webglCompatibility)
- {
- for (GLsizei i = 0; i < count; i++)
- {
- size_t len =
- (length && length[i] >= 0) ? static_cast<size_t>(length[i]) : strlen(string[i]);
-
- // Backslash as line-continuation is allowed in WebGL 2.0.
- if (!IsValidESSLShaderSourceString(string[i], len,
- context->getClientVersion() >= ES_3_0))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), ShaderSourceInvalidCharacters);
- return false;
- }
- }
- }
-
- Shader *shaderObject = GetValidShader(context, shader);
- if (!shaderObject)
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateStencilFunc(ValidationContext *context, GLenum func, GLint ref, GLuint mask)
-{
- if (!IsValidStencilFunc(func))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidStencil);
- return false;
- }
-
- return true;
-}
-
-bool ValidateStencilFuncSeparate(ValidationContext *context,
- GLenum face,
- GLenum func,
- GLint ref,
- GLuint mask)
-{
- if (!IsValidStencilFace(face))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidStencil);
- return false;
- }
-
- if (!IsValidStencilFunc(func))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidStencil);
- return false;
- }
-
- return true;
-}
-
-bool ValidateStencilMask(ValidationContext *context, GLuint mask)
-{
- return true;
-}
-
-bool ValidateStencilMaskSeparate(ValidationContext *context, GLenum face, GLuint mask)
-{
- if (!IsValidStencilFace(face))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidStencil);
- return false;
- }
-
- return true;
-}
-
-bool ValidateStencilOp(ValidationContext *context, GLenum fail, GLenum zfail, GLenum zpass)
-{
- if (!IsValidStencilOp(fail))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidStencil);
- return false;
- }
-
- if (!IsValidStencilOp(zfail))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidStencil);
- return false;
- }
-
- if (!IsValidStencilOp(zpass))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidStencil);
- return false;
- }
-
- return true;
-}
-
-bool ValidateStencilOpSeparate(ValidationContext *context,
- GLenum face,
- GLenum fail,
- GLenum zfail,
- GLenum zpass)
-{
- if (!IsValidStencilFace(face))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidStencil);
- return false;
- }
-
- return ValidateStencilOp(context, fail, zfail, zpass);
-}
-
-bool ValidateUniform1f(ValidationContext *context, GLint location, GLfloat x)
-{
- return ValidateUniform(context, GL_FLOAT, location, 1);
-}
-
-bool ValidateUniform1fv(ValidationContext *context, GLint location, GLsizei count, const GLfloat *v)
-{
- return ValidateUniform(context, GL_FLOAT, location, count);
-}
-
-bool ValidateUniform1i(ValidationContext *context, GLint location, GLint x)
-{
- return ValidateUniform1iv(context, location, 1, &x);
-}
-
-bool ValidateUniform2f(ValidationContext *context, GLint location, GLfloat x, GLfloat y)
-{
- return ValidateUniform(context, GL_FLOAT_VEC2, location, 1);
-}
-
-bool ValidateUniform2fv(ValidationContext *context, GLint location, GLsizei count, const GLfloat *v)
-{
- return ValidateUniform(context, GL_FLOAT_VEC2, location, count);
-}
-
-bool ValidateUniform2i(ValidationContext *context, GLint location, GLint x, GLint y)
-{
- return ValidateUniform(context, GL_INT_VEC2, location, 1);
-}
-
-bool ValidateUniform2iv(ValidationContext *context, GLint location, GLsizei count, const GLint *v)
-{
- return ValidateUniform(context, GL_INT_VEC2, location, count);
-}
-
-bool ValidateUniform3f(ValidationContext *context, GLint location, GLfloat x, GLfloat y, GLfloat z)
-{
- return ValidateUniform(context, GL_FLOAT_VEC3, location, 1);
-}
-
-bool ValidateUniform3fv(ValidationContext *context, GLint location, GLsizei count, const GLfloat *v)
-{
- return ValidateUniform(context, GL_FLOAT_VEC3, location, count);
-}
-
-bool ValidateUniform3i(ValidationContext *context, GLint location, GLint x, GLint y, GLint z)
-{
- return ValidateUniform(context, GL_INT_VEC3, location, 1);
-}
-
-bool ValidateUniform3iv(ValidationContext *context, GLint location, GLsizei count, const GLint *v)
-{
- return ValidateUniform(context, GL_INT_VEC3, location, count);
-}
-
-bool ValidateUniform4f(ValidationContext *context,
- GLint location,
- GLfloat x,
- GLfloat y,
- GLfloat z,
- GLfloat w)
-{
- return ValidateUniform(context, GL_FLOAT_VEC4, location, 1);
-}
-
-bool ValidateUniform4fv(ValidationContext *context, GLint location, GLsizei count, const GLfloat *v)
-{
- return ValidateUniform(context, GL_FLOAT_VEC4, location, count);
-}
-
-bool ValidateUniform4i(ValidationContext *context,
- GLint location,
- GLint x,
- GLint y,
- GLint z,
- GLint w)
-{
- return ValidateUniform(context, GL_INT_VEC4, location, 1);
-}
-
-bool ValidateUniform4iv(ValidationContext *context, GLint location, GLsizei count, const GLint *v)
-{
- return ValidateUniform(context, GL_INT_VEC4, location, count);
-}
-
-bool ValidateUniformMatrix2fv(ValidationContext *context,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- return ValidateUniformMatrix(context, GL_FLOAT_MAT2, location, count, transpose);
-}
-
-bool ValidateUniformMatrix3fv(ValidationContext *context,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- return ValidateUniformMatrix(context, GL_FLOAT_MAT3, location, count, transpose);
-}
-
-bool ValidateUniformMatrix4fv(ValidationContext *context,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- return ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose);
-}
-
-bool ValidateValidateProgram(ValidationContext *context, GLuint program)
-{
- Program *programObject = GetValidProgram(context, program);
-
- if (!programObject)
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateVertexAttrib1f(ValidationContext *context, GLuint index, GLfloat x)
-{
- return ValidateVertexAttribIndex(context, index);
-}
-
-bool ValidateVertexAttrib1fv(ValidationContext *context, GLuint index, const GLfloat *values)
-{
- return ValidateVertexAttribIndex(context, index);
-}
-
-bool ValidateVertexAttrib2f(ValidationContext *context, GLuint index, GLfloat x, GLfloat y)
-{
- return ValidateVertexAttribIndex(context, index);
-}
-
-bool ValidateVertexAttrib2fv(ValidationContext *context, GLuint index, const GLfloat *values)
-{
- return ValidateVertexAttribIndex(context, index);
-}
-
-bool ValidateVertexAttrib3f(ValidationContext *context,
- GLuint index,
- GLfloat x,
- GLfloat y,
- GLfloat z)
-{
- return ValidateVertexAttribIndex(context, index);
-}
-
-bool ValidateVertexAttrib3fv(ValidationContext *context, GLuint index, const GLfloat *values)
-{
- return ValidateVertexAttribIndex(context, index);
-}
-
-bool ValidateVertexAttrib4f(ValidationContext *context,
- GLuint index,
- GLfloat x,
- GLfloat y,
- GLfloat z,
- GLfloat w)
-{
- return ValidateVertexAttribIndex(context, index);
-}
-
-bool ValidateVertexAttrib4fv(ValidationContext *context, GLuint index, const GLfloat *values)
-{
- return ValidateVertexAttribIndex(context, index);
-}
-
-bool ValidateViewport(ValidationContext *context, GLint x, GLint y, GLsizei width, GLsizei height)
-{
- if (width < 0 || height < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), ViewportNegativeSize);
- return false;
- }
-
- return true;
-}
-
-bool ValidateDrawArrays(ValidationContext *context, GLenum mode, GLint first, GLsizei count)
-{
- return ValidateDrawArraysCommon(context, mode, first, count, 1);
-}
-
-bool ValidateDrawElements(ValidationContext *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices)
-{
- return ValidateDrawElementsCommon(context, mode, count, type, indices, 1);
-}
-
-bool ValidateGetFramebufferAttachmentParameteriv(ValidationContext *context,
- GLenum target,
- GLenum attachment,
- GLenum pname,
- GLint *params)
-{
- return ValidateGetFramebufferAttachmentParameterivBase(context, target, attachment, pname,
- nullptr);
-}
-
-bool ValidateGetProgramiv(ValidationContext *context, GLuint program, GLenum pname, GLint *params)
-{
- return ValidateGetProgramivBase(context, program, pname, nullptr);
-}
-
-bool ValidateCopyTexImage2D(ValidationContext *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLint border)
-{
- if (context->getClientMajorVersion() < 3)
- {
- return ValidateES2CopyTexImageParameters(context, target, level, internalformat, false, 0,
- 0, x, y, width, height, border);
- }
-
- ASSERT(context->getClientMajorVersion() == 3);
- return ValidateES3CopyTexImage2DParameters(context, target, level, internalformat, false, 0, 0,
- 0, x, y, width, height, border);
-}
-
-bool ValidateCopyTexSubImage2D(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height)
-{
- if (context->getClientMajorVersion() < 3)
- {
- return ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset,
- yoffset, x, y, width, height, 0);
- }
-
- return ValidateES3CopyTexImage2DParameters(context, target, level, GL_NONE, true, xoffset,
- yoffset, 0, x, y, width, height, 0);
-}
-
-bool ValidateDeleteBuffers(Context *context, GLint n, const GLuint *)
-{
- return ValidateGenOrDelete(context, n);
-}
-
-bool ValidateDeleteFramebuffers(Context *context, GLint n, const GLuint *)
-{
- return ValidateGenOrDelete(context, n);
-}
-
-bool ValidateDeleteRenderbuffers(Context *context, GLint n, const GLuint *)
-{
- return ValidateGenOrDelete(context, n);
-}
-
-bool ValidateDeleteTextures(Context *context, GLint n, const GLuint *)
-{
- return ValidateGenOrDelete(context, n);
-}
-
-bool ValidateDisable(Context *context, GLenum cap)
-{
- if (!ValidCap(context, cap, false))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- return true;
-}
-
-bool ValidateEnable(Context *context, GLenum cap)
-{
- if (!ValidCap(context, cap, false))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- if (context->getLimitations().noSampleAlphaToCoverageSupport &&
- cap == GL_SAMPLE_ALPHA_TO_COVERAGE)
- {
- const char *errorMessage = "Current renderer doesn't support alpha-to-coverage";
- context->handleError(InvalidOperation() << errorMessage);
-
- // We also output an error message to the debugger window if tracing is active, so that
- // developers can see the error message.
- ERR() << errorMessage;
- return false;
- }
-
- return true;
-}
-
-bool ValidateFramebufferRenderbuffer(Context *context,
- GLenum target,
- GLenum attachment,
- GLenum renderbuffertarget,
- GLuint renderbuffer)
-{
- if (!ValidFramebufferTarget(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFramebufferTarget);
- return false;
- }
-
- if (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidRenderbufferTarget);
- return false;
- }
-
- return ValidateFramebufferRenderbufferParameters(context, target, attachment,
- renderbuffertarget, renderbuffer);
-}
-
-bool ValidateFramebufferTexture2D(Context *context,
- GLenum target,
- GLenum attachment,
- GLenum textarget,
- GLuint texture,
- GLint level)
-{
- // Attachments are required to be bound to level 0 without ES3 or the GL_OES_fbo_render_mipmap
- // extension
- if (context->getClientMajorVersion() < 3 && !context->getExtensions().fboRenderMipmap &&
- level != 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidFramebufferTextureLevel);
- return false;
- }
-
- if (!ValidateFramebufferTextureBase(context, target, attachment, texture, level))
- {
- return false;
- }
-
- if (texture != 0)
- {
- gl::Texture *tex = context->getTexture(texture);
- ASSERT(tex);
-
- const gl::Caps &caps = context->getCaps();
-
- switch (textarget)
- {
- case GL_TEXTURE_2D:
- {
- if (level > gl::log2(caps.max2DTextureSize))
- {
- context->handleError(InvalidValue());
- return false;
- }
- if (tex->getTarget() != GL_TEXTURE_2D)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidTextureTarget);
- return false;
- }
- }
- break;
-
- case GL_TEXTURE_RECTANGLE_ANGLE:
- {
- if (level != 0)
- {
- context->handleError(InvalidValue());
- return false;
- }
- if (tex->getTarget() != GL_TEXTURE_RECTANGLE_ANGLE)
- {
- context->handleError(InvalidOperation()
- << "Textarget must match the texture target type.");
- return false;
- }
- }
- break;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- {
- if (level > gl::log2(caps.maxCubeMapTextureSize))
- {
- context->handleError(InvalidValue());
- return false;
- }
- if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
- {
- context->handleError(InvalidOperation()
- << "Textarget must match the texture target type.");
- return false;
- }
- }
- break;
-
- case GL_TEXTURE_2D_MULTISAMPLE:
- {
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- if (level != 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), LevelNotZero);
- return false;
- }
- if (tex->getTarget() != GL_TEXTURE_2D_MULTISAMPLE)
- {
- context->handleError(InvalidOperation()
- << "Textarget must match the texture target type.");
- return false;
- }
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTextureTarget);
- return false;
- }
-
- const Format &format = tex->getFormat(textarget, level);
- if (format.info->compressed)
- {
- context->handleError(InvalidOperation());
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateGenBuffers(Context *context, GLint n, GLuint *)
-{
- return ValidateGenOrDelete(context, n);
-}
-
-bool ValidateGenFramebuffers(Context *context, GLint n, GLuint *)
-{
- return ValidateGenOrDelete(context, n);
-}
-
-bool ValidateGenRenderbuffers(Context *context, GLint n, GLuint *)
-{
- return ValidateGenOrDelete(context, n);
-}
-
-bool ValidateGenTextures(Context *context, GLint n, GLuint *)
-{
- return ValidateGenOrDelete(context, n);
-}
-
-bool ValidateGenerateMipmap(Context *context, GLenum target)
-{
- if (!ValidTextureTarget(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTextureTarget);
- return false;
- }
-
- Texture *texture = context->getTargetTexture(target);
-
- if (texture == nullptr)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), TextureNotBound);
- return false;
- }
-
- const GLuint effectiveBaseLevel = texture->getTextureState().getEffectiveBaseLevel();
-
- // This error isn't spelled out in the spec in a very explicit way, but we interpret the spec so
- // that out-of-range base level has a non-color-renderable / non-texture-filterable format.
- if (effectiveBaseLevel >= gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- GLenum baseTarget = (target == GL_TEXTURE_CUBE_MAP) ? GL_TEXTURE_CUBE_MAP_POSITIVE_X : target;
- const auto &format = *(texture->getFormat(baseTarget, effectiveBaseLevel).info);
- if (format.sizedInternalFormat == GL_NONE || format.compressed || format.depthBits > 0 ||
- format.stencilBits > 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), GenerateMipmapNotAllowed);
- return false;
- }
-
- // GenerateMipmap accepts formats that are unsized or both color renderable and filterable.
- bool formatUnsized = !format.sized;
- bool formatColorRenderableAndFilterable =
- format.filterSupport(context->getClientVersion(), context->getExtensions()) &&
- format.renderSupport(context->getClientVersion(), context->getExtensions());
- if (!formatUnsized && !formatColorRenderableAndFilterable)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), GenerateMipmapNotAllowed);
- return false;
- }
-
- // GL_EXT_sRGB adds an unsized SRGB (no alpha) format which has explicitly disabled mipmap
- // generation
- if (format.colorEncoding == GL_SRGB && format.format == GL_RGB)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), GenerateMipmapNotAllowed);
- return false;
- }
-
- // ES3 and WebGL grant mipmap generation for sRGBA (with alpha) textures but GL_EXT_sRGB does
- // not.
- bool supportsSRGBMipmapGeneration =
- context->getClientVersion() >= ES_3_0 || context->getExtensions().webglCompatibility;
- if (!supportsSRGBMipmapGeneration && format.colorEncoding == GL_SRGB)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), GenerateMipmapNotAllowed);
- return false;
- }
-
- // Non-power of 2 ES2 check
- if (context->getClientVersion() < Version(3, 0) && !context->getExtensions().textureNPOT &&
- (!isPow2(static_cast<int>(texture->getWidth(baseTarget, 0))) ||
- !isPow2(static_cast<int>(texture->getHeight(baseTarget, 0)))))
- {
- ASSERT(target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE_ANGLE ||
- target == GL_TEXTURE_CUBE_MAP);
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), TextureNotPow2);
- return false;
- }
-
- // Cube completeness check
- if (target == GL_TEXTURE_CUBE_MAP && !texture->getTextureState().isCubeComplete())
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), CubemapIncomplete);
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetBufferParameteriv(ValidationContext *context,
- BufferBinding target,
- GLenum pname,
- GLint *params)
-{
- return ValidateGetBufferParameterBase(context, target, pname, false, nullptr);
-}
-
-bool ValidateGetRenderbufferParameteriv(Context *context,
- GLenum target,
- GLenum pname,
- GLint *params)
-{
- return ValidateGetRenderbufferParameterivBase(context, target, pname, nullptr);
-}
-
-bool ValidateGetShaderiv(Context *context, GLuint shader, GLenum pname, GLint *params)
-{
- return ValidateGetShaderivBase(context, shader, pname, nullptr);
-}
-
-bool ValidateGetTexParameterfv(Context *context, GLenum target, GLenum pname, GLfloat *params)
-{
- return ValidateGetTexParameterBase(context, target, pname, nullptr);
-}
-
-bool ValidateGetTexParameteriv(Context *context, GLenum target, GLenum pname, GLint *params)
-{
- return ValidateGetTexParameterBase(context, target, pname, nullptr);
-}
-
-bool ValidateGetUniformfv(Context *context, GLuint program, GLint location, GLfloat *params)
-{
- return ValidateGetUniformBase(context, program, location);
-}
-
-bool ValidateGetUniformiv(Context *context, GLuint program, GLint location, GLint *params)
-{
- return ValidateGetUniformBase(context, program, location);
-}
-
-bool ValidateGetVertexAttribfv(Context *context, GLuint index, GLenum pname, GLfloat *params)
-{
- return ValidateGetVertexAttribBase(context, index, pname, nullptr, false, false);
-}
-
-bool ValidateGetVertexAttribiv(Context *context, GLuint index, GLenum pname, GLint *params)
-{
- return ValidateGetVertexAttribBase(context, index, pname, nullptr, false, false);
-}
-
-bool ValidateGetVertexAttribPointerv(Context *context, GLuint index, GLenum pname, void **pointer)
-{
- return ValidateGetVertexAttribBase(context, index, pname, nullptr, true, false);
-}
-
-bool ValidateIsEnabled(Context *context, GLenum cap)
-{
- if (!ValidCap(context, cap, true))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
- return false;
- }
-
- return true;
-}
-
-bool ValidateLinkProgram(Context *context, GLuint program)
-{
- if (context->hasActiveTransformFeedback(program))
- {
- // ES 3.0.4 section 2.15 page 91
- context->handleError(InvalidOperation() << "Cannot link program while program is "
- "associated with an active transform "
- "feedback object.");
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
- if (!programObject)
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateReadPixels(Context *context,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLenum type,
- void *pixels)
-{
- return ValidateReadPixelsBase(context, x, y, width, height, format, type, -1, nullptr, nullptr,
- nullptr, pixels);
-}
-
-bool ValidateTexParameterf(Context *context, GLenum target, GLenum pname, GLfloat param)
-{
- return ValidateTexParameterBase(context, target, pname, -1, &param);
-}
-
-bool ValidateTexParameterfv(Context *context, GLenum target, GLenum pname, const GLfloat *params)
-{
- return ValidateTexParameterBase(context, target, pname, -1, params);
-}
-
-bool ValidateTexParameteri(Context *context, GLenum target, GLenum pname, GLint param)
-{
- return ValidateTexParameterBase(context, target, pname, -1, &param);
-}
-
-bool ValidateTexParameteriv(Context *context, GLenum target, GLenum pname, const GLint *params)
-{
- return ValidateTexParameterBase(context, target, pname, -1, params);
-}
-
-bool ValidateUseProgram(Context *context, GLuint program)
-{
- if (program != 0)
- {
- Program *programObject = context->getProgram(program);
- if (!programObject)
- {
- // ES 3.1.0 section 7.3 page 72
- if (context->getShader(program))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ExpectedProgramName);
- return false;
- }
- else
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidProgramName);
- return false;
- }
- }
- if (!programObject->isLinked())
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ProgramNotLinked);
- return false;
- }
- }
- if (context->getGLState().isTransformFeedbackActiveUnpaused())
- {
- // ES 3.0.4 section 2.15 page 91
- context
- ->handleError(InvalidOperation()
- << "Cannot change active program while transform feedback is unpaused.");
- return false;
- }
-
- return true;
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/validationES2.h b/src/3rdparty/angle/src/libANGLE/validationES2.h
deleted file mode 100644
index 5dc09176a1..0000000000
--- a/src/3rdparty/angle/src/libANGLE/validationES2.h
+++ /dev/null
@@ -1,687 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationES2.h: Validation functions for OpenGL ES 2.0 entry point parameters
-
-#ifndef LIBANGLE_VALIDATION_ES2_H_
-#define LIBANGLE_VALIDATION_ES2_H_
-
-#include "libANGLE/PackedGLEnums.h"
-
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
-namespace gl
-{
-class Context;
-class ValidationContext;
-
-bool ValidateES2TexStorageParameters(Context *context,
- GLenum target,
- GLsizei levels,
- GLenum internalformat,
- GLsizei width,
- GLsizei height);
-
-bool ValidateDiscardFramebufferEXT(Context *context,
- GLenum target,
- GLsizei numAttachments,
- const GLenum *attachments);
-
-bool ValidateDrawBuffersEXT(ValidationContext *context, GLsizei n, const GLenum *bufs);
-
-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);
-
-bool ValidateProgramBinaryOES(Context *context,
- GLuint program,
- GLenum binaryFormat,
- const void *binary,
- GLint length);
-bool ValidateGetProgramBinaryOES(Context *context,
- GLuint program,
- GLsizei bufSize,
- GLsizei *length,
- GLenum *binaryFormat,
- void *binary);
-
-// GL_KHR_debug
-bool ValidateDebugMessageControlKHR(Context *context,
- GLenum source,
- GLenum type,
- GLenum severity,
- GLsizei count,
- const GLuint *ids,
- GLboolean enabled);
-bool ValidateDebugMessageInsertKHR(Context *context,
- GLenum source,
- GLenum type,
- GLuint id,
- GLenum severity,
- GLsizei length,
- const GLchar *buf);
-bool ValidateDebugMessageCallbackKHR(Context *context,
- GLDEBUGPROCKHR callback,
- const void *userParam);
-bool ValidateGetDebugMessageLogKHR(Context *context,
- GLuint count,
- GLsizei bufSize,
- GLenum *sources,
- GLenum *types,
- GLuint *ids,
- GLenum *severities,
- GLsizei *lengths,
- GLchar *messageLog);
-bool ValidatePushDebugGroupKHR(Context *context,
- GLenum source,
- GLuint id,
- GLsizei length,
- const GLchar *message);
-bool ValidatePopDebugGroupKHR(Context *context);
-bool ValidateObjectLabelKHR(Context *context,
- GLenum identifier,
- GLuint name,
- GLsizei length,
- const GLchar *label);
-bool ValidateGetObjectLabelKHR(Context *context,
- GLenum identifier,
- GLuint name,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *label);
-bool ValidateObjectPtrLabelKHR(Context *context,
- const void *ptr,
- GLsizei length,
- const GLchar *label);
-bool ValidateGetObjectPtrLabelKHR(Context *context,
- const void *ptr,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *label);
-bool ValidateGetPointervKHR(Context *context, GLenum pname, void **params);
-bool ValidateBlitFramebufferANGLE(Context *context,
- GLint srcX0,
- GLint srcY0,
- GLint srcX1,
- GLint srcY1,
- GLint dstX0,
- GLint dstY0,
- GLint dstX1,
- GLint dstY1,
- GLbitfield mask,
- GLenum filter);
-
-bool ValidateClear(ValidationContext *context, GLbitfield mask);
-bool ValidateTexImage2D(Context *context,
- GLenum target,
- GLint level,
- GLint internalformat,
- GLsizei width,
- GLsizei height,
- GLint border,
- GLenum format,
- GLenum type,
- const void *pixels);
-bool ValidateTexImage2DRobust(Context *context,
- GLenum target,
- GLint level,
- GLint internalformat,
- GLsizei width,
- GLsizei height,
- GLint border,
- GLenum format,
- GLenum type,
- GLsizei bufSize,
- const void *pixels);
-bool ValidateTexSubImage2D(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLenum type,
- const void *pixels);
-bool ValidateTexSubImage2DRobustANGLE(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLenum type,
- GLsizei bufSize,
- const void *pixels);
-bool ValidateCompressedTexImage2D(Context *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLint border,
- GLsizei imageSize,
- const void *data);
-bool ValidateCompressedTexSubImage2D(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLsizei imageSize,
- const void *data);
-bool ValidateCompressedTexImage2DRobustANGLE(Context *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLint border,
- GLsizei imageSize,
- GLsizei dataSize,
- const void *data);
-bool ValidateCompressedTexSubImage2DRobustANGLE(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLsizei imageSize,
- GLsizei dataSize,
- const void *data);
-
-bool ValidateBindTexture(Context *context, GLenum target, GLuint texture);
-
-bool ValidateGetBufferPointervOES(Context *context,
- BufferBinding target,
- GLenum pname,
- void **params);
-bool ValidateMapBufferOES(Context *context, BufferBinding target, GLenum access);
-bool ValidateUnmapBufferOES(Context *context, BufferBinding target);
-bool ValidateMapBufferRangeEXT(Context *context,
- BufferBinding target,
- GLintptr offset,
- GLsizeiptr length,
- GLbitfield access);
-bool ValidateMapBufferBase(Context *context, BufferBinding target);
-bool ValidateFlushMappedBufferRangeEXT(Context *context,
- BufferBinding target,
- GLintptr offset,
- GLsizeiptr length);
-
-bool ValidateBindUniformLocationCHROMIUM(Context *context,
- GLuint program,
- GLint location,
- const GLchar *name);
-
-bool ValidateCoverageModulationCHROMIUM(Context *context, GLenum components);
-
-// CHROMIUM_path_rendering
-bool ValidateMatrix(Context *context, GLenum matrixMode, const GLfloat *matrix);
-bool ValidateMatrixMode(Context *context, GLenum matrixMode);
-bool ValidateGenPaths(Context *context, GLsizei range);
-bool ValidateDeletePaths(Context *context, GLuint first, GLsizei range);
-bool ValidatePathCommands(Context *context,
- GLuint path,
- GLsizei numCommands,
- const GLubyte *commands,
- GLsizei numCoords,
- GLenum coordType,
- const void *coords);
-bool ValidateSetPathParameter(Context *context, GLuint path, GLenum pname, GLfloat value);
-bool ValidateGetPathParameter(Context *context, GLuint path, GLenum pname, GLfloat *value);
-bool ValidatePathStencilFunc(Context *context, GLenum func, GLint ref, GLuint mask);
-bool ValidateStencilFillPath(Context *context, GLuint path, GLenum fillMode, GLuint mask);
-bool ValidateStencilStrokePath(Context *context, GLuint path, GLint reference, GLuint mask);
-bool ValidateCoverPath(Context *context, GLuint path, GLenum coverMode);
-bool ValidateStencilThenCoverFillPath(Context *context,
- GLuint path,
- GLenum fillMode,
- GLuint mask,
- GLenum coverMode);
-bool ValidateStencilThenCoverStrokePath(Context *context,
- GLuint path,
- GLint reference,
- GLuint mask,
- GLenum coverMode);
-bool ValidateIsPath(Context *context);
-bool ValidateCoverFillPathInstanced(Context *context,
- GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues);
-bool ValidateCoverStrokePathInstanced(Context *context,
- GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues);
-bool ValidateStencilFillPathInstanced(Context *context,
- GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBAse,
- GLenum fillMode,
- GLuint mask,
- GLenum transformType,
- const GLfloat *transformValues);
-bool ValidateStencilStrokePathInstanced(Context *context,
- GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLint reference,
- GLuint mask,
- GLenum transformType,
- const GLfloat *transformValues);
-bool ValidateStencilThenCoverFillPathInstanced(Context *context,
- GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLenum fillMode,
- GLuint mask,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues);
-bool ValidateStencilThenCoverStrokePathInstanced(Context *context,
- GLsizei numPaths,
- GLenum pathNameType,
- const void *paths,
- GLuint pathBase,
- GLint reference,
- GLuint mask,
- GLenum coverMode,
- GLenum transformType,
- const GLfloat *transformValues);
-bool ValidateBindFragmentInputLocation(Context *context,
- GLuint program,
- GLint location,
- const GLchar *name);
-bool ValidateProgramPathFragmentInputGen(Context *context,
- GLuint program,
- GLint location,
- GLenum genMode,
- GLint components,
- const GLfloat *coeffs);
-
-bool ValidateCopyTextureCHROMIUM(Context *context,
- GLuint sourceId,
- GLint sourceLevel,
- GLenum destTarget,
- GLuint destId,
- GLint destLevel,
- GLint internalFormat,
- GLenum destType,
- GLboolean unpackFlipY,
- GLboolean unpackPremultiplyAlpha,
- GLboolean unpackUnmultiplyAlpha);
-bool ValidateCopySubTextureCHROMIUM(Context *context,
- GLuint sourceId,
- GLint sourceLevel,
- GLenum destTarget,
- GLuint destId,
- GLint destLevel,
- GLint xoffset,
- GLint yoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLboolean unpackFlipY,
- GLboolean unpackPremultiplyAlpha,
- GLboolean unpackUnmultiplyAlpha);
-bool ValidateCompressedCopyTextureCHROMIUM(Context *context, GLuint sourceId, GLuint destId);
-
-bool ValidateCreateShader(Context *context, GLenum type);
-bool ValidateBufferData(ValidationContext *context,
- BufferBinding target,
- GLsizeiptr size,
- const void *data,
- BufferUsage usage);
-bool ValidateBufferSubData(ValidationContext *context,
- BufferBinding target,
- GLintptr offset,
- GLsizeiptr size,
- const void *data);
-
-bool ValidateRequestExtensionANGLE(Context *context, const GLchar *name);
-
-bool ValidateActiveTexture(ValidationContext *context, GLenum texture);
-bool ValidateAttachShader(ValidationContext *context, GLuint program, GLuint shader);
-bool ValidateBindAttribLocation(ValidationContext *context,
- GLuint program,
- GLuint index,
- const GLchar *name);
-bool ValidateBindBuffer(ValidationContext *context, BufferBinding target, GLuint buffer);
-bool ValidateBindFramebuffer(ValidationContext *context, GLenum target, GLuint framebuffer);
-bool ValidateBindRenderbuffer(ValidationContext *context, GLenum target, GLuint renderbuffer);
-bool ValidateBlendColor(ValidationContext *context,
- GLclampf red,
- GLclampf green,
- GLclampf blue,
- GLclampf alpha);
-bool ValidateBlendEquation(ValidationContext *context, GLenum mode);
-bool ValidateBlendEquationSeparate(ValidationContext *context, GLenum modeRGB, GLenum modeAlpha);
-bool ValidateBlendFunc(ValidationContext *context, GLenum sfactor, GLenum dfactor);
-bool ValidateBlendFuncSeparate(ValidationContext *context,
- GLenum srcRGB,
- GLenum dstRGB,
- GLenum srcAlpha,
- GLenum dstAlpha);
-
-bool ValidateGetString(Context *context, GLenum name);
-bool ValidateLineWidth(ValidationContext *context, GLfloat width);
-bool ValidateVertexAttribPointer(ValidationContext *context,
- GLuint index,
- GLint size,
- GLenum type,
- GLboolean normalized,
- GLsizei stride,
- const void *ptr);
-
-bool ValidateDepthRangef(ValidationContext *context, GLclampf zNear, GLclampf zFar);
-bool ValidateRenderbufferStorage(ValidationContext *context,
- GLenum target,
- GLenum internalformat,
- GLsizei width,
- GLsizei height);
-bool ValidateRenderbufferStorageMultisampleANGLE(ValidationContext *context,
- GLenum target,
- GLsizei samples,
- GLenum internalformat,
- GLsizei width,
- GLsizei height);
-
-bool ValidateCheckFramebufferStatus(ValidationContext *context, GLenum target);
-bool ValidateClearColor(ValidationContext *context,
- GLclampf red,
- GLclampf green,
- GLclampf blue,
- GLclampf alpha);
-bool ValidateClearDepthf(ValidationContext *context, GLclampf depth);
-bool ValidateClearStencil(ValidationContext *context, GLint s);
-bool ValidateColorMask(ValidationContext *context,
- GLboolean red,
- GLboolean green,
- GLboolean blue,
- GLboolean alpha);
-bool ValidateCompileShader(ValidationContext *context, GLuint shader);
-bool ValidateCreateProgram(ValidationContext *context);
-bool ValidateCullFace(ValidationContext *context, CullFaceMode mode);
-bool ValidateDeleteProgram(ValidationContext *context, GLuint program);
-bool ValidateDeleteShader(ValidationContext *context, GLuint shader);
-bool ValidateDepthFunc(ValidationContext *context, GLenum func);
-bool ValidateDepthMask(ValidationContext *context, GLboolean flag);
-bool ValidateDetachShader(ValidationContext *context, GLuint program, GLuint shader);
-bool ValidateDisableVertexAttribArray(ValidationContext *context, GLuint index);
-bool ValidateEnableVertexAttribArray(ValidationContext *context, GLuint index);
-bool ValidateFinish(ValidationContext *context);
-bool ValidateFlush(ValidationContext *context);
-bool ValidateFrontFace(ValidationContext *context, GLenum mode);
-bool ValidateGetActiveAttrib(ValidationContext *context,
- GLuint program,
- GLuint index,
- GLsizei bufsize,
- GLsizei *length,
- GLint *size,
- GLenum *type,
- GLchar *name);
-bool ValidateGetActiveUniform(ValidationContext *context,
- GLuint program,
- GLuint index,
- GLsizei bufsize,
- GLsizei *length,
- GLint *size,
- GLenum *type,
- GLchar *name);
-bool ValidateGetAttachedShaders(ValidationContext *context,
- GLuint program,
- GLsizei maxcount,
- GLsizei *count,
- GLuint *shaders);
-bool ValidateGetAttribLocation(ValidationContext *context, GLuint program, const GLchar *name);
-bool ValidateGetBooleanv(ValidationContext *context, GLenum pname, GLboolean *params);
-bool ValidateGetError(ValidationContext *context);
-bool ValidateGetFloatv(ValidationContext *context, GLenum pname, GLfloat *params);
-bool ValidateGetIntegerv(ValidationContext *context, GLenum pname, GLint *params);
-bool ValidateGetProgramInfoLog(ValidationContext *context,
- GLuint program,
- GLsizei bufsize,
- GLsizei *length,
- GLchar *infolog);
-bool ValidateGetShaderInfoLog(ValidationContext *context,
- GLuint shader,
- GLsizei bufsize,
- GLsizei *length,
- GLchar *infolog);
-bool ValidateGetShaderPrecisionFormat(ValidationContext *context,
- GLenum shadertype,
- GLenum precisiontype,
- GLint *range,
- GLint *precision);
-bool ValidateGetShaderSource(ValidationContext *context,
- GLuint shader,
- GLsizei bufsize,
- GLsizei *length,
- GLchar *source);
-bool ValidateGetUniformLocation(ValidationContext *context, GLuint program, const GLchar *name);
-bool ValidateHint(ValidationContext *context, GLenum target, GLenum mode);
-bool ValidateIsBuffer(ValidationContext *context, GLuint buffer);
-bool ValidateIsFramebuffer(ValidationContext *context, GLuint framebuffer);
-bool ValidateIsProgram(ValidationContext *context, GLuint program);
-bool ValidateIsRenderbuffer(ValidationContext *context, GLuint renderbuffer);
-bool ValidateIsShader(ValidationContext *context, GLuint shader);
-bool ValidateIsTexture(ValidationContext *context, GLuint texture);
-bool ValidatePixelStorei(ValidationContext *context, GLenum pname, GLint param);
-bool ValidatePolygonOffset(ValidationContext *context, GLfloat factor, GLfloat units);
-bool ValidateReleaseShaderCompiler(ValidationContext *context);
-bool ValidateSampleCoverage(ValidationContext *context, GLclampf value, GLboolean invert);
-bool ValidateScissor(ValidationContext *context, GLint x, GLint y, GLsizei width, GLsizei height);
-bool ValidateShaderBinary(ValidationContext *context,
- GLsizei n,
- const GLuint *shaders,
- GLenum binaryformat,
- const void *binary,
- GLsizei length);
-bool ValidateShaderSource(ValidationContext *context,
- GLuint shader,
- GLsizei count,
- const GLchar *const *string,
- const GLint *length);
-bool ValidateStencilFunc(ValidationContext *context, GLenum func, GLint ref, GLuint mask);
-bool ValidateStencilFuncSeparate(ValidationContext *context,
- GLenum face,
- GLenum func,
- GLint ref,
- GLuint mask);
-bool ValidateStencilMask(ValidationContext *context, GLuint mask);
-bool ValidateStencilMaskSeparate(ValidationContext *context, GLenum face, GLuint mask);
-bool ValidateStencilOp(ValidationContext *context, GLenum fail, GLenum zfail, GLenum zpass);
-bool ValidateStencilOpSeparate(ValidationContext *context,
- GLenum face,
- GLenum fail,
- GLenum zfail,
- GLenum zpass);
-bool ValidateUniform1f(ValidationContext *context, GLint location, GLfloat x);
-bool ValidateUniform1fv(ValidationContext *context,
- GLint location,
- GLsizei count,
- const GLfloat *v);
-bool ValidateUniform1i(ValidationContext *context, GLint location, GLint x);
-bool ValidateUniform2f(ValidationContext *context, GLint location, GLfloat x, GLfloat y);
-bool ValidateUniform2fv(ValidationContext *context,
- GLint location,
- GLsizei count,
- const GLfloat *v);
-bool ValidateUniform2i(ValidationContext *context, GLint location, GLint x, GLint y);
-bool ValidateUniform2iv(ValidationContext *context, GLint location, GLsizei count, const GLint *v);
-bool ValidateUniform3f(ValidationContext *context, GLint location, GLfloat x, GLfloat y, GLfloat z);
-bool ValidateUniform3fv(ValidationContext *context,
- GLint location,
- GLsizei count,
- const GLfloat *v);
-bool ValidateUniform3i(ValidationContext *context, GLint location, GLint x, GLint y, GLint z);
-bool ValidateUniform3iv(ValidationContext *context, GLint location, GLsizei count, const GLint *v);
-bool ValidateUniform4f(ValidationContext *context,
- GLint location,
- GLfloat x,
- GLfloat y,
- GLfloat z,
- GLfloat w);
-bool ValidateUniform4fv(ValidationContext *context,
- GLint location,
- GLsizei count,
- const GLfloat *v);
-bool ValidateUniform4i(ValidationContext *context,
- GLint location,
- GLint x,
- GLint y,
- GLint z,
- GLint w);
-bool ValidateUniform4iv(ValidationContext *context, GLint location, GLsizei count, const GLint *v);
-bool ValidateUniformMatrix2fv(ValidationContext *context,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-bool ValidateUniformMatrix3fv(ValidationContext *context,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-bool ValidateUniformMatrix4fv(ValidationContext *context,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-bool ValidateValidateProgram(ValidationContext *context, GLuint program);
-bool ValidateVertexAttrib1f(ValidationContext *context, GLuint index, GLfloat x);
-bool ValidateVertexAttrib1fv(ValidationContext *context, GLuint index, const GLfloat *values);
-bool ValidateVertexAttrib2f(ValidationContext *context, GLuint index, GLfloat x, GLfloat y);
-bool ValidateVertexAttrib2fv(ValidationContext *context, GLuint index, const GLfloat *values);
-bool ValidateVertexAttrib3f(ValidationContext *context,
- GLuint index,
- GLfloat x,
- GLfloat y,
- GLfloat z);
-bool ValidateVertexAttrib3fv(ValidationContext *context, GLuint index, const GLfloat *values);
-bool ValidateVertexAttrib4f(ValidationContext *context,
- GLuint index,
- GLfloat x,
- GLfloat y,
- GLfloat z,
- GLfloat w);
-bool ValidateVertexAttrib4fv(ValidationContext *context, GLuint index, const GLfloat *values);
-bool ValidateViewport(ValidationContext *context, GLint x, GLint y, GLsizei width, GLsizei height);
-bool ValidateDrawElements(ValidationContext *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices);
-
-bool ValidateDrawArrays(ValidationContext *context, GLenum mode, GLint first, GLsizei count);
-
-bool ValidateGetFramebufferAttachmentParameteriv(ValidationContext *context,
- GLenum target,
- GLenum attachment,
- GLenum pname,
- GLint *params);
-bool ValidateGetProgramiv(ValidationContext *context, GLuint program, GLenum pname, GLint *params);
-
-bool ValidateCopyTexImage2D(ValidationContext *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLint border);
-
-bool ValidateCopyTexSubImage2D(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height);
-
-bool ValidateDeleteBuffers(Context *context, GLint n, const GLuint *buffers);
-bool ValidateDeleteFramebuffers(Context *context, GLint n, const GLuint *framebuffers);
-bool ValidateDeleteRenderbuffers(Context *context, GLint n, const GLuint *renderbuffers);
-bool ValidateDeleteTextures(Context *context, GLint n, const GLuint *textures);
-bool ValidateDisable(Context *context, GLenum cap);
-bool ValidateEnable(Context *context, GLenum cap);
-bool ValidateFramebufferRenderbuffer(Context *context,
- GLenum target,
- GLenum attachment,
- GLenum renderbuffertarget,
- GLuint renderbuffer);
-bool ValidateFramebufferTexture2D(Context *context,
- GLenum target,
- GLenum attachment,
- GLenum textarget,
- GLuint texture,
- GLint level);
-bool ValidateGenBuffers(Context *context, GLint n, GLuint *buffers);
-bool ValidateGenerateMipmap(Context *context, GLenum target);
-bool ValidateGenFramebuffers(Context *context, GLint n, GLuint *framebuffers);
-bool ValidateGenRenderbuffers(Context *context, GLint n, GLuint *renderbuffers);
-bool ValidateGenTextures(Context *context, GLint n, GLuint *textures);
-bool ValidateGetBufferParameteriv(ValidationContext *context,
- BufferBinding target,
- GLenum pname,
- GLint *params);
-bool ValidateGetRenderbufferParameteriv(Context *context,
- GLenum target,
- GLenum pname,
- GLint *params);
-bool ValidateGetShaderiv(Context *context, GLuint shader, GLenum pname, GLint *params);
-bool ValidateGetTexParameterfv(Context *context, GLenum target, GLenum pname, GLfloat *params);
-bool ValidateGetTexParameteriv(Context *context, GLenum target, GLenum pname, GLint *params);
-bool ValidateGetUniformfv(Context *context, GLuint program, GLint location, GLfloat *params);
-bool ValidateGetUniformiv(Context *context, GLuint program, GLint location, GLint *params);
-bool ValidateGetVertexAttribfv(Context *context, GLuint index, GLenum pname, GLfloat *params);
-bool ValidateGetVertexAttribiv(Context *context, GLuint index, GLenum pname, GLint *params);
-bool ValidateGetVertexAttribPointerv(Context *context, GLuint index, GLenum pname, void **pointer);
-bool ValidateIsEnabled(Context *context, GLenum cap);
-bool ValidateLinkProgram(Context *context, GLuint program);
-bool ValidateReadPixels(Context *context,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLenum format,
- GLenum type,
- void *pixels);
-bool ValidateTexParameterf(Context *context, GLenum target, GLenum pname, GLfloat param);
-bool ValidateTexParameterfv(Context *context, GLenum target, GLenum pname, const GLfloat *params);
-bool ValidateTexParameteri(Context *context, GLenum target, GLenum pname, GLint param);
-bool ValidateTexParameteriv(Context *context, GLenum target, GLenum pname, const GLint *params);
-bool ValidateUniform1iv(ValidationContext *context,
- GLint location,
- GLsizei count,
- const GLint *value);
-bool ValidateUseProgram(Context *context, GLuint program);
-
-} // namespace gl
-
-#endif // LIBANGLE_VALIDATION_ES2_H_
diff --git a/src/3rdparty/angle/src/libANGLE/validationES3.cpp b/src/3rdparty/angle/src/libANGLE/validationES3.cpp
deleted file mode 100644
index 1aadfc876e..0000000000
--- a/src/3rdparty/angle/src/libANGLE/validationES3.cpp
+++ /dev/null
@@ -1,3702 +0,0 @@
-//
-// Copyright (c) 2013-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationES3.cpp: Validation functions for OpenGL ES 3.0 entry point parameters
-
-#include "libANGLE/validationES3.h"
-
-#include "anglebase/numerics/safe_conversions.h"
-#include "common/mathutil.h"
-#include "common/utilities.h"
-#include "libANGLE/Context.h"
-#include "libANGLE/ErrorStrings.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/Renderbuffer.h"
-#include "libANGLE/Texture.h"
-#include "libANGLE/formatutils.h"
-#include "libANGLE/validationES.h"
-
-using namespace angle;
-
-namespace gl
-{
-
-namespace
-{
-bool ValidateFramebufferTextureMultiviewBaseANGLE(Context *context,
- GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLsizei numViews)
-{
- if (!context->getExtensions().multiview)
- {
- context->handleError(InvalidOperation() << "ANGLE_multiview is not available.");
- return false;
- }
-
- if (!ValidateFramebufferTextureBase(context, target, attachment, texture, level))
- {
- return false;
- }
-
- if (texture != 0 && numViews < 1)
- {
- context->handleError(InvalidValue() << "numViews cannot be less than 1.");
- return false;
- }
-
- const Extensions &extensions = context->getExtensions();
- if (static_cast<GLuint>(numViews) > extensions.maxViews)
- {
- context->handleError(InvalidValue()
- << "numViews cannot be greater than GL_MAX_VIEWS_ANGLE.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateFramebufferTextureMultiviewLevelAndFormat(Context *context,
- Texture *texture,
- GLint level)
-{
- GLenum texTarget = texture->getTarget();
- if (!ValidMipLevel(context, texTarget, level))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidMipLevel);
- return false;
- }
-
- const auto &format = texture->getFormat(texTarget, level);
- if (format.info->compressed)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), CompressedTexturesNotAttachable);
- return false;
- }
- return true;
-}
-
-bool ValidateUniformES3(Context *context, GLenum uniformType, GLint location, GLint count)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateUniform(context, uniformType, location, count);
-}
-
-bool ValidateUniformMatrixES3(Context *context,
- GLenum valueType,
- GLint location,
- GLsizei count,
- GLboolean transpose)
-{
- // Check for ES3 uniform entry points
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateUniformMatrix(context, valueType, location, count, transpose);
-}
-
-bool ValidateGenOrDeleteES3(Context *context, GLint n)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
- return ValidateGenOrDelete(context, n);
-}
-
-bool ValidateGenOrDeleteCountES3(Context *context, GLint count)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
- if (count < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeCount);
- return false;
- }
- return true;
-}
-
-} // anonymous namespace
-
-static bool ValidateTexImageFormatCombination(gl::Context *context,
- GLenum target,
- GLenum internalFormat,
- GLenum format,
- GLenum type)
-{
-
- // The type and format are valid if any supported internal format has that type and format
- if (!ValidES3Format(format))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFormat);
- return false;
- }
-
- if (!ValidES3Type(type))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidType);
- return false;
- }
-
- // For historical reasons, glTexImage2D and glTexImage3D pass in their internal format as a
- // GLint instead of a GLenum. Therefor an invalid internal format gives a GL_INVALID_VALUE
- // error instead of a GL_INVALID_ENUM error. As this validation function is only called in
- // the validation codepaths for glTexImage2D/3D, we record a GL_INVALID_VALUE error.
- if (!ValidES3InternalFormat(internalFormat))
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidInternalFormat);
- return false;
- }
-
- // From the ES 3.0 spec section 3.8.3:
- // Textures with a base internal format of DEPTH_COMPONENT or DEPTH_STENCIL are supported by
- // texture image specification commands only if target is TEXTURE_2D, TEXTURE_2D_ARRAY, or
- // TEXTURE_CUBE_MAP.Using these formats in conjunction with any other target will result in an
- // INVALID_OPERATION error.
- if (target == GL_TEXTURE_3D && (format == GL_DEPTH_COMPONENT || format == GL_DEPTH_STENCIL))
- {
- context->handleError(InvalidOperation() << "Format cannot be GL_DEPTH_COMPONENT or "
- "GL_DEPTH_STENCIL if target is "
- "GL_TEXTURE_3D");
- return false;
- }
-
- // Check if this is a valid format combination to load texture data
- if (!ValidES3FormatCombination(format, type, internalFormat))
- {
- context->handleError(InvalidOperation()
- << "Invalid combination of format, type and internalFormat.");
- return false;
- }
-
- const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalFormat, type);
- if (!formatInfo.textureSupport(context->getClientVersion(), context->getExtensions()))
- {
- context->handleError(InvalidOperation() << "Unsupported internal format.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateES3TexImageParametersBase(Context *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- bool isCompressed,
- bool isSubImage,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLint border,
- GLenum format,
- GLenum type,
- GLsizei imageSize,
- const void *pixels)
-{
- // Validate image size
- if (!ValidImageSizeParameters(context, target, level, width, height, depth, isSubImage))
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- // Verify zero border
- if (border != 0)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- if (xoffset < 0 || yoffset < 0 || zoffset < 0 ||
- std::numeric_limits<GLsizei>::max() - xoffset < width ||
- std::numeric_limits<GLsizei>::max() - yoffset < height ||
- std::numeric_limits<GLsizei>::max() - zoffset < depth)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- const gl::Caps &caps = context->getCaps();
-
- switch (target)
- {
- case GL_TEXTURE_2D:
- if (static_cast<GLuint>(width) > (caps.max2DTextureSize >> level) ||
- static_cast<GLuint>(height) > (caps.max2DTextureSize >> level))
- {
- context->handleError(InvalidValue());
- return false;
- }
- break;
-
- case GL_TEXTURE_RECTANGLE_ANGLE:
- ASSERT(level == 0);
- if (static_cast<GLuint>(width) > caps.maxRectangleTextureSize ||
- static_cast<GLuint>(height) > caps.maxRectangleTextureSize)
- {
- context->handleError(InvalidValue());
- return false;
- }
- if (isCompressed)
- {
- context->handleError(InvalidEnum()
- << "Rectangle texture cannot have a compressed format.");
- return false;
- }
- break;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- if (!isSubImage && width != height)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- if (static_cast<GLuint>(width) > (caps.maxCubeMapTextureSize >> level))
- {
- context->handleError(InvalidValue());
- return false;
- }
- break;
-
- case GL_TEXTURE_3D:
- if (static_cast<GLuint>(width) > (caps.max3DTextureSize >> level) ||
- static_cast<GLuint>(height) > (caps.max3DTextureSize >> level) ||
- static_cast<GLuint>(depth) > (caps.max3DTextureSize >> level))
- {
- context->handleError(InvalidValue());
- return false;
- }
- break;
-
- case GL_TEXTURE_2D_ARRAY:
- if (static_cast<GLuint>(width) > (caps.max2DTextureSize >> level) ||
- static_cast<GLuint>(height) > (caps.max2DTextureSize >> level) ||
- static_cast<GLuint>(depth) > caps.maxArrayTextureLayers)
- {
- context->handleError(InvalidValue());
- return false;
- }
- break;
-
- default:
- context->handleError(InvalidEnum());
- return false;
- }
-
- gl::Texture *texture =
- context->getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
- if (!texture)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- if (texture->getImmutableFormat() && !isSubImage)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- // Validate texture formats
- GLenum actualInternalFormat =
- isSubImage ? texture->getFormat(target, level).info->internalFormat : internalformat;
- if (isSubImage && actualInternalFormat == GL_NONE)
- {
- context->handleError(InvalidOperation() << "Texture level does not exist.");
- return false;
- }
-
- const gl::InternalFormat &actualFormatInfo = isSubImage
- ? *texture->getFormat(target, level).info
- : GetInternalFormatInfo(internalformat, type);
- if (isCompressed)
- {
- if (!actualFormatInfo.compressed)
- {
- context->handleError(
- InvalidEnum() << "internalformat is not a supported compressed internal format.");
- return false;
- }
-
- if (isSubImage)
- {
- if (!ValidCompressedSubImageSize(
- context, actualFormatInfo.internalFormat, xoffset, yoffset, width, height,
- texture->getWidth(target, level), texture->getHeight(target, level)))
- {
- context->handleError(InvalidOperation() << "Invalid compressed format dimension.");
- return false;
- }
-
- if (format != actualInternalFormat)
- {
- context->handleError(InvalidOperation()
- << "Format must match the internal format of the texture.");
- return false;
- }
-
- if (actualInternalFormat == GL_ETC1_RGB8_OES)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidInternalFormat);
- return false;
- }
- }
- else
- {
- if (!ValidCompressedImageSize(context, actualInternalFormat, level, width, height))
- {
- context->handleError(InvalidOperation() << "Invalid compressed format dimension.");
- return false;
- }
- }
-
- if (!actualFormatInfo.textureSupport(context->getClientVersion(), context->getExtensions()))
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- if (target == GL_TEXTURE_3D)
- {
- context->handleError(InvalidOperation());
- return false;
- }
- }
- else
- {
- if (!ValidateTexImageFormatCombination(context, target, actualInternalFormat, format, type))
- {
- return false;
- }
- }
-
- // Validate sub image parameters
- if (isSubImage)
- {
- if (isCompressed != actualFormatInfo.compressed)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- if (xoffset < 0 || yoffset < 0 || zoffset < 0)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- if (std::numeric_limits<GLsizei>::max() - xoffset < width ||
- std::numeric_limits<GLsizei>::max() - yoffset < height ||
- std::numeric_limits<GLsizei>::max() - zoffset < depth)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- if (static_cast<size_t>(xoffset + width) > texture->getWidth(target, level) ||
- static_cast<size_t>(yoffset + height) > texture->getHeight(target, level) ||
- static_cast<size_t>(zoffset + depth) > texture->getDepth(target, level))
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- if (width > 0 && height > 0 && depth > 0 && pixels == nullptr &&
- context->getGLState().getTargetBuffer(gl::BufferBinding::PixelUnpack) == nullptr)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), PixelDataNull);
- return false;
- }
- }
-
- GLenum sizeCheckFormat = isSubImage ? format : internalformat;
- if (!ValidImageDataSize(context, target, width, height, depth, sizeCheckFormat, type, pixels,
- imageSize))
- {
- return false;
- }
-
- // Check for pixel unpack buffer related API errors
- gl::Buffer *pixelUnpackBuffer =
- context->getGLState().getTargetBuffer(BufferBinding::PixelUnpack);
- if (pixelUnpackBuffer != nullptr)
- {
- // ...data is not evenly divisible into the number of bytes needed to store in memory a
- // datum
- // indicated by type.
- if (!isCompressed)
- {
- size_t offset = reinterpret_cast<size_t>(pixels);
- size_t dataBytesPerPixel = static_cast<size_t>(gl::GetTypeInfo(type).bytes);
-
- if ((offset % dataBytesPerPixel) != 0)
- {
- context->handleError(InvalidOperation()
- << "Reads would overflow the pixel unpack buffer.");
- return false;
- }
- }
-
- // ...the buffer object's data store is currently mapped.
- if (pixelUnpackBuffer->isMapped())
- {
- context->handleError(InvalidOperation() << "Pixel unpack buffer is mapped.");
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateES3TexImage2DParameters(Context *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- bool isCompressed,
- bool isSubImage,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLint border,
- GLenum format,
- GLenum type,
- GLsizei imageSize,
- const void *pixels)
-{
- if (!ValidTexture2DDestinationTarget(context, target))
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- return ValidateES3TexImageParametersBase(context, target, level, internalformat, isCompressed,
- isSubImage, xoffset, yoffset, zoffset, width, height,
- depth, border, format, type, imageSize, pixels);
-}
-
-bool ValidateES3TexImage3DParameters(Context *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- bool isCompressed,
- bool isSubImage,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLint border,
- GLenum format,
- GLenum type,
- GLsizei bufSize,
- const void *pixels)
-{
- if (!ValidTexture3DDestinationTarget(context, target))
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- return ValidateES3TexImageParametersBase(context, target, level, internalformat, isCompressed,
- isSubImage, xoffset, yoffset, zoffset, width, height,
- depth, border, format, type, bufSize, pixels);
-}
-
-struct EffectiveInternalFormatInfo
-{
- GLenum effectiveFormat;
- GLenum destFormat;
- GLuint minRedBits;
- GLuint maxRedBits;
- GLuint minGreenBits;
- GLuint maxGreenBits;
- GLuint minBlueBits;
- GLuint maxBlueBits;
- GLuint minAlphaBits;
- GLuint maxAlphaBits;
-};
-
-static bool QueryEffectiveFormatList(const InternalFormat &srcFormat,
- GLenum targetFormat,
- const EffectiveInternalFormatInfo *list,
- size_t size,
- GLenum *outEffectiveFormat)
-{
- for (size_t curFormat = 0; curFormat < size; ++curFormat)
- {
- const EffectiveInternalFormatInfo &formatInfo = list[curFormat];
- if ((formatInfo.destFormat == targetFormat) &&
- (formatInfo.minRedBits <= srcFormat.redBits &&
- formatInfo.maxRedBits >= srcFormat.redBits) &&
- (formatInfo.minGreenBits <= srcFormat.greenBits &&
- formatInfo.maxGreenBits >= srcFormat.greenBits) &&
- (formatInfo.minBlueBits <= srcFormat.blueBits &&
- formatInfo.maxBlueBits >= srcFormat.blueBits) &&
- (formatInfo.minAlphaBits <= srcFormat.alphaBits &&
- formatInfo.maxAlphaBits >= srcFormat.alphaBits))
- {
- *outEffectiveFormat = formatInfo.effectiveFormat;
- return true;
- }
- }
-
- *outEffectiveFormat = GL_NONE;
- return false;
-}
-
-bool GetSizedEffectiveInternalFormatInfo(const InternalFormat &srcFormat,
- GLenum *outEffectiveFormat)
-{
- // OpenGL ES 3.0.3 Specification, Table 3.17, pg 141:
- // Effective internal format coresponding to destination internal format and linear source
- // buffer component sizes.
- // | Source channel min/max sizes |
- // Effective Internal Format | N/A | R | G | B | A |
- // clang-format off
- constexpr EffectiveInternalFormatInfo list[] = {
- { GL_ALPHA8_EXT, GL_NONE, 0, 0, 0, 0, 0, 0, 1, 8 },
- { GL_R8, GL_NONE, 1, 8, 0, 0, 0, 0, 0, 0 },
- { GL_RG8, GL_NONE, 1, 8, 1, 8, 0, 0, 0, 0 },
- { GL_RGB565, GL_NONE, 1, 5, 1, 6, 1, 5, 0, 0 },
- { GL_RGB8, GL_NONE, 6, 8, 7, 8, 6, 8, 0, 0 },
- { GL_RGBA4, GL_NONE, 1, 4, 1, 4, 1, 4, 1, 4 },
- { GL_RGB5_A1, GL_NONE, 5, 5, 5, 5, 5, 5, 1, 1 },
- { GL_RGBA8, GL_NONE, 5, 8, 5, 8, 5, 8, 2, 8 },
- { GL_RGB10_A2, GL_NONE, 9, 10, 9, 10, 9, 10, 2, 2 },
- };
- // clang-format on
-
- return QueryEffectiveFormatList(srcFormat, GL_NONE, list, ArraySize(list), outEffectiveFormat);
-}
-
-bool GetUnsizedEffectiveInternalFormatInfo(const InternalFormat &srcFormat,
- const InternalFormat &destFormat,
- GLenum *outEffectiveFormat)
-{
- constexpr GLuint umax = UINT_MAX;
-
- // OpenGL ES 3.0.3 Specification, Table 3.17, pg 141:
- // Effective internal format coresponding to destination internal format andlinear source buffer
- // component sizes.
- // | Source channel min/max sizes |
- // Effective Internal Format | Dest Format | R | G | B | A |
- // clang-format off
- constexpr EffectiveInternalFormatInfo list[] = {
- { GL_ALPHA8_EXT, GL_ALPHA, 0, umax, 0, umax, 0, umax, 1, 8 },
- { GL_LUMINANCE8_EXT, GL_LUMINANCE, 1, 8, 0, umax, 0, umax, 0, umax },
- { GL_LUMINANCE8_ALPHA8_EXT, GL_LUMINANCE_ALPHA, 1, 8, 0, umax, 0, umax, 1, 8 },
- { GL_RGB565, GL_RGB, 1, 5, 1, 6, 1, 5, 0, umax },
- { GL_RGB8, GL_RGB, 6, 8, 7, 8, 6, 8, 0, umax },
- { GL_RGBA4, GL_RGBA, 1, 4, 1, 4, 1, 4, 1, 4 },
- { GL_RGB5_A1, GL_RGBA, 5, 5, 5, 5, 5, 5, 1, 1 },
- { GL_RGBA8, GL_RGBA, 5, 8, 5, 8, 5, 8, 5, 8 },
- };
- // clang-format on
-
- return QueryEffectiveFormatList(srcFormat, destFormat.format, list, ArraySize(list),
- outEffectiveFormat);
-}
-
-static bool GetEffectiveInternalFormat(const InternalFormat &srcFormat,
- const InternalFormat &destFormat,
- GLenum *outEffectiveFormat)
-{
- if (destFormat.sized)
- {
- return GetSizedEffectiveInternalFormatInfo(srcFormat, outEffectiveFormat);
- }
- else
- {
- return GetUnsizedEffectiveInternalFormatInfo(srcFormat, destFormat, outEffectiveFormat);
- }
-}
-
-static bool EqualOrFirstZero(GLuint first, GLuint second)
-{
- return first == 0 || first == second;
-}
-
-static bool IsValidES3CopyTexImageCombination(const InternalFormat &textureFormatInfo,
- const InternalFormat &framebufferFormatInfo,
- GLuint readBufferHandle)
-{
- if (!ValidES3CopyConversion(textureFormatInfo.format, framebufferFormatInfo.format))
- {
- return false;
- }
-
- // Section 3.8.5 of the GLES 3.0.3 spec states that source and destination formats
- // must both be signed, unsigned, or fixed point and both source and destinations
- // must be either both SRGB or both not SRGB. EXT_color_buffer_float adds allowed
- // conversion between fixed and floating point.
-
- if ((textureFormatInfo.colorEncoding == GL_SRGB) !=
- (framebufferFormatInfo.colorEncoding == GL_SRGB))
- {
- return false;
- }
-
- if (((textureFormatInfo.componentType == GL_INT) !=
- (framebufferFormatInfo.componentType == GL_INT)) ||
- ((textureFormatInfo.componentType == GL_UNSIGNED_INT) !=
- (framebufferFormatInfo.componentType == GL_UNSIGNED_INT)))
- {
- return false;
- }
-
- if ((textureFormatInfo.componentType == GL_UNSIGNED_NORMALIZED ||
- textureFormatInfo.componentType == GL_SIGNED_NORMALIZED ||
- textureFormatInfo.componentType == GL_FLOAT) &&
- !(framebufferFormatInfo.componentType == GL_UNSIGNED_NORMALIZED ||
- framebufferFormatInfo.componentType == GL_SIGNED_NORMALIZED ||
- framebufferFormatInfo.componentType == GL_FLOAT))
- {
- return false;
- }
-
- // GLES specification 3.0.3, sec 3.8.5, pg 139-140:
- // The effective internal format of the source buffer is determined with the following rules
- // applied in order:
- // * If the source buffer is a texture or renderbuffer that was created with a sized internal
- // format then the effective internal format is the source buffer's sized internal format.
- // * If the source buffer is a texture that was created with an unsized base internal format,
- // then the effective internal format is the source image array's effective internal
- // format, as specified by table 3.12, which is determined from the <format> and <type>
- // that were used when the source image array was specified by TexImage*.
- // * Otherwise the effective internal format is determined by the row in table 3.17 or 3.18
- // where Destination Internal Format matches internalformat and where the [source channel
- // sizes] are consistent with the values of the source buffer's [channel sizes]. Table 3.17
- // is used if the FRAMEBUFFER_ATTACHMENT_ENCODING is LINEAR and table 3.18 is used if the
- // FRAMEBUFFER_ATTACHMENT_ENCODING is SRGB.
- const InternalFormat *sourceEffectiveFormat = nullptr;
- if (readBufferHandle != 0)
- {
- // Not the default framebuffer, therefore the read buffer must be a user-created texture or
- // renderbuffer
- if (framebufferFormatInfo.sized)
- {
- sourceEffectiveFormat = &framebufferFormatInfo;
- }
- else
- {
- // Renderbuffers cannot be created with an unsized internal format, so this must be an
- // unsized-format texture. We can use the same table we use when creating textures to
- // get its effective sized format.
- sourceEffectiveFormat =
- &GetSizedInternalFormatInfo(framebufferFormatInfo.sizedInternalFormat);
- }
- }
- else
- {
- // The effective internal format must be derived from the source framebuffer's channel
- // sizes. This is done in GetEffectiveInternalFormat for linear buffers (table 3.17)
- if (framebufferFormatInfo.colorEncoding == GL_LINEAR)
- {
- GLenum effectiveFormat;
- if (GetEffectiveInternalFormat(framebufferFormatInfo, textureFormatInfo,
- &effectiveFormat))
- {
- sourceEffectiveFormat = &GetSizedInternalFormatInfo(effectiveFormat);
- }
- else
- {
- return false;
- }
- }
- else if (framebufferFormatInfo.colorEncoding == GL_SRGB)
- {
- // SRGB buffers can only be copied to sized format destinations according to table 3.18
- if (textureFormatInfo.sized &&
- (framebufferFormatInfo.redBits >= 1 && framebufferFormatInfo.redBits <= 8) &&
- (framebufferFormatInfo.greenBits >= 1 && framebufferFormatInfo.greenBits <= 8) &&
- (framebufferFormatInfo.blueBits >= 1 && framebufferFormatInfo.blueBits <= 8) &&
- (framebufferFormatInfo.alphaBits >= 1 && framebufferFormatInfo.alphaBits <= 8))
- {
- sourceEffectiveFormat = &GetSizedInternalFormatInfo(GL_SRGB8_ALPHA8);
- }
- else
- {
- return false;
- }
- }
- else
- {
- UNREACHABLE();
- return false;
- }
- }
-
- if (textureFormatInfo.sized)
- {
- // Section 3.8.5 of the GLES 3.0.3 spec, pg 139, requires that, if the destination format is
- // sized, component sizes of the source and destination formats must exactly match if the
- // destination format exists.
- if (!EqualOrFirstZero(textureFormatInfo.redBits, sourceEffectiveFormat->redBits) ||
- !EqualOrFirstZero(textureFormatInfo.greenBits, sourceEffectiveFormat->greenBits) ||
- !EqualOrFirstZero(textureFormatInfo.blueBits, sourceEffectiveFormat->blueBits) ||
- !EqualOrFirstZero(textureFormatInfo.alphaBits, sourceEffectiveFormat->alphaBits))
- {
- return false;
- }
- }
-
- return true; // A conversion function exists, and no rule in the specification has precluded
- // conversion between these formats.
-}
-
-bool ValidateES3CopyTexImageParametersBase(ValidationContext *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- bool isSubImage,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLint border)
-{
- Format textureFormat = Format::Invalid();
- if (!ValidateCopyTexImageParametersBase(context, target, level, internalformat, isSubImage,
- xoffset, yoffset, zoffset, x, y, width, height, border,
- &textureFormat))
- {
- return false;
- }
- ASSERT(textureFormat.valid() || !isSubImage);
-
- const auto &state = context->getGLState();
- gl::Framebuffer *framebuffer = state.getReadFramebuffer();
- GLuint readFramebufferID = framebuffer->id();
-
- if (framebuffer->checkStatus(context) != GL_FRAMEBUFFER_COMPLETE)
- {
- context->handleError(InvalidFramebufferOperation());
- return false;
- }
-
- if (readFramebufferID != 0 && framebuffer->getSamples(context) != 0)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- const FramebufferAttachment *source = framebuffer->getReadColorbuffer();
-
- if (isSubImage)
- {
- if (!IsValidES3CopyTexImageCombination(*textureFormat.info, *source->getFormat().info,
- readFramebufferID))
- {
- context->handleError(InvalidOperation());
- return false;
- }
- }
- else
- {
- // Use format/type from the source FBO. (Might not be perfect for all cases?)
- const InternalFormat &framebufferFormat = *source->getFormat().info;
- const InternalFormat &copyFormat = GetInternalFormatInfo(internalformat, GL_UNSIGNED_BYTE);
- if (!IsValidES3CopyTexImageCombination(copyFormat, framebufferFormat, readFramebufferID))
- {
- context->handleError(InvalidOperation());
- return false;
- }
- }
-
- // If width or height is zero, it is a no-op. Return false without setting an error.
- return (width > 0 && height > 0);
-}
-
-bool ValidateES3CopyTexImage2DParameters(ValidationContext *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- bool isSubImage,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLint border)
-{
- if (!ValidTexture2DDestinationTarget(context, target))
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- return ValidateES3CopyTexImageParametersBase(context, target, level, internalformat, isSubImage,
- xoffset, yoffset, zoffset, x, y, width, height,
- border);
-}
-
-bool ValidateES3CopyTexImage3DParameters(ValidationContext *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- bool isSubImage,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLint border)
-{
- if (!ValidTexture3DDestinationTarget(context, target))
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- return ValidateES3CopyTexImageParametersBase(context, target, level, internalformat, isSubImage,
- xoffset, yoffset, zoffset, x, y, width, height,
- border);
-}
-
-bool ValidateES3TexStorageParametersBase(Context *context,
- GLenum target,
- GLsizei levels,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth)
-{
- if (width < 1 || height < 1 || depth < 1 || levels < 1)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- GLsizei maxDim = std::max(width, height);
- if (target != GL_TEXTURE_2D_ARRAY)
- {
- maxDim = std::max(maxDim, depth);
- }
-
- if (levels > gl::log2(maxDim) + 1)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- const gl::Caps &caps = context->getCaps();
-
- switch (target)
- {
- case GL_TEXTURE_2D:
- {
- if (static_cast<GLuint>(width) > caps.max2DTextureSize ||
- static_cast<GLuint>(height) > caps.max2DTextureSize)
- {
- context->handleError(InvalidValue());
- return false;
- }
- }
- break;
-
- case GL_TEXTURE_RECTANGLE_ANGLE:
- {
- if (static_cast<GLuint>(width) > caps.maxRectangleTextureSize ||
- static_cast<GLuint>(height) > caps.maxRectangleTextureSize || levels != 1)
- {
- context->handleError(InvalidValue());
- return false;
- }
- }
- break;
-
- case GL_TEXTURE_CUBE_MAP:
- {
- if (width != height)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- if (static_cast<GLuint>(width) > caps.maxCubeMapTextureSize)
- {
- context->handleError(InvalidValue());
- return false;
- }
- }
- break;
-
- case GL_TEXTURE_3D:
- {
- if (static_cast<GLuint>(width) > caps.max3DTextureSize ||
- static_cast<GLuint>(height) > caps.max3DTextureSize ||
- static_cast<GLuint>(depth) > caps.max3DTextureSize)
- {
- context->handleError(InvalidValue());
- return false;
- }
- }
- break;
-
- case GL_TEXTURE_2D_ARRAY:
- {
- if (static_cast<GLuint>(width) > caps.max2DTextureSize ||
- static_cast<GLuint>(height) > caps.max2DTextureSize ||
- static_cast<GLuint>(depth) > caps.maxArrayTextureLayers)
- {
- context->handleError(InvalidValue());
- return false;
- }
- }
- break;
-
- default:
- UNREACHABLE();
- return false;
- }
-
- gl::Texture *texture = context->getTargetTexture(target);
- if (!texture || texture->id() == 0)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- if (texture->getImmutableFormat())
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(internalformat);
- if (!formatInfo.textureSupport(context->getClientVersion(), context->getExtensions()))
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- if (!formatInfo.sized)
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- if (formatInfo.compressed && target == GL_TEXTURE_RECTANGLE_ANGLE)
- {
- context->handleError(InvalidEnum() << "Rectangle texture cannot have a compressed format.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateES3TexStorage2DParameters(Context *context,
- GLenum target,
- GLsizei levels,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth)
-{
- if (!ValidTexture2DTarget(context, target))
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- return ValidateES3TexStorageParametersBase(context, target, levels, internalformat, width,
- height, depth);
-}
-
-bool ValidateES3TexStorage3DParameters(Context *context,
- GLenum target,
- GLsizei levels,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth)
-{
- if (!ValidTexture3DTarget(context, target))
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- return ValidateES3TexStorageParametersBase(context, target, levels, internalformat, width,
- height, depth);
-}
-
-bool ValidateBeginQuery(gl::Context *context, GLenum target, GLuint id)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateBeginQueryBase(context, target, id);
-}
-
-bool ValidateEndQuery(gl::Context *context, GLenum target)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateEndQueryBase(context, target);
-}
-
-bool ValidateGetQueryiv(Context *context, GLenum target, GLenum pname, GLint *params)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateGetQueryivBase(context, target, pname, nullptr);
-}
-
-bool ValidateGetQueryObjectuiv(Context *context, GLuint id, GLenum pname, GLuint *params)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateGetQueryObjectValueBase(context, id, pname, nullptr);
-}
-
-bool ValidateFramebufferTextureLayer(Context *context,
- GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLint layer)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (!ValidateFramebufferTextureBase(context, target, attachment, texture, level))
- {
- return false;
- }
-
- const gl::Caps &caps = context->getCaps();
- if (texture != 0)
- {
- if (layer < 0)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- gl::Texture *tex = context->getTexture(texture);
- ASSERT(tex);
-
- switch (tex->getTarget())
- {
- case GL_TEXTURE_2D_ARRAY:
- {
- if (level > gl::log2(caps.max2DTextureSize))
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- if (static_cast<GLuint>(layer) >= caps.maxArrayTextureLayers)
- {
- context->handleError(InvalidValue());
- return false;
- }
- }
- break;
-
- case GL_TEXTURE_3D:
- {
- if (level > gl::log2(caps.max3DTextureSize))
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- if (static_cast<GLuint>(layer) >= caps.max3DTextureSize)
- {
- context->handleError(InvalidValue());
- return false;
- }
- }
- break;
-
- default:
- context->handleError(InvalidOperation());
- return false;
- }
-
- const auto &format = tex->getFormat(tex->getTarget(), level);
- if (format.info->compressed)
- {
- context->handleError(InvalidOperation());
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateInvalidateFramebuffer(Context *context,
- GLenum target,
- GLsizei numAttachments,
- const GLenum *attachments)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- bool defaultFramebuffer = false;
-
- switch (target)
- {
- case GL_DRAW_FRAMEBUFFER:
- case GL_FRAMEBUFFER:
- defaultFramebuffer = context->getGLState().getDrawFramebuffer()->id() == 0;
- break;
- case GL_READ_FRAMEBUFFER:
- defaultFramebuffer = context->getGLState().getReadFramebuffer()->id() == 0;
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFramebufferTarget);
- return false;
- }
-
- return ValidateDiscardFramebufferBase(context, target, numAttachments, attachments,
- defaultFramebuffer);
-}
-
-bool ValidateInvalidateSubFramebuffer(Context *context,
- GLenum target,
- GLsizei numAttachments,
- const GLenum *attachments,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height)
-{
- return ValidateInvalidateFramebuffer(context, target, numAttachments, attachments);
-}
-
-bool ValidateClearBuffer(ValidationContext *context)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (context->getGLState().getDrawFramebuffer()->checkStatus(context) != GL_FRAMEBUFFER_COMPLETE)
- {
- context->handleError(InvalidFramebufferOperation());
- return false;
- }
-
- return true;
-}
-
-bool ValidateDrawRangeElements(Context *context,
- GLenum mode,
- GLuint start,
- GLuint end,
- GLsizei count,
- GLenum type,
- const void *indices)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (end < start)
- {
- context->handleError(InvalidValue() << "end < start");
- return false;
- }
-
- if (!ValidateDrawElementsCommon(context, mode, count, type, indices, 0))
- {
- return false;
- }
-
- // Use the parameter buffer to retrieve and cache the index range.
- const auto &params = context->getParams<HasIndexRange>();
- const auto &indexRangeOpt = params.getIndexRange();
- if (!indexRangeOpt.valid())
- {
- // Unexpected error.
- return false;
- }
-
- if (indexRangeOpt.value().end > end || indexRangeOpt.value().start < start)
- {
- // GL spec says that behavior in this case is undefined - generating an error is fine.
- context->handleError(InvalidOperation() << "Indices are out of the start, end range.");
- return false;
- }
- return true;
-}
-
-bool ValidateGetUniformuiv(Context *context, GLuint program, GLint location, GLuint *params)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateGetUniformBase(context, program, location);
-}
-
-bool ValidateReadBuffer(Context *context, GLenum src)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- const Framebuffer *readFBO = context->getGLState().getReadFramebuffer();
-
- if (readFBO == nullptr)
- {
- context->handleError(InvalidOperation() << "No active read framebuffer.");
- return false;
- }
-
- if (src == GL_NONE)
- {
- return true;
- }
-
- if (src != GL_BACK && (src < GL_COLOR_ATTACHMENT0 || src > GL_COLOR_ATTACHMENT31))
- {
- context->handleError(InvalidEnum() << "Unknown enum for 'src' in ReadBuffer");
- return false;
- }
-
- if (readFBO->id() == 0)
- {
- if (src != GL_BACK)
- {
- context->handleError(
- InvalidOperation()
- << "'src' must be GL_NONE or GL_BACK when reading from the default framebuffer.");
- return false;
- }
- }
- else
- {
- GLuint drawBuffer = static_cast<GLuint>(src - GL_COLOR_ATTACHMENT0);
-
- if (drawBuffer >= context->getCaps().maxDrawBuffers)
- {
- context->handleError(InvalidOperation() << "'src' is greater than MAX_DRAW_BUFFERS.");
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateCompressedTexImage3D(Context *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLint border,
- GLsizei imageSize,
- const void *data)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (!ValidTextureTarget(context, target))
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- // Validate image size
- if (!ValidImageSizeParameters(context, target, level, width, height, depth, false))
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- const InternalFormat &formatInfo = GetSizedInternalFormatInfo(internalformat);
- if (!formatInfo.compressed)
- {
- context->handleError(InvalidEnum() << "Not a valid compressed texture format");
- return false;
- }
-
- auto blockSizeOrErr = formatInfo.computeCompressedImageSize(gl::Extents(width, height, depth));
- if (blockSizeOrErr.isError())
- {
- context->handleError(InvalidValue());
- return false;
- }
- if (imageSize < 0 || static_cast<GLuint>(imageSize) != blockSizeOrErr.getResult())
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- // 3D texture target validation
- if (target != GL_TEXTURE_3D && target != GL_TEXTURE_2D_ARRAY)
- {
- context->handleError(InvalidEnum() << "Must specify a valid 3D texture destination target");
- return false;
- }
-
- // validateES3TexImageFormat sets the error code if there is an error
- if (!ValidateES3TexImage3DParameters(context, target, level, internalformat, true, false, 0, 0,
- 0, width, height, depth, border, GL_NONE, GL_NONE, -1,
- data))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateCompressedTexImage3DRobustANGLE(Context *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLint border,
- GLsizei imageSize,
- GLsizei dataSize,
- const void *data)
-{
- if (!ValidateRobustCompressedTexImageBase(context, imageSize, dataSize))
- {
- return false;
- }
-
- return ValidateCompressedTexImage3D(context, target, level, internalformat, width, height,
- depth, border, imageSize, data);
-}
-
-bool ValidateBindVertexArray(Context *context, GLuint array)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateBindVertexArrayBase(context, array);
-}
-
-bool ValidateIsVertexArray(Context *context, GLuint array)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return true;
-}
-
-static bool ValidateBindBufferCommon(Context *context,
- BufferBinding target,
- GLuint index,
- GLuint buffer,
- GLintptr offset,
- GLsizeiptr size)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (buffer != 0 && offset < 0)
- {
- context->handleError(InvalidValue() << "buffer is non-zero and offset is negative.");
- return false;
- }
-
- if (!context->getGLState().isBindGeneratesResourceEnabled() &&
- !context->isBufferGenerated(buffer))
- {
- context->handleError(InvalidOperation() << "Buffer was not generated.");
- return false;
- }
-
- const Caps &caps = context->getCaps();
- switch (target)
- {
- case BufferBinding::TransformFeedback:
- {
- if (index >= caps.maxTransformFeedbackSeparateAttributes)
- {
- context->handleError(InvalidValue() << "index is greater than or equal to the "
- "number of TRANSFORM_FEEDBACK_BUFFER "
- "indexed binding points.");
- return false;
- }
- if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
- {
- context->handleError(InvalidValue() << "offset and size must be multiple of 4.");
- return false;
- }
-
- TransformFeedback *curTransformFeedback =
- context->getGLState().getCurrentTransformFeedback();
- if (curTransformFeedback && curTransformFeedback->isActive())
- {
- context->handleError(InvalidOperation()
- << "target is TRANSFORM_FEEDBACK_BUFFER and transform "
- "feedback is currently active.");
- return false;
- }
- break;
- }
- case BufferBinding::Uniform:
- {
- if (index >= caps.maxUniformBufferBindings)
- {
- context->handleError(InvalidValue() << "index is greater than or equal to the "
- "number of UNIFORM_BUFFER indexed "
- "binding points.");
- return false;
- }
-
- if (buffer != 0 && (offset % caps.uniformBufferOffsetAlignment) != 0)
- {
- context->handleError(
- InvalidValue()
- << "offset must be multiple of value of UNIFORM_BUFFER_OFFSET_ALIGNMENT.");
- return false;
- }
- break;
- }
- case BufferBinding::AtomicCounter:
- {
- if (context->getClientVersion() < ES_3_1)
- {
- context->handleError(InvalidEnum()
- << "ATOMIC_COUNTER_BUFFER is not supported before GLES 3.1");
- return false;
- }
- if (index >= caps.maxAtomicCounterBufferBindings)
- {
- context->handleError(InvalidValue() << "index is greater than or equal to the "
- "number of ATOMIC_COUNTER_BUFFER "
- "indexed binding points.");
- return false;
- }
- if (buffer != 0 && (offset % 4) != 0)
- {
- context->handleError(InvalidValue() << "offset must be a multiple of 4.");
- return false;
- }
- break;
- }
- case BufferBinding::ShaderStorage:
- {
- if (context->getClientVersion() < ES_3_1)
- {
- context->handleError(InvalidEnum()
- << "SHADER_STORAGE_BUFFER is not supported in GLES3.");
- return false;
- }
- if (index >= caps.maxShaderStorageBufferBindings)
- {
- context->handleError(InvalidValue() << "index is greater than or equal to the "
- "number of SHADER_STORAGE_BUFFER "
- "indexed binding points.");
- return false;
- }
- if (buffer != 0 && (offset % caps.shaderStorageBufferOffsetAlignment) != 0)
- {
- context->handleError(InvalidValue() << "offset must be multiple of value of "
- "SHADER_STORAGE_BUFFER_OFFSET_"
- "ALIGNMENT.");
- return false;
- }
- break;
- }
- default:
- context->handleError(InvalidEnum() << "the target is not supported.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateBindBufferBase(Context *context, BufferBinding target, GLuint index, GLuint buffer)
-{
- return ValidateBindBufferCommon(context, target, index, buffer, 0, 0);
-}
-
-bool ValidateBindBufferRange(Context *context,
- BufferBinding target,
- GLuint index,
- GLuint buffer,
- GLintptr offset,
- GLsizeiptr size)
-{
- if (buffer != 0 && size <= 0)
- {
- context->handleError(InvalidValue()
- << "buffer is non-zero and size is less than or equal to zero.");
- return false;
- }
- return ValidateBindBufferCommon(context, target, index, buffer, offset, size);
-}
-
-bool ValidateProgramBinary(Context *context,
- GLuint program,
- GLenum binaryFormat,
- const void *binary,
- GLint length)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateProgramBinaryBase(context, program, binaryFormat, binary, length);
-}
-
-bool ValidateGetProgramBinary(Context *context,
- GLuint program,
- GLsizei bufSize,
- GLsizei *length,
- GLenum *binaryFormat,
- void *binary)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateGetProgramBinaryBase(context, program, bufSize, length, binaryFormat, binary);
-}
-
-bool ValidateProgramParameteri(Context *context, GLuint program, GLenum pname, GLint value)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (GetValidProgram(context, program) == nullptr)
- {
- return false;
- }
-
- switch (pname)
- {
- case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
- if (value != GL_FALSE && value != GL_TRUE)
- {
- context->handleError(InvalidValue()
- << "Invalid value, expected GL_FALSE or GL_TRUE: " << value);
- return false;
- }
- break;
-
- case GL_PROGRAM_SEPARABLE:
- if (context->getClientVersion() < ES_3_1)
- {
- context->handleError(InvalidEnum()
- << "PROGRAM_SEPARABLE is not supported before GLES 3.1");
- return false;
- }
-
- if (value != GL_FALSE && value != GL_TRUE)
- {
- context->handleError(InvalidValue()
- << "Invalid value, expected GL_FALSE or GL_TRUE: " << value);
- return false;
- }
- break;
-
- default:
- context->handleError(InvalidEnum()
- << "Invalid pname: 0x" << std::hex << std::uppercase << pname);
- return false;
- }
-
- return true;
-}
-
-bool ValidateBlitFramebuffer(Context *context,
- GLint srcX0,
- GLint srcY0,
- GLint srcX1,
- GLint srcY1,
- GLint dstX0,
- GLint dstY0,
- GLint dstX1,
- GLint dstY1,
- GLbitfield mask,
- GLenum filter)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0,
- dstX1, dstY1, mask, filter);
-}
-
-bool ValidateClearBufferiv(ValidationContext *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLint *value)
-{
- switch (buffer)
- {
- case GL_COLOR:
- if (drawbuffer < 0 ||
- static_cast<GLuint>(drawbuffer) >= context->getCaps().maxDrawBuffers)
- {
- context->handleError(InvalidValue());
- return false;
- }
- if (context->getExtensions().webglCompatibility)
- {
- constexpr GLenum validComponentTypes[] = {GL_INT};
- if (!ValidateWebGLFramebufferAttachmentClearType(
- context, drawbuffer, validComponentTypes, ArraySize(validComponentTypes)))
- {
- return false;
- }
- }
- break;
-
- case GL_STENCIL:
- if (drawbuffer != 0)
- {
- context->handleError(InvalidValue());
- return false;
- }
- break;
-
- default:
- context->handleError(InvalidEnum());
- return false;
- }
-
- return ValidateClearBuffer(context);
-}
-
-bool ValidateClearBufferuiv(ValidationContext *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLuint *value)
-{
- switch (buffer)
- {
- case GL_COLOR:
- if (drawbuffer < 0 ||
- static_cast<GLuint>(drawbuffer) >= context->getCaps().maxDrawBuffers)
- {
- context->handleError(InvalidValue());
- return false;
- }
- if (context->getExtensions().webglCompatibility)
- {
- constexpr GLenum validComponentTypes[] = {GL_UNSIGNED_INT};
- if (!ValidateWebGLFramebufferAttachmentClearType(
- context, drawbuffer, validComponentTypes, ArraySize(validComponentTypes)))
- {
- return false;
- }
- }
- break;
-
- default:
- context->handleError(InvalidEnum());
- return false;
- }
-
- return ValidateClearBuffer(context);
-}
-
-bool ValidateClearBufferfv(ValidationContext *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLfloat *value)
-{
- switch (buffer)
- {
- case GL_COLOR:
- if (drawbuffer < 0 ||
- static_cast<GLuint>(drawbuffer) >= context->getCaps().maxDrawBuffers)
- {
- context->handleError(InvalidValue());
- return false;
- }
- if (context->getExtensions().webglCompatibility)
- {
- constexpr GLenum validComponentTypes[] = {GL_FLOAT, GL_UNSIGNED_NORMALIZED,
- GL_SIGNED_NORMALIZED};
- if (!ValidateWebGLFramebufferAttachmentClearType(
- context, drawbuffer, validComponentTypes, ArraySize(validComponentTypes)))
- {
- return false;
- }
- }
- break;
-
- case GL_DEPTH:
- if (drawbuffer != 0)
- {
- context->handleError(InvalidValue());
- return false;
- }
- break;
-
- default:
- context->handleError(InvalidEnum());
- return false;
- }
-
- return ValidateClearBuffer(context);
-}
-
-bool ValidateClearBufferfi(ValidationContext *context,
- GLenum buffer,
- GLint drawbuffer,
- GLfloat depth,
- GLint stencil)
-{
- switch (buffer)
- {
- case GL_DEPTH_STENCIL:
- if (drawbuffer != 0)
- {
- context->handleError(InvalidValue());
- return false;
- }
- break;
-
- default:
- context->handleError(InvalidEnum());
- return false;
- }
-
- return ValidateClearBuffer(context);
-}
-
-bool ValidateDrawBuffers(ValidationContext *context, GLsizei n, const GLenum *bufs)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateDrawBuffersBase(context, n, bufs);
-}
-
-bool ValidateCopyTexSubImage3D(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateES3CopyTexImage3DParameters(context, target, level, GL_NONE, true, xoffset,
- yoffset, zoffset, x, y, width, height, 0);
-}
-
-bool ValidateTexImage3D(Context *context,
- GLenum target,
- GLint level,
- GLint internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLint border,
- GLenum format,
- GLenum type,
- const void *pixels)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateES3TexImage3DParameters(context, target, level, internalformat, false, false, 0,
- 0, 0, width, height, depth, border, format, type, -1,
- pixels);
-}
-
-bool ValidateTexImage3DRobustANGLE(Context *context,
- GLenum target,
- GLint level,
- GLint internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLint border,
- GLenum format,
- GLenum type,
- GLsizei bufSize,
- const void *pixels)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- return ValidateES3TexImage3DParameters(context, target, level, internalformat, false, false, 0,
- 0, 0, width, height, depth, border, format, type,
- bufSize, pixels);
-}
-
-bool ValidateTexSubImage3D(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLenum format,
- GLenum type,
- const void *pixels)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateES3TexImage3DParameters(context, target, level, GL_NONE, false, true, xoffset,
- yoffset, zoffset, width, height, depth, 0, format, type,
- -1, pixels);
-}
-
-bool ValidateTexSubImage3DRobustANGLE(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLenum format,
- GLenum type,
- GLsizei bufSize,
- const void *pixels)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- return ValidateES3TexImage3DParameters(context, target, level, GL_NONE, false, true, xoffset,
- yoffset, zoffset, width, height, depth, 0, format, type,
- bufSize, pixels);
-}
-
-bool ValidateCompressedTexSubImage3D(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLenum format,
- GLsizei imageSize,
- const void *data)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- const InternalFormat &formatInfo = GetSizedInternalFormatInfo(format);
- if (!formatInfo.compressed)
- {
- context->handleError(InvalidEnum() << "Not a valid compressed texture format");
- return false;
- }
-
- auto blockSizeOrErr = formatInfo.computeCompressedImageSize(gl::Extents(width, height, depth));
- if (blockSizeOrErr.isError())
- {
- context->handleError(blockSizeOrErr.getError());
- return false;
- }
- if (imageSize < 0 || static_cast<GLuint>(imageSize) != blockSizeOrErr.getResult())
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- if (!data)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- return ValidateES3TexImage3DParameters(context, target, level, GL_NONE, true, true, xoffset,
- yoffset, zoffset, width, height, depth, 0, format,
- GL_NONE, -1, data);
-}
-bool ValidateCompressedTexSubImage3DRobustANGLE(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLenum format,
- GLsizei imageSize,
- GLsizei dataSize,
- const void *data)
-{
- if (!ValidateRobustCompressedTexImageBase(context, imageSize, dataSize))
- {
- return false;
- }
-
- return ValidateCompressedTexSubImage3D(context, target, level, xoffset, yoffset, zoffset, width,
- height, depth, format, imageSize, data);
-}
-
-bool ValidateGenQueries(Context *context, GLint n, GLuint *)
-{
- return ValidateGenOrDeleteES3(context, n);
-}
-
-bool ValidateDeleteQueries(Context *context, GLint n, const GLuint *)
-{
- return ValidateGenOrDeleteES3(context, n);
-}
-
-bool ValidateGenSamplers(Context *context, GLint count, GLuint *)
-{
- return ValidateGenOrDeleteCountES3(context, count);
-}
-
-bool ValidateDeleteSamplers(Context *context, GLint count, const GLuint *)
-{
- return ValidateGenOrDeleteCountES3(context, count);
-}
-
-bool ValidateGenTransformFeedbacks(Context *context, GLint n, GLuint *)
-{
- return ValidateGenOrDeleteES3(context, n);
-}
-
-bool ValidateDeleteTransformFeedbacks(Context *context, GLint n, const GLuint *ids)
-{
- if (!ValidateGenOrDeleteES3(context, n))
- {
- return false;
- }
- for (GLint i = 0; i < n; ++i)
- {
- auto *transformFeedback = context->getTransformFeedback(ids[i]);
- if (transformFeedback != nullptr && transformFeedback->isActive())
- {
- // ES 3.0.4 section 2.15.1 page 86
- context->handleError(InvalidOperation()
- << "Attempt to delete active transform feedback.");
- return false;
- }
- }
- return true;
-}
-
-bool ValidateGenVertexArrays(Context *context, GLint n, GLuint *)
-{
- return ValidateGenOrDeleteES3(context, n);
-}
-
-bool ValidateDeleteVertexArrays(Context *context, GLint n, const GLuint *)
-{
- return ValidateGenOrDeleteES3(context, n);
-}
-
-bool ValidateBeginTransformFeedback(Context *context, GLenum primitiveMode)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
- switch (primitiveMode)
- {
- case GL_TRIANGLES:
- case GL_LINES:
- case GL_POINTS:
- break;
-
- default:
- context->handleError(InvalidEnum() << "Invalid primitive mode.");
- return false;
- }
-
- TransformFeedback *transformFeedback = context->getGLState().getCurrentTransformFeedback();
- ASSERT(transformFeedback != nullptr);
-
- if (transformFeedback->isActive())
- {
- context->handleError(InvalidOperation() << "Transform feedback is already active.");
- return false;
- }
-
- for (size_t i = 0; i < transformFeedback->getIndexedBufferCount(); i++)
- {
- const auto &buffer = transformFeedback->getIndexedBuffer(i);
- if (buffer.get() && buffer->isMapped())
- {
- context->handleError(InvalidOperation() << "Transform feedback has a mapped buffer.");
- return false;
- }
- }
-
- Program *program = context->getGLState().getProgram();
-
- if (!program)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ProgramNotBound);
- return false;
- }
-
- if (program->getTransformFeedbackVaryingCount() == 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), NoTransformFeedbackOutputVariables);
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetBufferPointerv(Context *context, BufferBinding target, GLenum pname, void **params)
-{
- return ValidateGetBufferPointervBase(context, target, pname, nullptr, params);
-}
-
-bool ValidateGetBufferPointervRobustANGLE(Context *context,
- BufferBinding target,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- void **params)
-{
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateGetBufferPointervBase(context, target, pname, length, params))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateUnmapBuffer(Context *context, BufferBinding target)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateUnmapBufferBase(context, target);
-}
-
-bool ValidateMapBufferRange(Context *context,
- BufferBinding target,
- GLintptr offset,
- GLsizeiptr length,
- GLbitfield access)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateMapBufferRangeBase(context, target, offset, length, access);
-}
-
-bool ValidateFlushMappedBufferRange(Context *context,
- BufferBinding target,
- GLintptr offset,
- GLsizeiptr length)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateFlushMappedBufferRangeBase(context, target, offset, length);
-}
-
-bool ValidateIndexedStateQuery(ValidationContext *context,
- GLenum pname,
- GLuint index,
- GLsizei *length)
-{
- if (length)
- {
- *length = 0;
- }
-
- GLenum nativeType;
- unsigned int numParams;
- if (!context->getIndexedQueryParameterInfo(pname, &nativeType, &numParams))
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- const Caps &caps = context->getCaps();
- switch (pname)
- {
- case GL_TRANSFORM_FEEDBACK_BUFFER_START:
- case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
- case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
- if (index >= caps.maxTransformFeedbackSeparateAttributes)
- {
- context->handleError(InvalidValue());
- return false;
- }
- break;
-
- case GL_UNIFORM_BUFFER_START:
- case GL_UNIFORM_BUFFER_SIZE:
- case GL_UNIFORM_BUFFER_BINDING:
- if (index >= caps.maxUniformBufferBindings)
- {
- context->handleError(InvalidValue());
- return false;
- }
- break;
-
- case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
- case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
- if (index >= 3u)
- {
- context->handleError(InvalidValue());
- return false;
- }
- break;
-
- case GL_ATOMIC_COUNTER_BUFFER_START:
- case GL_ATOMIC_COUNTER_BUFFER_SIZE:
- case GL_ATOMIC_COUNTER_BUFFER_BINDING:
- if (context->getClientVersion() < ES_3_1)
- {
- context->handleError(
- InvalidEnum()
- << "Atomic Counter buffers are not supported in this version of GL");
- return false;
- }
- if (index >= caps.maxAtomicCounterBufferBindings)
- {
- context->handleError(
- InvalidValue()
- << "index is outside the valid range for GL_ATOMIC_COUNTER_BUFFER_BINDING");
- return false;
- }
- break;
-
- case GL_SHADER_STORAGE_BUFFER_START:
- case GL_SHADER_STORAGE_BUFFER_SIZE:
- case GL_SHADER_STORAGE_BUFFER_BINDING:
- if (context->getClientVersion() < ES_3_1)
- {
- context->handleError(
- InvalidEnum()
- << "Shader storage buffers are not supported in this version of GL");
- return false;
- }
- if (index >= caps.maxShaderStorageBufferBindings)
- {
- context->handleError(
- InvalidValue()
- << "index is outside the valid range for GL_SHADER_STORAGE_BUFFER_BINDING");
- return false;
- }
- break;
-
- case GL_VERTEX_BINDING_BUFFER:
- case GL_VERTEX_BINDING_DIVISOR:
- case GL_VERTEX_BINDING_OFFSET:
- case GL_VERTEX_BINDING_STRIDE:
- if (context->getClientVersion() < ES_3_1)
- {
- context->handleError(
- InvalidEnum()
- << "Vertex Attrib Bindings are not supported in this version of GL");
- return false;
- }
- if (index >= caps.maxVertexAttribBindings)
- {
- context->handleError(
- InvalidValue()
- << "bindingindex must be smaller than MAX_VERTEX_ATTRIB_BINDINGS.");
- return false;
- }
- break;
- case GL_SAMPLE_MASK_VALUE:
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumRequiresGLES31);
- return false;
- }
- if (index >= caps.maxSampleMaskWords)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidSampleMaskNumber);
- return false;
- }
- break;
- default:
- context->handleError(InvalidEnum());
- return false;
- }
-
- if (length)
- {
- *length = 1;
- }
-
- return true;
-}
-
-bool ValidateGetIntegeri_v(ValidationContext *context, GLenum target, GLuint index, GLint *data)
-{
- if (context->getClientVersion() < ES_3_0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
- return ValidateIndexedStateQuery(context, target, index, nullptr);
-}
-
-bool ValidateGetIntegeri_vRobustANGLE(ValidationContext *context,
- GLenum target,
- GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLint *data)
-{
- if (context->getClientVersion() < ES_3_0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateIndexedStateQuery(context, target, index, length))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetInteger64i_v(ValidationContext *context, GLenum target, GLuint index, GLint64 *data)
-{
- if (context->getClientVersion() < ES_3_0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
- return ValidateIndexedStateQuery(context, target, index, nullptr);
-}
-
-bool ValidateGetInteger64i_vRobustANGLE(ValidationContext *context,
- GLenum target,
- GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLint64 *data)
-{
- if (context->getClientVersion() < ES_3_0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateIndexedStateQuery(context, target, index, length))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateCopyBufferSubData(ValidationContext *context,
- BufferBinding readTarget,
- BufferBinding writeTarget,
- GLintptr readOffset,
- GLintptr writeOffset,
- GLsizeiptr size)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (!ValidBufferType(context, readTarget) || !ValidBufferType(context, writeTarget))
- {
- context->handleError(InvalidEnum() << "Invalid buffer target");
- return false;
- }
-
- Buffer *readBuffer = context->getGLState().getTargetBuffer(readTarget);
- Buffer *writeBuffer = context->getGLState().getTargetBuffer(writeTarget);
-
- if (!readBuffer || !writeBuffer)
- {
- context->handleError(InvalidOperation() << "No buffer bound to target");
- return false;
- }
-
- // Verify that readBuffer and writeBuffer are not currently mapped
- if (readBuffer->isMapped() || writeBuffer->isMapped())
- {
- context->handleError(InvalidOperation()
- << "Cannot call CopyBufferSubData on a mapped buffer");
- return false;
- }
-
- CheckedNumeric<GLintptr> checkedReadOffset(readOffset);
- CheckedNumeric<GLintptr> checkedWriteOffset(writeOffset);
- CheckedNumeric<GLintptr> checkedSize(size);
-
- auto checkedReadSum = checkedReadOffset + checkedSize;
- auto checkedWriteSum = checkedWriteOffset + checkedSize;
-
- if (!checkedReadSum.IsValid() || !checkedWriteSum.IsValid() ||
- !IsValueInRangeForNumericType<GLintptr>(readBuffer->getSize()) ||
- !IsValueInRangeForNumericType<GLintptr>(writeBuffer->getSize()))
- {
- context->handleError(InvalidValue() << "Integer overflow when validating copy offsets.");
- return false;
- }
-
- if (readOffset < 0 || writeOffset < 0 || size < 0)
- {
- context->handleError(InvalidValue()
- << "readOffset, writeOffset and size must all be non-negative");
- return false;
- }
-
- if (checkedReadSum.ValueOrDie() > readBuffer->getSize() ||
- checkedWriteSum.ValueOrDie() > writeBuffer->getSize())
- {
- context->handleError(InvalidValue() << "Buffer offset overflow in CopyBufferSubData");
- return false;
- }
-
- if (readBuffer == writeBuffer)
- {
- auto checkedOffsetDiff = (checkedReadOffset - checkedWriteOffset).Abs();
- if (!checkedOffsetDiff.IsValid())
- {
- // This shold not be possible.
- UNREACHABLE();
- context->handleError(InvalidValue()
- << "Integer overflow when validating same buffer copy.");
- return false;
- }
-
- if (checkedOffsetDiff.ValueOrDie() < size)
- {
- context->handleError(InvalidValue());
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateGetStringi(Context *context, GLenum name, GLuint index)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- switch (name)
- {
- case GL_EXTENSIONS:
- if (index >= context->getExtensionStringCount())
- {
- context->handleError(InvalidValue()
- << "index must be less than the number of extension strings.");
- return false;
- }
- break;
-
- case GL_REQUESTABLE_EXTENSIONS_ANGLE:
- if (!context->getExtensions().requestExtension)
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidName);
- return false;
- }
- if (index >= context->getRequestableExtensionStringCount())
- {
- context->handleError(
- InvalidValue()
- << "index must be less than the number of requestable extension strings.");
- return false;
- }
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidName);
- return false;
- }
-
- return true;
-}
-
-bool ValidateRenderbufferStorageMultisample(ValidationContext *context,
- GLenum target,
- GLsizei samples,
- GLenum internalformat,
- GLsizei width,
- GLsizei height)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (!ValidateRenderbufferStorageParametersBase(context, target, samples, internalformat, width,
- height))
- {
- return false;
- }
-
- // The ES3 spec(section 4.4.2) states that the internal format must be sized and not an integer
- // format if samples is greater than zero.
- const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(internalformat);
- if ((formatInfo.componentType == GL_UNSIGNED_INT || formatInfo.componentType == GL_INT) &&
- samples > 0)
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- // The behavior is different than the ANGLE version, which would generate a GL_OUT_OF_MEMORY.
- const TextureCaps &formatCaps = context->getTextureCaps().get(internalformat);
- if (static_cast<GLuint>(samples) > formatCaps.getMaxSamples())
- {
- context->handleError(
- InvalidOperation()
- << "Samples must not be greater than maximum supported value for the format.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateVertexAttribIPointer(ValidationContext *context,
- GLuint index,
- GLint size,
- GLenum type,
- GLsizei stride,
- const void *pointer)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (!ValidateVertexFormatBase(context, index, size, type, true))
- {
- return false;
- }
-
- if (stride < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeStride);
- return false;
- }
-
- const Caps &caps = context->getCaps();
- if (context->getClientVersion() >= ES_3_1)
- {
- if (stride > caps.maxVertexAttribStride)
- {
- context->handleError(InvalidValue()
- << "stride cannot be greater than MAX_VERTEX_ATTRIB_STRIDE.");
- return false;
- }
-
- // [OpenGL ES 3.1] Section 10.3.1 page 245:
- // glVertexAttribBinding is part of the equivalent code of VertexAttribIPointer, so its
- // validation should be inherited.
- if (index >= caps.maxVertexAttribBindings)
- {
- context->handleError(InvalidValue()
- << "index must be smaller than MAX_VERTEX_ATTRIB_BINDINGS.");
- return false;
- }
- }
-
- // [OpenGL ES 3.0.2] Section 2.8 page 24:
- // An INVALID_OPERATION error is generated when a non-zero vertex array object
- // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
- // and the pointer argument is not NULL.
- if (context->getGLState().getVertexArrayId() != 0 &&
- context->getGLState().getTargetBuffer(BufferBinding::Array) == 0 && pointer != nullptr)
- {
- context
- ->handleError(InvalidOperation()
- << "Client data cannot be used with a non-default vertex array object.");
- return false;
- }
-
- if (context->getExtensions().webglCompatibility)
- {
- if (!ValidateWebGLVertexAttribPointer(context, type, false, stride, pointer, true))
- {
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateGetSynciv(Context *context,
- GLsync sync,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *values)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (bufSize < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeBufferSize);
- return false;
- }
-
- Sync *syncObject = context->getSync(sync);
- if (!syncObject)
- {
- context->handleError(InvalidValue() << "Invalid sync object.");
- return false;
- }
-
- switch (pname)
- {
- case GL_OBJECT_TYPE:
- case GL_SYNC_CONDITION:
- case GL_SYNC_FLAGS:
- case GL_SYNC_STATUS:
- break;
-
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidPname);
- return false;
- }
-
- return true;
-}
-
-bool ValidateDrawElementsInstanced(ValidationContext *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei instanceCount)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateDrawElementsInstancedCommon(context, mode, count, type, indices, instanceCount);
-}
-
-bool ValidateFramebufferTextureMultiviewLayeredANGLE(Context *context,
- GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLint baseViewIndex,
- GLsizei numViews)
-{
-
- if (!ValidateFramebufferTextureMultiviewBaseANGLE(context, target, attachment, texture, level,
- numViews))
- {
- return false;
- }
-
- if (texture != 0)
- {
- if (baseViewIndex < 0)
- {
- context->handleError(InvalidValue() << "baseViewIndex cannot be less than 0.");
- return false;
- }
-
- Texture *tex = context->getTexture(texture);
- ASSERT(tex);
-
- switch (tex->getTarget())
- {
- case GL_TEXTURE_2D_ARRAY:
- {
- const Caps &caps = context->getCaps();
- if (static_cast<GLuint>(baseViewIndex + numViews) > caps.maxArrayTextureLayers)
- {
- context->handleError(InvalidValue() << "baseViewIndex+numViews cannot be "
- "greater than "
- "GL_MAX_ARRAY_TEXTURE_LAYERS.");
- return false;
- }
- }
- break;
- default:
- context->handleError(InvalidOperation()
- << "Texture's target must be GL_TEXTURE_2D_ARRAY.");
- return false;
- }
-
- if (!ValidateFramebufferTextureMultiviewLevelAndFormat(context, tex, level))
- {
- return false;
- }
- }
-
- 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->handleError(InvalidValue()
- << "viewportOffsets cannot contain negative values.");
- return false;
- }
- }
-
- Texture *tex = context->getTexture(texture);
- ASSERT(tex);
-
- switch (tex->getTarget())
- {
- case GL_TEXTURE_2D:
- break;
- default:
- context->handleError(InvalidOperation()
- << "Texture's target must be GL_TEXTURE_2D.");
- 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);
-}
-
-bool ValidateUniform2ui(Context *context, GLint location, GLuint v0, GLuint v1)
-{
- return ValidateUniformES3(context, GL_UNSIGNED_INT_VEC2, location, 1);
-}
-
-bool ValidateUniform3ui(Context *context, GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
- return ValidateUniformES3(context, GL_UNSIGNED_INT_VEC3, location, 1);
-}
-
-bool ValidateUniform4ui(Context *context,
- GLint location,
- GLuint v0,
- GLuint v1,
- GLuint v2,
- GLuint v3)
-{
- return ValidateUniformES3(context, GL_UNSIGNED_INT_VEC4, location, 1);
-}
-
-bool ValidateUniform1uiv(Context *context, GLint location, GLsizei count, const GLuint *value)
-{
- return ValidateUniformES3(context, GL_UNSIGNED_INT, location, count);
-}
-
-bool ValidateUniform2uiv(Context *context, GLint location, GLsizei count, const GLuint *value)
-{
- return ValidateUniformES3(context, GL_UNSIGNED_INT_VEC2, location, count);
-}
-
-bool ValidateUniform3uiv(Context *context, GLint location, GLsizei count, const GLuint *value)
-{
- return ValidateUniformES3(context, GL_UNSIGNED_INT_VEC3, location, count);
-}
-
-bool ValidateUniform4uiv(Context *context, GLint location, GLsizei count, const GLuint *value)
-{
- return ValidateUniformES3(context, GL_UNSIGNED_INT_VEC4, location, count);
-}
-
-bool ValidateIsQuery(Context *context, GLuint id)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return true;
-}
-
-bool ValidateUniformMatrix2x3fv(Context *context,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- return ValidateUniformMatrixES3(context, GL_FLOAT_MAT2x3, location, count, transpose);
-}
-
-bool ValidateUniformMatrix3x2fv(Context *context,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- return ValidateUniformMatrixES3(context, GL_FLOAT_MAT3x2, location, count, transpose);
-}
-
-bool ValidateUniformMatrix2x4fv(Context *context,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- return ValidateUniformMatrixES3(context, GL_FLOAT_MAT2x4, location, count, transpose);
-}
-
-bool ValidateUniformMatrix4x2fv(Context *context,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- return ValidateUniformMatrixES3(context, GL_FLOAT_MAT4x2, location, count, transpose);
-}
-
-bool ValidateUniformMatrix3x4fv(Context *context,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- return ValidateUniformMatrixES3(context, GL_FLOAT_MAT3x4, location, count, transpose);
-}
-
-bool ValidateUniformMatrix4x3fv(Context *context,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- return ValidateUniformMatrixES3(context, GL_FLOAT_MAT4x3, location, count, transpose);
-}
-
-bool ValidateEndTransformFeedback(Context *context)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- TransformFeedback *transformFeedback = context->getGLState().getCurrentTransformFeedback();
- ASSERT(transformFeedback != nullptr);
-
- if (!transformFeedback->isActive())
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- return true;
-}
-
-bool ValidateTransformFeedbackVaryings(Context *context,
- GLuint program,
- GLsizei count,
- const GLchar *const *varyings,
- GLenum bufferMode)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (count < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeCount);
- return false;
- }
-
- switch (bufferMode)
- {
- case GL_INTERLEAVED_ATTRIBS:
- break;
- case GL_SEPARATE_ATTRIBS:
- {
- const Caps &caps = context->getCaps();
- if (static_cast<GLuint>(count) > caps.maxTransformFeedbackSeparateAttributes)
- {
- context->handleError(InvalidValue());
- return false;
- }
- break;
- }
- default:
- context->handleError(InvalidEnum());
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
- if (!programObject)
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetTransformFeedbackVarying(Context *context,
- GLuint program,
- GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLsizei *size,
- GLenum *type,
- GLchar *name)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (bufSize < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeBufferSize);
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
- if (!programObject)
- {
- return false;
- }
-
- if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- return true;
-}
-
-bool ValidateBindTransformFeedback(Context *context, GLenum target, GLuint id)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- switch (target)
- {
- case GL_TRANSFORM_FEEDBACK:
- {
- // Cannot bind a transform feedback object if the current one is started and not
- // paused (3.0.2 pg 85 section 2.14.1)
- TransformFeedback *curTransformFeedback =
- context->getGLState().getCurrentTransformFeedback();
- if (curTransformFeedback && curTransformFeedback->isActive() &&
- !curTransformFeedback->isPaused())
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section
- // 2.14.1)
- if (!context->isTransformFeedbackGenerated(id))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), TransformFeedbackDoesNotExist);
- return false;
- }
- }
- break;
-
- default:
- context->handleError(InvalidEnum());
- return false;
- }
-
- return true;
-}
-
-bool ValidateIsTransformFeedback(Context *context, GLuint id)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return true;
-}
-
-bool ValidatePauseTransformFeedback(Context *context)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- TransformFeedback *transformFeedback = context->getGLState().getCurrentTransformFeedback();
- ASSERT(transformFeedback != nullptr);
-
- // Current transform feedback must be active and not paused in order to pause (3.0.2 pg 86)
- if (!transformFeedback->isActive() || transformFeedback->isPaused())
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- return true;
-}
-
-bool ValidateResumeTransformFeedback(Context *context)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- TransformFeedback *transformFeedback = context->getGLState().getCurrentTransformFeedback();
- ASSERT(transformFeedback != nullptr);
-
- // Current transform feedback must be active and paused in order to resume (3.0.2 pg 86)
- if (!transformFeedback->isActive() || !transformFeedback->isPaused())
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- return true;
-}
-
-bool ValidateVertexAttribI4i(Context *context, GLuint index, GLint x, GLint y, GLint z, GLint w)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateVertexAttribIndex(context, index);
-}
-
-bool ValidateVertexAttribI4ui(Context *context,
- GLuint index,
- GLuint x,
- GLuint y,
- GLuint z,
- GLuint w)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateVertexAttribIndex(context, index);
-}
-
-bool ValidateVertexAttribI4iv(Context *context, GLuint index, const GLint *v)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateVertexAttribIndex(context, index);
-}
-
-bool ValidateVertexAttribI4uiv(Context *context, GLuint index, const GLuint *v)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateVertexAttribIndex(context, index);
-}
-
-bool ValidateGetFragDataLocation(Context *context, GLuint program, const GLchar *name)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
- if (!programObject)
- {
- return false;
- }
-
- if (!programObject->isLinked())
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ProgramNotLinked);
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetUniformIndices(Context *context,
- GLuint program,
- GLsizei uniformCount,
- const GLchar *const *uniformNames,
- GLuint *uniformIndices)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (uniformCount < 0)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
- if (!programObject)
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetActiveUniformsiv(Context *context,
- GLuint program,
- GLsizei uniformCount,
- const GLuint *uniformIndices,
- GLenum pname,
- GLint *params)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (uniformCount < 0)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
- if (!programObject)
- {
- return false;
- }
-
- switch (pname)
- {
- case GL_UNIFORM_TYPE:
- case GL_UNIFORM_SIZE:
- case GL_UNIFORM_NAME_LENGTH:
- case GL_UNIFORM_BLOCK_INDEX:
- case GL_UNIFORM_OFFSET:
- case GL_UNIFORM_ARRAY_STRIDE:
- case GL_UNIFORM_MATRIX_STRIDE:
- case GL_UNIFORM_IS_ROW_MAJOR:
- break;
-
- default:
- context->handleError(InvalidEnum());
- return false;
- }
-
- if (uniformCount > programObject->getActiveUniformCount())
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- for (int uniformId = 0; uniformId < uniformCount; uniformId++)
- {
- const GLuint index = uniformIndices[uniformId];
-
- if (index >= static_cast<GLuint>(programObject->getActiveUniformCount()))
- {
- context->handleError(InvalidValue());
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateGetUniformBlockIndex(Context *context, GLuint program, const GLchar *uniformBlockName)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
- if (!programObject)
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetActiveUniformBlockiv(Context *context,
- GLuint program,
- GLuint uniformBlockIndex,
- GLenum pname,
- GLint *params)
-{
- return ValidateGetActiveUniformBlockivBase(context, program, uniformBlockIndex, pname, nullptr);
-}
-
-bool ValidateGetActiveUniformBlockName(Context *context,
- GLuint program,
- GLuint uniformBlockIndex,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *uniformBlockName)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
- if (!programObject)
- {
- return false;
- }
-
- if (uniformBlockIndex >= programObject->getActiveUniformBlockCount())
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- return true;
-}
-
-bool ValidateUniformBlockBinding(Context *context,
- GLuint program,
- GLuint uniformBlockIndex,
- GLuint uniformBlockBinding)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (uniformBlockBinding >= context->getCaps().maxUniformBufferBindings)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
- if (!programObject)
- {
- return false;
- }
-
- // if never linked, there won't be any uniform blocks
- if (uniformBlockIndex >= programObject->getActiveUniformBlockCount())
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- return true;
-}
-
-bool ValidateDrawArraysInstanced(Context *context,
- GLenum mode,
- GLint first,
- GLsizei count,
- GLsizei primcount)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateDrawArraysInstancedBase(context, mode, first, count, primcount);
-}
-
-bool ValidateFenceSync(Context *context, GLenum condition, GLbitfield flags)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
- {
- context->handleError(InvalidEnum());
- return false;
- }
-
- if (flags != 0)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- return true;
-}
-
-bool ValidateIsSync(Context *context, GLsync sync)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return true;
-}
-
-bool ValidateDeleteSync(Context *context, GLsync sync)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (sync != static_cast<GLsync>(0) && !context->getSync(sync))
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- return true;
-}
-
-bool ValidateClientWaitSync(Context *context, GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- Sync *clientWaitSync = context->getSync(sync);
- if (!clientWaitSync)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- return true;
-}
-
-bool ValidateWaitSync(Context *context, GLsync sync, GLbitfield flags, GLuint64 timeout)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (flags != 0)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- if (timeout != GL_TIMEOUT_IGNORED)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- Sync *waitSync = context->getSync(sync);
- if (!waitSync)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetInteger64v(Context *context, GLenum pname, GLint64 *params)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- GLenum nativeType = GL_NONE;
- unsigned int numParams = 0;
- if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateIsSampler(Context *context, GLuint sampler)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return true;
-}
-
-bool ValidateBindSampler(Context *context, GLuint unit, GLuint sampler)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (sampler != 0 && !context->isSampler(sampler))
- {
- context->handleError(InvalidOperation());
- return false;
- }
-
- if (unit >= context->getCaps().maxCombinedTextureImageUnits)
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- return true;
-}
-
-bool ValidateVertexAttribDivisor(Context *context, GLuint index, GLuint divisor)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- return ValidateVertexAttribIndex(context, index);
-}
-
-bool ValidateTexStorage2D(Context *context,
- GLenum target,
- GLsizei levels,
- GLenum internalformat,
- GLsizei width,
- GLsizei height)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (!ValidateES3TexStorage2DParameters(context, target, levels, internalformat, width, height,
- 1))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateTexStorage3D(Context *context,
- GLenum target,
- GLsizei levels,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth)
-{
- if (context->getClientMajorVersion() < 3)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
- return false;
- }
-
- if (!ValidateES3TexStorage3DParameters(context, target, levels, internalformat, width, height,
- depth))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetBufferParameteri64v(ValidationContext *context,
- BufferBinding target,
- GLenum pname,
- GLint64 *params)
-{
- return ValidateGetBufferParameterBase(context, target, pname, false, nullptr);
-}
-
-bool ValidateGetSamplerParameterfv(Context *context, GLuint sampler, GLenum pname, GLfloat *params)
-{
- return ValidateGetSamplerParameterBase(context, sampler, pname, nullptr);
-}
-
-bool ValidateGetSamplerParameteriv(Context *context, GLuint sampler, GLenum pname, GLint *params)
-{
- return ValidateGetSamplerParameterBase(context, sampler, pname, nullptr);
-}
-
-bool ValidateSamplerParameterf(Context *context, GLuint sampler, GLenum pname, GLfloat param)
-{
- return ValidateSamplerParameterBase(context, sampler, pname, -1, &param);
-}
-
-bool ValidateSamplerParameterfv(Context *context,
- GLuint sampler,
- GLenum pname,
- const GLfloat *params)
-{
- return ValidateSamplerParameterBase(context, sampler, pname, -1, params);
-}
-
-bool ValidateSamplerParameteri(Context *context, GLuint sampler, GLenum pname, GLint param)
-{
- return ValidateSamplerParameterBase(context, sampler, pname, -1, &param);
-}
-
-bool ValidateSamplerParameteriv(Context *context, GLuint sampler, GLenum pname, const GLint *params)
-{
- return ValidateSamplerParameterBase(context, sampler, pname, -1, params);
-}
-
-bool ValidateGetVertexAttribIiv(Context *context, GLuint index, GLenum pname, GLint *params)
-{
- return ValidateGetVertexAttribBase(context, index, pname, nullptr, false, true);
-}
-
-bool ValidateGetVertexAttribIuiv(Context *context, GLuint index, GLenum pname, GLuint *params)
-{
- return ValidateGetVertexAttribBase(context, index, pname, nullptr, false, true);
-}
-
-bool ValidateGetInternalformativ(Context *context,
- GLenum target,
- GLenum internalformat,
- GLenum pname,
- GLsizei bufSize,
- GLint *params)
-{
- return ValidateGetInternalFormativBase(context, target, internalformat, pname, bufSize,
- nullptr);
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/validationES3.h b/src/3rdparty/angle/src/libANGLE/validationES3.h
deleted file mode 100644
index 631b1ca43a..0000000000
--- a/src/3rdparty/angle/src/libANGLE/validationES3.h
+++ /dev/null
@@ -1,614 +0,0 @@
-//
-// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationES3.h: Validation functions for OpenGL ES 3.0 entry point parameters
-
-#ifndef LIBANGLE_VALIDATION_ES3_H_
-#define LIBANGLE_VALIDATION_ES3_H_
-
-#include "libANGLE/PackedGLEnums.h"
-
-#include <GLES3/gl3.h>
-
-namespace gl
-{
-class Context;
-struct IndexRange;
-class ValidationContext;
-
-bool ValidateES3TexImageParametersBase(ValidationContext *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- bool isCompressed,
- bool isSubImage,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLint border,
- GLenum format,
- GLenum type,
- GLsizei imageSize,
- const void *pixels);
-
-bool ValidateES3TexStorageParameters(Context *context,
- GLenum target,
- GLsizei levels,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth);
-
-bool ValidateES3TexImage2DParameters(Context *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- bool isCompressed,
- bool isSubImage,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLint border,
- GLenum format,
- GLenum type,
- GLsizei imageSize,
- const void *pixels);
-
-bool ValidateES3TexImage3DParameters(Context *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- bool isCompressed,
- bool isSubImage,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLint border,
- GLenum format,
- GLenum type,
- GLsizei bufSize,
- const void *pixels);
-
-bool ValidateES3CopyTexImageParametersBase(ValidationContext *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- bool isSubImage,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLint border);
-
-bool ValidateES3CopyTexImage2DParameters(ValidationContext *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- bool isSubImage,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLint border);
-
-bool ValidateES3CopyTexImage3DParameters(ValidationContext *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- bool isSubImage,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height,
- GLint border);
-
-bool ValidateES3TexStorageParametersBase(Context *context,
- GLenum target,
- GLsizei levels,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth);
-
-bool ValidateES3TexStorage2DParameters(Context *context,
- GLenum target,
- GLsizei levels,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth);
-
-bool ValidateES3TexStorage3DParameters(Context *context,
- GLenum target,
- GLsizei levels,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth);
-
-bool ValidateBeginQuery(Context *context, GLenum target, GLuint id);
-
-bool ValidateEndQuery(Context *context, GLenum target);
-
-bool ValidateGetQueryiv(Context *context, GLenum target, GLenum pname, GLint *params);
-
-bool ValidateGetQueryObjectuiv(Context *context, GLuint id, GLenum pname, GLuint *params);
-
-bool ValidateFramebufferTextureLayer(Context *context,
- GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLint layer);
-
-bool ValidateInvalidateFramebuffer(Context *context,
- GLenum target,
- GLsizei numAttachments,
- const GLenum *attachments);
-
-bool ValidateInvalidateSubFramebuffer(Context *context,
- GLenum target,
- GLsizei numAttachments,
- const GLenum *attachments,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height);
-
-bool ValidateClearBuffer(ValidationContext *context);
-
-bool ValidateDrawRangeElements(Context *context,
- GLenum mode,
- GLuint start,
- GLuint end,
- GLsizei count,
- GLenum type,
- const void *indices);
-
-bool ValidateGetUniformuiv(Context *context, GLuint program, GLint location, GLuint *params);
-
-bool ValidateReadBuffer(Context *context, GLenum mode);
-
-bool ValidateCompressedTexImage3D(Context *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLint border,
- GLsizei imageSize,
- const void *data);
-bool ValidateCompressedTexImage3DRobustANGLE(Context *context,
- GLenum target,
- GLint level,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLint border,
- GLsizei imageSize,
- GLsizei dataSize,
- const void *data);
-
-bool ValidateBindVertexArray(Context *context, GLuint array);
-bool ValidateIsVertexArray(Context *context, GLuint array);
-
-bool ValidateBindBufferBase(Context *context, BufferBinding target, GLuint index, GLuint buffer);
-bool ValidateBindBufferRange(Context *context,
- BufferBinding target,
- GLuint index,
- GLuint buffer,
- GLintptr offset,
- GLsizeiptr size);
-
-bool ValidateProgramBinary(Context *context,
- GLuint program,
- GLenum binaryFormat,
- const void *binary,
- GLint length);
-bool ValidateGetProgramBinary(Context *context,
- GLuint program,
- GLsizei bufSize,
- GLsizei *length,
- GLenum *binaryFormat,
- void *binary);
-bool ValidateProgramParameteri(Context *context, GLuint program, GLenum pname, GLint value);
-bool ValidateBlitFramebuffer(Context *context,
- GLint srcX0,
- GLint srcY0,
- GLint srcX1,
- GLint srcY1,
- GLint dstX0,
- GLint dstY0,
- GLint dstX1,
- GLint dstY1,
- GLbitfield mask,
- GLenum filter);
-bool ValidateClearBufferiv(ValidationContext *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLint *value);
-bool ValidateClearBufferuiv(ValidationContext *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLuint *value);
-bool ValidateClearBufferfv(ValidationContext *context,
- GLenum buffer,
- GLint drawbuffer,
- const GLfloat *value);
-bool ValidateClearBufferfi(ValidationContext *context,
- GLenum buffer,
- GLint drawbuffer,
- GLfloat depth,
- GLint stencil);
-bool ValidateDrawBuffers(ValidationContext *context, GLsizei n, const GLenum *bufs);
-bool ValidateCopyTexSubImage3D(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height);
-bool ValidateTexImage3D(Context *context,
- GLenum target,
- GLint level,
- GLint internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLint border,
- GLenum format,
- GLenum type,
- const void *pixels);
-bool ValidateTexImage3DRobustANGLE(Context *context,
- GLenum target,
- GLint level,
- GLint internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLint border,
- GLenum format,
- GLenum type,
- GLsizei bufSize,
- const void *pixels);
-bool ValidateTexSubImage3D(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLenum format,
- GLenum type,
- const void *pixels);
-bool ValidateTexSubImage3DRobustANGLE(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLenum format,
- GLenum type,
- GLsizei bufSize,
- const void *pixels);
-bool ValidateCompressedTexSubImage3D(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLenum format,
- GLsizei imageSize,
- const void *data);
-bool ValidateCompressedTexSubImage3DRobustANGLE(Context *context,
- GLenum target,
- GLint level,
- GLint xoffset,
- GLint yoffset,
- GLint zoffset,
- GLsizei width,
- GLsizei height,
- GLsizei depth,
- GLenum format,
- GLsizei imageSize,
- GLsizei dataSize,
- const void *data);
-
-bool ValidateGenQueries(Context *context, GLint n, GLuint *ids);
-bool ValidateDeleteQueries(Context *context, GLint n, const GLuint *ids);
-bool ValidateGenSamplers(Context *context, GLint count, GLuint *samplers);
-bool ValidateDeleteSamplers(Context *context, GLint count, const GLuint *samplers);
-bool ValidateGenTransformFeedbacks(Context *context, GLint n, GLuint *ids);
-bool ValidateDeleteTransformFeedbacks(Context *context, GLint n, const GLuint *ids);
-bool ValidateGenVertexArrays(Context *context, GLint n, GLuint *arrays);
-bool ValidateDeleteVertexArrays(Context *context, GLint n, const GLuint *arrays);
-
-bool ValidateBeginTransformFeedback(Context *context, GLenum primitiveMode);
-
-bool ValidateGetBufferPointerv(Context *context, BufferBinding target, GLenum pname, void **params);
-bool ValidateGetBufferPointervRobustANGLE(Context *context,
- BufferBinding target,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- void **params);
-bool ValidateUnmapBuffer(Context *context, BufferBinding target);
-bool ValidateMapBufferRange(Context *context,
- BufferBinding target,
- GLintptr offset,
- GLsizeiptr length,
- GLbitfield access);
-bool ValidateFlushMappedBufferRange(Context *context,
- BufferBinding target,
- GLintptr offset,
- GLsizeiptr length);
-
-bool ValidateIndexedStateQuery(ValidationContext *context,
- GLenum pname,
- GLuint index,
- GLsizei *length);
-bool ValidateGetIntegeri_v(ValidationContext *context, GLenum target, GLuint index, GLint *data);
-bool ValidateGetIntegeri_vRobustANGLE(ValidationContext *context,
- GLenum target,
- GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLint *data);
-bool ValidateGetInteger64i_v(ValidationContext *context,
- GLenum target,
- GLuint index,
- GLint64 *data);
-bool ValidateGetInteger64i_vRobustANGLE(ValidationContext *context,
- GLenum target,
- GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLint64 *data);
-
-bool ValidateCopyBufferSubData(ValidationContext *context,
- BufferBinding readTarget,
- BufferBinding writeTarget,
- GLintptr readOffset,
- GLintptr writeOffset,
- GLsizeiptr size);
-
-bool ValidateGetStringi(Context *context, GLenum name, GLuint index);
-bool ValidateRenderbufferStorageMultisample(ValidationContext *context,
- GLenum target,
- GLsizei samples,
- GLenum internalformat,
- GLsizei width,
- GLsizei height);
-
-bool ValidateVertexAttribIPointer(ValidationContext *context,
- GLuint index,
- GLint size,
- GLenum type,
- GLsizei stride,
- const void *pointer);
-
-bool ValidateGetSynciv(Context *context,
- GLsync sync,
- GLenum pname,
- GLsizei bufSize,
- GLsizei *length,
- GLint *values);
-
-bool ValidateDrawElementsInstanced(ValidationContext *context,
- GLenum mode,
- GLsizei count,
- GLenum type,
- const void *indices,
- GLsizei instanceCount);
-
-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);
-
-bool ValidateIsQuery(Context *context, GLuint id);
-
-bool ValidateUniform1ui(Context *context, GLint location, GLuint v0);
-bool ValidateUniform2ui(Context *context, GLint location, GLuint v0, GLuint v1);
-bool ValidateUniform3ui(Context *context, GLint location, GLuint v0, GLuint v1, GLuint v2);
-bool ValidateUniform4ui(Context *context,
- GLint location,
- GLuint v0,
- GLuint v1,
- GLuint v2,
- GLuint v3);
-
-bool ValidateUniform1uiv(Context *context, GLint location, GLsizei count, const GLuint *value);
-bool ValidateUniform2uiv(Context *context, GLint location, GLsizei count, const GLuint *value);
-bool ValidateUniform3uiv(Context *context, GLint location, GLsizei count, const GLuint *value);
-bool ValidateUniform4uiv(Context *context, GLint location, GLsizei count, const GLuint *value);
-
-bool ValidateUniformMatrix2x3fv(Context *context,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-bool ValidateUniformMatrix3x2fv(Context *context,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-bool ValidateUniformMatrix2x4fv(Context *context,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-bool ValidateUniformMatrix4x2fv(Context *context,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-bool ValidateUniformMatrix3x4fv(Context *context,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-bool ValidateUniformMatrix4x3fv(Context *context,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-
-bool ValidateEndTransformFeedback(Context *context);
-bool ValidateTransformFeedbackVaryings(Context *context,
- GLuint program,
- GLsizei count,
- const GLchar *const *varyings,
- GLenum bufferMode);
-bool ValidateGetTransformFeedbackVarying(Context *context,
- GLuint program,
- GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLsizei *size,
- GLenum *type,
- GLchar *name);
-bool ValidateBindTransformFeedback(Context *context, GLenum target, GLuint id);
-bool ValidateIsTransformFeedback(Context *context, GLuint id);
-bool ValidatePauseTransformFeedback(Context *context);
-bool ValidateResumeTransformFeedback(Context *context);
-bool ValidateVertexAttribI4i(Context *context, GLuint index, GLint x, GLint y, GLint z, GLint w);
-bool ValidateVertexAttribI4ui(Context *context,
- GLuint index,
- GLuint x,
- GLuint y,
- GLuint z,
- GLuint w);
-bool ValidateVertexAttribI4iv(Context *context, GLuint index, const GLint *v);
-bool ValidateVertexAttribI4uiv(Context *context, GLuint index, const GLuint *v);
-bool ValidateGetFragDataLocation(Context *context, GLuint program, const GLchar *name);
-bool ValidateGetUniformIndices(Context *context,
- GLuint program,
- GLsizei uniformCount,
- const GLchar *const *uniformNames,
- GLuint *uniformIndices);
-bool ValidateGetActiveUniformsiv(Context *context,
- GLuint program,
- GLsizei uniformCount,
- const GLuint *uniformIndices,
- GLenum pname,
- GLint *params);
-bool ValidateGetUniformBlockIndex(Context *context, GLuint program, const GLchar *uniformBlockName);
-bool ValidateGetActiveUniformBlockiv(Context *context,
- GLuint program,
- GLuint uniformBlockIndex,
- GLenum pname,
- GLint *params);
-bool ValidateGetActiveUniformBlockName(Context *context,
- GLuint program,
- GLuint uniformBlockIndex,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *uniformBlockName);
-bool ValidateUniformBlockBinding(Context *context,
- GLuint program,
- GLuint uniformBlockIndex,
- GLuint uniformBlockBinding);
-bool ValidateDrawArraysInstanced(Context *context,
- GLenum mode,
- GLint first,
- GLsizei count,
- GLsizei primcount);
-
-bool ValidateFenceSync(Context *context, GLenum condition, GLbitfield flags);
-bool ValidateIsSync(Context *context, GLsync sync);
-bool ValidateDeleteSync(Context *context, GLsync sync);
-bool ValidateClientWaitSync(Context *context, GLsync sync, GLbitfield flags, GLuint64 timeout);
-bool ValidateWaitSync(Context *context, GLsync sync, GLbitfield flags, GLuint64 timeout);
-bool ValidateGetInteger64v(Context *context, GLenum pname, GLint64 *params);
-
-bool ValidateIsSampler(Context *context, GLuint sampler);
-bool ValidateBindSampler(Context *context, GLuint unit, GLuint sampler);
-bool ValidateVertexAttribDivisor(Context *context, GLuint index, GLuint divisor);
-bool ValidateTexStorage2D(Context *context,
- GLenum target,
- GLsizei levels,
- GLenum internalformat,
- GLsizei width,
- GLsizei height);
-bool ValidateTexStorage3D(Context *context,
- GLenum target,
- GLsizei levels,
- GLenum internalformat,
- GLsizei width,
- GLsizei height,
- GLsizei depth);
-
-bool ValidateGetVertexAttribIiv(Context *context, GLuint index, GLenum pname, GLint *params);
-bool ValidateGetVertexAttribIuiv(Context *context, GLuint index, GLenum pname, GLuint *params);
-bool ValidateGetBufferParameteri64v(ValidationContext *context,
- BufferBinding target,
- GLenum pname,
- GLint64 *params);
-bool ValidateSamplerParameteri(Context *context, GLuint sampler, GLenum pname, GLint param);
-bool ValidateSamplerParameteriv(Context *context,
- GLuint sampler,
- GLenum pname,
- const GLint *params);
-bool ValidateSamplerParameterf(Context *context, GLuint sampler, GLenum pname, GLfloat param);
-bool ValidateSamplerParameterfv(Context *context,
- GLuint sampler,
- GLenum pname,
- const GLfloat *params);
-bool ValidateGetSamplerParameteriv(Context *context, GLuint sampler, GLenum pname, GLint *params);
-bool ValidateGetSamplerParameterfv(Context *context, GLuint sampler, GLenum pname, GLfloat *params);
-bool ValidateGetInternalformativ(Context *context,
- GLenum target,
- GLenum internalformat,
- GLenum pname,
- GLsizei bufSize,
- GLint *params);
-
-} // namespace gl
-
-#endif // LIBANGLE_VALIDATION_ES3_H_
diff --git a/src/3rdparty/angle/src/libANGLE/validationES31.cpp b/src/3rdparty/angle/src/libANGLE/validationES31.cpp
deleted file mode 100644
index b1bdccacf7..0000000000
--- a/src/3rdparty/angle/src/libANGLE/validationES31.cpp
+++ /dev/null
@@ -1,1786 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationES31.cpp: Validation functions for OpenGL ES 3.1 entry point parameters
-
-#include "libANGLE/validationES31.h"
-
-#include "libANGLE/Context.h"
-#include "libANGLE/ErrorStrings.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/VertexArray.h"
-#include "libANGLE/validationES.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-
-#include "common/utilities.h"
-
-using namespace angle;
-
-namespace gl
-{
-
-namespace
-{
-
-bool ValidateNamedProgramInterface(GLenum programInterface)
-{
- switch (programInterface)
- {
- case GL_UNIFORM:
- case GL_UNIFORM_BLOCK:
- case GL_PROGRAM_INPUT:
- case GL_PROGRAM_OUTPUT:
- case GL_TRANSFORM_FEEDBACK_VARYING:
- case GL_BUFFER_VARIABLE:
- case GL_SHADER_STORAGE_BLOCK:
- return true;
- default:
- return false;
- }
-}
-
-bool ValidateLocationProgramInterface(GLenum programInterface)
-{
- switch (programInterface)
- {
- case GL_UNIFORM:
- case GL_PROGRAM_INPUT:
- case GL_PROGRAM_OUTPUT:
- return true;
- default:
- return false;
- }
-}
-
-bool ValidateProgramInterface(GLenum programInterface)
-{
- return (programInterface == GL_ATOMIC_COUNTER_BUFFER ||
- ValidateNamedProgramInterface(programInterface));
-}
-
-bool ValidateProgramResourceProperty(GLenum prop)
-{
- switch (prop)
- {
- case GL_ACTIVE_VARIABLES:
- case GL_BUFFER_BINDING:
- case GL_NUM_ACTIVE_VARIABLES:
-
- case GL_ARRAY_SIZE:
-
- case GL_ARRAY_STRIDE:
- case GL_BLOCK_INDEX:
- case GL_IS_ROW_MAJOR:
- case GL_MATRIX_STRIDE:
-
- case GL_ATOMIC_COUNTER_BUFFER_INDEX:
-
- case GL_BUFFER_DATA_SIZE:
-
- case GL_LOCATION:
-
- case GL_NAME_LENGTH:
-
- case GL_OFFSET:
-
- case GL_REFERENCED_BY_VERTEX_SHADER:
- case GL_REFERENCED_BY_FRAGMENT_SHADER:
- case GL_REFERENCED_BY_COMPUTE_SHADER:
-
- case GL_TOP_LEVEL_ARRAY_SIZE:
- case GL_TOP_LEVEL_ARRAY_STRIDE:
-
- case GL_TYPE:
- return true;
-
- default:
- return false;
- }
-}
-
-// GLES 3.10 spec: Page 82 -- Table 7.2
-bool ValidateProgramResourcePropertyByInterface(GLenum prop, GLenum programInterface)
-{
- switch (prop)
- {
- case GL_ACTIVE_VARIABLES:
- case GL_BUFFER_BINDING:
- case GL_NUM_ACTIVE_VARIABLES:
- {
- switch (programInterface)
- {
- case GL_ATOMIC_COUNTER_BUFFER:
- case GL_SHADER_STORAGE_BLOCK:
- case GL_UNIFORM_BLOCK:
- return true;
- default:
- return false;
- }
- }
-
- case GL_ARRAY_SIZE:
- {
- switch (programInterface)
- {
- case GL_BUFFER_VARIABLE:
- case GL_PROGRAM_INPUT:
- case GL_PROGRAM_OUTPUT:
- case GL_TRANSFORM_FEEDBACK_VARYING:
- case GL_UNIFORM:
- return true;
- default:
- return false;
- }
- }
-
- case GL_ARRAY_STRIDE:
- case GL_BLOCK_INDEX:
- case GL_IS_ROW_MAJOR:
- case GL_MATRIX_STRIDE:
- {
- switch (programInterface)
- {
- case GL_BUFFER_VARIABLE:
- case GL_UNIFORM:
- return true;
- default:
- return false;
- }
- }
-
- case GL_ATOMIC_COUNTER_BUFFER_INDEX:
- {
- if (programInterface == GL_UNIFORM)
- {
- return true;
- }
- return false;
- }
-
- case GL_BUFFER_DATA_SIZE:
- {
- switch (programInterface)
- {
- case GL_ATOMIC_COUNTER_BUFFER:
- case GL_SHADER_STORAGE_BLOCK:
- case GL_UNIFORM_BLOCK:
- return true;
- default:
- return false;
- }
- }
-
- case GL_LOCATION:
- {
- return ValidateLocationProgramInterface(programInterface);
- }
-
- case GL_NAME_LENGTH:
- {
- return ValidateNamedProgramInterface(programInterface);
- }
-
- case GL_OFFSET:
- {
- switch (programInterface)
- {
- case GL_BUFFER_VARIABLE:
- case GL_UNIFORM:
- return true;
- default:
- return false;
- }
- }
-
- case GL_REFERENCED_BY_VERTEX_SHADER:
- case GL_REFERENCED_BY_FRAGMENT_SHADER:
- case GL_REFERENCED_BY_COMPUTE_SHADER:
- {
- switch (programInterface)
- {
- case GL_ATOMIC_COUNTER_BUFFER:
- case GL_BUFFER_VARIABLE:
- case GL_PROGRAM_INPUT:
- case GL_PROGRAM_OUTPUT:
- case GL_SHADER_STORAGE_BLOCK:
- case GL_UNIFORM:
- case GL_UNIFORM_BLOCK:
- return true;
- default:
- return false;
- }
- }
-
- case GL_TOP_LEVEL_ARRAY_SIZE:
- case GL_TOP_LEVEL_ARRAY_STRIDE:
- {
- if (programInterface == GL_BUFFER_VARIABLE)
- {
- return true;
- }
- return false;
- }
-
- case GL_TYPE:
- {
- switch (programInterface)
- {
- case GL_BUFFER_VARIABLE:
- case GL_PROGRAM_INPUT:
- case GL_PROGRAM_OUTPUT:
- case GL_TRANSFORM_FEEDBACK_VARYING:
- case GL_UNIFORM:
- return true;
- default:
- return false;
- }
- }
-
- default:
- return false;
- }
-}
-
-bool ValidateProgramResourceIndex(const Program *programObject,
- GLenum programInterface,
- GLuint index)
-{
- switch (programInterface)
- {
- case GL_PROGRAM_INPUT:
- return (index < static_cast<GLuint>(programObject->getActiveAttributeCount()));
-
- case GL_PROGRAM_OUTPUT:
- return (index < static_cast<GLuint>(programObject->getOutputResourceCount()));
-
- case GL_UNIFORM:
- return (index < static_cast<GLuint>(programObject->getActiveUniformCount()));
-
- case GL_BUFFER_VARIABLE:
- return (index < static_cast<GLuint>(programObject->getActiveBufferVariableCount()));
-
- case GL_SHADER_STORAGE_BLOCK:
- return (index < static_cast<GLuint>(programObject->getActiveShaderStorageBlockCount()));
-
- case GL_UNIFORM_BLOCK:
- return (index < programObject->getActiveUniformBlockCount());
-
- case GL_ATOMIC_COUNTER_BUFFER:
- return (index < programObject->getActiveAtomicCounterBufferCount());
-
- // TODO(jie.a.chen@intel.com): more interfaces.
- case GL_TRANSFORM_FEEDBACK_VARYING:
- UNIMPLEMENTED();
- return false;
-
- default:
- UNREACHABLE();
- return false;
- }
-}
-
-bool ValidateProgramUniform(gl::Context *context,
- GLenum valueType,
- GLuint program,
- GLint location,
- GLsizei count)
-{
- // Check for ES31 program uniform entry points
- if (context->getClientVersion() < Version(3, 1))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- const LinkedUniform *uniform = nullptr;
- gl::Program *programObject = GetValidProgram(context, program);
- return ValidateUniformCommonBase(context, programObject, location, count, &uniform) &&
- ValidateUniformValue(context, valueType, uniform->type);
-}
-
-bool ValidateProgramUniformMatrix(gl::Context *context,
- GLenum valueType,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose)
-{
- // Check for ES31 program uniform entry points
- if (context->getClientVersion() < Version(3, 1))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- const LinkedUniform *uniform = nullptr;
- gl::Program *programObject = GetValidProgram(context, program);
- return ValidateUniformCommonBase(context, programObject, location, count, &uniform) &&
- ValidateUniformMatrixValue(context, valueType, uniform->type);
-}
-
-bool ValidateVertexAttribFormatCommon(ValidationContext *context,
- GLuint attribIndex,
- GLint size,
- GLenum type,
- GLuint relativeOffset,
- GLboolean pureInteger)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- const Caps &caps = context->getCaps();
- if (relativeOffset > static_cast<GLuint>(caps.maxVertexAttribRelativeOffset))
- {
- context->handleError(
- InvalidValue()
- << "relativeOffset cannot be greater than MAX_VERTEX_ATTRIB_RELATIVE_OFFSET.");
- return false;
- }
-
- // [OpenGL ES 3.1] Section 10.3.1 page 243:
- // An INVALID_OPERATION error is generated if the default vertex array object is bound.
- if (context->getGLState().getVertexArrayId() == 0)
- {
- context->handleError(InvalidOperation() << "Default vertex array object is bound.");
- return false;
- }
-
- return ValidateVertexFormatBase(context, attribIndex, size, type, pureInteger);
-}
-
-} // anonymous namespace
-
-bool ValidateGetBooleani_v(Context *context, GLenum target, GLuint index, GLboolean *data)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- if (!ValidateIndexedStateQuery(context, target, index, nullptr))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetBooleani_vRobustANGLE(Context *context,
- GLenum target,
- GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLboolean *data)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- if (!ValidateRobustEntryPoint(context, bufSize))
- {
- return false;
- }
-
- if (!ValidateIndexedStateQuery(context, target, index, length))
- {
- return false;
- }
-
- if (!ValidateRobustBufferSize(context, bufSize, *length))
- {
- return false;
- }
-
- return true;
-}
-
-bool ValidateDrawIndirectBase(Context *context, GLenum mode, const void *indirect)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- // Here the third parameter 1 is only to pass the count validation.
- if (!ValidateDrawBase(context, mode, 1))
- {
- return false;
- }
-
- const State &state = context->getGLState();
-
- // An INVALID_OPERATION error is generated if zero is bound to VERTEX_ARRAY_BINDING,
- // DRAW_INDIRECT_BUFFER or to any enabled vertex array.
- if (!state.getVertexArrayId())
- {
- context->handleError(InvalidOperation() << "zero is bound to VERTEX_ARRAY_BINDING");
- return false;
- }
-
- gl::Buffer *drawIndirectBuffer = state.getTargetBuffer(BufferBinding::DrawIndirect);
- if (!drawIndirectBuffer)
- {
- context->handleError(InvalidOperation() << "zero is bound to DRAW_INDIRECT_BUFFER");
- return false;
- }
-
- // An INVALID_VALUE error is generated if indirect is not a multiple of the size, in basic
- // machine units, of uint.
- GLint64 offset = reinterpret_cast<GLint64>(indirect);
- if ((static_cast<GLuint>(offset) % sizeof(GLuint)) != 0)
- {
- context->handleError(
- InvalidValue()
- << "indirect is not a multiple of the size, in basic machine units, of uint");
- 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->getGLState().getDrawFramebuffer();
- ASSERT(drawFramebuffer != nullptr);
- if (drawFramebuffer->getNumViews() > 1)
- {
- context->handleError(
- InvalidOperation()
- << "The number of views in the active draw framebuffer is greater than 1.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateDrawArraysIndirect(Context *context, GLenum mode, const void *indirect)
-{
- const State &state = context->getGLState();
- gl::TransformFeedback *curTransformFeedback = state.getCurrentTransformFeedback();
- if (curTransformFeedback && curTransformFeedback->isActive() &&
- !curTransformFeedback->isPaused())
- {
- // An INVALID_OPERATION error is generated if transform feedback is active and not paused.
- context->handleError(InvalidOperation() << "transform feedback is active and not paused.");
- return false;
- }
-
- if (!ValidateDrawIndirectBase(context, mode, indirect))
- return false;
-
- gl::Buffer *drawIndirectBuffer = state.getTargetBuffer(BufferBinding::DrawIndirect);
- CheckedNumeric<size_t> checkedOffset(reinterpret_cast<size_t>(indirect));
- // In OpenGL ES3.1 spec, session 10.5, it defines the struct of DrawArraysIndirectCommand
- // which's size is 4 * sizeof(uint).
- auto checkedSum = checkedOffset + 4 * sizeof(GLuint);
- if (!checkedSum.IsValid() ||
- checkedSum.ValueOrDie() > static_cast<size_t>(drawIndirectBuffer->getSize()))
- {
- context->handleError(
- InvalidOperation()
- << "the command would source data beyond the end of the buffer object.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateDrawElementsIndirect(Context *context, GLenum mode, GLenum type, const void *indirect)
-{
- if (!ValidateDrawElementsBase(context, type))
- return false;
-
- const State &state = context->getGLState();
- const VertexArray *vao = state.getVertexArray();
- gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get();
- if (!elementArrayBuffer)
- {
- context->handleError(InvalidOperation() << "zero is bound to ELEMENT_ARRAY_BUFFER");
- return false;
- }
-
- if (!ValidateDrawIndirectBase(context, mode, indirect))
- return false;
-
- gl::Buffer *drawIndirectBuffer = state.getTargetBuffer(BufferBinding::DrawIndirect);
- CheckedNumeric<size_t> checkedOffset(reinterpret_cast<size_t>(indirect));
- // In OpenGL ES3.1 spec, session 10.5, it defines the struct of DrawElementsIndirectCommand
- // which's size is 5 * sizeof(uint).
- auto checkedSum = checkedOffset + 5 * sizeof(GLuint);
- if (!checkedSum.IsValid() ||
- checkedSum.ValueOrDie() > static_cast<size_t>(drawIndirectBuffer->getSize()))
- {
- context->handleError(
- InvalidOperation()
- << "the command would source data beyond the end of the buffer object.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateProgramUniform1i(Context *context, GLuint program, GLint location, GLint v0)
-{
- return ValidateProgramUniform1iv(context, program, location, 1, &v0);
-}
-
-bool ValidateProgramUniform2i(Context *context, GLuint program, GLint location, GLint v0, GLint v1)
-{
- GLint xy[2] = {v0, v1};
- return ValidateProgramUniform2iv(context, program, location, 1, xy);
-}
-
-bool ValidateProgramUniform3i(Context *context,
- GLuint program,
- GLint location,
- GLint v0,
- GLint v1,
- GLint v2)
-{
- GLint xyz[3] = {v0, v1, v2};
- return ValidateProgramUniform3iv(context, program, location, 1, xyz);
-}
-
-bool ValidateProgramUniform4i(Context *context,
- GLuint program,
- GLint location,
- GLint v0,
- GLint v1,
- GLint v2,
- GLint v3)
-{
- GLint xyzw[4] = {v0, v1, v2, v3};
- return ValidateProgramUniform4iv(context, program, location, 1, xyzw);
-}
-
-bool ValidateProgramUniform1ui(Context *context, GLuint program, GLint location, GLuint v0)
-{
- return ValidateProgramUniform1uiv(context, program, location, 1, &v0);
-}
-
-bool ValidateProgramUniform2ui(Context *context,
- GLuint program,
- GLint location,
- GLuint v0,
- GLuint v1)
-{
- GLuint xy[2] = {v0, v1};
- return ValidateProgramUniform2uiv(context, program, location, 1, xy);
-}
-
-bool ValidateProgramUniform3ui(Context *context,
- GLuint program,
- GLint location,
- GLuint v0,
- GLuint v1,
- GLuint v2)
-{
- GLuint xyz[3] = {v0, v1, v2};
- return ValidateProgramUniform3uiv(context, program, location, 1, xyz);
-}
-
-bool ValidateProgramUniform4ui(Context *context,
- GLuint program,
- GLint location,
- GLuint v0,
- GLuint v1,
- GLuint v2,
- GLuint v3)
-{
- GLuint xyzw[4] = {v0, v1, v2, v3};
- return ValidateProgramUniform4uiv(context, program, location, 1, xyzw);
-}
-
-bool ValidateProgramUniform1f(Context *context, GLuint program, GLint location, GLfloat v0)
-{
- return ValidateProgramUniform1fv(context, program, location, 1, &v0);
-}
-
-bool ValidateProgramUniform2f(Context *context,
- GLuint program,
- GLint location,
- GLfloat v0,
- GLfloat v1)
-{
- GLfloat xy[2] = {v0, v1};
- return ValidateProgramUniform2fv(context, program, location, 1, xy);
-}
-
-bool ValidateProgramUniform3f(Context *context,
- GLuint program,
- GLint location,
- GLfloat v0,
- GLfloat v1,
- GLfloat v2)
-{
- GLfloat xyz[3] = {v0, v1, v2};
- return ValidateProgramUniform3fv(context, program, location, 1, xyz);
-}
-
-bool ValidateProgramUniform4f(Context *context,
- GLuint program,
- GLint location,
- GLfloat v0,
- GLfloat v1,
- GLfloat v2,
- GLfloat v3)
-{
- GLfloat xyzw[4] = {v0, v1, v2, v3};
- return ValidateProgramUniform4fv(context, program, location, 1, xyzw);
-}
-
-bool ValidateProgramUniform1iv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLint *value)
-{
- // Check for ES31 program uniform entry points
- if (context->getClientVersion() < Version(3, 1))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- const LinkedUniform *uniform = nullptr;
- gl::Program *programObject = GetValidProgram(context, program);
- return ValidateUniformCommonBase(context, programObject, location, count, &uniform) &&
- ValidateUniform1ivValue(context, uniform->type, count, value);
-}
-
-bool ValidateProgramUniform2iv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLint *value)
-{
- return ValidateProgramUniform(context, GL_INT_VEC2, program, location, count);
-}
-
-bool ValidateProgramUniform3iv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLint *value)
-{
- return ValidateProgramUniform(context, GL_INT_VEC3, program, location, count);
-}
-
-bool ValidateProgramUniform4iv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLint *value)
-{
- return ValidateProgramUniform(context, GL_INT_VEC4, program, location, count);
-}
-
-bool ValidateProgramUniform1uiv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLuint *value)
-{
- return ValidateProgramUniform(context, GL_UNSIGNED_INT, program, location, count);
-}
-
-bool ValidateProgramUniform2uiv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLuint *value)
-{
- return ValidateProgramUniform(context, GL_UNSIGNED_INT_VEC2, program, location, count);
-}
-
-bool ValidateProgramUniform3uiv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLuint *value)
-{
- return ValidateProgramUniform(context, GL_UNSIGNED_INT_VEC3, program, location, count);
-}
-
-bool ValidateProgramUniform4uiv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLuint *value)
-{
- return ValidateProgramUniform(context, GL_UNSIGNED_INT_VEC4, program, location, count);
-}
-
-bool ValidateProgramUniform1fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLfloat *value)
-{
- return ValidateProgramUniform(context, GL_FLOAT, program, location, count);
-}
-
-bool ValidateProgramUniform2fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLfloat *value)
-{
- return ValidateProgramUniform(context, GL_FLOAT_VEC2, program, location, count);
-}
-
-bool ValidateProgramUniform3fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLfloat *value)
-{
- return ValidateProgramUniform(context, GL_FLOAT_VEC3, program, location, count);
-}
-
-bool ValidateProgramUniform4fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLfloat *value)
-{
- return ValidateProgramUniform(context, GL_FLOAT_VEC4, program, location, count);
-}
-
-bool ValidateProgramUniformMatrix2fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- return ValidateProgramUniformMatrix(context, GL_FLOAT_MAT2, program, location, count,
- transpose);
-}
-
-bool ValidateProgramUniformMatrix3fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- return ValidateProgramUniformMatrix(context, GL_FLOAT_MAT3, program, location, count,
- transpose);
-}
-
-bool ValidateProgramUniformMatrix4fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- return ValidateProgramUniformMatrix(context, GL_FLOAT_MAT4, program, location, count,
- transpose);
-}
-
-bool ValidateProgramUniformMatrix2x3fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- return ValidateProgramUniformMatrix(context, GL_FLOAT_MAT2x3, program, location, count,
- transpose);
-}
-
-bool ValidateProgramUniformMatrix3x2fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- return ValidateProgramUniformMatrix(context, GL_FLOAT_MAT3x2, program, location, count,
- transpose);
-}
-
-bool ValidateProgramUniformMatrix2x4fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- return ValidateProgramUniformMatrix(context, GL_FLOAT_MAT2x4, program, location, count,
- transpose);
-}
-
-bool ValidateProgramUniformMatrix4x2fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- return ValidateProgramUniformMatrix(context, GL_FLOAT_MAT4x2, program, location, count,
- transpose);
-}
-
-bool ValidateProgramUniformMatrix3x4fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- return ValidateProgramUniformMatrix(context, GL_FLOAT_MAT3x4, program, location, count,
- transpose);
-}
-
-bool ValidateProgramUniformMatrix4x3fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value)
-{
- return ValidateProgramUniformMatrix(context, GL_FLOAT_MAT4x3, program, location, count,
- transpose);
-}
-
-bool ValidateGetTexLevelParameterBase(Context *context,
- GLenum target,
- GLint level,
- GLenum pname,
- GLsizei *length)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- if (length)
- {
- *length = 0;
- }
-
- if (!ValidTexLevelDestinationTarget(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTextureTarget);
- return false;
- }
-
- if (context->getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target) ==
- nullptr)
- {
- context->handleError(InvalidEnum() << "No texture bound.");
- return false;
- }
-
- if (!ValidMipLevel(context, target, level))
- {
- context->handleError(InvalidValue());
- return false;
- }
-
- switch (pname)
- {
- case GL_TEXTURE_RED_TYPE:
- case GL_TEXTURE_GREEN_TYPE:
- case GL_TEXTURE_BLUE_TYPE:
- case GL_TEXTURE_ALPHA_TYPE:
- case GL_TEXTURE_DEPTH_TYPE:
- break;
- case GL_TEXTURE_RED_SIZE:
- case GL_TEXTURE_GREEN_SIZE:
- case GL_TEXTURE_BLUE_SIZE:
- case GL_TEXTURE_ALPHA_SIZE:
- case GL_TEXTURE_DEPTH_SIZE:
- case GL_TEXTURE_STENCIL_SIZE:
- case GL_TEXTURE_SHARED_SIZE:
- break;
- case GL_TEXTURE_INTERNAL_FORMAT:
- case GL_TEXTURE_WIDTH:
- case GL_TEXTURE_HEIGHT:
- case GL_TEXTURE_DEPTH:
- break;
- case GL_TEXTURE_SAMPLES:
- case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
- break;
- case GL_TEXTURE_COMPRESSED:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidPname);
- return false;
- }
-
- if (length)
- {
- *length = 1;
- }
- return true;
-}
-
-bool ValidateGetTexLevelParameterfv(Context *context,
- GLenum target,
- GLint level,
- GLenum pname,
- GLfloat *params)
-{
- return ValidateGetTexLevelParameterBase(context, target, level, pname, nullptr);
-}
-
-bool ValidateGetTexLevelParameteriv(Context *context,
- GLenum target,
- GLint level,
- GLenum pname,
- GLint *params)
-{
- return ValidateGetTexLevelParameterBase(context, target, level, pname, nullptr);
-}
-
-bool ValidateTexStorage2DMultisample(Context *context,
- GLenum target,
- GLsizei samples,
- GLint internalFormat,
- GLsizei width,
- GLsizei height,
- GLboolean fixedSampleLocations)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- if (target != GL_TEXTURE_2D_MULTISAMPLE)
- {
- context->handleError(InvalidEnum() << "Target must be TEXTURE_2D_MULTISAMPLE.");
- return false;
- }
-
- if (width < 1 || height < 1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeSize);
- return false;
- }
-
- const Caps &caps = context->getCaps();
- if (static_cast<GLuint>(width) > caps.max2DTextureSize ||
- static_cast<GLuint>(height) > caps.max2DTextureSize)
- {
- context
- ->handleError(InvalidValue()
- << "Width and height must be less than or equal to GL_MAX_TEXTURE_SIZE.");
- return false;
- }
-
- if (samples == 0)
- {
- context->handleError(InvalidValue() << "Samples may not be zero.");
- return false;
- }
-
- const TextureCaps &formatCaps = context->getTextureCaps().get(internalFormat);
- if (!formatCaps.renderable)
- {
- context->handleError(InvalidEnum() << "SizedInternalformat must be color-renderable, "
- "depth-renderable, or stencil-renderable.");
- return false;
- }
-
- // The ES3.1 spec(section 8.8) states that an INVALID_ENUM error is generated if internalformat
- // is one of the unsized base internalformats listed in table 8.11.
- const InternalFormat &formatInfo = GetSizedInternalFormatInfo(internalFormat);
- if (formatInfo.internalFormat == GL_NONE)
- {
- context->handleError(
- InvalidEnum()
- << "Internalformat is one of the unsupported unsized base internalformats.");
- return false;
- }
-
- if (static_cast<GLuint>(samples) > formatCaps.getMaxSamples())
- {
- context->handleError(
- InvalidOperation()
- << "Samples must not be greater than maximum supported value for the format.");
- return false;
- }
-
- Texture *texture = context->getTargetTexture(target);
- if (!texture || texture->id() == 0)
- {
- context->handleError(InvalidOperation() << "Zero is bound to target.");
- return false;
- }
-
- if (texture->getImmutableFormat())
- {
- context->handleError(InvalidOperation() << "The value of TEXTURE_IMMUTABLE_FORMAT for "
- "the texture currently bound to target on "
- "the active texture unit is true.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetMultisamplefv(Context *context, GLenum pname, GLuint index, GLfloat *val)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- if (pname != GL_SAMPLE_POSITION)
- {
- context->handleError(InvalidEnum() << "Pname must be SAMPLE_POSITION.");
- return false;
- }
-
- Framebuffer *framebuffer = context->getGLState().getDrawFramebuffer();
-
- if (index >= static_cast<GLuint>(framebuffer->getSamples(context)))
- {
- context->handleError(InvalidValue() << "Index must be less than the value of SAMPLES.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateFramebufferParameteri(Context *context, GLenum target, GLenum pname, GLint param)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- if (!ValidFramebufferTarget(context, target))
- {
- context->handleError(InvalidEnum() << "Invalid framebuffer target.");
- return false;
- }
-
- switch (pname)
- {
- case GL_FRAMEBUFFER_DEFAULT_WIDTH:
- {
- GLint maxWidth = context->getCaps().maxFramebufferWidth;
- if (param < 0 || param > maxWidth)
- {
- context->handleError(
- InvalidValue()
- << "Params less than 0 or greater than GL_MAX_FRAMEBUFFER_WIDTH.");
- return false;
- }
- break;
- }
- case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
- {
- GLint maxHeight = context->getCaps().maxFramebufferHeight;
- if (param < 0 || param > maxHeight)
- {
- context->handleError(
- InvalidValue()
- << "Params less than 0 or greater than GL_MAX_FRAMEBUFFER_HEIGHT.");
- return false;
- }
- break;
- }
- case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
- {
- GLint maxSamples = context->getCaps().maxFramebufferSamples;
- if (param < 0 || param > maxSamples)
- {
- context->handleError(
- InvalidValue()
- << "Params less than 0 or greater than GL_MAX_FRAMEBUFFER_SAMPLES.");
- return false;
- }
- break;
- }
- case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
- {
- break;
- }
- default:
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidPname);
- return false;
- }
- }
-
- const Framebuffer *framebuffer = context->getGLState().getTargetFramebuffer(target);
- ASSERT(framebuffer);
- if (framebuffer->id() == 0)
- {
- context->handleError(InvalidOperation() << "Default framebuffer is bound to target.");
- return false;
- }
- return true;
-}
-
-bool ValidateGetFramebufferParameteriv(Context *context, GLenum target, GLenum pname, GLint *params)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- if (!ValidFramebufferTarget(context, target))
- {
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidFramebufferTarget);
- return false;
- }
-
- switch (pname)
- {
- case GL_FRAMEBUFFER_DEFAULT_WIDTH:
- case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
- case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
- case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
- break;
- default:
- ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidPname);
- return false;
- }
-
- const Framebuffer *framebuffer = context->getGLState().getTargetFramebuffer(target);
- ASSERT(framebuffer);
-
- if (framebuffer->id() == 0)
- {
- context->handleError(InvalidOperation() << "Default framebuffer is bound to target.");
- return false;
- }
- return true;
-}
-
-bool ValidateGetProgramResourceIndex(Context *context,
- GLuint program,
- GLenum programInterface,
- const GLchar *name)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
- if (programObject == nullptr)
- {
- return false;
- }
-
- if (!ValidateNamedProgramInterface(programInterface))
- {
- context->handleError(InvalidEnum() << "Invalid program interface: 0x" << std::hex
- << std::uppercase << programInterface);
- return false;
- }
-
- return true;
-}
-
-bool ValidateBindVertexBuffer(ValidationContext *context,
- GLuint bindingIndex,
- GLuint buffer,
- GLintptr offset,
- GLsizei stride)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- if (!context->isBufferGenerated(buffer))
- {
- context->handleError(InvalidOperation() << "Buffer is not generated.");
- return false;
- }
-
- const Caps &caps = context->getCaps();
- if (bindingIndex >= caps.maxVertexAttribBindings)
- {
- context->handleError(InvalidValue()
- << "bindingindex must be smaller than MAX_VERTEX_ATTRIB_BINDINGS.");
- return false;
- }
-
- if (offset < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeOffset);
- return false;
- }
-
- if (stride < 0 || stride > caps.maxVertexAttribStride)
- {
- context->handleError(InvalidValue()
- << "stride must be between 0 and MAX_VERTEX_ATTRIB_STRIDE.");
- return false;
- }
-
- // [OpenGL ES 3.1] Section 10.3.1 page 244:
- // An INVALID_OPERATION error is generated if the default vertex array object is bound.
- if (context->getGLState().getVertexArrayId() == 0)
- {
- context->handleError(InvalidOperation() << "Default vertex array buffer is bound.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateVertexBindingDivisor(ValidationContext *context, GLuint bindingIndex, GLuint divisor)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- const Caps &caps = context->getCaps();
- if (bindingIndex >= caps.maxVertexAttribBindings)
- {
- context->handleError(InvalidValue()
- << "bindingindex must be smaller than MAX_VERTEX_ATTRIB_BINDINGS.");
- return false;
- }
-
- // [OpenGL ES 3.1] Section 10.3.1 page 243:
- // An INVALID_OPERATION error is generated if the default vertex array object is bound.
- if (context->getGLState().getVertexArrayId() == 0)
- {
- context->handleError(InvalidOperation() << "Default vertex array object is bound.");
- return false;
- }
-
- return true;
-}
-
-bool ValidateVertexAttribFormat(ValidationContext *context,
- GLuint attribindex,
- GLint size,
- GLenum type,
- GLboolean normalized,
- GLuint relativeoffset)
-{
- return ValidateVertexAttribFormatCommon(context, attribindex, size, type, relativeoffset,
- false);
-}
-
-bool ValidateVertexAttribIFormat(ValidationContext *context,
- GLuint attribindex,
- GLint size,
- GLenum type,
- GLuint relativeoffset)
-{
- return ValidateVertexAttribFormatCommon(context, attribindex, size, type, relativeoffset, true);
-}
-
-bool ValidateVertexAttribBinding(ValidationContext *context,
- GLuint attribIndex,
- GLuint bindingIndex)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- // [OpenGL ES 3.1] Section 10.3.1 page 243:
- // An INVALID_OPERATION error is generated if the default vertex array object is bound.
- if (context->getGLState().getVertexArrayId() == 0)
- {
- context->handleError(InvalidOperation() << "Default vertex array object is bound.");
- return false;
- }
-
- const Caps &caps = context->getCaps();
- if (attribIndex >= caps.maxVertexAttributes)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), IndexExceedsMaxVertexAttribute);
- return false;
- }
-
- if (bindingIndex >= caps.maxVertexAttribBindings)
- {
- context->handleError(InvalidValue()
- << "bindingindex must be smaller than MAX_VERTEX_ATTRIB_BINDINGS");
- return false;
- }
-
- return true;
-}
-
-bool ValidateGetProgramResourceName(Context *context,
- GLuint program,
- GLenum programInterface,
- GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *name)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
- if (programObject == nullptr)
- {
- return false;
- }
-
- if (!ValidateNamedProgramInterface(programInterface))
- {
- context->handleError(InvalidEnum() << "Invalid program interface: 0x" << std::hex
- << std::uppercase << programInterface);
- return false;
- }
-
- if (!ValidateProgramResourceIndex(programObject, programInterface, index))
- {
- context->handleError(InvalidValue() << "Invalid index: " << index);
- return false;
- }
-
- if (bufSize < 0)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), NegativeBufferSize);
- return false;
- }
-
- return true;
-}
-
-bool ValidateDispatchCompute(Context *context,
- GLuint numGroupsX,
- GLuint numGroupsY,
- GLuint numGroupsZ)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- const State &state = context->getGLState();
- Program *program = state.getProgram();
-
- if (program == nullptr)
- {
- context->handleError(InvalidOperation()
- << "No active program object for the compute shader stage.");
- return false;
- }
-
- if (!program->isLinked() || !program->hasLinkedComputeShader())
- {
- context->handleError(
- InvalidOperation()
- << "Program has not been successfully linked, or program contains no compute shaders.");
- return false;
- }
-
- const Caps &caps = context->getCaps();
- if (numGroupsX > caps.maxComputeWorkGroupCount[0])
- {
- context->handleError(
- InvalidValue() << "num_groups_x cannot be greater than MAX_COMPUTE_WORK_GROUP_COUNT[0]="
- << caps.maxComputeWorkGroupCount[0]);
- return false;
- }
- if (numGroupsY > caps.maxComputeWorkGroupCount[1])
- {
- context->handleError(
- InvalidValue() << "num_groups_y cannot be greater than MAX_COMPUTE_WORK_GROUP_COUNT[1]="
- << caps.maxComputeWorkGroupCount[1]);
- return false;
- }
- if (numGroupsZ > caps.maxComputeWorkGroupCount[2])
- {
- context->handleError(
- InvalidValue() << "num_groups_z cannot be greater than MAX_COMPUTE_WORK_GROUP_COUNT[2]="
- << caps.maxComputeWorkGroupCount[2]);
- return false;
- }
-
- return true;
-}
-
-bool ValidateDispatchComputeIndirect(Context *context, GLintptr indirect)
-{
- UNIMPLEMENTED();
- return false;
-}
-
-bool ValidateBindImageTexture(Context *context,
- GLuint unit,
- GLuint texture,
- GLint level,
- GLboolean layered,
- GLint layer,
- GLenum access,
- GLenum format)
-{
- GLuint maxImageUnits = context->getCaps().maxImageUnits;
- if (unit >= maxImageUnits)
- {
- context->handleError(InvalidValue()
- << "unit cannot be greater than or equal than MAX_IMAGE_UNITS = "
- << maxImageUnits);
- return false;
- }
-
- if (level < 0)
- {
- context->handleError(InvalidValue() << "level is negative.");
- return false;
- }
-
- if (layer < 0)
- {
- context->handleError(InvalidValue() << "layer is negative.");
- return false;
- }
-
- if (access != GL_READ_ONLY && access != GL_WRITE_ONLY && access != GL_READ_WRITE)
- {
- context->handleError(InvalidEnum() << "access is not one of the supported tokens.");
- return false;
- }
-
- switch (format)
- {
- case GL_RGBA32F:
- case GL_RGBA16F:
- case GL_R32F:
- case GL_RGBA32UI:
- case GL_RGBA16UI:
- case GL_RGBA8UI:
- case GL_R32UI:
- case GL_RGBA32I:
- case GL_RGBA16I:
- case GL_RGBA8I:
- case GL_R32I:
- case GL_RGBA8:
- case GL_RGBA8_SNORM:
- break;
- default:
- context->handleError(InvalidValue()
- << "format is not one of supported image unit formats.");
- return false;
- }
-
- if (texture != 0)
- {
- Texture *tex = context->getTexture(texture);
-
- if (tex == nullptr)
- {
- context->handleError(InvalidValue()
- << "texture is not the name of an existing texture object.");
- return false;
- }
-
- if (!tex->getImmutableFormat())
- {
- context->handleError(InvalidOperation()
- << "texture is not the name of an immutable texture object.");
- return false;
- }
- }
-
- return true;
-}
-
-bool ValidateGetProgramResourceLocation(Context *context,
- GLuint program,
- GLenum programInterface,
- const GLchar *name)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
- if (programObject == nullptr)
- {
- return false;
- }
-
- if (!programObject->isLinked())
- {
- context->handleError(InvalidOperation() << "Program is not successfully linked.");
- return false;
- }
-
- if (!ValidateLocationProgramInterface(programInterface))
- {
- context->handleError(InvalidEnum() << "Invalid program interface.");
- return false;
- }
- return true;
-}
-
-bool ValidateGetProgramResourceiv(Context *context,
- GLuint program,
- GLenum programInterface,
- GLuint index,
- GLsizei propCount,
- const GLenum *props,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
- if (programObject == nullptr)
- {
- return false;
- }
- if (!ValidateProgramInterface(programInterface))
- {
- context->handleError(InvalidEnum() << "Invalid program interface.");
- return false;
- }
- if (propCount <= 0)
- {
- context->handleError(InvalidValue() << "Invalid propCount.");
- return false;
- }
- if (bufSize < 0)
- {
- context->handleError(InvalidValue() << "Invalid bufSize.");
- return false;
- }
- if (!ValidateProgramResourceIndex(programObject, programInterface, index))
- {
- context->handleError(InvalidValue() << "Invalid index: " << index);
- return false;
- }
- for (GLsizei i = 0; i < propCount; i++)
- {
- if (!ValidateProgramResourceProperty(props[i]))
- {
- context->handleError(InvalidEnum() << "Invalid prop.");
- return false;
- }
- if (!ValidateProgramResourcePropertyByInterface(props[i], programInterface))
- {
- context->handleError(InvalidOperation() << "Not an allowed prop for interface");
- return false;
- }
- }
- return true;
-}
-
-bool ValidateGetProgramInterfaceiv(Context *context,
- GLuint program,
- GLenum programInterface,
- GLenum pname,
- GLint *params)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- Program *programObject = GetValidProgram(context, program);
- if (programObject == nullptr)
- {
- return false;
- }
-
- if (!ValidateProgramInterface(programInterface))
- {
- context->handleError(InvalidEnum() << "Invalid program interface.");
- return false;
- }
-
- switch (pname)
- {
- case GL_ACTIVE_RESOURCES:
- case GL_MAX_NAME_LENGTH:
- case GL_MAX_NUM_ACTIVE_VARIABLES:
- break;
-
- default:
- context->handleError(InvalidEnum() << "Unknown property of program interface.");
- return false;
- }
-
- if (pname == GL_MAX_NAME_LENGTH && programInterface == GL_ATOMIC_COUNTER_BUFFER)
- {
- context->handleError(InvalidOperation()
- << "Active atomic counter resources are not assigned name strings.");
- return false;
- }
-
- if (pname == GL_MAX_NUM_ACTIVE_VARIABLES)
- {
- switch (programInterface)
- {
- case GL_ATOMIC_COUNTER_BUFFER:
- case GL_SHADER_STORAGE_BLOCK:
- case GL_UNIFORM_BLOCK:
- break;
-
- default:
- context->handleError(
- InvalidOperation()
- << "MAX_NUM_ACTIVE_VARIABLES requires a buffer or block interface.");
- return false;
- }
- }
-
- return true;
-}
-
-static bool ValidateGenOrDeleteES31(Context *context, GLint n)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- return ValidateGenOrDelete(context, n);
-}
-
-bool ValidateGenProgramPipelines(Context *context, GLint n, GLuint *)
-{
- return ValidateGenOrDeleteES31(context, n);
-}
-
-bool ValidateDeleteProgramPipelines(Context *context, GLint n, const GLuint *)
-{
- return ValidateGenOrDeleteES31(context, n);
-}
-
-bool ValidateBindProgramPipeline(Context *context, GLuint pipeline)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- if (!context->isProgramPipelineGenerated(pipeline))
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ObjectNotGenerated);
- return false;
- }
-
- return true;
-}
-
-bool ValidateIsProgramPipeline(Context *context, GLuint pipeline)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- return true;
-}
-
-bool ValidateUseProgramStages(Context *context, GLuint pipeline, GLbitfield stages, GLuint program)
-{
- UNIMPLEMENTED();
- return false;
-}
-
-bool ValidateActiveShaderProgram(Context *context, GLuint pipeline, GLuint program)
-{
- UNIMPLEMENTED();
- return false;
-}
-
-bool ValidateCreateShaderProgramv(Context *context,
- GLenum type,
- GLsizei count,
- const GLchar *const *strings)
-{
- UNIMPLEMENTED();
- return false;
-}
-
-bool ValidateGetProgramPipelineiv(Context *context, GLuint pipeline, GLenum pname, GLint *params)
-{
- UNIMPLEMENTED();
- return false;
-}
-
-bool ValidateValidateProgramPipeline(Context *context, GLuint pipeline)
-{
- UNIMPLEMENTED();
- return false;
-}
-
-bool ValidateGetProgramPipelineInfoLog(Context *context,
- GLuint pipeline,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *infoLog)
-{
- UNIMPLEMENTED();
- return false;
-}
-
-bool ValidateMemoryBarrier(Context *context, GLbitfield barriers)
-{
- UNIMPLEMENTED();
- return false;
-}
-
-bool ValidateMemoryBarrierByRegion(Context *context, GLbitfield barriers)
-{
- UNIMPLEMENTED();
- return false;
-}
-
-bool ValidateSampleMaski(Context *context, GLuint maskNumber, GLbitfield mask)
-{
- if (context->getClientVersion() < ES_3_1)
- {
- ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES31Required);
- return false;
- }
-
- if (maskNumber >= context->getCaps().maxSampleMaskWords)
- {
- ANGLE_VALIDATION_ERR(context, InvalidValue(), InvalidSampleMaskNumber);
- return false;
- }
-
- return true;
-}
-
-} // namespace gl
diff --git a/src/3rdparty/angle/src/libANGLE/validationES31.h b/src/3rdparty/angle/src/libANGLE/validationES31.h
deleted file mode 100644
index a0b76a5bcb..0000000000
--- a/src/3rdparty/angle/src/libANGLE/validationES31.h
+++ /dev/null
@@ -1,325 +0,0 @@
-//
-// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// validationES31.h: Validation functions for OpenGL ES 3.1 entry point parameters
-
-#ifndef LIBANGLE_VALIDATION_ES31_H_
-#define LIBANGLE_VALIDATION_ES31_H_
-
-#include <GLES3/gl31.h>
-
-namespace gl
-{
-class Context;
-class ValidationContext;
-
-bool ValidateGetBooleani_v(Context *context, GLenum target, GLuint index, GLboolean *data);
-bool ValidateGetBooleani_vRobustANGLE(Context *context,
- GLenum target,
- GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLboolean *data);
-
-bool ValidateGetTexLevelParameterfv(Context *context,
- GLenum target,
- GLint level,
- GLenum pname,
- GLfloat *params);
-bool ValidateGetTexLevelParameteriv(Context *context,
- GLenum target,
- GLint level,
- GLenum pname,
- GLint *param);
-
-bool ValidateTexStorage2DMultisample(Context *context,
- GLenum target,
- GLsizei samples,
- GLint internalFormat,
- GLsizei width,
- GLsizei height,
- GLboolean fixedSampleLocations);
-bool ValidateGetMultisamplefv(Context *context, GLenum pname, GLuint index, GLfloat *val);
-
-bool ValidateDrawIndirectBase(Context *context, GLenum mode, const void *indirect);
-bool ValidateDrawArraysIndirect(Context *context, GLenum mode, const void *indirect);
-bool ValidateDrawElementsIndirect(Context *context, GLenum mode, GLenum type, const void *indirect);
-
-bool ValidateProgramUniform1i(Context *context, GLuint program, GLint location, GLint v0);
-bool ValidateProgramUniform2i(Context *context, GLuint program, GLint location, GLint v0, GLint v1);
-bool ValidateProgramUniform3i(Context *context,
- GLuint program,
- GLint location,
- GLint v0,
- GLint v1,
- GLint v2);
-bool ValidateProgramUniform4i(Context *context,
- GLuint program,
- GLint location,
- GLint v0,
- GLint v1,
- GLint v2,
- GLint v3);
-bool ValidateProgramUniform1ui(Context *context, GLuint program, GLint location, GLuint v0);
-bool ValidateProgramUniform2ui(Context *context,
- GLuint program,
- GLint location,
- GLuint v0,
- GLuint v1);
-bool ValidateProgramUniform3ui(Context *context,
- GLuint program,
- GLint location,
- GLuint v0,
- GLuint v1,
- GLuint v2);
-bool ValidateProgramUniform4ui(Context *context,
- GLuint program,
- GLint location,
- GLuint v0,
- GLuint v1,
- GLuint v2,
- GLuint v3);
-bool ValidateProgramUniform1f(Context *context, GLuint program, GLint location, GLfloat v0);
-bool ValidateProgramUniform2f(Context *context,
- GLuint program,
- GLint location,
- GLfloat v0,
- GLfloat v1);
-bool ValidateProgramUniform3f(Context *context,
- GLuint program,
- GLint location,
- GLfloat v0,
- GLfloat v1,
- GLfloat v2);
-bool ValidateProgramUniform4f(Context *context,
- GLuint program,
- GLint location,
- GLfloat v0,
- GLfloat v1,
- GLfloat v2,
- GLfloat v3);
-
-bool ValidateProgramUniform1iv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLint *value);
-bool ValidateProgramUniform2iv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLint *value);
-bool ValidateProgramUniform3iv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLint *value);
-bool ValidateProgramUniform4iv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLint *value);
-bool ValidateProgramUniform1uiv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLuint *value);
-bool ValidateProgramUniform2uiv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLuint *value);
-bool ValidateProgramUniform3uiv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLuint *value);
-bool ValidateProgramUniform4uiv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLuint *value);
-bool ValidateProgramUniform1fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLfloat *value);
-bool ValidateProgramUniform2fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLfloat *value);
-bool ValidateProgramUniform3fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLfloat *value);
-bool ValidateProgramUniform4fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- const GLfloat *value);
-bool ValidateProgramUniformMatrix2fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-bool ValidateProgramUniformMatrix2fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-bool ValidateProgramUniformMatrix3fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-bool ValidateProgramUniformMatrix4fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-bool ValidateProgramUniformMatrix2x3fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-bool ValidateProgramUniformMatrix3x2fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-bool ValidateProgramUniformMatrix2x4fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-bool ValidateProgramUniformMatrix4x2fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-bool ValidateProgramUniformMatrix3x4fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-bool ValidateProgramUniformMatrix4x3fv(Context *context,
- GLuint program,
- GLint location,
- GLsizei count,
- GLboolean transpose,
- const GLfloat *value);
-
-bool ValidateFramebufferParameteri(Context *context, GLenum target, GLenum pname, GLint param);
-bool ValidateGetFramebufferParameteriv(Context *context,
- GLenum target,
- GLenum pname,
- GLint *params);
-
-bool ValidateGetProgramResourceIndex(Context *context,
- GLuint program,
- GLenum programInterface,
- const GLchar *name);
-bool ValidateGetProgramResourceName(Context *context,
- GLuint program,
- GLenum programInterface,
- GLuint index,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *name);
-bool ValidateGetProgramResourceLocation(Context *context,
- GLuint program,
- GLenum programInterface,
- const GLchar *name);
-
-bool ValidateGetProgramResourceiv(Context *context,
- GLuint program,
- GLenum programInterface,
- GLuint index,
- GLsizei propCount,
- const GLenum *props,
- GLsizei bufSize,
- GLsizei *length,
- GLint *params);
-
-bool ValidateGetProgramInterfaceiv(Context *context,
- GLuint program,
- GLenum programInterface,
- GLenum pname,
- GLint *params);
-
-bool ValidateBindVertexBuffer(ValidationContext *context,
- GLuint bindingIndex,
- GLuint buffer,
- GLintptr offset,
- GLsizei stride);
-bool ValidateVertexAttribFormat(ValidationContext *context,
- GLuint attribindex,
- GLint size,
- GLenum type,
- GLboolean normalized,
- GLuint relativeoffset);
-bool ValidateVertexAttribIFormat(ValidationContext *context,
- GLuint attribindex,
- GLint size,
- GLenum type,
- GLuint relativeoffset);
-bool ValidateVertexAttribBinding(ValidationContext *context,
- GLuint attribIndex,
- GLuint bindingIndex);
-bool ValidateVertexBindingDivisor(ValidationContext *context, GLuint bindingIndex, GLuint divisor);
-
-bool ValidateDispatchCompute(Context *context,
- GLuint numGroupsX,
- GLuint numGroupsY,
- GLuint numGroupsZ);
-bool ValidateDispatchComputeIndirect(Context *context, GLintptr indirect);
-
-bool ValidateBindImageTexture(Context *context,
- GLuint unit,
- GLuint texture,
- GLint level,
- GLboolean layered,
- GLint layer,
- GLenum access,
- GLenum format);
-
-bool ValidateGenProgramPipelines(Context *context, GLint n, GLuint *pipelines);
-bool ValidateDeleteProgramPipelines(Context *context, GLint n, const GLuint *pipelines);
-bool ValidateBindProgramPipeline(Context *context, GLuint pipeline);
-bool ValidateIsProgramPipeline(Context *context, GLuint pipeline);
-bool ValidateUseProgramStages(Context *context, GLuint pipeline, GLbitfield stages, GLuint program);
-bool ValidateActiveShaderProgram(Context *context, GLuint pipeline, GLuint program);
-bool ValidateCreateShaderProgramv(Context *context,
- GLenum type,
- GLsizei count,
- const GLchar *const *strings);
-bool ValidateGetProgramPipelineiv(Context *context, GLuint pipeline, GLenum pname, GLint *params);
-bool ValidateValidateProgramPipeline(Context *context, GLuint pipeline);
-bool ValidateGetProgramPipelineInfoLog(Context *context,
- GLuint pipeline,
- GLsizei bufSize,
- GLsizei *length,
- GLchar *infoLog);
-
-bool ValidateMemoryBarrier(Context *context, GLbitfield barriers);
-bool ValidateMemoryBarrierByRegion(Context *context, GLbitfield barriers);
-
-bool ValidateSampleMaski(Context *context, GLuint maskNumber, GLbitfield mask);
-
-} // namespace gl
-
-#endif // LIBANGLE_VALIDATION_ES31_H_