summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libANGLE
diff options
context:
space:
mode:
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_