summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libANGLE/renderer/d3d
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/renderer/d3d')
-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
182 files changed, 0 insertions, 70447 deletions
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_