summaryrefslogtreecommitdiff
path: root/chromium/third_party/angle/src/libANGLE/renderer
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2017-09-18 14:34:04 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2017-10-04 11:15:27 +0000
commite6430e577f105ad8813c92e75c54660c4985026e (patch)
tree88115e5d1fb471fea807111924dcccbeadbf9e4f /chromium/third_party/angle/src/libANGLE/renderer
parent53d399fe6415a96ea6986ec0d402a9c07da72453 (diff)
downloadqtwebengine-chromium-e6430e577f105ad8813c92e75c54660c4985026e.tar.gz
BASELINE: Update Chromium to 61.0.3163.99
Change-Id: I8452f34574d88ca2b27af9bd56fc9ff3f16b1367 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'chromium/third_party/angle/src/libANGLE/renderer')
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/BufferImpl.h17
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/BufferImpl_mock.h15
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/ContextImpl.h38
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/DisplayImpl.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/DisplayImpl.h9
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/Format.h4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/Format_ID_autogen.inl2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/Format_table_autogen.cpp252
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/FramebufferAttachmentObjectImpl.h3
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/FramebufferImpl.h37
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/FramebufferImpl_mock.h41
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/ImageImpl.h9
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/ImageImpl_mock.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/ProgramImpl.h20
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/ProgramImpl_mock.h7
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/RenderbufferImpl_mock.h7
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/SurfaceImpl.cpp4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/SurfaceImpl.h16
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/TextureImpl.cpp14
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/TextureImpl.h39
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/TextureImpl_mock.h50
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/TransformFeedbackImpl.h5
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/TransformFeedbackImpl_mock.h4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/VertexArrayImpl.h9
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/BufferD3D.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/DeviceD3D.cpp23
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/DisplayD3D.cpp44
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/DisplayD3D.h8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/DynamicHLSL.cpp155
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h15
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp15
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/EGLImageD3D.h11
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/FramebufferD3D.cpp73
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/FramebufferD3D.h32
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/HLSLCompiler.cpp7
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/ImageD3D.h47
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/IndexBuffer.cpp5
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/IndexDataManager.cpp5
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp120
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.h42
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.cpp17
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.h5
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.cpp147
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.h115
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp86
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.h31
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/SwapChainD3D.h25
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.cpp1706
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.h459
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureStorage.h36
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp14
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexBuffer.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexDataManager.cpp25
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexDataManager.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp854
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.h63
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp195
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h15
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp283
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.h32
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.cpp53
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.h35
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.cpp11
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp132
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h40
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Image11.cpp401
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Image11.h48
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp52
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.h7
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp210
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.h97
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp139
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.h34
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Query11.cpp107
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Query11.h7
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp473
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.h132
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp33
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.h12
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp1105
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.h177
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp409
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.h75
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp107
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h40
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp621
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.h128
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.cpp10
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp321
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h53
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp1214
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h294
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.cpp18
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.h5
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp44
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h17
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp56
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.h5
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h5
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp218
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h286
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/MultiplyAlpha.hlsl37
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_luma_ps.h77
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_lumaalpha_ps.h77
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_luma_ps.h82
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_lumaalpha_ps.h82
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/generate_shaders.bat4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp61
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.h15
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp24
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.h12
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.cpp43
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.h35
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.cpp6
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp60
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h19
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Image9.cpp86
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Image9.h32
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp17
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Query9.cpp13
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp305
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.h76
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/ShaderCache.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp17
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.h13
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp118
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h68
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp17
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp3
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gen_angle_format_table.py27
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/BlitGL.cpp29
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/BlitGL.h9
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/BufferGL.cpp14
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/BufferGL.h12
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.cpp62
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.h37
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/DisplayGL.cpp8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/FenceSyncGL.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/FramebufferGL.cpp256
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/FramebufferGL.h64
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/FunctionsGL.cpp9
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/FunctionsGL.h3
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.cpp47
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.h15
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/QueryGL.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/RenderbufferGL.cpp4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.cpp77
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.h23
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.cpp32
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.h7
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.cpp184
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.h43
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/SurfaceGL.cpp4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.cpp291
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.h48
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp5
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.h5
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.cpp267
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.h31
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/WorkaroundsGL.h14
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/DisplayCGL.h8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm22
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h10
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm24
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h10
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm10
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/DisplayEGL.cpp4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp16
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGLDL.cpp4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.cpp4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp20
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.h8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.cpp4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.cpp25
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.h8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.cpp24
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.h8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.cpp24
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.h10
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/formatutilsgl.cpp6
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp165
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/glx/DisplayGLX.h16
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp40
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h13
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/glx/SurfaceGLX.h1
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp51
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h13
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.cpp137
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.h32
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.cpp95
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.h18
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp125
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h18
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp286
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.h20
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp53
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h19
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/SurfaceWGL.h27
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp56
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h19
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/BufferNULL.cpp12
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/BufferNULL.h12
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.cpp35
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.h35
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/DeviceNULL.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/DisplayNULL.cpp9
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/DisplayNULL.h8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/FenceNVNULL.cpp6
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/FramebufferNULL.cpp31
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/FramebufferNULL.h30
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/ImageNULL.cpp6
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/ImageNULL.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/PathNULL.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/ProgramNULL.cpp15
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/ProgramNULL.h14
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/SurfaceNULL.cpp12
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/SurfaceNULL.h10
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.cpp34
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.h31
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/TransformFeedbackNULL.cpp4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/TransformFeedbackNULL.h5
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/VertexArrayNULL.cpp4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/VertexArrayNULL.h1
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.cpp26
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.h69
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/BufferVk.cpp31
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/BufferVk.h14
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.cpp58
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.h37
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/DeviceVk.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk.cpp18
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk.h8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/FenceNVVk.cpp6
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/FenceSyncVk.cpp8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.cpp106
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.h44
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/GlslangWrapper.cpp8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/GlslangWrapper.h10
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/ImageVk.cpp6
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/ImageVk.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/ProgramVk.cpp30
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/ProgramVk.h16
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/QueryVk.cpp16
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp11
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderbufferVk.h3
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.cpp26
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.h3
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.cpp60
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.h28
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp57
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.h34
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/TransformFeedbackVk.h5
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.h5
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/renderervk_utils.cpp8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/renderervk_utils.h32
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/xcb/DisplayVkXcb.cpp2
260 files changed, 10606 insertions, 7557 deletions
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/BufferImpl.h b/chromium/third_party/angle/src/libANGLE/renderer/BufferImpl.h
index 73afe37aeb2..5ca69ee17bb 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/BufferImpl.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/BufferImpl.h
@@ -18,41 +18,40 @@
namespace gl
{
class BufferState;
+class Context;
}
namespace rx
{
-class ContextImpl;
-
class BufferImpl : angle::NonCopyable
{
public:
BufferImpl(const gl::BufferState &state) : mState(state) {}
virtual ~BufferImpl() {}
- virtual void destroy(ContextImpl *contextImpl) {}
+ virtual void destroy(const gl::Context *context) {}
- virtual gl::Error setData(ContextImpl *context,
+ virtual gl::Error setData(const gl::Context *context,
GLenum target,
const void *data,
size_t size,
GLenum usage) = 0;
- virtual gl::Error setSubData(ContextImpl *context,
+ virtual gl::Error setSubData(const gl::Context *context,
GLenum target,
const void *data,
size_t size,
size_t offset) = 0;
- virtual gl::Error copySubData(ContextImpl *contextImpl,
+ virtual gl::Error copySubData(const gl::Context *context,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size) = 0;
- virtual gl::Error map(ContextImpl *contextImpl, GLenum access, void **mapPtr) = 0;
- virtual gl::Error mapRange(ContextImpl *contextImpl,
+ virtual gl::Error map(const gl::Context *context, GLenum access, void **mapPtr) = 0;
+ virtual gl::Error mapRange(const gl::Context *context,
size_t offset,
size_t length,
GLbitfield access,
void **mapPtr) = 0;
- virtual gl::Error unmap(ContextImpl *contextImpl, GLboolean *result) = 0;
+ virtual gl::Error unmap(const gl::Context *context, GLboolean *result) = 0;
virtual gl::Error getIndexRange(GLenum type,
size_t offset,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/BufferImpl_mock.h b/chromium/third_party/angle/src/libANGLE/renderer/BufferImpl_mock.h
index 16a6c1f19a2..68249e569f9 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/BufferImpl_mock.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/BufferImpl_mock.h
@@ -22,14 +22,15 @@ class MockBufferImpl : public BufferImpl
MockBufferImpl() : BufferImpl(mMockState) {}
~MockBufferImpl() { destructor(); }
- MOCK_METHOD5(setData, gl::Error(ContextImpl *, GLenum, const void *, size_t, GLenum));
- MOCK_METHOD5(setSubData, gl::Error(ContextImpl *, GLenum, const void *, size_t, size_t));
- MOCK_METHOD5(copySubData,
- gl::Error(ContextImpl *contextImpl, BufferImpl *, GLintptr, GLintptr, GLsizeiptr));
- MOCK_METHOD3(map, gl::Error(ContextImpl *contextImpl, GLenum, void **));
+ MOCK_METHOD5(setData, gl::Error(const gl::Context *, GLenum, const void *, size_t, GLenum));
+ MOCK_METHOD5(setSubData, gl::Error(const gl::Context *, GLenum, const void *, size_t, size_t));
+ MOCK_METHOD5(
+ copySubData,
+ gl::Error(const gl::Context *contextImpl, BufferImpl *, GLintptr, GLintptr, GLsizeiptr));
+ MOCK_METHOD3(map, gl::Error(const gl::Context *contextImpl, GLenum, void **));
MOCK_METHOD5(mapRange,
- gl::Error(ContextImpl *contextImpl, size_t, size_t, GLbitfield, void **));
- MOCK_METHOD2(unmap, gl::Error(ContextImpl *contextImpl, GLboolean *result));
+ gl::Error(const gl::Context *contextImpl, size_t, size_t, GLbitfield, void **));
+ MOCK_METHOD2(unmap, gl::Error(const gl::Context *contextImpl, GLboolean *result));
MOCK_METHOD5(getIndexRange, gl::Error(GLenum, size_t, size_t, bool, gl::IndexRange *));
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/ContextImpl.h b/chromium/third_party/angle/src/libANGLE/renderer/ContextImpl.h
index b5f1be95fac..472caeda27d 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/ContextImpl.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/ContextImpl.h
@@ -19,6 +19,7 @@
namespace gl
{
class Path;
+struct Workarounds;
}
namespace rx
@@ -36,24 +37,31 @@ class ContextImpl : public GLImplFactory
virtual gl::Error finish() = 0;
// Drawing methods.
- virtual gl::Error drawArrays(GLenum mode, GLint first, GLsizei count) = 0;
- virtual gl::Error drawArraysInstanced(GLenum mode,
+ virtual gl::Error drawArrays(const gl::Context *context,
+ GLenum mode,
+ GLint first,
+ GLsizei count) = 0;
+ virtual gl::Error drawArraysInstanced(const gl::Context *context,
+ GLenum mode,
GLint first,
GLsizei count,
GLsizei instanceCount) = 0;
- virtual gl::Error drawElements(GLenum mode,
+ virtual gl::Error drawElements(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
const gl::IndexRange &indexRange) = 0;
- virtual gl::Error drawElementsInstanced(GLenum mode,
+ virtual gl::Error drawElementsInstanced(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
GLsizei instances,
const gl::IndexRange &indexRange) = 0;
- virtual gl::Error drawRangeElements(GLenum mode,
+ virtual gl::Error drawRangeElements(const gl::Context *context,
+ GLenum mode,
GLuint start,
GLuint end,
GLsizei count,
@@ -61,8 +69,13 @@ class ContextImpl : public GLImplFactory
const void *indices,
const gl::IndexRange &indexRange) = 0;
- virtual gl::Error drawArraysIndirect(GLenum mode, const void *indirect) = 0;
- virtual gl::Error drawElementsIndirect(GLenum mode, GLenum type, const void *indirect) = 0;
+ virtual gl::Error drawArraysIndirect(const gl::Context *context,
+ GLenum mode,
+ const void *indirect) = 0;
+ virtual gl::Error drawElementsIndirect(const gl::Context *context,
+ GLenum mode,
+ GLenum type,
+ const void *indirect) = 0;
// CHROMIUM_path_rendering path drawing methods.
virtual void stencilFillPath(const gl::Path *path, GLenum fillMode, GLuint mask);
@@ -123,14 +136,14 @@ class ContextImpl : public GLImplFactory
virtual void popGroupMarker() = 0;
// State sync with dirty bits.
- virtual void syncState(const gl::State::DirtyBits &dirtyBits) = 0;
+ virtual void syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits) = 0;
// Disjoint timer queries
virtual GLint getGPUDisjoint() = 0;
virtual GLint64 getTimestamp() = 0;
// Context switching
- virtual void onMakeCurrent(const gl::ContextState &data) = 0;
+ virtual void onMakeCurrent(const gl::Context *context) = 0;
// Native capabilities, unmodified by gl::Context.
virtual const gl::Caps &getNativeCaps() const = 0;
@@ -138,7 +151,12 @@ class ContextImpl : public GLImplFactory
virtual const gl::Extensions &getNativeExtensions() const = 0;
virtual const gl::Limitations &getNativeLimitations() const = 0;
- virtual gl::Error dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ) = 0;
+ virtual void applyNativeWorkarounds(gl::Workarounds *workarounds) const {}
+
+ virtual gl::Error dispatchCompute(const gl::Context *context,
+ GLuint numGroupsX,
+ GLuint numGroupsY,
+ GLuint numGroupsZ) = 0;
const gl::ContextState &getContextState() { return mState; }
int getClientMajorVersion() const { return mState.getClientMajorVersion(); }
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/DisplayImpl.cpp b/chromium/third_party/angle/src/libANGLE/renderer/DisplayImpl.cpp
index 080af37c7f9..5cc9da96dc1 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/DisplayImpl.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/DisplayImpl.cpp
@@ -41,7 +41,7 @@ egl::Error DisplayImpl::validateClientBuffer(const egl::Config *configuration,
const egl::AttributeMap &attribs) const
{
UNREACHABLE();
- return egl::Error(EGL_BAD_DISPLAY, "DisplayImpl::validateClientBuffer unimplemented.");
+ return egl::EglBadDisplay() << "DisplayImpl::validateClientBuffer unimplemented.";
}
const egl::Caps &DisplayImpl::getCaps() const
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/DisplayImpl.h b/chromium/third_party/angle/src/libANGLE/renderer/DisplayImpl.h
index 0b36758149e..5089a7d9841 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/DisplayImpl.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/DisplayImpl.h
@@ -28,6 +28,7 @@ struct DisplayState;
struct Config;
class Surface;
class ImageSibling;
+class Thread;
}
namespace gl
@@ -57,7 +58,7 @@ class DisplayImpl : public EGLImplFactory
virtual egl::ConfigSet generateConfigs() = 0;
virtual bool testDeviceLost() = 0;
- virtual egl::Error restoreLostDevice() = 0;
+ virtual egl::Error restoreLostDevice(const egl::Display *display) = 0;
virtual bool isValidNativeWindow(EGLNativeWindowType window) const = 0;
virtual egl::Error validateClientBuffer(const egl::Config *configuration,
@@ -69,10 +70,8 @@ class DisplayImpl : public EGLImplFactory
virtual egl::Error getDevice(DeviceImpl **device) = 0;
- virtual egl::Error waitClient() const = 0;
- virtual egl::Error waitNative(EGLint engine,
- egl::Surface *drawSurface,
- egl::Surface *readSurface) const = 0;
+ virtual egl::Error waitClient(const gl::Context *context) const = 0;
+ virtual egl::Error waitNative(const gl::Context *context, EGLint engine) const = 0;
virtual gl::Version getMaxSupportedESVersion() const = 0;
const egl::Caps &getCaps() const;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/Format.h b/chromium/third_party/angle/src/libANGLE/renderer/Format.h
index cc868835083..bf4f0d0b410 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/Format.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/Format.h
@@ -28,6 +28,7 @@ struct Format final : private angle::NonCopyable
rx::MipGenerationFunction mipGen,
const rx::FastCopyFunctionMap &fastCopyFunctions,
rx::ColorReadFunction colorRead,
+ rx::ColorWriteFunction colorWrite,
GLenum componentType,
GLuint redBits,
GLuint greenBits,
@@ -51,6 +52,7 @@ struct Format final : private angle::NonCopyable
rx::MipGenerationFunction mipGenerationFunction;
rx::ColorReadFunction colorReadFunction;
+ rx::ColorWriteFunction colorWriteFunction;
// A map from a gl::FormatType to a fast pixel copy function for this format.
const rx::FastCopyFunctionMap &fastCopyFunctions;
@@ -71,6 +73,7 @@ constexpr Format::Format(ID id,
rx::MipGenerationFunction mipGen,
const rx::FastCopyFunctionMap &fastCopyFunctions,
rx::ColorReadFunction colorRead,
+ rx::ColorWriteFunction colorWrite,
GLenum componentType,
GLuint redBits,
GLuint greenBits,
@@ -83,6 +86,7 @@ constexpr Format::Format(ID id,
fboImplementationInternalFormat(fboFormat),
mipGenerationFunction(mipGen),
colorReadFunction(colorRead),
+ colorWriteFunction(colorWrite),
fastCopyFunctions(fastCopyFunctions),
componentType(componentType),
redBits(redBits),
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/Format_ID_autogen.inl b/chromium/third_party/angle/src/libANGLE/renderer/Format_ID_autogen.inl
index 5c01b500f5c..7e829695c2d 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/Format_ID_autogen.inl
+++ b/chromium/third_party/angle/src/libANGLE/renderer/Format_ID_autogen.inl
@@ -1,7 +1,7 @@
// GENERATED FILE - DO NOT EDIT.
// Generated by gen_angle_format_table.py using data from angle_format_data.json
//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
+// 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.
//
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/Format_table_autogen.cpp b/chromium/third_party/angle/src/libANGLE/renderer/Format_table_autogen.cpp
index 13b46f3374e..3c5aced6bab 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/Format_table_autogen.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/Format_table_autogen.cpp
@@ -1,7 +1,7 @@
// GENERATED FILE - DO NOT EDIT.
// Generated by gen_angle_format_table.py using data from angle_format_data.json
//
-// Copyright 2016 The ANGLE Project Authors. All rights reserved.
+// 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.
//
@@ -24,131 +24,131 @@ static constexpr rx::FastCopyFunctionMap NoCopyFunctions;
constexpr Format g_formatInfoTable[] = {
// clang-format off
- { Format::ID::NONE, GL_NONE, GL_NONE, nullptr, NoCopyFunctions, nullptr, GL_NONE, 0, 0, 0, 0, 0, 0 },
- { Format::ID::A16_FLOAT, GL_ALPHA16F_EXT, GL_ALPHA16F_EXT, GenerateMip<A16F>, NoCopyFunctions, ReadColor<A16F, GLfloat>, GL_FLOAT, 0, 0, 0, 16, 0, 0 },
- { Format::ID::A32_FLOAT, GL_ALPHA32F_EXT, GL_ALPHA32F_EXT, GenerateMip<A32F>, NoCopyFunctions, ReadColor<A32F, GLfloat>, GL_FLOAT, 0, 0, 0, 32, 0, 0 },
- { Format::ID::A8_UNORM, GL_ALPHA8_EXT, GL_ALPHA8_EXT, GenerateMip<A8>, NoCopyFunctions, ReadColor<A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 8, 0, 0 },
- { Format::ID::ASTC_10x10_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_10x10_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_10x10_KHR, GL_COMPRESSED_RGBA_ASTC_10x10_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_10x5_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_10x5_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_10x5_KHR, GL_COMPRESSED_RGBA_ASTC_10x5_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_10x6_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_10x6_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_10x6_KHR, GL_COMPRESSED_RGBA_ASTC_10x6_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_10x8_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_10x8_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_10x8_KHR, GL_COMPRESSED_RGBA_ASTC_10x8_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_12x10_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_12x10_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_12x10_KHR, GL_COMPRESSED_RGBA_ASTC_12x10_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_12x12_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_12x12_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_12x12_KHR, GL_COMPRESSED_RGBA_ASTC_12x12_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_4x4_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_4x4_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_4x4_KHR, GL_COMPRESSED_RGBA_ASTC_4x4_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_5x4_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_5x4_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_5x4_KHR, GL_COMPRESSED_RGBA_ASTC_5x4_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_5x5_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_5x5_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_5x5_KHR, GL_COMPRESSED_RGBA_ASTC_5x5_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_6x5_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_6x5_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_6x5_KHR, GL_COMPRESSED_RGBA_ASTC_6x5_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_6x6_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_6x6_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_6x6_KHR, GL_COMPRESSED_RGBA_ASTC_6x6_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_8x5_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_8x5_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_8x5_KHR, GL_COMPRESSED_RGBA_ASTC_8x5_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_8x6_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_8x6_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_8x6_KHR, GL_COMPRESSED_RGBA_ASTC_8x6_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_8x8_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::ASTC_8x8_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_8x8_KHR, GL_COMPRESSED_RGBA_ASTC_8x8_KHR, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::B4G4R4A4_UNORM, GL_BGRA4_ANGLEX, GL_RGBA4, GenerateMip<A4R4G4B4>, NoCopyFunctions, ReadColor<A4R4G4B4, GLfloat>, GL_UNSIGNED_NORMALIZED, 4, 4, 4, 4, 0, 0 },
- { Format::ID::B5G5R5A1_UNORM, GL_BGR5_A1_ANGLEX, GL_RGB5_A1, GenerateMip<A1R5G5B5>, NoCopyFunctions, ReadColor<A1R5G5B5, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 5, 5, 1, 0, 0 },
- { Format::ID::B5G6R5_UNORM, GL_BGR565_ANGLEX, GL_RGB565, GenerateMip<B5G6R5>, NoCopyFunctions, ReadColor<B5G6R5, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 6, 5, 0, 0, 0 },
- { Format::ID::B8G8R8A8_UNORM, GL_BGRA8_EXT, GL_BGRA8_EXT, GenerateMip<B8G8R8A8>, BGRACopyFunctions, ReadColor<B8G8R8A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
- { Format::ID::B8G8R8X8_UNORM, GL_BGRA8_EXT, GL_BGRA8_EXT, GenerateMip<B8G8R8X8>, NoCopyFunctions, ReadColor<B8G8R8X8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
- { Format::ID::BC1_RGBA_UNORM_BLOCK, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::BC1_RGBA_UNORM_SRGB_BLOCK, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::BC1_RGB_UNORM_BLOCK, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::BC1_RGB_UNORM_SRGB_BLOCK, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::BC2_RGBA_UNORM_BLOCK, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::BC2_RGBA_UNORM_SRGB_BLOCK, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::BC3_RGBA_UNORM_BLOCK, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::BC3_RGBA_UNORM_SRGB_BLOCK, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::D16_UNORM, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT16, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 16, 0 },
- { Format::ID::D24_UNORM, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT24, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 24, 0 },
- { Format::ID::D24_UNORM_S8_UINT, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 24, 8 },
- { Format::ID::D32_FLOAT, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT32F, nullptr, NoCopyFunctions, nullptr, GL_FLOAT, 0, 0, 0, 0, 32, 0 },
- { Format::ID::D32_FLOAT_S8X24_UINT, GL_DEPTH32F_STENCIL8, GL_DEPTH32F_STENCIL8, nullptr, NoCopyFunctions, nullptr, GL_FLOAT, 0, 0, 0, 0, 32, 8 },
- { Format::ID::D32_UNORM, GL_DEPTH_COMPONENT32_OES, GL_DEPTH_COMPONENT32_OES, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 32, 0 },
- { Format::ID::EAC_R11G11_SNORM_BLOCK, GL_COMPRESSED_SIGNED_RG11_EAC, GL_COMPRESSED_SIGNED_RG11_EAC, nullptr, NoCopyFunctions, nullptr, GL_SIGNED_NORMALIZED, 11, 11, 0, 0, 0, 0 },
- { Format::ID::EAC_R11G11_UNORM_BLOCK, GL_COMPRESSED_RG11_EAC, GL_COMPRESSED_RG11_EAC, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 11, 11, 0, 0, 0, 0 },
- { Format::ID::EAC_R11_SNORM_BLOCK, GL_COMPRESSED_SIGNED_R11_EAC, GL_COMPRESSED_SIGNED_R11_EAC, nullptr, NoCopyFunctions, nullptr, GL_SIGNED_NORMALIZED, 11, 0, 0, 0, 0, 0 },
- { Format::ID::EAC_R11_UNORM_BLOCK, GL_COMPRESSED_R11_EAC, GL_COMPRESSED_R11_EAC, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 11, 0, 0, 0, 0, 0 },
- { Format::ID::ETC2_R8G8B8A1_SRGB_BLOCK, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 1, 0, 0 },
- { Format::ID::ETC2_R8G8B8A1_UNORM_BLOCK, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 1, 0, 0 },
- { Format::ID::ETC2_R8G8B8A8_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
- { Format::ID::ETC2_R8G8B8A8_UNORM_BLOCK, GL_COMPRESSED_RGBA8_ETC2_EAC, GL_COMPRESSED_RGBA8_ETC2_EAC, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
- { Format::ID::ETC2_R8G8B8_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ETC2, GL_COMPRESSED_SRGB8_ETC2, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
- { Format::ID::ETC2_R8G8B8_UNORM_BLOCK, GL_COMPRESSED_RGB8_ETC2, GL_COMPRESSED_RGB8_ETC2, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
- { Format::ID::L16A16_FLOAT, GL_LUMINANCE_ALPHA16F_EXT, GL_LUMINANCE_ALPHA16F_EXT, GenerateMip<L16A16F>, NoCopyFunctions, ReadColor<L16A16F, GLfloat>, GL_FLOAT, 0, 0, 0, 16, 0, 0 },
- { Format::ID::L16_FLOAT, GL_LUMINANCE16F_EXT, GL_LUMINANCE16F_EXT, GenerateMip<L16F>, NoCopyFunctions, ReadColor<L16F, GLfloat>, GL_FLOAT, 0, 0, 0, 0, 0, 0 },
- { Format::ID::L32A32_FLOAT, GL_LUMINANCE_ALPHA32F_EXT, GL_LUMINANCE_ALPHA32F_EXT, GenerateMip<L32A32F>, NoCopyFunctions, ReadColor<L32A32F, GLfloat>, GL_FLOAT, 0, 0, 0, 32, 0, 0 },
- { Format::ID::L32_FLOAT, GL_LUMINANCE32F_EXT, GL_LUMINANCE32F_EXT, GenerateMip<L32F>, NoCopyFunctions, ReadColor<L32F, GLfloat>, GL_FLOAT, 0, 0, 0, 0, 0, 0 },
- { Format::ID::L8A8_UNORM, GL_LUMINANCE8_ALPHA8_EXT, GL_LUMINANCE8_ALPHA8_EXT, GenerateMip<L8A8>, NoCopyFunctions, ReadColor<L8A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 8, 0, 0 },
- { Format::ID::L8_UNORM, GL_LUMINANCE8_EXT, GL_LUMINANCE8_EXT, GenerateMip<L8>, NoCopyFunctions, ReadColor<L8, GLfloat>, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
- { Format::ID::R10G10B10A2_UINT, GL_RGB10_A2UI, GL_RGB10_A2UI, GenerateMip<R10G10B10A2>, NoCopyFunctions, ReadColor<R10G10B10A2, GLuint>, GL_UNSIGNED_INT, 10, 10, 10, 2, 0, 0 },
- { Format::ID::R10G10B10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, GenerateMip<R10G10B10A2>, NoCopyFunctions, ReadColor<R10G10B10A2, GLfloat>, GL_UNSIGNED_NORMALIZED, 10, 10, 10, 2, 0, 0 },
- { Format::ID::R11G11B10_FLOAT, GL_R11F_G11F_B10F, GL_R11F_G11F_B10F, GenerateMip<R11G11B10F>, NoCopyFunctions, ReadColor<R11G11B10F, GLfloat>, GL_FLOAT, 11, 11, 10, 0, 0, 0 },
- { Format::ID::R16G16B16A16_FLOAT, GL_RGBA16F, GL_RGBA16F, GenerateMip<R16G16B16A16F>, NoCopyFunctions, ReadColor<R16G16B16A16F, GLfloat>, GL_FLOAT, 16, 16, 16, 16, 0, 0 },
- { Format::ID::R16G16B16A16_SINT, GL_RGBA16I, GL_RGBA16I, GenerateMip<R16G16B16A16S>, NoCopyFunctions, ReadColor<R16G16B16A16S, GLint>, GL_INT, 16, 16, 16, 16, 0, 0 },
- { Format::ID::R16G16B16A16_SNORM, GL_RGBA16_SNORM_EXT, GL_RGBA16_SNORM_EXT, GenerateMip<R16G16B16A16S>, NoCopyFunctions, ReadColor<R16G16B16A16S, GLfloat>, GL_SIGNED_NORMALIZED, 16, 16, 16, 16, 0, 0 },
- { Format::ID::R16G16B16A16_UINT, GL_RGBA16UI, GL_RGBA16UI, GenerateMip<R16G16B16A16>, NoCopyFunctions, ReadColor<R16G16B16A16, GLuint>, GL_UNSIGNED_INT, 16, 16, 16, 16, 0, 0 },
- { Format::ID::R16G16B16A16_UNORM, GL_RGBA16_EXT, GL_RGBA16_EXT, GenerateMip<R16G16B16A16>, NoCopyFunctions, ReadColor<R16G16B16A16, GLfloat>, GL_UNSIGNED_NORMALIZED, 16, 16, 16, 16, 0, 0 },
- { Format::ID::R16G16B16_FLOAT, GL_RGB16F, GL_RGB16F, GenerateMip<R16G16B16F>, NoCopyFunctions, ReadColor<R16G16B16F, GLfloat>, GL_FLOAT, 16, 16, 16, 0, 0, 0 },
- { Format::ID::R16G16B16_SINT, GL_RGB16I, GL_RGB16I, GenerateMip<R16G16B16S>, NoCopyFunctions, ReadColor<R16G16B16S, GLint>, GL_INT, 16, 16, 16, 0, 0, 0 },
- { Format::ID::R16G16B16_SNORM, GL_RGB16_SNORM_EXT, GL_RGB16_SNORM_EXT, GenerateMip<R16G16B16S>, NoCopyFunctions, ReadColor<R16G16B16S, GLfloat>, GL_SIGNED_NORMALIZED, 16, 16, 16, 0, 0, 0 },
- { Format::ID::R16G16B16_UINT, GL_RGB16UI, GL_RGB16UI, GenerateMip<R16G16B16>, NoCopyFunctions, ReadColor<R16G16B16, GLuint>, GL_UNSIGNED_INT, 16, 16, 16, 0, 0, 0 },
- { Format::ID::R16G16B16_UNORM, GL_RGB16_EXT, GL_RGB16_EXT, GenerateMip<R16G16B16>, NoCopyFunctions, ReadColor<R16G16B16, GLfloat>, GL_UNSIGNED_NORMALIZED, 16, 16, 16, 0, 0, 0 },
- { Format::ID::R16G16_FLOAT, GL_RG16F, GL_RG16F, GenerateMip<R16G16F>, NoCopyFunctions, ReadColor<R16G16F, GLfloat>, GL_FLOAT, 16, 16, 0, 0, 0, 0 },
- { Format::ID::R16G16_SINT, GL_RG16I, GL_RG16I, GenerateMip<R16G16S>, NoCopyFunctions, ReadColor<R16G16S, GLint>, GL_INT, 16, 16, 0, 0, 0, 0 },
- { Format::ID::R16G16_SNORM, GL_RG16_SNORM_EXT, GL_RG16_SNORM_EXT, GenerateMip<R16G16S>, NoCopyFunctions, ReadColor<R16G16S, GLfloat>, GL_SIGNED_NORMALIZED, 16, 16, 0, 0, 0, 0 },
- { Format::ID::R16G16_UINT, GL_RG16UI, GL_RG16UI, GenerateMip<R16G16>, NoCopyFunctions, ReadColor<R16G16, GLuint>, GL_UNSIGNED_INT, 16, 16, 0, 0, 0, 0 },
- { Format::ID::R16G16_UNORM, GL_RG16_EXT, GL_RG16_EXT, GenerateMip<R16G16>, NoCopyFunctions, ReadColor<R16G16, GLfloat>, GL_UNSIGNED_NORMALIZED, 16, 16, 0, 0, 0, 0 },
- { Format::ID::R16_FLOAT, GL_R16F, GL_R16F, GenerateMip<R16F>, NoCopyFunctions, ReadColor<R16F, GLfloat>, GL_FLOAT, 16, 0, 0, 0, 0, 0 },
- { Format::ID::R16_SINT, GL_R16I, GL_R16I, GenerateMip<R16S>, NoCopyFunctions, ReadColor<R16S, GLint>, GL_INT, 16, 0, 0, 0, 0, 0 },
- { Format::ID::R16_SNORM, GL_R16_SNORM_EXT, GL_R16_SNORM_EXT, GenerateMip<R16S>, NoCopyFunctions, ReadColor<R16S, GLfloat>, GL_SIGNED_NORMALIZED, 16, 0, 0, 0, 0, 0 },
- { Format::ID::R16_UINT, GL_R16UI, GL_R16UI, GenerateMip<R16>, NoCopyFunctions, ReadColor<R16, GLuint>, GL_UNSIGNED_INT, 16, 0, 0, 0, 0, 0 },
- { Format::ID::R16_UNORM, GL_R16_EXT, GL_R16_EXT, GenerateMip<R16>, NoCopyFunctions, ReadColor<R16, GLfloat>, GL_UNSIGNED_NORMALIZED, 16, 0, 0, 0, 0, 0 },
- { Format::ID::R32G32B32A32_FLOAT, GL_RGBA32F, GL_RGBA32F, GenerateMip<R32G32B32A32F>, NoCopyFunctions, ReadColor<R32G32B32A32F, GLfloat>, GL_FLOAT, 32, 32, 32, 32, 0, 0 },
- { Format::ID::R32G32B32A32_SINT, GL_RGBA32I, GL_RGBA32I, GenerateMip<R32G32B32A32S>, NoCopyFunctions, ReadColor<R32G32B32A32S, GLint>, GL_INT, 32, 32, 32, 32, 0, 0 },
- { Format::ID::R32G32B32A32_UINT, GL_RGBA32UI, GL_RGBA32UI, GenerateMip<R32G32B32A32>, NoCopyFunctions, ReadColor<R32G32B32A32, GLuint>, GL_UNSIGNED_INT, 32, 32, 32, 32, 0, 0 },
- { Format::ID::R32G32B32_FLOAT, GL_RGB32F, GL_RGB32F, GenerateMip<R32G32B32F>, NoCopyFunctions, ReadColor<R32G32B32F, GLfloat>, GL_FLOAT, 32, 32, 32, 0, 0, 0 },
- { Format::ID::R32G32B32_SINT, GL_RGB32I, GL_RGB32I, GenerateMip<R32G32B32S>, NoCopyFunctions, ReadColor<R32G32B32S, GLint>, GL_INT, 32, 32, 32, 0, 0, 0 },
- { Format::ID::R32G32B32_UINT, GL_RGB32UI, GL_RGB32UI, GenerateMip<R32G32B32>, NoCopyFunctions, ReadColor<R32G32B32, GLuint>, GL_UNSIGNED_INT, 32, 32, 32, 0, 0, 0 },
- { Format::ID::R32G32_FLOAT, GL_RG32F, GL_RG32F, GenerateMip<R32G32F>, NoCopyFunctions, ReadColor<R32G32F, GLfloat>, GL_FLOAT, 32, 32, 0, 0, 0, 0 },
- { Format::ID::R32G32_SINT, GL_RG32I, GL_RG32I, GenerateMip<R32G32S>, NoCopyFunctions, ReadColor<R32G32S, GLint>, GL_INT, 32, 32, 0, 0, 0, 0 },
- { Format::ID::R32G32_UINT, GL_RG32UI, GL_RG32UI, GenerateMip<R32G32>, NoCopyFunctions, ReadColor<R32G32, GLuint>, GL_UNSIGNED_INT, 32, 32, 0, 0, 0, 0 },
- { Format::ID::R32_FLOAT, GL_R32F, GL_R32F, GenerateMip<R32F>, NoCopyFunctions, ReadColor<R32F, GLfloat>, GL_FLOAT, 32, 0, 0, 0, 0, 0 },
- { Format::ID::R32_SINT, GL_R32I, GL_R32I, GenerateMip<R32S>, NoCopyFunctions, ReadColor<R32S, GLint>, GL_INT, 32, 0, 0, 0, 0, 0 },
- { Format::ID::R32_UINT, GL_R32UI, GL_R32UI, GenerateMip<R32>, NoCopyFunctions, ReadColor<R32, GLuint>, GL_UNSIGNED_INT, 32, 0, 0, 0, 0, 0 },
- { Format::ID::R4G4B4A4_UNORM, GL_RGBA4, GL_RGBA4, GenerateMip<R4G4B4A4>, NoCopyFunctions, ReadColor<R4G4B4A4, GLfloat>, GL_UNSIGNED_NORMALIZED, 4, 4, 4, 4, 0, 0 },
- { Format::ID::R5G5B5A1_UNORM, GL_RGB5_A1, GL_RGB5_A1, GenerateMip<R5G5B5A1>, NoCopyFunctions, ReadColor<R5G5B5A1, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 5, 5, 1, 0, 0 },
- { Format::ID::R5G6B5_UNORM, GL_RGB565, GL_RGB565, GenerateMip<R5G6B5>, NoCopyFunctions, ReadColor<R5G6B5, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 6, 5, 0, 0, 0 },
- { Format::ID::R8G8B8A8_SINT, GL_RGBA8I, GL_RGBA8I, GenerateMip<R8G8B8A8S>, NoCopyFunctions, ReadColor<R8G8B8A8S, GLint>, GL_INT, 8, 8, 8, 8, 0, 0 },
- { Format::ID::R8G8B8A8_SNORM, GL_RGBA8_SNORM, GL_RGBA8_SNORM, GenerateMip<R8G8B8A8S>, NoCopyFunctions, ReadColor<R8G8B8A8S, GLfloat>, GL_SIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
- { Format::ID::R8G8B8A8_UINT, GL_RGBA8UI, GL_RGBA8UI, GenerateMip<R8G8B8A8>, NoCopyFunctions, ReadColor<R8G8B8A8, GLuint>, GL_UNSIGNED_INT, 8, 8, 8, 8, 0, 0 },
- { Format::ID::R8G8B8A8_UNORM, GL_RGBA8, GL_RGBA8, GenerateMip<R8G8B8A8>, NoCopyFunctions, ReadColor<R8G8B8A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
- { Format::ID::R8G8B8A8_UNORM_SRGB, GL_SRGB8_ALPHA8, GL_SRGB8_ALPHA8, GenerateMip<R8G8B8A8SRGB>, NoCopyFunctions, ReadColor<R8G8B8A8SRGB, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
- { Format::ID::R8G8B8_SINT, GL_RGB8I, GL_RGB8I, GenerateMip<R8G8B8S>, NoCopyFunctions, ReadColor<R8G8B8S, GLint>, GL_INT, 8, 8, 8, 0, 0, 0 },
- { Format::ID::R8G8B8_SNORM, GL_RGB8_SNORM, GL_RGB8_SNORM, GenerateMip<R8G8B8S>, NoCopyFunctions, ReadColor<R8G8B8S, GLfloat>, GL_SIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
- { Format::ID::R8G8B8_UINT, GL_RGB8UI, GL_RGB8UI, GenerateMip<R8G8B8>, NoCopyFunctions, ReadColor<R8G8B8, GLuint>, GL_UNSIGNED_INT, 8, 8, 8, 0, 0, 0 },
- { Format::ID::R8G8B8_UNORM, GL_RGB8, GL_RGB8, GenerateMip<R8G8B8>, NoCopyFunctions, ReadColor<R8G8B8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
- { Format::ID::R8G8B8_UNORM_SRGB, GL_SRGB8, GL_SRGB8, GenerateMip<R8G8B8>, NoCopyFunctions, ReadColor<R8G8B8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
- { Format::ID::R8G8_SINT, GL_RG8I, GL_RG8I, GenerateMip<R8G8S>, NoCopyFunctions, ReadColor<R8G8S, GLint>, GL_INT, 8, 8, 0, 0, 0, 0 },
- { Format::ID::R8G8_SNORM, GL_RG8_SNORM, GL_RG8_SNORM, GenerateMip<R8G8S>, NoCopyFunctions, ReadColor<R8G8S, GLfloat>, GL_SIGNED_NORMALIZED, 8, 8, 0, 0, 0, 0 },
- { Format::ID::R8G8_UINT, GL_RG8UI, GL_RG8UI, GenerateMip<R8G8>, NoCopyFunctions, ReadColor<R8G8, GLuint>, GL_UNSIGNED_INT, 8, 8, 0, 0, 0, 0 },
- { Format::ID::R8G8_UNORM, GL_RG8, GL_RG8, GenerateMip<R8G8>, NoCopyFunctions, ReadColor<R8G8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 0, 0, 0, 0 },
- { Format::ID::R8_SINT, GL_R8I, GL_R8I, GenerateMip<R8S>, NoCopyFunctions, ReadColor<R8S, GLint>, GL_INT, 8, 0, 0, 0, 0, 0 },
- { Format::ID::R8_SNORM, GL_R8_SNORM, GL_R8_SNORM, GenerateMip<R8S>, NoCopyFunctions, ReadColor<R8S, GLfloat>, GL_SIGNED_NORMALIZED, 8, 0, 0, 0, 0, 0 },
- { Format::ID::R8_UINT, GL_R8UI, GL_R8UI, GenerateMip<R8>, NoCopyFunctions, ReadColor<R8, GLuint>, GL_UNSIGNED_INT, 8, 0, 0, 0, 0, 0 },
- { Format::ID::R8_UNORM, GL_R8, GL_R8, GenerateMip<R8>, NoCopyFunctions, ReadColor<R8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 0, 0, 0, 0, 0 },
- { Format::ID::R9G9B9E5_SHAREDEXP, GL_RGB9_E5, GL_RGB9_E5, GenerateMip<R9G9B9E5>, NoCopyFunctions, ReadColor<R9G9B9E5, GLfloat>, GL_FLOAT, 9, 9, 9, 0, 0, 0 },
- { Format::ID::S8_UINT, GL_STENCIL_INDEX8, GL_STENCIL_INDEX8, nullptr, NoCopyFunctions, nullptr, GL_UNSIGNED_INT, 0, 0, 0, 0, 0, 8 },
+ { Format::ID::NONE, GL_NONE, GL_NONE, nullptr, NoCopyFunctions, nullptr, nullptr, GL_NONE, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::A16_FLOAT, GL_ALPHA16F_EXT, GL_ALPHA16F_EXT, GenerateMip<A16F>, NoCopyFunctions, ReadColor<A16F, GLfloat>, WriteColor<A16F, GLfloat>, GL_FLOAT, 0, 0, 0, 16, 0, 0 },
+ { Format::ID::A32_FLOAT, GL_ALPHA32F_EXT, GL_ALPHA32F_EXT, GenerateMip<A32F>, NoCopyFunctions, ReadColor<A32F, GLfloat>, WriteColor<A32F, GLfloat>, GL_FLOAT, 0, 0, 0, 32, 0, 0 },
+ { Format::ID::A8_UNORM, GL_ALPHA8_EXT, GL_ALPHA8_EXT, GenerateMip<A8>, NoCopyFunctions, ReadColor<A8, GLfloat>, WriteColor<A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 8, 0, 0 },
+ { Format::ID::ASTC_10x10_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_10x10_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_10x10_KHR, GL_COMPRESSED_RGBA_ASTC_10x10_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_10x5_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_10x5_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_10x5_KHR, GL_COMPRESSED_RGBA_ASTC_10x5_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_10x6_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_10x6_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_10x6_KHR, GL_COMPRESSED_RGBA_ASTC_10x6_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_10x8_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_10x8_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_10x8_KHR, GL_COMPRESSED_RGBA_ASTC_10x8_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_12x10_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_12x10_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_12x10_KHR, GL_COMPRESSED_RGBA_ASTC_12x10_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_12x12_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_12x12_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_12x12_KHR, GL_COMPRESSED_RGBA_ASTC_12x12_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_4x4_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_4x4_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_4x4_KHR, GL_COMPRESSED_RGBA_ASTC_4x4_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_5x4_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_5x4_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_5x4_KHR, GL_COMPRESSED_RGBA_ASTC_5x4_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_5x5_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_5x5_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_5x5_KHR, GL_COMPRESSED_RGBA_ASTC_5x5_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_6x5_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_6x5_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_6x5_KHR, GL_COMPRESSED_RGBA_ASTC_6x5_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_6x6_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_6x6_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_6x6_KHR, GL_COMPRESSED_RGBA_ASTC_6x6_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_8x5_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_8x5_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_8x5_KHR, GL_COMPRESSED_RGBA_ASTC_8x5_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_8x6_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_8x6_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_8x6_KHR, GL_COMPRESSED_RGBA_ASTC_8x6_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_8x8_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::ASTC_8x8_UNORM_BLOCK, GL_COMPRESSED_RGBA_ASTC_8x8_KHR, GL_COMPRESSED_RGBA_ASTC_8x8_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::B4G4R4A4_UNORM, GL_BGRA4_ANGLEX, GL_RGBA4, GenerateMip<A4R4G4B4>, NoCopyFunctions, ReadColor<A4R4G4B4, GLfloat>, WriteColor<A4R4G4B4, GLfloat>, GL_UNSIGNED_NORMALIZED, 4, 4, 4, 4, 0, 0 },
+ { Format::ID::B5G5R5A1_UNORM, GL_BGR5_A1_ANGLEX, GL_RGB5_A1, GenerateMip<A1R5G5B5>, NoCopyFunctions, ReadColor<A1R5G5B5, GLfloat>, WriteColor<A1R5G5B5, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 5, 5, 1, 0, 0 },
+ { Format::ID::B5G6R5_UNORM, GL_BGR565_ANGLEX, GL_RGB565, GenerateMip<B5G6R5>, NoCopyFunctions, ReadColor<B5G6R5, GLfloat>, WriteColor<B5G6R5, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 6, 5, 0, 0, 0 },
+ { Format::ID::B8G8R8A8_UNORM, GL_BGRA8_EXT, GL_BGRA8_EXT, GenerateMip<B8G8R8A8>, BGRACopyFunctions, ReadColor<B8G8R8A8, GLfloat>, WriteColor<B8G8R8A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
+ { Format::ID::B8G8R8X8_UNORM, GL_BGRA8_EXT, GL_BGRA8_EXT, GenerateMip<B8G8R8X8>, NoCopyFunctions, ReadColor<B8G8R8X8, GLfloat>, WriteColor<B8G8R8X8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
+ { Format::ID::BC1_RGBA_UNORM_BLOCK, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::BC1_RGBA_UNORM_SRGB_BLOCK, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::BC1_RGB_UNORM_BLOCK, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::BC1_RGB_UNORM_SRGB_BLOCK, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::BC2_RGBA_UNORM_BLOCK, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::BC2_RGBA_UNORM_SRGB_BLOCK, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::BC3_RGBA_UNORM_BLOCK, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::BC3_RGBA_UNORM_SRGB_BLOCK, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::D16_UNORM, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT16, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 16, 0 },
+ { Format::ID::D24_UNORM, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT24, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 24, 0 },
+ { Format::ID::D24_UNORM_S8_UINT, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 24, 8 },
+ { Format::ID::D32_FLOAT, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT32F, nullptr, NoCopyFunctions, nullptr, nullptr, GL_FLOAT, 0, 0, 0, 0, 32, 0 },
+ { Format::ID::D32_FLOAT_S8X24_UINT, GL_DEPTH32F_STENCIL8, GL_DEPTH32F_STENCIL8, nullptr, NoCopyFunctions, nullptr, nullptr, GL_FLOAT, 0, 0, 0, 0, 32, 8 },
+ { Format::ID::D32_UNORM, GL_DEPTH_COMPONENT32_OES, GL_DEPTH_COMPONENT32_OES, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 32, 0 },
+ { Format::ID::EAC_R11G11_SNORM_BLOCK, GL_COMPRESSED_SIGNED_RG11_EAC, GL_COMPRESSED_SIGNED_RG11_EAC, nullptr, NoCopyFunctions, nullptr, nullptr, GL_SIGNED_NORMALIZED, 11, 11, 0, 0, 0, 0 },
+ { Format::ID::EAC_R11G11_UNORM_BLOCK, GL_COMPRESSED_RG11_EAC, GL_COMPRESSED_RG11_EAC, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 11, 11, 0, 0, 0, 0 },
+ { Format::ID::EAC_R11_SNORM_BLOCK, GL_COMPRESSED_SIGNED_R11_EAC, GL_COMPRESSED_SIGNED_R11_EAC, nullptr, NoCopyFunctions, nullptr, nullptr, GL_SIGNED_NORMALIZED, 11, 0, 0, 0, 0, 0 },
+ { Format::ID::EAC_R11_UNORM_BLOCK, GL_COMPRESSED_R11_EAC, GL_COMPRESSED_R11_EAC, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 11, 0, 0, 0, 0, 0 },
+ { Format::ID::ETC2_R8G8B8A1_SRGB_BLOCK, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 1, 0, 0 },
+ { Format::ID::ETC2_R8G8B8A1_UNORM_BLOCK, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 1, 0, 0 },
+ { Format::ID::ETC2_R8G8B8A8_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
+ { Format::ID::ETC2_R8G8B8A8_UNORM_BLOCK, GL_COMPRESSED_RGBA8_ETC2_EAC, GL_COMPRESSED_RGBA8_ETC2_EAC, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
+ { Format::ID::ETC2_R8G8B8_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ETC2, GL_COMPRESSED_SRGB8_ETC2, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
+ { Format::ID::ETC2_R8G8B8_UNORM_BLOCK, GL_COMPRESSED_RGB8_ETC2, GL_COMPRESSED_RGB8_ETC2, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
+ { Format::ID::L16A16_FLOAT, GL_LUMINANCE_ALPHA16F_EXT, GL_LUMINANCE_ALPHA16F_EXT, GenerateMip<L16A16F>, NoCopyFunctions, ReadColor<L16A16F, GLfloat>, WriteColor<L16A16F, GLfloat>, GL_FLOAT, 0, 0, 0, 16, 0, 0 },
+ { Format::ID::L16_FLOAT, GL_LUMINANCE16F_EXT, GL_LUMINANCE16F_EXT, GenerateMip<L16F>, NoCopyFunctions, ReadColor<L16F, GLfloat>, WriteColor<L16F, GLfloat>, GL_FLOAT, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::L32A32_FLOAT, GL_LUMINANCE_ALPHA32F_EXT, GL_LUMINANCE_ALPHA32F_EXT, GenerateMip<L32A32F>, NoCopyFunctions, ReadColor<L32A32F, GLfloat>, WriteColor<L32A32F, GLfloat>, GL_FLOAT, 0, 0, 0, 32, 0, 0 },
+ { Format::ID::L32_FLOAT, GL_LUMINANCE32F_EXT, GL_LUMINANCE32F_EXT, GenerateMip<L32F>, NoCopyFunctions, ReadColor<L32F, GLfloat>, WriteColor<L32F, GLfloat>, GL_FLOAT, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::L8A8_UNORM, GL_LUMINANCE8_ALPHA8_EXT, GL_LUMINANCE8_ALPHA8_EXT, GenerateMip<L8A8>, NoCopyFunctions, ReadColor<L8A8, GLfloat>, WriteColor<L8A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 8, 0, 0 },
+ { Format::ID::L8_UNORM, GL_LUMINANCE8_EXT, GL_LUMINANCE8_EXT, GenerateMip<L8>, NoCopyFunctions, ReadColor<L8, GLfloat>, WriteColor<L8, GLfloat>, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
+ { Format::ID::R10G10B10A2_UINT, GL_RGB10_A2UI, GL_RGB10_A2UI, GenerateMip<R10G10B10A2>, NoCopyFunctions, ReadColor<R10G10B10A2, GLuint>, WriteColor<R10G10B10A2, GLuint>, GL_UNSIGNED_INT, 10, 10, 10, 2, 0, 0 },
+ { Format::ID::R10G10B10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, GenerateMip<R10G10B10A2>, NoCopyFunctions, ReadColor<R10G10B10A2, GLfloat>, WriteColor<R10G10B10A2, GLfloat>, GL_UNSIGNED_NORMALIZED, 10, 10, 10, 2, 0, 0 },
+ { Format::ID::R11G11B10_FLOAT, GL_R11F_G11F_B10F, GL_R11F_G11F_B10F, GenerateMip<R11G11B10F>, NoCopyFunctions, ReadColor<R11G11B10F, GLfloat>, WriteColor<R11G11B10F, GLfloat>, GL_FLOAT, 11, 11, 10, 0, 0, 0 },
+ { Format::ID::R16G16B16A16_FLOAT, GL_RGBA16F, GL_RGBA16F, GenerateMip<R16G16B16A16F>, NoCopyFunctions, ReadColor<R16G16B16A16F, GLfloat>, WriteColor<R16G16B16A16F, GLfloat>, GL_FLOAT, 16, 16, 16, 16, 0, 0 },
+ { Format::ID::R16G16B16A16_SINT, GL_RGBA16I, GL_RGBA16I, GenerateMip<R16G16B16A16S>, NoCopyFunctions, ReadColor<R16G16B16A16S, GLint>, WriteColor<R16G16B16A16S, GLint>, GL_INT, 16, 16, 16, 16, 0, 0 },
+ { Format::ID::R16G16B16A16_SNORM, GL_RGBA16_SNORM_EXT, GL_RGBA16_SNORM_EXT, GenerateMip<R16G16B16A16S>, NoCopyFunctions, ReadColor<R16G16B16A16S, GLfloat>, WriteColor<R16G16B16A16S, GLfloat>, GL_SIGNED_NORMALIZED, 16, 16, 16, 16, 0, 0 },
+ { Format::ID::R16G16B16A16_UINT, GL_RGBA16UI, GL_RGBA16UI, GenerateMip<R16G16B16A16>, NoCopyFunctions, ReadColor<R16G16B16A16, GLuint>, WriteColor<R16G16B16A16, GLuint>, GL_UNSIGNED_INT, 16, 16, 16, 16, 0, 0 },
+ { Format::ID::R16G16B16A16_UNORM, GL_RGBA16_EXT, GL_RGBA16_EXT, GenerateMip<R16G16B16A16>, NoCopyFunctions, ReadColor<R16G16B16A16, GLfloat>, WriteColor<R16G16B16A16, GLfloat>, GL_UNSIGNED_NORMALIZED, 16, 16, 16, 16, 0, 0 },
+ { Format::ID::R16G16B16_FLOAT, GL_RGB16F, GL_RGB16F, GenerateMip<R16G16B16F>, NoCopyFunctions, ReadColor<R16G16B16F, GLfloat>, WriteColor<R16G16B16F, GLfloat>, GL_FLOAT, 16, 16, 16, 0, 0, 0 },
+ { Format::ID::R16G16B16_SINT, GL_RGB16I, GL_RGB16I, GenerateMip<R16G16B16S>, NoCopyFunctions, ReadColor<R16G16B16S, GLint>, WriteColor<R16G16B16S, GLint>, GL_INT, 16, 16, 16, 0, 0, 0 },
+ { Format::ID::R16G16B16_SNORM, GL_RGB16_SNORM_EXT, GL_RGB16_SNORM_EXT, GenerateMip<R16G16B16S>, NoCopyFunctions, ReadColor<R16G16B16S, GLfloat>, WriteColor<R16G16B16S, GLfloat>, GL_SIGNED_NORMALIZED, 16, 16, 16, 0, 0, 0 },
+ { Format::ID::R16G16B16_UINT, GL_RGB16UI, GL_RGB16UI, GenerateMip<R16G16B16>, NoCopyFunctions, ReadColor<R16G16B16, GLuint>, WriteColor<R16G16B16, GLuint>, GL_UNSIGNED_INT, 16, 16, 16, 0, 0, 0 },
+ { Format::ID::R16G16B16_UNORM, GL_RGB16_EXT, GL_RGB16_EXT, GenerateMip<R16G16B16>, NoCopyFunctions, ReadColor<R16G16B16, GLfloat>, WriteColor<R16G16B16, GLfloat>, GL_UNSIGNED_NORMALIZED, 16, 16, 16, 0, 0, 0 },
+ { Format::ID::R16G16_FLOAT, GL_RG16F, GL_RG16F, GenerateMip<R16G16F>, NoCopyFunctions, ReadColor<R16G16F, GLfloat>, WriteColor<R16G16F, GLfloat>, GL_FLOAT, 16, 16, 0, 0, 0, 0 },
+ { Format::ID::R16G16_SINT, GL_RG16I, GL_RG16I, GenerateMip<R16G16S>, NoCopyFunctions, ReadColor<R16G16S, GLint>, WriteColor<R16G16S, GLint>, GL_INT, 16, 16, 0, 0, 0, 0 },
+ { Format::ID::R16G16_SNORM, GL_RG16_SNORM_EXT, GL_RG16_SNORM_EXT, GenerateMip<R16G16S>, NoCopyFunctions, ReadColor<R16G16S, GLfloat>, WriteColor<R16G16S, GLfloat>, GL_SIGNED_NORMALIZED, 16, 16, 0, 0, 0, 0 },
+ { Format::ID::R16G16_UINT, GL_RG16UI, GL_RG16UI, GenerateMip<R16G16>, NoCopyFunctions, ReadColor<R16G16, GLuint>, WriteColor<R16G16, GLuint>, GL_UNSIGNED_INT, 16, 16, 0, 0, 0, 0 },
+ { Format::ID::R16G16_UNORM, GL_RG16_EXT, GL_RG16_EXT, GenerateMip<R16G16>, NoCopyFunctions, ReadColor<R16G16, GLfloat>, WriteColor<R16G16, GLfloat>, GL_UNSIGNED_NORMALIZED, 16, 16, 0, 0, 0, 0 },
+ { Format::ID::R16_FLOAT, GL_R16F, GL_R16F, GenerateMip<R16F>, NoCopyFunctions, ReadColor<R16F, GLfloat>, WriteColor<R16F, GLfloat>, GL_FLOAT, 16, 0, 0, 0, 0, 0 },
+ { Format::ID::R16_SINT, GL_R16I, GL_R16I, GenerateMip<R16S>, NoCopyFunctions, ReadColor<R16S, GLint>, WriteColor<R16S, GLint>, GL_INT, 16, 0, 0, 0, 0, 0 },
+ { Format::ID::R16_SNORM, GL_R16_SNORM_EXT, GL_R16_SNORM_EXT, GenerateMip<R16S>, NoCopyFunctions, ReadColor<R16S, GLfloat>, WriteColor<R16S, GLfloat>, GL_SIGNED_NORMALIZED, 16, 0, 0, 0, 0, 0 },
+ { Format::ID::R16_UINT, GL_R16UI, GL_R16UI, GenerateMip<R16>, NoCopyFunctions, ReadColor<R16, GLuint>, WriteColor<R16, GLuint>, GL_UNSIGNED_INT, 16, 0, 0, 0, 0, 0 },
+ { Format::ID::R16_UNORM, GL_R16_EXT, GL_R16_EXT, GenerateMip<R16>, NoCopyFunctions, ReadColor<R16, GLfloat>, WriteColor<R16, GLfloat>, GL_UNSIGNED_NORMALIZED, 16, 0, 0, 0, 0, 0 },
+ { Format::ID::R32G32B32A32_FLOAT, GL_RGBA32F, GL_RGBA32F, GenerateMip<R32G32B32A32F>, NoCopyFunctions, ReadColor<R32G32B32A32F, GLfloat>, WriteColor<R32G32B32A32F, GLfloat>, GL_FLOAT, 32, 32, 32, 32, 0, 0 },
+ { Format::ID::R32G32B32A32_SINT, GL_RGBA32I, GL_RGBA32I, GenerateMip<R32G32B32A32S>, NoCopyFunctions, ReadColor<R32G32B32A32S, GLint>, WriteColor<R32G32B32A32S, GLint>, GL_INT, 32, 32, 32, 32, 0, 0 },
+ { Format::ID::R32G32B32A32_UINT, GL_RGBA32UI, GL_RGBA32UI, GenerateMip<R32G32B32A32>, NoCopyFunctions, ReadColor<R32G32B32A32, GLuint>, WriteColor<R32G32B32A32, GLuint>, GL_UNSIGNED_INT, 32, 32, 32, 32, 0, 0 },
+ { Format::ID::R32G32B32_FLOAT, GL_RGB32F, GL_RGB32F, GenerateMip<R32G32B32F>, NoCopyFunctions, ReadColor<R32G32B32F, GLfloat>, WriteColor<R32G32B32F, GLfloat>, GL_FLOAT, 32, 32, 32, 0, 0, 0 },
+ { Format::ID::R32G32B32_SINT, GL_RGB32I, GL_RGB32I, GenerateMip<R32G32B32S>, NoCopyFunctions, ReadColor<R32G32B32S, GLint>, WriteColor<R32G32B32S, GLint>, GL_INT, 32, 32, 32, 0, 0, 0 },
+ { Format::ID::R32G32B32_UINT, GL_RGB32UI, GL_RGB32UI, GenerateMip<R32G32B32>, NoCopyFunctions, ReadColor<R32G32B32, GLuint>, WriteColor<R32G32B32, GLuint>, GL_UNSIGNED_INT, 32, 32, 32, 0, 0, 0 },
+ { Format::ID::R32G32_FLOAT, GL_RG32F, GL_RG32F, GenerateMip<R32G32F>, NoCopyFunctions, ReadColor<R32G32F, GLfloat>, WriteColor<R32G32F, GLfloat>, GL_FLOAT, 32, 32, 0, 0, 0, 0 },
+ { Format::ID::R32G32_SINT, GL_RG32I, GL_RG32I, GenerateMip<R32G32S>, NoCopyFunctions, ReadColor<R32G32S, GLint>, WriteColor<R32G32S, GLint>, GL_INT, 32, 32, 0, 0, 0, 0 },
+ { Format::ID::R32G32_UINT, GL_RG32UI, GL_RG32UI, GenerateMip<R32G32>, NoCopyFunctions, ReadColor<R32G32, GLuint>, WriteColor<R32G32, GLuint>, GL_UNSIGNED_INT, 32, 32, 0, 0, 0, 0 },
+ { Format::ID::R32_FLOAT, GL_R32F, GL_R32F, GenerateMip<R32F>, NoCopyFunctions, ReadColor<R32F, GLfloat>, WriteColor<R32F, GLfloat>, GL_FLOAT, 32, 0, 0, 0, 0, 0 },
+ { Format::ID::R32_SINT, GL_R32I, GL_R32I, GenerateMip<R32S>, NoCopyFunctions, ReadColor<R32S, GLint>, WriteColor<R32S, GLint>, GL_INT, 32, 0, 0, 0, 0, 0 },
+ { Format::ID::R32_UINT, GL_R32UI, GL_R32UI, GenerateMip<R32>, NoCopyFunctions, ReadColor<R32, GLuint>, WriteColor<R32, GLuint>, GL_UNSIGNED_INT, 32, 0, 0, 0, 0, 0 },
+ { Format::ID::R4G4B4A4_UNORM, GL_RGBA4, GL_RGBA4, GenerateMip<R4G4B4A4>, NoCopyFunctions, ReadColor<R4G4B4A4, GLfloat>, WriteColor<R4G4B4A4, GLfloat>, GL_UNSIGNED_NORMALIZED, 4, 4, 4, 4, 0, 0 },
+ { Format::ID::R5G5B5A1_UNORM, GL_RGB5_A1, GL_RGB5_A1, GenerateMip<R5G5B5A1>, NoCopyFunctions, ReadColor<R5G5B5A1, GLfloat>, WriteColor<R5G5B5A1, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 5, 5, 1, 0, 0 },
+ { Format::ID::R5G6B5_UNORM, GL_RGB565, GL_RGB565, GenerateMip<R5G6B5>, NoCopyFunctions, ReadColor<R5G6B5, GLfloat>, WriteColor<R5G6B5, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 6, 5, 0, 0, 0 },
+ { Format::ID::R8G8B8A8_SINT, GL_RGBA8I, GL_RGBA8I, GenerateMip<R8G8B8A8S>, NoCopyFunctions, ReadColor<R8G8B8A8S, GLint>, WriteColor<R8G8B8A8S, GLint>, GL_INT, 8, 8, 8, 8, 0, 0 },
+ { Format::ID::R8G8B8A8_SNORM, GL_RGBA8_SNORM, GL_RGBA8_SNORM, GenerateMip<R8G8B8A8S>, NoCopyFunctions, ReadColor<R8G8B8A8S, GLfloat>, WriteColor<R8G8B8A8S, GLfloat>, GL_SIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
+ { Format::ID::R8G8B8A8_UINT, GL_RGBA8UI, GL_RGBA8UI, GenerateMip<R8G8B8A8>, NoCopyFunctions, ReadColor<R8G8B8A8, GLuint>, WriteColor<R8G8B8A8, GLuint>, GL_UNSIGNED_INT, 8, 8, 8, 8, 0, 0 },
+ { Format::ID::R8G8B8A8_UNORM, GL_RGBA8, GL_RGBA8, GenerateMip<R8G8B8A8>, NoCopyFunctions, ReadColor<R8G8B8A8, GLfloat>, WriteColor<R8G8B8A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
+ { Format::ID::R8G8B8A8_UNORM_SRGB, GL_SRGB8_ALPHA8, GL_SRGB8_ALPHA8, GenerateMip<R8G8B8A8SRGB>, NoCopyFunctions, ReadColor<R8G8B8A8SRGB, GLfloat>, WriteColor<R8G8B8A8SRGB, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
+ { Format::ID::R8G8B8_SINT, GL_RGB8I, GL_RGB8I, GenerateMip<R8G8B8S>, NoCopyFunctions, ReadColor<R8G8B8S, GLint>, WriteColor<R8G8B8S, GLint>, GL_INT, 8, 8, 8, 0, 0, 0 },
+ { Format::ID::R8G8B8_SNORM, GL_RGB8_SNORM, GL_RGB8_SNORM, GenerateMip<R8G8B8S>, NoCopyFunctions, ReadColor<R8G8B8S, GLfloat>, WriteColor<R8G8B8S, GLfloat>, GL_SIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
+ { Format::ID::R8G8B8_UINT, GL_RGB8UI, GL_RGB8UI, GenerateMip<R8G8B8>, NoCopyFunctions, ReadColor<R8G8B8, GLuint>, WriteColor<R8G8B8, GLuint>, GL_UNSIGNED_INT, 8, 8, 8, 0, 0, 0 },
+ { Format::ID::R8G8B8_UNORM, GL_RGB8, GL_RGB8, GenerateMip<R8G8B8>, NoCopyFunctions, ReadColor<R8G8B8, GLfloat>, WriteColor<R8G8B8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
+ { Format::ID::R8G8B8_UNORM_SRGB, GL_SRGB8, GL_SRGB8, GenerateMip<R8G8B8>, NoCopyFunctions, ReadColor<R8G8B8, GLfloat>, WriteColor<R8G8B8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
+ { Format::ID::R8G8_SINT, GL_RG8I, GL_RG8I, GenerateMip<R8G8S>, NoCopyFunctions, ReadColor<R8G8S, GLint>, WriteColor<R8G8S, GLint>, GL_INT, 8, 8, 0, 0, 0, 0 },
+ { Format::ID::R8G8_SNORM, GL_RG8_SNORM, GL_RG8_SNORM, GenerateMip<R8G8S>, NoCopyFunctions, ReadColor<R8G8S, GLfloat>, WriteColor<R8G8S, GLfloat>, GL_SIGNED_NORMALIZED, 8, 8, 0, 0, 0, 0 },
+ { Format::ID::R8G8_UINT, GL_RG8UI, GL_RG8UI, GenerateMip<R8G8>, NoCopyFunctions, ReadColor<R8G8, GLuint>, WriteColor<R8G8, GLuint>, GL_UNSIGNED_INT, 8, 8, 0, 0, 0, 0 },
+ { Format::ID::R8G8_UNORM, GL_RG8, GL_RG8, GenerateMip<R8G8>, NoCopyFunctions, ReadColor<R8G8, GLfloat>, WriteColor<R8G8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 0, 0, 0, 0 },
+ { Format::ID::R8_SINT, GL_R8I, GL_R8I, GenerateMip<R8S>, NoCopyFunctions, ReadColor<R8S, GLint>, WriteColor<R8S, GLint>, GL_INT, 8, 0, 0, 0, 0, 0 },
+ { Format::ID::R8_SNORM, GL_R8_SNORM, GL_R8_SNORM, GenerateMip<R8S>, NoCopyFunctions, ReadColor<R8S, GLfloat>, WriteColor<R8S, GLfloat>, GL_SIGNED_NORMALIZED, 8, 0, 0, 0, 0, 0 },
+ { Format::ID::R8_UINT, GL_R8UI, GL_R8UI, GenerateMip<R8>, NoCopyFunctions, ReadColor<R8, GLuint>, WriteColor<R8, GLuint>, GL_UNSIGNED_INT, 8, 0, 0, 0, 0, 0 },
+ { Format::ID::R8_UNORM, GL_R8, GL_R8, GenerateMip<R8>, NoCopyFunctions, ReadColor<R8, GLfloat>, WriteColor<R8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 0, 0, 0, 0, 0 },
+ { Format::ID::R9G9B9E5_SHAREDEXP, GL_RGB9_E5, GL_RGB9_E5, GenerateMip<R9G9B9E5>, NoCopyFunctions, ReadColor<R9G9B9E5, GLfloat>, WriteColor<R9G9B9E5, GLfloat>, GL_FLOAT, 9, 9, 9, 0, 0, 0 },
+ { Format::ID::S8_UINT, GL_STENCIL_INDEX8, GL_STENCIL_INDEX8, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_INT, 0, 0, 0, 0, 0, 8 },
// clang-format on
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/FramebufferAttachmentObjectImpl.h b/chromium/third_party/angle/src/libANGLE/renderer/FramebufferAttachmentObjectImpl.h
index 0af12ec1f7a..95ea4b853dd 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/FramebufferAttachmentObjectImpl.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/FramebufferAttachmentObjectImpl.h
@@ -22,7 +22,8 @@ class FramebufferAttachmentObjectImpl : angle::NonCopyable
FramebufferAttachmentObjectImpl() {}
virtual ~FramebufferAttachmentObjectImpl() {}
- virtual gl::Error getAttachmentRenderTarget(GLenum binding,
+ virtual gl::Error getAttachmentRenderTarget(const gl::Context *context,
+ GLenum binding,
const gl::ImageIndex &imageIndex,
FramebufferAttachmentRenderTarget **rtOut)
{
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/FramebufferImpl.h b/chromium/third_party/angle/src/libANGLE/renderer/FramebufferImpl.h
index b4438f80532..016648908c8 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/FramebufferImpl.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/FramebufferImpl.h
@@ -31,43 +31,48 @@ class FramebufferImpl : angle::NonCopyable
public:
explicit FramebufferImpl(const gl::FramebufferState &state) : mState(state) {}
virtual ~FramebufferImpl() {}
- virtual void destroy(ContextImpl *contextImpl) {}
- virtual void destroyDefault(DisplayImpl *displayImpl) {}
-
- virtual gl::Error discard(size_t count, const GLenum *attachments) = 0;
- virtual gl::Error invalidate(size_t count, const GLenum *attachments) = 0;
- virtual gl::Error invalidateSub(size_t count,
+ virtual void destroy(const gl::Context *context) {}
+ virtual void destroyDefault(const egl::Display *display) {}
+
+ virtual gl::Error discard(const gl::Context *context,
+ size_t count,
+ const GLenum *attachments) = 0;
+ virtual gl::Error invalidate(const gl::Context *context,
+ size_t count,
+ const GLenum *attachments) = 0;
+ virtual gl::Error invalidateSub(const gl::Context *context,
+ size_t count,
const GLenum *attachments,
const gl::Rectangle &area) = 0;
- virtual gl::Error clear(ContextImpl *context, GLbitfield mask) = 0;
- virtual gl::Error clearBufferfv(ContextImpl *context,
+ virtual gl::Error clear(const gl::Context *context, GLbitfield mask) = 0;
+ virtual gl::Error clearBufferfv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLfloat *values) = 0;
- virtual gl::Error clearBufferuiv(ContextImpl *context,
+ virtual gl::Error clearBufferuiv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLuint *values) = 0;
- virtual gl::Error clearBufferiv(ContextImpl *context,
+ virtual gl::Error clearBufferiv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLint *values) = 0;
- virtual gl::Error clearBufferfi(ContextImpl *context,
+ virtual gl::Error clearBufferfi(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
GLfloat depth,
GLint stencil) = 0;
- virtual GLenum getImplementationColorReadFormat() const = 0;
- virtual GLenum getImplementationColorReadType() const = 0;
- virtual gl::Error readPixels(ContextImpl *context,
+ virtual GLenum getImplementationColorReadFormat(const gl::Context *context) const = 0;
+ virtual GLenum getImplementationColorReadType(const gl::Context *context) const = 0;
+ virtual gl::Error readPixels(const gl::Context *context,
const gl::Rectangle &area,
GLenum format,
GLenum type,
void *pixels) const = 0;
- virtual gl::Error blit(ContextImpl *context,
+ virtual gl::Error blit(const gl::Context *context,
const gl::Rectangle &sourceArea,
const gl::Rectangle &destArea,
GLbitfield mask,
@@ -75,7 +80,7 @@ class FramebufferImpl : angle::NonCopyable
virtual bool checkStatus() const = 0;
- virtual void syncState(ContextImpl *contextImpl,
+ virtual void syncState(const gl::Context *context,
const gl::Framebuffer::DirtyBits &dirtyBits) = 0;
virtual gl::Error getSamplePosition(size_t index, GLfloat *xy) const = 0;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/FramebufferImpl_mock.h b/chromium/third_party/angle/src/libANGLE/renderer/FramebufferImpl_mock.h
index 401ddb4fd5d..71f77c425d9 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/FramebufferImpl_mock.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/FramebufferImpl_mock.h
@@ -23,30 +23,35 @@ class MockFramebufferImpl : public rx::FramebufferImpl
MockFramebufferImpl() : rx::FramebufferImpl(gl::FramebufferState()) {}
virtual ~MockFramebufferImpl() { destructor(); }
- MOCK_METHOD2(discard, gl::Error(size_t, const GLenum *));
- MOCK_METHOD2(invalidate, gl::Error(size_t, const GLenum *));
- MOCK_METHOD3(invalidateSub, gl::Error(size_t, const GLenum *, const gl::Rectangle &));
-
- MOCK_METHOD2(clear, gl::Error(ContextImpl *, GLbitfield));
- MOCK_METHOD4(clearBufferfv, gl::Error(ContextImpl *, GLenum, GLint, const GLfloat *));
- MOCK_METHOD4(clearBufferuiv, gl::Error(ContextImpl *, GLenum, GLint, const GLuint *));
- MOCK_METHOD4(clearBufferiv, gl::Error(ContextImpl *, GLenum, GLint, const GLint *));
- MOCK_METHOD5(clearBufferfi, gl::Error(ContextImpl *, GLenum, GLint, GLfloat, GLint));
-
- MOCK_CONST_METHOD0(getImplementationColorReadFormat, GLenum());
- MOCK_CONST_METHOD0(getImplementationColorReadType, GLenum());
- MOCK_CONST_METHOD5(readPixels,
- gl::Error(ContextImpl *, const gl::Rectangle &, GLenum, GLenum, void *));
+ MOCK_METHOD3(discard, gl::Error(const gl::Context *, size_t, const GLenum *));
+ MOCK_METHOD3(invalidate, gl::Error(const gl::Context *, size_t, const GLenum *));
+ MOCK_METHOD4(invalidateSub,
+ gl::Error(const gl::Context *, size_t, const GLenum *, const gl::Rectangle &));
+
+ MOCK_METHOD2(clear, gl::Error(const gl::Context *, GLbitfield));
+ MOCK_METHOD4(clearBufferfv, gl::Error(const gl::Context *, GLenum, GLint, const GLfloat *));
+ MOCK_METHOD4(clearBufferuiv, gl::Error(const gl::Context *, GLenum, GLint, const GLuint *));
+ MOCK_METHOD4(clearBufferiv, gl::Error(const gl::Context *, GLenum, GLint, const GLint *));
+ MOCK_METHOD5(clearBufferfi, gl::Error(const gl::Context *, GLenum, GLint, GLfloat, GLint));
+
+ MOCK_CONST_METHOD1(getImplementationColorReadFormat, GLenum(const gl::Context *));
+ MOCK_CONST_METHOD1(getImplementationColorReadType, GLenum(const gl::Context *));
+ MOCK_CONST_METHOD5(
+ readPixels,
+ gl::Error(const gl::Context *, const gl::Rectangle &, GLenum, GLenum, void *));
MOCK_CONST_METHOD2(getSamplePosition, gl::Error(size_t, GLfloat *));
- MOCK_METHOD5(
- blit,
- gl::Error(ContextImpl *, const gl::Rectangle &, const gl::Rectangle &, GLbitfield, GLenum));
+ MOCK_METHOD5(blit,
+ gl::Error(const gl::Context *,
+ const gl::Rectangle &,
+ const gl::Rectangle &,
+ GLbitfield,
+ GLenum));
MOCK_CONST_METHOD0(checkStatus, bool());
- MOCK_METHOD2(syncState, void(ContextImpl *, const gl::Framebuffer::DirtyBits &));
+ MOCK_METHOD2(syncState, void(const gl::Context *, const gl::Framebuffer::DirtyBits &));
MOCK_METHOD0(destructor, void());
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/ImageImpl.h b/chromium/third_party/angle/src/libANGLE/renderer/ImageImpl.h
index 206df8b4e93..79694eaebf6 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/ImageImpl.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/ImageImpl.h
@@ -12,11 +12,16 @@
#include "common/angleutils.h"
#include "libANGLE/Error.h"
+namespace gl
+{
+class Context;
+} // namespace gl
+
namespace egl
{
class ImageSibling;
struct ImageState;
-}
+} // namespace egl
namespace rx
{
@@ -27,7 +32,7 @@ class ImageImpl : angle::NonCopyable
virtual ~ImageImpl() {}
virtual egl::Error initialize() = 0;
- virtual gl::Error orphan(egl::ImageSibling *sibling) = 0;
+ virtual gl::Error orphan(const gl::Context *context, egl::ImageSibling *sibling) = 0;
protected:
const egl::ImageState &mState;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/ImageImpl_mock.h b/chromium/third_party/angle/src/libANGLE/renderer/ImageImpl_mock.h
index d43052887d1..30c0cc25946 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/ImageImpl_mock.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/ImageImpl_mock.h
@@ -26,7 +26,7 @@ class MockImageImpl : public ImageImpl
}
virtual ~MockImageImpl() { destructor(); }
MOCK_METHOD0(initialize, egl::Error(void));
- MOCK_METHOD1(orphan, gl::Error(egl::ImageSibling *));
+ MOCK_METHOD2(orphan, gl::Error(const gl::Context *, egl::ImageSibling *));
MOCK_METHOD0(destructor, void());
};
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/ProgramImpl.h b/chromium/third_party/angle/src/libANGLE/renderer/ProgramImpl.h
index 30a6a26180b..d2b71187c6c 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/ProgramImpl.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/ProgramImpl.h
@@ -19,6 +19,7 @@
namespace gl
{
+class Context;
class VaryingPacking;
}
@@ -29,27 +30,24 @@ struct BlockMemberInfo;
namespace rx
{
-class ContextImpl;
-
-using LinkResult = gl::ErrorOrResult<bool>;
class ProgramImpl : angle::NonCopyable
{
public:
ProgramImpl(const gl::ProgramState &state) : mState(state) {}
virtual ~ProgramImpl() {}
- virtual void destroy(const ContextImpl *contextImpl) {}
+ virtual void destroy(const gl::Context *context) {}
- virtual LinkResult load(const ContextImpl *contextImpl,
- gl::InfoLog &infoLog,
- gl::BinaryInputStream *stream) = 0;
- virtual gl::Error save(gl::BinaryOutputStream *stream) = 0;
+ virtual gl::LinkResult load(const gl::Context *context,
+ gl::InfoLog &infoLog,
+ gl::BinaryInputStream *stream) = 0;
+ virtual void save(const gl::Context *context, gl::BinaryOutputStream *stream) = 0;
virtual void setBinaryRetrievableHint(bool retrievable) = 0;
virtual void setSeparable(bool separable) = 0;
- virtual LinkResult link(ContextImpl *contextImpl,
- const gl::VaryingPacking &packing,
- gl::InfoLog &infoLog) = 0;
+ virtual gl::LinkResult link(const gl::Context *context,
+ const gl::VaryingPacking &packing,
+ gl::InfoLog &infoLog) = 0;
virtual GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) = 0;
virtual void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) = 0;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/ProgramImpl_mock.h b/chromium/third_party/angle/src/libANGLE/renderer/ProgramImpl_mock.h
index 9b830c05792..8883ca4a52e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/ProgramImpl_mock.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/ProgramImpl_mock.h
@@ -23,12 +23,13 @@ class MockProgramImpl : public rx::ProgramImpl
MockProgramImpl() : ProgramImpl(gl::ProgramState()) {}
virtual ~MockProgramImpl() { destructor(); }
- MOCK_METHOD3(load, LinkResult(const ContextImpl *, gl::InfoLog &, gl::BinaryInputStream *));
- MOCK_METHOD1(save, gl::Error(gl::BinaryOutputStream *));
+ MOCK_METHOD3(load, gl::LinkResult(const gl::Context *, gl::InfoLog &, gl::BinaryInputStream *));
+ MOCK_METHOD2(save, void(const gl::Context *, gl::BinaryOutputStream *));
MOCK_METHOD1(setBinaryRetrievableHint, void(bool));
MOCK_METHOD1(setSeparable, void(bool));
- MOCK_METHOD3(link, LinkResult(ContextImpl *, const gl::VaryingPacking &, gl::InfoLog &));
+ MOCK_METHOD3(link,
+ gl::LinkResult(const gl::Context *, const gl::VaryingPacking &, gl::InfoLog &));
MOCK_METHOD2(validate, GLboolean(const gl::Caps &, gl::InfoLog *));
MOCK_METHOD3(setUniform1fv, void(GLint, GLsizei, const GLfloat *));
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/RenderbufferImpl_mock.h b/chromium/third_party/angle/src/libANGLE/renderer/RenderbufferImpl_mock.h
index 2448534248e..39e5c70a5ce 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/RenderbufferImpl_mock.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/RenderbufferImpl_mock.h
@@ -25,8 +25,11 @@ class MockRenderbufferImpl : public RenderbufferImpl
MOCK_METHOD4(setStorageMultisample, gl::Error(size_t, GLenum, size_t, size_t));
MOCK_METHOD1(setStorageEGLImageTarget, gl::Error(egl::Image *));
- MOCK_METHOD3(getAttachmentRenderTarget,
- gl::Error(GLenum, const gl::ImageIndex &, FramebufferAttachmentRenderTarget **));
+ MOCK_METHOD4(getAttachmentRenderTarget,
+ gl::Error(const gl::Context *,
+ GLenum,
+ const gl::ImageIndex &,
+ FramebufferAttachmentRenderTarget **));
MOCK_METHOD0(destructor, void());
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/SurfaceImpl.cpp b/chromium/third_party/angle/src/libANGLE/renderer/SurfaceImpl.cpp
index e4b3d7c8b70..cd2fa3dde63 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/SurfaceImpl.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/SurfaceImpl.cpp
@@ -19,10 +19,10 @@ SurfaceImpl::~SurfaceImpl()
{
}
-egl::Error SurfaceImpl::swapWithDamage(EGLint *rects, EGLint n_rects)
+egl::Error SurfaceImpl::swapWithDamage(const gl::Context *context, EGLint *rects, EGLint n_rects)
{
UNREACHABLE();
- return egl::Error(EGL_BAD_SURFACE, "swapWithDamage implementation missing.");
+ return egl::EglBadSurface() << "swapWithDamage implementation missing.";
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/SurfaceImpl.h b/chromium/third_party/angle/src/libANGLE/renderer/SurfaceImpl.h
index 0e4f177d69e..7ce4056c84f 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/SurfaceImpl.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/SurfaceImpl.h
@@ -27,11 +27,11 @@ namespace egl
class Display;
struct Config;
struct SurfaceState;
+class Thread;
}
namespace rx
{
-class DisplayImpl;
class FramebufferImpl;
class SurfaceImpl : public FramebufferAttachmentObjectImpl
@@ -39,13 +39,17 @@ class SurfaceImpl : public FramebufferAttachmentObjectImpl
public:
SurfaceImpl(const egl::SurfaceState &surfaceState);
virtual ~SurfaceImpl();
- virtual void destroy(const DisplayImpl *displayImpl) {}
+ virtual void destroy(const egl::Display *display) {}
- virtual egl::Error initialize(const DisplayImpl *displayImpl) = 0;
+ virtual egl::Error initialize(const egl::Display *display) = 0;
virtual FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) = 0;
- virtual egl::Error swap(const DisplayImpl *displayImpl) = 0;
- virtual egl::Error swapWithDamage(EGLint *rects, EGLint n_rects);
- virtual egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) = 0;
+ virtual egl::Error swap(const gl::Context *context) = 0;
+ virtual egl::Error swapWithDamage(const gl::Context *context, EGLint *rects, EGLint n_rects);
+ virtual egl::Error postSubBuffer(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height) = 0;
virtual egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) = 0;
virtual egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) = 0;
virtual egl::Error releaseTexImage(EGLint buffer) = 0;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl.cpp b/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl.cpp
index 47a73902f0c..34480d80e02 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl.cpp
@@ -19,7 +19,7 @@ TextureImpl::~TextureImpl()
{
}
-gl::Error TextureImpl::copyTexture(ContextImpl *contextImpl,
+gl::Error TextureImpl::copyTexture(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -31,10 +31,10 @@ gl::Error TextureImpl::copyTexture(ContextImpl *contextImpl,
const gl::Texture *source)
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION, "CHROMIUM_copy_texture exposed but not implemented.");
+ return gl::InternalError() << "CHROMIUM_copy_texture exposed but not implemented.";
}
-gl::Error TextureImpl::copySubTexture(ContextImpl *contextImpl,
+gl::Error TextureImpl::copySubTexture(const gl::Context *context,
GLenum target,
size_t level,
const gl::Offset &destOffset,
@@ -46,13 +46,13 @@ gl::Error TextureImpl::copySubTexture(ContextImpl *contextImpl,
const gl::Texture *source)
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION, "CHROMIUM_copy_texture exposed but not implemented.");
+ return gl::InternalError() << "CHROMIUM_copy_texture exposed but not implemented.";
}
-gl::Error TextureImpl::copyCompressedTexture(ContextImpl *contextImpl, const gl::Texture *source)
+gl::Error TextureImpl::copyCompressedTexture(const gl::Context *context, const gl::Texture *source)
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION,
- "CHROMIUM_copy_compressed_texture exposed but not implemented.");
+ return gl::InternalError() << "CHROMIUM_copy_compressed_texture exposed but not implemented.";
}
+
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl.h b/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl.h
index 077485c3472..0412c3ebaf8 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl.h
@@ -46,7 +46,9 @@ class TextureImpl : public FramebufferAttachmentObjectImpl
TextureImpl(const gl::TextureState &state);
virtual ~TextureImpl();
- virtual gl::Error setImage(ContextImpl *contextImpl,
+ virtual gl::Error onDestroy(const gl::Context *context) { return gl::NoError(); }
+
+ virtual gl::Error setImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -55,7 +57,7 @@ class TextureImpl : public FramebufferAttachmentObjectImpl
GLenum type,
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) = 0;
- virtual gl::Error setSubImage(ContextImpl *contextImpl,
+ virtual gl::Error setSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -64,7 +66,7 @@ class TextureImpl : public FramebufferAttachmentObjectImpl
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) = 0;
- virtual gl::Error setCompressedImage(ContextImpl *contextImpl,
+ virtual gl::Error setCompressedImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -72,7 +74,7 @@ class TextureImpl : public FramebufferAttachmentObjectImpl
const gl::PixelUnpackState &unpack,
size_t imageSize,
const uint8_t *pixels) = 0;
- virtual gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+ virtual gl::Error setCompressedSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -81,20 +83,20 @@ class TextureImpl : public FramebufferAttachmentObjectImpl
size_t imageSize,
const uint8_t *pixels) = 0;
- virtual gl::Error copyImage(ContextImpl *contextImpl,
+ virtual gl::Error copyImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Rectangle &sourceArea,
GLenum internalFormat,
const gl::Framebuffer *source) = 0;
- virtual gl::Error copySubImage(ContextImpl *contextImpl,
+ virtual gl::Error copySubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Offset &destOffset,
const gl::Rectangle &sourceArea,
const gl::Framebuffer *source) = 0;
- virtual gl::Error copyTexture(ContextImpl *contextImpl,
+ virtual gl::Error copyTexture(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -104,7 +106,7 @@ class TextureImpl : public FramebufferAttachmentObjectImpl
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha,
const gl::Texture *source);
- virtual gl::Error copySubTexture(ContextImpl *contextImpl,
+ virtual gl::Error copySubTexture(const gl::Context *context,
GLenum target,
size_t level,
const gl::Offset &destOffset,
@@ -115,33 +117,36 @@ class TextureImpl : public FramebufferAttachmentObjectImpl
bool unpackUnmultiplyAlpha,
const gl::Texture *source);
- virtual gl::Error copyCompressedTexture(ContextImpl *contextImpl, const gl::Texture *source);
+ virtual gl::Error copyCompressedTexture(const gl::Context *context, const gl::Texture *source);
- virtual gl::Error setStorage(ContextImpl *contextImpl,
+ virtual gl::Error setStorage(const gl::Context *context,
GLenum target,
size_t levels,
GLenum internalFormat,
const gl::Extents &size) = 0;
- virtual gl::Error setStorageMultisample(ContextImpl *contextImpl,
+ virtual gl::Error setStorageMultisample(const gl::Context *context,
GLenum target,
GLsizei samples,
GLint internalformat,
const gl::Extents &size,
GLboolean fixedSampleLocations) = 0;
- virtual gl::Error setEGLImageTarget(GLenum target, egl::Image *image) = 0;
+ virtual gl::Error setEGLImageTarget(const gl::Context *context,
+ GLenum target,
+ egl::Image *image) = 0;
- virtual gl::Error setImageExternal(GLenum target,
+ virtual gl::Error setImageExternal(const gl::Context *context,
+ GLenum target,
egl::Stream *stream,
const egl::Stream::GLTextureDescription &desc) = 0;
- virtual gl::Error generateMipmap(ContextImpl *contextImpl) = 0;
+ virtual gl::Error generateMipmap(const gl::Context *context) = 0;
- virtual void setBaseLevel(GLuint baseLevel) = 0;
+ virtual gl::Error setBaseLevel(const gl::Context *context, GLuint baseLevel) = 0;
- virtual void bindTexImage(egl::Surface *surface) = 0;
- virtual void releaseTexImage() = 0;
+ virtual gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) = 0;
+ virtual gl::Error releaseTexImage(const gl::Context *context) = 0;
virtual void syncState(const gl::Texture::DirtyBits &dirtyBits) = 0;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl_mock.h b/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl_mock.h
index 83a1d21b404..d1245e34cbc 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl_mock.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl_mock.h
@@ -22,7 +22,7 @@ class MockTextureImpl : public TextureImpl
MockTextureImpl() : TextureImpl(mMockState), mMockState(GL_TEXTURE_2D) {}
virtual ~MockTextureImpl() { destructor(); }
MOCK_METHOD9(setImage,
- gl::Error(ContextImpl *,
+ gl::Error(const gl::Context *,
GLenum,
size_t,
GLenum,
@@ -32,7 +32,7 @@ class MockTextureImpl : public TextureImpl
const gl::PixelUnpackState &,
const uint8_t *));
MOCK_METHOD8(setSubImage,
- gl::Error(ContextImpl *,
+ gl::Error(const gl::Context *,
GLenum,
size_t,
const gl::Box &,
@@ -41,7 +41,7 @@ class MockTextureImpl : public TextureImpl
const gl::PixelUnpackState &,
const uint8_t *));
MOCK_METHOD8(setCompressedImage,
- gl::Error(ContextImpl *,
+ gl::Error(const gl::Context *,
GLenum,
size_t,
GLenum,
@@ -50,7 +50,7 @@ class MockTextureImpl : public TextureImpl
size_t,
const uint8_t *));
MOCK_METHOD8(setCompressedSubImage,
- gl::Error(ContextImpl *,
+ gl::Error(const gl::Context *,
GLenum,
size_t,
const gl::Box &,
@@ -59,21 +59,21 @@ class MockTextureImpl : public TextureImpl
size_t,
const uint8_t *));
MOCK_METHOD6(copyImage,
- gl::Error(ContextImpl *,
+ gl::Error(const gl::Context *,
GLenum,
size_t,
const gl::Rectangle &,
GLenum,
const gl::Framebuffer *));
MOCK_METHOD6(copySubImage,
- gl::Error(ContextImpl *,
+ gl::Error(const gl::Context *,
GLenum,
size_t,
const gl::Offset &,
const gl::Rectangle &,
const gl::Framebuffer *));
MOCK_METHOD10(copyTexture,
- gl::Error(ContextImpl *,
+ gl::Error(const gl::Context *,
GLenum,
size_t,
GLenum,
@@ -84,7 +84,7 @@ class MockTextureImpl : public TextureImpl
bool,
const gl::Texture *));
MOCK_METHOD10(copySubTexture,
- gl::Error(ContextImpl *,
+ gl::Error(const gl::Context *,
GLenum,
size_t,
const gl::Offset &,
@@ -94,22 +94,30 @@ class MockTextureImpl : public TextureImpl
bool,
bool,
const gl::Texture *));
- MOCK_METHOD2(copyCompressedTexture, gl::Error(ContextImpl *, const gl::Texture *source));
- MOCK_METHOD5(setStorage, gl::Error(ContextImpl *, GLenum, size_t, GLenum, const gl::Extents &));
- MOCK_METHOD3(setImageExternal,
- gl::Error(GLenum, egl::Stream *, const egl::Stream::GLTextureDescription &));
- MOCK_METHOD2(setEGLImageTarget, gl::Error(GLenum, egl::Image *));
- MOCK_METHOD1(generateMipmap, gl::Error(ContextImpl *));
- MOCK_METHOD1(bindTexImage, void(egl::Surface *));
- MOCK_METHOD0(releaseTexImage, void(void));
+ MOCK_METHOD2(copyCompressedTexture, gl::Error(const gl::Context *, const gl::Texture *source));
+ MOCK_METHOD5(setStorage,
+ gl::Error(const gl::Context *, GLenum, size_t, GLenum, const gl::Extents &));
+ MOCK_METHOD4(setImageExternal,
+ gl::Error(const gl::Context *,
+ GLenum,
+ egl::Stream *,
+ const egl::Stream::GLTextureDescription &));
+ MOCK_METHOD3(setEGLImageTarget, gl::Error(const gl::Context *, GLenum, egl::Image *));
+ MOCK_METHOD1(generateMipmap, gl::Error(const gl::Context *));
+ MOCK_METHOD2(bindTexImage, gl::Error(const gl::Context *, egl::Surface *));
+ MOCK_METHOD1(releaseTexImage, gl::Error(const gl::Context *));
- MOCK_METHOD3(getAttachmentRenderTarget,
- gl::Error(GLenum, const gl::ImageIndex &, FramebufferAttachmentRenderTarget **));
+ MOCK_METHOD4(getAttachmentRenderTarget,
+ gl::Error(const gl::Context *,
+ GLenum,
+ const gl::ImageIndex &,
+ FramebufferAttachmentRenderTarget **));
- MOCK_METHOD6(setStorageMultisample,
- gl::Error(ContextImpl *, GLenum, GLsizei, GLint, const gl::Extents &, GLboolean));
+ MOCK_METHOD6(
+ setStorageMultisample,
+ gl::Error(const gl::Context *, GLenum, GLsizei, GLint, const gl::Extents &, GLboolean));
- MOCK_METHOD1(setBaseLevel, void(GLuint));
+ MOCK_METHOD2(setBaseLevel, gl::Error(const gl::Context *, GLuint));
MOCK_METHOD1(syncState, void(const gl::Texture::DirtyBits &));
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/TransformFeedbackImpl.h b/chromium/third_party/angle/src/libANGLE/renderer/TransformFeedbackImpl.h
index 71e6374e74a..ad371e9b365 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/TransformFeedbackImpl.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/TransformFeedbackImpl.h
@@ -26,8 +26,9 @@ class TransformFeedbackImpl : angle::NonCopyable
virtual void pause() = 0;
virtual void resume() = 0;
- virtual void bindGenericBuffer(const BindingPointer<gl::Buffer> &binding) = 0;
- virtual void bindIndexedBuffer(size_t index, const OffsetBindingPointer<gl::Buffer> &binding) = 0;
+ virtual void bindGenericBuffer(const gl::BindingPointer<gl::Buffer> &binding) = 0;
+ virtual void bindIndexedBuffer(size_t index,
+ const gl::OffsetBindingPointer<gl::Buffer> &binding) = 0;
protected:
const gl::TransformFeedbackState &mState;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/TransformFeedbackImpl_mock.h b/chromium/third_party/angle/src/libANGLE/renderer/TransformFeedbackImpl_mock.h
index 18832acc7c3..2de3ad79a91 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/TransformFeedbackImpl_mock.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/TransformFeedbackImpl_mock.h
@@ -30,8 +30,8 @@ class MockTransformFeedbackImpl : public TransformFeedbackImpl
MOCK_METHOD0(pause, void());
MOCK_METHOD0(resume, void());
- MOCK_METHOD1(bindGenericBuffer, void(const BindingPointer<gl::Buffer> &));
- MOCK_METHOD2(bindIndexedBuffer, void(size_t, const OffsetBindingPointer<gl::Buffer> &));
+ MOCK_METHOD1(bindGenericBuffer, void(const gl::BindingPointer<gl::Buffer> &));
+ MOCK_METHOD2(bindIndexedBuffer, void(size_t, const gl::OffsetBindingPointer<gl::Buffer> &));
MOCK_METHOD0(destructor, void());
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/VertexArrayImpl.h b/chromium/third_party/angle/src/libANGLE/renderer/VertexArrayImpl.h
index a933ba2f5b5..5180affb4d6 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/VertexArrayImpl.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/VertexArrayImpl.h
@@ -21,8 +21,13 @@ class VertexArrayImpl : angle::NonCopyable
{
public:
VertexArrayImpl(const gl::VertexArrayState &data) : mData(data) {}
- virtual ~VertexArrayImpl() { }
- virtual void syncState(ContextImpl *contextImpl, const gl::VertexArray::DirtyBits &dirtyBits) {}
+ virtual void syncState(const gl::Context *context, const gl::VertexArray::DirtyBits &dirtyBits)
+ {
+ }
+
+ virtual void destroy(const gl::Context *context) {}
+ virtual ~VertexArrayImpl() {}
+
protected:
const gl::VertexArrayState &mData;
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/BufferD3D.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/BufferD3D.h
index e8abdc35366..bce6145184d 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/BufferD3D.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/BufferD3D.h
@@ -18,7 +18,7 @@
namespace gl
{
struct VertexAttribute;
-struct VertexBinding;
+class VertexBinding;
}
namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/DeviceD3D.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/DeviceD3D.cpp
index f40e6e6cab5..7123ac80130 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/DeviceD3D.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/DeviceD3D.cpp
@@ -39,11 +39,11 @@ egl::Error DeviceD3D::getDevice(void **outValue)
if (!mIsInitialized)
{
*outValue = nullptr;
- return egl::Error(EGL_BAD_DEVICE_EXT);
+ return egl::EglBadDevice();
}
*outValue = mDevice;
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error DeviceD3D::initialize(void *device,
@@ -53,15 +53,11 @@ egl::Error DeviceD3D::initialize(void *device,
ASSERT(!mIsInitialized);
if (mIsInitialized)
{
- return egl::Error(EGL_BAD_DEVICE_EXT);
+ return egl::EglBadDevice();
}
- mDevice = device;
- mDeviceType = deviceType;
- mDeviceExternallySourced = !!deviceExternallySourced;
-
#if defined(ANGLE_ENABLE_D3D11)
- if (mDeviceType == EGL_D3D11_DEVICE_ANGLE)
+ if (deviceType == EGL_D3D11_DEVICE_ANGLE)
{
// Validate the device
IUnknown *iunknown = reinterpret_cast<IUnknown *>(device);
@@ -71,7 +67,7 @@ egl::Error DeviceD3D::initialize(void *device,
iunknown->QueryInterface(__uuidof(ID3D11Device), reinterpret_cast<void **>(&d3dDevice));
if (FAILED(hr))
{
- return egl::Error(EGL_BAD_ATTRIBUTE, "Invalid D3D device passed into EGLDeviceEXT");
+ return egl::EglBadAttribute() << "Invalid D3D device passed into EGLDeviceEXT";
}
// The QI to ID3D11Device adds a ref to the D3D11 device.
@@ -81,12 +77,15 @@ egl::Error DeviceD3D::initialize(void *device,
else
#endif
{
- ASSERT(!mDeviceExternallySourced);
+ ASSERT(deviceExternallySourced == EGL_FALSE);
}
- mIsInitialized = true;
+ mDevice = device;
+ mDeviceType = deviceType;
+ mDeviceExternallySourced = !!deviceExternallySourced;
+ mIsInitialized = true;
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
EGLint DeviceD3D::getType()
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/DisplayD3D.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/DisplayD3D.cpp
index cb8c44e7f28..ad227b21508 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/DisplayD3D.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/DisplayD3D.cpp
@@ -10,16 +10,17 @@
#include <EGL/eglext.h>
-#include "libANGLE/Context.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"
-#include "libANGLE/renderer/d3d/DeviceD3D.h"
#if defined (ANGLE_ENABLE_D3D9)
# include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
@@ -148,7 +149,7 @@ egl::Error CreateRendererD3D(egl::Display *display, RendererD3D **outRenderer)
SafeDelete(renderer);
}
- return egl::Error(EGL_NOT_INITIALIZED, "No available renderers.");
+ return egl::EglNotInitialized() << "No available renderers.";
}
DisplayD3D::DisplayD3D(const egl::DisplayState &state) : DisplayImpl(state), mRenderer(nullptr)
@@ -215,7 +216,7 @@ StreamProducerImpl *DisplayD3D::createStreamProducerD3DTextureNV12(
egl::Error DisplayD3D::makeCurrent(egl::Surface *drawSurface, egl::Surface *readSurface, gl::Context *context)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error DisplayD3D::initialize(egl::Display *display)
@@ -223,7 +224,7 @@ egl::Error DisplayD3D::initialize(egl::Display *display)
ASSERT(mRenderer == nullptr && display != nullptr);
mDisplay = display;
ANGLE_TRY(CreateRendererD3D(display, &mRenderer));
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
void DisplayD3D::terminate()
@@ -243,14 +244,14 @@ bool DisplayD3D::testDeviceLost()
return mRenderer->testDeviceLost();
}
-egl::Error DisplayD3D::restoreLostDevice()
+egl::Error DisplayD3D::restoreLostDevice(const egl::Display *display)
{
// Release surface resources to make the Reset() succeed
for (auto &surface : mState.surfaceSet)
{
if (surface->getBoundTexture())
{
- surface->releaseTexImage(EGL_BACK_BUFFER);
+ ANGLE_TRY(surface->releaseTexImage(display->getProxyContext(), EGL_BACK_BUFFER));
}
SurfaceD3D *surfaceD3D = GetImplAs<SurfaceD3D>(surface);
surfaceD3D->releaseSwapChain();
@@ -258,7 +259,7 @@ egl::Error DisplayD3D::restoreLostDevice()
if (!mRenderer->resetDevice())
{
- return egl::Error(EGL_BAD_ALLOC);
+ return egl::EglBadAlloc();
}
// Restore any surfaces that may have been lost
@@ -266,14 +267,10 @@ egl::Error DisplayD3D::restoreLostDevice()
{
SurfaceD3D *surfaceD3D = GetImplAs<SurfaceD3D>(surface);
- egl::Error error = surfaceD3D->resetSwapChain();
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(surfaceD3D->resetSwapChain(display));
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
bool DisplayD3D::isValidNativeWindow(EGLNativeWindowType window) const
@@ -325,34 +322,35 @@ void DisplayD3D::generateCaps(egl::Caps *outCaps) const
outCaps->textureNPOT = mRenderer->getNativeExtensions().textureNPOT;
}
-egl::Error DisplayD3D::waitClient() const
+egl::Error DisplayD3D::waitClient(const gl::Context *context) const
{
for (auto &surface : mState.surfaceSet)
{
SurfaceD3D *surfaceD3D = GetImplAs<SurfaceD3D>(surface);
- surfaceD3D->checkForOutOfDateSwapChain();
+ surfaceD3D->checkForOutOfDateSwapChain(context);
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error DisplayD3D::waitNative(EGLint engine,
- egl::Surface *drawSurface,
- egl::Surface *readSurface) const
+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);
- drawSurfaceD3D->checkForOutOfDateSwapChain();
+ drawSurfaceD3D->checkForOutOfDateSwapChain(context);
}
if (readSurface != nullptr)
{
SurfaceD3D *readurfaceD3D = GetImplAs<SurfaceD3D>(readSurface);
- readurfaceD3D->checkForOutOfDateSwapChain();
+ readurfaceD3D->checkForOutOfDateSwapChain(context);
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
gl::Version DisplayD3D::getMaxSupportedESVersion() const
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/DisplayD3D.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/DisplayD3D.h
index 944e623affd..ecad1319d1a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/DisplayD3D.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/DisplayD3D.h
@@ -53,7 +53,7 @@ class DisplayD3D : public DisplayImpl
egl::ConfigSet generateConfigs() override;
bool testDeviceLost() override;
- egl::Error restoreLostDevice() override;
+ egl::Error restoreLostDevice(const egl::Display *display) override;
bool isValidNativeWindow(EGLNativeWindowType window) const override;
egl::Error validateClientBuffer(const egl::Config *configuration,
@@ -65,10 +65,8 @@ class DisplayD3D : public DisplayImpl
std::string getVendorString() const override;
- egl::Error waitClient() const override;
- egl::Error waitNative(EGLint engine,
- egl::Surface *drawSurface,
- egl::Surface *readSurface) 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:
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/DynamicHLSL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/DynamicHLSL.cpp
index b4366e7d621..27d29948b7f 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/DynamicHLSL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/DynamicHLSL.cpp
@@ -10,13 +10,14 @@
#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"
-#include "libANGLE/VaryingPacking.h"
using namespace gl;
@@ -26,7 +27,28 @@ namespace rx
namespace
{
-std::string HLSLComponentTypeString(GLenum componentType)
+// 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)
{
@@ -44,12 +66,16 @@ std::string HLSLComponentTypeString(GLenum componentType)
}
}
-std::string HLSLComponentTypeString(GLenum componentType, int componentCount)
+void HLSLComponentTypeString(std::ostringstream &ostream, GLenum componentType, int componentCount)
{
- return HLSLComponentTypeString(componentType) + (componentCount > 1 ? Str(componentCount) : "");
+ ostream << HLSLComponentTypeString(componentType);
+ if (componentCount > 1)
+ {
+ ostream << componentCount;
+ }
}
-std::string HLSLMatrixTypeString(GLenum type)
+const char *HLSLMatrixTypeString(GLenum type)
{
switch (type)
{
@@ -77,15 +103,16 @@ std::string HLSLMatrixTypeString(GLenum type)
}
}
-std::string HLSLTypeString(GLenum type)
+void HLSLTypeString(std::ostringstream &ostream, GLenum type)
{
if (gl::IsMatrixType(type))
{
- return HLSLMatrixTypeString(type);
+ ostream << HLSLMatrixTypeString(type);
+ return;
}
- return HLSLComponentTypeString(gl::VariableComponentType(type),
- gl::VariableComponentCount(type));
+ HLSLComponentTypeString(ostream, gl::VariableComponentType(type),
+ gl::VariableComponentCount(type));
}
const PixelShaderOutputVariable *FindOutputAtLocation(
@@ -103,7 +130,7 @@ const PixelShaderOutputVariable *FindOutputAtLocation(
return nullptr;
}
-void WriteArrayString(std::stringstream &strstr, unsigned int i)
+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.");
@@ -132,8 +159,8 @@ std::string DynamicHLSL::generateVertexShaderForInputLayout(
const InputLayout &inputLayout,
const std::vector<sh::Attribute> &shaderAttributes) const
{
- std::stringstream structStream;
- std::stringstream initStream;
+ std::ostringstream structStream;
+ std::ostringstream initStream;
structStream << "struct VS_INPUT\n"
<< "{\n";
@@ -191,13 +218,13 @@ std::string DynamicHLSL::generateVertexShaderForInputLayout(
}
else
{
- structStream << " " << HLSLComponentTypeString(
- componentType,
- VariableComponentCount(shaderAttribute.type));
+ structStream << " ";
+ HLSLComponentTypeString(structStream, componentType,
+ VariableComponentCount(shaderAttribute.type));
}
}
- structStream << " " << decorateVariable(shaderAttribute.name) << " : ";
+ structStream << " " << DecorateVariable(shaderAttribute.name) << " : ";
if (shaderAttribute.name == "gl_InstanceID")
{
@@ -216,7 +243,7 @@ std::string DynamicHLSL::generateVertexShaderForInputLayout(
structStream << ";\n";
// HLSL code for initialization
- initStream << " " << decorateVariable(shaderAttribute.name) << " = ";
+ 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)
@@ -224,11 +251,11 @@ std::string DynamicHLSL::generateVertexShaderForInputLayout(
if (IsMatrixType(shaderAttribute.type) ||
(mRenderer->getVertexConversionType(vertexFormatType) & VERTEX_CONVERT_GPU) != 0)
{
- initStream << generateAttributeConversionHLSL(vertexFormatType, shaderAttribute);
+ GenerateAttributeConversionHLSL(vertexFormatType, shaderAttribute, initStream);
}
else
{
- initStream << "input." << decorateVariable(shaderAttribute.name);
+ initStream << "input." << DecorateVariable(shaderAttribute.name);
}
initStream << ";\n";
@@ -261,8 +288,8 @@ std::string DynamicHLSL::generatePixelShaderForOutputSignature(
std::string targetSemantic = (shaderModel >= 4) ? "SV_TARGET" : "COLOR";
std::string depthSemantic = (shaderModel >= 4) ? "SV_Depth" : "DEPTH";
- std::stringstream declarationStream;
- std::stringstream copyStream;
+ std::ostringstream declarationStream;
+ std::ostringstream copyStream;
declarationStream << "struct PS_OUTPUT\n"
"{\n";
@@ -289,8 +316,9 @@ std::string DynamicHLSL::generatePixelShaderForOutputSignature(
// corresponding to unwritten variables are similarly undefined.
if (outputVariable)
{
- declarationStream << " " + HLSLTypeString(outputVariable->type) << " "
- << outputVariable->name << " : " << targetSemantic
+ declarationStream << " ";
+ HLSLTypeString(declarationStream, outputVariable->type);
+ declarationStream << " " << outputVariable->name << " : " << targetSemantic
<< static_cast<int>(layoutIndex) << ";\n";
copyStream << " output." << outputVariable->name << " = "
@@ -325,7 +353,7 @@ std::string DynamicHLSL::generatePixelShaderForOutputSignature(
void DynamicHLSL::generateVaryingLinkHLSL(const VaryingPacking &varyingPacking,
const BuiltinInfo &builtins,
bool programUsesPointSize,
- std::stringstream &hlslStream) const
+ std::ostringstream &hlslStream) const
{
ASSERT(builtins.dxPosition.enabled);
hlslStream << "{\n"
@@ -384,7 +412,7 @@ void DynamicHLSL::generateVaryingLinkHLSL(const VaryingPacking &varyingPacking,
GLenum transposedType = gl::TransposeMatrixType(varying.type);
GLenum componentType = gl::VariableComponentType(transposedType);
int columnCount = gl::VariableColumnCount(transposedType);
- hlslStream << HLSLComponentTypeString(componentType, columnCount);
+ HLSLComponentTypeString(hlslStream, componentType, columnCount);
unsigned int semanticIndex = registerInfo.semanticIndex;
hlslStream << " v" << semanticIndex << " : " << varyingSemantic << semanticIndex << ";\n";
}
@@ -392,7 +420,7 @@ void DynamicHLSL::generateVaryingLinkHLSL(const VaryingPacking &varyingPacking,
hlslStream << "};\n";
}
-void DynamicHLSL::generateShaderLinkHLSL(const gl::ContextState &data,
+void DynamicHLSL::generateShaderLinkHLSL(const gl::Context *context,
const gl::ProgramState &programData,
const ProgramD3DMetadata &programMetadata,
const VaryingPacking &varyingPacking,
@@ -402,8 +430,9 @@ void DynamicHLSL::generateShaderLinkHLSL(const gl::ContextState &data,
{
ASSERT(pixelHLSL->empty() && vertexHLSL->empty());
- const gl::Shader *vertexShaderGL = programData.getAttachedVertexShader();
- const gl::Shader *fragmentShaderGL = programData.getAttachedFragmentShader();
+ 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();
@@ -417,8 +446,8 @@ void DynamicHLSL::generateShaderLinkHLSL(const gl::ContextState &data,
// Validation done in the compiler
ASSERT(!fragmentShader->usesFragColor() || !fragmentShader->usesFragData());
- std::stringstream vertexStream;
- vertexStream << vertexShaderGL->getTranslatedSource();
+ std::ostringstream vertexStream;
+ vertexStream << vertexShaderGL->getTranslatedSource(context);
// Instanced PointSprite emulation requires additional entries originally generated in the
// GeometryShader HLSL. These include pointsize clamp values.
@@ -518,10 +547,10 @@ void DynamicHLSL::generateShaderLinkHLSL(const gl::ContextState &data,
if (packedVarying.isStructField())
{
- vertexStream << decorateVariable(packedVarying.parentStructName) << ".";
+ vertexStream << DecorateVariable(packedVarying.parentStructName) << ".";
}
- vertexStream << decorateVariable(varying.name);
+ vertexStream << DecorateVariable(varying.name);
if (varying.isArray())
{
@@ -585,8 +614,8 @@ void DynamicHLSL::generateShaderLinkHLSL(const gl::ContextState &data,
const auto &pixelBuiltins = builtinsD3D[SHADER_PIXEL];
- std::stringstream pixelStream;
- pixelStream << fragmentShaderGL->getTranslatedSource();
+ std::ostringstream pixelStream;
+ pixelStream << fragmentShaderGL->getTranslatedSource(context);
pixelStream << "struct PS_INPUT\n";
generateVaryingLinkHLSL(varyingPacking, pixelBuiltins, builtinsD3D.usesPointSize(),
pixelStream);
@@ -712,20 +741,19 @@ void DynamicHLSL::generateShaderLinkHLSL(const gl::ContextState &data,
const auto &varying = *packedVarying.varying;
ASSERT(!varying.isBuiltIn() && !varying.isStruct());
- // Don't reference VS-only transform feedback varyings in the PS.
- // TODO: Consider updating the fragment shader's varyings with a parameter signaling that a
- // varying is only used in the vertex shader in MergeVaryings
- if (packedVarying.vertexOnly || (!varying.staticUse && !packedVarying.isStructField()))
+ // 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(packedVarying.parentStructName) << ".";
}
- pixelStream << decorateVariable(varying.name);
+ pixelStream << DecorateVariable(varying.name);
if (varying.isArray())
{
@@ -769,11 +797,12 @@ void DynamicHLSL::generateShaderLinkHLSL(const gl::ContextState &data,
*pixelHLSL = pixelStream.str();
}
-std::string DynamicHLSL::generateComputeShaderLinkHLSL(const gl::ProgramState &programData) const
+std::string DynamicHLSL::generateComputeShaderLinkHLSL(const gl::Context *context,
+ const gl::ProgramState &programData) const
{
- const gl::Shader *computeShaderGL = programData.getAttachedComputeShader();
+ gl::Shader *computeShaderGL = programData.getAttachedComputeShader();
std::stringstream computeStream;
- std::string translatedSource = computeShaderGL->getTranslatedSource();
+ std::string translatedSource = computeShaderGL->getTranslatedSource(context);
computeStream << translatedSource;
bool usesWorkGroupID = translatedSource.find("GL_USES_WORK_GROUP_ID") != std::string::npos;
@@ -811,7 +840,7 @@ std::string DynamicHLSL::generateComputeShaderLinkHLSL(const gl::ProgramState &p
computeStream << "};\n\n";
- const sh::WorkGroupSize &localSize = computeShaderGL->getWorkGroupSize();
+ const sh::WorkGroupSize &localSize = computeShaderGL->getWorkGroupSize(context);
computeStream << "[numthreads(" << localSize[0] << ", " << localSize[1] << ", " << localSize[2]
<< ")]\n";
@@ -847,7 +876,7 @@ std::string DynamicHLSL::generateGeometryShaderPreamble(const VaryingPacking &va
{
ASSERT(mRenderer->getMajorShaderModel() >= 4);
- std::stringstream preambleStream;
+ std::ostringstream preambleStream;
const auto &vertexBuiltins = builtinsD3D[SHADER_VERTEX];
@@ -1056,46 +1085,34 @@ std::string DynamicHLSL::generateGeometryShaderHLSL(gl::PrimitiveType primitiveT
return shaderStream.str();
}
-// This method needs to match OutputHLSL::decorate
-std::string DynamicHLSL::decorateVariable(const std::string &name)
+// static
+void DynamicHLSL::GenerateAttributeConversionHLSL(gl::VertexFormatType vertexFormatType,
+ const sh::ShaderVariable &shaderAttrib,
+ std::ostringstream &outStream)
{
- if (name.compare(0, 3, "gl_") != 0)
- {
- return "_" + name;
- }
-
- return name;
-}
-
-std::string DynamicHLSL::generateAttributeConversionHLSL(
- gl::VertexFormatType vertexFormatType,
- const sh::ShaderVariable &shaderAttrib) const
-{
- const gl::VertexFormat &vertexFormat = gl::GetVertexFormatFromType(vertexFormatType);
- std::string attribString = "input." + decorateVariable(shaderAttrib.name);
-
// Matrix
if (IsMatrixType(shaderAttrib.type))
{
- return "transpose(" + attribString + ")";
+ 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)
- bool requiresTypeConversion =
- (shaderComponentType == GL_FLOAT && vertexFormat.type != GL_FLOAT);
-
- if (requiresTypeConversion)
+ if (shaderComponentType == GL_FLOAT && vertexFormat.type != GL_FLOAT)
{
// TODO: normalization for 32-bit integer formats
ASSERT(!vertexFormat.normalized && !vertexFormat.pureInteger);
- return "float" + Str(shaderComponentCount) + "(" + attribString + ")";
+ outStream << "float" << shaderComponentCount << "(input."
+ << DecorateVariable(shaderAttrib.name) << ")";
+ return;
}
// No conversion necessary
- return attribString;
+ outStream << "input." << DecorateVariable(shaderAttrib.name);
}
void DynamicHLSL::getPixelShaderOutputKey(const gl::ContextState &data,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h
index 0972a62cc2d..4ab0626cc2c 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h
@@ -117,14 +117,15 @@ class DynamicHLSL : angle::NonCopyable
const std::vector<PixelShaderOutputVariable> &outputVariables,
bool usesFragDepth,
const std::vector<GLenum> &outputLayout) const;
- void generateShaderLinkHLSL(const gl::ContextState &data,
+ 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::ProgramState &programData) const;
+ std::string generateComputeShaderLinkHLSL(const gl::Context *context,
+ const gl::ProgramState &programData) const;
std::string generateGeometryShaderPreamble(const gl::VaryingPacking &varyingPacking,
const BuiltinVaryingsD3D &builtinsD3D) const;
@@ -146,13 +147,11 @@ class DynamicHLSL : angle::NonCopyable
void generateVaryingLinkHLSL(const gl::VaryingPacking &varyingPacking,
const BuiltinInfo &builtins,
bool programUsesPointSize,
- std::stringstream &hlslStream) const;
+ std::ostringstream &hlslStream) const;
- // Prepend an underscore
- static std::string decorateVariable(const std::string &name);
-
- std::string generateAttributeConversionHLSL(gl::VertexFormatType vertexFormatType,
- const sh::ShaderVariable &shaderAttrib) const;
+ static void GenerateAttributeConversionHLSL(gl::VertexFormatType vertexFormatType,
+ const sh::ShaderVariable &shaderAttrib,
+ std::ostringstream &outStream);
};
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp
index caee47d7ec3..f78bf2b702f 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp
@@ -39,26 +39,27 @@ EGLImageD3D::~EGLImageD3D()
egl::Error EGLImageD3D::initialize()
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-gl::Error EGLImageD3D::orphan(egl::ImageSibling *sibling)
+gl::Error EGLImageD3D::orphan(const gl::Context *context, egl::ImageSibling *sibling)
{
if (sibling == mState.source.get())
{
- ANGLE_TRY(copyToLocalRendertarget());
+ ANGLE_TRY(copyToLocalRendertarget(context));
}
return gl::NoError();
}
-gl::Error EGLImageD3D::getRenderTarget(RenderTargetD3D **outRT) const
+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(GL_NONE, mState.imageIndex, &rt));
+ ANGLE_TRY(
+ mState.source->getAttachmentRenderTarget(context, GL_NONE, mState.imageIndex, &rt));
*outRT = static_cast<RenderTargetD3D *>(rt);
return gl::NoError();
}
@@ -70,13 +71,13 @@ gl::Error EGLImageD3D::getRenderTarget(RenderTargetD3D **outRT) const
}
}
-gl::Error EGLImageD3D::copyToLocalRendertarget()
+gl::Error EGLImageD3D::copyToLocalRendertarget(const gl::Context *context)
{
ASSERT(mState.source.get() != nullptr);
ASSERT(mRenderTarget == nullptr);
RenderTargetD3D *curRenderTarget = nullptr;
- ANGLE_TRY(getRenderTarget(&curRenderTarget));
+ ANGLE_TRY(getRenderTarget(context, &curRenderTarget));
// This only currently applies do D3D11, where it invalidates FBOs with this Image attached.
curRenderTarget->signalDirty();
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/EGLImageD3D.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/EGLImageD3D.h
index 98e78a3baea..1ee79844263 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/EGLImageD3D.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/EGLImageD3D.h
@@ -11,6 +11,11 @@
#include "libANGLE/renderer/ImageImpl.h"
+namespace gl
+{
+class Context;
+}
+
namespace egl
{
class AttributeMap;
@@ -35,12 +40,12 @@ class EGLImageD3D final : public ImageImpl
egl::Error initialize() override;
- gl::Error orphan(egl::ImageSibling *sibling) override;
+ gl::Error orphan(const gl::Context *context, egl::ImageSibling *sibling) override;
- gl::Error getRenderTarget(RenderTargetD3D **outRT) const;
+ gl::Error getRenderTarget(const gl::Context *context, RenderTargetD3D **outRT) const;
private:
- gl::Error copyToLocalRendertarget();
+ gl::Error copyToLocalRendertarget(const gl::Context *context);
RendererD3D *mRenderer;
RenderTargetD3D *mRenderTarget;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/FramebufferD3D.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
index 86653f64536..e1f9bc5dad7 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
@@ -9,6 +9,7 @@
#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"
@@ -95,13 +96,13 @@ FramebufferD3D::~FramebufferD3D()
{
}
-gl::Error FramebufferD3D::clear(ContextImpl *context, GLbitfield mask)
+gl::Error FramebufferD3D::clear(const gl::Context *context, GLbitfield mask)
{
ClearParameters clearParams = GetClearParameters(context->getGLState(), mask);
return clearImpl(context, clearParams);
}
-gl::Error FramebufferD3D::clearBufferfv(ContextImpl *context,
+gl::Error FramebufferD3D::clearBufferfv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLfloat *values)
@@ -128,7 +129,7 @@ gl::Error FramebufferD3D::clearBufferfv(ContextImpl *context,
return clearImpl(context, clearParams);
}
-gl::Error FramebufferD3D::clearBufferuiv(ContextImpl *context,
+gl::Error FramebufferD3D::clearBufferuiv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLuint *values)
@@ -145,7 +146,7 @@ gl::Error FramebufferD3D::clearBufferuiv(ContextImpl *context,
return clearImpl(context, clearParams);
}
-gl::Error FramebufferD3D::clearBufferiv(ContextImpl *context,
+gl::Error FramebufferD3D::clearBufferiv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLint *values)
@@ -172,7 +173,7 @@ gl::Error FramebufferD3D::clearBufferiv(ContextImpl *context,
return clearImpl(context, clearParams);
}
-gl::Error FramebufferD3D::clearBufferfi(ContextImpl *context,
+gl::Error FramebufferD3D::clearBufferfi(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
GLfloat depth,
@@ -188,7 +189,7 @@ gl::Error FramebufferD3D::clearBufferfi(ContextImpl *context,
return clearImpl(context, clearParams);
}
-GLenum FramebufferD3D::getImplementationColorReadFormat() const
+GLenum FramebufferD3D::getImplementationColorReadFormat(const gl::Context *context) const
{
const gl::FramebufferAttachment *readAttachment = mState.getReadAttachment();
@@ -198,7 +199,7 @@ GLenum FramebufferD3D::getImplementationColorReadFormat() const
}
RenderTargetD3D *attachmentRenderTarget = nullptr;
- gl::Error error = readAttachment->getRenderTarget(&attachmentRenderTarget);
+ gl::Error error = readAttachment->getRenderTarget(context, &attachmentRenderTarget);
if (error.isError())
{
return GL_NONE;
@@ -211,7 +212,7 @@ GLenum FramebufferD3D::getImplementationColorReadFormat() const
return implementationFormatInfo.getReadPixelsFormat();
}
-GLenum FramebufferD3D::getImplementationColorReadType() const
+GLenum FramebufferD3D::getImplementationColorReadType(const gl::Context *context) const
{
const gl::FramebufferAttachment *readAttachment = mState.getReadAttachment();
@@ -221,7 +222,7 @@ GLenum FramebufferD3D::getImplementationColorReadType() const
}
RenderTargetD3D *attachmentRenderTarget = nullptr;
- gl::Error error = readAttachment->getRenderTarget(&attachmentRenderTarget);
+ gl::Error error = readAttachment->getRenderTarget(context, &attachmentRenderTarget);
if (error.isError())
{
return GL_NONE;
@@ -234,29 +235,41 @@ GLenum FramebufferD3D::getImplementationColorReadType() const
return implementationFormatInfo.getReadPixelsType();
}
-gl::Error FramebufferD3D::readPixels(ContextImpl *context,
- const gl::Rectangle &area,
+gl::Error FramebufferD3D::readPixels(const gl::Context *context,
+ const gl::Rectangle &origArea,
GLenum format,
GLenum type,
void *pixels) const
{
+ // 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, area.width, packState.alignment, packState.rowLength),
- outputPitch);
+ 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(area, format, type, outputPitch, packState,
+ return readPixelsImpl(context, area, format, type, outputPitch, packState,
reinterpret_cast<uint8_t *>(pixels) + outputSkipBytes);
}
-gl::Error FramebufferD3D::blit(ContextImpl *context,
+gl::Error FramebufferD3D::blit(const gl::Context *context,
const gl::Rectangle &sourceArea,
const gl::Rectangle &destArea,
GLbitfield mask,
@@ -265,7 +278,7 @@ gl::Error FramebufferD3D::blit(ContextImpl *context,
const auto &glState = context->getGLState();
const gl::Framebuffer *sourceFramebuffer = glState.getReadFramebuffer();
const gl::Rectangle *scissor = glState.isScissorTestEnabled() ? &glState.getScissor() : nullptr;
- ANGLE_TRY(blitImpl(sourceArea, destArea, scissor, (mask & GL_COLOR_BUFFER_BIT) != 0,
+ 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));
@@ -297,14 +310,12 @@ bool FramebufferD3D::checkStatus() const
return true;
}
-void FramebufferD3D::syncState(ContextImpl *contextImpl,
+void FramebufferD3D::syncState(const gl::Context *context,
const gl::Framebuffer::DirtyBits &dirtyBits)
{
- bool invalidateColorAttachmentCache = false;
-
if (!mColorAttachmentsForRender.valid())
{
- invalidateColorAttachmentCache = true;
+ return;
}
for (auto dirtyBit : dirtyBits)
@@ -313,13 +324,19 @@ void FramebufferD3D::syncState(ContextImpl *contextImpl,
dirtyBit < gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_MAX) ||
dirtyBit == gl::Framebuffer::DIRTY_BIT_DRAW_BUFFERS)
{
- invalidateColorAttachmentCache = true;
+ mColorAttachmentsForRender.reset();
}
}
+}
- if (!invalidateColorAttachmentCache)
+const gl::AttachmentList &FramebufferD3D::getColorAttachmentsForRender(const gl::Context *context)
+{
+ gl::DrawBufferMask activeProgramOutputs =
+ context->getContextState().getState().getProgram()->getActiveOutputVariables();
+
+ if (mColorAttachmentsForRender.valid() && mCurrentActiveProgramOutputs == activeProgramOutputs)
{
- return;
+ return mColorAttachmentsForRender.value();
}
// Does not actually free memory
@@ -334,7 +351,8 @@ void FramebufferD3D::syncState(ContextImpl *contextImpl,
GLenum drawBufferState = drawBufferStates[attachmentIndex];
const gl::FramebufferAttachment &colorAttachment = colorAttachments[attachmentIndex];
- if (colorAttachment.isAttached() && drawBufferState != GL_NONE)
+ if (colorAttachment.isAttached() && drawBufferState != GL_NONE &&
+ activeProgramOutputs[attachmentIndex])
{
ASSERT(drawBufferState == GL_BACK ||
drawBufferState == (GL_COLOR_ATTACHMENT0_EXT + attachmentIndex));
@@ -347,11 +365,8 @@ void FramebufferD3D::syncState(ContextImpl *contextImpl,
}
mColorAttachmentsForRender = std::move(colorAttachmentsForRender);
-}
+ mCurrentActiveProgramOutputs = activeProgramOutputs;
-const gl::AttachmentList &FramebufferD3D::getColorAttachmentsForRender() const
-{
- ASSERT(mColorAttachmentsForRender.valid());
return mColorAttachmentsForRender.value();
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/FramebufferD3D.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/FramebufferD3D.h
index 903b3febf72..ff0be310eed 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/FramebufferD3D.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/FramebufferD3D.h
@@ -59,34 +59,34 @@ class FramebufferD3D : public FramebufferImpl
FramebufferD3D(const gl::FramebufferState &data, RendererD3D *renderer);
virtual ~FramebufferD3D();
- gl::Error clear(ContextImpl *impl, GLbitfield mask) override;
- gl::Error clearBufferfv(ContextImpl *impl,
+ 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(ContextImpl *impl,
+ gl::Error clearBufferuiv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLuint *values) override;
- gl::Error clearBufferiv(ContextImpl *impl,
+ gl::Error clearBufferiv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLint *values) override;
- gl::Error clearBufferfi(ContextImpl *impl,
+ gl::Error clearBufferfi(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
GLfloat depth,
GLint stencil) override;
- GLenum getImplementationColorReadFormat() const override;
- GLenum getImplementationColorReadType() const override;
- gl::Error readPixels(ContextImpl *impl,
+ 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) const override;
- gl::Error blit(ContextImpl *impl,
+ gl::Error blit(const gl::Context *context,
const gl::Rectangle &sourceArea,
const gl::Rectangle &destArea,
GLbitfield mask,
@@ -94,23 +94,26 @@ class FramebufferD3D : public FramebufferImpl
bool checkStatus() const override;
- void syncState(ContextImpl *contextImpl, const gl::Framebuffer::DirtyBits &dirtyBits) override;
+ void syncState(const gl::Context *context,
+ const gl::Framebuffer::DirtyBits &dirtyBits) override;
- const gl::AttachmentList &getColorAttachmentsForRender() const;
+ const gl::AttachmentList &getColorAttachmentsForRender(const gl::Context *context);
gl::Error getSamplePosition(size_t index, GLfloat *xy) const override;
private:
- virtual gl::Error clearImpl(ContextImpl *impl, const ClearParameters &clearParams) = 0;
+ virtual gl::Error clearImpl(const gl::Context *context, const ClearParameters &clearParams) = 0;
- virtual gl::Error readPixelsImpl(const gl::Rectangle &area,
+ 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) const = 0;
- virtual gl::Error blitImpl(const gl::Rectangle &sourceArea,
+ virtual gl::Error blitImpl(const gl::Context *context,
+ const gl::Rectangle &sourceArea,
const gl::Rectangle &destArea,
const gl::Rectangle *scissor,
bool blitRenderTarget,
@@ -123,6 +126,7 @@ class FramebufferD3D : public FramebufferImpl
RendererD3D *mRenderer;
Optional<gl::AttachmentList> mColorAttachmentsForRender;
+ gl::DrawBufferMask mCurrentActiveProgramOutputs;
};
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/HLSLCompiler.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/HLSLCompiler.cpp
index 65ec0bd241c..3953100e3bd 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/HLSLCompiler.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/HLSLCompiler.cpp
@@ -137,7 +137,7 @@ gl::Error HLSLCompiler::ensureInitialized()
if (!mD3DCompilerModule)
{
ERR() << "D3D compiler module not found.";
- return gl::Error(GL_OUT_OF_MEMORY, "D3D compiler module not found.");
+ return gl::OutOfMemory() << "D3D compiler module not found.";
}
mD3DCompileFunc = reinterpret_cast<pD3DCompile>(GetProcAddress(mD3DCompilerModule, "D3DCompile"));
@@ -156,7 +156,7 @@ gl::Error HLSLCompiler::ensureInitialized()
if (mD3DCompileFunc == nullptr)
{
- return gl::Error(GL_OUT_OF_MEMORY, "Error finding D3DCompile entry point.");
+ return gl::OutOfMemory() << "Error finding D3DCompile entry point.";
}
mInitialized = true;
@@ -278,7 +278,8 @@ gl::Error HLSLCompiler::compileToBinary(gl::InfoLog &infoLog, const std::string
if (result == E_OUTOFMEMORY)
{
*outCompiledBlob = nullptr;
- return gl::Error(GL_OUT_OF_MEMORY, "HLSL compiler had an unexpected failure, result: 0x%X.", result);
+ return gl::OutOfMemory()
+ << "HLSL compiler had an unexpected failure, " << gl::FmtHR(result);
}
infoLog << "Warning: D3D shader compilation failed with " << configs[i].name << " flags. ("
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/ImageD3D.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/ImageD3D.h
index ff6036230da..9d559da7a2b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/ImageD3D.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/ImageD3D.h
@@ -17,6 +17,7 @@
namespace gl
{
+class Context;
class Framebuffer;
struct ImageIndex;
struct Box;
@@ -51,34 +52,52 @@ class ImageD3D : angle::NonCopyable
virtual bool redefine(GLenum target, GLenum internalformat, const gl::Extents &size, bool forceRelease) = 0;
- virtual gl::Error loadData(const gl::Box &area,
+ 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::Box &area, const void *input) = 0;
+ virtual gl::Error loadCompressedData(const gl::Context *context,
+ const gl::Box &area,
+ const void *input) = 0;
- virtual gl::Error setManagedSurface2D(TextureStorage *storage, int level)
+ virtual gl::Error setManagedSurface2D(const gl::Context *context,
+ TextureStorage *storage,
+ int level)
{
return gl::NoError();
- };
- virtual gl::Error setManagedSurfaceCube(TextureStorage *storage, int face, int level)
+ }
+ virtual gl::Error setManagedSurfaceCube(const gl::Context *context,
+ TextureStorage *storage,
+ int face,
+ int level)
{
return gl::NoError();
- };
- virtual gl::Error setManagedSurface3D(TextureStorage *storage, int level)
+ }
+ virtual gl::Error setManagedSurface3D(const gl::Context *context,
+ TextureStorage *storage,
+ int level)
{
return gl::NoError();
- };
- virtual gl::Error setManagedSurface2DArray(TextureStorage *storage, int layer, int level)
+ }
+ virtual gl::Error setManagedSurface2DArray(const gl::Context *context,
+ TextureStorage *storage,
+ int layer,
+ int level)
{
return gl::NoError();
- };
- virtual gl::Error copyToStorage(TextureStorage *storage, const gl::ImageIndex &index, const gl::Box &region) = 0;
-
- virtual gl::Error copyFromTexStorage(const gl::ImageIndex &imageIndex,
+ }
+ 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::Offset &destOffset,
+ virtual gl::Error copyFromFramebuffer(const gl::Context *context,
+ const gl::Offset &destOffset,
const gl::Rectangle &sourceArea,
const gl::Framebuffer *source) = 0;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/IndexBuffer.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/IndexBuffer.cpp
index e87097540a7..ae8dff4cb28 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/IndexBuffer.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/IndexBuffer.cpp
@@ -71,7 +71,8 @@ gl::Error IndexBufferInterface::mapBuffer(unsigned int size, void **outMappedMem
// Protect against integer overflow
if (mWritePosition + size < mWritePosition)
{
- return gl::Error(GL_OUT_OF_MEMORY, "Mapping of internal index buffer would cause an integer overflow.");
+ return gl::OutOfMemory()
+ << "Mapping of internal index buffer would cause an integer overflow.";
}
gl::Error error = mIndexBuffer->mapBuffer(mWritePosition, size, outMappedMemory);
@@ -189,7 +190,7 @@ gl::Error StaticIndexBufferInterface::reserveBufferSpace(unsigned int size, GLen
else
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION, "Internal static index buffers can't be resized");
+ return gl::InternalError() << "Internal static index buffers can't be resized";
}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/IndexDataManager.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/IndexDataManager.cpp
index 184b89cd3ce..47c68ec85b8 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/IndexDataManager.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/IndexDataManager.cpp
@@ -92,9 +92,8 @@ gl::Error StreamInIndexBuffer(IndexBufferInterface *buffer,
if (count > (std::numeric_limits<unsigned int>::max() >> dstTypeInfo.bytesShift))
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Reserving %u indices of %u bytes each exceeds the maximum buffer size.",
- count, dstTypeInfo.bytes);
+ return gl::OutOfMemory() << "Reserving " << count << " indices of " << dstTypeInfo.bytes
+ << " bytes each exceeds the maximum buffer size.";
}
unsigned int bufferSizeRequired = count << dstTypeInfo.bytesShift;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp
index b8df596bdd1..c8cc0ca21b9 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -10,6 +10,7 @@
#include "common/bitset_utils.h"
#include "common/utilities.h"
+#include "libANGLE/Context.h"
#include "libANGLE/Framebuffer.h"
#include "libANGLE/FramebufferAttachment.h"
#include "libANGLE/Program.h"
@@ -33,10 +34,11 @@ namespace rx
namespace
{
-gl::InputLayout GetDefaultInputLayoutFromShader(const gl::Shader *vertexShader)
+gl::InputLayout GetDefaultInputLayoutFromShader(const gl::Context *context,
+ gl::Shader *vertexShader)
{
gl::InputLayout defaultLayout;
- for (const sh::Attribute &shaderAttr : vertexShader->getActiveAttributes())
+ for (const sh::Attribute &shaderAttr : vertexShader->getActiveAttributes(context))
{
if (shaderAttr.type != GL_NONE)
{
@@ -329,7 +331,8 @@ int ProgramD3DMetadata::getRendererMajorShaderModel() const
bool ProgramD3DMetadata::usesBroadcast(const gl::ContextState &data) const
{
- return (mFragmentShader->usesFragColor() && data.getClientMajorVersion() < 3);
+ return (mFragmentShader->usesFragColor() && mFragmentShader->usesMultipleRenderTargets() &&
+ data.getClientMajorVersion() < 3);
}
bool ProgramD3DMetadata::usesFragDepth() const
@@ -691,9 +694,9 @@ void ProgramD3D::updateSamplerMapping()
}
}
-LinkResult ProgramD3D::load(const ContextImpl *contextImpl,
- gl::InfoLog &infoLog,
- gl::BinaryInputStream *stream)
+gl::LinkResult ProgramD3D::load(const gl::Context *context,
+ gl::InfoLog &infoLog,
+ gl::BinaryInputStream *stream)
{
// TODO(jmadill): Use Renderer from contextImpl.
@@ -956,7 +959,7 @@ LinkResult ProgramD3D::load(const ContextImpl *contextImpl,
return true;
}
-gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream)
+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
@@ -1120,8 +1123,6 @@ gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream)
{
stream->writeInt(0);
}
-
- return gl::NoError();
}
void ProgramD3D::setBinaryRetrievableHint(bool /* retrievable */)
@@ -1132,13 +1133,14 @@ void ProgramD3D::setSeparable(bool /* separable */)
{
}
-gl::Error ProgramD3D::getPixelExecutableForFramebuffer(const gl::Framebuffer *fbo,
+gl::Error ProgramD3D::getPixelExecutableForFramebuffer(const gl::Context *context,
+ const gl::Framebuffer *fbo,
ShaderExecutableD3D **outExecutable)
{
mPixelShaderOutputFormatCache.clear();
- const FramebufferD3D *fboD3D = GetImplAs<FramebufferD3D>(fbo);
- const gl::AttachmentList &colorbuffers = fboD3D->getColorAttachmentsForRender();
+ FramebufferD3D *fboD3D = GetImplAs<FramebufferD3D>(fbo);
+ const gl::AttachmentList &colorbuffers = fboD3D->getColorAttachmentsForRender(context);
for (size_t colorAttachment = 0; colorAttachment < colorbuffers.size(); ++colorAttachment)
{
@@ -1308,7 +1310,7 @@ class ProgramD3D::GetExecutableTask : public Closure
{
public:
GetExecutableTask(ProgramD3D *program)
- : mProgram(program), mError(GL_NO_ERROR), mInfoLog(), mResult(nullptr)
+ : mProgram(program), mError(gl::NoError()), mInfoLog(), mResult(nullptr)
{
}
@@ -1330,17 +1332,23 @@ class ProgramD3D::GetExecutableTask : public Closure
class ProgramD3D::GetVertexExecutableTask : public ProgramD3D::GetExecutableTask
{
public:
- GetVertexExecutableTask(ProgramD3D *program) : GetExecutableTask(program) {}
+ GetVertexExecutableTask(ProgramD3D *program, const gl::Context *context)
+ : GetExecutableTask(program), mContext(context)
+ {
+ }
gl::Error run() override
{
const auto &defaultInputLayout =
- GetDefaultInputLayoutFromShader(mProgram->mState.getAttachedVertexShader());
+ GetDefaultInputLayoutFromShader(mContext, mProgram->mState.getAttachedVertexShader());
ANGLE_TRY(
mProgram->getVertexExecutableForInputLayout(defaultInputLayout, &mResult, &mInfoLog));
return gl::NoError();
}
+
+ private:
+ const gl::Context *mContext;
};
class ProgramD3D::GetPixelExecutableTask : public ProgramD3D::GetExecutableTask
@@ -1394,17 +1402,17 @@ gl::Error ProgramD3D::getComputeExecutable(ShaderExecutableD3D **outExecutable)
return gl::NoError();
}
-LinkResult ProgramD3D::compileProgramExecutables(const gl::ContextState &contextState,
- gl::InfoLog &infoLog)
+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);
+ GetVertexExecutableTask vertexTask(this, context);
GetPixelExecutableTask pixelTask(this);
- GetGeometryExecutableTask geometryTask(this, contextState);
+ GetGeometryExecutableTask geometryTask(this, context->getContextState());
std::array<WaitableEvent, 3> waitEvents = {{workerPool->postWorkerTask(&vertexTask),
workerPool->postWorkerTask(&pixelTask),
@@ -1452,12 +1460,13 @@ LinkResult ProgramD3D::compileProgramExecutables(const gl::ContextState &context
(!usesGeometryShader(GL_POINTS) || pointGS));
}
-LinkResult ProgramD3D::compileComputeExecutable(gl::InfoLog &infoLog)
+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(mState);
+ std::string computeShader = mDynamicHLSL->generateComputeShaderLinkHLSL(context, mState);
ShaderExecutableD3D *computeExecutable = nullptr;
ANGLE_TRY(mRenderer->compileToExecutable(infoLog, computeShader, SHADER_COMPUTE,
@@ -1479,22 +1488,22 @@ LinkResult ProgramD3D::compileComputeExecutable(gl::InfoLog &infoLog)
return mComputeExecutable.get() != nullptr;
}
-LinkResult ProgramD3D::link(ContextImpl *contextImpl,
- const gl::VaryingPacking &packing,
- gl::InfoLog &infoLog)
+gl::LinkResult ProgramD3D::link(const gl::Context *context,
+ const gl::VaryingPacking &packing,
+ gl::InfoLog &infoLog)
{
- const auto &data = contextImpl->getContextState();
+ const auto &data = context->getContextState();
reset();
- const gl::Shader *computeShader = mState.getAttachedComputeShader();
+ gl::Shader *computeShader = mState.getAttachedComputeShader();
if (computeShader)
{
mSamplersCS.resize(data.getCaps().maxComputeTextureImageUnits);
- defineUniformsAndAssignRegisters();
+ defineUniformsAndAssignRegisters(context);
- LinkResult result = compileComputeExecutable(infoLog);
+ gl::LinkResult result = compileComputeExecutable(context, infoLog);
if (result.isError())
{
infoLog << result.getError().getMessage();
@@ -1506,12 +1515,12 @@ LinkResult ProgramD3D::link(ContextImpl *contextImpl,
return result;
}
- initUniformBlockInfo(computeShader);
+ initUniformBlockInfo(context, computeShader);
}
else
{
- const gl::Shader *vertexShader = mState.getAttachedVertexShader();
- const gl::Shader *fragmentShader = mState.getAttachedFragmentShader();
+ gl::Shader *vertexShader = mState.getAttachedVertexShader();
+ gl::Shader *fragmentShader = mState.getAttachedFragmentShader();
const ShaderD3D *vertexShaderD3D = GetImplAs<ShaderD3D>(vertexShader);
const ShaderD3D *fragmentShaderD3D = GetImplAs<ShaderD3D>(fragmentShader);
@@ -1544,16 +1553,17 @@ LinkResult ProgramD3D::link(ContextImpl *contextImpl,
ProgramD3DMetadata metadata(mRenderer, vertexShaderD3D, fragmentShaderD3D);
BuiltinVaryingsD3D builtins(metadata, packing);
- mDynamicHLSL->generateShaderLinkHLSL(data, mState, metadata, packing, builtins, &mPixelHLSL,
- &mVertexHLSL);
+ mDynamicHLSL->generateShaderLinkHLSL(context, mState, metadata, packing, builtins,
+ &mPixelHLSL, &mVertexHLSL);
mUsesPointSize = vertexShaderD3D->usesPointSize();
mDynamicHLSL->getPixelShaderOutputKey(data, mState, metadata, &mPixelShaderKey);
mUsesFragDepth = metadata.usesFragDepth();
// Cache if we use flat shading
- mUsesFlatInterpolation = (FindFlatInterpolationVarying(fragmentShader->getVaryings()) ||
- FindFlatInterpolationVarying(vertexShader->getVaryings()));
+ mUsesFlatInterpolation =
+ (FindFlatInterpolationVarying(fragmentShader->getVaryings(context)) ||
+ FindFlatInterpolationVarying(vertexShader->getVaryings(context)));
if (mRenderer->getMajorShaderModel() >= 4)
{
@@ -1561,13 +1571,13 @@ LinkResult ProgramD3D::link(ContextImpl *contextImpl,
mDynamicHLSL->generateGeometryShaderPreamble(packing, builtins);
}
- initAttribLocationsToD3DSemantic();
+ initAttribLocationsToD3DSemantic(context);
- defineUniformsAndAssignRegisters();
+ defineUniformsAndAssignRegisters(context);
gatherTransformFeedbackVaryings(packing, builtins[SHADER_VERTEX]);
- LinkResult result = compileProgramExecutables(data, infoLog);
+ gl::LinkResult result = compileProgramExecutables(context, infoLog);
if (result.isError())
{
infoLog << result.getError().getMessage();
@@ -1579,8 +1589,8 @@ LinkResult ProgramD3D::link(ContextImpl *contextImpl,
return result;
}
- initUniformBlockInfo(vertexShader);
- initUniformBlockInfo(fragmentShader);
+ initUniformBlockInfo(context, vertexShader);
+ initUniformBlockInfo(context, fragmentShader);
}
return true;
@@ -1592,9 +1602,9 @@ GLboolean ProgramD3D::validate(const gl::Caps & /*caps*/, gl::InfoLog * /*infoLo
return GL_TRUE;
}
-void ProgramD3D::initUniformBlockInfo(const gl::Shader *shader)
+void ProgramD3D::initUniformBlockInfo(const gl::Context *context, gl::Shader *shader)
{
- for (const sh::InterfaceBlock &interfaceBlock : shader->getInterfaceBlocks())
+ for (const sh::InterfaceBlock &interfaceBlock : shader->getInterfaceBlocks(context))
{
if (!interfaceBlock.staticUse && interfaceBlock.layout == sh::BLOCKLAYOUT_PACKED)
continue;
@@ -1922,13 +1932,13 @@ void ProgramD3D::setUniformBlockBinding(GLuint /*uniformBlockIndex*/,
{
}
-void ProgramD3D::defineUniformsAndAssignRegisters()
+void ProgramD3D::defineUniformsAndAssignRegisters(const gl::Context *context)
{
D3DUniformMap uniformMap;
- const gl::Shader *computeShader = mState.getAttachedComputeShader();
+ gl::Shader *computeShader = mState.getAttachedComputeShader();
if (computeShader)
{
- for (const sh::Uniform &computeUniform : computeShader->getUniforms())
+ for (const sh::Uniform &computeUniform : computeShader->getUniforms(context))
{
if (computeUniform.staticUse)
{
@@ -1938,8 +1948,8 @@ void ProgramD3D::defineUniformsAndAssignRegisters()
}
else
{
- const gl::Shader *vertexShader = mState.getAttachedVertexShader();
- for (const sh::Uniform &vertexUniform : vertexShader->getUniforms())
+ gl::Shader *vertexShader = mState.getAttachedVertexShader();
+ for (const sh::Uniform &vertexUniform : vertexShader->getUniforms(context))
{
if (vertexUniform.staticUse)
{
@@ -1947,8 +1957,8 @@ void ProgramD3D::defineUniformsAndAssignRegisters()
}
}
- const gl::Shader *fragmentShader = mState.getAttachedFragmentShader();
- for (const sh::Uniform &fragmentUniform : fragmentShader->getUniforms())
+ gl::Shader *fragmentShader = mState.getAttachedFragmentShader();
+ for (const sh::Uniform &fragmentUniform : fragmentShader->getUniforms(context))
{
if (fragmentUniform.staticUse)
{
@@ -2359,20 +2369,22 @@ unsigned int ProgramD3D::issueSerial()
return mCurrentSerial++;
}
-void ProgramD3D::initAttribLocationsToD3DSemantic()
+void ProgramD3D::initAttribLocationsToD3DSemantic(const gl::Context *context)
{
- const gl::Shader *vertexShader = mState.getAttachedVertexShader();
+ gl::Shader *vertexShader = mState.getAttachedVertexShader();
ASSERT(vertexShader != nullptr);
// Init semantic index
- for (const sh::Attribute &attribute : mState.getAttributes())
+ int semanticIndex = 0;
+ for (const sh::Attribute &attribute : vertexShader->getActiveAttributes(context))
{
- int d3dSemantic = vertexShader->getSemanticIndex(attribute.name);
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[attribute.location + reg] = d3dSemantic + reg;
+ mAttribLocationToD3DSemantic[location + reg] = semanticIndex++;
}
}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.h
index 19b7dbfdd80..7f0a48bf8cb 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.h
@@ -158,14 +158,15 @@ class ProgramD3D : public ProgramImpl
bool usesGeometryShader(GLenum drawMode) const;
bool usesInstancedPointSpriteEmulation() const;
- LinkResult load(const ContextImpl *contextImpl,
- gl::InfoLog &infoLog,
- gl::BinaryInputStream *stream) override;
- gl::Error save(gl::BinaryOutputStream *stream) override;
+ 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 getPixelExecutableForFramebuffer(const gl::Framebuffer *fbo,
+ gl::Error getPixelExecutableForFramebuffer(const gl::Context *context,
+ const gl::Framebuffer *fbo,
ShaderExecutableD3D **outExectuable);
gl::Error getPixelExecutableForOutputLayout(const std::vector<GLenum> &outputLayout,
ShaderExecutableD3D **outExectuable,
@@ -178,9 +179,9 @@ class ProgramD3D : public ProgramImpl
ShaderExecutableD3D **outExecutable,
gl::InfoLog *infoLog);
gl::Error getComputeExecutable(ShaderExecutableD3D **outExecutable);
- LinkResult link(ContextImpl *contextImpl,
- const gl::VaryingPacking &packing,
- gl::InfoLog &infoLog) override;
+ gl::LinkResult link(const gl::Context *context,
+ const gl::VaryingPacking &packing,
+ gl::InfoLog &infoLog) override;
GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
bool getUniformBlockSize(const std::string &blockName, size_t *sizeOut) const override;
@@ -248,18 +249,9 @@ class ProgramD3D : public ProgramImpl
void setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding) override;
- const UniformStorageD3D &getVertexUniformStorage() const
- {
- return *mVertexUniformStorage.get();
- }
- const UniformStorageD3D &getFragmentUniformStorage() const
- {
- return *mFragmentUniformStorage.get();
- }
- const UniformStorageD3D &getComputeUniformStorage() const
- {
- return *mComputeUniformStorage.get();
- }
+ UniformStorageD3D &getVertexUniformStorage() const { return *mVertexUniformStorage.get(); }
+ UniformStorageD3D &getFragmentUniformStorage() const { return *mFragmentUniformStorage.get(); }
+ UniformStorageD3D &getComputeUniformStorage() const { return *mComputeUniformStorage.get(); }
unsigned int getSerial() const;
@@ -345,7 +337,7 @@ class ProgramD3D : public ProgramImpl
typedef std::map<std::string, D3DUniform *> D3DUniformMap;
- void defineUniformsAndAssignRegisters();
+ void defineUniformsAndAssignRegisters(const gl::Context *context);
void defineUniformBase(const gl::Shader *shader,
const sh::Uniform &uniform,
D3DUniformMap *uniformMap);
@@ -373,20 +365,20 @@ class ProgramD3D : public ProgramImpl
const GLfloat *value,
GLenum targetUniformType);
- LinkResult compileProgramExecutables(const gl::ContextState &data, gl::InfoLog &infoLog);
- LinkResult compileComputeExecutable(gl::InfoLog &infoLog);
+ 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);
- void initAttribLocationsToD3DSemantic();
+ void initAttribLocationsToD3DSemantic(const gl::Context *context);
void reset();
void ensureUniformBlocksInitialized();
- void initUniformBlockInfo(const gl::Shader *shader);
+ void initUniformBlockInfo(const gl::Context *context, gl::Shader *shader);
size_t getUniformBlockInfo(const sh::InterfaceBlock &interfaceBlock);
RendererD3D *mRenderer;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.cpp
index 2df0f744328..774f3e40b6b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.cpp
@@ -51,8 +51,9 @@ gl::Error RenderbufferD3D::setStorageMultisample(size_t samples, GLenum internal
const gl::TextureCaps &formatCaps = mRenderer->getNativeTextureCaps().get(creationFormat);
if (samples > formatCaps.getMaxSamples())
{
- return gl::Error(GL_OUT_OF_MEMORY, "Renderbuffer format does not support %u samples, %u is the maximum.",
- samples, formatCaps.getMaxSamples());
+ return gl::OutOfMemory() << "Renderbuffer format does not support " << samples
+ << " samples, " << formatCaps.getMaxSamples()
+ << " is the maximum.";
}
RenderTargetD3D *newRT = nullptr;
@@ -74,11 +75,12 @@ gl::Error RenderbufferD3D::setStorageEGLImageTarget(egl::Image *image)
return gl::NoError();
}
-gl::Error RenderbufferD3D::getRenderTarget(RenderTargetD3D **outRenderTarget)
+gl::Error RenderbufferD3D::getRenderTarget(const gl::Context *context,
+ RenderTargetD3D **outRenderTarget)
{
if (mImage)
{
- return mImage->getRenderTarget(outRenderTarget);
+ return mImage->getRenderTarget(context, outRenderTarget);
}
else
{
@@ -87,11 +89,12 @@ gl::Error RenderbufferD3D::getRenderTarget(RenderTargetD3D **outRenderTarget)
}
}
-gl::Error RenderbufferD3D::getAttachmentRenderTarget(GLenum /*binding*/,
+gl::Error RenderbufferD3D::getAttachmentRenderTarget(const gl::Context *context,
+ GLenum /*binding*/,
const gl::ImageIndex & /*imageIndex*/,
FramebufferAttachmentRenderTarget **rtOut)
{
- return getRenderTarget(reinterpret_cast<RenderTargetD3D **>(rtOut));
+ return getRenderTarget(context, reinterpret_cast<RenderTargetD3D **>(rtOut));
}
-}
+} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.h
index 15fd5835935..c28c37e94fc 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.h
@@ -34,8 +34,9 @@ class RenderbufferD3D : public RenderbufferImpl
size_t height) override;
gl::Error setStorageEGLImageTarget(egl::Image *image) override;
- gl::Error getRenderTarget(RenderTargetD3D **outRenderTarget);
- gl::Error getAttachmentRenderTarget(GLenum binding,
+ 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;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.cpp
index e0cb86d2876..9f624b63af3 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.cpp
@@ -11,13 +11,16 @@
#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"
@@ -25,6 +28,7 @@
#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
{
@@ -49,60 +53,23 @@ void RendererD3D::cleanup()
{
for (auto &incompleteTexture : mIncompleteTextures)
{
- incompleteTexture.second.set(nullptr);
+ incompleteTexture.second->onDestroy(mDisplay->getProxyContext());
+ incompleteTexture.second.set(mDisplay->getProxyContext(), nullptr);
}
mIncompleteTextures.clear();
}
-unsigned int RendererD3D::GetBlendSampleMask(const gl::ContextState &data, int samples)
-{
- const auto &glState = data.getState();
- 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;
- }
-
- return mask;
-}
-
// 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 RendererD3D::applyTextures(GLImplFactory *implFactory,
- const gl::ContextState &data,
+gl::Error RendererD3D::applyTextures(const gl::Context *context,
gl::SamplerType shaderType,
const FramebufferTextureArray &framebufferTextures,
size_t framebufferTextureCount)
{
- const auto &glState = data.getState();
- const auto &caps = data.getCaps();
+ const auto &glState = context->getGLState();
+ const auto &caps = context->getCaps();
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
ASSERT(!programD3D->isSamplerMappingDirty());
@@ -125,49 +92,52 @@ gl::Error RendererD3D::applyTextures(GLImplFactory *implFactory,
samplerObject ? samplerObject->getSamplerState() : texture->getSamplerState();
// TODO: std::binary_search may become unavailable using older versions of GCC
- if (texture->getTextureState().isSamplerComplete(samplerState, data) &&
+ if (texture->getTextureState().isSamplerComplete(samplerState,
+ context->getContextState()) &&
!std::binary_search(framebufferTextures.begin(),
framebufferTextures.begin() + framebufferTextureCount, texture))
{
- ANGLE_TRY(setSamplerState(shaderType, samplerIndex, texture, samplerState));
- ANGLE_TRY(setTexture(shaderType, samplerIndex, texture));
+ ANGLE_TRY(
+ setSamplerState(context, shaderType, samplerIndex, texture, samplerState));
+ ANGLE_TRY(setTexture(context, shaderType, samplerIndex, texture));
}
else
{
// Texture is not sampler complete or it is in use by the framebuffer. Bind the
// incomplete texture.
- gl::Texture *incompleteTexture = getIncompleteTexture(implFactory, textureType);
+ gl::Texture *incompleteTexture = getIncompleteTexture(context, textureType);
- ANGLE_TRY(setSamplerState(shaderType, samplerIndex, incompleteTexture,
+ ANGLE_TRY(setSamplerState(context, shaderType, samplerIndex, incompleteTexture,
incompleteTexture->getSamplerState()));
- ANGLE_TRY(setTexture(shaderType, samplerIndex, incompleteTexture));
+ ANGLE_TRY(setTexture(context, shaderType, samplerIndex, incompleteTexture));
}
}
else
{
// No texture bound to this slot even though it is used by the shader, bind a NULL
// texture
- ANGLE_TRY(setTexture(shaderType, samplerIndex, nullptr));
+ ANGLE_TRY(setTexture(context, shaderType, samplerIndex, nullptr));
}
}
// Set all the remaining textures to NULL
size_t samplerCount = (shaderType == gl::SAMPLER_PIXEL) ? caps.maxTextureImageUnits
: caps.maxVertexTextureImageUnits;
- clearTextures(shaderType, samplerRange, samplerCount);
+ clearTextures(context, shaderType, samplerRange, samplerCount);
return gl::NoError();
}
-gl::Error RendererD3D::applyTextures(GLImplFactory *implFactory, const gl::ContextState &data)
+gl::Error RendererD3D::applyTextures(const gl::Context *context)
{
FramebufferTextureArray framebufferTextures;
- size_t framebufferSerialCount = getBoundFramebufferTextures(data, &framebufferTextures);
+ size_t framebufferSerialCount =
+ getBoundFramebufferTextures(context->getContextState(), &framebufferTextures);
- ANGLE_TRY(applyTextures(implFactory, data, gl::SAMPLER_VERTEX, framebufferTextures,
- framebufferSerialCount));
- ANGLE_TRY(applyTextures(implFactory, data, gl::SAMPLER_PIXEL, framebufferTextures,
- framebufferSerialCount));
+ ANGLE_TRY(
+ applyTextures(context, gl::SAMPLER_VERTEX, framebufferTextures, framebufferSerialCount));
+ ANGLE_TRY(
+ applyTextures(context, gl::SAMPLER_PIXEL, framebufferTextures, framebufferSerialCount));
return gl::NoError();
}
@@ -206,7 +176,8 @@ gl::Error RendererD3D::markTransformFeedbackUsage(const gl::ContextState &data)
const gl::TransformFeedback *transformFeedback = data.getState().getCurrentTransformFeedback();
for (size_t i = 0; i < transformFeedback->getIndexedBufferCount(); i++)
{
- const OffsetBindingPointer<gl::Buffer> &binding = transformFeedback->getIndexedBuffer(i);
+ const gl::OffsetBindingPointer<gl::Buffer> &binding =
+ transformFeedback->getIndexedBuffer(i);
if (binding.get() != nullptr)
{
BufferD3D *bufferD3D = GetImplAs<BufferD3D>(binding.get());
@@ -244,10 +215,11 @@ size_t RendererD3D::getBoundFramebufferTextures(const gl::ContextState &data,
return textureCount;
}
-gl::Texture *RendererD3D::getIncompleteTexture(GLImplFactory *implFactory, GLenum type)
+gl::Texture *RendererD3D::getIncompleteTexture(const gl::Context *context, GLenum type)
{
if (mIncompleteTextures.find(type) == mIncompleteTextures.end())
{
+ GLImplFactory *implFactory = context->getImplementation();
const GLubyte color[] = {0, 0, 0, 255};
const gl::Extents colorSize(1, 1, 1);
const gl::PixelUnpackState unpack(1, 0);
@@ -259,7 +231,14 @@ gl::Texture *RendererD3D::getIncompleteTexture(GLImplFactory *implFactory, GLenu
// Skip the API layer to avoid needing to pass the Context and mess with dirty bits.
gl::Texture *t =
new gl::Texture(implFactory, std::numeric_limits<GLuint>::max(), createType);
- t->setStorage(nullptr, createType, 1, GL_RGBA8, colorSize);
+ if (createType == GL_TEXTURE_2D_MULTISAMPLE)
+ {
+ t->setStorageMultisample(nullptr, createType, 1, GL_RGBA8, colorSize, true);
+ }
+ else
+ {
+ t->setStorage(nullptr, createType, 1, GL_RGBA8, colorSize);
+ }
if (type == GL_TEXTURE_CUBE_MAP)
{
for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X;
@@ -269,12 +248,18 @@ gl::Texture *RendererD3D::getIncompleteTexture(GLImplFactory *implFactory, GLenu
GL_UNSIGNED_BYTE, unpack, color);
}
}
+ else if (type == GL_TEXTURE_2D_MULTISAMPLE)
+ {
+ gl::ColorF clearValue(0, 0, 0, 1);
+ gl::ImageIndex index = gl::ImageIndex::Make2DMultisample();
+ GetImplAs<TextureD3D>(t)->clearLevel(context, index, clearValue);
+ }
else
{
t->getImplementation()->setSubImage(nullptr, createType, 0, area, GL_RGBA8,
GL_UNSIGNED_BYTE, unpack, color);
}
- mIncompleteTextures[type].set(t);
+ mIncompleteTextures[type].set(context, t);
}
return mIncompleteTextures[type].get();
@@ -380,4 +365,46 @@ angle::WorkerThreadPool *RendererD3D::getWorkerThreadPool()
return &mWorkerThreadPool;
}
+bool RendererD3D::isRobustResourceInitEnabled() const
+{
+ return mDisplay->isRobustResourceInitEnabled();
+}
+
+unsigned int GetBlendSampleMask(const gl::ContextState &data, int samples)
+{
+ const auto &glState = data.getState();
+ 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;
+ }
+
+ return mask;
+}
+
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.h
index 1e65249152a..a4edbdc36a1 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.h
@@ -11,15 +11,16 @@
#include <array>
-#include "common/debug.h"
+#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/formatutils.h"
#include "libANGLE/renderer/d3d/VertexDataManager.h"
#include "libANGLE/renderer/d3d/formatutilsD3D.h"
-#include "libANGLE/Version.h"
-#include "libANGLE/WorkerThread.h"
#include "platform/WorkaroundsD3D.h"
namespace egl
@@ -146,8 +147,15 @@ class RendererD3D : public BufferFactoryD3D
HANDLE shareHandle,
const egl::AttributeMap &attribs) const = 0;
- virtual gl::Error setSamplerState(gl::SamplerType type, int index, gl::Texture *texture, const gl::SamplerState &sampler) = 0;
- virtual gl::Error setTexture(gl::SamplerType type, int index, gl::Texture *texture) = 0;
+ virtual gl::Error setSamplerState(const gl::Context *context,
+ gl::SamplerType type,
+ int index,
+ gl::Texture *texture,
+ const gl::SamplerState &sampler) = 0;
+ virtual gl::Error setTexture(const gl::Context *context,
+ gl::SamplerType type,
+ int index,
+ gl::Texture *texture) = 0;
virtual gl::Error setUniformBuffers(const gl::ContextState &data,
const std::vector<GLint> &vertexUniformBuffers,
@@ -165,16 +173,38 @@ class RendererD3D : public BufferFactoryD3D
const angle::WorkaroundsD3D &getWorkarounds() const;
// Pixel operations
- virtual gl::Error copyImage2D(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::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::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
- const gl::Offset &destOffset, TextureStorage *storage, GLint level) = 0;
- virtual gl::Error copyImage2DArray(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::Texture *source,
+ 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,
@@ -185,7 +215,8 @@ class RendererD3D : public BufferFactoryD3D
bool unpackFlipY,
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha) = 0;
- virtual gl::Error copyCompressedTexture(const gl::Texture *source,
+ virtual gl::Error copyCompressedTexture(const gl::Context *context,
+ const gl::Texture *source,
GLint sourceLevel,
TextureStorage *storage,
GLint destLevel) = 0;
@@ -195,7 +226,7 @@ class RendererD3D : public BufferFactoryD3D
virtual gl::Error createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) = 0;
// Shader operations
- virtual gl::Error loadExecutable(const void *function,
+ virtual gl::Error loadExecutable(const uint8_t *function,
size_t length,
ShaderType type,
const std::vector<D3DVarying> &streamOutVaryings,
@@ -214,9 +245,20 @@ class RendererD3D : public BufferFactoryD3D
// Image operations
virtual ImageD3D *createImage() = 0;
- virtual gl::Error generateMipmap(ImageD3D *dest, ImageD3D *source) = 0;
- virtual gl::Error generateMipmapUsingD3D(TextureStorage *storage,
+ 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;
@@ -227,11 +269,22 @@ class RendererD3D : public BufferFactoryD3D
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,
+ GLboolean fixedSampleLocations) = 0;
// Buffer-to-texture and Texture-to-buffer copies
virtual bool supportsFastCopyBufferToTexture(GLenum internalFormat) const = 0;
- virtual gl::Error fastCopyBufferToTexture(const gl::PixelUnpackState &unpack, unsigned int offset, RenderTargetD3D *destRenderTarget,
- GLenum destinationFormat, GLenum sourcePixelsType, const gl::Box &destArea) = 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();
@@ -249,7 +302,13 @@ class RendererD3D : public BufferFactoryD3D
GLint64 getTimestamp();
// In D3D11, faster than calling setTexture a jillion times
- virtual gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd) = 0;
+ virtual gl::Error clearTextures(const gl::Context *context,
+ gl::SamplerType samplerType,
+ size_t rangeStart,
+ size_t rangeEnd) = 0;
+
+ virtual gl::Error clearRenderTarget(RenderTargetD3D *renderTarget,
+ const gl::ColorF &clearValues) = 0;
virtual egl::Error getEGLDevice(DeviceImpl **device) = 0;
@@ -275,6 +334,8 @@ class RendererD3D : public BufferFactoryD3D
virtual gl::Error applyComputeUniforms(const ProgramD3D &programD3D,
const std::vector<D3DUniform *> &uniformArray) = 0;
+ bool isRobustResourceInitEnabled() const;
+
protected:
virtual bool getLUID(LUID *adapterLuid) const = 0;
virtual void generateCaps(gl::Caps *outCaps,
@@ -284,10 +345,9 @@ class RendererD3D : public BufferFactoryD3D
void cleanup();
- static unsigned int GetBlendSampleMask(const gl::ContextState &data, int samples);
// dirtyPointer is a special value that will make the comparison with any valid pointer fail and force the renderer to re-apply the state.
- gl::Error applyTextures(GLImplFactory *implFactory, const gl::ContextState &data);
+ gl::Error applyTextures(const gl::Context *context);
bool skipDraw(const gl::ContextState &data, GLenum drawMode);
gl::Error markTransformFeedbackUsage(const gl::ContextState &data);
@@ -300,15 +360,14 @@ class RendererD3D : public BufferFactoryD3D
typedef std::array<gl::Texture*, gl::IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS> FramebufferTextureArray;
- gl::Error applyTextures(GLImplFactory *implFactory,
- const gl::ContextState &data,
+ gl::Error applyTextures(const gl::Context *context,
gl::SamplerType shaderType,
const FramebufferTextureArray &framebufferTextures,
size_t framebufferTextureCount);
size_t getBoundFramebufferTextures(const gl::ContextState &data,
FramebufferTextureArray *outTextureArray);
- gl::Texture *getIncompleteTexture(GLImplFactory *implFactory, GLenum type);
+ gl::Texture *getIncompleteTexture(const gl::Context *context, GLenum type);
virtual angle::WorkaroundsD3D generateWorkarounds() const = 0;
@@ -329,6 +388,8 @@ class RendererD3D : public BufferFactoryD3D
angle::WorkerThreadPool mWorkerThreadPool;
};
+unsigned int GetBlendSampleMask(const gl::ContextState &data, int samples);
+
} // namespace rx
#endif // LIBANGLE_RENDERER_D3D_RENDERERD3D_H_
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp
index 4e3252d86b5..30f40b02f12 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp
@@ -8,10 +8,11 @@
#include "libANGLE/renderer/d3d/SurfaceD3D.h"
+#include "libANGLE/Context.h"
#include "libANGLE/Display.h"
#include "libANGLE/Surface.h"
-#include "libANGLE/renderer/d3d/RendererD3D.h"
#include "libANGLE/renderer/d3d/RenderTargetD3D.h"
+#include "libANGLE/renderer/d3d/RendererD3D.h"
#include "libANGLE/renderer/d3d/SwapChainD3D.h"
#include <tchar.h>
@@ -81,23 +82,18 @@ void SurfaceD3D::releaseSwapChain()
SafeDelete(mSwapChain);
}
-egl::Error SurfaceD3D::initialize(const DisplayImpl *displayImpl)
+egl::Error SurfaceD3D::initialize(const egl::Display *display)
{
if (mNativeWindow->getNativeWindow())
{
if (!mNativeWindow->initialize())
{
- return egl::Error(EGL_BAD_SURFACE);
+ return egl::EglBadSurface();
}
}
- egl::Error error = resetSwapChain();
- if (error.isError())
- {
- return error;
- }
-
- return egl::Error(EGL_SUCCESS);
+ ANGLE_TRY(resetSwapChain(display));
+ return egl::NoError();
}
FramebufferImpl *SurfaceD3D::createDefaultFramebuffer(const gl::FramebufferState &data)
@@ -107,12 +103,12 @@ FramebufferImpl *SurfaceD3D::createDefaultFramebuffer(const gl::FramebufferState
egl::Error SurfaceD3D::bindTexImage(gl::Texture *, EGLint)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error SurfaceD3D::releaseTexImage(EGLint)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error SurfaceD3D::getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc)
@@ -120,7 +116,7 @@ egl::Error SurfaceD3D::getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLui
return mSwapChain->getSyncValues(ust, msc, sbc);
}
-egl::Error SurfaceD3D::resetSwapChain()
+egl::Error SurfaceD3D::resetSwapChain(const egl::Display *display)
{
ASSERT(!mSwapChain);
@@ -134,7 +130,7 @@ egl::Error SurfaceD3D::resetSwapChain()
{
ASSERT(false);
- return egl::Error(EGL_BAD_SURFACE, "Could not retrieve the window dimensions");
+ return egl::EglBadSurface() << "Could not retrieve the window dimensions";
}
width = windowRect.right - windowRect.left;
@@ -152,25 +148,29 @@ egl::Error SurfaceD3D::resetSwapChain()
mDepthStencilFormat, mOrientation, mState.config->samples);
if (!mSwapChain)
{
- return egl::Error(EGL_BAD_ALLOC);
+ return egl::EglBadAlloc();
}
- egl::Error error = resetSwapChain(width, height);
+ // 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::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error SurfaceD3D::resizeSwapChain(int backbufferWidth, int backbufferHeight)
+egl::Error SurfaceD3D::resizeSwapChain(const gl::Context *context,
+ int backbufferWidth,
+ int backbufferHeight)
{
ASSERT(backbufferWidth >= 0 && backbufferHeight >= 0);
ASSERT(mSwapChain);
- EGLint status = mSwapChain->resize(std::max(1, backbufferWidth), std::max(1, backbufferHeight));
+ EGLint status =
+ mSwapChain->resize(context, std::max(1, backbufferWidth), std::max(1, backbufferHeight));
if (status == EGL_CONTEXT_LOST)
{
@@ -185,15 +185,18 @@ egl::Error SurfaceD3D::resizeSwapChain(int backbufferWidth, int backbufferHeight
mWidth = backbufferWidth;
mHeight = backbufferHeight;
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error SurfaceD3D::resetSwapChain(int backbufferWidth, int backbufferHeight)
+egl::Error SurfaceD3D::resetSwapChain(const gl::Context *context,
+ int backbufferWidth,
+ int backbufferHeight)
{
ASSERT(backbufferWidth >= 0 && backbufferHeight >= 0);
ASSERT(mSwapChain);
- EGLint status = mSwapChain->reset(std::max(1, backbufferWidth), std::max(1, backbufferHeight), mSwapInterval);
+ EGLint status = mSwapChain->reset(context, std::max(1, backbufferWidth),
+ std::max(1, backbufferHeight), mSwapInterval);
if (status == EGL_CONTEXT_LOST)
{
@@ -209,14 +212,18 @@ egl::Error SurfaceD3D::resetSwapChain(int backbufferWidth, int backbufferHeight)
mHeight = backbufferHeight;
mSwapIntervalDirty = false;
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error SurfaceD3D::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
+egl::Error SurfaceD3D::swapRect(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height)
{
if (!mSwapChain)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
if (x + width > mWidth)
@@ -231,7 +238,7 @@ egl::Error SurfaceD3D::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
if (width != 0 && height != 0)
{
- EGLint status = mSwapChain->swapRect(x, y, width, height);
+ EGLint status = mSwapChain->swapRect(context, x, y, width, height);
if (status == EGL_CONTEXT_LOST)
{
@@ -244,12 +251,12 @@ egl::Error SurfaceD3D::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
}
}
- checkForOutOfDateSwapChain();
+ checkForOutOfDateSwapChain(context);
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-bool SurfaceD3D::checkForOutOfDateSwapChain()
+bool SurfaceD3D::checkForOutOfDateSwapChain(const gl::Context *context)
{
RECT client;
int clientWidth = getWidth();
@@ -275,24 +282,28 @@ bool SurfaceD3D::checkForOutOfDateSwapChain()
if (mSwapIntervalDirty)
{
- resetSwapChain(clientWidth, clientHeight);
+ resetSwapChain(context, clientWidth, clientHeight);
}
else if (sizeDirty)
{
- resizeSwapChain(clientWidth, clientHeight);
+ resizeSwapChain(context, clientWidth, clientHeight);
}
return wasDirty;
}
-egl::Error SurfaceD3D::swap(const DisplayImpl *displayImpl)
+egl::Error SurfaceD3D::swap(const gl::Context *context)
{
- return swapRect(0, 0, mWidth, mHeight);
+ return swapRect(context, 0, 0, mWidth, mHeight);
}
-egl::Error SurfaceD3D::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
+egl::Error SurfaceD3D::postSubBuffer(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height)
{
- return swapRect(x, y, width, height);
+ return swapRect(context, x, y, width, height);
}
rx::SwapChainD3D *SurfaceD3D::getSwapChain() const
@@ -344,10 +355,11 @@ egl::Error SurfaceD3D::querySurfacePointerANGLE(EGLint attribute, void **value)
}
else UNREACHABLE();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-gl::Error SurfaceD3D::getAttachmentRenderTarget(GLenum binding,
+gl::Error SurfaceD3D::getAttachmentRenderTarget(const gl::Context *context,
+ GLenum binding,
const gl::ImageIndex &imageIndex,
FramebufferAttachmentRenderTarget **rtOut)
{
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.h
index 3be288871c0..5703c2289e9 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.h
@@ -28,11 +28,15 @@ class SurfaceD3D : public SurfaceImpl
~SurfaceD3D() override;
void releaseSwapChain();
- egl::Error initialize(const DisplayImpl *displayImpl) override;
+ egl::Error initialize(const egl::Display *display) override;
FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override;
- egl::Error swap(const DisplayImpl *displayImpl) override;
- egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) 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;
@@ -48,12 +52,13 @@ class SurfaceD3D : public SurfaceImpl
// D3D implementations
SwapChainD3D *getSwapChain() const;
- egl::Error resetSwapChain();
+ egl::Error resetSwapChain(const egl::Display *display);
// Returns true if swapchain changed due to resize or interval update
- bool checkForOutOfDateSwapChain();
+ bool checkForOutOfDateSwapChain(const gl::Context *context);
- gl::Error getAttachmentRenderTarget(GLenum binding,
+ gl::Error getAttachmentRenderTarget(const gl::Context *context,
+ GLenum binding,
const gl::ImageIndex &imageIndex,
FramebufferAttachmentRenderTarget **rtOut) override;
@@ -66,9 +71,17 @@ class SurfaceD3D : public SurfaceImpl
EGLClientBuffer clientBuffer,
const egl::AttributeMap &attribs);
- egl::Error swapRect(EGLint x, EGLint y, EGLint width, EGLint height);
- egl::Error resetSwapChain(int backbufferWidth, int backbufferHeight);
- egl::Error resizeSwapChain(int backbufferWidth, int backbufferHeight);
+ 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);
RendererD3D *mRenderer;
egl::Display *mDisplay;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/SwapChainD3D.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/SwapChainD3D.h
index 5472864ef55..81c3d13da43 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/SwapChainD3D.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/SwapChainD3D.h
@@ -22,6 +22,16 @@
#define ANGLE_FORCE_VSYNC_OFF 0
#endif
+namespace gl
+{
+class Context;
+} // namespace gl
+
+namespace egl
+{
+class Display;
+} // namespace egl
+
namespace rx
{
class RenderTargetD3D;
@@ -35,9 +45,18 @@ class SwapChainD3D : angle::NonCopyable
GLenum depthBufferFormat);
virtual ~SwapChainD3D();
- virtual EGLint resize(EGLint backbufferWidth, EGLint backbufferSize) = 0;
- virtual EGLint reset(EGLint backbufferWidth, EGLint backbufferHeight, EGLint swapInterval) = 0;
- virtual EGLint swapRect(EGLint x, EGLint y, EGLint width, EGLint height) = 0;
+ 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 RenderTargetD3D *getColorRenderTarget() = 0;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.cpp
index cdfa552b02f..69dc9de0aa1 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.cpp
@@ -12,6 +12,7 @@
#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"
@@ -21,8 +22,8 @@
#include "libANGLE/renderer/d3d/BufferD3D.h"
#include "libANGLE/renderer/d3d/EGLImageD3D.h"
#include "libANGLE/renderer/d3d/ImageD3D.h"
-#include "libANGLE/renderer/d3d/RendererD3D.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"
@@ -82,16 +83,17 @@ TextureD3D::TextureD3D(const gl::TextureState &state, RendererD3D *renderer)
TextureD3D::~TextureD3D()
{
+ ASSERT(!mTexStorage);
}
-gl::Error TextureD3D::getNativeTexture(TextureStorage **outStorage)
+gl::Error TextureD3D::getNativeTexture(const gl::Context *context, TextureStorage **outStorage)
{
// ensure the underlying texture is created
- ANGLE_TRY(initializeStorage(false));
+ ANGLE_TRY(initializeStorage(context, false));
if (mTexStorage)
{
- ANGLE_TRY(updateStorage());
+ ANGLE_TRY(updateStorage(context));
}
ASSERT(outStorage);
@@ -100,6 +102,19 @@ gl::Error TextureD3D::getNativeTexture(TextureStorage **outStorage)
return gl::NoError();
}
+gl::Error TextureD3D::getImageAndSyncFromStorage(const gl::Context *context,
+ const gl::ImageIndex &index,
+ ImageD3D **outImage) const
+{
+ ImageD3D *image = getImage(index);
+ if (mTexStorage)
+ {
+ ANGLE_TRY(image->copyFromTexStorage(context, index, mTexStorage));
+ }
+ *outImage = image;
+ return gl::NoError();
+}
+
GLint TextureD3D::getLevelZeroWidth() const
{
ASSERT(gl::CountLeadingZeros(static_cast<uint32_t>(getBaseLevelWidth())) > getBaseLevel());
@@ -135,6 +150,11 @@ GLint TextureD3D::getBaseLevelDepth() const
return (baseImage ? baseImage->getDepth() : 0);
}
+bool TextureD3D::shouldForceReleaseImagesOnSetImage(const uint8_t *pixels) const
+{
+ return mRenderer->isRobustResourceInitEnabled() && pixels == nullptr;
+}
+
// 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.
@@ -144,15 +164,25 @@ GLenum TextureD3D::getBaseLevelInternalFormat() const
return (baseImage ? baseImage->getInternalFormat() : GL_NONE);
}
-gl::Error TextureD3D::setStorageMultisample(ContextImpl *contextImpl,
+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,
GLboolean fixedSampleLocations)
{
- UNIMPLEMENTED();
- return gl::InternalError() << "setStorageMultisample is unimplemented.";
+ UNREACHABLE();
+ return gl::InternalError();
}
bool TextureD3D::shouldUseSetData(const ImageD3D *image) const
@@ -162,6 +192,11 @@ bool TextureD3D::shouldUseSetData(const ImageD3D *image) const
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
@@ -175,7 +210,8 @@ bool TextureD3D::shouldUseSetData(const ImageD3D *image) const
return (mTexStorage && !internalFormat.compressed);
}
-gl::Error TextureD3D::setImageImpl(const gl::ImageIndex &index,
+gl::Error TextureD3D::setImageImpl(const gl::Context *context,
+ const gl::ImageIndex &index,
GLenum type,
const gl::PixelUnpackState &unpack,
const uint8_t *pixels,
@@ -199,12 +235,14 @@ gl::Error TextureD3D::setImageImpl(const gl::ImageIndex &index,
{
if (shouldUseSetData(image))
{
- ANGLE_TRY(mTexStorage->setData(index, image, nullptr, type, unpack, pixelData));
+ 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(fullImageArea, unpack, type, pixelData, index.is3D()));
+ ANGLE_TRY(
+ image->loadData(context, fullImageArea, unpack, type, pixelData, index.is3D()));
}
mDirtyImages = true;
@@ -213,8 +251,14 @@ gl::Error TextureD3D::setImageImpl(const gl::ImageIndex &index,
return gl::NoError();
}
-gl::Error TextureD3D::subImage(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 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;
@@ -227,18 +271,19 @@ gl::Error TextureD3D::subImage(const gl::ImageIndex &index, const gl::Box &area,
if (shouldUseSetData(image))
{
- return mTexStorage->setData(index, image, &area, type, unpack, pixelData);
+ return mTexStorage->setData(context, index, image, &area, type, unpack, pixelData);
}
- ANGLE_TRY(image->loadData(area, unpack, type, pixelData, index.is3D()));
- ANGLE_TRY(commitRegion(index, area));
+ 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::ImageIndex &index,
+gl::Error TextureD3D::setCompressedImageImpl(const gl::Context *context,
+ const gl::ImageIndex &index,
const gl::PixelUnpackState &unpack,
const uint8_t *pixels,
ptrdiff_t layerOffset)
@@ -259,7 +304,7 @@ gl::Error TextureD3D::setCompressedImageImpl(const gl::ImageIndex &index,
if (pixelData != nullptr)
{
gl::Box fullImageArea(0, 0, 0, image->getWidth(), image->getHeight(), image->getDepth());
- ANGLE_TRY(image->loadCompressedData(fullImageArea, pixelData));
+ ANGLE_TRY(image->loadCompressedData(context, fullImageArea, pixelData));
mDirtyImages = true;
}
@@ -267,8 +312,12 @@ gl::Error TextureD3D::setCompressedImageImpl(const gl::ImageIndex &index,
return gl::NoError();
}
-gl::Error TextureD3D::subImageCompressed(const gl::ImageIndex &index, const gl::Box &area, GLenum format,
- const gl::PixelUnpackState &unpack, const uint8_t *pixels,
+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;
@@ -279,7 +328,7 @@ gl::Error TextureD3D::subImageCompressed(const gl::ImageIndex &index, const gl::
ImageD3D *image = getImage(index);
ASSERT(image);
- ANGLE_TRY(image->loadCompressedData(area, pixelData));
+ ANGLE_TRY(image->loadCompressedData(context, area, pixelData));
mDirtyImages = true;
}
@@ -292,16 +341,20 @@ bool TextureD3D::isFastUnpackable(const gl::PixelUnpackState &unpack, GLenum siz
return unpack.pixelBuffer.id() != 0 && mRenderer->supportsFastCopyBufferToTexture(sizedInternalFormat);
}
-gl::Error TextureD3D::fastUnpackPixels(const gl::PixelUnpackState &unpack, const uint8_t *pixels, const gl::Box &destArea,
- GLenum sizedInternalFormat, GLenum type, RenderTargetD3D *destRenderTarget)
+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::Error(GL_INVALID_OPERATION,
- "Unimplemented pixel store parameters in fastUnpackPixels");
+ return gl::InternalError() << "Unimplemented pixel store parameters in fastUnpackPixels";
}
// No-op
@@ -316,7 +369,7 @@ gl::Error TextureD3D::fastUnpackPixels(const gl::PixelUnpackState &unpack, const
uintptr_t offset = reinterpret_cast<uintptr_t>(pixels);
- ANGLE_TRY(mRenderer->fastCopyBufferToTexture(unpack, static_cast<unsigned int>(offset),
+ ANGLE_TRY(mRenderer->fastCopyBufferToTexture(context, unpack, static_cast<unsigned int>(offset),
destRenderTarget, sizedInternalFormat, type,
destArea));
@@ -353,16 +406,17 @@ ImageD3D *TextureD3D::getBaseLevelImage() const
return getImage(getImageIndex(mBaseLevel, 0));
}
-gl::Error TextureD3D::setImageExternal(GLenum target,
+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::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureD3D::generateMipmap(ContextImpl *contextImpl)
+gl::Error TextureD3D::generateMipmap(const gl::Context *context)
{
const GLuint baseLevel = mState.getEffectiveBaseLevel();
const GLuint maxLevel = mState.getMipmapMaxLevel();
@@ -372,30 +426,30 @@ gl::Error TextureD3D::generateMipmap(ContextImpl *contextImpl)
{
// Switch to using the mipmapped texture.
TextureStorage *textureStorage = nullptr;
- ANGLE_TRY(getNativeTexture(&textureStorage));
+ ANGLE_TRY(getNativeTexture(context, &textureStorage));
ANGLE_TRY(textureStorage->useLevelZeroWorkaroundTexture(false));
}
// Set up proper mipmap chain in our Image array.
- initMipmapImages();
+ ANGLE_TRY(initMipmapImages(context));
if (mTexStorage && mTexStorage->supportsNativeMipmapFunction())
{
- ANGLE_TRY(updateStorage());
+ ANGLE_TRY(updateStorage(context));
// Generate the mipmap chain using the ad-hoc DirectX function.
- ANGLE_TRY(mRenderer->generateMipmapUsingD3D(mTexStorage, mState));
+ ANGLE_TRY(mRenderer->generateMipmapUsingD3D(context, mTexStorage, mState));
}
else
{
// Generate the mipmap chain, one level at a time.
- ANGLE_TRY(generateMipmapUsingImages(maxLevel));
+ ANGLE_TRY(generateMipmapUsingImages(context, maxLevel));
}
return gl::NoError();
}
-gl::Error TextureD3D::generateMipmapUsingImages(const GLuint maxLevel)
+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));
@@ -413,12 +467,12 @@ gl::Error TextureD3D::generateMipmapUsingImages(const GLuint maxLevel)
gl::ImageIndex srcIndex = getImageIndex(mBaseLevel, layer);
ImageD3D *image = getImage(srcIndex);
- ANGLE_TRY(image->copyFromTexStorage(srcIndex, mTexStorage));
+ ANGLE_TRY(image->copyFromTexStorage(context, srcIndex, mTexStorage));
}
}
else
{
- ANGLE_TRY(updateStorage());
+ ANGLE_TRY(updateStorage(context));
}
}
@@ -441,19 +495,20 @@ gl::Error TextureD3D::generateMipmapUsingImages(const GLuint maxLevel)
if (renderableStorage)
{
// GPU-side mipmapping
- ANGLE_TRY(mTexStorage->generateMipmap(sourceIndex, destIndex));
+ ANGLE_TRY(mTexStorage->generateMipmap(context, sourceIndex, destIndex));
}
else
{
// CPU-side mipmapping
- ANGLE_TRY(mRenderer->generateMipmap(getImage(destIndex), getImage(sourceIndex)));
+ ANGLE_TRY(
+ mRenderer->generateMipmap(context, getImage(destIndex), getImage(sourceIndex)));
}
}
}
if (mTexStorage)
{
- updateStorage();
+ updateStorage(context);
}
return gl::NoError();
@@ -486,9 +541,9 @@ bool TextureD3D::isBaseImageZeroSize() const
return false;
}
-gl::Error TextureD3D::ensureRenderTarget()
+gl::Error TextureD3D::ensureRenderTarget(const gl::Context *context)
{
- ANGLE_TRY(initializeStorage(true));
+ 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.
@@ -503,13 +558,12 @@ gl::Error TextureD3D::ensureRenderTarget()
ASSERT(mTexStorage);
if (!mTexStorage->isRenderTarget())
{
- TextureStorage *newRenderTargetStorage = nullptr;
+ TexStoragePointer newRenderTargetStorage(context);
ANGLE_TRY(createCompleteStorage(true, &newRenderTargetStorage));
- std::unique_ptr<TextureStorage> newStorageRef(newRenderTargetStorage);
- ANGLE_TRY(mTexStorage->copyToStorage(newRenderTargetStorage));
- ANGLE_TRY(setCompleteTexStorage(newRenderTargetStorage));
- newStorageRef.release();
+ ANGLE_TRY(mTexStorage->copyToStorage(context, newRenderTargetStorage.get()));
+ ANGLE_TRY(setCompleteTexStorage(context, newRenderTargetStorage.get()));
+ newRenderTargetStorage.release();
}
}
@@ -523,30 +577,33 @@ bool TextureD3D::canCreateRenderTargetForImage(const gl::ImageIndex &index) cons
return (image->isRenderableFormat() && levelsComplete);
}
-gl::Error TextureD3D::commitRegion(const gl::ImageIndex &index, const gl::Box &region)
+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(mTexStorage, index, region));
+ ANGLE_TRY(image->copyToStorage(context, mTexStorage, index, region));
image->markClean();
}
return gl::NoError();
}
-gl::Error TextureD3D::getAttachmentRenderTarget(GLenum /*binding*/,
+gl::Error TextureD3D::getAttachmentRenderTarget(const gl::Context *context,
+ GLenum /*binding*/,
const gl::ImageIndex &imageIndex,
FramebufferAttachmentRenderTarget **rtOut)
{
RenderTargetD3D *rtD3D = nullptr;
- gl::Error error = getRenderTarget(imageIndex, &rtD3D);
+ gl::Error error = getRenderTarget(context, imageIndex, &rtD3D);
*rtOut = static_cast<FramebufferAttachmentRenderTarget *>(rtD3D);
return error;
}
-void TextureD3D::setBaseLevel(GLuint baseLevel)
+gl::Error TextureD3D::setBaseLevel(const gl::Context *context, GLuint baseLevel)
{
const int oldStorageWidth = std::max(1, getLevelZeroWidth());
const int oldStorageHeight = std::max(1, getLevelZeroHeight());
@@ -565,8 +622,10 @@ void TextureD3D::setBaseLevel(GLuint baseLevel)
newStorageDepth != oldStorageDepth || newStorageFormat != oldStorageFormat))
{
markAllImagesDirty();
- SafeDelete(mTexStorage);
+ ANGLE_TRY(releaseTexStorage(context));
}
+
+ return gl::NoError();
}
void TextureD3D::syncState(const gl::Texture::DirtyBits &dirtyBits)
@@ -574,231 +633,67 @@ void TextureD3D::syncState(const gl::Texture::DirtyBits &dirtyBits)
// TODO(geofflang): Use dirty bits
}
-TextureD3D_2D::TextureD3D_2D(const gl::TextureState &state, RendererD3D *renderer)
- : TextureD3D(state, renderer)
-{
- mEGLImageTarget = false;
- for (int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; ++i)
- {
- mImageArray[i] = renderer->createImage();
- }
-}
-
-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
-{
- UNIMPLEMENTED();
- return nullptr;
-}
-
-gl::Error TextureD3D_2DMultisample::setImage(ContextImpl *contextImpl,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels)
-{
- UNIMPLEMENTED();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_2DMultisample::setSubImage(ContextImpl *contextImpl,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- GLenum type,
- const gl::PixelUnpackState &unpack,
- const uint8_t *pixels)
-{
- UNIMPLEMENTED();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_2DMultisample::setCompressedImage(ContextImpl *contextImpl,
- GLenum target,
- size_t level,
- GLenum internalFormat,
- const gl::Extents &size,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels)
-{
- UNIMPLEMENTED();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_2DMultisample::setCompressedSubImage(ContextImpl *contextImpl,
- GLenum target,
- size_t level,
- const gl::Box &area,
- GLenum format,
- const gl::PixelUnpackState &unpack,
- size_t imageSize,
- const uint8_t *pixels)
-{
- UNIMPLEMENTED();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_2DMultisample::copyImage(ContextImpl *contextImpl,
- GLenum target,
- size_t level,
- const gl::Rectangle &sourceArea,
- GLenum internalFormat,
- const gl::Framebuffer *source)
-{
- UNIMPLEMENTED();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_2DMultisample::copySubImage(ContextImpl *contextImpl,
- GLenum target,
- size_t level,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
- const gl::Framebuffer *source)
-{
- UNIMPLEMENTED();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_2DMultisample::setStorage(ContextImpl *contextImpl,
- GLenum target,
- size_t levels,
- GLenum internalFormat,
- const gl::Extents &size)
-{
- UNIMPLEMENTED();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_2DMultisample::setImageExternal(GLenum target,
- egl::Stream *stream,
- const egl::Stream::GLTextureDescription &desc)
-{
- UNIMPLEMENTED();
- return gl::InternalError();
-}
-
-void TextureD3D_2DMultisample::bindTexImage(egl::Surface *surface)
-{
- UNIMPLEMENTED();
-}
-
-void TextureD3D_2DMultisample::releaseTexImage()
-{
- UNIMPLEMENTED();
-}
-
-gl::Error TextureD3D_2DMultisample::setEGLImageTarget(GLenum target, egl::Image *image)
-{
- UNIMPLEMENTED();
- return gl::InternalError();
-}
-
-gl::Error TextureD3D_2DMultisample::getRenderTarget(const gl::ImageIndex &index,
- RenderTargetD3D **outRT)
+gl::Error TextureD3D::clearLevel(const gl::Context *context,
+ const gl::ImageIndex &index,
+ const gl::ColorF &clearValues)
{
- UNIMPLEMENTED();
- return gl::InternalError();
-}
-
-gl::ImageIndexIterator TextureD3D_2DMultisample::imageIterator() const
-{
- UNIMPLEMENTED();
- return gl::ImageIndexIterator::Make2DMultisample();
-}
-
-gl::ImageIndex TextureD3D_2DMultisample::getImageIndex(GLint mip, GLint layer) const
-{
- UNIMPLEMENTED();
- return gl::ImageIndex::Make2DMultisample();
-}
-
-bool TextureD3D_2DMultisample::isValidIndex(const gl::ImageIndex &index) const
-{
- UNIMPLEMENTED();
- return false;
-}
-
-GLsizei TextureD3D_2DMultisample::getLayerCount(int level) const
-{
- UNIMPLEMENTED();
- return GLsizei();
-}
-
-void TextureD3D_2DMultisample::markAllImagesDirty()
-{
- UNIMPLEMENTED();
-}
+ TextureStorage *storage = nullptr;
+ ANGLE_TRY(getNativeTexture(context, &storage));
+ RenderTargetD3D *renderTargetD3D = nullptr;
+ ANGLE_TRY(storage->getRenderTarget(context, index, &renderTargetD3D));
-gl::Error TextureD3D_2DMultisample::initializeStorage(bool renderTarget)
-{
- UNIMPLEMENTED();
- return gl::InternalError();
-}
+ mRenderer->clearRenderTarget(renderTargetD3D, clearValues);
-gl::Error TextureD3D_2DMultisample::createCompleteStorage(bool renderTarget,
- TextureStorage **outTexStorage) const
-{
- UNIMPLEMENTED();
- return gl::InternalError();
+ return gl::NoError();
}
-gl::Error TextureD3D_2DMultisample::setCompleteTexStorage(TextureStorage *newCompleteTexStorage)
+gl::Error TextureD3D::releaseTexStorage(const gl::Context *context)
{
- UNIMPLEMENTED();
- return gl::InternalError();
+ if (!mTexStorage)
+ {
+ return gl::NoError();
+ }
+ ANGLE_TRY(mTexStorage->onDestroy(context));
+ mTexStorage = nullptr;
+ return gl::NoError();
}
-gl::Error TextureD3D_2DMultisample::updateStorage()
+gl::Error TextureD3D::onDestroy(const gl::Context *context)
{
- UNIMPLEMENTED();
- return gl::InternalError();
+ return releaseTexStorage(context);
}
-void TextureD3D_2DMultisample::initMipmapImages()
+TextureD3D_2D::TextureD3D_2D(const gl::TextureState &state, RendererD3D *renderer)
+ : TextureD3D(state, renderer)
{
- UNIMPLEMENTED();
+ mEGLImageTarget = false;
+ for (auto &image : mImageArray)
+ {
+ image.reset(renderer->createImage());
+ }
}
-bool TextureD3D_2DMultisample::isImageComplete(const gl::ImageIndex &index) const
+gl::Error TextureD3D_2D::onDestroy(const gl::Context *context)
{
- UNIMPLEMENTED();
- return false;
+ // 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()
{
- // 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 (int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; ++i)
- {
- SafeDelete(mImageArray[i]);
- }
-
- SafeDelete(mTexStorage);
}
ImageD3D *TextureD3D_2D::getImage(int level, int layer) const
{
ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
ASSERT(layer == 0);
- return mImageArray[level];
+ return mImageArray[level].get();
}
ImageD3D *TextureD3D_2D::getImage(const gl::ImageIndex &index) const
@@ -806,7 +701,7 @@ 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];
+ return mImageArray[index.mipIndex].get();
}
GLsizei TextureD3D_2D::getLayerCount(int level) const
@@ -844,7 +739,12 @@ bool TextureD3D_2D::isDepth(GLint level) const
return gl::GetSizedInternalFormatInfo(getInternalFormat(level)).depthBits > 0;
}
-gl::Error TextureD3D_2D::setImage(ContextImpl *contextImpl,
+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,
@@ -861,7 +761,8 @@ gl::Error TextureD3D_2D::setImage(ContextImpl *contextImpl,
bool fastUnpacked = false;
GLint level = static_cast<GLint>(imageLevel);
- redefineImage(level, internalFormatInfo.sizedInternalFormat, size, false);
+ ANGLE_TRY(redefineImage(context, level, internalFormatInfo.sizedInternalFormat, size,
+ shouldForceReleaseImagesOnSetImage(pixels)));
gl::ImageIndex index = gl::ImageIndex::Make2D(level);
@@ -870,12 +771,12 @@ gl::Error TextureD3D_2D::setImage(ContextImpl *contextImpl,
{
// Will try to create RT storage if it does not exist
RenderTargetD3D *destRenderTarget = nullptr;
- ANGLE_TRY(getRenderTarget(index, &destRenderTarget));
+ ANGLE_TRY(getRenderTarget(context, index, &destRenderTarget));
gl::Box destArea(0, 0, 0, getWidth(level), getHeight(level), 1);
- ANGLE_TRY(fastUnpackPixels(unpack, pixels, destArea, internalFormatInfo.sizedInternalFormat,
- type, destRenderTarget));
+ ANGLE_TRY(fastUnpackPixels(context, unpack, pixels, destArea,
+ internalFormatInfo.sizedInternalFormat, type, destRenderTarget));
// Ensure we don't overwrite our newly initialized data
mImageArray[level]->markClean();
@@ -885,13 +786,13 @@ gl::Error TextureD3D_2D::setImage(ContextImpl *contextImpl,
if (!fastUnpacked)
{
- ANGLE_TRY(setImageImpl(index, type, unpack, pixels, 0));
+ ANGLE_TRY(setImageImpl(context, index, type, unpack, pixels, 0));
}
return gl::NoError();
}
-gl::Error TextureD3D_2D::setSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2D::setSubImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
const gl::Box &area,
@@ -907,18 +808,19 @@ gl::Error TextureD3D_2D::setSubImage(ContextImpl *contextImpl,
if (isFastUnpackable(unpack, getInternalFormat(level)) && isLevelComplete(level))
{
RenderTargetD3D *renderTarget = nullptr;
- ANGLE_TRY(getRenderTarget(index, &renderTarget));
+ ANGLE_TRY(getRenderTarget(context, index, &renderTarget));
ASSERT(!mImageArray[level]->isDirty());
- return fastUnpackPixels(unpack, pixels, area, getInternalFormat(level), type, renderTarget);
+ return fastUnpackPixels(context, unpack, pixels, area, getInternalFormat(level), type,
+ renderTarget);
}
else
{
- return TextureD3D::subImage(index, area, format, type, unpack, pixels, 0);
+ return TextureD3D::subImage(context, index, area, format, type, unpack, pixels, 0);
}
}
-gl::Error TextureD3D_2D::setCompressedImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2D::setCompressedImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
GLenum internalFormat,
@@ -931,12 +833,13 @@ gl::Error TextureD3D_2D::setCompressedImage(ContextImpl *contextImpl,
GLint level = static_cast<GLint>(imageLevel);
// compressed formats don't have separate sized internal formats-- we can just use the compressed format directly
- redefineImage(level, internalFormat, size, false);
+ ANGLE_TRY(redefineImage(context, level, internalFormat, size,
+ shouldForceReleaseImagesOnSetImage(pixels)));
- return setCompressedImageImpl(gl::ImageIndex::Make2D(level), unpack, pixels, 0);
+ return setCompressedImageImpl(context, gl::ImageIndex::Make2D(level), unpack, pixels, 0);
}
-gl::Error TextureD3D_2D::setCompressedSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2D::setCompressedSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -948,59 +851,101 @@ gl::Error TextureD3D_2D::setCompressedSubImage(ContextImpl *contextImpl,
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(index, area, format, unpack, pixels, 0));
+ ANGLE_TRY(TextureD3D::subImageCompressed(context, index, area, format, unpack, pixels, 0));
- return commitRegion(index, area);
+ return commitRegion(context, index, area);
}
-gl::Error TextureD3D_2D::copyImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2D::copyImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
- const gl::Rectangle &sourceArea,
+ const gl::Rectangle &origSourceArea,
GLenum internalFormat,
const gl::Framebuffer *source)
{
ASSERT(target == GL_TEXTURE_2D);
- GLint level = static_cast<GLint>(imageLevel);
+ GLint level = static_cast<GLint>(imageLevel);
const gl::InternalFormat &internalFormatInfo =
gl::GetInternalFormatInfo(internalFormat, GL_UNSIGNED_BYTE);
- redefineImage(level, internalFormatInfo.sizedInternalFormat,
- gl::Extents(sourceArea.width, sourceArea.height, 1), false);
+ gl::Extents sourceExtents(origSourceArea.width, origSourceArea.height, 1);
+ ANGLE_TRY(redefineImage(context, level, internalFormatInfo.sizedInternalFormat, sourceExtents,
+ mRenderer->isRobustResourceInitEnabled()));
+
+ 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 &&
+ !mRenderer->isRobustResourceInitEnabled())
+ {
+ angle::MemoryBuffer *zero;
+ ANGLE_TRY(context->getZeroFilledBuffer(
+ origSourceArea.width * origSourceArea.height * internalFormatInfo.pixelBytes, &zero));
+ setImage(context, target, imageLevel, internalFormat, sourceExtents,
+ internalFormatInfo.format, internalFormatInfo.type, gl::PixelUnpackState(1, 0),
+ 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(0, 0, 0);
+ 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(destOffset, sourceArea, source));
+ ANGLE_TRY(mImageArray[level]->copyFromFramebuffer(context, destOffset, sourceArea, source));
mDirtyImages = true;
}
else
{
- ANGLE_TRY(ensureRenderTarget());
- mImageArray[level]->markClean();
+ ANGLE_TRY(ensureRenderTarget(context));
if (sourceArea.width != 0 && sourceArea.height != 0 && isValidLevel(level))
{
- ANGLE_TRY(mRenderer->copyImage2D(source, sourceArea, internalFormat, destOffset,
- mTexStorage, 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(ContextImpl *contextImpl,
+gl::Error TextureD3D_2D::copySubImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
+ const gl::Offset &origDestOffset,
+ const gl::Rectangle &origSourceArea,
const gl::Framebuffer *source)
{
- ASSERT(target == GL_TEXTURE_2D && destOffset.z == 0);
+ 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)
@@ -1012,17 +957,17 @@ gl::Error TextureD3D_2D::copySubImage(ContextImpl *contextImpl,
// so we should use the non-rendering copy path.
if (!canCreateRenderTargetForImage(index) || mRenderer->getWorkarounds().zeroMaxLodWorkaround)
{
- ANGLE_TRY(mImageArray[level]->copyFromFramebuffer(destOffset, sourceArea, source));
+ ANGLE_TRY(mImageArray[level]->copyFromFramebuffer(context, destOffset, sourceArea, source));
mDirtyImages = true;
}
else
{
- ANGLE_TRY(ensureRenderTarget());
+ ANGLE_TRY(ensureRenderTarget(context));
if (isValidLevel(level))
{
- ANGLE_TRY(updateStorageLevel(level));
- ANGLE_TRY(mRenderer->copyImage2D(source, sourceArea,
+ ANGLE_TRY(updateStorageLevel(context, level));
+ ANGLE_TRY(mRenderer->copyImage2D(context, source, sourceArea,
gl::GetUnsizedFormat(getBaseLevelInternalFormat()),
destOffset, mTexStorage, level));
}
@@ -1031,7 +976,7 @@ gl::Error TextureD3D_2D::copySubImage(ContextImpl *contextImpl,
return gl::NoError();
}
-gl::Error TextureD3D_2D::copyTexture(ContextImpl *contextImpl,
+gl::Error TextureD3D_2D::copyTexture(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -1051,31 +996,42 @@ gl::Error TextureD3D_2D::copyTexture(ContextImpl *contextImpl,
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);
- redefineImage(destLevel, internalFormatInfo.sizedInternalFormat, size, false);
+ ANGLE_TRY(
+ redefineImage(context, destLevel, internalFormatInfo.sizedInternalFormat, size, false));
- if (canCreateRenderTargetForImage(gl::ImageIndex::Make2D(destLevel)))
+ 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());
+ ANGLE_TRY(ensureRenderTarget(context));
ASSERT(isValidLevel(destLevel));
- ANGLE_TRY(updateStorageLevel(destLevel));
+ ANGLE_TRY(updateStorageLevel(context, destLevel));
- gl::Rectangle sourceRect(0, 0, size.width, size.height);
- gl::Offset destOffset(0, 0, 0);
- ANGLE_TRY(mRenderer->copyTexture(source, static_cast<GLint>(sourceLevel), sourceRect,
- internalFormatInfo.format, destOffset, mTexStorage, target,
- destLevel, unpackFlipY, unpackPremultiplyAlpha,
- unpackUnmultiplyAlpha));
+ ANGLE_TRY(mRenderer->copyTexture(context, source, static_cast<GLint>(sourceLevel),
+ sourceRect, internalFormatInfo.format, destOffset,
+ mTexStorage, target, destLevel, unpackFlipY,
+ unpackPremultiplyAlpha, unpackUnmultiplyAlpha));
}
else
{
- ASSERT(internalFormat == GL_RGB9_E5);
- UNIMPLEMENTED();
+ 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));
}
return gl::NoError();
}
-gl::Error TextureD3D_2D::copySubTexture(ContextImpl *contextImpl,
+gl::Error TextureD3D_2D::copySubTexture(const gl::Context *context,
GLenum target,
size_t level,
const gl::Offset &destOffset,
@@ -1090,27 +1046,37 @@ gl::Error TextureD3D_2D::copySubTexture(ContextImpl *contextImpl,
GLint destLevel = static_cast<GLint>(level);
- if (canCreateRenderTargetForImage(gl::ImageIndex::Make2D(destLevel)))
+ if (!isSRGB(destLevel) && canCreateRenderTargetForImage(gl::ImageIndex::Make2D(destLevel)))
{
- ANGLE_TRY(ensureRenderTarget());
+ ANGLE_TRY(ensureRenderTarget(context));
ASSERT(isValidLevel(destLevel));
- ANGLE_TRY(updateStorageLevel(destLevel));
+ ANGLE_TRY(updateStorageLevel(context, destLevel));
- ANGLE_TRY(mRenderer->copyTexture(source, static_cast<GLint>(sourceLevel), sourceArea,
- gl::GetUnsizedFormat(getInternalFormat(destLevel)),
- destOffset, mTexStorage, target, destLevel, unpackFlipY,
- unpackPremultiplyAlpha, unpackUnmultiplyAlpha));
+ ANGLE_TRY(mRenderer->copyTexture(
+ context, source, static_cast<GLint>(sourceLevel), sourceArea,
+ gl::GetUnsizedFormat(getInternalFormat(destLevel)), destOffset, mTexStorage, target,
+ destLevel, unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha));
}
else
{
- ASSERT(getInternalFormat(destLevel) == GL_RGB9_E5);
- UNIMPLEMENTED();
+ 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));
}
return gl::NoError();
}
-gl::Error TextureD3D_2D::copyCompressedTexture(ContextImpl *contextImpl, const gl::Texture *source)
+gl::Error TextureD3D_2D::copyCompressedTexture(const gl::Context *context,
+ const gl::Texture *source)
{
GLenum sourceTarget = source->getTarget();
GLint sourceLevel = 0;
@@ -1121,17 +1087,18 @@ gl::Error TextureD3D_2D::copyCompressedTexture(ContextImpl *contextImpl, const g
source->getFormat(sourceTarget, sourceLevel).info->sizedInternalFormat;
gl::Extents size(static_cast<int>(source->getWidth(sourceTarget, sourceLevel)),
static_cast<int>(source->getHeight(sourceTarget, sourceLevel)), 1);
- redefineImage(destLevel, sizedInternalFormat, size, false);
+ ANGLE_TRY(redefineImage(context, destLevel, sizedInternalFormat, size, false));
- ANGLE_TRY(initializeStorage(false));
+ ANGLE_TRY(initializeStorage(context, false));
ASSERT(mTexStorage);
- ANGLE_TRY(mRenderer->copyCompressedTexture(source, sourceLevel, mTexStorage, destLevel));
+ ANGLE_TRY(
+ mRenderer->copyCompressedTexture(context, source, sourceLevel, mTexStorage, destLevel));
return gl::NoError();
}
-gl::Error TextureD3D_2D::setStorage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2D::setStorage(const gl::Context *context,
GLenum target,
size_t levels,
GLenum internalFormat,
@@ -1144,44 +1111,38 @@ gl::Error TextureD3D_2D::setStorage(ContextImpl *contextImpl,
gl::Extents levelSize(std::max(1, size.width >> level),
std::max(1, size.height >> level),
1);
- redefineImage(level, internalFormat, levelSize, true);
+ ANGLE_TRY(redefineImage(context, level, internalFormat, levelSize, true));
}
for (size_t level = levels; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
{
- redefineImage(level, GL_NONE, gl::Extents(0, 0, 1), true);
+ 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());
- TextureStorage *storage = mRenderer->createTextureStorage2D(
- internalFormat, renderTarget, size.width, size.height, static_cast<int>(levels), false);
+ bool renderTarget = IsRenderTargetUsage(mState.getUsage());
+ TexStoragePointer storage(context);
+ storage.reset(mRenderer->createTextureStorage2D(internalFormat, renderTarget, size.width,
+ size.height, static_cast<int>(levels), false));
- gl::Error error = setCompleteTexStorage(storage);
- if (error.isError())
- {
- SafeDelete(storage);
- return error;
- }
+ ANGLE_TRY(setCompleteTexStorage(context, storage.get()));
+ storage.release();
- ANGLE_TRY(updateStorage());
+ ANGLE_TRY(updateStorage(context));
mImmutable = true;
return gl::NoError();
}
-void TextureD3D_2D::bindTexImage(egl::Surface *surface)
+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);
- redefineImage(0, internalformat, size, true);
+ ANGLE_TRY(redefineImage(context, 0, internalformat, size, true));
- if (mTexStorage)
- {
- SafeDelete(mTexStorage);
- }
+ ANGLE_TRY(releaseTexStorage(context));
SurfaceD3D *surfaceD3D = GetImplAs<SurfaceD3D>(surface);
ASSERT(surfaceD3D);
@@ -1190,42 +1151,47 @@ void TextureD3D_2D::bindTexImage(egl::Surface *surface)
mEGLImageTarget = false;
mDirtyImages = true;
+ return gl::NoError();
}
-void TextureD3D_2D::releaseTexImage()
+gl::Error TextureD3D_2D::releaseTexImage(const gl::Context *context)
{
if (mTexStorage)
{
- SafeDelete(mTexStorage);
+ ANGLE_TRY(releaseTexStorage(context));
}
for (int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{
- redefineImage(i, GL_NONE, gl::Extents(0, 0, 1), true);
+ ANGLE_TRY(redefineImage(context, i, GL_NONE, gl::Extents(0, 0, 1), true));
}
+
+ return gl::NoError();
}
-gl::Error TextureD3D_2D::setEGLImageTarget(GLenum target, egl::Image *image)
+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);
- redefineImage(0, format.info->sizedInternalFormat, size, true);
+ ANGLE_TRY(redefineImage(context, 0, format.info->sizedInternalFormat, size, true));
// Clear all other images.
- for (size_t level = 1; level < ArraySize(mImageArray); level++)
+ for (size_t level = 1; level < mImageArray.size(); level++)
{
- redefineImage(level, GL_NONE, gl::Extents(0, 0, 1), true);
+ ANGLE_TRY(redefineImage(context, level, GL_NONE, gl::Extents(0, 0, 1), true));
}
- SafeDelete(mTexStorage);
+ 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(&renderTargetD3D));
+ ANGLE_TRY(eglImaged3d->getRenderTarget(context, &renderTargetD3D));
mTexStorage = mRenderer->createTextureStorageEGLImage(eglImaged3d, renderTargetD3D);
mEGLImageTarget = true;
@@ -1233,7 +1199,7 @@ gl::Error TextureD3D_2D::setEGLImageTarget(GLenum target, egl::Image *image)
return gl::NoError();
}
-void TextureD3D_2D::initMipmapImages()
+gl::Error TextureD3D_2D::initMipmapImages(const gl::Context *context)
{
const GLuint baseLevel = mState.getEffectiveBaseLevel();
const GLuint maxLevel = mState.getMipmapMaxLevel();
@@ -1244,19 +1210,22 @@ void TextureD3D_2D::initMipmapImages()
gl::Extents levelSize(std::max(getLevelZeroWidth() >> level, 1),
std::max(getLevelZeroHeight() >> level, 1), 1);
- redefineImage(level, getBaseLevelInternalFormat(), levelSize, false);
+ ANGLE_TRY(redefineImage(context, level, getBaseLevelInternalFormat(), levelSize, false));
}
+ return gl::NoError();
}
-gl::Error TextureD3D_2D::getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT)
+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());
- ANGLE_TRY(updateStorageLevel(index.mipIndex));
+ ANGLE_TRY(ensureRenderTarget(context));
+ ANGLE_TRY(updateStorageLevel(context, index.mipIndex));
- return mTexStorage->getRenderTarget(index, outRT);
+ return mTexStorage->getRenderTarget(context, index, outRT);
}
bool TextureD3D_2D::isValidLevel(int level) const
@@ -1285,8 +1254,9 @@ bool TextureD3D_2D::isLevelComplete(int level) const
return true;
}
- ASSERT(level >= 0 && level <= (int)ArraySize(mImageArray) && mImageArray[level] != nullptr);
- ImageD3D *image = mImageArray[level];
+ ASSERT(level >= 0 && level <= static_cast<int>(mImageArray.size()) &&
+ mImageArray[level] != nullptr);
+ ImageD3D *image = mImageArray[level].get();
if (image->getInternalFormat() != getBaseLevelInternalFormat())
{
@@ -1312,7 +1282,7 @@ bool TextureD3D_2D::isImageComplete(const gl::ImageIndex &index) const
}
// Constructs a native texture resource from the texture images
-gl::Error TextureD3D_2D::initializeStorage(bool renderTarget)
+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)
@@ -1328,25 +1298,22 @@ gl::Error TextureD3D_2D::initializeStorage(bool renderTarget)
bool createRenderTarget = (renderTarget || IsRenderTargetUsage(mState.getUsage()));
- TextureStorage *storage = nullptr;
+ TexStoragePointer storage(context);
ANGLE_TRY(createCompleteStorage(createRenderTarget, &storage));
- gl::Error error = setCompleteTexStorage(storage);
- if (error.isError())
- {
- SafeDelete(storage);
- return error;
- }
+ ANGLE_TRY(setCompleteTexStorage(context, storage.get()));
+ storage.release();
ASSERT(mTexStorage);
// flush image data to the storage
- ANGLE_TRY(updateStorage());
+ ANGLE_TRY(updateStorage(context));
return gl::NoError();
}
-gl::Error TextureD3D_2D::createCompleteStorage(bool renderTarget, TextureStorage **outTexStorage) const
+gl::Error TextureD3D_2D::createCompleteStorage(bool renderTarget,
+ TexStoragePointer *outStorage) const
{
GLsizei width = getLevelZeroWidth();
GLsizei height = getLevelZeroHeight();
@@ -1370,22 +1337,25 @@ gl::Error TextureD3D_2D::createCompleteStorage(bool renderTarget, TextureStorage
}
// TODO(geofflang): Determine if the texture creation succeeded
- *outTexStorage = mRenderer->createTextureStorage2D(internalFormat, renderTarget, width, height, levels, hintLevelZeroOnly);
+ outStorage->reset(mRenderer->createTextureStorage2D(internalFormat, renderTarget, width, height,
+ levels, hintLevelZeroOnly));
return gl::NoError();
}
-gl::Error TextureD3D_2D::setCompleteTexStorage(TextureStorage *newCompleteTexStorage)
+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(newCompleteTexStorage, level));
+ ANGLE_TRY(
+ mImageArray[level]->setManagedSurface2D(context, newCompleteTexStorage, level));
}
}
- SafeDelete(mTexStorage);
+ ANGLE_TRY(releaseTexStorage(context));
mTexStorage = newCompleteTexStorage;
mDirtyImages = true;
@@ -1393,7 +1363,7 @@ gl::Error TextureD3D_2D::setCompleteTexStorage(TextureStorage *newCompleteTexSto
return gl::NoError();
}
-gl::Error TextureD3D_2D::updateStorage()
+gl::Error TextureD3D_2D::updateStorage(const gl::Context *context)
{
ASSERT(mTexStorage != nullptr);
GLint storageLevels = mTexStorage->getLevelCount();
@@ -1401,32 +1371,33 @@ gl::Error TextureD3D_2D::updateStorage()
{
if (mImageArray[level]->isDirty() && isLevelComplete(level))
{
- ANGLE_TRY(updateStorageLevel(level));
+ ANGLE_TRY(updateStorageLevel(context, level));
}
}
return gl::NoError();
}
-gl::Error TextureD3D_2D::updateStorageLevel(int level)
+gl::Error TextureD3D_2D::updateStorageLevel(const gl::Context *context, int level)
{
- ASSERT(level <= (int)ArraySize(mImageArray) && mImageArray[level] != nullptr);
+ 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(index, region));
+ ANGLE_TRY(commitRegion(context, index, region));
}
return gl::NoError();
}
-void TextureD3D_2D::redefineImage(size_t level,
- GLenum internalformat,
- const gl::Extents &size,
- bool forceRelease)
+gl::Error TextureD3D_2D::redefineImage(const gl::Context *context,
+ size_t level,
+ GLenum internalformat,
+ const gl::Extents &size,
+ bool forceRelease)
{
ASSERT(size.depth == 1);
@@ -1436,6 +1407,7 @@ void TextureD3D_2D::redefineImage(size_t level,
const GLenum storageFormat = getBaseLevelInternalFormat();
mImageArray[level]->redefine(GL_TEXTURE_2D, internalformat, size, forceRelease);
+ mDirtyImages = mDirtyImages || mImageArray[level]->isDirty();
if (mTexStorage)
{
@@ -1445,22 +1417,23 @@ void TextureD3D_2D::redefineImage(size_t level,
// while orphaning
if (level != 0 && mEGLImageTarget)
{
- // TODO(jmadill): Don't discard error.
- mImageArray[0]->copyFromTexStorage(gl::ImageIndex::Make2D(0), mTexStorage);
+ ANGLE_TRY(mImageArray[0]->copyFromTexStorage(context, gl::ImageIndex::Make2D(0),
+ mTexStorage));
}
- if ((level >= storageLevels && storageLevels != 0) ||
- size.width != storageWidth ||
+ if ((level >= storageLevels && storageLevels != 0) || size.width != storageWidth ||
size.height != storageHeight ||
- internalformat != storageFormat) // Discard mismatched storage
+ internalformat != storageFormat) // Discard mismatched storage
{
- SafeDelete(mTexStorage);
+ 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
@@ -1489,57 +1462,49 @@ void TextureD3D_2D::markAllImagesDirty()
mDirtyImages = true;
}
-gl::Error TextureD3D_2D::setStorageMultisample(ContextImpl *contextImpl,
- GLenum target,
- GLsizei samples,
- GLint internalFormat,
- const gl::Extents &size,
- GLboolean fixedSampleLocations)
-{
- UNIMPLEMENTED();
- return gl::InternalError() << "setStorageMultisample is unimplemented.";
-}
-
TextureD3D_Cube::TextureD3D_Cube(const gl::TextureState &state, RendererD3D *renderer)
: TextureD3D(state, renderer)
{
- for (int i = 0; i < 6; i++)
+ for (auto &face : mImageArray)
{
- for (int j = 0; j < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; ++j)
+ for (auto &image : face)
{
- mImageArray[i][j] = renderer->createImage();
+ image.reset(renderer->createImage());
}
}
}
-TextureD3D_Cube::~TextureD3D_Cube()
+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 (int i = 0; i < 6; i++)
+ // 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 (int j = 0; j < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; ++j)
+ for (auto &image : face)
{
- SafeDelete(mImageArray[i][j]);
+ image.reset();
}
}
+ return TextureD3D::onDestroy(context);
+}
- SafeDelete(mTexStorage);
+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];
+ 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];
+ return mImageArray[index.layerIndex][index.mipIndex].get();
}
GLsizei TextureD3D_Cube::getLayerCount(int level) const
@@ -1561,13 +1526,20 @@ bool TextureD3D_Cube::isDepth(GLint level, GLint layer) const
return gl::GetSizedInternalFormatInfo(getInternalFormat(level, layer)).depthBits > 0;
}
-gl::Error TextureD3D_Cube::setEGLImageTarget(GLenum target, egl::Image *image)
+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::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureD3D_Cube::setImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_Cube::setImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -1582,13 +1554,14 @@ gl::Error TextureD3D_Cube::setImage(ContextImpl *contextImpl,
const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat, type);
gl::ImageIndex index = gl::ImageIndex::MakeCube(target, static_cast<GLint>(level));
- redefineImage(index.layerIndex, static_cast<GLint>(level),
- internalFormatInfo.sizedInternalFormat, size);
+ ANGLE_TRY(redefineImage(context, index.layerIndex, static_cast<GLint>(level),
+ internalFormatInfo.sizedInternalFormat, size,
+ shouldForceReleaseImagesOnSetImage(pixels)));
- return setImageImpl(index, type, unpack, pixels, 0);
+ return setImageImpl(context, index, type, unpack, pixels, 0);
}
-gl::Error TextureD3D_Cube::setSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_Cube::setSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -1600,10 +1573,10 @@ gl::Error TextureD3D_Cube::setSubImage(ContextImpl *contextImpl,
ASSERT(area.depth == 1 && area.z == 0);
gl::ImageIndex index = gl::ImageIndex::MakeCube(target, static_cast<GLint>(level));
- return TextureD3D::subImage(index, area, format, type, unpack, pixels, 0);
+ return TextureD3D::subImage(context, index, area, format, type, unpack, pixels, 0);
}
-gl::Error TextureD3D_Cube::setCompressedImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_Cube::setCompressedImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -1617,13 +1590,14 @@ gl::Error TextureD3D_Cube::setCompressedImage(ContextImpl *contextImpl,
// compressed formats don't have separate sized internal formats-- we can just use the compressed format directly
size_t faceIndex = gl::CubeMapTextureTargetToLayerIndex(target);
- redefineImage(static_cast<int>(faceIndex), static_cast<GLint>(level), internalFormat, size);
+ ANGLE_TRY(redefineImage(context, static_cast<int>(faceIndex), static_cast<GLint>(level),
+ internalFormat, size, shouldForceReleaseImagesOnSetImage(pixels)));
gl::ImageIndex index = gl::ImageIndex::MakeCube(target, static_cast<GLint>(level));
- return setCompressedImageImpl(index, unpack, pixels, 0);
+ return setCompressedImageImpl(context, index, unpack, pixels, 0);
}
-gl::Error TextureD3D_Cube::setCompressedSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_Cube::setCompressedSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -1636,11 +1610,11 @@ gl::Error TextureD3D_Cube::setCompressedSubImage(ContextImpl *contextImpl,
gl::ImageIndex index = gl::ImageIndex::MakeCube(target, static_cast<GLint>(level));
- ANGLE_TRY(TextureD3D::subImageCompressed(index, area, format, unpack, pixels, 0));
- return commitRegion(index, area);
+ ANGLE_TRY(TextureD3D::subImageCompressed(context, index, area, format, unpack, pixels, 0));
+ return commitRegion(context, index, area);
}
-gl::Error TextureD3D_Cube::copyImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_Cube::copyImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
const gl::Rectangle &sourceArea,
@@ -1654,7 +1628,9 @@ gl::Error TextureD3D_Cube::copyImage(ContextImpl *contextImpl,
GLint level = static_cast<GLint>(imageLevel);
gl::Extents size(sourceArea.width, sourceArea.height, 1);
- redefineImage(static_cast<int>(faceIndex), level, internalFormatInfo.sizedInternalFormat, size);
+ ANGLE_TRY(redefineImage(context, static_cast<int>(faceIndex), level,
+ internalFormatInfo.sizedInternalFormat, size,
+ mRenderer->isRobustResourceInitEnabled()));
gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level);
gl::Offset destOffset(0, 0, 0);
@@ -1663,28 +1639,28 @@ gl::Error TextureD3D_Cube::copyImage(ContextImpl *contextImpl,
// so we should use the non-rendering copy path.
if (!canCreateRenderTargetForImage(index) || mRenderer->getWorkarounds().zeroMaxLodWorkaround)
{
- ANGLE_TRY(
- mImageArray[faceIndex][level]->copyFromFramebuffer(destOffset, sourceArea, source));
+ ANGLE_TRY(mImageArray[faceIndex][level]->copyFromFramebuffer(context, destOffset,
+ sourceArea, source));
mDirtyImages = true;
}
else
{
- ANGLE_TRY(ensureRenderTarget());
- mImageArray[faceIndex][level]->markClean();
+ ANGLE_TRY(ensureRenderTarget(context));
ASSERT(size.width == size.height);
if (size.width > 0 && isValidFaceLevel(faceIndex, level))
{
- ANGLE_TRY(mRenderer->copyImageCube(source, sourceArea, internalFormat, destOffset,
- mTexStorage, target, 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(ContextImpl *contextImpl,
+gl::Error TextureD3D_Cube::copySubImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
const gl::Offset &destOffset,
@@ -1700,8 +1676,8 @@ gl::Error TextureD3D_Cube::copySubImage(ContextImpl *contextImpl,
// so we should use the non-rendering copy path.
if (!canCreateRenderTargetForImage(index) || mRenderer->getWorkarounds().zeroMaxLodWorkaround)
{
- gl::Error error =
- mImageArray[faceIndex][level]->copyFromFramebuffer(destOffset, sourceArea, source);
+ gl::Error error = mImageArray[faceIndex][level]->copyFromFramebuffer(context, destOffset,
+ sourceArea, source);
if (error.isError())
{
return error;
@@ -1711,11 +1687,11 @@ gl::Error TextureD3D_Cube::copySubImage(ContextImpl *contextImpl,
}
else
{
- ANGLE_TRY(ensureRenderTarget());
+ ANGLE_TRY(ensureRenderTarget(context));
if (isValidFaceLevel(faceIndex, level))
{
- ANGLE_TRY(updateStorageFaceLevel(faceIndex, level));
- ANGLE_TRY(mRenderer->copyImageCube(source, sourceArea,
+ ANGLE_TRY(updateStorageFaceLevel(context, faceIndex, level));
+ ANGLE_TRY(mRenderer->copyImageCube(context, source, sourceArea,
gl::GetUnsizedFormat(getBaseLevelInternalFormat()),
destOffset, mTexStorage, target, level));
}
@@ -1724,7 +1700,7 @@ gl::Error TextureD3D_Cube::copySubImage(ContextImpl *contextImpl,
return gl::NoError();
}
-gl::Error TextureD3D_Cube::copyTexture(ContextImpl *contextImpl,
+gl::Error TextureD3D_Cube::copyTexture(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -1745,31 +1721,44 @@ gl::Error TextureD3D_Cube::copyTexture(ContextImpl *contextImpl,
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);
- redefineImage(faceIndex, destLevel, internalFormatInfo.sizedInternalFormat, size);
+ 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 (canCreateRenderTargetForImage(gl::ImageIndex::MakeCube(target, destLevel)))
+ if (!isSRGB(destLevel, faceIndex) &&
+ canCreateRenderTargetForImage(gl::ImageIndex::MakeCube(target, destLevel)))
{
- ANGLE_TRY(ensureRenderTarget());
+ ANGLE_TRY(ensureRenderTarget(context));
ASSERT(isValidFaceLevel(faceIndex, destLevel));
- ANGLE_TRY(updateStorageFaceLevel(faceIndex, destLevel));
+ ANGLE_TRY(updateStorageFaceLevel(context, faceIndex, destLevel));
- gl::Rectangle sourceRect(0, 0, size.width, size.height);
- gl::Offset destOffset(0, 0, 0);
- ANGLE_TRY(mRenderer->copyTexture(source, static_cast<GLint>(sourceLevel), sourceRect,
- internalFormatInfo.format, destOffset, mTexStorage, target,
- destLevel, unpackFlipY, unpackPremultiplyAlpha,
- unpackUnmultiplyAlpha));
+ ANGLE_TRY(mRenderer->copyTexture(context, source, static_cast<GLint>(sourceLevel),
+ sourceRect, internalFormatInfo.format, destOffset,
+ mTexStorage, target, destLevel, unpackFlipY,
+ unpackPremultiplyAlpha, unpackUnmultiplyAlpha));
}
else
{
- ASSERT(internalFormat == GL_RGB9_E5);
- UNIMPLEMENTED();
+ 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));
}
return gl::NoError();
}
-gl::Error TextureD3D_Cube::copySubTexture(ContextImpl *contextImpl,
+gl::Error TextureD3D_Cube::copySubTexture(const gl::Context *context,
GLenum target,
size_t level,
const gl::Offset &destOffset,
@@ -1785,27 +1774,38 @@ gl::Error TextureD3D_Cube::copySubTexture(ContextImpl *contextImpl,
GLint destLevel = static_cast<GLint>(level);
int faceIndex = static_cast<int>(gl::CubeMapTextureTargetToLayerIndex(target));
- if (canCreateRenderTargetForImage(gl::ImageIndex::MakeCube(target, destLevel)))
+ if (!isSRGB(destLevel, faceIndex) &&
+ canCreateRenderTargetForImage(gl::ImageIndex::MakeCube(target, destLevel)))
{
- ANGLE_TRY(ensureRenderTarget());
+ ANGLE_TRY(ensureRenderTarget(context));
ASSERT(isValidFaceLevel(faceIndex, destLevel));
- ANGLE_TRY(updateStorageFaceLevel(faceIndex, destLevel));
+ ANGLE_TRY(updateStorageFaceLevel(context, faceIndex, destLevel));
ANGLE_TRY(mRenderer->copyTexture(
- source, static_cast<GLint>(sourceLevel), sourceArea,
+ context, source, static_cast<GLint>(sourceLevel), sourceArea,
gl::GetUnsizedFormat(getInternalFormat(destLevel, faceIndex)), destOffset, mTexStorage,
target, destLevel, unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha));
}
else
{
- ASSERT(getInternalFormat(destLevel, faceIndex) == GL_RGB9_E5);
- UNIMPLEMENTED();
+ 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));
}
return gl::NoError();
}
-gl::Error TextureD3D_Cube::setStorage(ContextImpl *contextImpl,
+gl::Error TextureD3D_Cube::setStorage(const gl::Context *context,
GLenum target,
size_t levels,
GLenum internalFormat,
@@ -1834,17 +1834,14 @@ gl::Error TextureD3D_Cube::setStorage(ContextImpl *contextImpl,
// TODO(geofflang): Verify storage creation had no errors
bool renderTarget = IsRenderTargetUsage(mState.getUsage());
- TextureStorage *storage = mRenderer->createTextureStorageCube(
- internalFormat, renderTarget, size.width, static_cast<int>(levels), false);
+ TexStoragePointer storage(context);
+ storage.reset(mRenderer->createTextureStorageCube(internalFormat, renderTarget, size.width,
+ static_cast<int>(levels), false));
- gl::Error error = setCompleteTexStorage(storage);
- if (error.isError())
- {
- SafeDelete(storage);
- return error;
- }
+ ANGLE_TRY(setCompleteTexStorage(context, storage.get()));
+ storage.release();
- ANGLE_TRY(updateStorage());
+ ANGLE_TRY(updateStorage(context));
mImmutable = true;
@@ -1878,17 +1875,19 @@ bool TextureD3D_Cube::isCubeComplete() const
return true;
}
-void TextureD3D_Cube::bindTexImage(egl::Surface *surface)
+gl::Error TextureD3D_Cube::bindTexImage(const gl::Context *context, egl::Surface *surface)
{
UNREACHABLE();
+ return gl::InternalError();
}
-void TextureD3D_Cube::releaseTexImage()
+gl::Error TextureD3D_Cube::releaseTexImage(const gl::Context *context)
{
UNREACHABLE();
+ return gl::InternalError();
}
-void TextureD3D_Cube::initMipmapImages()
+gl::Error TextureD3D_Cube::initMipmapImages(const gl::Context *context)
{
const GLuint baseLevel = mState.getEffectiveBaseLevel();
const GLuint maxLevel = mState.getMipmapMaxLevel();
@@ -1900,24 +1899,28 @@ void TextureD3D_Cube::initMipmapImages()
{
int faceLevelSize =
(std::max(mImageArray[faceIndex][baseLevel]->getWidth() >> (level - baseLevel), 1));
- redefineImage(faceIndex, level, mImageArray[faceIndex][baseLevel]->getInternalFormat(),
- gl::Extents(faceLevelSize, faceLevelSize, 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::ImageIndex &index, RenderTargetD3D **outRT)
+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());
- ANGLE_TRY(updateStorageFaceLevel(index.layerIndex, index.mipIndex));
+ ANGLE_TRY(ensureRenderTarget(context));
+ ANGLE_TRY(updateStorageFaceLevel(context, index.layerIndex, index.mipIndex));
- return mTexStorage->getRenderTarget(index, outRT);
+ return mTexStorage->getRenderTarget(context, index, outRT);
}
-gl::Error TextureD3D_Cube::initializeStorage(bool renderTarget)
+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)
@@ -1933,25 +1936,22 @@ gl::Error TextureD3D_Cube::initializeStorage(bool renderTarget)
bool createRenderTarget = (renderTarget || IsRenderTargetUsage(mState.getUsage()));
- TextureStorage *storage = nullptr;
+ TexStoragePointer storage(context);
ANGLE_TRY(createCompleteStorage(createRenderTarget, &storage));
- gl::Error error = setCompleteTexStorage(storage);
- if (error.isError())
- {
- SafeDelete(storage);
- return error;
- }
+ ANGLE_TRY(setCompleteTexStorage(context, storage.get()));
+ storage.release();
ASSERT(mTexStorage);
// flush image data to the storage
- ANGLE_TRY(updateStorage());
+ ANGLE_TRY(updateStorage(context));
return gl::NoError();
}
-gl::Error TextureD3D_Cube::createCompleteStorage(bool renderTarget, TextureStorage **outTexStorage) const
+gl::Error TextureD3D_Cube::createCompleteStorage(bool renderTarget,
+ TexStoragePointer *outStorage) const
{
GLsizei size = getLevelZeroWidth();
@@ -1976,12 +1976,14 @@ gl::Error TextureD3D_Cube::createCompleteStorage(bool renderTarget, TextureStora
}
// TODO (geofflang): detect if storage creation succeeded
- *outTexStorage = mRenderer->createTextureStorageCube(getBaseLevelInternalFormat(), renderTarget, size, levels, hintLevelZeroOnly);
+ outStorage->reset(mRenderer->createTextureStorageCube(
+ getBaseLevelInternalFormat(), renderTarget, size, levels, hintLevelZeroOnly));
return gl::NoError();
}
-gl::Error TextureD3D_Cube::setCompleteTexStorage(TextureStorage *newCompleteTexStorage)
+gl::Error TextureD3D_Cube::setCompleteTexStorage(const gl::Context *context,
+ TextureStorage *newCompleteTexStorage)
{
if (newCompleteTexStorage && newCompleteTexStorage->isManaged())
{
@@ -1990,19 +1992,19 @@ gl::Error TextureD3D_Cube::setCompleteTexStorage(TextureStorage *newCompleteTexS
for (int level = 0; level < newCompleteTexStorage->getLevelCount(); level++)
{
ANGLE_TRY(mImageArray[faceIndex][level]->setManagedSurfaceCube(
- newCompleteTexStorage, faceIndex, level));
+ context, newCompleteTexStorage, faceIndex, level));
}
}
}
- SafeDelete(mTexStorage);
+ ANGLE_TRY(releaseTexStorage(context));
mTexStorage = newCompleteTexStorage;
mDirtyImages = true;
return gl::NoError();
}
-gl::Error TextureD3D_Cube::updateStorage()
+gl::Error TextureD3D_Cube::updateStorage(const gl::Context *context)
{
ASSERT(mTexStorage != nullptr);
GLint storageLevels = mTexStorage->getLevelCount();
@@ -2012,7 +2014,7 @@ gl::Error TextureD3D_Cube::updateStorage()
{
if (mImageArray[face][level]->isDirty() && isFaceLevelComplete(face, level))
{
- ANGLE_TRY(updateStorageFaceLevel(face, level));
+ ANGLE_TRY(updateStorageFaceLevel(context, face, level));
}
}
}
@@ -2031,7 +2033,7 @@ bool TextureD3D_Cube::isFaceLevelComplete(int faceIndex, int level) const
{
return false;
}
- ASSERT(level >= 0 && faceIndex < 6 && level < (int)ArraySize(mImageArray[faceIndex]) &&
+ ASSERT(level >= 0 && faceIndex < 6 && level < static_cast<int>(mImageArray[faceIndex].size()) &&
mImageArray[faceIndex][level] != nullptr);
if (isImmutable())
@@ -2055,7 +2057,7 @@ bool TextureD3D_Cube::isFaceLevelComplete(int faceIndex, int level) const
}
// Check that non-zero levels are consistent with the base level.
- const ImageD3D *faceLevelImage = mImageArray[faceIndex][level];
+ const ImageD3D *faceLevelImage = mImageArray[faceIndex][level].get();
if (faceLevelImage->getInternalFormat() != getBaseLevelInternalFormat())
{
@@ -2075,45 +2077,55 @@ bool TextureD3D_Cube::isImageComplete(const gl::ImageIndex &index) const
return isFaceLevelComplete(index.layerIndex, index.mipIndex);
}
-gl::Error TextureD3D_Cube::updateStorageFaceLevel(int faceIndex, int level)
+gl::Error TextureD3D_Cube::updateStorageFaceLevel(const gl::Context *context,
+ int faceIndex,
+ int level)
{
- ASSERT(level >= 0 && faceIndex < 6 && level < (int)ArraySize(mImageArray[faceIndex]) &&
+ ASSERT(level >= 0 && faceIndex < 6 && level < static_cast<int>(mImageArray[faceIndex].size()) &&
mImageArray[faceIndex][level] != nullptr);
- ImageD3D *image = mImageArray[faceIndex][level];
+ 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(index, region));
+ ANGLE_TRY(commitRegion(context, index, region));
}
return gl::NoError();
}
-void TextureD3D_Cube::redefineImage(int faceIndex, GLint level, GLenum internalformat, const gl::Extents &size)
+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, false);
+ 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 ||
+ if ((level >= storageLevels && storageLevels != 0) || size.width != storageWidth ||
size.height != storageHeight ||
- internalformat != storageFormat) // Discard mismatched storage
+ internalformat != storageFormat) // Discard mismatched storage
{
markAllImagesDirty();
- SafeDelete(mTexStorage);
+ ANGLE_TRY(releaseTexStorage(context));
}
}
+
+ return gl::NoError();
}
gl::ImageIndexIterator TextureD3D_Cube::imageIterator() const
@@ -2150,28 +2162,31 @@ TextureD3D_3D::TextureD3D_3D(const gl::TextureState &state, RendererD3D *rendere
{
for (int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; ++i)
{
- mImageArray[i] = renderer->createImage();
+ mImageArray[i].reset(renderer->createImage());
}
}
-TextureD3D_3D::~TextureD3D_3D()
+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 (int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; ++i)
+ // 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)
{
- delete mImageArray[i];
+ image.reset();
}
+ return TextureD3D::onDestroy(context);
+}
- SafeDelete(mTexStorage);
+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];
+ return mImageArray[level].get();
}
ImageD3D *TextureD3D_3D::getImage(const gl::ImageIndex &index) const
@@ -2179,7 +2194,7 @@ 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];
+ return mImageArray[index.mipIndex].get();
}
GLsizei TextureD3D_3D::getLayerCount(int level) const
@@ -2225,13 +2240,15 @@ bool TextureD3D_3D::isDepth(GLint level) const
return gl::GetSizedInternalFormatInfo(getInternalFormat(level)).depthBits > 0;
}
-gl::Error TextureD3D_3D::setEGLImageTarget(GLenum target, egl::Image *image)
+gl::Error TextureD3D_3D::setEGLImageTarget(const gl::Context *context,
+ GLenum target,
+ egl::Image *image)
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureD3D_3D::setImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_3D::setImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
GLenum internalFormat,
@@ -2245,7 +2262,8 @@ gl::Error TextureD3D_3D::setImage(ContextImpl *contextImpl,
const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat, type);
GLint level = static_cast<GLint>(imageLevel);
- redefineImage(level, internalFormatInfo.sizedInternalFormat, size);
+ ANGLE_TRY(redefineImage(context, level, internalFormatInfo.sizedInternalFormat, size,
+ shouldForceReleaseImagesOnSetImage(pixels)));
bool fastUnpacked = false;
@@ -2257,12 +2275,12 @@ gl::Error TextureD3D_3D::setImage(ContextImpl *contextImpl,
{
// Will try to create RT storage if it does not exist
RenderTargetD3D *destRenderTarget = nullptr;
- ANGLE_TRY(getRenderTarget(index, &destRenderTarget));
+ ANGLE_TRY(getRenderTarget(context, index, &destRenderTarget));
gl::Box destArea(0, 0, 0, getWidth(level), getHeight(level), getDepth(level));
- ANGLE_TRY(fastUnpackPixels(unpack, pixels, destArea, internalFormatInfo.sizedInternalFormat,
- type, destRenderTarget));
+ ANGLE_TRY(fastUnpackPixels(context, unpack, pixels, destArea,
+ internalFormatInfo.sizedInternalFormat, type, destRenderTarget));
// Ensure we don't overwrite our newly initialized data
mImageArray[level]->markClean();
@@ -2272,13 +2290,13 @@ gl::Error TextureD3D_3D::setImage(ContextImpl *contextImpl,
if (!fastUnpacked)
{
- ANGLE_TRY(setImageImpl(index, type, unpack, pixels, 0));
+ ANGLE_TRY(setImageImpl(context, index, type, unpack, pixels, 0));
}
return gl::NoError();
}
-gl::Error TextureD3D_3D::setSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_3D::setSubImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
const gl::Box &area,
@@ -2296,18 +2314,19 @@ gl::Error TextureD3D_3D::setSubImage(ContextImpl *contextImpl,
if (isFastUnpackable(unpack, getInternalFormat(level)) && isLevelComplete(level))
{
RenderTargetD3D *destRenderTarget = nullptr;
- ANGLE_TRY(getRenderTarget(index, &destRenderTarget));
+ ANGLE_TRY(getRenderTarget(context, index, &destRenderTarget));
ASSERT(!mImageArray[level]->isDirty());
- return fastUnpackPixels(unpack, pixels, area, getInternalFormat(level), type, destRenderTarget);
+ return fastUnpackPixels(context, unpack, pixels, area, getInternalFormat(level), type,
+ destRenderTarget);
}
else
{
- return TextureD3D::subImage(index, area, format, type, unpack, pixels, 0);
+ return TextureD3D::subImage(context, index, area, format, type, unpack, pixels, 0);
}
}
-gl::Error TextureD3D_3D::setCompressedImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_3D::setCompressedImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
GLenum internalFormat,
@@ -2320,13 +2339,14 @@ gl::Error TextureD3D_3D::setCompressedImage(ContextImpl *contextImpl,
GLint level = static_cast<GLint>(imageLevel);
// compressed formats don't have separate sized internal formats-- we can just use the compressed format directly
- redefineImage(level, internalFormat, size);
+ ANGLE_TRY(redefineImage(context, level, internalFormat, size,
+ shouldForceReleaseImagesOnSetImage(pixels)));
gl::ImageIndex index = gl::ImageIndex::Make3D(level);
- return setCompressedImageImpl(index, unpack, pixels, 0);
+ return setCompressedImageImpl(context, index, unpack, pixels, 0);
}
-gl::Error TextureD3D_3D::setCompressedSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_3D::setCompressedSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -2338,11 +2358,11 @@ gl::Error TextureD3D_3D::setCompressedSubImage(ContextImpl *contextImpl,
ASSERT(target == GL_TEXTURE_3D);
gl::ImageIndex index = gl::ImageIndex::Make3D(static_cast<GLint>(level));
- ANGLE_TRY(TextureD3D::subImageCompressed(index, area, format, unpack, pixels, 0));
- return commitRegion(index, area);
+ ANGLE_TRY(TextureD3D::subImageCompressed(context, index, area, format, unpack, pixels, 0));
+ return commitRegion(context, index, area);
}
-gl::Error TextureD3D_3D::copyImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_3D::copyImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Rectangle &sourceArea,
@@ -2350,10 +2370,10 @@ gl::Error TextureD3D_3D::copyImage(ContextImpl *contextImpl,
const gl::Framebuffer *source)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION, "Copying 3D textures is unimplemented.");
+ return gl::InternalError() << "Copying 3D textures is unimplemented.";
}
-gl::Error TextureD3D_3D::copySubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_3D::copySubImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
const gl::Offset &destOffset,
@@ -2362,35 +2382,41 @@ gl::Error TextureD3D_3D::copySubImage(ContextImpl *contextImpl,
{
ASSERT(target == GL_TEXTURE_3D);
- GLint level = static_cast<GLint>(imageLevel);
+ 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, 3D single-layer blits are broken because we don't know how to make an SRV
- // for a single layer of a 3D texture.
- // TODO(jmadill): Investigate 3D blits in D3D11.
- // gl::ImageIndex index = gl::ImageIndex::Make3D(level);
+ // 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.
- // if (!canCreateRenderTargetForImage(index))
+ bool syncTexStorage = mTexStorage && isLevelComplete(level);
+ if (syncTexStorage)
{
- ANGLE_TRY(mImageArray[level]->copyFromFramebuffer(destOffset, sourceArea, source));
- mDirtyImages = true;
+ gl::ImageIndex index = gl::ImageIndex::Make3D(level);
+ mImageArray[level]->copyFromTexStorage(context, index, mTexStorage);
+ }
+ ANGLE_TRY(mImageArray[level]->copyFromFramebuffer(context, clippedDestOffset, clippedSourceArea,
+ source));
+ if (syncTexStorage)
+ {
+ updateStorageLevel(context, level);
}
- // else
- //{
- // ANGLE_TRY(ensureRenderTarget());
- // if (isValidLevel(level))
- // {
- // ANGLE_TRY(updateStorageLevel(level));
- // ANGLE_TRY(mRenderer->copyImage3D(
- // source, sourceArea,
- // gl::GetInternalFormatInfo(getBaseLevelInternalFormat()).format,
- // destOffset, mTexStorage, level));
- // }
- //}
return gl::NoError();
}
-gl::Error TextureD3D_3D::setStorage(ContextImpl *contextImpl,
+gl::Error TextureD3D_3D::setStorage(const gl::Context *context,
GLenum target,
size_t levels,
GLenum internalFormat,
@@ -2413,35 +2439,34 @@ gl::Error TextureD3D_3D::setStorage(ContextImpl *contextImpl,
// TODO(geofflang): Verify storage creation had no errors
bool renderTarget = IsRenderTargetUsage(mState.getUsage());
- TextureStorage *storage =
- mRenderer->createTextureStorage3D(internalFormat, renderTarget, size.width, size.height,
- size.depth, static_cast<int>(levels));
+ TexStoragePointer storage(context);
+ storage.reset(mRenderer->createTextureStorage3D(internalFormat, renderTarget, size.width,
+ size.height, size.depth,
+ static_cast<int>(levels)));
- gl::Error error = setCompleteTexStorage(storage);
- if (error.isError())
- {
- SafeDelete(storage);
- return error;
- }
+ ANGLE_TRY(setCompleteTexStorage(context, storage.get()));
+ storage.release();
- ANGLE_TRY(updateStorage());
+ ANGLE_TRY(updateStorage(context));
mImmutable = true;
return gl::NoError();
}
-void TextureD3D_3D::bindTexImage(egl::Surface *surface)
+gl::Error TextureD3D_3D::bindTexImage(const gl::Context *context, egl::Surface *surface)
{
UNREACHABLE();
+ return gl::InternalError();
}
-void TextureD3D_3D::releaseTexImage()
+gl::Error TextureD3D_3D::releaseTexImage(const gl::Context *context)
{
UNREACHABLE();
+ return gl::InternalError();
}
-void TextureD3D_3D::initMipmapImages()
+gl::Error TextureD3D_3D::initMipmapImages(const gl::Context *context)
{
const GLuint baseLevel = mState.getEffectiveBaseLevel();
const GLuint maxLevel = mState.getMipmapMaxLevel();
@@ -2452,28 +2477,32 @@ void TextureD3D_3D::initMipmapImages()
gl::Extents levelSize(std::max(getLevelZeroWidth() >> level, 1),
std::max(getLevelZeroHeight() >> level, 1),
std::max(getLevelZeroDepth() >> level, 1));
- redefineImage(level, getBaseLevelInternalFormat(), levelSize);
+ ANGLE_TRY(redefineImage(context, level, getBaseLevelInternalFormat(), levelSize, false));
}
+
+ return gl::NoError();
}
-gl::Error TextureD3D_3D::getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT)
+gl::Error TextureD3D_3D::getRenderTarget(const gl::Context *context,
+ const gl::ImageIndex &index,
+ RenderTargetD3D **outRT)
{
// ensure the underlying texture is created
- ANGLE_TRY(ensureRenderTarget());
+ ANGLE_TRY(ensureRenderTarget(context));
if (index.hasLayer())
{
- ANGLE_TRY(updateStorage());
+ ANGLE_TRY(updateStorage(context));
}
else
{
- ANGLE_TRY(updateStorageLevel(index.mipIndex));
+ ANGLE_TRY(updateStorageLevel(context, index.mipIndex));
}
- return mTexStorage->getRenderTarget(index, outRT);
+ return mTexStorage->getRenderTarget(context, index, outRT);
}
-gl::Error TextureD3D_3D::initializeStorage(bool renderTarget)
+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)
@@ -2489,25 +2518,22 @@ gl::Error TextureD3D_3D::initializeStorage(bool renderTarget)
bool createRenderTarget = (renderTarget || IsRenderTargetUsage(mState.getUsage()));
- TextureStorage *storage = nullptr;
+ TexStoragePointer storage(context);
ANGLE_TRY(createCompleteStorage(createRenderTarget, &storage));
- gl::Error error = setCompleteTexStorage(storage);
- if (error.isError())
- {
- SafeDelete(storage);
- return error;
- }
+ ANGLE_TRY(setCompleteTexStorage(context, storage.get()));
+ storage.release();
ASSERT(mTexStorage);
// flush image data to the storage
- ANGLE_TRY(updateStorage());
+ ANGLE_TRY(updateStorage(context));
return gl::NoError();
}
-gl::Error TextureD3D_3D::createCompleteStorage(bool renderTarget, TextureStorage **outStorage) const
+gl::Error TextureD3D_3D::createCompleteStorage(bool renderTarget,
+ TexStoragePointer *outStorage) const
{
GLsizei width = getLevelZeroWidth();
GLsizei height = getLevelZeroHeight();
@@ -2520,14 +2546,16 @@ gl::Error TextureD3D_3D::createCompleteStorage(bool renderTarget, TextureStorage
GLint levels = (mTexStorage ? mTexStorage->getLevelCount() : creationLevels(width, height, depth));
// TODO: Verify creation of the storage succeeded
- *outStorage = mRenderer->createTextureStorage3D(internalFormat, renderTarget, width, height, depth, levels);
+ outStorage->reset(mRenderer->createTextureStorage3D(internalFormat, renderTarget, width, height,
+ depth, levels));
return gl::NoError();
}
-gl::Error TextureD3D_3D::setCompleteTexStorage(TextureStorage *newCompleteTexStorage)
+gl::Error TextureD3D_3D::setCompleteTexStorage(const gl::Context *context,
+ TextureStorage *newCompleteTexStorage)
{
- SafeDelete(mTexStorage);
+ ANGLE_TRY(releaseTexStorage(context));
mTexStorage = newCompleteTexStorage;
mDirtyImages = true;
@@ -2537,7 +2565,7 @@ gl::Error TextureD3D_3D::setCompleteTexStorage(TextureStorage *newCompleteTexSto
return gl::NoError();
}
-gl::Error TextureD3D_3D::updateStorage()
+gl::Error TextureD3D_3D::updateStorage(const gl::Context *context)
{
ASSERT(mTexStorage != nullptr);
GLint storageLevels = mTexStorage->getLevelCount();
@@ -2545,7 +2573,7 @@ gl::Error TextureD3D_3D::updateStorage()
{
if (mImageArray[level]->isDirty() && isLevelComplete(level))
{
- ANGLE_TRY(updateStorageLevel(level));
+ ANGLE_TRY(updateStorageLevel(context, level));
}
}
@@ -2559,7 +2587,8 @@ bool TextureD3D_3D::isValidLevel(int level) const
bool TextureD3D_3D::isLevelComplete(int level) const
{
- ASSERT(level >= 0 && level < (int)ArraySize(mImageArray) && mImageArray[level] != nullptr);
+ ASSERT(level >= 0 && level < static_cast<int>(mImageArray.size()) &&
+ mImageArray[level] != nullptr);
if (isImmutable())
{
@@ -2580,7 +2609,7 @@ bool TextureD3D_3D::isLevelComplete(int level) const
return true;
}
- ImageD3D *levelImage = mImageArray[level];
+ ImageD3D *levelImage = mImageArray[level].get();
if (levelImage->getInternalFormat() != getBaseLevelInternalFormat())
{
@@ -2610,22 +2639,27 @@ bool TextureD3D_3D::isImageComplete(const gl::ImageIndex &index) const
return isLevelComplete(index.mipIndex);
}
-gl::Error TextureD3D_3D::updateStorageLevel(int level)
+gl::Error TextureD3D_3D::updateStorageLevel(const gl::Context *context, int level)
{
- ASSERT(level >= 0 && level < (int)ArraySize(mImageArray) && mImageArray[level] != nullptr);
+ 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(index, region));
+ ANGLE_TRY(commitRegion(context, index, region));
}
return gl::NoError();
}
-void TextureD3D_3D::redefineImage(GLint level, GLenum internalformat, const gl::Extents &size)
+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);
@@ -2633,22 +2667,23 @@ void TextureD3D_3D::redefineImage(GLint level, GLenum internalformat, const gl::
const int storageDepth = std::max(1, getLevelZeroDepth() >> level);
const GLenum storageFormat = getBaseLevelInternalFormat();
- mImageArray[level]->redefine(GL_TEXTURE_3D, internalformat, size, false);
+ 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
+ if ((level >= storageLevels && storageLevels != 0) || size.width != storageWidth ||
+ size.height != storageHeight || size.depth != storageDepth ||
+ internalformat != storageFormat) // Discard mismatched storage
{
markAllImagesDirty();
- SafeDelete(mTexStorage);
+ ANGLE_TRY(releaseTexStorage(context));
}
}
+
+ return gl::NoError();
}
gl::ImageIndexIterator TextureD3D_3D::imageIterator() const
@@ -2694,13 +2729,17 @@ TextureD3D_2DArray::TextureD3D_2DArray(const gl::TextureState &state, RendererD3
}
}
-TextureD3D_2DArray::~TextureD3D_2DArray()
+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.
+ // 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();
- SafeDelete(mTexStorage);
+ return TextureD3D::onDestroy(context);
+}
+
+TextureD3D_2DArray::~TextureD3D_2DArray()
+{
}
ImageD3D *TextureD3D_2DArray::getImage(int level, int layer) const
@@ -2746,13 +2785,15 @@ bool TextureD3D_2DArray::isDepth(GLint level) const
return gl::GetSizedInternalFormatInfo(getInternalFormat(level)).depthBits > 0;
}
-gl::Error TextureD3D_2DArray::setEGLImageTarget(GLenum target, egl::Image *image)
+gl::Error TextureD3D_2DArray::setEGLImageTarget(const gl::Context *context,
+ GLenum target,
+ egl::Image *image)
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureD3D_2DArray::setImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DArray::setImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
GLenum internalFormat,
@@ -2767,7 +2808,8 @@ gl::Error TextureD3D_2DArray::setImage(ContextImpl *contextImpl,
const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalFormat, type);
GLint level = static_cast<GLint>(imageLevel);
- redefineImage(level, formatInfo.sizedInternalFormat, size);
+ ANGLE_TRY(redefineImage(context, level, formatInfo.sizedInternalFormat, size,
+ shouldForceReleaseImagesOnSetImage(pixels)));
GLsizei inputDepthPitch = 0;
ANGLE_TRY_RESULT(formatInfo.computeDepthPitch(type, size.width, size.height, unpack.alignment,
@@ -2778,13 +2820,13 @@ gl::Error TextureD3D_2DArray::setImage(ContextImpl *contextImpl,
{
const ptrdiff_t layerOffset = (inputDepthPitch * i);
gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, i);
- ANGLE_TRY(setImageImpl(index, type, unpack, pixels, layerOffset));
+ ANGLE_TRY(setImageImpl(context, index, type, unpack, pixels, layerOffset));
}
return gl::NoError();
}
-gl::Error TextureD3D_2DArray::setSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DArray::setSubImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
const gl::Box &area,
@@ -2810,14 +2852,14 @@ gl::Error TextureD3D_2DArray::setSubImage(ContextImpl *contextImpl,
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(index, layerArea, format, type, unpack, pixels, layerOffset));
+ ANGLE_TRY(TextureD3D::subImage(context, index, layerArea, format, type, unpack, pixels,
+ layerOffset));
}
return gl::NoError();
}
-gl::Error TextureD3D_2DArray::setCompressedImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DArray::setCompressedImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
GLenum internalFormat,
@@ -2830,7 +2872,8 @@ gl::Error TextureD3D_2DArray::setCompressedImage(ContextImpl *contextImpl,
GLint level = static_cast<GLint>(imageLevel);
// compressed formats don't have separate sized internal formats-- we can just use the compressed format directly
- redefineImage(level, internalFormat, size);
+ ANGLE_TRY(redefineImage(context, level, internalFormat, size,
+ shouldForceReleaseImagesOnSetImage(pixels)));
const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(internalFormat);
GLsizei inputDepthPitch = 0;
@@ -2843,13 +2886,13 @@ gl::Error TextureD3D_2DArray::setCompressedImage(ContextImpl *contextImpl,
const ptrdiff_t layerOffset = (inputDepthPitch * i);
gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, i);
- ANGLE_TRY(setCompressedImageImpl(index, unpack, pixels, layerOffset));
+ ANGLE_TRY(setCompressedImageImpl(context, index, unpack, pixels, layerOffset));
}
return gl::NoError();
}
-gl::Error TextureD3D_2DArray::setCompressedSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DArray::setCompressedSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -2874,15 +2917,15 @@ gl::Error TextureD3D_2DArray::setCompressedSubImage(ContextImpl *contextImpl,
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(index, layerArea, format, unpack, pixels, layerOffset));
- ANGLE_TRY(commitRegion(index, layerArea));
+ 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(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DArray::copyImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Rectangle &sourceArea,
@@ -2890,10 +2933,10 @@ gl::Error TextureD3D_2DArray::copyImage(ContextImpl *contextImpl,
const gl::Framebuffer *source)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION, "Copying 2D array textures is unimplemented.");
+ return gl::InternalError() << "Copying 2D array textures is unimplemented.";
}
-gl::Error TextureD3D_2DArray::copySubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DArray::copySubImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
const gl::Offset &destOffset,
@@ -2905,29 +2948,41 @@ gl::Error TextureD3D_2DArray::copySubImage(ContextImpl *contextImpl,
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(destOffset.x, destOffset.y, 0);
- ANGLE_TRY(mImageArray[level][destOffset.z]->copyFromFramebuffer(destLayerOffset, sourceArea,
- source));
+ 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());
+ ANGLE_TRY(ensureRenderTarget(context));
if (isValidLevel(level))
{
- ANGLE_TRY(updateStorageLevel(level));
- ANGLE_TRY(mRenderer->copyImage2DArray(
- source, sourceArea, gl::GetUnsizedFormat(getInternalFormat(getBaseLevel())),
- destOffset, mTexStorage, 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(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DArray::setStorage(const gl::Context *context,
GLenum target,
size_t levels,
GLenum internalFormat,
@@ -2960,35 +3015,34 @@ gl::Error TextureD3D_2DArray::setStorage(ContextImpl *contextImpl,
// TODO(geofflang): Verify storage creation had no errors
bool renderTarget = IsRenderTargetUsage(mState.getUsage());
- TextureStorage *storage =
- mRenderer->createTextureStorage2DArray(internalFormat, renderTarget, size.width,
- size.height, size.depth, static_cast<int>(levels));
+ TexStoragePointer storage(context);
+ storage.reset(mRenderer->createTextureStorage2DArray(internalFormat, renderTarget, size.width,
+ size.height, size.depth,
+ static_cast<int>(levels)));
- gl::Error error = setCompleteTexStorage(storage);
- if (error.isError())
- {
- SafeDelete(storage);
- return error;
- }
+ ANGLE_TRY(setCompleteTexStorage(context, storage.get()));
+ storage.release();
- ANGLE_TRY(updateStorage());
+ ANGLE_TRY(updateStorage(context));
mImmutable = true;
return gl::NoError();
}
-void TextureD3D_2DArray::bindTexImage(egl::Surface *surface)
+gl::Error TextureD3D_2DArray::bindTexImage(const gl::Context *context, egl::Surface *surface)
{
UNREACHABLE();
+ return gl::InternalError();
}
-void TextureD3D_2DArray::releaseTexImage()
+gl::Error TextureD3D_2DArray::releaseTexImage(const gl::Context *context)
{
UNREACHABLE();
+ return gl::InternalError();
}
-void TextureD3D_2DArray::initMipmapImages()
+gl::Error TextureD3D_2DArray::initMipmapImages(const gl::Context *context)
{
const GLuint baseLevel = mState.getEffectiveBaseLevel();
const GLuint maxLevel = mState.getMipmapMaxLevel();
@@ -3005,19 +3059,23 @@ void TextureD3D_2DArray::initMipmapImages()
gl::Extents levelLayerSize(std::max(baseWidth >> level, 1),
std::max(baseHeight >> level, 1),
baseDepth);
- redefineImage(level, baseFormat, levelLayerSize);
+ ANGLE_TRY(redefineImage(context, level, baseFormat, levelLayerSize, false));
}
+
+ return gl::NoError();
}
-gl::Error TextureD3D_2DArray::getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT)
+gl::Error TextureD3D_2DArray::getRenderTarget(const gl::Context *context,
+ const gl::ImageIndex &index,
+ RenderTargetD3D **outRT)
{
// ensure the underlying texture is created
- ANGLE_TRY(ensureRenderTarget());
- ANGLE_TRY(updateStorageLevel(index.mipIndex));
- return mTexStorage->getRenderTarget(index, outRT);
+ ANGLE_TRY(ensureRenderTarget(context));
+ ANGLE_TRY(updateStorageLevel(context, index.mipIndex));
+ return mTexStorage->getRenderTarget(context, index, outRT);
}
-gl::Error TextureD3D_2DArray::initializeStorage(bool renderTarget)
+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)
@@ -3033,25 +3091,22 @@ gl::Error TextureD3D_2DArray::initializeStorage(bool renderTarget)
bool createRenderTarget = (renderTarget || IsRenderTargetUsage(mState.getUsage()));
- TextureStorage *storage = nullptr;
+ TexStoragePointer storage(context);
ANGLE_TRY(createCompleteStorage(createRenderTarget, &storage));
- gl::Error error = setCompleteTexStorage(storage);
- if (error.isError())
- {
- SafeDelete(storage);
- return error;
- }
+ ANGLE_TRY(setCompleteTexStorage(context, storage.get()));
+ storage.release();
ASSERT(mTexStorage);
// flush image data to the storage
- ANGLE_TRY(updateStorage());
+ ANGLE_TRY(updateStorage(context));
return gl::NoError();
}
-gl::Error TextureD3D_2DArray::createCompleteStorage(bool renderTarget, TextureStorage **outStorage) const
+gl::Error TextureD3D_2DArray::createCompleteStorage(bool renderTarget,
+ TexStoragePointer *outStorage) const
{
GLsizei width = getLevelZeroWidth();
GLsizei height = getLevelZeroHeight();
@@ -3064,14 +3119,16 @@ gl::Error TextureD3D_2DArray::createCompleteStorage(bool renderTarget, TextureSt
GLint levels = (mTexStorage ? mTexStorage->getLevelCount() : creationLevels(width, height, 1));
// TODO(geofflang): Verify storage creation succeeds
- *outStorage = mRenderer->createTextureStorage2DArray(internalFormat, renderTarget, width, height, depth, levels);
+ outStorage->reset(mRenderer->createTextureStorage2DArray(internalFormat, renderTarget, width,
+ height, depth, levels));
return gl::NoError();
}
-gl::Error TextureD3D_2DArray::setCompleteTexStorage(TextureStorage *newCompleteTexStorage)
+gl::Error TextureD3D_2DArray::setCompleteTexStorage(const gl::Context *context,
+ TextureStorage *newCompleteTexStorage)
{
- SafeDelete(mTexStorage);
+ ANGLE_TRY(releaseTexStorage(context));
mTexStorage = newCompleteTexStorage;
mDirtyImages = true;
@@ -3081,7 +3138,7 @@ gl::Error TextureD3D_2DArray::setCompleteTexStorage(TextureStorage *newCompleteT
return gl::NoError();
}
-gl::Error TextureD3D_2DArray::updateStorage()
+gl::Error TextureD3D_2DArray::updateStorage(const gl::Context *context)
{
ASSERT(mTexStorage != nullptr);
GLint storageLevels = mTexStorage->getLevelCount();
@@ -3089,7 +3146,7 @@ gl::Error TextureD3D_2DArray::updateStorage()
{
if (isLevelComplete(level))
{
- ANGLE_TRY(updateStorageLevel(level));
+ ANGLE_TRY(updateStorageLevel(context, level));
}
}
@@ -3160,9 +3217,9 @@ bool TextureD3D_2DArray::isImageComplete(const gl::ImageIndex &index) const
return isLevelComplete(index.mipIndex);
}
-gl::Error TextureD3D_2DArray::updateStorageLevel(int level)
+gl::Error TextureD3D_2DArray::updateStorageLevel(const gl::Context *context, int level)
{
- ASSERT(level >= 0 && level < (int)ArraySize(mLayerCounts));
+ ASSERT(level >= 0 && level < static_cast<int>(ArraySize(mLayerCounts)));
ASSERT(isLevelComplete(level));
for (int layer = 0; layer < mLayerCounts[level]; layer++)
@@ -3172,7 +3229,7 @@ gl::Error TextureD3D_2DArray::updateStorageLevel(int level)
{
gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, layer);
gl::Box region(0, 0, 0, getWidth(level), getHeight(level), 1);
- ANGLE_TRY(commitRegion(index, region));
+ ANGLE_TRY(commitRegion(context, index, region));
}
}
@@ -3193,7 +3250,11 @@ void TextureD3D_2DArray::deleteImages()
}
}
-void TextureD3D_2DArray::redefineImage(GLint level, GLenum internalformat, const gl::Extents &size)
+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);
@@ -3230,7 +3291,9 @@ void TextureD3D_2DArray::redefineImage(GLint level, GLenum internalformat, const
for (int layer = 0; layer < mLayerCounts[level]; layer++)
{
mImageArray[level][layer]->redefine(GL_TEXTURE_2D_ARRAY, internalformat,
- gl::Extents(size.width, size.height, 1), false);
+ gl::Extents(size.width, size.height, 1),
+ forceRelease);
+ mDirtyImages = mDirtyImages || mImageArray[level][layer]->isDirty();
}
}
@@ -3239,16 +3302,16 @@ void TextureD3D_2DArray::redefineImage(GLint level, GLenum internalformat, const
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
+ if ((level >= storageLevels && storageLevels != 0) || size.width != storageWidth ||
+ size.height != storageHeight || size.depth != storageDepth ||
+ internalformat != storageFormat) // Discard mismatched storage
{
markAllImagesDirty();
- SafeDelete(mTexStorage);
+ ANGLE_TRY(releaseTexStorage(context));
}
}
+
+ return gl::NoError();
}
gl::ImageIndexIterator TextureD3D_2DArray::imageIterator() const
@@ -3298,7 +3361,6 @@ TextureD3D_External::TextureD3D_External(const gl::TextureState &state, Renderer
TextureD3D_External::~TextureD3D_External()
{
- SafeDelete(mTexStorage);
}
ImageD3D *TextureD3D_External::getImage(const gl::ImageIndex &index) const
@@ -3312,7 +3374,7 @@ GLsizei TextureD3D_External::getLayerCount(int level) const
return 1;
}
-gl::Error TextureD3D_External::setImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_External::setImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
GLenum internalFormat,
@@ -3324,10 +3386,10 @@ gl::Error TextureD3D_External::setImage(ContextImpl *contextImpl,
{
// Image setting is not supported for external images
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureD3D_External::setSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_External::setSubImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
const gl::Box &area,
@@ -3337,10 +3399,10 @@ gl::Error TextureD3D_External::setSubImage(ContextImpl *contextImpl,
const uint8_t *pixels)
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureD3D_External::setCompressedImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_External::setCompressedImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
GLenum internalFormat,
@@ -3350,10 +3412,10 @@ gl::Error TextureD3D_External::setCompressedImage(ContextImpl *contextImpl,
const uint8_t *pixels)
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureD3D_External::setCompressedSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_External::setCompressedSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -3363,10 +3425,10 @@ gl::Error TextureD3D_External::setCompressedSubImage(ContextImpl *contextImpl,
const uint8_t *pixels)
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureD3D_External::copyImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_External::copyImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
const gl::Rectangle &sourceArea,
@@ -3374,10 +3436,10 @@ gl::Error TextureD3D_External::copyImage(ContextImpl *contextImpl,
const gl::Framebuffer *source)
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureD3D_External::copySubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_External::copySubImage(const gl::Context *context,
GLenum target,
size_t imageLevel,
const gl::Offset &destOffset,
@@ -3385,26 +3447,27 @@ gl::Error TextureD3D_External::copySubImage(ContextImpl *contextImpl,
const gl::Framebuffer *source)
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureD3D_External::setStorage(ContextImpl *contextImpl,
+gl::Error TextureD3D_External::setStorage(const gl::Context *context,
GLenum target,
size_t levels,
GLenum internalFormat,
const gl::Extents &size)
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureD3D_External::setImageExternal(GLenum target,
+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);
- SafeDelete(mTexStorage);
+ ANGLE_TRY(releaseTexStorage(context));
// If the stream is null, the external image is unbound and we release the storage
if (stream != nullptr)
@@ -3415,39 +3478,46 @@ gl::Error TextureD3D_External::setImageExternal(GLenum target,
return gl::NoError();
}
-void TextureD3D_External::bindTexImage(egl::Surface *surface)
+gl::Error TextureD3D_External::bindTexImage(const gl::Context *context, egl::Surface *surface)
{
UNREACHABLE();
+ return gl::InternalError();
}
-void TextureD3D_External::releaseTexImage()
+gl::Error TextureD3D_External::releaseTexImage(const gl::Context *context)
{
UNREACHABLE();
+ return gl::InternalError();
}
-gl::Error TextureD3D_External::setEGLImageTarget(GLenum target, egl::Image *image)
+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(&renderTargetD3D));
+ ANGLE_TRY(eglImaged3d->getRenderTarget(context, &renderTargetD3D));
- SafeDelete(mTexStorage);
+ ANGLE_TRY(releaseTexStorage(context));
mTexStorage = mRenderer->createTextureStorageEGLImage(eglImaged3d, renderTargetD3D);
return gl::NoError();
}
-void TextureD3D_External::initMipmapImages()
+gl::Error TextureD3D_External::initMipmapImages(const gl::Context *context)
{
UNREACHABLE();
+ return gl::InternalError();
}
-gl::Error TextureD3D_External::getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT)
+gl::Error TextureD3D_External::getRenderTarget(const gl::Context *context,
+ const gl::ImageIndex &index,
+ RenderTargetD3D **outRT)
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
bool TextureD3D_External::isImageComplete(const gl::ImageIndex &index) const
@@ -3455,7 +3525,7 @@ bool TextureD3D_External::isImageComplete(const gl::ImageIndex &index) const
return (index.mipIndex == 0) ? (mTexStorage != nullptr) : false;
}
-gl::Error TextureD3D_External::initializeStorage(bool renderTarget)
+gl::Error TextureD3D_External::initializeStorage(const gl::Context *context, bool renderTarget)
{
// Texture storage is created when an external image is bound
ASSERT(mTexStorage);
@@ -3463,19 +3533,20 @@ gl::Error TextureD3D_External::initializeStorage(bool renderTarget)
}
gl::Error TextureD3D_External::createCompleteStorage(bool renderTarget,
- TextureStorage **outTexStorage) const
+ TexStoragePointer *outStorage) const
{
UNREACHABLE();
return gl::NoError();
}
-gl::Error TextureD3D_External::setCompleteTexStorage(TextureStorage *newCompleteTexStorage)
+gl::Error TextureD3D_External::setCompleteTexStorage(const gl::Context *context,
+ TextureStorage *newCompleteTexStorage)
{
UNREACHABLE();
return gl::NoError();
}
-gl::Error TextureD3D_External::updateStorage()
+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
@@ -3503,4 +3574,233 @@ 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,
+ GLboolean 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
+{
+ UNIMPLEMENTED();
+ return GLsizei();
+}
+
+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/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.h
index dbe43a449f0..e72c670c343 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.h
@@ -9,10 +9,12 @@
#ifndef LIBANGLE_RENDERER_D3D_TEXTURED3D_H_
#define LIBANGLE_RENDERER_D3D_TEXTURED3D_H_
-#include "libANGLE/renderer/TextureImpl.h"
-#include "libANGLE/angletypes.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
{
@@ -27,13 +29,18 @@ 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);
virtual ~TextureD3D();
- gl::Error getNativeTexture(TextureStorage **outStorage);
+ 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; }
@@ -41,11 +48,21 @@ class TextureD3D : public TextureImpl
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) const;
+
GLint getBaseLevelWidth() const;
GLint getBaseLevelHeight() const;
GLenum getBaseLevelInternalFormat() const;
- gl::Error setStorageMultisample(ContextImpl *contextImpl,
+ gl::Error setStorage(const gl::Context *context,
+ GLenum target,
+ size_t levels,
+ GLenum internalFormat,
+ const gl::Extents &size);
+
+ gl::Error setStorageMultisample(const gl::Context *context,
GLenum target,
GLsizei samples,
GLint internalFormat,
@@ -54,7 +71,9 @@ class TextureD3D : public TextureImpl
bool isImmutable() const { return mImmutable; }
- virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT) = 0;
+ 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;
@@ -64,54 +83,84 @@ class TextureD3D : public TextureImpl
virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const = 0;
virtual bool isValidIndex(const gl::ImageIndex &index) const = 0;
- virtual gl::Error setImageExternal(GLenum target,
- egl::Stream *stream,
- const egl::Stream::GLTextureDescription &desc) override;
- gl::Error generateMipmap(ContextImpl *contextImpl) override;
+ 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(GLenum binding,
+ gl::Error getAttachmentRenderTarget(const gl::Context *context,
+ GLenum binding,
const gl::ImageIndex &imageIndex,
FramebufferAttachmentRenderTarget **rtOut) override;
- void setBaseLevel(GLuint baseLevel) override;
+ gl::Error setBaseLevel(const gl::Context *context, GLuint baseLevel) override;
void syncState(const gl::Texture::DirtyBits &dirtyBits) override;
+ gl::Error clearLevel(const gl::Context *context,
+ const gl::ImageIndex &index,
+ const gl::ColorF &clearValues);
+
protected:
- gl::Error setImageImpl(const gl::ImageIndex &index,
+ 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::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::ImageIndex &index,
+ 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::ImageIndex &index, const gl::Box &area, GLenum format,
- 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::PixelUnpackState &unpack, GLenum sizedInternalFormat);
- gl::Error fastUnpackPixels(const gl::PixelUnpackState &unpack, const uint8_t *pixels, const gl::Box &destArea,
- GLenum sizedInternalFormat, GLenum type, RenderTargetD3D *destRenderTarget);
+ 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 void initMipmapImages() = 0;
+ 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;
- virtual gl::Error ensureRenderTarget();
+ 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);
- virtual gl::Error createCompleteStorage(bool renderTarget, TextureStorage **outTexStorage) const = 0;
- virtual gl::Error setCompleteTexStorage(TextureStorage *newCompleteTexStorage) = 0;
- gl::Error commitRegion(const gl::ImageIndex &index, const gl::Box &region);
+ gl::Error releaseTexStorage(const gl::Context *context);
GLuint getBaseLevel() const { return mBaseLevel; };
@@ -119,6 +168,8 @@ class TextureD3D : public TextureImpl
GLint getBaseLevelDepth() const;
+ bool shouldForceReleaseImagesOnSetImage(const uint8_t *pixels) const;
+
RendererD3D *mRenderer;
bool mDirtyImages;
@@ -127,13 +178,13 @@ class TextureD3D : public TextureImpl
TextureStorage *mTexStorage;
private:
- virtual gl::Error initializeStorage(bool renderTarget) = 0;
+ virtual gl::Error initializeStorage(const gl::Context *context, bool renderTarget) = 0;
- virtual gl::Error updateStorage() = 0;
+ virtual gl::Error updateStorage(const gl::Context *context) = 0;
bool shouldUseSetData(const ImageD3D *image) const;
- gl::Error generateMipmapUsingImages(const GLuint maxLevel);
+ gl::Error generateMipmapUsingImages(const gl::Context *context, const GLuint maxLevel);
GLuint mBaseLevel;
};
@@ -144,16 +195,19 @@ class TextureD3D_2D : public TextureD3D
TextureD3D_2D(const gl::TextureState &data, RendererD3D *renderer);
virtual ~TextureD3D_2D();
- virtual ImageD3D *getImage(int level, int layer) const;
- virtual ImageD3D *getImage(const gl::ImageIndex &index) const;
- virtual GLsizei getLayerCount(int level) const;
+ 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(ContextImpl *contextImpl,
+ gl::Error setImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -162,7 +216,7 @@ class TextureD3D_2D : public TextureD3D
GLenum type,
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) override;
- gl::Error setSubImage(ContextImpl *contextImpl,
+ gl::Error setSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -171,7 +225,7 @@ class TextureD3D_2D : public TextureD3D
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) override;
- gl::Error setCompressedImage(ContextImpl *contextImpl,
+ gl::Error setCompressedImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -179,7 +233,7 @@ class TextureD3D_2D : public TextureD3D
const gl::PixelUnpackState &unpack,
size_t imageSize,
const uint8_t *pixels) override;
- gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+ gl::Error setCompressedSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -188,20 +242,20 @@ class TextureD3D_2D : public TextureD3D
size_t imageSize,
const uint8_t *pixels) override;
- gl::Error copyImage(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl,
+ gl::Error copyTexture(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -211,7 +265,7 @@ class TextureD3D_2D : public TextureD3D
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha,
const gl::Texture *source) override;
- gl::Error copySubTexture(ContextImpl *contextImpl,
+ gl::Error copySubTexture(const gl::Context *context,
GLenum target,
size_t level,
const gl::Offset &destOffset,
@@ -221,56 +275,56 @@ class TextureD3D_2D : public TextureD3D
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha,
const gl::Texture *source) override;
- gl::Error copyCompressedTexture(ContextImpl *contextImpl, const gl::Texture *source) override;
+ gl::Error copyCompressedTexture(const gl::Context *context, const gl::Texture *source) override;
- gl::Error setStorage(ContextImpl *contextImpl,
+ gl::Error setStorage(const gl::Context *context,
GLenum target,
size_t levels,
GLenum internalFormat,
const gl::Extents &size) override;
- virtual void bindTexImage(egl::Surface *surface);
- virtual void releaseTexImage();
+ gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
+ gl::Error releaseTexImage(const gl::Context *context) override;
- gl::Error setEGLImageTarget(GLenum target, egl::Image *image) override;
+ gl::Error setEGLImageTarget(const gl::Context *context,
+ GLenum target,
+ egl::Image *image) override;
- virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT);
+ gl::Error getRenderTarget(const gl::Context *context,
+ const gl::ImageIndex &index,
+ RenderTargetD3D **outRT) override;
- virtual gl::ImageIndexIterator imageIterator() const;
- virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const;
- virtual bool isValidIndex(const gl::ImageIndex &index) const;
-
- gl::Error setStorageMultisample(ContextImpl *contextImpl,
- GLenum target,
- GLsizei samples,
- GLint internalFormat,
- const gl::Extents &size,
- GLboolean fixedSampleLocations) 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:
- virtual gl::Error initializeStorage(bool renderTarget);
- virtual gl::Error createCompleteStorage(bool renderTarget, TextureStorage **outTexStorage) const;
- virtual gl::Error setCompleteTexStorage(TextureStorage *newCompleteTexStorage);
+ 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;
- virtual gl::Error updateStorage();
- virtual void initMipmapImages();
+ 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;
virtual bool isImageComplete(const gl::ImageIndex &index) const;
- gl::Error updateStorageLevel(int level);
+ gl::Error updateStorageLevel(const gl::Context *context, int level);
- void redefineImage(size_t level,
- GLenum internalformat,
- const gl::Extents &size,
- bool forceRelease);
+ gl::Error redefineImage(const gl::Context *context,
+ size_t level,
+ GLenum internalformat,
+ const gl::Extents &size,
+ bool forceRelease);
bool mEGLImageTarget;
- ImageD3D *mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
+ TexLevelsArray<std::unique_ptr<ImageD3D>> mImageArray;
};
class TextureD3D_Cube : public TextureD3D
@@ -279,17 +333,17 @@ class TextureD3D_Cube : public TextureD3D
TextureD3D_Cube(const gl::TextureState &data, RendererD3D *renderer);
virtual ~TextureD3D_Cube();
- virtual ImageD3D *getImage(int level, int layer) const;
- virtual ImageD3D *getImage(const gl::ImageIndex &index) const;
- virtual GLsizei getLayerCount(int level) const;
+ gl::Error onDestroy(const gl::Context *context) override;
- virtual bool hasDirtyImages() const { return mDirtyImages; }
- virtual void resetDirty() { mDirtyImages = false; }
+ 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(ContextImpl *contextImpl,
+ gl::Error setImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -298,7 +352,7 @@ class TextureD3D_Cube : public TextureD3D
GLenum type,
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) override;
- gl::Error setSubImage(ContextImpl *contextImpl,
+ gl::Error setSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -307,7 +361,7 @@ class TextureD3D_Cube : public TextureD3D
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) override;
- gl::Error setCompressedImage(ContextImpl *contextImpl,
+ gl::Error setCompressedImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -315,7 +369,7 @@ class TextureD3D_Cube : public TextureD3D
const gl::PixelUnpackState &unpack,
size_t imageSize,
const uint8_t *pixels) override;
- gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+ gl::Error setCompressedSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -324,20 +378,20 @@ class TextureD3D_Cube : public TextureD3D
size_t imageSize,
const uint8_t *pixels) override;
- gl::Error copyImage(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl,
+ gl::Error copyTexture(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -347,7 +401,7 @@ class TextureD3D_Cube : public TextureD3D
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha,
const gl::Texture *source) override;
- gl::Error copySubTexture(ContextImpl *contextImpl,
+ gl::Error copySubTexture(const gl::Context *context,
GLenum target,
size_t level,
const gl::Offset &destOffset,
@@ -358,43 +412,54 @@ class TextureD3D_Cube : public TextureD3D
bool unpackUnmultiplyAlpha,
const gl::Texture *source) override;
- gl::Error setStorage(ContextImpl *contextImpl,
+ gl::Error setStorage(const gl::Context *context,
GLenum target,
size_t levels,
GLenum internalFormat,
const gl::Extents &size) override;
- virtual void bindTexImage(egl::Surface *surface);
- virtual void releaseTexImage();
+ gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
+ gl::Error releaseTexImage(const gl::Context *context) override;
- gl::Error setEGLImageTarget(GLenum target, egl::Image *image) override;
+ gl::Error setEGLImageTarget(const gl::Context *context,
+ GLenum target,
+ egl::Image *image) override;
- virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT);
+ gl::Error getRenderTarget(const gl::Context *context,
+ const gl::ImageIndex &index,
+ RenderTargetD3D **outRT) override;
- virtual gl::ImageIndexIterator imageIterator() const;
- virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const;
- virtual bool isValidIndex(const gl::ImageIndex &index) const;
+ 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:
- virtual gl::Error initializeStorage(bool renderTarget);
- virtual gl::Error createCompleteStorage(bool renderTarget, TextureStorage **outTexStorage) const;
- virtual gl::Error setCompleteTexStorage(TextureStorage *newCompleteTexStorage);
+ 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;
- virtual gl::Error updateStorage();
- void initMipmapImages() 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;
virtual bool isImageComplete(const gl::ImageIndex &index) const;
- gl::Error updateStorageFaceLevel(int faceIndex, int level);
+ gl::Error updateStorageFaceLevel(const gl::Context *context, int faceIndex, int level);
- void redefineImage(int faceIndex, GLint level, GLenum internalformat, const gl::Extents &size);
+ gl::Error redefineImage(const gl::Context *context,
+ int faceIndex,
+ GLint level,
+ GLenum internalformat,
+ const gl::Extents &size,
+ bool forceRelease);
- ImageD3D *mImageArray[6][gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
+ std::array<TexLevelsArray<std::unique_ptr<ImageD3D>>, 6> mImageArray;
};
class TextureD3D_3D : public TextureD3D
@@ -403,9 +468,11 @@ class TextureD3D_3D : public TextureD3D
TextureD3D_3D(const gl::TextureState &data, RendererD3D *renderer);
virtual ~TextureD3D_3D();
- virtual ImageD3D *getImage(int level, int layer) const;
- virtual ImageD3D *getImage(const gl::ImageIndex &index) const;
- virtual GLsizei getLayerCount(int level) const;
+ 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;
@@ -413,7 +480,7 @@ class TextureD3D_3D : public TextureD3D
GLenum getInternalFormat(GLint level) const;
bool isDepth(GLint level) const;
- gl::Error setImage(ContextImpl *contextImpl,
+ gl::Error setImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -422,7 +489,7 @@ class TextureD3D_3D : public TextureD3D
GLenum type,
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) override;
- gl::Error setSubImage(ContextImpl *contextImpl,
+ gl::Error setSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -431,7 +498,7 @@ class TextureD3D_3D : public TextureD3D
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) override;
- gl::Error setCompressedImage(ContextImpl *contextImpl,
+ gl::Error setCompressedImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -439,7 +506,7 @@ class TextureD3D_3D : public TextureD3D
const gl::PixelUnpackState &unpack,
size_t imageSize,
const uint8_t *pixels) override;
- gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+ gl::Error setCompressedSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -448,56 +515,66 @@ class TextureD3D_3D : public TextureD3D
size_t imageSize,
const uint8_t *pixels) override;
- gl::Error copyImage(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl,
+ gl::Error setStorage(const gl::Context *context,
GLenum target,
size_t levels,
GLenum internalFormat,
const gl::Extents &size) override;
- virtual void bindTexImage(egl::Surface *surface);
- virtual void releaseTexImage();
+ gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
+ gl::Error releaseTexImage(const gl::Context *context) override;
- gl::Error setEGLImageTarget(GLenum target, egl::Image *image) override;
+ gl::Error setEGLImageTarget(const gl::Context *context,
+ GLenum target,
+ egl::Image *image) override;
- virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT);
+ gl::Error getRenderTarget(const gl::Context *context,
+ const gl::ImageIndex &index,
+ RenderTargetD3D **outRT) override;
- virtual gl::ImageIndexIterator imageIterator() const;
- virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const;
- virtual bool isValidIndex(const gl::ImageIndex &index) const;
+ 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:
- virtual gl::Error initializeStorage(bool renderTarget);
- virtual gl::Error createCompleteStorage(bool renderTarget, TextureStorage **outStorage) const;
- virtual gl::Error setCompleteTexStorage(TextureStorage *newCompleteTexStorage);
+ 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;
- virtual gl::Error updateStorage();
- void initMipmapImages() 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;
virtual bool isImageComplete(const gl::ImageIndex &index) const;
- gl::Error updateStorageLevel(int level);
+ gl::Error updateStorageLevel(const gl::Context *context, int level);
- void redefineImage(GLint level, GLenum internalformat, const gl::Extents &size);
+ gl::Error redefineImage(const gl::Context *context,
+ GLint level,
+ GLenum internalformat,
+ const gl::Extents &size,
+ bool forceRelease);
- ImageD3D *mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
+ TexLevelsArray<std::unique_ptr<ImageD3D>> mImageArray;
};
class TextureD3D_2DArray : public TextureD3D
@@ -506,6 +583,8 @@ class TextureD3D_2DArray : public TextureD3D
TextureD3D_2DArray(const gl::TextureState &data, RendererD3D *renderer);
virtual ~TextureD3D_2DArray();
+ gl::Error onDestroy(const gl::Context *context) override;
+
virtual ImageD3D *getImage(int level, int layer) const;
virtual ImageD3D *getImage(const gl::ImageIndex &index) const;
virtual GLsizei getLayerCount(int level) const;
@@ -515,7 +594,7 @@ class TextureD3D_2DArray : public TextureD3D
GLenum getInternalFormat(GLint level) const;
bool isDepth(GLint level) const;
- gl::Error setImage(ContextImpl *contextImpl,
+ gl::Error setImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -524,7 +603,7 @@ class TextureD3D_2DArray : public TextureD3D
GLenum type,
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) override;
- gl::Error setSubImage(ContextImpl *contextImpl,
+ gl::Error setSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -533,7 +612,7 @@ class TextureD3D_2DArray : public TextureD3D
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) override;
- gl::Error setCompressedImage(ContextImpl *contextImpl,
+ gl::Error setCompressedImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -541,7 +620,7 @@ class TextureD3D_2DArray : public TextureD3D
const gl::PixelUnpackState &unpack,
size_t imageSize,
const uint8_t *pixels) override;
- gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+ gl::Error setCompressedSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -550,54 +629,64 @@ class TextureD3D_2DArray : public TextureD3D
size_t imageSize,
const uint8_t *pixels) override;
- gl::Error copyImage(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl,
+ gl::Error setStorage(const gl::Context *context,
GLenum target,
size_t levels,
GLenum internalFormat,
const gl::Extents &size) override;
- virtual void bindTexImage(egl::Surface *surface);
- virtual void releaseTexImage();
+ gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
+ gl::Error releaseTexImage(const gl::Context *context) override;
- gl::Error setEGLImageTarget(GLenum target, egl::Image *image) override;
+ gl::Error setEGLImageTarget(const gl::Context *context,
+ GLenum target,
+ egl::Image *image) override;
- virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT);
+ gl::Error getRenderTarget(const gl::Context *context,
+ const gl::ImageIndex &index,
+ RenderTargetD3D **outRT) override;
- virtual gl::ImageIndexIterator imageIterator() const;
- virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const;
- virtual bool isValidIndex(const gl::ImageIndex &index) const;
+ 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:
- virtual gl::Error initializeStorage(bool renderTarget);
- virtual gl::Error createCompleteStorage(bool renderTarget, TextureStorage **outStorage) const;
- virtual gl::Error setCompleteTexStorage(TextureStorage *newCompleteTexStorage);
+ 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;
- virtual gl::Error updateStorage();
- void initMipmapImages() 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;
virtual bool isImageComplete(const gl::ImageIndex &index) const;
- gl::Error updateStorageLevel(int level);
+ gl::Error updateStorageLevel(const gl::Context *context, int level);
void deleteImages();
- void redefineImage(GLint level, GLenum internalformat, const gl::Extents &size);
+ 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
@@ -616,7 +705,7 @@ class TextureD3D_External : public TextureD3D
ImageD3D *getImage(const gl::ImageIndex &index) const override;
GLsizei getLayerCount(int level) const override;
- gl::Error setImage(ContextImpl *contextImpl,
+ gl::Error setImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -625,7 +714,7 @@ class TextureD3D_External : public TextureD3D
GLenum type,
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) override;
- gl::Error setSubImage(ContextImpl *contextImpl,
+ gl::Error setSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -634,7 +723,7 @@ class TextureD3D_External : public TextureD3D
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) override;
- gl::Error setCompressedImage(ContextImpl *contextImpl,
+ gl::Error setCompressedImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -642,7 +731,7 @@ class TextureD3D_External : public TextureD3D
const gl::PixelUnpackState &unpack,
size_t imageSize,
const uint8_t *pixels) override;
- gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+ gl::Error setCompressedSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -651,35 +740,40 @@ class TextureD3D_External : public TextureD3D
size_t imageSize,
const uint8_t *pixels) override;
- gl::Error copyImage(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl,
+ gl::Error setStorage(const gl::Context *context,
GLenum target,
size_t levels,
GLenum internalFormat,
const gl::Extents &size) override;
- gl::Error setImageExternal(GLenum target,
+ gl::Error setImageExternal(const gl::Context *context,
+ GLenum target,
egl::Stream *stream,
const egl::Stream::GLTextureDescription &desc) override;
- void bindTexImage(egl::Surface *surface) override;
- void releaseTexImage() override;
+ gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
+ gl::Error releaseTexImage(const gl::Context *context) override;
- gl::Error setEGLImageTarget(GLenum target, egl::Image *image) override;
+ gl::Error setEGLImageTarget(const gl::Context *context,
+ GLenum target,
+ egl::Image *image) override;
- gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT) 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;
@@ -689,13 +783,14 @@ class TextureD3D_External : public TextureD3D
void markAllImagesDirty() override;
private:
- gl::Error initializeStorage(bool renderTarget) override;
+ gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override;
gl::Error createCompleteStorage(bool renderTarget,
- TextureStorage **outTexStorage) const override;
- gl::Error setCompleteTexStorage(TextureStorage *newCompleteTexStorage) override;
+ TexStoragePointer *outTexStorage) const override;
+ gl::Error setCompleteTexStorage(const gl::Context *context,
+ TextureStorage *newCompleteTexStorage) override;
- gl::Error updateStorage() override;
- void initMipmapImages() 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;
};
@@ -707,7 +802,7 @@ class TextureD3D_2DMultisample : public TextureD3D
~TextureD3D_2DMultisample() override;
ImageD3D *getImage(const gl::ImageIndex &index) const override;
- gl::Error setImage(ContextImpl *contextImpl,
+ gl::Error setImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -716,7 +811,7 @@ class TextureD3D_2DMultisample : public TextureD3D
GLenum type,
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) override;
- gl::Error setSubImage(ContextImpl *contextImpl,
+ gl::Error setSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -725,7 +820,7 @@ class TextureD3D_2DMultisample : public TextureD3D
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) override;
- gl::Error setCompressedImage(ContextImpl *contextImpl,
+ gl::Error setCompressedImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -733,7 +828,7 @@ class TextureD3D_2DMultisample : public TextureD3D
const gl::PixelUnpackState &unpack,
size_t imageSize,
const uint8_t *pixels) override;
- gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+ gl::Error setCompressedSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -742,35 +837,36 @@ class TextureD3D_2DMultisample : public TextureD3D
size_t imageSize,
const uint8_t *pixels) override;
- gl::Error copyImage(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl,
- GLenum target,
- size_t levels,
- GLenum internalFormat,
- const gl::Extents &size) override;
-
- gl::Error setImageExternal(GLenum target,
- egl::Stream *stream,
- const egl::Stream::GLTextureDescription &desc) override;
+ gl::Error setStorageMultisample(const gl::Context *context,
+ GLenum target,
+ GLsizei samples,
+ GLint internalFormat,
+ const gl::Extents &size,
+ GLboolean fixedSampleLocations) override;
- void bindTexImage(egl::Surface *surface) override;
- void releaseTexImage() override;
+ gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
+ gl::Error releaseTexImage(const gl::Context *context) override;
- gl::Error setEGLImageTarget(GLenum target, egl::Image *image) override;
+ gl::Error setEGLImageTarget(const gl::Context *context,
+ GLenum target,
+ egl::Image *image) override;
- gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT) 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;
@@ -782,13 +878,14 @@ class TextureD3D_2DMultisample : public TextureD3D
void markAllImagesDirty() override;
private:
- gl::Error initializeStorage(bool renderTarget) override;
+ gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override;
gl::Error createCompleteStorage(bool renderTarget,
- TextureStorage **outTexStorage) const override;
- gl::Error setCompleteTexStorage(TextureStorage *newCompleteTexStorage) override;
+ TexStoragePointer *outTexStorage) const override;
+ gl::Error setCompleteTexStorage(const gl::Context *context,
+ TextureStorage *newCompleteTexStorage) override;
- gl::Error updateStorage() override;
- void initMipmapImages() 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;
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureStorage.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureStorage.h
index c29e20f0d3c..239ac54a3be 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureStorage.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureStorage.h
@@ -19,10 +19,11 @@
namespace gl
{
+class Context;
struct ImageIndex;
struct Box;
struct PixelUnpackState;
-}
+} // namespace gl
namespace rx
{
@@ -34,7 +35,12 @@ class TextureStorage : angle::NonCopyable
{
public:
TextureStorage() {}
- virtual ~TextureStorage() {}
+
+ virtual gl::Error onDestroy(const gl::Context *context)
+ {
+ delete this;
+ return gl::NoError();
+ }
virtual int getTopLevel() const = 0;
virtual bool isRenderTarget() const = 0;
@@ -42,20 +48,34 @@ class TextureStorage : angle::NonCopyable
virtual bool supportsNativeMipmapFunction() const = 0;
virtual int getLevelCount() const = 0;
- virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT) = 0;
- virtual gl::Error generateMipmap(const gl::ImageIndex &sourceIndex, const gl::ImageIndex &destIndex) = 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(TextureStorage *destStorage) = 0;
- virtual gl::Error setData(const gl::ImageIndex &index, ImageD3D *image, const gl::Box *destBox, GLenum type,
- const gl::PixelUnpackState &unpack, const uint8_t *pixelData) = 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(bool useLevelZeroTexture)
{
return gl::NoError();
}
+
+ protected:
+ virtual ~TextureStorage() {}
};
-}
+using TexStoragePointer = angle::UniqueObjectPointer<TextureStorage, gl::Context>;
+
+} // namespace rx
#endif // LIBANGLE_RENDERER_D3D_TEXTURESTORAGE_H_
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp
index 30d65be0113..0503ca37808 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp
@@ -104,8 +104,8 @@ gl::ErrorOrResult<unsigned int> VertexBufferInterface::getSpaceRequired(
if (alignedSpaceRequired < spaceRequired)
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Vertex buffer overflow in VertexBufferInterface::getSpaceRequired.");
+ return gl::OutOfMemory()
+ << "Vertex buffer overflow in VertexBufferInterface::getSpaceRequired.";
}
return alignedSpaceRequired;
@@ -167,7 +167,8 @@ gl::Error StreamingVertexBufferInterface::storeDynamicAttribute(const gl::Vertex
checkedPosition += spaceRequired;
if (!checkedPosition.IsValid())
{
- return gl::Error(GL_OUT_OF_MEMORY, "Internal error, new vertex buffer write position would overflow.");
+ return gl::OutOfMemory()
+ << "Internal error, new vertex buffer write position would overflow.";
}
ANGLE_TRY(reserveSpace(mReservedSpace));
@@ -202,10 +203,9 @@ gl::Error StreamingVertexBufferInterface::reserveVertexSpace(const gl::VertexAtt
// Protect against integer overflow
if (!alignedRequiredSpace.IsValid())
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Unable to reserve %u extra bytes in internal vertex buffer, "
- "it would result in an overflow.",
- requiredSpace);
+ return gl::OutOfMemory()
+ << "Unable to reserve " << requiredSpace
+ << " extra bytes in internal vertex buffer, it would result in an overflow.";
}
mReservedSpace = alignedRequiredSpace.ValueOrDie();
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexBuffer.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexBuffer.h
index bb749c1bf83..36297d9d5d5 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexBuffer.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexBuffer.h
@@ -22,7 +22,7 @@
namespace gl
{
struct VertexAttribute;
-struct VertexBinding;
+class VertexBinding;
struct VertexAttribCurrentValueData;
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexDataManager.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexDataManager.cpp
index ed59c0e3fbc..46592e5478a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexDataManager.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexDataManager.cpp
@@ -63,7 +63,7 @@ bool DirectStoragePossible(const gl::VertexAttribute &attrib, const gl::VertexBi
return false;
}
- gl::Buffer *buffer = binding.buffer.get();
+ gl::Buffer *buffer = binding.getBuffer().get();
if (!buffer)
{
return false;
@@ -149,7 +149,7 @@ VertexStorageType ClassifyAttributeStorage(const gl::VertexAttribute &attrib,
}
// If specified with immediate data, we must use dynamic storage.
- auto *buffer = binding.buffer.get();
+ auto *buffer = binding.getBuffer().get();
if (!buffer)
{
return VertexStorageType::DYNAMIC;
@@ -248,7 +248,7 @@ gl::Error VertexDataManager::prepareVertexData(const gl::State &state,
translated->attribute = &attrib;
translated->binding = &binding;
translated->currentValueType = currentValueData.Type;
- translated->divisor = binding.divisor;
+ translated->divisor = binding.getDivisor();
switch (ClassifyAttributeStorage(attrib, binding))
{
@@ -297,7 +297,7 @@ void VertexDataManager::StoreDirectAttrib(TranslatedAttribute *directAttrib)
const auto &attrib = *directAttrib->attribute;
const auto &binding = *directAttrib->binding;
- gl::Buffer *buffer = binding.buffer.get();
+ gl::Buffer *buffer = binding.getBuffer().get();
BufferD3D *bufferD3D = buffer ? GetImplAs<BufferD3D>(buffer) : nullptr;
ASSERT(DirectStoragePossible(attrib, binding));
@@ -309,7 +309,7 @@ void VertexDataManager::StoreDirectAttrib(TranslatedAttribute *directAttrib)
static_cast<unsigned int>(ComputeVertexAttributeOffset(attrib, binding));
// Instanced vertices do not apply the 'start' offset
- directAttrib->usesFirstVertexOffset = (binding.divisor == 0);
+ directAttrib->usesFirstVertexOffset = (binding.getDivisor() == 0);
}
// static
@@ -319,7 +319,7 @@ gl::Error VertexDataManager::StoreStaticAttrib(TranslatedAttribute *translated)
const auto &attrib = *translated->attribute;
const auto &binding = *translated->binding;
- gl::Buffer *buffer = binding.buffer.get();
+ gl::Buffer *buffer = binding.getBuffer().get();
ASSERT(buffer && attrib.enabled && !DirectStoragePossible(attrib, binding));
BufferD3D *bufferD3D = GetImplAs<BufferD3D>(buffer);
@@ -362,8 +362,7 @@ gl::Error VertexDataManager::StoreStaticAttrib(TranslatedAttribute *translated)
if (!checkedOffset.IsValid())
{
- return gl::Error(GL_INVALID_OPERATION,
- "Integer overflow in VertexDataManager::StoreStaticAttrib");
+ return gl::InternalError() << "Integer overflow in VertexDataManager::StoreStaticAttrib";
}
translated->vertexBuffer.set(vertexBuffer);
@@ -371,7 +370,7 @@ gl::Error VertexDataManager::StoreStaticAttrib(TranslatedAttribute *translated)
translated->baseOffset = streamOffset + firstElementOffset;
// Instanced vertices do not apply the 'start' offset
- translated->usesFirstVertexOffset = (binding.divisor == 0);
+ translated->usesFirstVertexOffset = (binding.getDivisor() == 0);
return gl::NoError();
}
@@ -429,7 +428,7 @@ void VertexDataManager::PromoteDynamicAttribs(
ASSERT(dynamicAttrib.attribute && dynamicAttrib.binding);
const auto &binding = *dynamicAttrib.binding;
- gl::Buffer *buffer = binding.buffer.get();
+ gl::Buffer *buffer = binding.getBuffer().get();
if (buffer)
{
BufferD3D *bufferD3D = GetImplAs<BufferD3D>(buffer);
@@ -449,7 +448,7 @@ gl::Error VertexDataManager::reserveSpaceForAttrib(const TranslatedAttribute &tr
ASSERT(!DirectStoragePossible(attrib, binding));
- gl::Buffer *buffer = binding.buffer.get();
+ gl::Buffer *buffer = binding.getBuffer().get();
BufferD3D *bufferD3D = buffer ? GetImplAs<BufferD3D>(buffer) : nullptr;
ASSERT(!bufferD3D || bufferD3D->getStaticVertexBuffer(attrib, binding) == nullptr);
@@ -471,14 +470,14 @@ gl::Error VertexDataManager::storeDynamicAttrib(TranslatedAttribute *translated,
const auto &attrib = *translated->attribute;
const auto &binding = *translated->binding;
- gl::Buffer *buffer = binding.buffer.get();
+ 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.divisor > 0 ? 0 : start);
+ GLint firstVertexIndex = (binding.getDivisor() > 0 ? 0 : start);
// Compute source data pointer
const uint8_t *sourceData = nullptr;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexDataManager.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexDataManager.h
index c9cb5dfb449..e411c6c921b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexDataManager.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexDataManager.h
@@ -19,7 +19,7 @@ namespace gl
{
class State;
struct VertexAttribute;
-struct VertexBinding;
+class VertexBinding;
struct VertexAttribCurrentValueData;
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp
index a9ee18e6694..66efc58b7e1 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp
@@ -43,8 +43,12 @@ namespace
#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"
@@ -556,12 +560,12 @@ DXGI_FORMAT GetStencilSRVFormat(const d3d11::Format &formatSet)
Blit11::Blit11(Renderer11 *renderer)
: mRenderer(renderer),
mResourcesInitialized(false),
- mVertexBuffer(nullptr),
- mPointSampler(nullptr),
- mLinearSampler(nullptr),
- mScissorEnabledRasterizerState(nullptr),
- mScissorDisabledRasterizerState(nullptr),
- mDepthStencilState(nullptr),
+ mVertexBuffer(),
+ mPointSampler(),
+ mLinearSampler(),
+ mScissorEnabledRasterizerState(),
+ mScissorDisabledRasterizerState(),
+ mDepthStencilState(),
mQuad2DIL(quad2DLayout,
ArraySize(quad2DLayout),
g_VS_Passthrough2D,
@@ -579,7 +583,7 @@ Blit11::Blit11(Renderer11 *renderer)
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(nullptr),
+ mSwizzleCB(),
mResolveDepthStencilVS(g_VS_ResolveDepthStencil,
ArraySize(g_VS_ResolveDepthStencil),
"Blit11::mResolveDepthStencilVS"),
@@ -597,16 +601,6 @@ Blit11::Blit11(Renderer11 *renderer)
Blit11::~Blit11()
{
- mQuad2DIL.release();
- mQuad2DVS.release();
- mDepthPS.release();
-
- mQuad3DIL.release();
- mQuad3DVS.release();
- mQuad3DGS.release();
-
- clearShaderMap();
- releaseResolveDepthStencilResources();
}
gl::Error Blit11::initResources()
@@ -618,9 +612,6 @@ gl::Error Blit11::initResources()
TRACE_EVENT0("gpu.angle", "Blit11::initResources");
- HRESULT result;
- ID3D11Device *device = mRenderer->getDevice();
-
D3D11_BUFFER_DESC vbDesc;
vbDesc.ByteWidth =
static_cast<unsigned int>(std::max(sizeof(d3d11::PositionLayerTexCoord3DVertex),
@@ -632,13 +623,8 @@ gl::Error Blit11::initResources()
vbDesc.MiscFlags = 0;
vbDesc.StructureByteStride = 0;
- result = device->CreateBuffer(&vbDesc, nullptr, mVertexBuffer.GetAddressOf());
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to create blit vertex buffer, " << result;
- }
- d3d11::SetDebugName(mVertexBuffer, "Blit11 vertex buffer");
+ ANGLE_TRY(mRenderer->allocateResource(vbDesc, &mVertexBuffer));
+ mVertexBuffer.setDebugName("Blit11 vertex buffer");
D3D11_SAMPLER_DESC pointSamplerDesc;
pointSamplerDesc.Filter = D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR;
@@ -655,13 +641,8 @@ gl::Error Blit11::initResources()
pointSamplerDesc.MinLOD = 0.0f;
pointSamplerDesc.MaxLOD = FLT_MAX;
- result = device->CreateSamplerState(&pointSamplerDesc, mPointSampler.GetAddressOf());
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to create blit point sampler state, " << result;
- }
- d3d11::SetDebugName(mPointSampler, "Blit11 point sampler");
+ ANGLE_TRY(mRenderer->allocateResource(pointSamplerDesc, &mPointSampler));
+ mPointSampler.setDebugName("Blit11 point sampler");
D3D11_SAMPLER_DESC linearSamplerDesc;
linearSamplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
@@ -678,13 +659,8 @@ gl::Error Blit11::initResources()
linearSamplerDesc.MinLOD = 0.0f;
linearSamplerDesc.MaxLOD = FLT_MAX;
- result = device->CreateSamplerState(&linearSamplerDesc, mLinearSampler.GetAddressOf());
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to create blit linear sampler state, " << result;
- }
- d3d11::SetDebugName(mLinearSampler, "Blit11 linear sampler");
+ 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;
@@ -699,25 +675,12 @@ gl::Error Blit11::initResources()
rasterDesc.AntialiasedLineEnable = FALSE;
rasterDesc.ScissorEnable = TRUE;
- result =
- device->CreateRasterizerState(&rasterDesc, mScissorEnabledRasterizerState.GetAddressOf());
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to create blit scissoring rasterizer state, " << result;
- }
- d3d11::SetDebugName(mScissorEnabledRasterizerState, "Blit11 scissoring rasterizer state");
+ ANGLE_TRY(mRenderer->allocateResource(rasterDesc, &mScissorEnabledRasterizerState));
+ mScissorEnabledRasterizerState.setDebugName("Blit11 scissoring rasterizer state");
rasterDesc.ScissorEnable = FALSE;
- result =
- device->CreateRasterizerState(&rasterDesc, mScissorDisabledRasterizerState.GetAddressOf());
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to create blit no scissoring rasterizer state, "
- << result;
- }
- d3d11::SetDebugName(mScissorDisabledRasterizerState, "Blit11 no scissoring rasterizer state");
+ ANGLE_TRY(mRenderer->allocateResource(rasterDesc, &mScissorDisabledRasterizerState));
+ mScissorDisabledRasterizerState.setDebugName("Blit11 no scissoring rasterizer state");
D3D11_DEPTH_STENCIL_DESC depthStencilDesc;
depthStencilDesc.DepthEnable = TRUE;
@@ -735,13 +698,8 @@ gl::Error Blit11::initResources()
depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
- result = device->CreateDepthStencilState(&depthStencilDesc, mDepthStencilState.GetAddressOf());
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to create blit depth stencil state, " << result;
- }
- d3d11::SetDebugName(mDepthStencilState, "Blit11 depth stencil state");
+ ANGLE_TRY(mRenderer->allocateResource(depthStencilDesc, &mDepthStencilState));
+ mDepthStencilState.setDebugName("Blit11 depth stencil state");
D3D11_BUFFER_DESC swizzleBufferDesc;
swizzleBufferDesc.ByteWidth = sizeof(unsigned int) * 4;
@@ -751,13 +709,8 @@ gl::Error Blit11::initResources()
swizzleBufferDesc.MiscFlags = 0;
swizzleBufferDesc.StructureByteStride = 0;
- result = device->CreateBuffer(&swizzleBufferDesc, nullptr, mSwizzleCB.GetAddressOf());
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to create blit swizzle buffer, " << result;
- }
- d3d11::SetDebugName(mSwizzleCB, "Blit11 swizzle constant buffer");
+ ANGLE_TRY(mRenderer->allocateResource(swizzleBufferDesc, &mSwizzleCB));
+ mSwizzleCB.setDebugName("Blit11 swizzle constant buffer");
mResourcesInitialized = true;
@@ -890,7 +843,17 @@ Blit11::BlitShaderType Blit11::GetBlitShaderType(GLenum destinationFormat,
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;
@@ -996,31 +959,34 @@ Blit11::SwizzleShaderType Blit11::GetSwizzleShaderType(GLenum type,
}
}
-Blit11::ShaderSupport Blit11::getShaderSupport(const Shader &shader)
+gl::Error Blit11::getShaderSupport(const Shader &shader, Blit11::ShaderSupport *supportOut)
{
- ID3D11Device *device = mRenderer->getDevice();
- ShaderSupport support;
-
if (shader.dimension == SHADER_2D)
{
- support.inputLayout = mQuad2DIL.resolve(device);
- support.vertexShader = mQuad2DVS.resolve(device);
- support.geometryShader = nullptr;
- support.vertexWriteFunction = Write2DVertices;
+ 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);
- support.inputLayout = mQuad3DIL.resolve(device);
- support.vertexShader = mQuad3DVS.resolve(device);
- support.geometryShader = mQuad3DGS.resolve(device);
- support.vertexWriteFunction = Write3DVertices;
+ 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 support;
+ return gl::NoError();
}
-gl::Error Blit11::swizzleTexture(const d3d11::SharedSRV &source,
+gl::Error Blit11::swizzleTexture(const gl::Context *context,
+ const d3d11::SharedSRV &source,
const d3d11::RenderTargetView &dest,
const gl::Extents &size,
const gl::SwizzleState &swizzleTarget)
@@ -1076,16 +1042,17 @@ gl::Error Blit11::swizzleTexture(const d3d11::SharedSRV &source,
// Set vertices
D3D11_MAPPED_SUBRESOURCE mappedResource;
result =
- deviceContext->Map(mVertexBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
+ 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, " << result;
+ return gl::OutOfMemory() << "Failed to map internal vertex buffer for swizzle, "
+ << gl::FmtHR(result);
}
- const ShaderSupport &support = getShaderSupport(*shader);
+ ShaderSupport support;
+ ANGLE_TRY(getShaderSupport(*shader, &support));
UINT stride = 0;
- UINT startIdx = 0;
UINT drawCount = 0;
D3D11_PRIMITIVE_TOPOLOGY topology;
@@ -1093,14 +1060,14 @@ gl::Error Blit11::swizzleTexture(const d3d11::SharedSRV &source,
support.vertexWriteFunction(area, size, area, size, mappedResource.pData, &stride, &drawCount,
&topology);
- deviceContext->Unmap(mVertexBuffer.Get(), 0);
+ deviceContext->Unmap(mVertexBuffer.get(), 0);
// Set constant buffer
- result = deviceContext->Map(mSwizzleCB.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
+ 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, "
- << result;
+ << gl::FmtHR(result);
}
unsigned int *swizzleIndices = reinterpret_cast<unsigned int *>(mappedResource.pData);
@@ -1109,33 +1076,34 @@ gl::Error Blit11::swizzleTexture(const d3d11::SharedSRV &source,
swizzleIndices[2] = GetSwizzleIndex(swizzleTarget.swizzleBlue);
swizzleIndices[3] = GetSwizzleIndex(swizzleTarget.swizzleAlpha);
- deviceContext->Unmap(mSwizzleCB.Get(), 0);
+ deviceContext->Unmap(mSwizzleCB.get(), 0);
+
+ auto stateManager = mRenderer->getStateManager();
// Apply vertex buffer
- deviceContext->IASetVertexBuffers(0, 1, mVertexBuffer.GetAddressOf(), &stride, &startIdx);
+ stateManager->setSingleVertexBuffer(&mVertexBuffer, stride, 0);
// Apply constant buffer
- deviceContext->PSSetConstantBuffers(0, 1, mSwizzleCB.GetAddressOf());
+ ID3D11Buffer *constantBuffer = mSwizzleCB.get();
+ deviceContext->PSSetConstantBuffers(0, 1, &constantBuffer);
// Apply state
deviceContext->OMSetBlendState(nullptr, nullptr, 0xFFFFFFF);
deviceContext->OMSetDepthStencilState(nullptr, 0xFFFFFFFF);
- deviceContext->RSSetState(mScissorDisabledRasterizerState.Get());
+ deviceContext->RSSetState(mScissorDisabledRasterizerState.get());
// Apply shaders
- deviceContext->IASetInputLayout(support.inputLayout);
- deviceContext->IASetPrimitiveTopology(topology);
- deviceContext->VSSetShader(support.vertexShader, nullptr, 0);
+ stateManager->setInputLayout(support.inputLayout);
+ stateManager->setPrimitiveTopology(topology);
- deviceContext->PSSetShader(shader->pixelShader, nullptr, 0);
- deviceContext->GSSetShader(support.geometryShader, nullptr, 0);
+ stateManager->setDrawShaders(support.vertexShader, support.geometryShader,
+ &shader->pixelShader);
// Unset the currently bound shader resource to avoid conflicts
- auto stateManager = mRenderer->getStateManager();
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
// Apply render target
- stateManager->setOneTimeRenderTarget(dest.get(), nullptr);
+ stateManager->setOneTimeRenderTarget(context, dest.get(), nullptr);
// Set the viewport
D3D11_VIEWPORT viewport;
@@ -1151,24 +1119,21 @@ gl::Error Blit11::swizzleTexture(const d3d11::SharedSRV &source,
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, source.get());
// Apply samplers
- deviceContext->PSSetSamplers(0, 1, mPointSampler.GetAddressOf());
+ ID3D11SamplerState *samplerState = mPointSampler.get();
+ deviceContext->PSSetSamplers(0, 1, &samplerState);
// Draw the quad
deviceContext->Draw(drawCount, 0);
- // Unbind textures and render targets and vertex buffer
+ // Unbind shader resources and dirty state.
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
-
- UINT zero = 0;
- ID3D11Buffer *const nullBuffer = nullptr;
- deviceContext->IASetVertexBuffers(0, 1, &nullBuffer, &zero, &zero);
-
- mRenderer->markAllStateDirty();
+ mRenderer->markAllStateDirty(context);
return gl::NoError();
}
-gl::Error Blit11::copyTexture(const d3d11::SharedSRV &source,
+gl::Error Blit11::copyTexture(const gl::Context *context,
+ const d3d11::SharedSRV &source,
const gl::Box &sourceArea,
const gl::Extents &sourceSize,
GLenum sourceFormat,
@@ -1205,36 +1170,38 @@ gl::Error Blit11::copyTexture(const d3d11::SharedSRV &source,
ANGLE_TRY(getBlitShader(destFormat, sourceFormat, isSigned, unpackPremultiplyAlpha,
unpackUnmultiplyAlpha, dimension, &shader));
- const ShaderSupport &support = getShaderSupport(*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);
+ 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, "
- << result;
+ << gl::FmtHR(result);
}
UINT stride = 0;
- UINT startIdx = 0;
UINT drawCount = 0;
D3D11_PRIMITIVE_TOPOLOGY topology;
support.vertexWriteFunction(sourceArea, sourceSize, destArea, destSize, mappedResource.pData,
&stride, &drawCount, &topology);
- deviceContext->Unmap(mVertexBuffer.Get(), 0);
+ deviceContext->Unmap(mVertexBuffer.get(), 0);
+
+ auto stateManager = mRenderer->getStateManager();
// Apply vertex buffer
- deviceContext->IASetVertexBuffers(0, 1, mVertexBuffer.GetAddressOf(), &stride, &startIdx);
+ stateManager->setSingleVertexBuffer(&mVertexBuffer, stride, 0);
// Apply state
if (maskOffAlpha)
{
- ID3D11BlendState *blendState = mAlphaMaskBlendState.resolve(mRenderer->getDevice());
- ASSERT(blendState);
+ ANGLE_TRY(mAlphaMaskBlendState.resolve(mRenderer));
+ ID3D11BlendState *blendState = mAlphaMaskBlendState.get();
deviceContext->OMSetBlendState(blendState, nullptr, 0xFFFFFFF);
}
else
@@ -1252,27 +1219,25 @@ gl::Error Blit11::copyTexture(const d3d11::SharedSRV &source,
scissorRect.bottom = scissor->y + scissor->height;
deviceContext->RSSetScissorRects(1, &scissorRect);
- deviceContext->RSSetState(mScissorEnabledRasterizerState.Get());
+ deviceContext->RSSetState(mScissorEnabledRasterizerState.get());
}
else
{
- deviceContext->RSSetState(mScissorDisabledRasterizerState.Get());
+ deviceContext->RSSetState(mScissorDisabledRasterizerState.get());
}
// Apply shaders
- deviceContext->IASetInputLayout(support.inputLayout);
- deviceContext->IASetPrimitiveTopology(topology);
- deviceContext->VSSetShader(support.vertexShader, nullptr, 0);
+ stateManager->setInputLayout(support.inputLayout);
+ stateManager->setPrimitiveTopology(topology);
- deviceContext->PSSetShader(shader->pixelShader, nullptr, 0);
- deviceContext->GSSetShader(support.geometryShader, nullptr, 0);
+ stateManager->setDrawShaders(support.vertexShader, support.geometryShader,
+ &shader->pixelShader);
// Unset the currently bound shader resource to avoid conflicts
- auto stateManager = mRenderer->getStateManager();
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
// Apply render target
- stateManager->setOneTimeRenderTarget(dest.get(), nullptr);
+ stateManager->setOneTimeRenderTarget(context, dest.get(), nullptr);
// Set the viewport
D3D11_VIEWPORT viewport;
@@ -1292,10 +1257,10 @@ gl::Error Blit11::copyTexture(const d3d11::SharedSRV &source,
switch (filter)
{
case GL_NEAREST:
- sampler = mPointSampler.Get();
+ sampler = mPointSampler.get();
break;
case GL_LINEAR:
- sampler = mLinearSampler.Get();
+ sampler = mLinearSampler.get();
break;
default:
@@ -1307,19 +1272,16 @@ gl::Error Blit11::copyTexture(const d3d11::SharedSRV &source,
// Draw the quad
deviceContext->Draw(drawCount, 0);
- // Unbind textures and render targets and vertex buffer
+ // Unbind shader resource and invalidate state.
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
- UINT zero = 0;
- ID3D11Buffer *const nullBuffer = nullptr;
- deviceContext->IASetVertexBuffers(0, 1, &nullBuffer, &zero, &zero);
-
- mRenderer->markAllStateDirty();
+ mRenderer->markAllStateDirty(context);
return gl::NoError();
}
-gl::Error Blit11::copyStencil(const TextureHelper11 &source,
+gl::Error Blit11::copyStencil(const gl::Context *context,
+ const TextureHelper11 &source,
unsigned int sourceSubresource,
const gl::Box &sourceArea,
const gl::Extents &sourceSize,
@@ -1333,7 +1295,8 @@ gl::Error Blit11::copyStencil(const TextureHelper11 &source,
destSubresource, destArea, destSize, scissor, true);
}
-gl::Error Blit11::copyDepth(const d3d11::SharedSRV &source,
+gl::Error Blit11::copyDepth(const gl::Context *context,
+ const d3d11::SharedSRV &source,
const gl::Box &sourceArea,
const gl::Extents &sourceSize,
const d3d11::DepthStencilView &dest,
@@ -1349,29 +1312,30 @@ gl::Error Blit11::copyDepth(const d3d11::SharedSRV &source,
// Set vertices
D3D11_MAPPED_SUBRESOURCE mappedResource;
result =
- deviceContext->Map(mVertexBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
+ 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, "
- << result;
+ << gl::FmtHR(result);
}
UINT stride = 0;
- UINT startIdx = 0;
UINT drawCount = 0;
D3D11_PRIMITIVE_TOPOLOGY topology;
Write2DVertices(sourceArea, sourceSize, destArea, destSize, mappedResource.pData, &stride,
&drawCount, &topology);
- deviceContext->Unmap(mVertexBuffer.Get(), 0);
+ deviceContext->Unmap(mVertexBuffer.get(), 0);
+
+ auto stateManager = mRenderer->getStateManager();
// Apply vertex buffer
- deviceContext->IASetVertexBuffers(0, 1, mVertexBuffer.GetAddressOf(), &stride, &startIdx);
+ stateManager->setSingleVertexBuffer(&mVertexBuffer, stride, 0);
// Apply state
deviceContext->OMSetBlendState(nullptr, nullptr, 0xFFFFFFF);
- deviceContext->OMSetDepthStencilState(mDepthStencilState.Get(), 0xFFFFFFFF);
+ deviceContext->OMSetDepthStencilState(mDepthStencilState.get(), 0xFFFFFFFF);
if (scissor)
{
@@ -1382,34 +1346,28 @@ gl::Error Blit11::copyDepth(const d3d11::SharedSRV &source,
scissorRect.bottom = scissor->y + scissor->height;
deviceContext->RSSetScissorRects(1, &scissorRect);
- deviceContext->RSSetState(mScissorEnabledRasterizerState.Get());
+ deviceContext->RSSetState(mScissorEnabledRasterizerState.get());
}
else
{
- deviceContext->RSSetState(mScissorDisabledRasterizerState.Get());
+ deviceContext->RSSetState(mScissorDisabledRasterizerState.get());
}
- ID3D11Device *device = mRenderer->getDevice();
- ID3D11VertexShader *quad2DVS = mQuad2DVS.resolve(device);
- if (quad2DVS == nullptr)
- {
- return gl::InternalError() << "Error compiling internal 2D blit vertex shader";
- }
+ ANGLE_TRY(mQuad2DIL.resolve(mRenderer));
+ ANGLE_TRY(mQuad2DVS.resolve(mRenderer));
+ ANGLE_TRY(mDepthPS.resolve(mRenderer));
// Apply shaders
- deviceContext->IASetInputLayout(mQuad2DIL.resolve(device));
- deviceContext->IASetPrimitiveTopology(topology);
- deviceContext->VSSetShader(quad2DVS, nullptr, 0);
+ stateManager->setInputLayout(&mQuad2DIL.getObj());
+ stateManager->setPrimitiveTopology(topology);
- deviceContext->PSSetShader(mDepthPS.resolve(device), nullptr, 0);
- deviceContext->GSSetShader(nullptr, nullptr, 0);
+ stateManager->setDrawShaders(&mQuad2DVS.getObj(), nullptr, &mDepthPS.getObj());
// Unset the currently bound shader resource to avoid conflicts
- auto stateManager = mRenderer->getStateManager();
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
// Apply render target
- stateManager->setOneTimeRenderTarget(nullptr, dest.get());
+ stateManager->setOneTimeRenderTarget(context, nullptr, dest.get());
// Set the viewport
D3D11_VIEWPORT viewport;
@@ -1425,19 +1383,16 @@ gl::Error Blit11::copyDepth(const d3d11::SharedSRV &source,
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, source.get());
// Apply samplers
- deviceContext->PSSetSamplers(0, 1, mPointSampler.GetAddressOf());
+ ID3D11SamplerState *samplerState = mPointSampler.get();
+ deviceContext->PSSetSamplers(0, 1, &samplerState);
// Draw the quad
deviceContext->Draw(drawCount, 0);
- // Unbind textures and render targets and vertex buffer
+ // Unbind shader resources and invalidate all state.
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
- UINT zero = 0;
- ID3D11Buffer *const nullBuffer = nullptr;
- deviceContext->IASetVertexBuffers(0, 1, &nullBuffer, &zero, &zero);
-
- mRenderer->markAllStateDirty();
+ mRenderer->markAllStateDirty(context);
return gl::NoError();
}
@@ -1536,31 +1491,30 @@ gl::Error Blit11::copyAndConvertImpl(const TextureHelper11 &source,
ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
TextureHelper11 sourceStaging;
- ANGLE_TRY_RESULT(mRenderer->createStagingTexture(GL_TEXTURE_2D, source.getFormatSet(),
+ ANGLE_TRY_RESULT(mRenderer->createStagingTexture(ResourceType::Texture2D, source.getFormatSet(),
sourceSize, StagingAccess::READ),
sourceStaging);
- deviceContext->CopySubresourceRegion(sourceStaging.getResource(), 0, 0, 0, 0,
- source.getResource(), sourceSubresource, nullptr);
+ deviceContext->CopySubresourceRegion(sourceStaging.get(), 0, 0, 0, 0, source.get(),
+ sourceSubresource, nullptr);
D3D11_MAPPED_SUBRESOURCE sourceMapping;
- HRESULT result =
- deviceContext->Map(sourceStaging.getResource(), 0, D3D11_MAP_READ, 0, &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, "
- << result;
+ << gl::FmtHR(result);
}
D3D11_MAPPED_SUBRESOURCE destMapping;
- result = deviceContext->Map(destStaging.getResource(), 0, D3D11_MAP_WRITE, 0, &destMapping);
+ result = deviceContext->Map(destStaging.get(), 0, D3D11_MAP_WRITE, 0, &destMapping);
if (FAILED(result))
{
- deviceContext->Unmap(sourceStaging.getResource(), 0);
+ deviceContext->Unmap(sourceStaging.get(), 0);
return gl::OutOfMemory()
<< "Failed to map internal destination staging texture for depth stencil blit, "
- << result;
+ << gl::FmtHR(result);
}
// Clip dest area to the destination size
@@ -1577,8 +1531,8 @@ gl::Error Blit11::copyAndConvertImpl(const TextureHelper11 &source,
destPixelStride, static_cast<const uint8_t *>(sourceMapping.pData),
static_cast<uint8_t *>(destMapping.pData));
- deviceContext->Unmap(sourceStaging.getResource(), 0);
- deviceContext->Unmap(destStaging.getResource(), 0);
+ deviceContext->Unmap(sourceStaging.get(), 0);
+ deviceContext->Unmap(destStaging.get(), 0);
return gl::NoError();
}
@@ -1607,12 +1561,12 @@ gl::Error Blit11::copyAndConvert(const TextureHelper11 &source,
// ID3D11DevicContext::UpdateSubresource can be called
// using it's mapped data as a source
TextureHelper11 destStaging;
- ANGLE_TRY_RESULT(mRenderer->createStagingTexture(GL_TEXTURE_2D, dest.getFormatSet(), destSize,
- StagingAccess::READ_WRITE),
+ ANGLE_TRY_RESULT(mRenderer->createStagingTexture(ResourceType::Texture2D, dest.getFormatSet(),
+ destSize, StagingAccess::READ_WRITE),
destStaging);
- deviceContext->CopySubresourceRegion(destStaging.getResource(), 0, 0, 0, 0, dest.getResource(),
- destSubresource, nullptr);
+ deviceContext->CopySubresourceRegion(destStaging.get(), 0, 0, 0, 0, dest.get(), destSubresource,
+ nullptr);
copyAndConvertImpl(source, sourceSubresource, sourceArea, sourceSize, destStaging, destArea,
destSize, scissor, readOffset, writeOffset, copySize, srcPixelStride,
@@ -1622,60 +1576,61 @@ gl::Error Blit11::copyAndConvert(const TextureHelper11 &source,
if (mRenderer->getWorkarounds().depthStencilBlitExtraCopy)
{
D3D11_MAPPED_SUBRESOURCE mapped;
- deviceContext->Map(destStaging.getResource(), 0, D3D11_MAP_READ, 0, &mapped);
- deviceContext->UpdateSubresource(dest.getResource(), destSubresource, nullptr, mapped.pData,
+ 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.getResource(), 0);
+ deviceContext->Unmap(destStaging.get(), 0);
}
else
{
- deviceContext->CopySubresourceRegion(dest.getResource(), destSubresource, 0, 0, 0,
- destStaging.getResource(), 0, nullptr);
+ deviceContext->CopySubresourceRegion(dest.get(), destSubresource, 0, 0, 0,
+ destStaging.get(), 0, nullptr);
}
return gl::NoError();
}
-void Blit11::addBlitShaderToMap(BlitShaderType blitShaderType,
- ShaderDimension dimension,
- ID3D11PixelShader *ps)
+gl::Error Blit11::addBlitShaderToMap(BlitShaderType blitShaderType,
+ ShaderDimension dimension,
+ const ShaderData &shaderData,
+ const char *name)
{
ASSERT(mBlitShaderMap.find(blitShaderType) == mBlitShaderMap.end());
- ASSERT(ps);
+
+ d3d11::PixelShader ps;
+ ANGLE_TRY(mRenderer->allocateResource(shaderData, &ps));
+ ps.setDebugName(name);
Shader shader;
shader.dimension = dimension;
- shader.pixelShader = ps;
+ shader.pixelShader = std::move(ps);
- mBlitShaderMap[blitShaderType] = shader;
+ mBlitShaderMap[blitShaderType] = std::move(shader);
+ return gl::NoError();
}
-void Blit11::addSwizzleShaderToMap(SwizzleShaderType swizzleShaderType,
- ShaderDimension dimension,
- ID3D11PixelShader *ps)
+gl::Error Blit11::addSwizzleShaderToMap(SwizzleShaderType swizzleShaderType,
+ ShaderDimension dimension,
+ const ShaderData &shaderData,
+ const char *name)
{
ASSERT(mSwizzleShaderMap.find(swizzleShaderType) == mSwizzleShaderMap.end());
- ASSERT(ps);
+
+ d3d11::PixelShader ps;
+ ANGLE_TRY(mRenderer->allocateResource(shaderData, &ps));
+ ps.setDebugName(name);
Shader shader;
shader.dimension = dimension;
- shader.pixelShader = ps;
+ shader.pixelShader = std::move(ps);
- mSwizzleShaderMap[swizzleShaderType] = shader;
+ mSwizzleShaderMap[swizzleShaderType] = std::move(shader);
+ return gl::NoError();
}
void Blit11::clearShaderMap()
{
- for (auto &blitShader : mBlitShaderMap)
- {
- SafeRelease(blitShader.second.pixelShader);
- }
mBlitShaderMap.clear();
-
- for (auto &swizzleShader : mSwizzleShaderMap)
- {
- SafeRelease(swizzleShader.second.pixelShader);
- }
mSwizzleShaderMap.clear();
}
@@ -1705,229 +1660,233 @@ gl::Error Blit11::getBlitShader(GLenum destFormat,
ASSERT(dimension == SHADER_2D || mRenderer->isES3Capable());
- ID3D11Device *device = mRenderer->getDevice();
-
switch (blitShaderType)
{
case BLITSHADER_2D_RGBAF:
- addBlitShaderToMap(
- blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_PassthroughRGBA2D, "Blit11 2D RGBA pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
+ ShaderData(g_PS_PassthroughRGBA2D),
+ "Blit11 2D RGBA pixel shader"));
break;
case BLITSHADER_2D_BGRAF:
- addBlitShaderToMap(
- blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_PassthroughRGBA2D, "Blit11 2D BGRA pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
+ ShaderData(g_PS_PassthroughRGBA2D),
+ "Blit11 2D BGRA pixel shader"));
break;
case BLITSHADER_2D_RGBF:
- addBlitShaderToMap(
- blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_PassthroughRGB2D, "Blit11 2D RGB pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
+ ShaderData(g_PS_PassthroughRGB2D),
+ "Blit11 2D RGB pixel shader"));
break;
case BLITSHADER_2D_RGF:
- addBlitShaderToMap(
- blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_PassthroughRG2D, "Blit11 2D RG pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
+ ShaderData(g_PS_PassthroughRG2D),
+ "Blit11 2D RG pixel shader"));
break;
case BLITSHADER_2D_RF:
- addBlitShaderToMap(
- blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_PassthroughR2D, "Blit11 2D R pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_PassthroughR2D),
+ "Blit11 2D R pixel shader"));
break;
case BLITSHADER_2D_ALPHA:
- addBlitShaderToMap(
- blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_PassthroughRGBA2D, "Blit11 2D alpha pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
+ ShaderData(g_PS_PassthroughRGBA2D),
+ "Blit11 2D alpha pixel shader"));
break;
case BLITSHADER_2D_LUMA:
- addBlitShaderToMap(
- blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_PassthroughLum2D, "Blit11 2D lum pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
+ ShaderData(g_PS_PassthroughLum2D),
+ "Blit11 2D lum pixel shader"));
break;
case BLITSHADER_2D_LUMAALPHA:
- addBlitShaderToMap(blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_PassthroughLumAlpha2D,
- "Blit11 2D luminance alpha pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
+ ShaderData(g_PS_PassthroughLumAlpha2D),
+ "Blit11 2D luminance alpha pixel shader"));
break;
case BLITSHADER_2D_RGBAUI:
- addBlitShaderToMap(blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_PassthroughRGBA2DUI,
- "Blit11 2D RGBA UI pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
+ ShaderData(g_PS_PassthroughRGBA2DUI),
+ "Blit11 2D RGBA UI pixel shader"));
break;
case BLITSHADER_2D_RGBAI:
- addBlitShaderToMap(
- blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_PassthroughRGBA2DI, "Blit11 2D RGBA I pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
+ ShaderData(g_PS_PassthroughRGBA2DI),
+ "Blit11 2D RGBA I pixel shader"));
break;
case BLITSHADER_2D_RGBUI:
- addBlitShaderToMap(
- blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_PassthroughRGB2DUI, "Blit11 2D RGB UI pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
+ ShaderData(g_PS_PassthroughRGB2DUI),
+ "Blit11 2D RGB UI pixel shader"));
break;
case BLITSHADER_2D_RGBI:
- addBlitShaderToMap(
- blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_PassthroughRGB2DI, "Blit11 2D RGB I pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
+ ShaderData(g_PS_PassthroughRGB2DI),
+ "Blit11 2D RGB I pixel shader"));
break;
case BLITSHADER_2D_RGUI:
- addBlitShaderToMap(
- blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_PassthroughRG2DUI, "Blit11 2D RG UI pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
+ ShaderData(g_PS_PassthroughRG2DUI),
+ "Blit11 2D RG UI pixel shader"));
break;
case BLITSHADER_2D_RGI:
- addBlitShaderToMap(
- blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_PassthroughRG2DI, "Blit11 2D RG I pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
+ ShaderData(g_PS_PassthroughRG2DI),
+ "Blit11 2D RG I pixel shader"));
break;
case BLITSHADER_2D_RUI:
- addBlitShaderToMap(
- blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_PassthroughR2DUI, "Blit11 2D R UI pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
+ ShaderData(g_PS_PassthroughR2DUI),
+ "Blit11 2D R UI pixel shader"));
break;
case BLITSHADER_2D_RI:
- addBlitShaderToMap(
- blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_PassthroughR2DI, "Blit11 2D R I pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D,
+ ShaderData(g_PS_PassthroughR2DI),
+ "Blit11 2D R I pixel shader"));
break;
case BLITSHADER_3D_RGBAF:
- addBlitShaderToMap(
- blitShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_PassthroughRGBA3D, "Blit11 3D RGBA pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
+ ShaderData(g_PS_PassthroughRGBA3D),
+ "Blit11 3D RGBA pixel shader"));
break;
case BLITSHADER_3D_RGBAUI:
- addBlitShaderToMap(blitShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_PassthroughRGBA3DUI,
- "Blit11 3D UI RGBA pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
+ ShaderData(g_PS_PassthroughRGBA3DUI),
+ "Blit11 3D UI RGBA pixel shader"));
break;
case BLITSHADER_3D_RGBAI:
- addBlitShaderToMap(
- blitShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_PassthroughRGBA3DI, "Blit11 3D I RGBA pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
+ ShaderData(g_PS_PassthroughRGBA3DI),
+ "Blit11 3D I RGBA pixel shader"));
break;
case BLITSHADER_3D_BGRAF:
- addBlitShaderToMap(
- blitShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_PassthroughRGBA3D, "Blit11 3D BGRA pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
+ ShaderData(g_PS_PassthroughRGBA3D),
+ "Blit11 3D BGRA pixel shader"));
break;
case BLITSHADER_3D_RGBF:
- addBlitShaderToMap(
- blitShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_PassthroughRGB3D, "Blit11 3D RGB pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
+ ShaderData(g_PS_PassthroughRGB3D),
+ "Blit11 3D RGB pixel shader"));
break;
case BLITSHADER_3D_RGBUI:
- addBlitShaderToMap(
- blitShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_PassthroughRGB3DUI, "Blit11 3D RGB UI pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
+ ShaderData(g_PS_PassthroughRGB3DUI),
+ "Blit11 3D RGB UI pixel shader"));
break;
case BLITSHADER_3D_RGBI:
- addBlitShaderToMap(
- blitShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_PassthroughRGB3DI, "Blit11 3D RGB I pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
+ ShaderData(g_PS_PassthroughRGB3DI),
+ "Blit11 3D RGB I pixel shader"));
break;
case BLITSHADER_3D_RGF:
- addBlitShaderToMap(
- blitShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_PassthroughRG3D, "Blit11 3D RG pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
+ ShaderData(g_PS_PassthroughRG3D),
+ "Blit11 3D RG pixel shader"));
break;
case BLITSHADER_3D_RGUI:
- addBlitShaderToMap(
- blitShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_PassthroughRG3DUI, "Blit11 3D RG UI pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
+ ShaderData(g_PS_PassthroughRG3DUI),
+ "Blit11 3D RG UI pixel shader"));
break;
case BLITSHADER_3D_RGI:
- addBlitShaderToMap(
- blitShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_PassthroughRG3DI, "Blit11 3D RG I pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
+ ShaderData(g_PS_PassthroughRG3DI),
+ "Blit11 3D RG I pixel shader"));
break;
case BLITSHADER_3D_RF:
- addBlitShaderToMap(
- blitShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_PassthroughR3D, "Blit11 3D R pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D, ShaderData(g_PS_PassthroughR3D),
+ "Blit11 3D R pixel shader"));
break;
case BLITSHADER_3D_RUI:
- addBlitShaderToMap(
- blitShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_PassthroughR3DUI, "Blit11 3D R UI pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
+ ShaderData(g_PS_PassthroughR3DUI),
+ "Blit11 3D R UI pixel shader"));
break;
case BLITSHADER_3D_RI:
- addBlitShaderToMap(
- blitShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_PassthroughR3DI, "Blit11 3D R I pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
+ ShaderData(g_PS_PassthroughR3DI),
+ "Blit11 3D R I pixel shader"));
break;
case BLITSHADER_3D_ALPHA:
- addBlitShaderToMap(
- blitShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_PassthroughRGBA3D, "Blit11 3D alpha pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
+ ShaderData(g_PS_PassthroughRGBA3D),
+ "Blit11 3D alpha pixel shader"));
break;
case BLITSHADER_3D_LUMA:
- addBlitShaderToMap(blitShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_PassthroughLum3D,
- "Blit11 3D luminance pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
+ ShaderData(g_PS_PassthroughLum3D),
+ "Blit11 3D luminance pixel shader"));
break;
case BLITSHADER_3D_LUMAALPHA:
- addBlitShaderToMap(blitShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_PassthroughLumAlpha3D,
- "Blit11 3D luminance alpha pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_3D,
+ ShaderData(g_PS_PassthroughLumAlpha3D),
+ "Blit11 3D luminance alpha pixel shader"));
break;
case BLITSHADER_2D_RGBAF_PREMULTIPLY:
- addBlitShaderToMap(blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_FtoF_PM_RGBA,
- "Blit11 2D RGBA premultiply pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoF_PM_RGBA),
+ "Blit11 2D RGBA premultiply pixel shader"));
break;
case BLITSHADER_2D_RGBAF_UNMULTIPLY:
- addBlitShaderToMap(blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_FtoF_UM_RGBA,
- "Blit11 2D RGBA unmultiply pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoF_UM_RGBA),
+ "Blit11 2D RGBA unmultiply pixel shader"));
break;
case BLITSHADER_2D_RGBF_PREMULTIPLY:
- addBlitShaderToMap(blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_FtoF_PM_RGB,
- "Blit11 2D RGB premultiply pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoF_PM_RGB),
+ "Blit11 2D RGB premultiply pixel shader"));
break;
case BLITSHADER_2D_RGBF_UNMULTIPLY:
- addBlitShaderToMap(blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_FtoF_UM_RGB,
- "Blit11 2D RGB unmultiply pixel shader"));
+ ANGLE_TRY(addBlitShaderToMap(blitShaderType, SHADER_2D, ShaderData(g_PS_FtoF_UM_RGB),
+ "Blit11 2D RGB unmultiply pixel shader"));
break;
case BLITSHADER_2D_RGBAF_TOUI:
- addBlitShaderToMap(
- blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_FtoU_PT_RGBA, "Blit11 2D RGBA to uint pixel shader"));
+ 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:
- addBlitShaderToMap(blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_FtoU_PM_RGBA,
- "Blit11 2D RGBA to uint premultiply pixel shader"));
+ 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:
- addBlitShaderToMap(blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_FtoU_UM_RGBA,
- "Blit11 2D RGBA to uint unmultiply pixel shader"));
+ 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:
- addBlitShaderToMap(
- blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_FtoU_PT_RGB, "Blit11 2D RGB to uint pixel shader"));
+ 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:
- addBlitShaderToMap(blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_FtoU_PM_RGB,
- "Blit11 2D RGB to uint premultiply pixel shader"));
+ 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:
- addBlitShaderToMap(blitShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_FtoU_UM_RGB,
- "Blit11 2D RGB to uint unmultiply pixel shader"));
+ 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:
@@ -1962,69 +1921,67 @@ gl::Error Blit11::getSwizzleShader(GLenum type,
// Swizzling shaders (OpenGL ES 3+)
ASSERT(mRenderer->isES3Capable());
- ID3D11Device *device = mRenderer->getDevice();
-
switch (swizzleShaderType)
{
case SWIZZLESHADER_2D_FLOAT:
- addSwizzleShaderToMap(
- swizzleShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_SwizzleF2D, "Blit11 2D F swizzle pixel shader"));
+ ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_2D,
+ ShaderData(g_PS_SwizzleF2D),
+ "Blit11 2D F swizzle pixel shader"));
break;
case SWIZZLESHADER_2D_UINT:
- addSwizzleShaderToMap(
- swizzleShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_SwizzleUI2D, "Blit11 2D UI swizzle pixel shader"));
+ ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_2D,
+ ShaderData(g_PS_SwizzleUI2D),
+ "Blit11 2D UI swizzle pixel shader"));
break;
case SWIZZLESHADER_2D_INT:
- addSwizzleShaderToMap(
- swizzleShaderType, SHADER_2D,
- d3d11::CompilePS(device, g_PS_SwizzleI2D, "Blit11 2D I swizzle pixel shader"));
+ ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_2D,
+ ShaderData(g_PS_SwizzleI2D),
+ "Blit11 2D I swizzle pixel shader"));
break;
case SWIZZLESHADER_CUBE_FLOAT:
- addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_SwizzleF2DArray,
- "Blit11 2D Cube F swizzle pixel shader"));
+ ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
+ ShaderData(g_PS_SwizzleF2DArray),
+ "Blit11 2D Cube F swizzle pixel shader"));
break;
case SWIZZLESHADER_CUBE_UINT:
- addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_SwizzleUI2DArray,
- "Blit11 2D Cube UI swizzle pixel shader"));
+ ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
+ ShaderData(g_PS_SwizzleUI2DArray),
+ "Blit11 2D Cube UI swizzle pixel shader"));
break;
case SWIZZLESHADER_CUBE_INT:
- addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_SwizzleI2DArray,
- "Blit11 2D Cube I swizzle pixel shader"));
+ ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
+ ShaderData(g_PS_SwizzleI2DArray),
+ "Blit11 2D Cube I swizzle pixel shader"));
break;
case SWIZZLESHADER_3D_FLOAT:
- addSwizzleShaderToMap(
- swizzleShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_SwizzleF3D, "Blit11 3D F swizzle pixel shader"));
+ ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
+ ShaderData(g_PS_SwizzleF3D),
+ "Blit11 3D F swizzle pixel shader"));
break;
case SWIZZLESHADER_3D_UINT:
- addSwizzleShaderToMap(
- swizzleShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_SwizzleUI3D, "Blit11 3D UI swizzle pixel shader"));
+ ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
+ ShaderData(g_PS_SwizzleUI3D),
+ "Blit11 3D UI swizzle pixel shader"));
break;
case SWIZZLESHADER_3D_INT:
- addSwizzleShaderToMap(
- swizzleShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_SwizzleI3D, "Blit11 3D I swizzle pixel shader"));
+ ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
+ ShaderData(g_PS_SwizzleI3D),
+ "Blit11 3D I swizzle pixel shader"));
break;
case SWIZZLESHADER_ARRAY_FLOAT:
- addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_SwizzleF2DArray,
- "Blit11 2D Array F swizzle pixel shader"));
+ ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
+ ShaderData(g_PS_SwizzleF2DArray),
+ "Blit11 2D Array F swizzle pixel shader"));
break;
case SWIZZLESHADER_ARRAY_UINT:
- addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_SwizzleUI2DArray,
- "Blit11 2D Array UI swizzle pixel shader"));
+ ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
+ ShaderData(g_PS_SwizzleUI2DArray),
+ "Blit11 2D Array UI swizzle pixel shader"));
break;
case SWIZZLESHADER_ARRAY_INT:
- addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
- d3d11::CompilePS(device, g_PS_SwizzleI2DArray,
- "Blit11 2D Array I swizzle pixel shader"));
+ ANGLE_TRY(addSwizzleShaderToMap(swizzleShaderType, SHADER_3D,
+ ShaderData(g_PS_SwizzleI2DArray),
+ "Blit11 2D Array I swizzle pixel shader"));
break;
default:
UNREACHABLE();
@@ -2037,29 +1994,35 @@ gl::Error Blit11::getSwizzleShader(GLenum type,
return gl::NoError();
}
-gl::ErrorOrResult<TextureHelper11> Blit11::resolveDepth(RenderTarget11 *depth)
+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();
- ID3D11Device *device = mRenderer->getDevice();
- ID3D11DeviceContext *context = mRenderer->getDeviceContext();
+ auto *deviceContext = mRenderer->getDeviceContext();
+ auto *stateManager = mRenderer->getStateManager();
ANGLE_TRY(initResolveDepthOnly(depth->getFormatSet(), extents));
// Notify the Renderer that all state should be invalidated.
- mRenderer->markAllStateDirty();
+ mRenderer->markAllStateDirty(context);
+
+ ANGLE_TRY(mResolveDepthStencilVS.resolve(mRenderer));
+ ANGLE_TRY(mResolveDepthPS.resolve(mRenderer));
// Apply the necessary state changes to the D3D11 immediate device context.
- context->IASetInputLayout(nullptr);
- context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
- context->VSSetShader(mResolveDepthStencilVS.resolve(device), nullptr, 0);
- context->GSSetShader(nullptr, nullptr, 0);
- context->RSSetState(nullptr);
- context->OMSetDepthStencilState(mDepthStencilState.Get(), 0xFFFFFFFF);
- context->OMSetRenderTargets(0, nullptr, mResolvedDepthDSView.get());
- context->OMSetBlendState(nullptr, nullptr, 0xFFFFFFF);
+ stateManager->setInputLayout(nullptr);
+ stateManager->setPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
+ stateManager->setDrawShaders(&mResolveDepthStencilVS.getObj(), nullptr,
+ &mResolveDepthPS.getObj());
+ deviceContext->RSSetState(nullptr);
+ deviceContext->OMSetDepthStencilState(mDepthStencilState.get(), 0xFFFFFFFF);
+ deviceContext->OMSetRenderTargets(0, nullptr, mResolvedDepthDSView.get());
+ deviceContext->OMSetBlendState(nullptr, nullptr, 0xFFFFFFF);
// Set the viewport
D3D11_VIEWPORT viewport;
@@ -2069,19 +2032,16 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveDepth(RenderTarget11 *depth)
viewport.Height = static_cast<FLOAT>(extents.height);
viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;
- context->RSSetViewports(1, &viewport);
+ deviceContext->RSSetViewports(1, &viewport);
ID3D11ShaderResourceView *pixelViews[] = {depth->getShaderResourceView().get()};
- context->PSSetShaderResources(0, 1, pixelViews);
-
- context->PSSetShader(mResolveDepthPS.resolve(device), nullptr, 0);
+ deviceContext->PSSetShaderResources(0, 1, pixelViews);
// Trigger the blit on the GPU.
- context->Draw(6, 0);
+ deviceContext->Draw(6, 0);
- return TextureHelper11::MakeAndReference(mResolvedDepth.getResource(),
- mResolvedDepth.getFormatSet());
+ return mResolvedDepth;
}
gl::Error Blit11::initResolveDepthOnly(const d3d11::Format &format, const gl::Extents &extents)
@@ -2092,8 +2052,6 @@ gl::Error Blit11::initResolveDepthOnly(const d3d11::Format &format, const gl::Ex
return gl::NoError();
}
- ID3D11Device *device = mRenderer->getDevice();
-
D3D11_TEXTURE2D_DESC textureDesc;
textureDesc.Width = extents.width;
textureDesc.Height = extents.height;
@@ -2107,15 +2065,8 @@ gl::Error Blit11::initResolveDepthOnly(const d3d11::Format &format, const gl::Ex
textureDesc.CPUAccessFlags = 0;
textureDesc.MiscFlags = 0;
- ID3D11Texture2D *resolvedDepth = nullptr;
- HRESULT hr = device->CreateTexture2D(&textureDesc, nullptr, &resolvedDepth);
- if (FAILED(hr))
- {
- return gl::OutOfMemory() << "Failed to allocate resolved depth texture, " << hr;
- }
- d3d11::SetDebugName(resolvedDepth, "Blit11::mResolvedDepth");
-
- mResolvedDepth = TextureHelper11::MakeAndPossess2D(resolvedDepth, format);
+ ANGLE_TRY(mRenderer->allocateTexture(textureDesc, format, &mResolvedDepth));
+ mResolvedDepth.setDebugName("Blit11::mResolvedDepth");
D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
dsvDesc.Flags = 0;
@@ -2123,8 +2074,7 @@ gl::Error Blit11::initResolveDepthOnly(const d3d11::Format &format, const gl::Ex
dsvDesc.Texture2D.MipSlice = 0;
dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
- ANGLE_TRY(
- mRenderer->allocateResource(dsvDesc, mResolvedDepth.getResource(), &mResolvedDepthDSView));
+ 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
@@ -2164,28 +2114,22 @@ gl::Error Blit11::initResolveDepthStencil(const gl::Extents &extents)
textureDesc.CPUAccessFlags = 0;
textureDesc.MiscFlags = 0;
- ID3D11Device *device = mRenderer->getDevice();
+ ANGLE_TRY(mRenderer->allocateTexture(textureDesc, formatSet, &mResolvedDepthStencil));
+ mResolvedDepthStencil.setDebugName("Blit11::mResolvedDepthStencil");
- ID3D11Texture2D *resolvedDepthStencil = nullptr;
- HRESULT hr = device->CreateTexture2D(&textureDesc, nullptr, &resolvedDepthStencil);
- if (FAILED(hr))
- {
- return gl::OutOfMemory() << "Failed to allocate resolved depth stencil texture, " << hr;
- }
- d3d11::SetDebugName(resolvedDepthStencil, "Blit11::mResolvedDepthStencil");
-
- ANGLE_TRY(
- mRenderer->allocateResourceNoDesc(resolvedDepthStencil, &mResolvedDepthStencilRTView));
+ ANGLE_TRY(mRenderer->allocateResourceNoDesc(mResolvedDepthStencil.get(),
+ &mResolvedDepthStencilRTView));
mResolvedDepthStencilRTView.setDebugName("Blit11::mResolvedDepthStencilRTView");
- mResolvedDepthStencil = TextureHelper11::MakeAndPossess2D(resolvedDepthStencil, formatSet);
-
return gl::NoError();
}
-gl::ErrorOrResult<TextureHelper11> Blit11::resolveStencil(RenderTarget11 *depthStencil,
+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);
@@ -2193,10 +2137,9 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveStencil(RenderTarget11 *depthS
ANGLE_TRY(initResolveDepthStencil(extents));
- ID3D11Device *device = mRenderer->getDevice();
- ID3D11DeviceContext *context = mRenderer->getDeviceContext();
-
- ID3D11Resource *stencilResource = depthStencil->getTexture();
+ 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())
@@ -2223,19 +2166,35 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveStencil(RenderTarget11 *depthS
}
// Notify the Renderer that all state should be invalidated.
- mRenderer->markAllStateDirty();
+ mRenderer->markAllStateDirty(context);
ID3D11RenderTargetView *rtvs[] = {mResolvedDepthStencilRTView.get()};
+ 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.
- context->IASetInputLayout(nullptr);
- context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
- context->VSSetShader(mResolveDepthStencilVS.resolve(device), nullptr, 0);
- context->GSSetShader(nullptr, nullptr, 0);
- context->RSSetState(nullptr);
- context->OMSetDepthStencilState(nullptr, 0xFFFFFFFF);
- context->OMSetRenderTargets(1, rtvs, nullptr);
- context->OMSetBlendState(nullptr, nullptr, 0xFFFFFFF);
+ stateManager->setInputLayout(nullptr);
+ stateManager->setPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
+ stateManager->setDrawShaders(&mResolveDepthStencilVS.getObj(), nullptr, pixelShader);
+ deviceContext->RSSetState(nullptr);
+ deviceContext->OMSetDepthStencilState(nullptr, 0xFFFFFFFF);
+ deviceContext->OMSetRenderTargets(1, rtvs, nullptr);
+ deviceContext->OMSetBlendState(nullptr, nullptr, 0xFFFFFFF);
// Set the viewport
D3D11_VIEWPORT viewport;
@@ -2245,35 +2204,24 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveStencil(RenderTarget11 *depthS
viewport.Height = static_cast<FLOAT>(extents.height);
viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;
- context->RSSetViewports(1, &viewport);
+ deviceContext->RSSetViewports(1, &viewport);
ID3D11ShaderResourceView *pixelViews[] = {
depthStencil->getShaderResourceView().get(), mStencilSRV.get(),
};
- context->PSSetShaderResources(0, 2, pixelViews);
-
- // 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.
- if (alsoDepth)
- {
- context->PSSetShader(mResolveDepthStencilPS.resolve(device), nullptr, 0);
- }
- else
- {
- context->PSSetShader(mResolveStencilPS.resolve(device), nullptr, 0);
- }
+ deviceContext->PSSetShaderResources(0, 2, pixelViews);
// Trigger the blit on the GPU.
- context->Draw(6, 0);
+ deviceContext->Draw(6, 0);
gl::Box copyBox(0, 0, 0, extents.width, extents.height, 1);
TextureHelper11 dest;
- ANGLE_TRY_RESULT(mRenderer->createStagingTexture(GL_TEXTURE_2D, depthStencil->getFormatSet(),
- extents, StagingAccess::READ_WRITE),
- 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();
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.h
index f26056e4364..5dce0532882 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.h
@@ -27,12 +27,14 @@ class Blit11 : angle::NonCopyable
explicit Blit11(Renderer11 *renderer);
~Blit11();
- gl::Error swizzleTexture(const d3d11::SharedSRV &source,
+ 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 d3d11::SharedSRV &source,
+ gl::Error copyTexture(const gl::Context *context,
+ const d3d11::SharedSRV &source,
const gl::Box &sourceArea,
const gl::Extents &sourceSize,
GLenum sourceFormat,
@@ -46,7 +48,8 @@ class Blit11 : angle::NonCopyable
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha);
- gl::Error copyStencil(const TextureHelper11 &source,
+ gl::Error copyStencil(const gl::Context *context,
+ const TextureHelper11 &source,
unsigned int sourceSubresource,
const gl::Box &sourceArea,
const gl::Extents &sourceSize,
@@ -56,7 +59,8 @@ class Blit11 : angle::NonCopyable
const gl::Extents &destSize,
const gl::Rectangle *scissor);
- gl::Error copyDepth(const d3d11::SharedSRV &source,
+ gl::Error copyDepth(const gl::Context *context,
+ const d3d11::SharedSRV &source,
const gl::Box &sourceArea,
const gl::Extents &sourceSize,
const d3d11::DepthStencilView &dest,
@@ -74,9 +78,12 @@ class Blit11 : angle::NonCopyable
const gl::Extents &destSize,
const gl::Rectangle *scissor);
- gl::ErrorOrResult<TextureHelper11> resolveDepth(RenderTarget11 *depth);
+ gl::ErrorOrResult<TextureHelper11> resolveDepth(const gl::Context *context,
+ RenderTarget11 *depth);
- gl::ErrorOrResult<TextureHelper11> resolveStencil(RenderTarget11 *depthStencil, bool alsoDepth);
+ gl::ErrorOrResult<TextureHelper11> resolveStencil(const gl::Context *context,
+ RenderTarget11 *depthStencil,
+ bool alsoDepth);
using BlitConvertFunction = void(const gl::Box &sourceArea,
const gl::Box &destArea,
@@ -145,6 +152,12 @@ class Blit11 : angle::NonCopyable
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
@@ -182,20 +195,20 @@ class Blit11 : angle::NonCopyable
struct Shader
{
ShaderDimension dimension;
- ID3D11PixelShader *pixelShader;
+ d3d11::PixelShader pixelShader;
};
struct ShaderSupport
{
- ID3D11InputLayout *inputLayout;
- ID3D11VertexShader *vertexShader;
- ID3D11GeometryShader *geometryShader;
+ const d3d11::InputLayout *inputLayout;
+ const d3d11::VertexShader *vertexShader;
+ const d3d11::GeometryShader *geometryShader;
WriteVertexFunction vertexWriteFunction;
};
gl::Error initResources();
- ShaderSupport getShaderSupport(const Shader &shader);
+ gl::Error getShaderSupport(const Shader &shader, ShaderSupport *supportOut);
static BlitShaderType GetBlitShaderType(GLenum destinationFormat,
GLenum sourceFormat,
@@ -247,9 +260,10 @@ class Blit11 : angle::NonCopyable
size_t destPixelStride,
BlitConvertFunction *convertFunction);
- void addBlitShaderToMap(BlitShaderType blitShaderType,
- ShaderDimension dimension,
- ID3D11PixelShader *ps);
+ gl::Error addBlitShaderToMap(BlitShaderType blitShaderType,
+ ShaderDimension dimension,
+ const ShaderData &shaderData,
+ const char *name);
gl::Error getBlitShader(GLenum destFormat,
GLenum sourceFormat,
@@ -262,9 +276,10 @@ class Blit11 : angle::NonCopyable
D3D11_SRV_DIMENSION viewDimension,
const Shader **shaderOut);
- void addSwizzleShaderToMap(SwizzleShaderType swizzleShaderType,
- ShaderDimension dimension,
- ID3D11PixelShader *ps);
+ gl::Error addSwizzleShaderToMap(SwizzleShaderType swizzleShaderType,
+ ShaderDimension dimension,
+ const ShaderData &shaderData,
+ const char *name);
void clearShaderMap();
void releaseResolveDepthStencilResources();
@@ -277,12 +292,12 @@ class Blit11 : angle::NonCopyable
std::map<SwizzleShaderType, Shader> mSwizzleShaderMap;
bool mResourcesInitialized;
- angle::ComPtr<ID3D11Buffer> mVertexBuffer;
- angle::ComPtr<ID3D11SamplerState> mPointSampler;
- angle::ComPtr<ID3D11SamplerState> mLinearSampler;
- angle::ComPtr<ID3D11RasterizerState> mScissorEnabledRasterizerState;
- angle::ComPtr<ID3D11RasterizerState> mScissorDisabledRasterizerState;
- angle::ComPtr<ID3D11DepthStencilState> mDepthStencilState;
+ 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;
@@ -294,7 +309,7 @@ class Blit11 : angle::NonCopyable
d3d11::LazyBlendState mAlphaMaskBlendState;
- angle::ComPtr<ID3D11Buffer> mSwizzleCB;
+ d3d11::Buffer mSwizzleCB;
d3d11::LazyShader<ID3D11VertexShader> mResolveDepthStencilVS;
d3d11::LazyShader<ID3D11PixelShader> mResolveDepthPS;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
index aea9c5fe27a..310ca19b115 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
@@ -111,7 +111,9 @@ class Buffer11::BufferStorage : angle::NonCopyable
size_t getSize() const { return mBufferSize; }
void setDataRevision(DataRevision rev) { mRevision = rev; }
- virtual bool isMappable(GLbitfield access) const = 0;
+ virtual bool isCPUAccessible(GLbitfield access) const = 0;
+
+ virtual bool isGPUAccessible() const = 0;
virtual gl::ErrorOrResult<CopyResult> copyFromStorage(BufferStorage *source,
size_t sourceOffset,
@@ -146,9 +148,11 @@ class Buffer11::NativeStorage : public Buffer11::BufferStorage
const OnBufferDataDirtyChannel *onStorageChanged);
~NativeStorage() override;
- bool isMappable(GLbitfield access) const override;
+ bool isCPUAccessible(GLbitfield access) const override;
+
+ bool isGPUAccessible() const override { return true; }
- ID3D11Buffer *getNativeStorage() const { return mNativeStorage; }
+ const d3d11::Buffer &getBuffer() const { return mBuffer; }
gl::ErrorOrResult<CopyResult> copyFromStorage(BufferStorage *source,
size_t sourceOffset,
size_t size,
@@ -170,7 +174,7 @@ class Buffer11::NativeStorage : public Buffer11::BufferStorage
unsigned int bufferSize);
void clearSRVs();
- ID3D11Buffer *mNativeStorage;
+ d3d11::Buffer mBuffer;
const OnBufferDataDirtyChannel *mOnStorageChanged;
std::map<DXGI_FORMAT, d3d11::ShaderResourceView> mBufferResourceViews;
};
@@ -184,9 +188,11 @@ class Buffer11::EmulatedIndexedStorage : public Buffer11::BufferStorage
EmulatedIndexedStorage(Renderer11 *renderer);
~EmulatedIndexedStorage() override;
- bool isMappable(GLbitfield access) const override { return true; }
+ bool isCPUAccessible(GLbitfield access) const override { return true; }
- gl::ErrorOrResult<ID3D11Buffer *> getNativeStorage(SourceIndexData *indexInfo,
+ bool isGPUAccessible() const override { return false; }
+
+ gl::ErrorOrResult<const d3d11::Buffer *> getBuffer(SourceIndexData *indexInfo,
const TranslatedAttribute &attribute,
GLint startVertex);
@@ -204,7 +210,7 @@ class Buffer11::EmulatedIndexedStorage : public Buffer11::BufferStorage
void unmap() override;
private:
- ID3D11Buffer *mNativeStorage; // contains expanded data for use by D3D
+ d3d11::Buffer mBuffer; // contains expanded data for use by D3D
angle::MemoryBuffer mMemoryBuffer; // original data (not expanded)
angle::MemoryBuffer mIndicesMemoryBuffer; // indices data
};
@@ -217,7 +223,10 @@ class Buffer11::PackStorage : public Buffer11::BufferStorage
explicit PackStorage(Renderer11 *renderer);
~PackStorage() override;
- bool isMappable(GLbitfield access) const override { return true; }
+ bool isCPUAccessible(GLbitfield access) const override { return true; }
+
+ bool isGPUAccessible() const override { return false; }
+
gl::ErrorOrResult<CopyResult> copyFromStorage(BufferStorage *source,
size_t sourceOffset,
size_t size,
@@ -230,7 +239,8 @@ class Buffer11::PackStorage : public Buffer11::BufferStorage
uint8_t **mapPointerOut) override;
void unmap() override;
- gl::Error packPixels(const gl::FramebufferAttachment &readAttachment,
+ gl::Error packPixels(const gl::Context *context,
+ const gl::FramebufferAttachment &readAttachment,
const PackPixelsParams &params);
private:
@@ -252,7 +262,10 @@ class Buffer11::SystemMemoryStorage : public Buffer11::BufferStorage
explicit SystemMemoryStorage(Renderer11 *renderer);
~SystemMemoryStorage() override {}
- bool isMappable(GLbitfield access) const override { return true; }
+ bool isCPUAccessible(GLbitfield access) const override { return true; }
+
+ bool isGPUAccessible() const override { return false; }
+
gl::ErrorOrResult<CopyResult> copyFromStorage(BufferStorage *source,
size_t sourceOffset,
size_t size,
@@ -299,7 +312,7 @@ Buffer11::~Buffer11()
mRenderer->onBufferDelete(this);
}
-gl::Error Buffer11::setData(ContextImpl *context,
+gl::Error Buffer11::setData(const gl::Context *context,
GLenum target,
const void *data,
size_t size,
@@ -328,7 +341,7 @@ gl::ErrorOrResult<Buffer11::SystemMemoryStorage *> Buffer11::getSystemMemoryStor
return GetAs<SystemMemoryStorage>(storage);
}
-gl::Error Buffer11::setSubData(ContextImpl * /*context*/,
+gl::Error Buffer11::setSubData(const gl::Context * /*context*/,
GLenum target,
const void *data,
size_t size,
@@ -388,7 +401,7 @@ gl::Error Buffer11::setSubData(ContextImpl * /*context*/,
return gl::NoError();
}
-gl::Error Buffer11::copySubData(ContextImpl *context,
+gl::Error Buffer11::copySubData(const gl::Context *context,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
@@ -410,17 +423,15 @@ gl::Error Buffer11::copySubData(ContextImpl *context,
if (!copySource || !copyDest)
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate internal staging buffer.");
+ return gl::OutOfMemory() << "Failed to allocate internal staging buffer.";
}
- // If copying to/from a pixel pack buffer, we must have a staging or
- // pack buffer partner, because other native buffers can't be mapped
- if (copyDest->getUsage() == BUFFER_USAGE_PIXEL_PACK && !copySource->isMappable(GL_MAP_READ_BIT))
+ // 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(), copySource);
}
- else if (copySource->getUsage() == BUFFER_USAGE_PIXEL_PACK &&
- !copyDest->isMappable(GL_MAP_WRITE_BIT))
+ else if (!copySource->isGPUAccessible() && !copyDest->isCPUAccessible(GL_MAP_WRITE_BIT))
{
ANGLE_TRY_RESULT(getStagingStorage(), copyDest);
}
@@ -452,7 +463,7 @@ gl::Error Buffer11::copySubData(ContextImpl *context,
return gl::NoError();
}
-gl::Error Buffer11::map(ContextImpl *context, GLenum access, void **mapPtr)
+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.
@@ -460,7 +471,7 @@ gl::Error Buffer11::map(ContextImpl *context, GLenum access, void **mapPtr)
return mapRange(context, 0, mSize, GL_MAP_WRITE_BIT, mapPtr);
}
-gl::Error Buffer11::mapRange(ContextImpl *context,
+gl::Error Buffer11::mapRange(const gl::Context *context,
size_t offset,
size_t length,
GLbitfield access,
@@ -486,7 +497,7 @@ gl::Error Buffer11::mapRange(ContextImpl *context,
if (!mMappedStorage)
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate mappable internal buffer.");
+ return gl::OutOfMemory() << "Failed to allocate mappable internal buffer.";
}
if ((access & GL_MAP_WRITE_BIT) > 0)
@@ -504,7 +515,7 @@ gl::Error Buffer11::mapRange(ContextImpl *context,
return gl::NoError();
}
-gl::Error Buffer11::unmap(ContextImpl *context, GLboolean *result)
+gl::Error Buffer11::unmap(const gl::Context *context, GLboolean *result)
{
ASSERT(mMappedStorage);
mMappedStorage->unmap();
@@ -608,7 +619,7 @@ gl::ErrorOrResult<ID3D11Buffer *> Buffer11::getBuffer(BufferUsage usage)
{
BufferStorage *storage = nullptr;
ANGLE_TRY_RESULT(getBufferStorage(usage), storage);
- return GetAs<NativeStorage>(storage)->getNativeStorage();
+ return GetAs<NativeStorage>(storage)->getBuffer().get();
}
gl::ErrorOrResult<ID3D11Buffer *> Buffer11::getEmulatedIndexedBuffer(
@@ -623,11 +634,10 @@ gl::ErrorOrResult<ID3D11Buffer *> Buffer11::getEmulatedIndexedBuffer(
EmulatedIndexedStorage *emulatedStorage = GetAs<EmulatedIndexedStorage>(untypedStorage);
- ID3D11Buffer *nativeStorage = nullptr;
- ANGLE_TRY_RESULT(emulatedStorage->getNativeStorage(indexInfo, attribute, startVertex),
- nativeStorage);
+ const d3d11::Buffer *nativeStorage = nullptr;
+ ANGLE_TRY_RESULT(emulatedStorage->getBuffer(indexInfo, attribute, startVertex), nativeStorage);
- return nativeStorage;
+ return nativeStorage->get();
}
gl::Error Buffer11::getConstantBufferRange(GLintptr offset,
@@ -650,7 +660,7 @@ gl::Error Buffer11::getConstantBufferRange(GLintptr offset,
*numConstantsOut = 0;
}
- *bufferOut = GetAs<NativeStorage>(bufferStorage)->getNativeStorage();
+ *bufferOut = GetAs<NativeStorage>(bufferStorage)->getBuffer().get();
return gl::NoError();
}
@@ -663,7 +673,8 @@ gl::ErrorOrResult<ID3D11ShaderResourceView *> Buffer11::getSRV(DXGI_FORMAT srvFo
return nativeStorage->getSRVForFormat(srvFormat);
}
-gl::Error Buffer11::packPixels(const gl::FramebufferAttachment &readAttachment,
+gl::Error Buffer11::packPixels(const gl::Context *context,
+ const gl::FramebufferAttachment &readAttachment,
const PackPixelsParams &params)
{
PackStorage *packStorage = nullptr;
@@ -673,7 +684,7 @@ gl::Error Buffer11::packPixels(const gl::FramebufferAttachment &readAttachment,
ANGLE_TRY_RESULT(getLatestBufferStorage(), latestStorage);
ASSERT(packStorage);
- ANGLE_TRY(packStorage->packPixels(readAttachment, params));
+ ANGLE_TRY(packStorage->packPixels(context, readAttachment, params));
packStorage->setDataRevision(latestStorage ? latestStorage->getDataRevision() + 1 : 1);
return gl::NoError();
@@ -812,7 +823,8 @@ gl::Error Buffer11::updateBufferStorage(BufferStorage *storage,
// 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->isMappable(GL_MAP_READ_BIT) || !storage->isMappable(GL_MAP_WRITE_BIT)))
+ (!latestBuffer->isCPUAccessible(GL_MAP_READ_BIT) ||
+ !storage->isCPUAccessible(GL_MAP_WRITE_BIT)))
{
NativeStorage *stagingBuffer = nullptr;
ANGLE_TRY_RESULT(getStagingStorage(), stagingBuffer);
@@ -920,7 +932,7 @@ Buffer11::BufferStorage::BufferStorage(Renderer11 *renderer, BufferUsage usage)
gl::Error Buffer11::BufferStorage::setData(const uint8_t *data, size_t offset, size_t size)
{
- ASSERT(isMappable(GL_MAP_WRITE_BIT));
+ ASSERT(isCPUAccessible(GL_MAP_WRITE_BIT));
// Uniform storage can have a different internal size than the buffer size. Ensure we don't
// overflow.
@@ -941,17 +953,16 @@ gl::Error Buffer11::BufferStorage::setData(const uint8_t *data, size_t offset, s
Buffer11::NativeStorage::NativeStorage(Renderer11 *renderer,
BufferUsage usage,
const OnBufferDataDirtyChannel *onStorageChanged)
- : BufferStorage(renderer, usage), mNativeStorage(nullptr), mOnStorageChanged(onStorageChanged)
+ : BufferStorage(renderer, usage), mBuffer(), mOnStorageChanged(onStorageChanged)
{
}
Buffer11::NativeStorage::~NativeStorage()
{
- SafeRelease(mNativeStorage);
clearSRVs();
}
-bool Buffer11::NativeStorage::isMappable(GLbitfield access) const
+bool Buffer11::NativeStorage::isCPUAccessible(GLbitfield access) const
{
if ((access & GL_MAP_READ_BIT) != 0)
{
@@ -971,7 +982,7 @@ gl::ErrorOrResult<CopyResult> Buffer11::NativeStorage::copyFromStorage(BufferSto
ID3D11DeviceContext *context = mRenderer->getDeviceContext();
size_t requiredSize = destOffset + size;
- bool createBuffer = !mNativeStorage || mBufferSize < requiredSize;
+ bool createBuffer = !mBuffer.valid() || mBufferSize < requiredSize;
// (Re)initialize D3D buffer if needed
bool preserveData = (destOffset > 0);
@@ -989,7 +1000,7 @@ gl::ErrorOrResult<CopyResult> Buffer11::NativeStorage::copyFromStorage(BufferSto
if (source->getUsage() == BUFFER_USAGE_PIXEL_PACK ||
source->getUsage() == BUFFER_USAGE_SYSTEM_MEMORY)
{
- ASSERT(source->isMappable(GL_MAP_READ_BIT) && isMappable(GL_MAP_WRITE_BIT));
+ 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));
@@ -1011,10 +1022,10 @@ gl::ErrorOrResult<CopyResult> Buffer11::NativeStorage::copyFromStorage(BufferSto
srcBox.front = 0;
srcBox.back = 1;
- ID3D11Buffer *sourceBuffer = GetAs<NativeStorage>(source)->getNativeStorage();
+ const d3d11::Buffer *sourceBuffer = &GetAs<NativeStorage>(source)->getBuffer();
- context->CopySubresourceRegion(mNativeStorage, 0, static_cast<unsigned int>(destOffset), 0,
- 0, sourceBuffer, 0, &srcBox);
+ context->CopySubresourceRegion(mBuffer.get(), 0, static_cast<unsigned int>(destOffset), 0,
+ 0, sourceBuffer->get(), 0, &srcBox);
}
return createBuffer ? CopyResult::RECREATED : CopyResult::NOT_RECREATED;
@@ -1022,24 +1033,16 @@ gl::ErrorOrResult<CopyResult> Buffer11::NativeStorage::copyFromStorage(BufferSto
gl::Error Buffer11::NativeStorage::resize(size_t size, bool preserveData)
{
- ID3D11Device *device = mRenderer->getDevice();
ID3D11DeviceContext *context = mRenderer->getDeviceContext();
D3D11_BUFFER_DESC bufferDesc;
FillBufferDesc(&bufferDesc, mRenderer, mUsage, static_cast<unsigned int>(size));
- ID3D11Buffer *newBuffer;
- HRESULT result = device->CreateBuffer(&bufferDesc, nullptr, &newBuffer);
-
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal buffer, result: 0x%X.",
- result);
- }
-
- d3d11::SetDebugName(newBuffer, "Buffer11::NativeStorage");
+ d3d11::Buffer newBuffer;
+ ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &newBuffer));
+ newBuffer.setDebugName("Buffer11::NativeStorage");
- if (mNativeStorage && preserveData)
+ if (mBuffer.valid() && preserveData)
{
// We don't call resize if the buffer is big enough already.
ASSERT(mBufferSize <= size);
@@ -1052,12 +1055,11 @@ gl::Error Buffer11::NativeStorage::resize(size_t size, bool preserveData)
srcBox.front = 0;
srcBox.back = 1;
- context->CopySubresourceRegion(newBuffer, 0, 0, 0, 0, mNativeStorage, 0, &srcBox);
+ context->CopySubresourceRegion(newBuffer.get(), 0, 0, 0, 0, mBuffer.get(), 0, &srcBox);
}
// No longer need the old buffer
- SafeRelease(mNativeStorage);
- mNativeStorage = newBuffer;
+ mBuffer = std::move(newBuffer);
mBufferSize = bufferDesc.ByteWidth;
@@ -1148,19 +1150,18 @@ gl::Error Buffer11::NativeStorage::map(size_t offset,
GLbitfield access,
uint8_t **mapPointerOut)
{
- ASSERT(isMappable(access));
+ 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(mNativeStorage, 0, d3dMapType, d3dMapFlag, &mappedResource);
+ HRESULT result = context->Map(mBuffer.get(), 0, d3dMapType, d3dMapFlag, &mappedResource);
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to map native storage in Buffer11::NativeStorage::map");
+ return gl::OutOfMemory() << "Failed to map native storage in Buffer11::NativeStorage::map";
}
ASSERT(mappedResource.pData);
*mapPointerOut = static_cast<uint8_t *>(mappedResource.pData) + offset;
@@ -1169,9 +1170,9 @@ gl::Error Buffer11::NativeStorage::map(size_t offset,
void Buffer11::NativeStorage::unmap()
{
- ASSERT(isMappable(GL_MAP_WRITE_BIT) || isMappable(GL_MAP_READ_BIT));
+ ASSERT(isCPUAccessible(GL_MAP_WRITE_BIT) || isCPUAccessible(GL_MAP_READ_BIT));
ID3D11DeviceContext *context = mRenderer->getDeviceContext();
- context->Unmap(mNativeStorage, 0);
+ context->Unmap(mBuffer.get(), 0);
}
gl::ErrorOrResult<ID3D11ShaderResourceView *> Buffer11::NativeStorage::getSRVForFormat(
@@ -1192,7 +1193,7 @@ gl::ErrorOrResult<ID3D11ShaderResourceView *> Buffer11::NativeStorage::getSRVFor
bufferSRVDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
bufferSRVDesc.Format = srvFormat;
- ANGLE_TRY(mRenderer->allocateResource(bufferSRVDesc, mNativeStorage,
+ ANGLE_TRY(mRenderer->allocateResource(bufferSRVDesc, mBuffer.get(),
&mBufferResourceViews[srvFormat]));
return mBufferResourceViews[srvFormat].get();
@@ -1206,16 +1207,15 @@ void Buffer11::NativeStorage::clearSRVs()
// Buffer11::EmulatedIndexStorage implementation
Buffer11::EmulatedIndexedStorage::EmulatedIndexedStorage(Renderer11 *renderer)
- : BufferStorage(renderer, BUFFER_USAGE_EMULATED_INDEXED_VERTEX), mNativeStorage(nullptr)
+ : BufferStorage(renderer, BUFFER_USAGE_EMULATED_INDEXED_VERTEX), mBuffer()
{
}
Buffer11::EmulatedIndexedStorage::~EmulatedIndexedStorage()
{
- SafeRelease(mNativeStorage);
}
-gl::ErrorOrResult<ID3D11Buffer *> Buffer11::EmulatedIndexedStorage::getNativeStorage(
+gl::ErrorOrResult<const d3d11::Buffer *> Buffer11::EmulatedIndexedStorage::getBuffer(
SourceIndexData *indexInfo,
const TranslatedAttribute &attribute,
GLint startVertex)
@@ -1223,9 +1223,9 @@ gl::ErrorOrResult<ID3D11Buffer *> Buffer11::EmulatedIndexedStorage::getNativeSto
// 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 (mNativeStorage == nullptr || indexInfo->srcIndicesChanged)
+ if (!mBuffer.valid() || indexInfo->srcIndicesChanged)
{
- SafeRelease(mNativeStorage);
+ 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.
@@ -1248,9 +1248,8 @@ gl::ErrorOrResult<ID3D11Buffer *> Buffer11::EmulatedIndexedStorage::getNativeSto
if (!mIndicesMemoryBuffer.resize(indicesDataSize))
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Error resizing index memory buffer in "
- "Buffer11::EmulatedIndexedStorage::getNativeStorage");
+ return gl::OutOfMemory() << "Error resizing index memory buffer in "
+ "Buffer11::EmulatedIndexedStorage::getBuffer";
}
memcpy(mIndicesMemoryBuffer.data(), indexInfo->srcIndices, indicesDataSize);
@@ -1258,7 +1257,7 @@ gl::ErrorOrResult<ID3D11Buffer *> Buffer11::EmulatedIndexedStorage::getNativeSto
indexInfo->srcIndicesChanged = false;
}
- if (!mNativeStorage)
+ if (!mBuffer.valid())
{
unsigned int offset = 0;
ANGLE_TRY_RESULT(attribute.computeOffset(startVertex), offset);
@@ -1269,9 +1268,8 @@ gl::ErrorOrResult<ID3D11Buffer *> Buffer11::EmulatedIndexedStorage::getNativeSto
angle::MemoryBuffer expandedData;
if (!expandedData.resize(expandedDataSize))
{
- return gl::Error(
- GL_OUT_OF_MEMORY,
- "Error resizing buffer in Buffer11::EmulatedIndexedStorage::getNativeStorage");
+ return gl::OutOfMemory()
+ << "Error resizing buffer in Buffer11::EmulatedIndexedStorage::getBuffer";
}
// Clear the contents of the allocated buffer
@@ -1309,8 +1307,6 @@ gl::ErrorOrResult<ID3D11Buffer *> Buffer11::EmulatedIndexedStorage::getNativeSto
// Finally, initialize the emulated indexed native storage object with the newly copied data
// and free the temporary buffers used.
- ID3D11Device *device = mRenderer->getDevice();
-
D3D11_BUFFER_DESC bufferDesc;
bufferDesc.ByteWidth = expandedDataSize;
bufferDesc.MiscFlags = 0;
@@ -1321,16 +1317,11 @@ gl::ErrorOrResult<ID3D11Buffer *> Buffer11::EmulatedIndexedStorage::getNativeSto
D3D11_SUBRESOURCE_DATA subResourceData = {expandedData.data(), 0, 0};
- HRESULT result = device->CreateBuffer(&bufferDesc, &subResourceData, &mNativeStorage);
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Could not create emulated index data buffer: %08lX",
- result);
- }
- d3d11::SetDebugName(mNativeStorage, "Buffer11::EmulatedIndexedStorage");
+ ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &subResourceData, &mBuffer));
+ mBuffer.setDebugName("Buffer11::EmulatedIndexedStorage");
}
- return mNativeStorage;
+ return &mBuffer;
}
gl::ErrorOrResult<CopyResult> Buffer11::EmulatedIndexedStorage::copyFromStorage(
@@ -1339,7 +1330,7 @@ gl::ErrorOrResult<CopyResult> Buffer11::EmulatedIndexedStorage::copyFromStorage(
size_t size,
size_t destOffset)
{
- ASSERT(source->isMappable(GL_MAP_READ_BIT));
+ 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());
@@ -1354,7 +1345,7 @@ gl::Error Buffer11::EmulatedIndexedStorage::resize(size_t size, bool preserveDat
{
if (!mMemoryBuffer.resize(size))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize EmulatedIndexedStorage");
+ return gl::OutOfMemory() << "Failed to resize EmulatedIndexedStorage";
}
mBufferSize = size;
}
@@ -1396,7 +1387,7 @@ gl::ErrorOrResult<CopyResult> Buffer11::PackStorage::copyFromStorage(BufferStora
ANGLE_TRY(flushQueuedPackCommand());
// For all use cases of pack buffers, we must copy through a readable buffer.
- ASSERT(source->isMappable(GL_MAP_READ_BIT));
+ 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());
@@ -1411,7 +1402,7 @@ gl::Error Buffer11::PackStorage::resize(size_t size, bool preserveData)
{
if (!mMemoryBuffer.resize(size))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize internal buffer storage.");
+ return gl::OutOfMemory() << "Failed to resize internal buffer storage.";
}
mBufferSize = size;
}
@@ -1443,25 +1434,23 @@ void Buffer11::PackStorage::unmap()
// No-op
}
-gl::Error Buffer11::PackStorage::packPixels(const gl::FramebufferAttachment &readAttachment,
+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(&renderTarget));
-
- ID3D11Resource *renderTargetResource = renderTarget->getTexture();
- ASSERT(renderTargetResource);
+ ANGLE_TRY(readAttachment.getRenderTarget(context, &renderTarget));
+ const TextureHelper11 &srcTexture = renderTarget->getTexture();
+ ASSERT(srcTexture.valid());
unsigned int srcSubresource = renderTarget->getSubresourceIndex();
- TextureHelper11 srcTexture =
- TextureHelper11::MakeAndReference(renderTargetResource, renderTarget->getFormatSet());
- mQueuedPackCommand.reset(new PackPixelsParams(params));
+ mQueuedPackCommand.reset(new PackPixelsParams(context, params));
gl::Extents srcTextureSize(params.area.width, params.area.height, 1);
- if (!mStagingTexture.getResource() || mStagingTexture.getFormat() != srcTexture.getFormat() ||
+ if (!mStagingTexture.get() || mStagingTexture.getFormat() != srcTexture.getFormat() ||
mStagingTexture.getExtents() != srcTextureSize)
{
ANGLE_TRY_RESULT(
@@ -1482,15 +1471,15 @@ gl::Error Buffer11::PackStorage::packPixels(const gl::FramebufferAttachment &rea
// Select the correct layer from a 3D attachment
srcBox.front = 0;
- if (mStagingTexture.getTextureType() == GL_TEXTURE_3D)
+ if (mStagingTexture.is3D())
{
srcBox.front = static_cast<UINT>(readAttachment.layer());
}
srcBox.back = srcBox.front + 1;
// Asynchronous copy
- immediateContext->CopySubresourceRegion(mStagingTexture.getResource(), 0, 0, 0, 0,
- srcTexture.getResource(), srcSubresource, &srcBox);
+ immediateContext->CopySubresourceRegion(mStagingTexture.get(), 0, 0, 0, 0, srcTexture.get(),
+ srcSubresource, &srcBox);
return gl::NoError();
}
@@ -1521,7 +1510,7 @@ gl::ErrorOrResult<CopyResult> Buffer11::SystemMemoryStorage::copyFromStorage(Buf
size_t size,
size_t destOffset)
{
- ASSERT(source->isMappable(GL_MAP_READ_BIT));
+ 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());
@@ -1536,7 +1525,7 @@ gl::Error Buffer11::SystemMemoryStorage::resize(size_t size, bool preserveData)
{
if (!mSystemCopy.resize(size))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize SystemMemoryStorage");
+ return gl::OutOfMemory() << "Failed to resize SystemMemoryStorage";
}
mBufferSize = size;
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h
index a198f457293..65fded27ef2 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h
@@ -64,7 +64,8 @@ class Buffer11 : public BufferD3D
UINT *numConstantsOut);
gl::ErrorOrResult<ID3D11ShaderResourceView *> getSRV(DXGI_FORMAT srvFormat);
bool isMapped() const { return mMappedStorage != nullptr; }
- gl::Error packPixels(const gl::FramebufferAttachment &readAttachment,
+ gl::Error packPixels(const gl::Context *context,
+ const gl::FramebufferAttachment &readAttachment,
const PackPixelsParams &params);
size_t getTotalCPUBufferMemoryBytes() const;
@@ -76,28 +77,28 @@ class Buffer11 : public BufferD3D
void invalidateStaticData() override;
// BufferImpl implementation
- gl::Error setData(ContextImpl *context,
+ gl::Error setData(const gl::Context *context,
GLenum target,
const void *data,
size_t size,
GLenum usage) override;
- gl::Error setSubData(ContextImpl *context,
+ gl::Error setSubData(const gl::Context *context,
GLenum target,
const void *data,
size_t size,
size_t offset) override;
- gl::Error copySubData(ContextImpl *contextImpl,
+ gl::Error copySubData(const gl::Context *context,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size) override;
- gl::Error map(ContextImpl *contextImpl, GLenum access, void **mapPtr) override;
- gl::Error mapRange(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl, GLboolean *result) override;
+ gl::Error unmap(const gl::Context *context, GLboolean *result) override;
gl::Error markTransformFeedbackUsage() override;
// We use two set of dirty events. Static buffers are marked dirty whenever
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp
index 4755132deaf..a5b3641f54e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp
@@ -82,7 +82,7 @@ bool UpdateDataCache(RtvDsvClearInfo<T> *dataCache,
} // anonymous namespace
Clear11::ShaderManager::ShaderManager()
- : mIl9(nullptr),
+ : 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"),
@@ -94,74 +94,88 @@ Clear11::ShaderManager::ShaderManager()
Clear11::ShaderManager::~ShaderManager()
{
- mVs9.release();
- mPsFloat9.release();
- mVs.release();
- mPsFloat.release();
- mPsUInt.release();
- mPsSInt.release();
}
-void Clear11::ShaderManager::getShadersAndLayout(ID3D11Device *device,
- D3D_FEATURE_LEVEL featureLevel,
- const INT clearType,
- ID3D11InputLayout **il,
- ID3D11VertexShader **vs,
- ID3D11PixelShader **ps)
+gl::Error Clear11::ShaderManager::getShadersAndLayout(Renderer11 *renderer,
+ const INT clearType,
+ const d3d11::InputLayout **il,
+ const d3d11::VertexShader **vs,
+ const d3d11::PixelShader **ps)
{
- if (featureLevel <= D3D_FEATURE_LEVEL_9_3)
+ if (renderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3)
{
ASSERT(clearType == GL_FLOAT);
- *vs = mVs9.resolve(device);
+ ANGLE_TRY(mVs9.resolve(renderer));
+ ANGLE_TRY(mPsFloat9.resolve(renderer));
- if (mIl9.Get() == nullptr)
+ if (!mIl9.valid())
{
- const D3D11_INPUT_ELEMENT_DESC ilDesc = {
- "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0};
+ const D3D11_INPUT_ELEMENT_DESC ilDesc[] = {
+ {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}};
- device->CreateInputLayout(&ilDesc, 1, g_VS_Clear_FL9, ArraySize(g_PS_ClearFloat_FL9),
- mIl9.GetAddressOf());
+ InputElementArray ilDescArray(ilDesc);
+ ShaderData vertexShader(g_VS_Clear_FL9);
+
+ ANGLE_TRY(renderer->allocateResource(ilDescArray, &vertexShader, &mIl9));
}
- *il = mIl9.Get();
- *ps = mPsFloat9.resolve(device);
- return;
+ *vs = &mVs9.getObj();
+ *il = &mIl9;
+ *ps = &mPsFloat9.getObj();
+ return gl::NoError();
}
- *vs = mVs.resolve(device);
+ ANGLE_TRY(mVs.resolve(renderer));
+ *vs = &mVs.getObj();
*il = nullptr;
switch (clearType)
{
case GL_FLOAT:
- *ps = mPsFloat.resolve(device);
+ ANGLE_TRY(mPsFloat.resolve(renderer));
+ *ps = &mPsFloat.getObj();
break;
case GL_UNSIGNED_INT:
- *ps = mPsUInt.resolve(device);
+ ANGLE_TRY(mPsUInt.resolve(renderer));
+ *ps = &mPsUInt.getObj();
break;
case GL_INT:
- *ps = mPsSInt.resolve(device);
+ ANGLE_TRY(mPsSInt.resolve(renderer));
+ *ps = &mPsSInt.getObj();
break;
default:
UNREACHABLE();
break;
}
+
+ return gl::NoError();
}
Clear11::Clear11(Renderer11 *renderer)
: mRenderer(renderer),
- mScissorEnabledRasterizerState(nullptr),
- mScissorDisabledRasterizerState(nullptr),
+ mResourcesInitialized(false),
+ mScissorEnabledRasterizerState(),
+ mScissorDisabledRasterizerState(),
mShaderManager(),
- mConstantBuffer(nullptr),
- mVertexBuffer(nullptr),
+ mConstantBuffer(),
+ mVertexBuffer(),
mShaderData({})
{
- TRACE_EVENT0("gpu.angle", "Clear11::Clear11");
+}
- HRESULT result;
- ID3D11Device *device = renderer->getDevice();
+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>");
@@ -173,55 +187,6 @@ Clear11::Clear11(Renderer11 *renderer)
static_assert((sizeof(RtvDsvClearInfo<float>) % 16 == 0),
"The size of RtvDsvClearInfo<float> should be a multiple of 16bytes.");
- // 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;
-
- result = device->CreateBuffer(&bufferDesc, &initialData, mConstantBuffer.GetAddressOf());
- ASSERT(SUCCEEDED(result));
- d3d11::SetDebugName(mConstantBuffer, "Clear11 Constant Buffer");
-
- const D3D_FEATURE_LEVEL featureLevel = mRenderer->getRenderer11DeviceCaps().featureLevel;
-
- if (featureLevel <= D3D_FEATURE_LEVEL_9_3)
- {
- // 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);
-
- bufferDesc.ByteWidth = vbSize;
- bufferDesc.Usage = D3D11_USAGE_IMMUTABLE;
- bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
- bufferDesc.CPUAccessFlags = 0;
- bufferDesc.MiscFlags = 0;
- bufferDesc.StructureByteStride = 0;
-
- initialData.pSysMem = vbData;
- initialData.SysMemPitch = vbSize;
- initialData.SysMemSlicePitch = initialData.SysMemPitch;
-
- result = device->CreateBuffer(&bufferDesc, &initialData, mVertexBuffer.GetAddressOf());
- ASSERT(SUCCEEDED(result));
- d3d11::SetDebugName(mVertexBuffer, "Clear11 Vertex Buffer");
- }
-
// Create Rasterizer States
D3D11_RASTERIZER_DESC rsDesc;
rsDesc.FillMode = D3D11_FILL_SOLID;
@@ -235,16 +200,12 @@ Clear11::Clear11(Renderer11 *renderer)
rsDesc.MultisampleEnable = FALSE;
rsDesc.AntialiasedLineEnable = FALSE;
- result = device->CreateRasterizerState(&rsDesc, mScissorDisabledRasterizerState.GetAddressOf());
- ASSERT(SUCCEEDED(result));
- d3d11::SetDebugName(mScissorDisabledRasterizerState,
- "Clear11 Rasterizer State with scissor disabled");
+ ANGLE_TRY(mRenderer->allocateResource(rsDesc, &mScissorDisabledRasterizerState));
+ mScissorDisabledRasterizerState.setDebugName("Clear11 Rasterizer State with scissor disabled");
rsDesc.ScissorEnable = TRUE;
- result = device->CreateRasterizerState(&rsDesc, mScissorEnabledRasterizerState.GetAddressOf());
- ASSERT(SUCCEEDED(result));
- d3d11::SetDebugName(mScissorEnabledRasterizerState,
- "Clear11 Rasterizer State with scissor enabled");
+ ANGLE_TRY(mRenderer->allocateResource(rsDesc, &mScissorEnabledRasterizerState));
+ mScissorEnabledRasterizerState.setDebugName("Clear11 Rasterizer State with scissor enabled");
// Initialize Depthstencil state with defaults
mDepthStencilStateKey.depthTest = false;
@@ -276,15 +237,86 @@ Clear11::Clear11(Renderer11 *renderer)
mBlendStateKey.blendState.dither = true;
mBlendStateKey.mrt = false;
memset(mBlendStateKey.rtvMasks, 0, sizeof(mBlendStateKey.rtvMasks));
+
+ mResourcesInitialized = true;
+ return gl::NoError();
}
-Clear11::~Clear11()
+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 ClearParameters &clearParams,
+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:
@@ -364,20 +396,17 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams,
clearParams.colorMaskBlue, clearParams.colorMaskAlpha);
const auto &colorAttachments = fboData.getColorAttachments();
- const auto &drawBufferStates = fboData.getDrawBufferStates();
- for (size_t colorAttachmentIndex = 0; colorAttachmentIndex < colorAttachments.size();
- colorAttachmentIndex++)
+ for (auto colorAttachmentIndex : fboData.getEnabledDrawBuffers())
{
const gl::FramebufferAttachment &attachment = colorAttachments[colorAttachmentIndex];
- if (!clearParams.clearColor[colorAttachmentIndex] || !attachment.isAttached() ||
- drawBufferStates[colorAttachmentIndex] == GL_NONE)
+ if (!clearParams.clearColor[colorAttachmentIndex])
{
continue;
}
RenderTarget11 *renderTarget = nullptr;
- ANGLE_TRY(attachment.getRenderTarget(&renderTarget));
+ ANGLE_TRY(attachment.getRenderTarget(context, &renderTarget));
const gl::InternalFormat &formatInfo = *attachment.getFormat().info;
@@ -487,7 +516,7 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams,
RenderTarget11 *depthStencilRenderTarget = nullptr;
ASSERT(depthStencilAttachment != nullptr);
- ANGLE_TRY(depthStencilAttachment->getRenderTarget(&depthStencilRenderTarget));
+ ANGLE_TRY(depthStencilAttachment->getRenderTarget(context, &depthStencilRenderTarget));
dsv = depthStencilRenderTarget->getDepthStencilView().get();
ASSERT(dsv != nullptr);
@@ -562,7 +591,7 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams,
// Get BlendState
ID3D11BlendState *blendState = nullptr;
- ANGLE_TRY(mRenderer->getStateCache().getBlendState(mBlendStateKey, &blendState));
+ ANGLE_TRY(mRenderer->getBlendState(mBlendStateKey, &blendState));
ID3D11DepthStencilState *dsState = nullptr;
const float *zValue = nullptr;
@@ -576,7 +605,7 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams,
mDepthStencilStateKey.stencilTest = clearParams.clearStencil;
// Get DepthStencilState
- ANGLE_TRY(mRenderer->getStateCache().getDepthStencilState(mDepthStencilStateKey, &dsState));
+ ANGLE_TRY(mRenderer->getDepthStencilState(mDepthStencilStateKey, &dsState));
zValue = clearParams.clearDepth ? &clearParams.depthValue : nullptr;
}
@@ -602,20 +631,22 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams,
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,
+ HRESULT result = deviceContext->Map(mConstantBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0,
&mappedResource);
if (FAILED(result))
{
- return gl::OutOfMemory() << "Clear11: Failed to map CB, " << result;
+ return gl::OutOfMemory() << "Clear11: Failed to map CB, " << gl::FmtHR(result);
}
memcpy(mappedResource.pData, &mShaderData, g_ConstantBufferSize);
- deviceContext->Unmap(mConstantBuffer.Get(), 0);
+ deviceContext->Unmap(mConstantBuffer.get(), 0);
}
// Set the viewport to be the same size as the framebuffer
@@ -639,54 +670,52 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams,
const D3D11_RECT scissorRect = {clearParams.scissor.x, clearParams.scissor.y,
clearParams.scissor.x1(), clearParams.scissor.y1()};
deviceContext->RSSetScissorRects(1, &scissorRect);
- deviceContext->RSSetState(mScissorEnabledRasterizerState.Get());
+ deviceContext->RSSetState(mScissorEnabledRasterizerState.get());
}
else
{
- deviceContext->RSSetState(mScissorDisabledRasterizerState.Get());
+ deviceContext->RSSetState(mScissorDisabledRasterizerState.get());
}
+ auto *stateManager = mRenderer->getStateManager();
+
// Get Shaders
- const D3D_FEATURE_LEVEL fl = mRenderer->getRenderer11DeviceCaps().featureLevel;
- ID3D11Device *device = mRenderer->getDevice();
- ID3D11VertexShader *vs;
- ID3D11InputLayout *il;
- ID3D11PixelShader *ps;
+ const d3d11::VertexShader *vs = nullptr;
+ const d3d11::InputLayout *il = nullptr;
+ const d3d11::PixelShader *ps = nullptr;
- mShaderManager.getShadersAndLayout(device, fl, clearParams.colorType, &il, &vs, &ps);
+ ANGLE_TRY(mShaderManager.getShadersAndLayout(mRenderer, clearParams.colorType, &il, &vs, &ps));
// Apply Shaders
- deviceContext->VSSetShader(vs, nullptr, 0);
- deviceContext->GSSetShader(nullptr, nullptr, 0);
- deviceContext->PSSetShader(ps, nullptr, 0);
- deviceContext->PSSetConstantBuffers(0, 1, mConstantBuffer.GetAddressOf());
+ stateManager->setDrawShaders(vs, nullptr, ps);
+ ID3D11Buffer *constantBuffer = mConstantBuffer.get();
+ deviceContext->PSSetConstantBuffers(0, 1, &constantBuffer);
// Bind IL & VB if needed
deviceContext->IASetIndexBuffer(nullptr, DXGI_FORMAT_UNKNOWN, 0);
- deviceContext->IASetInputLayout(il);
+ stateManager->setInputLayout(il);
- if (mVertexBuffer.Get())
+ if (useVertexBuffer())
{
- const UINT offset = 0;
- deviceContext->IASetVertexBuffers(0, 1, mVertexBuffer.GetAddressOf(), &g_VertexSize,
- &offset);
+ ANGLE_TRY(ensureVertexBufferCreated());
+ stateManager->setSingleVertexBuffer(&mVertexBuffer, g_VertexSize, 0);
}
else
{
- deviceContext->IASetVertexBuffers(0, 0, nullptr, nullptr, nullptr);
+ stateManager->setSingleVertexBuffer(nullptr, 0, 0);
}
- deviceContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
+ stateManager->setPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
// Apply render targets
- mRenderer->getStateManager()->setOneTimeRenderTargets(&rtvs[0], numRtvs, dsv);
+ stateManager->setOneTimeRenderTargets(context, &rtvs[0], numRtvs, dsv);
// Draw the fullscreen quad
deviceContext->Draw(6, 0);
// Clean up
- mRenderer->markAllStateDirty();
+ mRenderer->markAllStateDirty(context);
return gl::NoError();
}
-}
+} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.h
index c623a8a2456..00990951c2e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.h
@@ -38,7 +38,8 @@ class Clear11 : angle::NonCopyable
~Clear11();
// Clears the framebuffer with the supplied clear parameters, assumes that the framebuffer is currently applied.
- gl::Error clearFramebuffer(const ClearParameters &clearParams,
+ gl::Error clearFramebuffer(const gl::Context *context,
+ const ClearParameters &clearParams,
const gl::FramebufferState &fboData);
private:
@@ -47,15 +48,14 @@ class Clear11 : angle::NonCopyable
public:
ShaderManager();
~ShaderManager();
- void getShadersAndLayout(ID3D11Device *device,
- D3D_FEATURE_LEVEL featureLevel,
- const INT clearType,
- ID3D11InputLayout **il,
- ID3D11VertexShader **vs,
- ID3D11PixelShader **ps);
+ gl::Error getShadersAndLayout(Renderer11 *renderer,
+ const INT clearType,
+ const d3d11::InputLayout **il,
+ const d3d11::VertexShader **vs,
+ const d3d11::PixelShader **ps);
private:
- angle::ComPtr<ID3D11InputLayout> mIl9;
+ d3d11::InputLayout mIl9;
d3d11::LazyShader<ID3D11VertexShader> mVs9;
d3d11::LazyShader<ID3D11PixelShader> mPsFloat9;
d3d11::LazyShader<ID3D11VertexShader> mVs;
@@ -64,23 +64,29 @@ class Clear11 : angle::NonCopyable
d3d11::LazyShader<ID3D11PixelShader> mPsSInt;
};
+ bool useVertexBuffer() const;
+ gl::Error ensureConstantBufferCreated();
+ gl::Error ensureVertexBufferCreated();
+ gl::Error ensureResourcesInitialized();
+
Renderer11 *mRenderer;
+ bool mResourcesInitialized;
// States
- angle::ComPtr<ID3D11RasterizerState> mScissorEnabledRasterizerState;
- angle::ComPtr<ID3D11RasterizerState> mScissorDisabledRasterizerState;
+ d3d11::RasterizerState mScissorEnabledRasterizerState;
+ d3d11::RasterizerState mScissorDisabledRasterizerState;
gl::DepthStencilState mDepthStencilStateKey;
d3d11::BlendStateKey mBlendStateKey;
// Shaders and shader resources
ShaderManager mShaderManager;
- angle::ComPtr<ID3D11Buffer> mConstantBuffer;
- angle::ComPtr<ID3D11Buffer> mVertexBuffer;
+ 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/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
index 5a960fe9628..91a3622a5b4 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
@@ -149,39 +149,44 @@ gl::Error Context11::finish()
return mRenderer->finish();
}
-gl::Error Context11::drawArrays(GLenum mode, GLint first, GLsizei count)
+gl::Error Context11::drawArrays(const gl::Context *context, GLenum mode, GLint first, GLsizei count)
{
- return mRenderer->genericDrawArrays(this, mode, first, count, 0);
+ return mRenderer->genericDrawArrays(context, mode, first, count, 0);
}
-gl::Error Context11::drawArraysInstanced(GLenum mode,
+gl::Error Context11::drawArraysInstanced(const gl::Context *context,
+ GLenum mode,
GLint first,
GLsizei count,
GLsizei instanceCount)
{
- return mRenderer->genericDrawArrays(this, mode, first, count, instanceCount);
+ return mRenderer->genericDrawArrays(context, mode, first, count, instanceCount);
}
-gl::Error Context11::drawElements(GLenum mode,
+gl::Error Context11::drawElements(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
const gl::IndexRange &indexRange)
{
- return mRenderer->genericDrawElements(this, mode, count, type, indices, 0, indexRange);
+ return mRenderer->genericDrawElements(context, mode, count, type, indices, 0, indexRange);
}
-gl::Error Context11::drawElementsInstanced(GLenum mode,
+gl::Error Context11::drawElementsInstanced(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
GLsizei instances,
const gl::IndexRange &indexRange)
{
- return mRenderer->genericDrawElements(this, mode, count, type, indices, instances, indexRange);
+ return mRenderer->genericDrawElements(context, mode, count, type, indices, instances,
+ indexRange);
}
-gl::Error Context11::drawRangeElements(GLenum mode,
+gl::Error Context11::drawRangeElements(const gl::Context *context,
+ GLenum mode,
GLuint start,
GLuint end,
GLsizei count,
@@ -189,17 +194,22 @@ gl::Error Context11::drawRangeElements(GLenum mode,
const void *indices,
const gl::IndexRange &indexRange)
{
- return mRenderer->genericDrawElements(this, mode, count, type, indices, 0, indexRange);
+ return mRenderer->genericDrawElements(context, mode, count, type, indices, 0, indexRange);
}
-gl::Error Context11::drawArraysIndirect(GLenum mode, const void *indirect)
+gl::Error Context11::drawArraysIndirect(const gl::Context *context,
+ GLenum mode,
+ const void *indirect)
{
- return mRenderer->genericDrawIndirect(this, mode, GL_NONE, indirect);
+ return mRenderer->genericDrawIndirect(context, mode, GL_NONE, indirect);
}
-gl::Error Context11::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
+gl::Error Context11::drawElementsIndirect(const gl::Context *context,
+ GLenum mode,
+ GLenum type,
+ const void *indirect)
{
- return mRenderer->genericDrawIndirect(this, mode, type, indirect);
+ return mRenderer->genericDrawIndirect(context, mode, type, indirect);
}
GLenum Context11::getResetStatus()
@@ -240,9 +250,9 @@ void Context11::popGroupMarker()
mRenderer->getAnnotator()->endEvent();
}
-void Context11::syncState(const gl::State::DirtyBits &dirtyBits)
+void Context11::syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits)
{
- mRenderer->getStateManager()->syncState(mState.getState(), dirtyBits);
+ mRenderer->getStateManager()->syncState(context, dirtyBits);
}
GLint Context11::getGPUDisjoint()
@@ -255,9 +265,9 @@ GLint64 Context11::getTimestamp()
return mRenderer->getTimestamp();
}
-void Context11::onMakeCurrent(const gl::ContextState &data)
+void Context11::onMakeCurrent(const gl::Context *context)
{
- mRenderer->getStateManager()->onMakeCurrent(data);
+ mRenderer->getStateManager()->onMakeCurrent(context);
}
const gl::Caps &Context11::getNativeCaps() const
@@ -280,9 +290,12 @@ const gl::Limitations &Context11::getNativeLimitations() const
return mRenderer->getNativeLimitations();
}
-gl::Error Context11::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
+gl::Error Context11::dispatchCompute(const gl::Context *context,
+ GLuint numGroupsX,
+ GLuint numGroupsY,
+ GLuint numGroupsZ)
{
- return mRenderer->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ);
+ return mRenderer->dispatchCompute(context, numGroupsX, numGroupsY, numGroupsZ);
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.h
index 69478775219..f11c533f4e2 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.h
@@ -64,32 +64,44 @@ class Context11 : public ContextImpl
gl::Error finish() override;
// Drawing methods.
- gl::Error drawArrays(GLenum mode, GLint first, GLsizei count) override;
- gl::Error drawArraysInstanced(GLenum mode,
+ 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(GLenum mode,
+ gl::Error drawElements(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
const gl::IndexRange &indexRange) override;
- gl::Error drawElementsInstanced(GLenum mode,
+ gl::Error drawElementsInstanced(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
GLsizei instances,
const gl::IndexRange &indexRange) override;
- gl::Error drawRangeElements(GLenum mode,
+ gl::Error drawRangeElements(const gl::Context *context,
+ GLenum mode,
GLuint start,
GLuint end,
GLsizei count,
GLenum type,
const void *indices,
const gl::IndexRange &indexRange) override;
- gl::Error drawArraysIndirect(GLenum mode, const void *indirect) override;
- gl::Error drawElementsIndirect(GLenum mode, GLenum type, const void *indirect) 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;
@@ -104,14 +116,14 @@ class Context11 : public ContextImpl
void popGroupMarker() override;
// State sync with dirty bits.
- void syncState(const gl::State::DirtyBits &dirtyBits) override;
+ 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::ContextState &data) override;
+ void onMakeCurrent(const gl::Context *context) override;
// Caps queries
const gl::Caps &getNativeCaps() const override;
@@ -121,7 +133,10 @@ class Context11 : public ContextImpl
Renderer11 *getRenderer() const { return mRenderer; }
- gl::Error dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ) override;
+ gl::Error dispatchCompute(const gl::Context *context,
+ GLuint numGroupsX,
+ GLuint numGroupsY,
+ GLuint numGroupsZ) override;
private:
Renderer11 *mRenderer;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.cpp
index bf980edc9f6..51449f68372 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.cpp
@@ -33,8 +33,7 @@ gl::Error FenceSetHelper(FenceClass *fence)
HRESULT result = fence->mRenderer->getDevice()->CreateQuery(&queryDesc, &fence->mQuery);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create event query, result: 0x%X.",
- result);
+ return gl::OutOfMemory() << "Failed to create event query, " << gl::FmtHR(result);
}
}
@@ -53,7 +52,7 @@ gl::Error FenceTestHelper(FenceClass *fence, bool flushCommandBuffer, GLboolean
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to get query data, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to get query data, " << gl::FmtHR(result);
}
ASSERT(result == S_OK || result == S_FALSE);
@@ -96,8 +95,7 @@ gl::Error FenceNV11::finish()
if (loopCount % kDeviceLostCheckPeriod == 0 && mRenderer->testDeviceLost())
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Device was lost while querying result of an event query.");
+ return gl::OutOfMemory() << "Device was lost while querying result of an event query.";
}
ScheduleYield();
@@ -193,8 +191,7 @@ gl::Error FenceSync11::clientWait(GLbitfield flags, GLuint64 timeout, GLenum *ou
if ((loopCount % kDeviceLostCheckPeriod) == 0 && mRenderer->testDeviceLost())
{
*outResult = GL_WAIT_FAILED;
- return gl::Error(GL_OUT_OF_MEMORY,
- "Device was lost while querying result of an event query.");
+ return gl::OutOfMemory() << "Device was lost while querying result of an event query.";
}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp
index 4cbabbc2a86..edafee91bf6 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp
@@ -29,7 +29,8 @@ namespace rx
namespace
{
-gl::Error MarkAttachmentsDirty(const gl::FramebufferAttachment *attachment)
+gl::Error MarkAttachmentsDirty(const gl::Context *context,
+ const gl::FramebufferAttachment *attachment)
{
if (attachment && attachment->type() == GL_TEXTURE)
{
@@ -38,7 +39,7 @@ gl::Error MarkAttachmentsDirty(const gl::FramebufferAttachment *attachment)
TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture);
TextureStorage *texStorage = nullptr;
- ANGLE_TRY(textureD3D->getNativeTexture(&texStorage));
+ ANGLE_TRY(textureD3D->getNativeTexture(context, &texStorage));
if (texStorage)
{
@@ -52,14 +53,20 @@ gl::Error MarkAttachmentsDirty(const gl::FramebufferAttachment *attachment)
return gl::NoError();
}
-void UpdateCachedRenderTarget(const gl::FramebufferAttachment *attachment,
+void UpdateCachedRenderTarget(const gl::Context *context,
+ const gl::FramebufferAttachment *attachment,
RenderTarget11 *&cachedRenderTarget,
OnRenderTargetDirtyBinding *channelBinding)
{
RenderTarget11 *newRenderTarget = nullptr;
if (attachment)
{
- attachment->getRenderTarget(&newRenderTarget);
+ // 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)
{
@@ -88,23 +95,23 @@ Framebuffer11::~Framebuffer11()
{
}
-gl::Error Framebuffer11::markAttachmentsDirty() const
+gl::Error Framebuffer11::markAttachmentsDirty(const gl::Context *context) const
{
for (const auto &colorAttachment : mState.getColorAttachments())
{
if (colorAttachment.isAttached())
{
- ANGLE_TRY(MarkAttachmentsDirty(&colorAttachment));
+ ANGLE_TRY(MarkAttachmentsDirty(context, &colorAttachment));
}
}
- ANGLE_TRY(MarkAttachmentsDirty(mState.getDepthAttachment()));
- ANGLE_TRY(MarkAttachmentsDirty(mState.getStencilAttachment()));
+ ANGLE_TRY(MarkAttachmentsDirty(context, mState.getDepthAttachment()));
+ ANGLE_TRY(MarkAttachmentsDirty(context, mState.getStencilAttachment()));
return gl::NoError();
}
-gl::Error Framebuffer11::clearImpl(ContextImpl *context, const ClearParameters &clearParams)
+gl::Error Framebuffer11::clearImpl(const gl::Context *context, const ClearParameters &clearParams)
{
Clear11 *clearer = mRenderer->getClearer();
@@ -120,29 +127,36 @@ gl::Error Framebuffer11::clearImpl(ContextImpl *context, const ClearParameters &
presentPathFastClearParams.scissor.y = framebufferSize.height -
presentPathFastClearParams.scissor.y -
presentPathFastClearParams.scissor.height;
- ANGLE_TRY(clearer->clearFramebuffer(presentPathFastClearParams, mState));
+ ANGLE_TRY(clearer->clearFramebuffer(context, presentPathFastClearParams, mState));
}
else
{
- ANGLE_TRY(clearer->clearFramebuffer(clearParams, mState));
+ ANGLE_TRY(clearer->clearFramebuffer(context, clearParams, mState));
}
- ANGLE_TRY(markAttachmentsDirty());
+ ANGLE_TRY(markAttachmentsDirty(context));
return gl::NoError();
}
-gl::Error Framebuffer11::invalidate(size_t count, const GLenum *attachments)
+gl::Error Framebuffer11::invalidate(const gl::Context *context,
+ size_t count,
+ const GLenum *attachments)
{
- return invalidateBase(count, attachments, false);
+ return invalidateBase(context, count, attachments, false);
}
-gl::Error Framebuffer11::discard(size_t count, const GLenum *attachments)
+gl::Error Framebuffer11::discard(const gl::Context *context,
+ size_t count,
+ const GLenum *attachments)
{
- return invalidateBase(count, attachments, true);
+ return invalidateBase(context, count, attachments, true);
}
-gl::Error Framebuffer11::invalidateBase(size_t count, const GLenum *attachments, bool useEXTBehavior) const
+gl::Error Framebuffer11::invalidateBase(const gl::Context *context,
+ size_t count,
+ const GLenum *attachments,
+ bool useEXTBehavior) const
{
ID3D11DeviceContext1 *deviceContext1 = mRenderer->getDeviceContext1IfSupported();
@@ -183,7 +197,7 @@ gl::Error Framebuffer11::invalidateBase(size_t count, const GLenum *attachments,
auto colorAttachment = mState.getColorAttachment(colorIndex);
if (colorAttachment)
{
- ANGLE_TRY(invalidateAttachment(colorAttachment));
+ ANGLE_TRY(invalidateAttachment(context, colorAttachment));
}
break;
}
@@ -216,31 +230,35 @@ gl::Error Framebuffer11::invalidateBase(size_t count, const GLenum *attachments,
if (discardDepth && mState.getDepthAttachment())
{
- ANGLE_TRY(invalidateAttachment(mState.getDepthAttachment()));
+ ANGLE_TRY(invalidateAttachment(context, mState.getDepthAttachment()));
}
if (discardStencil && mState.getStencilAttachment())
{
- ANGLE_TRY(invalidateAttachment(mState.getStencilAttachment()));
+ ANGLE_TRY(invalidateAttachment(context, mState.getStencilAttachment()));
}
return gl::NoError();
}
-gl::Error Framebuffer11::invalidateSub(size_t, const GLenum *, const gl::Rectangle &)
+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::FramebufferAttachment *attachment) const
+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(&renderTarget));
+ ANGLE_TRY(attachment->getRenderTarget(context, &renderTarget));
const auto &rtv = renderTarget->getRenderTargetView();
if (rtv.valid())
@@ -251,7 +269,8 @@ gl::Error Framebuffer11::invalidateAttachment(const gl::FramebufferAttachment *a
return gl::NoError();
}
-gl::Error Framebuffer11::readPixelsImpl(const gl::Rectangle &area,
+gl::Error Framebuffer11::readPixelsImpl(const gl::Context *context,
+ const gl::Rectangle &area,
GLenum format,
GLenum type,
size_t outputPitch,
@@ -268,14 +287,15 @@ gl::Error Framebuffer11::readPixelsImpl(const gl::Rectangle &area,
PackPixelsParams packParams(area, format, type, static_cast<GLuint>(outputPitch), pack,
reinterpret_cast<ptrdiff_t>(pixels));
- return packBufferStorage->packPixels(*readAttachment, packParams);
+ return packBufferStorage->packPixels(context, *readAttachment, packParams);
}
- return mRenderer->readFromAttachment(*readAttachment, area, format, type,
+ return mRenderer->readFromAttachment(context, *readAttachment, area, format, type,
static_cast<GLuint>(outputPitch), pack, pixels);
}
-gl::Error Framebuffer11::blitImpl(const gl::Rectangle &sourceArea,
+gl::Error Framebuffer11::blitImpl(const gl::Context *context,
+ const gl::Rectangle &sourceArea,
const gl::Rectangle &destArea,
const gl::Rectangle *scissor,
bool blitRenderTarget,
@@ -290,7 +310,7 @@ gl::Error Framebuffer11::blitImpl(const gl::Rectangle &sourceArea,
ASSERT(readBuffer);
RenderTargetD3D *readRenderTarget = nullptr;
- ANGLE_TRY(readBuffer->getRenderTarget(&readRenderTarget));
+ ANGLE_TRY(readBuffer->getRenderTarget(context, &readRenderTarget));
ASSERT(readRenderTarget);
const auto &colorAttachments = mState.getColorAttachments();
@@ -304,7 +324,7 @@ gl::Error Framebuffer11::blitImpl(const gl::Rectangle &sourceArea,
drawBufferStates[colorAttachment] != GL_NONE)
{
RenderTargetD3D *drawRenderTarget = nullptr;
- ANGLE_TRY(drawBuffer.getRenderTarget(&drawRenderTarget));
+ ANGLE_TRY(drawBuffer.getRenderTarget(context, &drawRenderTarget));
ASSERT(drawRenderTarget);
const bool invertColorSource = UsePresentPathFast(mRenderer, readBuffer);
@@ -326,8 +346,8 @@ gl::Error Framebuffer11::blitImpl(const gl::Rectangle &sourceArea,
}
ANGLE_TRY(mRenderer->blitRenderbufferRect(
- actualSourceArea, actualDestArea, readRenderTarget, drawRenderTarget, filter,
- scissor, blitRenderTarget, false, false));
+ context, actualSourceArea, actualDestArea, readRenderTarget, drawRenderTarget,
+ filter, scissor, blitRenderTarget, false, false));
}
}
}
@@ -338,22 +358,22 @@ gl::Error Framebuffer11::blitImpl(const gl::Rectangle &sourceArea,
ASSERT(readBuffer);
RenderTargetD3D *readRenderTarget = nullptr;
- ANGLE_TRY(readBuffer->getRenderTarget(&readRenderTarget));
+ ANGLE_TRY(readBuffer->getRenderTarget(context, &readRenderTarget));
ASSERT(readRenderTarget);
const gl::FramebufferAttachment *drawBuffer = mState.getDepthOrStencilAttachment();
ASSERT(drawBuffer);
RenderTargetD3D *drawRenderTarget = nullptr;
- ANGLE_TRY(drawBuffer->getRenderTarget(&drawRenderTarget));
+ ANGLE_TRY(drawBuffer->getRenderTarget(context, &drawRenderTarget));
ASSERT(drawRenderTarget);
- ANGLE_TRY(mRenderer->blitRenderbufferRect(sourceArea, destArea, readRenderTarget,
+ ANGLE_TRY(mRenderer->blitRenderbufferRect(context, sourceArea, destArea, readRenderTarget,
drawRenderTarget, filter, scissor, false,
blitDepth, blitStencil));
}
- ANGLE_TRY(markAttachmentsDirty());
+ ANGLE_TRY(markAttachmentsDirty(context));
return gl::NoError();
}
@@ -363,23 +383,22 @@ GLenum Framebuffer11::getRenderTargetImplementationFormat(RenderTargetD3D *rende
return renderTarget11->getFormatSet().format().fboImplementationInternalFormat;
}
-void Framebuffer11::updateColorRenderTarget(size_t colorIndex)
+void Framebuffer11::updateColorRenderTarget(const gl::Context *context, size_t colorIndex)
{
- UpdateCachedRenderTarget(mState.getColorAttachment(colorIndex),
+ UpdateCachedRenderTarget(context, mState.getColorAttachment(colorIndex),
mCachedColorRenderTargets[colorIndex],
&mColorRenderTargetsDirty[colorIndex]);
}
-void Framebuffer11::updateDepthStencilRenderTarget()
+void Framebuffer11::updateDepthStencilRenderTarget(const gl::Context *context)
{
- UpdateCachedRenderTarget(mState.getDepthOrStencilAttachment(), mCachedDepthStencilRenderTarget,
- &mDepthStencilRenderTargetDirty);
+ UpdateCachedRenderTarget(context, mState.getDepthOrStencilAttachment(),
+ mCachedDepthStencilRenderTarget, &mDepthStencilRenderTargetDirty);
}
-void Framebuffer11::syncState(ContextImpl *contextImpl, const gl::Framebuffer::DirtyBits &dirtyBits)
+void Framebuffer11::syncState(const gl::Context *context,
+ const gl::Framebuffer::DirtyBits &dirtyBits)
{
- mRenderer->getStateManager()->invalidateRenderTarget();
-
const auto &mergedDirtyBits = dirtyBits | mInternalDirtyBits;
mInternalDirtyBits.reset();
@@ -389,7 +408,7 @@ void Framebuffer11::syncState(ContextImpl *contextImpl, const gl::Framebuffer::D
{
case gl::Framebuffer::DIRTY_BIT_DEPTH_ATTACHMENT:
case gl::Framebuffer::DIRTY_BIT_STENCIL_ATTACHMENT:
- updateDepthStencilRenderTarget();
+ updateDepthStencilRenderTarget(context);
break;
case gl::Framebuffer::DIRTY_BIT_DRAW_BUFFERS:
case gl::Framebuffer::DIRTY_BIT_READ_BUFFER:
@@ -400,7 +419,7 @@ void Framebuffer11::syncState(ContextImpl *contextImpl, const gl::Framebuffer::D
dirtyBit < gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_MAX);
size_t colorIndex =
static_cast<size_t>(dirtyBit - gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0);
- updateColorRenderTarget(colorIndex);
+ updateColorRenderTarget(context, colorIndex);
break;
}
}
@@ -409,7 +428,10 @@ void Framebuffer11::syncState(ContextImpl *contextImpl, const gl::Framebuffer::D
// We should not have dirtied any additional state during our sync.
ASSERT(!mInternalDirtyBits.any());
- FramebufferD3D::syncState(contextImpl, dirtyBits);
+ FramebufferD3D::syncState(context, dirtyBits);
+
+ // Call this last to allow the state manager to take advantage of the cached render targets.
+ mRenderer->getStateManager()->invalidateRenderTarget(context);
}
void Framebuffer11::signal(size_t channelID)
@@ -438,9 +460,23 @@ bool Framebuffer11::hasAnyInternalDirtyBit() const
return mInternalDirtyBits.any();
}
-void Framebuffer11::syncInternalState(ContextImpl *contextImpl)
+void Framebuffer11::syncInternalState(const gl::Context *context)
+{
+ syncState(context, gl::Framebuffer::DirtyBits());
+}
+
+RenderTarget11 *Framebuffer11::getFirstRenderTarget() const
{
- syncState(contextImpl, gl::Framebuffer::DirtyBits());
+ ASSERT(mInternalDirtyBits.none());
+ for (auto *renderTarget : mCachedColorRenderTargets)
+ {
+ if (renderTarget)
+ {
+ return renderTarget;
+ }
+ }
+
+ return mCachedDepthStencilRenderTarget;
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h
index 383caf60d7c..6af6daa600f 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h
@@ -23,14 +23,20 @@ class Framebuffer11 : public FramebufferD3D, public OnRenderTargetDirtyReceiver
Framebuffer11(const gl::FramebufferState &data, Renderer11 *renderer);
virtual ~Framebuffer11();
- gl::Error discard(size_t count, const GLenum *attachments) override;
- gl::Error invalidate(size_t count, const GLenum *attachments) override;
- gl::Error invalidateSub(size_t count, const GLenum *attachments, const gl::Rectangle &area) 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::Error markAttachmentsDirty(const gl::Context *context) const;
- void syncState(ContextImpl *contextImpl, const gl::Framebuffer::DirtyBits &dirtyBits) override;
+ void syncState(const gl::Context *context,
+ const gl::Framebuffer::DirtyBits &dirtyBits) override;
const RenderTargetArray &getCachedColorRenderTargets() const
{
@@ -41,24 +47,28 @@ class Framebuffer11 : public FramebufferD3D, public OnRenderTargetDirtyReceiver
return mCachedDepthStencilRenderTarget;
}
+ RenderTarget11 *getFirstRenderTarget() const;
+
bool hasAnyInternalDirtyBit() const;
- void syncInternalState(ContextImpl *contextImpl);
+ void syncInternalState(const gl::Context *context);
void signal(size_t channelID) override;
gl::Error getSamplePosition(size_t index, GLfloat *xy) const override;
private:
- gl::Error clearImpl(ContextImpl *context, const ClearParameters &clearParams) override;
+ gl::Error clearImpl(const gl::Context *context, const ClearParameters &clearParams) override;
- gl::Error readPixelsImpl(const gl::Rectangle &area,
+ 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) const override;
- gl::Error blitImpl(const gl::Rectangle &sourceArea,
+ gl::Error blitImpl(const gl::Context *context,
+ const gl::Rectangle &sourceArea,
const gl::Rectangle &destArea,
const gl::Rectangle *scissor,
bool blitRenderTarget,
@@ -67,13 +77,17 @@ class Framebuffer11 : public FramebufferD3D, public OnRenderTargetDirtyReceiver
GLenum filter,
const gl::Framebuffer *sourceFramebuffer) override;
- gl::Error invalidateBase(size_t count, const GLenum *attachments, bool useEXTBehavior) const;
- gl::Error invalidateAttachment(const gl::FramebufferAttachment *attachment) const;
+ 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(size_t colorIndex);
- void updateDepthStencilRenderTarget();
+ void updateColorRenderTarget(const gl::Context *context, size_t colorIndex);
+ void updateDepthStencilRenderTarget(const gl::Context *context);
Renderer11 *const mRenderer;
RenderTargetArray mCachedColorRenderTargets;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Image11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Image11.cpp
index 6b9998c52ef..780587f1506 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Image11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Image11.cpp
@@ -23,10 +23,88 @@
namespace rx
{
+namespace
+{
+void CopyColor(gl::ColorF *color)
+{
+ // No-op
+}
+
+void PremultiplyAlpha(gl::ColorF *color)
+{
+ color->red *= color->alpha;
+ color->green *= color->alpha;
+ color->blue *= color->alpha;
+}
+
+void UnmultiplyAlpha(gl::ColorF *color)
+{
+ if (color->alpha != 0.0f)
+ {
+ float invAlpha = 1.0f / color->alpha;
+ color->red *= invAlpha;
+ color->green *= invAlpha;
+ color->blue *= invAlpha;
+ }
+}
+
+void ClipChannelsR(gl::ColorF *color)
+{
+ color->green = 0.0f;
+ color->blue = 0.0f;
+ color->alpha = 1.0f;
+}
+
+void ClipChannelsRG(gl::ColorF *color)
+{
+ color->blue = 0.0f;
+ color->alpha = 1.0f;
+}
+
+void ClipChannelsRGB(gl::ColorF *color)
+{
+ color->alpha = 1.0f;
+}
+
+void ClipChannelsLuminance(gl::ColorF *color)
+{
+ color->alpha = 1.0f;
+}
+
+void ClipChannelsAlpha(gl::ColorF *color)
+{
+ color->red = 0.0f;
+ color->green = 0.0f;
+ color->blue = 0.0f;
+}
+
+void ClipChannelsNoOp(gl::ColorF *color)
+{
+}
+
+void WriteUintColor(const gl::ColorF &color,
+ ColorWriteFunction colorWriteFunction,
+ uint8_t *destPixelData)
+{
+ gl::ColorUI destColor(
+ static_cast<unsigned int>(color.red * 255), static_cast<unsigned int>(color.green * 255),
+ static_cast<unsigned int>(color.red * 255), static_cast<unsigned int>(color.alpha * 255));
+ colorWriteFunction(reinterpret_cast<const uint8_t *>(&destColor), destPixelData);
+}
+
+void WriteFloatColor(const gl::ColorF &color,
+ ColorWriteFunction colorWriteFunction,
+ uint8_t *destPixelData)
+{
+ colorWriteFunction(reinterpret_cast<const uint8_t *>(&color), destPixelData);
+}
+
+} // anonymous namespace
+
Image11::Image11(Renderer11 *renderer)
: mRenderer(renderer),
mDXGIFormat(DXGI_FORMAT_UNKNOWN),
- mStagingTexture(nullptr),
+ mStagingTexture(),
mStagingSubresource(0),
mRecoverFromStorage(false),
mAssociatedStorage(nullptr),
@@ -41,7 +119,9 @@ Image11::~Image11()
releaseStagingTexture();
}
-gl::Error Image11::generateMipmap(Image11 *dest,
+// static
+gl::Error Image11::GenerateMipmap(const gl::Context *context,
+ Image11 *dest,
Image11 *src,
const Renderer11DeviceCaps &rendererCaps)
{
@@ -50,10 +130,10 @@ gl::Error Image11::generateMipmap(Image11 *dest,
ASSERT(src->getHeight() == 1 || src->getHeight() / 2 == dest->getHeight());
D3D11_MAPPED_SUBRESOURCE destMapped;
- ANGLE_TRY(dest->map(D3D11_MAP_WRITE, &destMapped));
+ ANGLE_TRY(dest->map(context, D3D11_MAP_WRITE, &destMapped));
D3D11_MAPPED_SUBRESOURCE srcMapped;
- gl::Error error = src->map(D3D11_MAP_READ, &srcMapped);
+ gl::Error error = src->map(context, D3D11_MAP_READ, &srcMapped);
if (error.isError())
{
dest->unmap();
@@ -77,12 +157,129 @@ gl::Error Image11::generateMipmap(Image11 *dest,
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);
+ uint8_t *destData = reinterpret_cast<uint8_t *>(destMapped.pData);
+
+ using ConversionFunction = void (*)(gl::ColorF *);
+ ConversionFunction conversionFunction = CopyColor;
+ if (unpackPremultiplyAlpha != unpackUnmultiplyAlpha)
+ {
+ if (unpackPremultiplyAlpha)
+ {
+ conversionFunction = PremultiplyAlpha;
+ }
+ else
+ {
+ conversionFunction = UnmultiplyAlpha;
+ }
+ }
+
+ auto clipChannelsFunction = ClipChannelsNoOp;
+ switch (destUnsizedFormat)
+ {
+ case GL_RED:
+ clipChannelsFunction = ClipChannelsR;
+ break;
+ case GL_RG:
+ clipChannelsFunction = ClipChannelsRG;
+ break;
+ case GL_RGB:
+ clipChannelsFunction = ClipChannelsRGB;
+ break;
+ case GL_LUMINANCE:
+ clipChannelsFunction = ClipChannelsLuminance;
+ break;
+ case GL_ALPHA:
+ clipChannelsFunction = ClipChannelsAlpha;
+ break;
+ }
+
+ auto writeFunction =
+ (destFormatInfo.componentType == GL_UNSIGNED_INT) ? WriteUintColor : WriteFloatColor;
+
+ for (int y = 0; y < sourceRect.height; y++)
+ {
+ for (int x = 0; x < sourceRect.width; x++)
+ {
+ int sourceX = sourceRect.x + x;
+ int sourceY = sourceRect.y + y;
+ const uint8_t *sourcePixelData =
+ sourceData + sourceY * srcMapped.RowPitch + sourceX * sourcePixelBytes;
+
+ gl::ColorF sourceColor;
+ sourceFormat.colorReadFunction(sourcePixelData,
+ reinterpret_cast<uint8_t *>(&sourceColor));
+
+ conversionFunction(&sourceColor);
+ clipChannelsFunction(&sourceColor);
+
+ int destX = destOffset.x + x;
+ int destY = destOffset.y;
+ if (unpackFlipY)
+ {
+ destY += (sourceRect.height - 1);
+ destY -= y;
+ }
+ else
+ {
+ destY += y;
+ }
+
+ uint8_t *destPixelData =
+ destData + destY * destMapped.RowPitch + destX * destPixelBytes;
+ writeFunction(sourceColor, destFormat.colorWriteFunction, destPixelData);
+ }
+ }
+
+ 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) then isDirty should still return false.
- if (mDirty && !mStagingTexture && !mRecoverFromStorage)
+ // texture will suffice) AND robust resource initialization is not enabled then isDirty should
+ // still return false.
+ if (mDirty && !mStagingTexture.valid() && !mRecoverFromStorage &&
+ !mRenderer->isRobustResourceInitEnabled())
{
const Renderer11DeviceCaps &deviceCaps = mRenderer->getRenderer11DeviceCaps();
const auto &formatInfo = d3d11::Format::Get(mInternalFormat, deviceCaps);
@@ -95,7 +292,8 @@ bool Image11::isDirty() const
return mDirty;
}
-gl::Error Image11::copyToStorage(TextureStorage *storage,
+gl::Error Image11::copyToStorage(const gl::Context *context,
+ TextureStorage *storage,
const gl::ImageIndex &index,
const gl::Box &region)
{
@@ -111,14 +309,14 @@ gl::Error Image11::copyToStorage(TextureStorage *storage,
{
// 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(index, this));
+ ANGLE_TRY(storage11->releaseAssociatedImage(context, index, this));
}
- ID3D11Resource *stagingTexture = nullptr;
+ const TextureHelper11 *stagingTexture = nullptr;
unsigned int stagingSubresourceIndex = 0;
ANGLE_TRY(getStagingTexture(&stagingTexture, &stagingSubresourceIndex));
- ANGLE_TRY(
- storage11->updateSubresourceLevel(stagingTexture, stagingSubresourceIndex, index, region));
+ 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)
@@ -138,7 +336,7 @@ void Image11::verifyAssociatedStorageValid(TextureStorage11 *textureStorage) con
ASSERT(mAssociatedStorage == textureStorage);
}
-gl::Error Image11::recoverFromAssociatedStorage()
+gl::Error Image11::recoverFromAssociatedStorage(const gl::Context *context)
{
if (mRecoverFromStorage)
{
@@ -148,8 +346,8 @@ gl::Error Image11::recoverFromAssociatedStorage()
// CopySubResource from the Storage to the Staging texture
gl::Box region(0, 0, 0, mWidth, mHeight, mDepth);
- ANGLE_TRY(mAssociatedStorage->copySubresourceLevel(mStagingTexture, mStagingSubresource,
- mAssociatedImageIndex, region));
+ ANGLE_TRY(mAssociatedStorage->copySubresourceLevel(
+ context, mStagingTexture, mStagingSubresource, mAssociatedImageIndex, region));
mRecoveredFromStorageCount += 1;
// Reset all the recovery parameters, even if the texture storage association is broken.
@@ -198,7 +396,8 @@ bool Image11::redefine(GLenum target,
mRenderable = (formatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN);
releaseStagingTexture();
- mDirty = (formatInfo.dataInitializerFunction != nullptr);
+ mDirty = (formatInfo.dataInitializerFunction != nullptr) ||
+ mRenderer->isRobustResourceInitEnabled();
return true;
}
@@ -218,7 +417,8 @@ DXGI_FORMAT Image11::getDXGIFormat() const
// 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::Box &area,
+gl::Error Image11::loadData(const gl::Context *context,
+ const gl::Box &area,
const gl::PixelUnpackState &unpack,
GLenum type,
const void *input,
@@ -245,7 +445,7 @@ gl::Error Image11::loadData(const gl::Box &area,
LoadImageFunction loadFunction = d3dFormatInfo.getLoadFunctions()(type).loadFunction;
D3D11_MAPPED_SUBRESOURCE mappedImage;
- ANGLE_TRY(map(D3D11_MAP_WRITE, &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 +
@@ -259,7 +459,9 @@ gl::Error Image11::loadData(const gl::Box &area,
return gl::NoError();
}
-gl::Error Image11::loadCompressedData(const gl::Box &area, const void *input)
+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;
@@ -281,7 +483,7 @@ gl::Error Image11::loadCompressedData(const gl::Box &area, const void *input)
d3dFormatInfo.getLoadFunctions()(GL_UNSIGNED_BYTE).loadFunction;
D3D11_MAPPED_SUBRESOURCE mappedImage;
- ANGLE_TRY(map(D3D11_MAP_WRITE, &mappedImage));
+ ANGLE_TRY(map(context, D3D11_MAP_WRITE, &mappedImage));
uint8_t *offsetMappedData =
reinterpret_cast<uint8_t *>(mappedImage.pData) +
@@ -297,22 +499,23 @@ gl::Error Image11::loadCompressedData(const gl::Box &area, const void *input)
return gl::NoError();
}
-gl::Error Image11::copyFromTexStorage(const gl::ImageIndex &imageIndex, TextureStorage *source)
+gl::Error Image11::copyFromTexStorage(const gl::Context *context,
+ const gl::ImageIndex &imageIndex,
+ TextureStorage *source)
{
TextureStorage11 *storage11 = GetAs<TextureStorage11>(source);
- ID3D11Resource *resource = nullptr;
- ANGLE_TRY(storage11->getResource(&resource));
+ const TextureHelper11 *textureHelper = nullptr;
+ ANGLE_TRY(storage11->getResource(context, &textureHelper));
UINT subresourceIndex = storage11->getSubresourceIndex(imageIndex);
- TextureHelper11 textureHelper =
- TextureHelper11::MakeAndReference(resource, storage11->getFormatSet());
gl::Box sourceBox(0, 0, 0, mWidth, mHeight, mDepth);
- return copyWithoutConversion(gl::Offset(), sourceBox, textureHelper, subresourceIndex);
+ return copyWithoutConversion(gl::Offset(), sourceBox, *textureHelper, subresourceIndex);
}
-gl::Error Image11::copyFromFramebuffer(const gl::Offset &destOffset,
+gl::Error Image11::copyFromFramebuffer(const gl::Context *context,
+ const gl::Offset &destOffset,
const gl::Rectangle &sourceArea,
const gl::Framebuffer *sourceFBO)
{
@@ -325,14 +528,11 @@ gl::Error Image11::copyFromFramebuffer(const gl::Offset &destOffset,
if (d3d11Format.texFormat == mDXGIFormat && sourceInternalFormat == mInternalFormat)
{
- RenderTargetD3D *renderTarget = nullptr;
- ANGLE_TRY(srcAttachment->getRenderTarget(&renderTarget));
+ RenderTarget11 *rt11 = nullptr;
+ ANGLE_TRY(srcAttachment->getRenderTarget(context, &rt11));
+ ASSERT(rt11->getTexture().get());
- RenderTarget11 *rt11 = GetAs<RenderTarget11>(renderTarget);
- ASSERT(rt11->getTexture());
-
- TextureHelper11 textureHelper =
- TextureHelper11::MakeAndReference(rt11->getTexture(), rt11->getFormatSet());
+ TextureHelper11 textureHelper = rt11->getTexture();
unsigned int sourceSubResource = rt11->getSubresourceIndex();
gl::Box sourceBox(sourceArea.x, sourceArea.y, 0, sourceArea.width, sourceArea.height, 1);
@@ -342,7 +542,7 @@ gl::Error Image11::copyFromFramebuffer(const gl::Offset &destOffset,
// This format requires conversion, so we must copy the texture to staging and manually convert
// via readPixels
D3D11_MAPPED_SUBRESOURCE mappedImage;
- ANGLE_TRY(map(D3D11_MAP_WRITE, &mappedImage));
+ ANGLE_TRY(map(context, D3D11_MAP_WRITE, &mappedImage));
// determine the offset coordinate into the destination buffer
const auto &dxgiFormatInfo = d3d11::GetDXGIFormatSizeInfo(mDXGIFormat);
@@ -365,9 +565,9 @@ gl::Error Image11::copyFromFramebuffer(const gl::Offset &destOffset,
mRenderer->getScratchMemoryBuffer(bufferSize, &memoryBuffer);
GLuint memoryBufferRowPitch = destFormatInfo.pixelBytes * sourceArea.width;
- error = mRenderer->readFromAttachment(*srcAttachment, sourceArea, destFormatInfo.format,
- destFormatInfo.type, memoryBufferRowPitch,
- gl::PixelPackState(), memoryBuffer->data());
+ 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,
@@ -375,9 +575,9 @@ gl::Error Image11::copyFromFramebuffer(const gl::Offset &destOffset,
}
else
{
- error = mRenderer->readFromAttachment(*srcAttachment, sourceArea, destFormatInfo.format,
- destFormatInfo.type, mappedImage.RowPitch,
- gl::PixelPackState(), dataOffset);
+ error = mRenderer->readFromAttachment(
+ context, *srcAttachment, sourceArea, destFormatInfo.format, destFormatInfo.type,
+ mappedImage.RowPitch, gl::PixelPackState(), dataOffset);
}
unmap();
@@ -392,22 +592,23 @@ gl::Error Image11::copyWithoutConversion(const gl::Offset &destOffset,
UINT sourceSubResource)
{
// No conversion needed-- use copyback fastpath
- ID3D11Resource *stagingTexture = nullptr;
+ const TextureHelper11 *stagingTexture = nullptr;
unsigned int stagingSubresourceIndex = 0;
ANGLE_TRY(getStagingTexture(&stagingTexture, &stagingSubresourceIndex));
- ID3D11Device *device = mRenderer->getDevice();
ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- UINT subresourceAfterResolve = sourceSubResource;
-
- ID3D11Resource *srcTex = nullptr;
const gl::Extents &extents = textureHelper.getExtents();
- bool needResolve =
- (textureHelper.getTextureType() == GL_TEXTURE_2D && textureHelper.getSampleCount() > 1);
+ 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 (needResolve)
+ if (textureHelper.is2D() && textureHelper.getSampleCount() > 1)
{
D3D11_TEXTURE2D_DESC resolveDesc;
resolveDesc.Width = extents.width;
@@ -422,64 +623,45 @@ gl::Error Image11::copyWithoutConversion(const gl::Offset &destOffset,
resolveDesc.CPUAccessFlags = 0;
resolveDesc.MiscFlags = 0;
- ID3D11Texture2D *srcTex2D = nullptr;
- HRESULT result = device->CreateTexture2D(&resolveDesc, nullptr, &srcTex2D);
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create resolve texture for Image11::copy, HRESULT: 0x%X.",
- result);
- }
- srcTex = srcTex2D;
+ d3d11::Texture2D resolveTex;
+ ANGLE_TRY(mRenderer->allocateResource(resolveDesc, &resolveTex));
- deviceContext->ResolveSubresource(srcTex, 0, textureHelper.getTexture2D(),
+ deviceContext->ResolveSubresource(resolveTex.get(), 0, textureHelper.get(),
sourceSubResource, textureHelper.getFormat());
- subresourceAfterResolve = 0;
+
+ deviceContext->CopySubresourceRegion(stagingTexture->get(), stagingSubresourceIndex,
+ destOffset.x, destOffset.y, destOffset.z,
+ resolveTex.get(), 0, &srcBox);
}
else
{
- srcTex = textureHelper.getResource();
- }
-
- 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;
-
- deviceContext->CopySubresourceRegion(stagingTexture, stagingSubresourceIndex, destOffset.x,
- destOffset.y, destOffset.z, srcTex,
- subresourceAfterResolve, &srcBox);
-
- if (needResolve)
- {
- SafeRelease(srcTex);
+ deviceContext->CopySubresourceRegion(stagingTexture->get(), stagingSubresourceIndex,
+ destOffset.x, destOffset.y, destOffset.z,
+ textureHelper.get(), sourceSubResource, &srcBox);
}
mDirty = true;
return gl::NoError();
}
-gl::Error Image11::getStagingTexture(ID3D11Resource **outStagingTexture,
+gl::Error Image11::getStagingTexture(const TextureHelper11 **outStagingTexture,
unsigned int *outSubresourceIndex)
{
ANGLE_TRY(createStagingTexture());
- *outStagingTexture = mStagingTexture;
+ *outStagingTexture = &mStagingTexture;
*outSubresourceIndex = mStagingSubresource;
return gl::NoError();
}
void Image11::releaseStagingTexture()
{
- SafeRelease(mStagingTexture);
+ mStagingTexture.reset();
}
gl::Error Image11::createStagingTexture()
{
- if (mStagingTexture)
+ if (mStagingTexture.valid())
{
return gl::NoError();
}
@@ -487,9 +669,8 @@ gl::Error Image11::createStagingTexture()
ASSERT(mWidth > 0 && mHeight > 0 && mDepth > 0);
const DXGI_FORMAT dxgiFormat = getDXGIFormat();
-
- ID3D11Device *device = mRenderer->getDevice();
- HRESULT result;
+ const auto &formatInfo =
+ d3d11::Format::Get(mInternalFormat, mRenderer->getRenderer11DeviceCaps());
int lodOffset = 1;
GLsizei width = mWidth;
@@ -500,8 +681,6 @@ gl::Error Image11::createStagingTexture()
if (mTarget == GL_TEXTURE_3D)
{
- ID3D11Texture3D *newTexture = nullptr;
-
D3D11_TEXTURE3D_DESC desc;
desc.Width = width;
desc.Height = height;
@@ -513,8 +692,7 @@ gl::Error Image11::createStagingTexture()
desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;
- if (d3d11::Format::Get(mInternalFormat, mRenderer->getRenderer11DeviceCaps())
- .dataInitializerFunction != nullptr)
+ if (formatInfo.dataInitializerFunction != nullptr)
{
std::vector<D3D11_SUBRESOURCE_DATA> initialData;
std::vector<std::vector<BYTE>> textureData;
@@ -522,28 +700,19 @@ gl::Error Image11::createStagingTexture()
width, height, mDepth, lodOffset + 1, &initialData,
&textureData);
- result = device->CreateTexture3D(&desc, initialData.data(), &newTexture);
+ ANGLE_TRY(
+ mRenderer->allocateTexture(desc, formatInfo, initialData.data(), &mStagingTexture));
}
else
{
- result = device->CreateTexture3D(&desc, nullptr, &newTexture);
+ ANGLE_TRY(mRenderer->allocateTexture(desc, formatInfo, &mStagingTexture));
}
- if (FAILED(result))
- {
- ASSERT(result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create staging texture, result: 0x%X.",
- result);
- }
-
- mStagingTexture = newTexture;
mStagingSubresource = D3D11CalcSubresource(lodOffset, 0, lodOffset + 1);
}
else if (mTarget == GL_TEXTURE_2D || mTarget == GL_TEXTURE_2D_ARRAY ||
mTarget == GL_TEXTURE_CUBE_MAP)
{
- ID3D11Texture2D *newTexture = nullptr;
-
D3D11_TEXTURE2D_DESC desc;
desc.Width = width;
desc.Height = height;
@@ -557,8 +726,7 @@ gl::Error Image11::createStagingTexture()
desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;
- if (d3d11::Format::Get(mInternalFormat, mRenderer->getRenderer11DeviceCaps())
- .dataInitializerFunction != nullptr)
+ if (formatInfo.dataInitializerFunction != nullptr)
{
std::vector<D3D11_SUBRESOURCE_DATA> initialData;
std::vector<std::vector<BYTE>> textureData;
@@ -566,21 +734,14 @@ gl::Error Image11::createStagingTexture()
width, height, 1, lodOffset + 1, &initialData,
&textureData);
- result = device->CreateTexture2D(&desc, initialData.data(), &newTexture);
+ ANGLE_TRY(
+ mRenderer->allocateTexture(desc, formatInfo, initialData.data(), &mStagingTexture));
}
else
{
- result = device->CreateTexture2D(&desc, nullptr, &newTexture);
- }
-
- if (FAILED(result))
- {
- ASSERT(result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create staging texture, result: 0x%X.",
- result);
+ ANGLE_TRY(mRenderer->allocateTexture(desc, formatInfo, &mStagingTexture));
}
- mStagingTexture = newTexture;
mStagingSubresource = D3D11CalcSubresource(lodOffset, 0, lodOffset + 1);
}
else
@@ -592,19 +753,19 @@ gl::Error Image11::createStagingTexture()
return gl::NoError();
}
-gl::Error Image11::map(D3D11_MAP mapType, D3D11_MAPPED_SUBRESOURCE *map)
+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());
+ ANGLE_TRY(recoverFromAssociatedStorage(context));
- ID3D11Resource *stagingTexture = nullptr;
+ const TextureHelper11 *stagingTexture = nullptr;
unsigned int subresourceIndex = 0;
ANGLE_TRY(getStagingTexture(&stagingTexture, &subresourceIndex));
ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- ASSERT(mStagingTexture);
- HRESULT result = deviceContext->Map(stagingTexture, subresourceIndex, mapType, 0, map);
+ ASSERT(stagingTexture && stagingTexture->valid());
+ HRESULT result = deviceContext->Map(stagingTexture->get(), subresourceIndex, mapType, 0, map);
if (FAILED(result))
{
@@ -613,7 +774,7 @@ gl::Error Image11::map(D3D11_MAP mapType, D3D11_MAPPED_SUBRESOURCE *map)
{
mRenderer->notifyDeviceLost();
}
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to map staging texture, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to map staging texture, " << gl::FmtHR(result);
}
mDirty = true;
@@ -623,10 +784,10 @@ gl::Error Image11::map(D3D11_MAP mapType, D3D11_MAPPED_SUBRESOURCE *map)
void Image11::unmap()
{
- if (mStagingTexture)
+ if (mStagingTexture.valid())
{
ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- deviceContext->Unmap(mStagingTexture, mStagingSubresource);
+ deviceContext->Unmap(mStagingTexture.get(), mStagingSubresource);
}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Image11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Image11.h
index 0373043dc0e..1adcf688b75 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Image11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Image11.h
@@ -10,10 +10,10 @@
#ifndef LIBANGLE_RENDERER_D3D_D3D11_IMAGE11_H_
#define LIBANGLE_RENDERER_D3D_D3D11_IMAGE11_H_
-#include "libANGLE/renderer/d3d/ImageD3D.h"
-#include "libANGLE/ImageIndex.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
{
@@ -33,36 +33,55 @@ class Image11 : public ImageD3D
Image11(Renderer11 *renderer);
virtual ~Image11();
- static gl::Error generateMipmap(Image11 *dest,
+ 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);
virtual bool isDirty() const;
- virtual gl::Error copyToStorage(TextureStorage *storage, const gl::ImageIndex &index, const gl::Box &region);
+ 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::Box &area,
+ 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::Box &area, const void *input) override;
-
- gl::Error copyFromTexStorage(const gl::ImageIndex &imageIndex, TextureStorage *source) override;
- gl::Error copyFromFramebuffer(const gl::Offset &destOffset,
+ 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();
+ gl::Error recoverFromAssociatedStorage(const gl::Context *context);
void verifyAssociatedStorageValid(TextureStorage11 *textureStorage) const;
void disassociateStorage();
protected:
- gl::Error map(D3D11_MAP mapType, D3D11_MAPPED_SUBRESOURCE *map);
+ gl::Error map(const gl::Context *context, D3D11_MAP mapType, D3D11_MAPPED_SUBRESOURCE *map);
void unmap();
private:
@@ -71,14 +90,15 @@ class Image11 : public ImageD3D
const TextureHelper11 &textureHelper,
UINT sourceSubResource);
- gl::Error getStagingTexture(ID3D11Resource **outStagingTexture, unsigned int *outSubresourceIndex);
+ gl::Error getStagingTexture(const TextureHelper11 **outStagingTexture,
+ unsigned int *outSubresourceIndex);
gl::Error createStagingTexture();
void releaseStagingTexture();
Renderer11 *mRenderer;
DXGI_FORMAT mDXGIFormat;
- ID3D11Resource *mStagingTexture;
+ TextureHelper11 mStagingTexture;
unsigned int mStagingSubresource;
bool mRecoverFromStorage;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp
index 3238c962ac3..a79fb71f710 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp
@@ -14,28 +14,23 @@
namespace rx
{
-IndexBuffer11::IndexBuffer11(Renderer11 *const renderer) : mRenderer(renderer)
+IndexBuffer11::IndexBuffer11(Renderer11 *const renderer)
+ : mRenderer(renderer), mBuffer(), mBufferSize(0), mIndexType(GL_NONE), mDynamicUsage(false)
{
- mBuffer = nullptr;
- mBufferSize = 0;
- mDynamicUsage = false;
}
IndexBuffer11::~IndexBuffer11()
{
- SafeRelease(mBuffer);
}
gl::Error IndexBuffer11::initialize(unsigned int bufferSize, GLenum indexType, bool dynamic)
{
- SafeRelease(mBuffer);
+ mBuffer.reset();
updateSerial();
if (bufferSize > 0)
{
- ID3D11Device* dxDevice = mRenderer->getDevice();
-
D3D11_BUFFER_DESC bufferDesc;
bufferDesc.ByteWidth = bufferSize;
bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
@@ -44,19 +39,15 @@ gl::Error IndexBuffer11::initialize(unsigned int bufferSize, GLenum indexType, b
bufferDesc.MiscFlags = 0;
bufferDesc.StructureByteStride = 0;
- HRESULT result = dxDevice->CreateBuffer(&bufferDesc, nullptr, &mBuffer);
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate internal index buffer of size, %lu.", bufferSize);
- }
+ ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &mBuffer));
if (dynamic)
{
- d3d11::SetDebugName(mBuffer, "IndexBuffer11 (dynamic)");
+ mBuffer.setDebugName("IndexBuffer11 (dynamic)");
}
else
{
- d3d11::SetDebugName(mBuffer, "IndexBuffer11 (static)");
+ mBuffer.setDebugName("IndexBuffer11 (static)");
}
}
@@ -69,24 +60,25 @@ gl::Error IndexBuffer11::initialize(unsigned int bufferSize, GLenum indexType, b
gl::Error IndexBuffer11::mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory)
{
- if (!mBuffer)
+ if (!mBuffer.valid())
{
- return gl::Error(GL_OUT_OF_MEMORY, "Internal index buffer is not initialized.");
+ 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::Error(GL_OUT_OF_MEMORY, "Index buffer map range is not inside the buffer.");
+ 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, 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedResource);
+ HRESULT result =
+ dxContext->Map(mBuffer.get(), 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedResource);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to map internal index buffer, HRESULT: 0x%08x.", result);
+ return gl::OutOfMemory() << "Failed to map internal index buffer, " << gl::FmtHR(result);
}
*outMappedMemory = reinterpret_cast<char*>(mappedResource.pData) + offset;
@@ -95,13 +87,13 @@ gl::Error IndexBuffer11::mapBuffer(unsigned int offset, unsigned int size, void*
gl::Error IndexBuffer11::unmapBuffer()
{
- if (!mBuffer)
+ if (!mBuffer.valid())
{
- return gl::Error(GL_OUT_OF_MEMORY, "Internal index buffer is not initialized.");
+ return gl::OutOfMemory() << "Internal index buffer is not initialized.";
}
ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
- dxContext->Unmap(mBuffer, 0);
+ dxContext->Unmap(mBuffer.get(), 0);
return gl::NoError();
}
@@ -129,21 +121,21 @@ gl::Error IndexBuffer11::setSize(unsigned int bufferSize, GLenum indexType)
gl::Error IndexBuffer11::discard()
{
- if (!mBuffer)
+ if (!mBuffer.valid())
{
- return gl::Error(GL_OUT_OF_MEMORY, "Internal index buffer is not initialized.");
+ return gl::OutOfMemory() << "Internal index buffer is not initialized.";
}
ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
D3D11_MAPPED_SUBRESOURCE mappedResource;
- HRESULT result = dxContext->Map(mBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
+ HRESULT result = dxContext->Map(mBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to map internal index buffer, HRESULT: 0x%08x.", result);
+ return gl::OutOfMemory() << "Failed to map internal index buffer, " << gl::FmtHR(result);
}
- dxContext->Unmap(mBuffer, 0);
+ dxContext->Unmap(mBuffer.get(), 0);
return gl::NoError();
}
@@ -159,9 +151,9 @@ DXGI_FORMAT IndexBuffer11::getIndexFormat() const
}
}
-ID3D11Buffer *IndexBuffer11::getBuffer() const
+const d3d11::Buffer &IndexBuffer11::getBuffer() const
{
return mBuffer;
}
-}
+} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.h
index e730377e00c..6c7260f2690 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.h
@@ -10,6 +10,7 @@
#define LIBANGLE_RENDERER_D3D_D3D11_INDEXBUFFER11_H_
#include "libANGLE/renderer/d3d/IndexBuffer.h"
+#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
namespace rx
{
@@ -33,17 +34,17 @@ class IndexBuffer11 : public IndexBuffer
virtual gl::Error discard();
DXGI_FORMAT getIndexFormat() const;
- ID3D11Buffer *getBuffer() const;
+ const d3d11::Buffer &getBuffer() const;
private:
Renderer11 *const mRenderer;
- ID3D11Buffer *mBuffer;
+ d3d11::Buffer mBuffer;
unsigned int mBufferSize;
GLenum mIndexType;
bool mDynamicUsage;
};
-}
+} // namespace rx
#endif // LIBANGLE_RENDERER_D3D_D3D11_INDEXBUFFER11_H_
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp
index c5a39907584..1064f865300 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp
@@ -10,6 +10,7 @@
#include "libANGLE/renderer/d3d/d3d11/InputLayoutCache.h"
#include "common/bitset_utils.h"
+#include "common/third_party/murmurhash/MurmurHash3.h"
#include "common/utilities.h"
#include "libANGLE/Program.h"
#include "libANGLE/VertexArray.h"
@@ -22,7 +23,6 @@
#include "libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h"
#include "libANGLE/renderer/d3d/d3d11/VertexBuffer11.h"
#include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
-#include "third_party/murmurhash/MurmurHash3.h"
namespace rx
{
@@ -72,8 +72,6 @@ GLenum GetGLSLAttributeType(const std::vector<sh::Attribute> &shaderAttributes,
return GL_NONE;
}
-const unsigned int kDefaultCacheSize = 1024;
-
struct PackedAttribute
{
uint8_t attribType;
@@ -132,11 +130,14 @@ void SortAttributesByLayout(const gl::Program *program,
} // anonymous namespace
-void InputLayoutCache::PackedAttributeLayout::addAttributeData(
- GLenum glType,
- UINT semanticIndex,
- gl::VertexFormatType vertexFormatType,
- unsigned int divisor)
+PackedAttributeLayout::PackedAttributeLayout() : numAttributes(0), flags(0), attributeData({})
+{
+}
+
+void PackedAttributeLayout::addAttributeData(GLenum glType,
+ UINT semanticIndex,
+ gl::VertexFormatType vertexFormatType,
+ unsigned int divisor)
{
gl::AttributeType attribType = gl::GetAttributeType(glType);
@@ -156,64 +157,27 @@ void InputLayoutCache::PackedAttributeLayout::addAttributeData(
attributeData[numAttributes++] = gl::bitCast<uint32_t>(packedAttrib);
}
-bool InputLayoutCache::PackedAttributeLayout::operator<(const PackedAttributeLayout &other) const
+bool PackedAttributeLayout::operator==(const PackedAttributeLayout &other) const
{
- if (numAttributes != other.numAttributes)
- {
- return numAttributes < other.numAttributes;
- }
-
- if (flags != other.flags)
- {
- return flags < other.flags;
- }
-
- return memcmp(attributeData, other.attributeData, sizeof(uint32_t) * numAttributes) < 0;
+ return (numAttributes == other.numAttributes) && (flags == other.flags) &&
+ (attributeData == other.attributeData);
}
InputLayoutCache::InputLayoutCache()
- : mCurrentIL(angle::DirtyPointer),
- mPointSpriteVertexBuffer(nullptr),
- mPointSpriteIndexBuffer(nullptr),
- mCacheSize(kDefaultCacheSize)
+ : mLayoutCache(kDefaultCacheSize * 2), mPointSpriteVertexBuffer(), mPointSpriteIndexBuffer()
{
- mCurrentBuffers.fill(nullptr);
- mCurrentVertexStrides.fill(std::numeric_limits<UINT>::max());
- mCurrentVertexOffsets.fill(std::numeric_limits<UINT>::max());
mCurrentAttributes.reserve(gl::MAX_VERTEX_ATTRIBS);
}
InputLayoutCache::~InputLayoutCache()
{
- clear();
-}
-
-void InputLayoutCache::initialize()
-{
- clear();
}
void InputLayoutCache::clear()
{
- for (auto &layout : mLayoutMap)
- {
- SafeRelease(layout.second);
- }
- mLayoutMap.clear();
- SafeRelease(mPointSpriteVertexBuffer);
- SafeRelease(mPointSpriteIndexBuffer);
- markDirty();
-}
-
-void InputLayoutCache::markDirty()
-{
- mCurrentIL = angle::DirtyPointer;
- for (unsigned int i = 0; i < gl::MAX_VERTEX_ATTRIBS; i++)
- {
- mCurrentBuffers[i] = nullptr;
- mCurrentVertexStrides[i] = static_cast<UINT>(-1);
- mCurrentVertexOffsets[i] = static_cast<UINT>(-1);
- }
+ mLayoutCache.Clear();
+ mPointSpriteVertexBuffer.reset();
+ mPointSpriteIndexBuffer.reset();
}
gl::Error InputLayoutCache::applyVertexBuffers(
@@ -227,7 +191,7 @@ gl::Error InputLayoutCache::applyVertexBuffers(
GLsizei numIndicesPerInstance)
{
ID3D11DeviceContext *deviceContext = renderer->getDeviceContext();
- ID3D11Device *device = renderer->getDevice();
+ auto *stateManager = renderer->getStateManager();
gl::Program *program = state.getProgram();
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
@@ -259,10 +223,6 @@ gl::Error InputLayoutCache::applyVertexBuffers(
ANGLE_TRY(
updateInputLayout(renderer, state, mode, sortedSemanticIndices, numIndicesPerInstance));
- bool dirtyBuffers = false;
- size_t minDiff = gl::MAX_VERTEX_ATTRIBS;
- size_t maxDiff = 0;
-
// Note that if we use instance emulation, we reserve the first buffer slot.
size_t reservedBuffers = GetReservedBufferCount(programUsesInstancedPointSprites);
@@ -285,7 +245,7 @@ gl::Error InputLayoutCache::applyVertexBuffers(
if (bufferStorage == nullptr)
{
ASSERT(attrib.vertexBuffer.get());
- buffer = GetAs<VertexBuffer11>(attrib.vertexBuffer.get())->getBuffer();
+ buffer = GetAs<VertexBuffer11>(attrib.vertexBuffer.get())->getBuffer().get();
}
else if (instancedPointSpritesActive && (indexInfo != nullptr))
{
@@ -317,18 +277,7 @@ gl::Error InputLayoutCache::applyVertexBuffers(
size_t bufferIndex = reservedBuffers + attribIndex;
- if (buffer != mCurrentBuffers[bufferIndex] ||
- vertexStride != mCurrentVertexStrides[bufferIndex] ||
- vertexOffset != mCurrentVertexOffsets[bufferIndex])
- {
- dirtyBuffers = true;
- minDiff = std::min(minDiff, bufferIndex);
- maxDiff = std::max(maxDiff, bufferIndex);
-
- mCurrentBuffers[bufferIndex] = buffer;
- mCurrentVertexStrides[bufferIndex] = vertexStride;
- mCurrentVertexOffsets[bufferIndex] = vertexOffset;
- }
+ stateManager->queueVertexBufferChange(bufferIndex, buffer, vertexStride, vertexOffset);
}
// Instanced PointSprite emulation requires two additional ID3D11Buffers. A vertex buffer needs
@@ -342,7 +291,7 @@ gl::Error InputLayoutCache::applyVertexBuffers(
{
const UINT pointSpriteVertexStride = sizeof(float) * 5;
- if (!mPointSpriteVertexBuffer)
+ if (!mPointSpriteVertexBuffer.valid())
{
static const float pointSpriteVertices[] =
{
@@ -364,26 +313,16 @@ gl::Error InputLayoutCache::applyVertexBuffers(
vertexBufferDesc.MiscFlags = 0;
vertexBufferDesc.StructureByteStride = 0;
- HRESULT result = device->CreateBuffer(&vertexBufferDesc, &vertexBufferData,
- &mPointSpriteVertexBuffer);
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create instanced pointsprite emulation vertex buffer, HRESULT: 0x%08x", result);
- }
+ ANGLE_TRY(renderer->allocateResource(vertexBufferDesc, &vertexBufferData,
+ &mPointSpriteVertexBuffer));
}
- mCurrentBuffers[0] = 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.
- mCurrentVertexStrides[0] = instancedPointSpritesActive ? pointSpriteVertexStride : 0;
- mCurrentVertexOffsets[0] = 0;
-
- // Update maxDiff to include the additional point sprite vertex buffer
- // to ensure that IASetVertexBuffers uses the correct buffer count.
- minDiff = 0;
- maxDiff = std::max(maxDiff, static_cast<size_t>(0));
+ UINT stride = instancedPointSpritesActive ? pointSpriteVertexStride : 0;
+ stateManager->queueVertexBufferChange(0, mPointSpriteVertexBuffer.get(), stride, 0);
- if (!mPointSpriteIndexBuffer)
+ if (!mPointSpriteIndexBuffer.valid())
{
// Create an index buffer and set it for pointsprite rendering
static const unsigned short pointSpriteIndices[] =
@@ -400,13 +339,8 @@ gl::Error InputLayoutCache::applyVertexBuffers(
indexBufferDesc.MiscFlags = 0;
indexBufferDesc.StructureByteStride = 0;
- HRESULT result =
- device->CreateBuffer(&indexBufferDesc, &indexBufferData, &mPointSpriteIndexBuffer);
- if (FAILED(result))
- {
- SafeRelease(mPointSpriteVertexBuffer);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create instanced pointsprite emulation index buffer, HRESULT: 0x%08x", result);
- }
+ ANGLE_TRY(renderer->allocateResource(indexBufferDesc, &indexBufferData,
+ &mPointSpriteIndexBuffer));
}
if (instancedPointSpritesActive)
@@ -415,19 +349,11 @@ gl::Error InputLayoutCache::applyVertexBuffers(
// 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.
- deviceContext->IASetIndexBuffer(mPointSpriteIndexBuffer, DXGI_FORMAT_R16_UINT, 0);
+ deviceContext->IASetIndexBuffer(mPointSpriteIndexBuffer.get(), DXGI_FORMAT_R16_UINT, 0);
}
}
- if (dirtyBuffers)
- {
- ASSERT(minDiff <= maxDiff && maxDiff < gl::MAX_VERTEX_ATTRIBS);
- deviceContext->IASetVertexBuffers(
- static_cast<UINT>(minDiff), static_cast<UINT>(maxDiff - minDiff + 1),
- &mCurrentBuffers[minDiff], &mCurrentVertexStrides[minDiff],
- &mCurrentVertexOffsets[minDiff]);
- }
-
+ stateManager->applyVertexBufferChanges();
return gl::NoError();
}
@@ -435,6 +361,8 @@ gl::Error InputLayoutCache::updateVertexOffsetsForPointSpritesEmulation(Renderer
GLint startVertex,
GLsizei emulatedInstanceId)
{
+ auto *stateManager = renderer->getStateManager();
+
size_t reservedBuffers = GetReservedBufferCount(true);
for (size_t attribIndex = 0; attribIndex < mCurrentAttributes.size(); ++attribIndex)
{
@@ -445,15 +373,12 @@ gl::Error InputLayoutCache::updateVertexOffsetsForPointSpritesEmulation(Renderer
{
unsigned int offset = 0;
ANGLE_TRY_RESULT(attrib.computeOffset(startVertex), offset);
- mCurrentVertexOffsets[bufferIndex] =
- offset + (attrib.stride * (emulatedInstanceId / attrib.divisor));
+ offset += (attrib.stride * (emulatedInstanceId / attrib.divisor));
+ stateManager->queueVertexOffsetChange(bufferIndex, offset);
}
}
- ID3D11DeviceContext *deviceContext = renderer->getDeviceContext();
- deviceContext->IASetVertexBuffers(0, gl::MAX_VERTEX_ATTRIBS, mCurrentBuffers.data(),
- mCurrentVertexStrides.data(), mCurrentVertexOffsets.data());
-
+ stateManager->applyVertexBufferChanges();
return gl::NoError();
}
@@ -505,51 +430,32 @@ gl::Error InputLayoutCache::updateInputLayout(Renderer11 *renderer,
state.getVertexAttribCurrentValue(static_cast<unsigned int>(attribIndex));
gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib, currentValue.Type);
- layout.addAttributeData(glslElementType, d3dSemantic, vertexFormatType, binding.divisor);
+ layout.addAttributeData(glslElementType, d3dSemantic, vertexFormatType,
+ binding.getDivisor());
}
- ID3D11InputLayout *inputLayout = nullptr;
+ const d3d11::InputLayout *inputLayout = nullptr;
if (layout.numAttributes > 0 || layout.flags != 0)
{
- auto layoutMapIt = mLayoutMap.find(layout);
- if (layoutMapIt != mLayoutMap.end())
+ auto it = mLayoutCache.Get(layout);
+ if (it != mLayoutCache.end())
{
- inputLayout = layoutMapIt->second;
+ inputLayout = &it->second;
}
else
{
- ANGLE_TRY(createInputLayout(renderer, sortedSemanticIndices, mode, program,
- numIndicesPerInstance, &inputLayout));
- if (mLayoutMap.size() >= mCacheSize)
- {
- WARN() << "Overflowed the limit of " << mCacheSize
- << " input layouts, purging half the cache.";
+ angle::TrimCache(mLayoutCache.max_size() / 2, kGCLimit, "input layout", &mLayoutCache);
- // Randomly release every second element
- auto it = mLayoutMap.begin();
- while (it != mLayoutMap.end())
- {
- it++;
- if (it != mLayoutMap.end())
- {
- // c++11 erase allows us to easily delete the current iterator.
- SafeRelease(it->second);
- it = mLayoutMap.erase(it);
- }
- }
- }
+ d3d11::InputLayout newInputLayout;
+ ANGLE_TRY(createInputLayout(renderer, sortedSemanticIndices, mode, program,
+ numIndicesPerInstance, &newInputLayout));
- mLayoutMap[layout] = inputLayout;
+ auto insertIt = mLayoutCache.Put(layout, std::move(newInputLayout));
+ inputLayout = &insertIt->second;
}
}
- if (reinterpret_cast<uintptr_t>(inputLayout) != mCurrentIL)
- {
- ID3D11DeviceContext *deviceContext = renderer->getDeviceContext();
- deviceContext->IASetInputLayout(inputLayout);
- mCurrentIL = reinterpret_cast<uintptr_t>(inputLayout);
- }
-
+ renderer->getStateManager()->setInputLayout(inputLayout);
return gl::NoError();
}
@@ -558,7 +464,7 @@ gl::Error InputLayoutCache::createInputLayout(Renderer11 *renderer,
GLenum mode,
gl::Program *program,
GLsizei numIndicesPerInstance,
- ID3D11InputLayout **inputLayoutOut)
+ d3d11::InputLayout *inputLayoutOut)
{
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
auto featureLevel = renderer->getRenderer11DeviceCaps().featureLevel;
@@ -648,16 +554,18 @@ gl::Error InputLayoutCache::createInputLayout(Renderer11 *renderer,
ShaderExecutableD3D *shader11 = GetAs<ShaderExecutable11>(shader);
- ID3D11Device *device = renderer->getDevice();
- HRESULT result =
- device->CreateInputLayout(inputElements.data(), inputElementCount, shader11->getFunction(),
- shader11->getLength(), inputLayoutOut);
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create internal input layout, HRESULT: 0x%08x", result);
- }
+ 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/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.h
index dfce3e3d305..b8b29ebcac7 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.h
@@ -20,13 +20,32 @@
#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
+{
+struct PackedAttributeLayout;
+} // 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
{
@@ -36,15 +55,35 @@ struct SourceIndexData;
class ProgramD3D;
class Renderer11;
+struct PackedAttributeLayout
+{
+ PackedAttributeLayout();
+ 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,
+ };
+
+ size_t numAttributes;
+ unsigned int flags;
+ std::array<uint32_t, gl::MAX_VERTEX_ATTRIBS> attributeData;
+};
+
class InputLayoutCache : angle::NonCopyable
{
public:
InputLayoutCache();
- virtual ~InputLayoutCache();
+ ~InputLayoutCache();
- void initialize();
void clear();
- void markDirty();
gl::Error applyVertexBuffers(Renderer11 *renderer,
const gl::State &state,
@@ -60,36 +99,9 @@ class InputLayoutCache : angle::NonCopyable
GLsizei emulatedInstanceId);
// Useful for testing
- void setCacheSize(unsigned int cacheSize) { mCacheSize = cacheSize; }
+ void setCacheSize(size_t newCacheSize);
private:
- struct PackedAttributeLayout
- {
- PackedAttributeLayout()
- : numAttributes(0),
- flags(0)
- {
- }
-
- 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,
- };
-
- size_t numAttributes;
- unsigned int flags;
- uint32_t attributeData[gl::MAX_VERTEX_ATTRIBS];
- };
-
gl::Error updateInputLayout(Renderer11 *renderer,
const gl::State &state,
GLenum mode,
@@ -100,20 +112,21 @@ class InputLayoutCache : angle::NonCopyable
GLenum mode,
gl::Program *program,
GLsizei numIndicesPerInstance,
- ID3D11InputLayout **inputLayoutOut);
+ d3d11::InputLayout *inputLayoutOut);
- std::map<PackedAttributeLayout, ID3D11InputLayout *> mLayoutMap;
+ // Starting cache size.
+ static constexpr size_t kDefaultCacheSize = 1024;
- uintptr_t mCurrentIL;
- std::array<ID3D11Buffer *, gl::MAX_VERTEX_ATTRIBS> mCurrentBuffers;
- std::array<UINT, gl::MAX_VERTEX_ATTRIBS> mCurrentVertexStrides;
- std::array<UINT, gl::MAX_VERTEX_ATTRIBS> mCurrentVertexOffsets;
- std::vector<const TranslatedAttribute *> mCurrentAttributes;
+ // The cache tries to clean up this many states at once.
+ static constexpr size_t kGCLimit = 128;
- ID3D11Buffer *mPointSpriteVertexBuffer;
- ID3D11Buffer *mPointSpriteIndexBuffer;
+ using LayoutCache = angle::base::HashingMRUCache<PackedAttributeLayout, d3d11::InputLayout>;
+ LayoutCache mLayoutCache;
+
+ std::vector<const TranslatedAttribute *> mCurrentAttributes;
- unsigned int mCacheSize;
+ d3d11::Buffer mPointSpriteVertexBuffer;
+ d3d11::Buffer mPointSpriteIndexBuffer;
};
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp
index e82b7ba1107..a6f02d1c6a2 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp
@@ -36,28 +36,16 @@ namespace rx
PixelTransfer11::PixelTransfer11(Renderer11 *renderer)
: mRenderer(renderer),
mResourcesLoaded(false),
- mBufferToTextureVS(nullptr),
- mBufferToTextureGS(nullptr),
- mParamsConstantBuffer(nullptr),
- mCopyRasterizerState(nullptr),
- mCopyDepthStencilState(nullptr)
+ mBufferToTextureVS(),
+ mBufferToTextureGS(),
+ mParamsConstantBuffer(),
+ mCopyRasterizerState(),
+ mCopyDepthStencilState()
{
}
PixelTransfer11::~PixelTransfer11()
{
- for (auto shaderMapIt = mBufferToTexturePSMap.begin(); shaderMapIt != mBufferToTexturePSMap.end(); shaderMapIt++)
- {
- SafeRelease(shaderMapIt->second);
- }
-
- mBufferToTexturePSMap.clear();
-
- SafeRelease(mBufferToTextureVS);
- SafeRelease(mBufferToTextureGS);
- SafeRelease(mParamsConstantBuffer);
- SafeRelease(mCopyRasterizerState);
- SafeRelease(mCopyDepthStencilState);
}
gl::Error PixelTransfer11::loadResources()
@@ -67,9 +55,6 @@ gl::Error PixelTransfer11::loadResources()
return gl::NoError();
}
- HRESULT result = S_OK;
- ID3D11Device *device = mRenderer->getDevice();
-
D3D11_RASTERIZER_DESC rasterDesc;
rasterDesc.FillMode = D3D11_FILL_SOLID;
rasterDesc.CullMode = D3D11_CULL_NONE;
@@ -82,12 +67,7 @@ gl::Error PixelTransfer11::loadResources()
rasterDesc.MultisampleEnable = FALSE;
rasterDesc.AntialiasedLineEnable = FALSE;
- result = device->CreateRasterizerState(&rasterDesc, &mCopyRasterizerState);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal pixel transfer rasterizer state, result: 0x%X.", result);
- }
+ ANGLE_TRY(mRenderer->allocateResource(rasterDesc, &mCopyRasterizerState));
D3D11_DEPTH_STENCIL_DESC depthStencilDesc;
depthStencilDesc.DepthEnable = true;
@@ -105,12 +85,7 @@ gl::Error PixelTransfer11::loadResources()
depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
- result = device->CreateDepthStencilState(&depthStencilDesc, &mCopyDepthStencilState);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal pixel transfer depth stencil state, result: 0x%X.", result);
- }
+ ANGLE_TRY(mRenderer->allocateResource(depthStencilDesc, &mCopyDepthStencilState));
D3D11_BUFFER_DESC constantBufferDesc = { 0 };
constantBufferDesc.ByteWidth = roundUp<UINT>(sizeof(CopyShaderParams), 32u);
@@ -120,26 +95,15 @@ gl::Error PixelTransfer11::loadResources()
constantBufferDesc.MiscFlags = 0;
constantBufferDesc.StructureByteStride = 0;
- result = device->CreateBuffer(&constantBufferDesc, nullptr, &mParamsConstantBuffer);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal pixel transfer constant buffer, result: 0x%X.", result);
- }
- d3d11::SetDebugName(mParamsConstantBuffer, "PixelTransfer11 constant buffer");
+ ANGLE_TRY(mRenderer->allocateResource(constantBufferDesc, &mParamsConstantBuffer));
+ mParamsConstantBuffer.setDebugName("PixelTransfer11 constant buffer");
// init shaders
- mBufferToTextureVS = d3d11::CompileVS(device, g_VS_BufferToTexture, "BufferToTexture VS");
- if (!mBufferToTextureVS)
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal buffer to texture vertex shader.");
- }
+ ANGLE_TRY(mRenderer->allocateResource(ShaderData(g_VS_BufferToTexture), &mBufferToTextureVS));
+ mBufferToTextureVS.setDebugName("BufferToTexture VS");
- mBufferToTextureGS = d3d11::CompileGS(device, g_GS_BufferToTexture, "BufferToTexture GS");
- if (!mBufferToTextureGS)
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal buffer to texture geometry shader.");
- }
+ ANGLE_TRY(mRenderer->allocateResource(ShaderData(g_GS_BufferToTexture), &mBufferToTextureGS));
+ mBufferToTextureGS.setDebugName("BufferToTexture GS");
ANGLE_TRY(buildShaderMap());
@@ -173,8 +137,13 @@ void PixelTransfer11::setBufferToTextureCopyParams(const gl::Box &destArea, cons
parametersOut->FirstSlice = destArea.z;
}
-gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpack, unsigned int offset, RenderTargetD3D *destRenderTarget,
- GLenum destinationFormat, GLenum sourcePixelsType, const gl::Box &destArea)
+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());
@@ -188,7 +157,7 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpac
ASSERT(mRenderer->supportsFastCopyBufferToTexture(destinationFormat));
- ID3D11PixelShader *pixelShader = findBufferToTexturePS(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
@@ -216,34 +185,30 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpac
ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- ID3D11Buffer *nullBuffer = nullptr;
- UINT zero = 0;
-
// Are we doing a 2D or 3D copy?
- ID3D11GeometryShader *geometryShader = ((destSize.depth > 1) ? mBufferToTextureGS : nullptr);
- auto stateManager = mRenderer->getStateManager();
+ const auto *geometryShader = ((destSize.depth > 1) ? &mBufferToTextureGS : nullptr);
+ auto stateManager = mRenderer->getStateManager();
- deviceContext->VSSetShader(mBufferToTextureVS, nullptr, 0);
- deviceContext->GSSetShader(geometryShader, nullptr, 0);
- deviceContext->PSSetShader(pixelShader, nullptr, 0);
+ stateManager->setDrawShaders(&mBufferToTextureVS, geometryShader, pixelShader);
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, bufferSRV);
- deviceContext->IASetInputLayout(nullptr);
- deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST);
+ stateManager->setInputLayout(nullptr);
+ stateManager->setPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST);
- deviceContext->IASetVertexBuffers(0, 1, &nullBuffer, &zero, &zero);
+ stateManager->setSingleVertexBuffer(nullptr, 0, 0);
deviceContext->OMSetBlendState(nullptr, nullptr, 0xFFFFFFF);
- deviceContext->OMSetDepthStencilState(mCopyDepthStencilState, 0xFFFFFFFF);
- deviceContext->RSSetState(mCopyRasterizerState);
+ deviceContext->OMSetDepthStencilState(mCopyDepthStencilState.get(), 0xFFFFFFFF);
+ deviceContext->RSSetState(mCopyRasterizerState.get());
- stateManager->setOneTimeRenderTarget(textureRTV.get(), nullptr);
+ stateManager->setOneTimeRenderTarget(context, textureRTV.get(), nullptr);
if (!StructEquals(mParamsData, shaderParams))
{
- d3d11::SetBufferData(deviceContext, mParamsConstantBuffer, shaderParams);
+ d3d11::SetBufferData(deviceContext, mParamsConstantBuffer.get(), shaderParams);
mParamsData = shaderParams;
}
- deviceContext->VSSetConstantBuffers(0, 1, &mParamsConstantBuffer);
+ ID3D11Buffer *paramsBuffer = mParamsConstantBuffer.get();
+ deviceContext->VSSetConstantBuffers(0, 1, &paramsBuffer);
// Set the viewport
D3D11_VIEWPORT viewport;
@@ -258,36 +223,42 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpac
UINT numPixels = (destArea.width * destArea.height * destArea.depth);
deviceContext->Draw(numPixels, 0);
- // Unbind textures and render targets and vertex buffer
+ // Unbind shader resources and invalidate state.
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
+
+ ID3D11Buffer *nullBuffer = nullptr;
deviceContext->VSSetConstantBuffers(0, 1, &nullBuffer);
- mRenderer->markAllStateDirty();
+ mRenderer->markAllStateDirty(context);
return gl::NoError();
}
gl::Error PixelTransfer11::buildShaderMap()
{
- ID3D11Device *device = mRenderer->getDevice();
+ d3d11::PixelShader bufferToTextureFloat;
+ d3d11::PixelShader bufferToTextureInt;
+ d3d11::PixelShader bufferToTextureUint;
- mBufferToTexturePSMap[GL_FLOAT] = d3d11::CompilePS(device, g_PS_BufferToTexture_4F, "BufferToTexture RGBA ps");
- mBufferToTexturePSMap[GL_INT] = d3d11::CompilePS(device, g_PS_BufferToTexture_4I, "BufferToTexture RGBA-I ps");
- mBufferToTexturePSMap[GL_UNSIGNED_INT] = d3d11::CompilePS(device, g_PS_BufferToTexture_4UI, "BufferToTexture RGBA-UI ps");
+ 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));
- // Check that all the shaders were created successfully
- for (auto shaderMapIt = mBufferToTexturePSMap.begin(); shaderMapIt != mBufferToTexturePSMap.end(); shaderMapIt++)
- {
- if (shaderMapIt->second == nullptr)
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal buffer to texture pixel shader.");
- }
- }
+ 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();
}
-ID3D11PixelShader *PixelTransfer11::findBufferToTexturePS(GLenum internalFormat) const
+const d3d11::PixelShader *PixelTransfer11::findBufferToTexturePS(GLenum internalFormat) const
{
GLenum componentType = gl::GetSizedInternalFormatInfo(internalFormat).componentType;
if (componentType == GL_SIGNED_NORMALIZED || componentType == GL_UNSIGNED_NORMALIZED)
@@ -296,7 +267,7 @@ ID3D11PixelShader *PixelTransfer11::findBufferToTexturePS(GLenum internalFormat)
}
auto shaderMapIt = mBufferToTexturePSMap.find(componentType);
- return (shaderMapIt == mBufferToTexturePSMap.end() ? nullptr : shaderMapIt->second);
+ return (shaderMapIt == mBufferToTexturePSMap.end() ? nullptr : &shaderMapIt->second);
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.h
index 1672121ec7f..a93544247ee 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.h
@@ -11,14 +11,14 @@
#ifndef LIBANGLE_RENDERER_D3D_D3D11_PIXELTRANSFER11_H_
#define LIBANGLE_RENDERER_D3D_D3D11_PIXELTRANSFER11_H_
-#include "libANGLE/Error.h"
-
-#include "common/platform.h"
-
#include <GLES2/gl2.h>
#include <map>
+#include "common/platform.h"
+#include "libANGLE/Error.h"
+#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
+
namespace gl
{
@@ -45,8 +45,13 @@ class PixelTransfer11
// 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::PixelUnpackState &unpack, unsigned int offset, RenderTargetD3D *destRenderTarget,
- GLenum destinationFormat, GLenum sourcePixelsType, const gl::Box &destArea);
+ 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:
@@ -68,22 +73,21 @@ class PixelTransfer11
gl::Error loadResources();
gl::Error buildShaderMap();
- ID3D11PixelShader *findBufferToTexturePS(GLenum internalFormat) const;
+ const d3d11::PixelShader *findBufferToTexturePS(GLenum internalFormat) const;
Renderer11 *mRenderer;
bool mResourcesLoaded;
- std::map<GLenum, ID3D11PixelShader *> mBufferToTexturePSMap;
- ID3D11VertexShader *mBufferToTextureVS;
- ID3D11GeometryShader *mBufferToTextureGS;
- ID3D11Buffer *mParamsConstantBuffer;
+ std::map<GLenum, d3d11::PixelShader> mBufferToTexturePSMap;
+ d3d11::VertexShader mBufferToTextureVS;
+ d3d11::GeometryShader mBufferToTextureGS;
+ d3d11::Buffer mParamsConstantBuffer;
CopyShaderParams mParamsData;
- ID3D11RasterizerState *mCopyRasterizerState;
- ID3D11DepthStencilState *mCopyDepthStencilState;
-
+ d3d11::RasterizerState mCopyRasterizerState;
+ d3d11::DepthStencilState mCopyDepthStencilState;
};
-}
+} // namespace rx
#endif // LIBANGLE_RENDERER_D3D_D3D11_PIXELTRANSFER11_H_
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Query11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Query11.cpp
index 5c7961d513a..66b9476e7f4 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Query11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Query11.cpp
@@ -48,16 +48,12 @@ GLuint64 MergeQueryResults(GLenum type, GLuint64 currentResult, GLuint64 newResu
namespace rx
{
-Query11::QueryState::QueryState()
- : query(nullptr), beginTimestamp(nullptr), endTimestamp(nullptr), finished(false)
+Query11::QueryState::QueryState() : query(), beginTimestamp(), endTimestamp(), finished(false)
{
}
Query11::QueryState::~QueryState()
{
- SafeRelease(beginTimestamp);
- SafeRelease(endTimestamp);
- SafeRelease(query);
}
Query11::Query11(Renderer11 *renderer, GLenum type)
@@ -95,7 +91,7 @@ gl::Error Query11::queryCounter()
template <typename T>
gl::Error Query11::getResultBase(T *params)
{
- ASSERT(mActiveQuery->query == nullptr);
+ ASSERT(!mActiveQuery->query.valid());
ANGLE_TRY(flush(true));
ASSERT(mPendingQueries.empty());
*params = static_cast<T>(mResultSum);
@@ -133,7 +129,7 @@ gl::Error Query11::isResultAvailable(bool *available)
gl::Error Query11::pause()
{
- if (mActiveQuery->query != nullptr)
+ if (mActiveQuery->query.valid())
{
ID3D11DeviceContext *context = mRenderer->getDeviceContext();
GLenum queryType = getType();
@@ -141,10 +137,10 @@ gl::Error Query11::pause()
// If we are doing time elapsed query the end timestamp
if (queryType == GL_TIME_ELAPSED_EXT)
{
- context->End(mActiveQuery->endTimestamp);
+ context->End(mActiveQuery->endTimestamp.get());
}
- context->End(mActiveQuery->query);
+ context->End(mActiveQuery->query.get());
mPendingQueries.push_back(std::move(mActiveQuery));
mActiveQuery = std::unique_ptr<QueryState>(new QueryState());
@@ -155,7 +151,7 @@ gl::Error Query11::pause()
gl::Error Query11::resume()
{
- if (mActiveQuery->query == nullptr)
+ if (!mActiveQuery->query.valid())
{
ANGLE_TRY(flush(false));
@@ -166,14 +162,7 @@ gl::Error Query11::resume()
queryDesc.Query = d3dQueryType;
queryDesc.MiscFlags = 0;
- ID3D11Device *device = mRenderer->getDevice();
-
- HRESULT result = device->CreateQuery(&queryDesc, &mActiveQuery->query);
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Internal query creation failed, result: 0x%X.",
- result);
- }
+ 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)
@@ -181,31 +170,22 @@ gl::Error Query11::resume()
D3D11_QUERY_DESC desc;
desc.Query = D3D11_QUERY_TIMESTAMP;
desc.MiscFlags = 0;
- result = device->CreateQuery(&desc, &mActiveQuery->beginTimestamp);
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Internal query creation failed, result: 0x%X.",
- result);
- }
- result = device->CreateQuery(&desc, &mActiveQuery->endTimestamp);
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Internal query creation failed, result: 0x%X.",
- result);
- }
+
+ 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);
+ 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);
+ context->End(mActiveQuery->beginTimestamp.get());
}
}
@@ -244,15 +224,14 @@ gl::Error Query11::testQuery(QueryState *queryState)
case GL_ANY_SAMPLES_PASSED_EXT:
case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
{
- ASSERT(queryState->query);
+ ASSERT(queryState->query.valid());
UINT64 numPixels = 0;
HRESULT result =
- context->GetData(queryState->query, &numPixels, sizeof(numPixels), 0);
+ context->GetData(queryState->query.get(), &numPixels, sizeof(numPixels), 0);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to get the data of an internal query, result: 0x%X.",
- result);
+ return gl::OutOfMemory()
+ << "Failed to get the data of an internal query, " << gl::FmtHR(result);
}
if (result == S_OK)
@@ -265,14 +244,14 @@ gl::Error Query11::testQuery(QueryState *queryState)
case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
{
- ASSERT(queryState->query);
+ ASSERT(queryState->query.valid());
D3D11_QUERY_DATA_SO_STATISTICS soStats = {0};
- HRESULT result = context->GetData(queryState->query, &soStats, sizeof(soStats), 0);
+ HRESULT result =
+ context->GetData(queryState->query.get(), &soStats, sizeof(soStats), 0);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to get the data of an internal query, result: 0x%X.",
- result);
+ return gl::OutOfMemory()
+ << "Failed to get the data of an internal query, " << gl::FmtHR(result);
}
if (result == S_OK)
@@ -285,38 +264,35 @@ gl::Error Query11::testQuery(QueryState *queryState)
case GL_TIME_ELAPSED_EXT:
{
- ASSERT(queryState->query);
- ASSERT(queryState->beginTimestamp);
- ASSERT(queryState->endTimestamp);
+ 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, &timeStats, sizeof(timeStats), 0);
+ context->GetData(queryState->query.get(), &timeStats, sizeof(timeStats), 0);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to get the data of an internal query, result: 0x%X.",
- 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, &beginTime, sizeof(UINT64), 0);
+ HRESULT beginRes = context->GetData(queryState->beginTimestamp.get(),
+ &beginTime, sizeof(UINT64), 0);
if (FAILED(beginRes))
{
- return gl::Error(
- GL_OUT_OF_MEMORY,
- "Failed to get the data of an internal query, result: 0x%X.", 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, &endTime, sizeof(UINT64), 0);
+ HRESULT endRes = context->GetData(queryState->endTimestamp.get(), &endTime,
+ sizeof(UINT64), 0);
if (FAILED(endRes))
{
- return gl::Error(
- GL_OUT_OF_MEMORY,
- "Failed to get the data of an internal query, result: 0x%X.", endRes);
+ return gl::OutOfMemory() << "Failed to get the data of an internal query, "
+ << gl::FmtHR(endRes);
}
if (beginRes == S_OK && endRes == S_OK)
@@ -354,7 +330,7 @@ gl::Error Query11::testQuery(QueryState *queryState)
// 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 == nullptr);
+ ASSERT(!queryState->query.valid());
mResult = 0;
queryState->finished = true;
}
@@ -362,15 +338,14 @@ gl::Error Query11::testQuery(QueryState *queryState)
case GL_COMMANDS_COMPLETED_CHROMIUM:
{
- ASSERT(queryState->query);
+ ASSERT(queryState->query.valid());
BOOL completed = 0;
HRESULT result =
- context->GetData(queryState->query, &completed, sizeof(completed), 0);
+ context->GetData(queryState->query.get(), &completed, sizeof(completed), 0);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to get the data of an internal query, result: 0x%X.",
- result);
+ return gl::OutOfMemory()
+ << "Failed to get the data of an internal query, " << gl::FmtHR(result);
}
if (result == S_OK)
@@ -390,7 +365,7 @@ gl::Error Query11::testQuery(QueryState *queryState)
if (!queryState->finished && mRenderer->testDeviceLost())
{
mRenderer->notifyDeviceLost();
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to test get query result, device is lost.");
+ return gl::OutOfMemory() << "Failed to test get query result, device is lost.";
}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Query11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Query11.h
index 9b6fcf661ea..a88a8892aae 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Query11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Query11.h
@@ -12,6 +12,7 @@
#include <deque>
#include "libANGLE/renderer/QueryImpl.h"
+#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
namespace rx
{
@@ -41,9 +42,9 @@ class Query11 : public QueryImpl
QueryState();
~QueryState();
- ID3D11Query *query;
- ID3D11Query *beginTimestamp;
- ID3D11Query *endTimestamp;
+ d3d11::Query query;
+ d3d11::Query beginTimestamp;
+ d3d11::Query endTimestamp;
bool finished;
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp
index c76d98366e5..4b35610138d 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp
@@ -12,93 +12,45 @@
#include <float.h>
#include "common/debug.h"
+#include "common/third_party/murmurhash/MurmurHash3.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"
-#include "third_party/murmurhash/MurmurHash3.h"
namespace rx
{
using namespace gl_d3d11;
-template <typename mapType>
-static void ClearStateMap(mapType &map)
-{
- for (typename mapType::iterator i = map.begin(); i != map.end(); i++)
- {
- SafeRelease(i->second.first);
- }
- map.clear();
-}
-
-// 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.
-const unsigned int RenderStateCache::kMaxBlendStates = 2048;
-const unsigned int RenderStateCache::kMaxRasterizerStates = 2048;
-const unsigned int RenderStateCache::kMaxDepthStencilStates = 2048;
-const unsigned int RenderStateCache::kMaxSamplerStates = 2048;
-
-RenderStateCache::RenderStateCache(Renderer11 *renderer)
- : mRenderer(renderer),
- mCounter(0),
- mBlendStateCache(kMaxBlendStates, HashBlendState, CompareBlendStates),
- mRasterizerStateCache(kMaxRasterizerStates, HashRasterizerState, CompareRasterizerStates),
- mDepthStencilStateCache(kMaxDepthStencilStates,
- HashDepthStencilState,
- CompareDepthStencilStates),
- mSamplerStateCache(kMaxSamplerStates, HashSamplerState, CompareSamplerStates),
- mDevice(nullptr)
+RenderStateCache::RenderStateCache()
+ : mBlendStateCache(kMaxStates),
+ mRasterizerStateCache(kMaxStates),
+ mDepthStencilStateCache(kMaxStates),
+ mSamplerStateCache(kMaxStates)
{
}
RenderStateCache::~RenderStateCache()
{
- clear();
-}
-
-void RenderStateCache::initialize(ID3D11Device *device)
-{
- clear();
- mDevice = device;
}
void RenderStateCache::clear()
{
- ClearStateMap(mBlendStateCache);
- ClearStateMap(mRasterizerStateCache);
- ClearStateMap(mDepthStencilStateCache);
- ClearStateMap(mSamplerStateCache);
-}
-
-// static
-std::size_t RenderStateCache::HashBlendState(const d3d11::BlendStateKey &blendState)
-{
- static const unsigned int seed = 0xABCDEF98;
-
- std::size_t hash = 0;
- MurmurHash3_x86_32(&blendState, sizeof(d3d11::BlendStateKey), seed, &hash);
- return hash;
-}
-
-// static
-bool RenderStateCache::CompareBlendStates(const d3d11::BlendStateKey &a,
- const d3d11::BlendStateKey &b)
-{
- return memcmp(&a, &b, sizeof(d3d11::BlendStateKey)) == 0;
+ mBlendStateCache.Clear();
+ mRasterizerStateCache.Clear();
+ mDepthStencilStateCache.Clear();
+ mSamplerStateCache.Clear();
}
// static
-d3d11::BlendStateKey RenderStateCache::GetBlendStateKey(const gl::Framebuffer *framebuffer,
+d3d11::BlendStateKey RenderStateCache::GetBlendStateKey(const gl::Context *context,
+ const gl::Framebuffer *framebuffer,
const gl::BlendState &blendState)
{
d3d11::BlendStateKey key;
- const FramebufferD3D *framebufferD3D = GetImplAs<FramebufferD3D>(framebuffer);
- const gl::AttachmentList &colorbuffers = framebufferD3D->getColorAttachmentsForRender();
+ 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);
@@ -134,229 +86,125 @@ d3d11::BlendStateKey RenderStateCache::GetBlendStateKey(const gl::Framebuffer *f
return key;
}
-gl::Error RenderStateCache::getBlendState(const d3d11::BlendStateKey &key,
+gl::Error RenderStateCache::getBlendState(Renderer11 *renderer,
+ const d3d11::BlendStateKey &key,
ID3D11BlendState **outBlendState)
{
- if (!mDevice)
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Internal error, RenderStateCache is not initialized.");
- }
-
- BlendStateMap::iterator keyIter = mBlendStateCache.find(key);
+ auto keyIter = mBlendStateCache.Get(key);
if (keyIter != mBlendStateCache.end())
{
- BlendStateCounterPair &state = keyIter->second;
- state.second = mCounter++;
- *outBlendState = state.first;
+ *outBlendState = keyIter->second.get();
return gl::NoError();
}
- else
- {
- if (mBlendStateCache.size() >= kMaxBlendStates)
- {
- WARN() << "Overflowed the limit of " << kMaxBlendStates
- << " blend states, removing the least recently used to make room.";
-
- BlendStateMap::iterator leastRecentlyUsed = mBlendStateCache.begin();
- for (BlendStateMap::iterator i = mBlendStateCache.begin(); i != mBlendStateCache.end(); i++)
- {
- if (i->second.second < leastRecentlyUsed->second.second)
- {
- leastRecentlyUsed = i;
- }
- }
- SafeRelease(leastRecentlyUsed->second.first);
- mBlendStateCache.erase(leastRecentlyUsed);
- }
-
- // 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.mrt ? TRUE : FALSE;
+ TrimCache(kMaxStates, kGCLimit, "blend state", &mBlendStateCache);
- rtDesc0 = {};
+ // 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;
- 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);
- }
+ blendDesc.AlphaToCoverageEnable = blendState.sampleAlphaToCoverage;
+ blendDesc.IndependentBlendEnable = key.mrt ? TRUE : FALSE;
- 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];
- }
+ rtDesc0 = {};
- HRESULT result = mDevice->CreateBlendState(&blendDesc, outBlendState);
- if (FAILED(result) || !(*outBlendState))
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Unable to create a ID3D11BlendState, HRESULT: 0x%X.", result);
- }
+ 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);
+ }
- mBlendStateCache.insert(std::make_pair(key, std::make_pair(*outBlendState, mCounter++)));
+ rtDesc0.RenderTargetWriteMask = key.rtvMasks[0];
- return gl::NoError();
+ for (unsigned int i = 1; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; i++)
+ {
+ blendDesc.RenderTarget[i] = rtDesc0;
+ blendDesc.RenderTarget[i].RenderTargetWriteMask = key.rtvMasks[i];
}
-}
-// static
-std::size_t RenderStateCache::HashRasterizerState(const RasterizerStateKey &rasterState)
-{
- static const unsigned int seed = 0xABCDEF98;
-
- std::size_t hash = 0;
- MurmurHash3_x86_32(&rasterState, sizeof(RasterizerStateKey), seed, &hash);
- return hash;
-}
+ d3d11::BlendState d3dBlendState;
+ ANGLE_TRY(renderer->allocateResource(blendDesc, &d3dBlendState));
+ *outBlendState = d3dBlendState.get();
+ mBlendStateCache.Put(key, std::move(d3dBlendState));
-// static
-bool RenderStateCache::CompareRasterizerStates(const RasterizerStateKey &a, const RasterizerStateKey &b)
-{
- return memcmp(&a, &b, sizeof(RasterizerStateKey)) == 0;
+ return gl::NoError();
}
-gl::Error RenderStateCache::getRasterizerState(const gl::RasterizerState &rasterState, bool scissorEnabled,
+gl::Error RenderStateCache::getRasterizerState(Renderer11 *renderer,
+ const gl::RasterizerState &rasterState,
+ bool scissorEnabled,
ID3D11RasterizerState **outRasterizerState)
{
- if (!mDevice)
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Internal error, RenderStateCache is not initialized.");
- }
-
- RasterizerStateKey key = {};
+ d3d11::RasterizerStateKey key;
key.rasterizerState = rasterState;
key.scissorEnabled = scissorEnabled;
- RasterizerStateMap::iterator keyIter = mRasterizerStateCache.find(key);
+ auto keyIter = mRasterizerStateCache.Get(key);
if (keyIter != mRasterizerStateCache.end())
{
- RasterizerStateCounterPair &state = keyIter->second;
- state.second = mCounter++;
- *outRasterizerState = state.first;
+ *outRasterizerState = keyIter->second.get();
return gl::NoError();
}
- else
- {
- if (mRasterizerStateCache.size() >= kMaxRasterizerStates)
- {
- WARN() << "Overflowed the limit of " << kMaxRasterizerStates
- << " rasterizer states, removing the least recently used to make room.";
-
- RasterizerStateMap::iterator leastRecentlyUsed = mRasterizerStateCache.begin();
- for (RasterizerStateMap::iterator i = mRasterizerStateCache.begin(); i != mRasterizerStateCache.end(); i++)
- {
- if (i->second.second < leastRecentlyUsed->second.second)
- {
- leastRecentlyUsed = i;
- }
- }
- SafeRelease(leastRecentlyUsed->second.first);
- mRasterizerStateCache.erase(leastRecentlyUsed);
- }
- D3D11_CULL_MODE cullMode = gl_d3d11::ConvertCullMode(rasterState.cullFace, rasterState.cullMode);
+ TrimCache(kMaxStates, kGCLimit, "rasterizer state", &mRasterizerStateCache);
- // Disable culling if drawing points
- if (rasterState.pointDrawMode)
- {
- cullMode = D3D11_CULL_NONE;
- }
+ D3D11_CULL_MODE cullMode =
+ gl_d3d11::ConvertCullMode(rasterState.cullFace, rasterState.cullMode);
- 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;
- }
-
- ID3D11RasterizerState *dx11RasterizerState = nullptr;
- HRESULT result = mDevice->CreateRasterizerState(&rasterDesc, &dx11RasterizerState);
- if (FAILED(result) || !dx11RasterizerState)
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Unable to create a ID3D11RasterizerState, HRESULT: 0x%X.", result);
- }
-
- mRasterizerStateCache.insert(std::make_pair(key, std::make_pair(dx11RasterizerState, mCounter++)));
-
- *outRasterizerState = dx11RasterizerState;
- return gl::NoError();
+ // Disable culling if drawing points
+ if (rasterState.pointDrawMode)
+ {
+ cullMode = D3D11_CULL_NONE;
}
-}
-// static
-std::size_t RenderStateCache::HashDepthStencilState(const gl::DepthStencilState &dsState)
-{
- static const unsigned int seed = 0xABCDEF98;
+ 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;
+ }
- std::size_t hash = 0;
- MurmurHash3_x86_32(&dsState, sizeof(gl::DepthStencilState), seed, &hash);
- return hash;
-}
+ d3d11::RasterizerState dx11RasterizerState;
+ ANGLE_TRY(renderer->allocateResource(rasterDesc, &dx11RasterizerState));
+ *outRasterizerState = dx11RasterizerState.get();
+ mRasterizerStateCache.Put(key, std::move(dx11RasterizerState));
-// static
-bool RenderStateCache::CompareDepthStencilStates(const gl::DepthStencilState &a, const gl::DepthStencilState &b)
-{
- return memcmp(&a, &b, sizeof(gl::DepthStencilState)) == 0;
+ return gl::NoError();
}
-gl::Error RenderStateCache::getDepthStencilState(const gl::DepthStencilState &glState,
+gl::Error RenderStateCache::getDepthStencilState(Renderer11 *renderer,
+ const gl::DepthStencilState &glState,
ID3D11DepthStencilState **outDSState)
{
- if (!mDevice)
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Internal error, RenderStateCache is not initialized.");
- }
-
- auto keyIter = mDepthStencilStateCache.find(glState);
+ auto keyIter = mDepthStencilStateCache.Get(glState);
if (keyIter != mDepthStencilStateCache.end())
{
- DepthStencilStateCounterPair &state = keyIter->second;
- state.second = mCounter++;
- *outDSState = state.first;
+ *outDSState = keyIter->second.get();
return gl::NoError();
}
- if (mDepthStencilStateCache.size() >= kMaxDepthStencilStates)
- {
- WARN() << "Overflowed the limit of " << kMaxDepthStencilStates
- << " depth stencil states, removing the least recently used to make room.";
-
- auto leastRecentlyUsed = mDepthStencilStateCache.begin();
- for (auto i = mDepthStencilStateCache.begin(); i != mDepthStencilStateCache.end(); i++)
- {
- if (i->second.second < leastRecentlyUsed->second.second)
- {
- leastRecentlyUsed = i;
- }
- }
- SafeRelease(leastRecentlyUsed->second.first);
- mDepthStencilStateCache.erase(leastRecentlyUsed);
- }
+ TrimCache(kMaxStates, kGCLimit, "depth stencil state", &mDepthStencilStateCache);
D3D11_DEPTH_STENCIL_DESC dsDesc = {0};
dsDesc.DepthEnable = glState.depthTest ? TRUE : FALSE;
@@ -374,110 +222,65 @@ gl::Error RenderStateCache::getDepthStencilState(const gl::DepthStencilState &gl
dsDesc.BackFace.StencilPassOp = ConvertStencilOp(glState.stencilBackPassDepthPass);
dsDesc.BackFace.StencilFunc = ConvertComparison(glState.stencilBackFunc);
- ID3D11DepthStencilState *dx11DepthStencilState = nullptr;
- HRESULT result = mDevice->CreateDepthStencilState(&dsDesc, &dx11DepthStencilState);
- if (FAILED(result) || !dx11DepthStencilState)
- {
- return gl::Error(GL_OUT_OF_MEMORY,
- "Unable to create a ID3D11DepthStencilState, HRESULT: 0x%X.", result);
- }
-
- mDepthStencilStateCache.insert(
- std::make_pair(glState, std::make_pair(dx11DepthStencilState, mCounter++)));
+ d3d11::DepthStencilState dx11DepthStencilState;
+ ANGLE_TRY(renderer->allocateResource(dsDesc, &dx11DepthStencilState));
+ *outDSState = dx11DepthStencilState.get();
+ mDepthStencilStateCache.Put(glState, std::move(dx11DepthStencilState));
- *outDSState = dx11DepthStencilState;
return gl::NoError();
}
-// static
-std::size_t RenderStateCache::HashSamplerState(const gl::SamplerState &samplerState)
-{
- static const unsigned int seed = 0xABCDEF98;
-
- std::size_t hash = 0;
- MurmurHash3_x86_32(&samplerState, sizeof(gl::SamplerState), seed, &hash);
- return hash;
-}
-
-// static
-bool RenderStateCache::CompareSamplerStates(const gl::SamplerState &a, const gl::SamplerState &b)
-{
- return memcmp(&a, &b, sizeof(gl::SamplerState)) == 0;
-}
-
-gl::Error RenderStateCache::getSamplerState(const gl::SamplerState &samplerState, ID3D11SamplerState **outSamplerState)
+gl::Error RenderStateCache::getSamplerState(Renderer11 *renderer,
+ const gl::SamplerState &samplerState,
+ ID3D11SamplerState **outSamplerState)
{
- if (!mDevice)
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Internal error, RenderStateCache is not initialized.");
- }
-
- SamplerStateMap::iterator keyIter = mSamplerStateCache.find(samplerState);
+ auto keyIter = mSamplerStateCache.Get(samplerState);
if (keyIter != mSamplerStateCache.end())
{
- SamplerStateCounterPair &state = keyIter->second;
- state.second = mCounter++;
- *outSamplerState = state.first;
+ *outSamplerState = keyIter->second.get();
return gl::NoError();
}
- else
- {
- if (mSamplerStateCache.size() >= kMaxSamplerStates)
- {
- WARN() << "Overflowed the limit of " << kMaxSamplerStates
- << " sampler states, removing the least recently used to make room.";
- SamplerStateMap::iterator leastRecentlyUsed = mSamplerStateCache.begin();
- for (SamplerStateMap::iterator i = mSamplerStateCache.begin(); i != mSamplerStateCache.end(); i++)
- {
- if (i->second.second < leastRecentlyUsed->second.second)
- {
- leastRecentlyUsed = i;
- }
- }
- SafeRelease(leastRecentlyUsed->second.first);
- mSamplerStateCache.erase(leastRecentlyUsed);
- }
-
- 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, mDevice->GetFeatureLevel());
- 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 (mRenderer->getRenderer11DeviceCaps().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;
- }
-
- ID3D11SamplerState *dx11SamplerState = nullptr;
- HRESULT result = mDevice->CreateSamplerState(&samplerDesc, &dx11SamplerState);
- if (FAILED(result) || !dx11SamplerState)
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Unable to create a ID3D11SamplerState, HRESULT: 0x%X.", result);
- }
+ 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;
+ }
- mSamplerStateCache.insert(std::make_pair(samplerState, std::make_pair(dx11SamplerState, mCounter++)));
+ d3d11::SamplerState dx11SamplerState;
+ ANGLE_TRY(renderer->allocateResource(samplerDesc, &dx11SamplerState));
+ *outSamplerState = dx11SamplerState.get();
+ mSamplerStateCache.Put(samplerState, std::move(dx11SamplerState));
- *outSamplerState = dx11SamplerState;
- return gl::NoError();
- }
+ return gl::NoError();
}
-}
+} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.h
index b9981052654..73ea22c937c 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.h
@@ -10,9 +10,10 @@
#ifndef LIBANGLE_RENDERER_D3D_D3D11_RENDERSTATECACHE_H_
#define LIBANGLE_RENDERER_D3D_D3D11_RENDERSTATECACHE_H_
-#include "libANGLE/angletypes.h"
-#include "libANGLE/Error.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>
@@ -22,6 +23,42 @@ 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;
@@ -29,87 +66,58 @@ class Renderer11;
class RenderStateCache : angle::NonCopyable
{
public:
- RenderStateCache(Renderer11 *renderer);
+ RenderStateCache();
virtual ~RenderStateCache();
- void initialize(ID3D11Device *device);
void clear();
- static d3d11::BlendStateKey GetBlendStateKey(const gl::Framebuffer *framebuffer,
+ static d3d11::BlendStateKey GetBlendStateKey(const gl::Context *context,
+ const gl::Framebuffer *framebuffer,
const gl::BlendState &blendState);
- gl::Error getBlendState(const d3d11::BlendStateKey &key, ID3D11BlendState **outBlendState);
- gl::Error getRasterizerState(const gl::RasterizerState &rasterState, bool scissorEnabled, ID3D11RasterizerState **outRasterizerState);
- gl::Error getDepthStencilState(const gl::DepthStencilState &dsState,
+ gl::Error getBlendState(Renderer11 *renderer,
+ const d3d11::BlendStateKey &key,
+ ID3D11BlendState **outBlendState);
+ gl::Error getRasterizerState(Renderer11 *renderer,
+ const gl::RasterizerState &rasterState,
+ bool scissorEnabled,
+ ID3D11RasterizerState **outRasterizerState);
+ gl::Error getDepthStencilState(Renderer11 *renderer,
+ const gl::DepthStencilState &dsState,
ID3D11DepthStencilState **outDSState);
- gl::Error getSamplerState(const gl::SamplerState &samplerState, ID3D11SamplerState **outSamplerState);
+ gl::Error getSamplerState(Renderer11 *renderer,
+ const gl::SamplerState &samplerState,
+ ID3D11SamplerState **outSamplerState);
private:
- Renderer11 *mRenderer;
- unsigned long long mCounter;
+ // 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
- static std::size_t HashBlendState(const d3d11::BlendStateKey &blendState);
- static bool CompareBlendStates(const d3d11::BlendStateKey &a, const d3d11::BlendStateKey &b);
- static const unsigned int kMaxBlendStates;
-
- typedef std::size_t (*BlendStateHashFunction)(const d3d11::BlendStateKey &);
- typedef bool (*BlendStateEqualityFunction)(const d3d11::BlendStateKey &,
- const d3d11::BlendStateKey &);
- typedef std::pair<ID3D11BlendState*, unsigned long long> BlendStateCounterPair;
- typedef std::unordered_map<d3d11::BlendStateKey,
- BlendStateCounterPair,
- BlendStateHashFunction,
- BlendStateEqualityFunction>
- BlendStateMap;
+ using BlendStateMap = angle::base::HashingMRUCache<d3d11::BlendStateKey, d3d11::BlendState>;
BlendStateMap mBlendStateCache;
// Rasterizer state cache
- struct RasterizerStateKey
- {
- gl::RasterizerState rasterizerState;
- bool scissorEnabled;
- };
- static std::size_t HashRasterizerState(const RasterizerStateKey &rasterState);
- static bool CompareRasterizerStates(const RasterizerStateKey &a, const RasterizerStateKey &b);
- static const unsigned int kMaxRasterizerStates;
-
- typedef std::size_t (*RasterizerStateHashFunction)(const RasterizerStateKey &);
- typedef bool (*RasterizerStateEqualityFunction)(const RasterizerStateKey &, const RasterizerStateKey &);
- typedef std::pair<ID3D11RasterizerState*, unsigned long long> RasterizerStateCounterPair;
- typedef std::unordered_map<RasterizerStateKey, RasterizerStateCounterPair, RasterizerStateHashFunction, RasterizerStateEqualityFunction> RasterizerStateMap;
+ using RasterizerStateMap =
+ angle::base::HashingMRUCache<d3d11::RasterizerStateKey, d3d11::RasterizerState>;
RasterizerStateMap mRasterizerStateCache;
// Depth stencil state cache
- static std::size_t HashDepthStencilState(const gl::DepthStencilState &dsState);
- static bool CompareDepthStencilStates(const gl::DepthStencilState &a, const gl::DepthStencilState &b);
- static const unsigned int kMaxDepthStencilStates;
-
- typedef std::size_t (*DepthStencilStateHashFunction)(const gl::DepthStencilState &);
- typedef bool (*DepthStencilStateEqualityFunction)(const gl::DepthStencilState &, const gl::DepthStencilState &);
- typedef std::pair<ID3D11DepthStencilState*, unsigned long long> DepthStencilStateCounterPair;
- typedef std::unordered_map<gl::DepthStencilState,
- DepthStencilStateCounterPair,
- DepthStencilStateHashFunction,
- DepthStencilStateEqualityFunction> DepthStencilStateMap;
+ using DepthStencilStateMap =
+ angle::base::HashingMRUCache<gl::DepthStencilState, d3d11::DepthStencilState>;
DepthStencilStateMap mDepthStencilStateCache;
// Sample state cache
- static std::size_t HashSamplerState(const gl::SamplerState &samplerState);
- static bool CompareSamplerStates(const gl::SamplerState &a, const gl::SamplerState &b);
- static const unsigned int kMaxSamplerStates;
-
- typedef std::size_t (*SamplerStateHashFunction)(const gl::SamplerState &);
- typedef bool (*SamplerStateEqualityFunction)(const gl::SamplerState &, const gl::SamplerState &);
- typedef std::pair<ID3D11SamplerState*, unsigned long long> SamplerStateCounterPair;
- typedef std::unordered_map<gl::SamplerState,
- SamplerStateCounterPair,
- SamplerStateHashFunction,
- SamplerStateEqualityFunction> SamplerStateMap;
+ using SamplerStateMap = angle::base::HashingMRUCache<gl::SamplerState, d3d11::SamplerState>;
SamplerStateMap mSamplerStateCache;
-
- ID3D11Device *mDevice;
};
-}
+} // namespace rx
#endif // LIBANGLE_RENDERER_D3D_D3D11_RENDERSTATECACHE_H_
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp
index 34e359c3faa..b019488e4f5 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp
@@ -212,7 +212,7 @@ void RenderTarget11::signalDirty()
}
TextureRenderTarget11::TextureRenderTarget11(d3d11::RenderTargetView &&rtv,
- ID3D11Resource *resource,
+ const TextureHelper11 &resource,
const d3d11::SharedSRV &srv,
const d3d11::SharedSRV &blitSRV,
GLenum internalFormat,
@@ -231,23 +231,18 @@ TextureRenderTarget11::TextureRenderTarget11(d3d11::RenderTargetView &&rtv,
mTexture(resource),
mRenderTarget(std::move(rtv)),
mDepthStencil(),
- mShaderResource(srv),
- mBlitShaderResource(blitSRV)
+ mShaderResource(srv.makeCopy()),
+ mBlitShaderResource(blitSRV.makeCopy())
{
- if (mTexture)
+ if (mRenderTarget.valid() && mTexture.valid())
{
- mTexture->AddRef();
- }
-
- if (mRenderTarget.valid() && mTexture)
- {
- mSubresourceIndex = GetRTVSubresourceIndex(mTexture, mRenderTarget.get());
+ mSubresourceIndex = GetRTVSubresourceIndex(mTexture.get(), mRenderTarget.get());
}
ASSERT(mFormatSet.formatID != angle::Format::ID::NONE || mWidth == 0 || mHeight == 0);
}
TextureRenderTarget11::TextureRenderTarget11(d3d11::DepthStencilView &&dsv,
- ID3D11Resource *resource,
+ const TextureHelper11 &resource,
const d3d11::SharedSRV &srv,
GLenum internalFormat,
const d3d11::Format &formatSet,
@@ -265,27 +260,21 @@ TextureRenderTarget11::TextureRenderTarget11(d3d11::DepthStencilView &&dsv,
mTexture(resource),
mRenderTarget(),
mDepthStencil(std::move(dsv)),
- mShaderResource(srv),
+ mShaderResource(srv.makeCopy()),
mBlitShaderResource()
{
- if (mTexture)
- {
- mTexture->AddRef();
- }
-
- if (mDepthStencil.valid() && mTexture)
+ if (mDepthStencil.valid() && mTexture.valid())
{
- mSubresourceIndex = GetDSVSubresourceIndex(mTexture, mDepthStencil.get());
+ mSubresourceIndex = GetDSVSubresourceIndex(mTexture.get(), mDepthStencil.get());
}
ASSERT(mFormatSet.formatID != angle::Format::ID::NONE || mWidth == 0 || mHeight == 0);
}
TextureRenderTarget11::~TextureRenderTarget11()
{
- SafeRelease(mTexture);
}
-ID3D11Resource *TextureRenderTarget11::getTexture() const
+const TextureHelper11 &TextureRenderTarget11::getTexture() const
{
return mTexture;
}
@@ -379,7 +368,7 @@ GLsizei SurfaceRenderTarget11::getSamples() const
return mSwapChain->getSamples();
}
-ID3D11Resource *SurfaceRenderTarget11::getTexture() const
+const TextureHelper11 &SurfaceRenderTarget11::getTexture() const
{
return (mDepth ? mSwapChain->getDepthStencilTexture() : mSwapChain->getOffscreenTexture());
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.h
index 2b442c5f875..579ded4de76 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.h
@@ -26,7 +26,7 @@ class RenderTarget11 : public RenderTargetD3D
RenderTarget11(const d3d11::Format &formatSet);
virtual ~RenderTarget11();
- virtual ID3D11Resource *getTexture() const = 0;
+ 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;
@@ -49,7 +49,7 @@ class TextureRenderTarget11 : public RenderTarget11
public:
// TextureRenderTarget11 takes ownership of any D3D11 resources it is given and will AddRef them
TextureRenderTarget11(d3d11::RenderTargetView &&rtv,
- ID3D11Resource *resource,
+ const TextureHelper11 &resource,
const d3d11::SharedSRV &srv,
const d3d11::SharedSRV &blitSRV,
GLenum internalFormat,
@@ -59,7 +59,7 @@ class TextureRenderTarget11 : public RenderTarget11
GLsizei depth,
GLsizei samples);
TextureRenderTarget11(d3d11::DepthStencilView &&dsv,
- ID3D11Resource *resource,
+ const TextureHelper11 &resource,
const d3d11::SharedSRV &srv,
GLenum internalFormat,
const d3d11::Format &formatSet,
@@ -75,7 +75,7 @@ class TextureRenderTarget11 : public RenderTarget11
GLenum getInternalFormat() const override;
GLsizei getSamples() const override;
- ID3D11Resource *getTexture() 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;
@@ -91,7 +91,7 @@ class TextureRenderTarget11 : public RenderTarget11
GLsizei mSamples;
unsigned int mSubresourceIndex;
- ID3D11Resource *mTexture;
+ TextureHelper11 mTexture;
d3d11::RenderTargetView mRenderTarget;
d3d11::DepthStencilView mDepthStencil;
d3d11::SharedSRV mShaderResource;
@@ -113,7 +113,7 @@ class SurfaceRenderTarget11 : public RenderTarget11
GLenum getInternalFormat() const override;
GLsizei getSamples() const override;
- ID3D11Resource *getTexture() 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;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
index bc57c68bb05..45e7706bd33 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
@@ -15,6 +15,7 @@
#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"
@@ -381,7 +382,8 @@ const uint32_t ScratchMemoryBufferLifetime = 1000;
Renderer11::Renderer11(egl::Display *display)
: RendererD3D(display),
- mStateCache(this),
+ mCreateDebugDevice(false),
+ mStateCache(),
mStateManager(this),
mLastHistogramUpdateTime(
ANGLEPlatformCurrent()->monotonicallyIncreasingTime(ANGLEPlatformCurrent())),
@@ -403,8 +405,6 @@ Renderer11::Renderer11(egl::Display *display)
mTrim = nullptr;
- mSyncQuery = nullptr;
-
mRenderer11DeviceCaps.supportsClearView = false;
mRenderer11DeviceCaps.supportsConstantBufferOffsets = false;
mRenderer11DeviceCaps.supportsDXGI1_2 = false;
@@ -424,15 +424,6 @@ Renderer11::Renderer11(egl::Display *display)
mDxgiAdapter = nullptr;
mDxgiFactory = nullptr;
- mDriverConstantBufferVS = nullptr;
- mDriverConstantBufferPS = nullptr;
- mDriverConstantBufferCS = nullptr;
-
- mAppliedVertexShader = angle::DirtyPointer;
- mAppliedGeometryShader = angle::DirtyPointer;
- mAppliedPixelShader = angle::DirtyPointer;
- mAppliedComputeShader = angle::DirtyPointer;
-
mAppliedTFObject = angle::DirtyPointer;
ZeroMemory(&mAdapterDescription, sizeof(mAdapterDescription));
@@ -498,6 +489,8 @@ Renderer11::Renderer11(egl::Display *display)
const EGLenum presentPath = static_cast<EGLenum>(attributes.get(
EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE, EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE));
mPresentPathFastEnabled = (presentPath == EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE);
+
+ mCreateDebugDevice = ShouldUseDebugLayers(attributes);
}
else if (display->getPlatform() == EGL_PLATFORM_DEVICE_EXT)
{
@@ -567,9 +560,8 @@ egl::Error Renderer11::initialize()
result = mDevice->QueryInterface(__uuidof(IDXGIDevice2), (void **)&dxgiDevice2);
if (FAILED(result))
{
- return egl::Error(
- EGL_NOT_INITIALIZED, D3D11_INIT_INCOMPATIBLE_DXGI,
- "DXGI 1.2 required to present to HWNDs owned by another process.");
+ return egl::EglNotInitialized(D3D11_INIT_INCOMPATIBLE_DXGI)
+ << "DXGI 1.2 required to present to HWNDs owned by another process.";
}
SafeRelease(dxgiDevice2);
}
@@ -589,16 +581,15 @@ egl::Error Renderer11::initialize()
if (FAILED(result))
{
- return egl::Error(EGL_NOT_INITIALIZED, D3D11_INIT_OTHER_ERROR,
- "Could not query DXGI device.");
+ return egl::EglNotInitialized(D3D11_INIT_OTHER_ERROR) << "Could not query DXGI device.";
}
result = dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void **)&mDxgiAdapter);
if (FAILED(result))
{
- return egl::Error(EGL_NOT_INITIALIZED, D3D11_INIT_OTHER_ERROR,
- "Could not retrieve DXGI adapter");
+ return egl::EglNotInitialized(D3D11_INIT_OTHER_ERROR)
+ << "Could not retrieve DXGI adapter";
}
SafeRelease(dxgiDevice);
@@ -638,8 +629,8 @@ egl::Error Renderer11::initialize()
if (FAILED(result))
{
- return egl::Error(EGL_NOT_INITIALIZED, D3D11_INIT_OTHER_ERROR,
- "Could not read DXGI adaptor description.");
+ return egl::EglNotInitialized(D3D11_INIT_OTHER_ERROR)
+ << "Could not read DXGI adaptor description.";
}
memset(mDescription, 0, sizeof(mDescription));
@@ -649,8 +640,8 @@ egl::Error Renderer11::initialize()
if (!mDxgiFactory || FAILED(result))
{
- return egl::Error(EGL_NOT_INITIALIZED, D3D11_INIT_OTHER_ERROR,
- "Could not create DXGI factory.");
+ return egl::EglNotInitialized(D3D11_INIT_OTHER_ERROR)
+ << "Could not create DXGI factory.";
}
}
@@ -682,7 +673,7 @@ egl::Error Renderer11::initialize()
initializeDevice();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error Renderer11::initializeD3DDevice()
@@ -702,8 +693,8 @@ egl::Error Renderer11::initializeD3DDevice()
if (mD3d11Module == nullptr || mDxgiModule == nullptr)
{
- return egl::Error(EGL_NOT_INITIALIZED, D3D11_INIT_MISSING_DEP,
- "Could not load D3D11 or DXGI library.");
+ return egl::EglNotInitialized(D3D11_INIT_MISSING_DEP)
+ << "Could not load D3D11 or DXGI library.";
}
// create the D3D11 device
@@ -713,13 +704,13 @@ egl::Error Renderer11::initializeD3DDevice()
if (D3D11CreateDevice == nullptr)
{
- return egl::Error(EGL_NOT_INITIALIZED, D3D11_INIT_MISSING_DEP,
- "Could not retrieve D3D11CreateDevice address.");
+ return egl::EglNotInitialized(D3D11_INIT_MISSING_DEP)
+ << "Could not retrieve D3D11CreateDevice address.";
}
}
#endif
-#ifdef _DEBUG
+ if (mCreateDebugDevice)
{
TRACE_EVENT0("gpu.angle", "D3D11CreateDevice (Debug)");
result = D3D11CreateDevice(nullptr, mRequestedDriverType, nullptr,
@@ -727,15 +718,14 @@ egl::Error Renderer11::initializeD3DDevice()
static_cast<unsigned int>(mAvailableFeatureLevels.size()),
D3D11_SDK_VERSION, &mDevice,
&(mRenderer11DeviceCaps.featureLevel), &mDeviceContext);
- }
- if (!mDevice || FAILED(result))
- {
- WARN() << "Failed creating Debug D3D11 device - falling back to release runtime.";
+ if (!mDevice || FAILED(result))
+ {
+ WARN() << "Failed creating Debug D3D11 device - falling back to release runtime.";
+ }
}
if (!mDevice || FAILED(result))
-#endif
{
SCOPED_ANGLE_HISTOGRAM_TIMER("GPU.ANGLE.D3D11CreateDeviceMS");
TRACE_EVENT0("gpu.angle", "D3D11CreateDevice");
@@ -750,8 +740,8 @@ egl::Error Renderer11::initializeD3DDevice()
{
ANGLE_HISTOGRAM_SPARSE_SLOWLY("GPU.ANGLE.D3D11CreateDeviceError",
static_cast<int>(result));
- return egl::Error(EGL_NOT_INITIALIZED, D3D11_INIT_CREATEDEVICE_ERROR,
- "Could not create D3D11 device.");
+ return egl::EglNotInitialized(D3D11_INIT_CREATEDEVICE_ERROR)
+ << "Could not create D3D11 device.";
}
}
}
@@ -764,13 +754,13 @@ egl::Error Renderer11::initializeD3DDevice()
ID3D11Device *d3dDevice = reinterpret_cast<ID3D11Device *>(device);
if (FAILED(d3dDevice->GetDeviceRemovedReason()))
{
- return egl::Error(EGL_NOT_INITIALIZED, "Inputted D3D11 device has been lost.");
+ return egl::EglNotInitialized() << "Inputted D3D11 device has been lost.";
}
if (d3dDevice->GetFeatureLevel() < D3D_FEATURE_LEVEL_9_3)
{
- return egl::Error(EGL_NOT_INITIALIZED,
- "Inputted D3D11 device must be Feature Level 9_3 or greater.");
+ 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.
@@ -782,7 +772,7 @@ egl::Error Renderer11::initializeD3DDevice()
d3d11::SetDebugName(mDeviceContext, "DeviceContext");
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
// do any one-time device initialization
@@ -795,8 +785,7 @@ void Renderer11::initializeDevice()
populateRenderer11DeviceCaps();
- mStateCache.initialize(mDevice);
- mInputLayoutCache.initialize();
+ mStateCache.clear();
ASSERT(!mVertexDataManager && !mIndexDataManager);
mVertexDataManager = new VertexDataManager(this);
@@ -842,7 +831,8 @@ void Renderer11::initializeDevice()
mStateManager.initialize(rendererCaps);
- markAllStateDirty();
+ // No context is available here, use the proxy context in the display.
+ markAllStateDirty(mDisplay->getProxyContext());
// Gather stats on DXGI and D3D feature level
ANGLE_HISTOGRAM_BOOLEAN("GPU.ANGLE.SupportsDXGI1_2", mRenderer11DeviceCaps.supportsDXGI1_2);
@@ -1151,10 +1141,11 @@ void Renderer11::generateDisplayExtensions(egl::DisplayExtensions *outExtensions
// Contexts are virtualized so textures can be shared globally
outExtensions->displayTextureShareGroup = true;
- outExtensions->createContextRobustResourceInitialization = true;
-
// getSyncValues requires direct composition.
outExtensions->getSyncValues = outExtensions->directComposition;
+
+ // D3D11 can be used without a swap chain
+ outExtensions->surfacelessContext = true;
}
gl::Error Renderer11::flush()
@@ -1165,25 +1156,18 @@ gl::Error Renderer11::flush()
gl::Error Renderer11::finish()
{
- HRESULT result;
-
- if (!mSyncQuery)
+ if (!mSyncQuery.valid())
{
D3D11_QUERY_DESC queryDesc;
queryDesc.Query = D3D11_QUERY_EVENT;
queryDesc.MiscFlags = 0;
- result = mDevice->CreateQuery(&queryDesc, &mSyncQuery);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create event query, result: 0x%X.",
- result);
- }
+ ANGLE_TRY(allocateResource(queryDesc, &mSyncQuery));
}
- mDeviceContext->End(mSyncQuery);
+ mDeviceContext->End(mSyncQuery.get());
+ HRESULT result = S_OK;
unsigned int attempt = 0;
do
{
@@ -1191,11 +1175,10 @@ gl::Error Renderer11::finish()
UINT flags = (attempt % flushFrequency == 0) ? 0 : D3D11_ASYNC_GETDATA_DONOTFLUSH;
attempt++;
- result = mDeviceContext->GetData(mSyncQuery, nullptr, 0, flags);
+ result = mDeviceContext->GetData(mSyncQuery.get(), nullptr, 0, flags);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to get event query data, result: 0x%X.",
- result);
+ return gl::OutOfMemory() << "Failed to get event query data, " << gl::FmtHR(result);
}
if (result == S_FALSE)
@@ -1207,7 +1190,7 @@ gl::Error Renderer11::finish()
if (testDeviceLost())
{
mDisplay->notifyDeviceLost();
- return gl::Error(GL_OUT_OF_MEMORY, "Device was lost while waiting for sync.");
+ return gl::OutOfMemory() << "Device was lost while waiting for sync.";
}
} while (result == S_FALSE);
@@ -1246,7 +1229,7 @@ egl::Error Renderer11::getD3DTextureInfo(const egl::Config *configuration,
ID3D11Texture2D *texture = d3d11::DynamicCastComObject<ID3D11Texture2D>(d3dTexture);
if (texture == nullptr)
{
- return egl::Error(EGL_BAD_PARAMETER, "client buffer is not a ID3D11Texture2D");
+ return egl::EglBadParameter() << "client buffer is not a ID3D11Texture2D";
}
ID3D11Device *textureDevice = nullptr;
@@ -1254,7 +1237,7 @@ egl::Error Renderer11::getD3DTextureInfo(const egl::Config *configuration,
if (textureDevice != mDevice)
{
SafeRelease(texture);
- return egl::Error(EGL_BAD_PARAMETER, "Texture's device does not match.");
+ return egl::EglBadParameter() << "Texture's device does not match.";
}
SafeRelease(textureDevice);
@@ -1278,7 +1261,7 @@ egl::Error Renderer11::getD3DTextureInfo(const egl::Config *configuration,
// not one.
if (configuration->samples != 0 || desc.SampleDesc.Count != 1)
{
- return egl::Error(EGL_BAD_PARAMETER, "Texture's sample count does not match.");
+ return egl::EglBadParameter() << "Texture's sample count does not match.";
}
}
// From table egl.restrictions in EGL_ANGLE_d3d_texture_client_buffer.
@@ -1293,8 +1276,8 @@ egl::Error Renderer11::getD3DTextureInfo(const egl::Config *configuration,
break;
default:
- return egl::Error(EGL_BAD_PARAMETER, "Unknown client buffer texture format: %u.",
- desc.Format);
+ return egl::EglBadParameter()
+ << "Unknown client buffer texture format: " << desc.Format;
}
if (fboFormat)
@@ -1303,7 +1286,7 @@ egl::Error Renderer11::getD3DTextureInfo(const egl::Config *configuration,
*fboFormat = angleFormat.fboImplementationInternalFormat;
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error Renderer11::validateShareHandle(const egl::Config *config,
@@ -1312,7 +1295,7 @@ egl::Error Renderer11::validateShareHandle(const egl::Config *config,
{
if (shareHandle == nullptr)
{
- return egl::Error(EGL_BAD_PARAMETER, "NULL share handle.");
+ return egl::EglBadParameter() << "NULL share handle.";
}
ID3D11Resource *tempResource11 = nullptr;
@@ -1320,7 +1303,7 @@ egl::Error Renderer11::validateShareHandle(const egl::Config *config,
(void **)&tempResource11);
if (FAILED(result))
{
- return egl::Error(EGL_BAD_PARAMETER, "Failed to open share handle, result: 0x%X.", result);
+ return egl::EglBadParameter() << "Failed to open share handle, " << gl::FmtHR(result);
}
ID3D11Texture2D *texture2D = d3d11::DynamicCastComObject<ID3D11Texture2D>(tempResource11);
@@ -1328,8 +1311,8 @@ egl::Error Renderer11::validateShareHandle(const egl::Config *config,
if (texture2D == nullptr)
{
- return egl::Error(EGL_BAD_PARAMETER,
- "Failed to query ID3D11Texture2D object from share handle.");
+ return egl::EglBadParameter()
+ << "Failed to query ID3D11Texture2D object from share handle.";
}
D3D11_TEXTURE2D_DESC desc = {0};
@@ -1346,10 +1329,10 @@ egl::Error Renderer11::validateShareHandle(const egl::Config *config,
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::Error(EGL_BAD_PARAMETER, "Invalid texture parameters in share handle texture.");
+ return egl::EglBadParameter() << "Invalid texture parameters in share handle texture.";
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
SwapChainD3D *Renderer11::createSwapChain(NativeWindowD3D *nativeWindow,
@@ -1369,7 +1352,7 @@ void *Renderer11::getD3DDevice()
return reinterpret_cast<void *>(mDevice);
}
-gl::Error Renderer11::generateSwizzle(gl::Texture *texture)
+gl::Error Renderer11::generateSwizzle(const gl::Context *context, gl::Texture *texture)
{
if (texture)
{
@@ -1377,36 +1360,37 @@ gl::Error Renderer11::generateSwizzle(gl::Texture *texture)
ASSERT(textureD3D);
TextureStorage *texStorage = nullptr;
- ANGLE_TRY(textureD3D->getNativeTexture(&texStorage));
+ ANGLE_TRY(textureD3D->getNativeTexture(context, &texStorage));
if (texStorage)
{
TextureStorage11 *storage11 = GetAs<TextureStorage11>(texStorage);
const gl::TextureState &textureState = texture->getTextureState();
- ANGLE_TRY(storage11->generateSwizzles(textureState.getSwizzleState()));
+ ANGLE_TRY(storage11->generateSwizzles(context, textureState.getSwizzleState()));
}
}
return gl::NoError();
}
-gl::Error Renderer11::generateSwizzles(const gl::ContextState &data, gl::SamplerType type)
+gl::Error Renderer11::generateSwizzles(const gl::Context *context, gl::SamplerType type)
{
- ProgramD3D *programD3D = GetImplAs<ProgramD3D>(data.getState().getProgram());
+ 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, data.getCaps());
+ GLint textureUnit = programD3D->getSamplerMapping(type, i, context->getCaps());
if (textureUnit != -1)
{
- gl::Texture *texture = data.getState().getSamplerTexture(textureUnit, textureType);
+ gl::Texture *texture = glState.getSamplerTexture(textureUnit, textureType);
ASSERT(texture);
if (texture->getTextureState().swizzleRequired())
{
- ANGLE_TRY(generateSwizzle(texture));
+ ANGLE_TRY(generateSwizzle(context, texture));
}
}
}
@@ -1414,13 +1398,14 @@ gl::Error Renderer11::generateSwizzles(const gl::ContextState &data, gl::Sampler
return gl::NoError();
}
-gl::Error Renderer11::generateSwizzles(const gl::ContextState &data)
+gl::Error Renderer11::generateSwizzles(const gl::Context *context)
{
- ANGLE_TRY(generateSwizzles(data, gl::SAMPLER_VERTEX));
- ANGLE_TRY(generateSwizzles(data, gl::SAMPLER_PIXEL));
+ ANGLE_TRY(generateSwizzles(context, gl::SAMPLER_VERTEX));
+ ANGLE_TRY(generateSwizzles(context, gl::SAMPLER_PIXEL));
return gl::NoError();
}
-gl::Error Renderer11::setSamplerState(gl::SamplerType type,
+gl::Error Renderer11::setSamplerState(const gl::Context *context,
+ gl::SamplerType type,
int index,
gl::Texture *texture,
const gl::SamplerState &samplerState)
@@ -1430,7 +1415,7 @@ gl::Error Renderer11::setSamplerState(gl::SamplerType type,
TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture);
TextureStorage *storage = nullptr;
- ANGLE_TRY(textureD3D->getNativeTexture(&storage));
+ ANGLE_TRY(textureD3D->getNativeTexture(context, &storage));
// Storage should exist, texture should be complete
ASSERT(storage);
@@ -1449,7 +1434,7 @@ gl::Error Renderer11::setSamplerState(gl::SamplerType type,
memcmp(&samplerState, &mCurPixelSamplerStates[index], sizeof(gl::SamplerState)) != 0)
{
ID3D11SamplerState *dxSamplerState = nullptr;
- ANGLE_TRY(mStateCache.getSamplerState(samplerState, &dxSamplerState));
+ ANGLE_TRY(mStateCache.getSamplerState(this, samplerState, &dxSamplerState));
ASSERT(dxSamplerState != nullptr);
mDeviceContext->PSSetSamplers(index, 1, &dxSamplerState);
@@ -1469,7 +1454,7 @@ gl::Error Renderer11::setSamplerState(gl::SamplerType type,
memcmp(&samplerState, &mCurVertexSamplerStates[index], sizeof(gl::SamplerState)) != 0)
{
ID3D11SamplerState *dxSamplerState = nullptr;
- ANGLE_TRY(mStateCache.getSamplerState(samplerState, &dxSamplerState));
+ ANGLE_TRY(mStateCache.getSamplerState(this, samplerState, &dxSamplerState));
ASSERT(dxSamplerState != nullptr);
mDeviceContext->VSSetSamplers(index, 1, &dxSamplerState);
@@ -1489,7 +1474,7 @@ gl::Error Renderer11::setSamplerState(gl::SamplerType type,
memcmp(&samplerState, &mCurComputeSamplerStates[index], sizeof(gl::SamplerState)) != 0)
{
ID3D11SamplerState *dxSamplerState = nullptr;
- ANGLE_TRY(mStateCache.getSamplerState(samplerState, &dxSamplerState));
+ ANGLE_TRY(mStateCache.getSamplerState(this, samplerState, &dxSamplerState));
ASSERT(dxSamplerState != nullptr);
mDeviceContext->CSSetSamplers(index, 1, &dxSamplerState);
@@ -1510,27 +1495,30 @@ gl::Error Renderer11::setSamplerState(gl::SamplerType type,
return gl::NoError();
}
-gl::Error Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *texture)
+gl::Error Renderer11::setTexture(const gl::Context *context,
+ gl::SamplerType type,
+ int index,
+ gl::Texture *texture)
{
- d3d11::SharedSRV textureSRV;
+ const d3d11::SharedSRV *textureSRV = nullptr;
if (texture)
{
TextureD3D *textureImpl = GetImplAs<TextureD3D>(texture);
TextureStorage *texStorage = nullptr;
- ANGLE_TRY(textureImpl->getNativeTexture(&texStorage));
+ 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(texture->getTextureState(), &textureSRV));
+ ANGLE_TRY(storage11->getSRV(context, texture->getTextureState(), &textureSRV));
- // If we get NULL back from getSRV here, something went wrong in the texture class and we're
- // unexpectedly missing the shader resource view
- ASSERT(textureSRV.valid());
+ // 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();
}
@@ -1540,7 +1528,7 @@ gl::Error Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *t
(type == gl::SAMPLER_VERTEX &&
static_cast<unsigned int>(index) < getNativeCaps().maxVertexTextureImageUnits));
- mStateManager.setShaderResource(type, index, textureSRV.get());
+ mStateManager.setShaderResource(type, index, textureSRV->get());
return gl::NoError();
}
@@ -1559,7 +1547,7 @@ gl::Error Renderer11::setUniformBuffers(const gl::ContextState &data,
continue;
}
- const OffsetBindingPointer<gl::Buffer> &uniformBuffer =
+ const gl::OffsetBindingPointer<gl::Buffer> &uniformBuffer =
data.getState().getIndexedUniformBuffer(binding);
GLintptr uniformBufferOffset = uniformBuffer.getOffset();
GLsizeiptr uniformBufferSize = uniformBuffer.getSize();
@@ -1580,7 +1568,7 @@ gl::Error Renderer11::setUniformBuffers(const gl::ContextState &data,
if (!constantBuffer)
{
- return gl::Error(GL_OUT_OF_MEMORY, "Error retrieving constant buffer");
+ return gl::OutOfMemory() << "Error retrieving constant buffer";
}
if (mCurrentConstantBufferVS[uniformBufferIndex] != bufferStorage->getSerial() ||
@@ -1619,7 +1607,7 @@ gl::Error Renderer11::setUniformBuffers(const gl::ContextState &data,
continue;
}
- const OffsetBindingPointer<gl::Buffer> &uniformBuffer =
+ const gl::OffsetBindingPointer<gl::Buffer> &uniformBuffer =
data.getState().getIndexedUniformBuffer(binding);
GLintptr uniformBufferOffset = uniformBuffer.getOffset();
GLsizeiptr uniformBufferSize = uniformBuffer.getSize();
@@ -1640,7 +1628,7 @@ gl::Error Renderer11::setUniformBuffers(const gl::ContextState &data,
if (!constantBuffer)
{
- return gl::Error(GL_OUT_OF_MEMORY, "Error retrieving constant buffer");
+ return gl::OutOfMemory() << "Error retrieving constant buffer";
}
if (mCurrentConstantBufferPS[uniformBufferIndex] != bufferStorage->getSerial() ||
@@ -1671,58 +1659,6 @@ gl::Error Renderer11::setUniformBuffers(const gl::ContextState &data,
return gl::NoError();
}
-gl::Error Renderer11::updateState(ContextImpl *contextImpl, GLenum drawMode)
-{
- const auto &data = contextImpl->getContextState();
- const auto &glState = data.getState();
-
- // 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(mStateManager.syncFramebuffer(contextImpl, framebuffer));
-
- // Set the present path state
- auto firstColorAttachment = framebuffer->getFirstColorbuffer();
- const bool presentPathFastActive = UsePresentPathFast(this, firstColorAttachment);
- mStateManager.updatePresentPath(presentPathFastActive, firstColorAttachment);
-
- // Setting viewport state
- mStateManager.setViewport(&data.getCaps(), glState.getViewport(), glState.getNearPlane(),
- glState.getFarPlane());
-
- // Setting scissor state
- mStateManager.setScissorRectangle(glState.getScissor(), glState.isScissorTestEnabled());
-
- // Applying rasterizer state to D3D11 device
- // 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;
- if (firstColorAttachment)
- {
- ASSERT(firstColorAttachment->isAttached());
- RenderTarget11 *renderTarget = nullptr;
- ANGLE_TRY(firstColorAttachment->getRenderTarget(&renderTarget));
- samples = renderTarget->getSamples();
- }
- gl::RasterizerState rasterizer = glState.getRasterizerState();
- rasterizer.pointDrawMode = (drawMode == GL_POINTS);
- rasterizer.multiSample = (samples != 0);
-
- ANGLE_TRY(mStateManager.setRasterizerState(rasterizer));
-
- // Setting blend state
- unsigned int mask = GetBlendSampleMask(data, samples);
- ANGLE_TRY(mStateManager.setBlendState(framebuffer, glState.getBlendState(),
- glState.getBlendColor(), mask));
-
- // Setting depth stencil state
- ANGLE_TRY(mStateManager.setDepthStencilState(glState));
-
- return gl::NoError();
-}
-
bool Renderer11::applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSize)
{
D3D11_PRIMITIVE_TOPOLOGY primitiveTopology = D3D_PRIMITIVE_TOPOLOGY_UNDEFINED;
@@ -1774,26 +1710,23 @@ bool Renderer11::applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSi
primitiveTopology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
}
- if (primitiveTopology != mCurrentPrimitiveTopology)
- {
- mDeviceContext->IASetPrimitiveTopology(primitiveTopology);
- mCurrentPrimitiveTopology = primitiveTopology;
- }
+ mStateManager.setPrimitiveTopology(primitiveTopology);
return count >= minCount;
}
-gl::Error Renderer11::applyVertexBuffer(const gl::State &state,
+gl::Error Renderer11::applyVertexBuffer(const gl::Context *context,
GLenum mode,
GLint first,
GLsizei count,
GLsizei instances,
TranslatedIndexData *indexInfo)
{
+ const auto &state = context->getGLState();
const auto &vertexArray = state.getVertexArray();
auto *vertexArray11 = GetImplAs<VertexArray11>(vertexArray);
- ANGLE_TRY(vertexArray11->updateDirtyAndDynamicAttribs(mVertexDataManager, state, first, count,
+ ANGLE_TRY(vertexArray11->updateDirtyAndDynamicAttribs(context, mVertexDataManager, first, count,
instances));
ANGLE_TRY(mStateManager.updateCurrentValueAttribs(state, mVertexDataManager));
@@ -1852,7 +1785,7 @@ gl::Error Renderer11::applyIndexBuffer(const gl::ContextState &data,
else
{
IndexBuffer11 *indexBuffer = GetAs<IndexBuffer11>(indexInfo->indexBuffer);
- buffer = indexBuffer->getBuffer();
+ buffer = indexBuffer->getBuffer().get();
}
mAppliedIBChanged = false;
@@ -1906,12 +1839,13 @@ gl::Error Renderer11::applyTransformFeedbackBuffers(const gl::ContextState &data
return gl::NoError();
}
-gl::Error Renderer11::drawArraysImpl(const gl::ContextState &data,
+gl::Error Renderer11::drawArraysImpl(const gl::Context *context,
GLenum mode,
GLint startVertex,
GLsizei count,
GLsizei instances)
{
+ const auto &data = context->getContextState();
const auto &glState = data.getState();
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
@@ -1921,7 +1855,7 @@ gl::Error Renderer11::drawArraysImpl(const gl::ContextState &data,
// 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.
- mDeviceContext->PSSetShader(nullptr, nullptr, 0);
+ mStateManager.setPixelShader(nullptr);
if (instances > 0)
{
@@ -1933,8 +1867,8 @@ gl::Error Renderer11::drawArraysImpl(const gl::ContextState &data,
}
rx::ShaderExecutableD3D *pixelExe = nullptr;
- ANGLE_TRY(
- programD3D->getPixelExecutableForFramebuffer(glState.getDrawFramebuffer(), &pixelExe));
+ ANGLE_TRY(programD3D->getPixelExecutableForFramebuffer(
+ context, glState.getDrawFramebuffer(), &pixelExe));
// Skip the draw call if rasterizer discard is enabled (or no fragment shader).
if (!pixelExe || glState.getRasterizerState().rasterizerDiscard)
@@ -1942,20 +1876,15 @@ gl::Error Renderer11::drawArraysImpl(const gl::ContextState &data,
return gl::NoError();
}
- ID3D11PixelShader *pixelShader = GetAs<ShaderExecutable11>(pixelExe)->getPixelShader();
- ASSERT(reinterpret_cast<uintptr_t>(pixelShader) == mAppliedPixelShader);
- mDeviceContext->PSSetShader(pixelShader, nullptr, 0);
+ mStateManager.setPixelShader(&GetAs<ShaderExecutable11>(pixelExe)->getPixelShader());
// Retrieve the geometry shader.
rx::ShaderExecutableD3D *geometryExe = nullptr;
ANGLE_TRY(
programD3D->getGeometryExecutableForPrimitiveType(data, mode, &geometryExe, nullptr));
- ID3D11GeometryShader *geometryShader =
- (geometryExe ? GetAs<ShaderExecutable11>(geometryExe)->getGeometryShader() : nullptr);
- mAppliedGeometryShader = reinterpret_cast<uintptr_t>(geometryShader);
- ASSERT(geometryShader);
- mDeviceContext->GSSetShader(geometryShader, nullptr, 0);
+ mStateManager.setGeometryShader(
+ &GetAs<ShaderExecutable11>(geometryExe)->getGeometryShader());
if (instances > 0)
{
@@ -2092,14 +2021,15 @@ gl::Error Renderer11::drawElementsImpl(const gl::ContextState &data,
return gl::NoError();
}
-bool Renderer11::supportsFastIndirectDraw(const gl::State &state, GLenum mode, GLenum type)
+bool Renderer11::supportsFastIndirectDraw(const gl::Context *context, GLenum mode, GLenum type)
{
- const auto &vertexArray = state.getVertexArray();
+ const auto &glState = context->getGLState();
+ const auto &vertexArray = glState.getVertexArray();
auto *vertexArray11 = GetImplAs<VertexArray11>(vertexArray);
// Indirect 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->hasDynamicAttrib(state) || mode == GL_LINE_LOOP || mode == GL_TRIANGLE_FAN)
+ if (vertexArray11->hasDynamicAttrib(context) || mode == GL_LINE_LOOP || mode == GL_TRIANGLE_FAN)
{
return false;
}
@@ -2113,31 +2043,32 @@ bool Renderer11::supportsFastIndirectDraw(const gl::State &state, GLenum mode, G
// primitive restart index in it since it also needs to know the index range and count.
// So, for all other situations, we fall back to normal draw instead of indirect draw.
bool primitiveRestartWorkaround = mIndexDataManager->usePrimitiveRestartWorkaround(
- state.isPrimitiveRestartEnabled(), type);
+ glState.isPrimitiveRestartEnabled(), type);
return !mIndexDataManager->isStreamingIndexData(primitiveRestartWorkaround, type,
elementArrayBuffer);
}
return true;
}
-gl::Error Renderer11::drawArraysIndirectImpl(const gl::ContextState &data,
+gl::Error Renderer11::drawArraysIndirectImpl(const gl::Context *context,
GLenum mode,
const void *indirect)
{
- if (skipDraw(data, mode))
+ const auto &contextState = context->getContextState();
+ if (skipDraw(contextState, mode))
{
return gl::NoError();
}
- const auto &glState = data.getState();
+ const auto &glState = context->getGLState();
gl::Buffer *drawIndirectBuffer = glState.getDrawIndirectBuffer();
ASSERT(drawIndirectBuffer);
Buffer11 *storage = GetImplAs<Buffer11>(drawIndirectBuffer);
uintptr_t offset = reinterpret_cast<uintptr_t>(indirect);
- if (supportsFastIndirectDraw(glState, mode, GL_NONE))
+ if (supportsFastIndirectDraw(context, mode, GL_NONE))
{
- applyVertexBuffer(glState, mode, 0, 0, 0, nullptr);
+ applyVertexBuffer(context, mode, 0, 0, 0, nullptr);
ID3D11Buffer *buffer = nullptr;
ANGLE_TRY_RESULT(storage->getBuffer(BUFFER_USAGE_INDIRECT), buffer);
mDeviceContext->DrawInstancedIndirect(buffer, static_cast<unsigned int>(offset));
@@ -2153,42 +2084,43 @@ gl::Error Renderer11::drawArraysIndirectImpl(const gl::ContextState &data,
GLuint instances = args->instanceCount;
GLuint first = args->first;
- ANGLE_TRY(applyVertexBuffer(glState, mode, first, count, instances, nullptr));
+ ANGLE_TRY(applyVertexBuffer(context, mode, first, count, instances, nullptr));
if (mode == GL_LINE_LOOP)
{
- return drawLineLoop(data, count, GL_NONE, nullptr, 0, instances);
+ return drawLineLoop(contextState, count, GL_NONE, nullptr, 0, instances);
}
if (mode == GL_TRIANGLE_FAN)
{
- return drawTriangleFan(data, count, GL_NONE, nullptr, 0, instances);
+ return drawTriangleFan(contextState, count, GL_NONE, nullptr, 0, instances);
}
mDeviceContext->DrawInstanced(count, instances, 0, 0);
return gl::NoError();
}
-gl::Error Renderer11::drawElementsIndirectImpl(const gl::ContextState &data,
+gl::Error Renderer11::drawElementsIndirectImpl(const gl::Context *context,
GLenum mode,
GLenum type,
const void *indirect)
{
- if (skipDraw(data, mode))
+ const auto &contextState = context->getContextState();
+ if (skipDraw(contextState, mode))
{
return gl::NoError();
}
- const auto &glState = data.getState();
+ const auto &glState = context->getGLState();
gl::Buffer *drawIndirectBuffer = glState.getDrawIndirectBuffer();
ASSERT(drawIndirectBuffer);
Buffer11 *storage = GetImplAs<Buffer11>(drawIndirectBuffer);
uintptr_t offset = reinterpret_cast<uintptr_t>(indirect);
TranslatedIndexData indexInfo;
- if (supportsFastIndirectDraw(glState, mode, type))
+ if (supportsFastIndirectDraw(context, mode, type))
{
- ANGLE_TRY(applyIndexBuffer(data, nullptr, 0, mode, type, &indexInfo));
- ANGLE_TRY(applyVertexBuffer(glState, mode, 0, 0, 0, &indexInfo));
+ ANGLE_TRY(applyIndexBuffer(contextState, nullptr, 0, mode, type, &indexInfo));
+ ANGLE_TRY(applyVertexBuffer(context, mode, 0, 0, 0, &indexInfo));
ID3D11Buffer *buffer = nullptr;
ANGLE_TRY_RESULT(storage->getBuffer(BUFFER_USAGE_INDIRECT), buffer);
mDeviceContext->DrawIndexedInstancedIndirect(buffer, static_cast<unsigned int>(offset));
@@ -2216,20 +2148,20 @@ gl::Error Renderer11::drawElementsIndirectImpl(const gl::ContextState &data,
glState.isPrimitiveRestartEnabled(), &indexRange));
indexInfo.indexRange = indexRange;
- ANGLE_TRY(applyIndexBuffer(data, indices, count, mode, type, &indexInfo));
+ ANGLE_TRY(applyIndexBuffer(contextState, indices, count, mode, type, &indexInfo));
size_t vertexCount = indexRange.vertexCount();
- ANGLE_TRY(applyVertexBuffer(glState, mode, static_cast<GLsizei>(indexRange.start) + baseVertex,
+ ANGLE_TRY(applyVertexBuffer(context, mode, static_cast<GLsizei>(indexRange.start) + baseVertex,
static_cast<GLsizei>(vertexCount), instances, &indexInfo));
int baseVertexLocation = -static_cast<int>(indexRange.start);
if (mode == GL_LINE_LOOP)
{
- return drawLineLoop(data, count, type, indices, baseVertexLocation, instances);
+ return drawLineLoop(contextState, count, type, indices, baseVertexLocation, instances);
}
if (mode == GL_TRIANGLE_FAN)
{
- return drawTriangleFan(data, count, type, indices, baseVertexLocation, instances);
+ return drawTriangleFan(contextState, count, type, indices, baseVertexLocation, instances);
}
mDeviceContext->DrawIndexedInstanced(count, instances, 0, baseVertexLocation, 0);
@@ -2279,9 +2211,8 @@ gl::Error Renderer11::drawLineLoop(const gl::ContextState &data,
if (static_cast<unsigned int>(count) + 1 >
(std::numeric_limits<unsigned int>::max() / sizeof(unsigned int)))
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create a 32-bit looping index buffer for GL_LINE_LOOP, too "
- "many indices required.");
+ 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),
@@ -2302,14 +2233,14 @@ gl::Error Renderer11::drawLineLoop(const gl::ContextState &data,
ANGLE_TRY(mLineLoopIB->unmapBuffer());
IndexBuffer11 *indexBuffer = GetAs<IndexBuffer11>(mLineLoopIB->getIndexBuffer());
- ID3D11Buffer *d3dIndexBuffer = indexBuffer->getBuffer();
+ const d3d11::Buffer &d3dIndexBuffer = indexBuffer->getBuffer();
DXGI_FORMAT indexFormat = indexBuffer->getIndexFormat();
- if (mAppliedIB != d3dIndexBuffer || mAppliedIBFormat != indexFormat ||
+ if (mAppliedIB != d3dIndexBuffer.get() || mAppliedIBFormat != indexFormat ||
mAppliedIBOffset != offset)
{
- mDeviceContext->IASetIndexBuffer(d3dIndexBuffer, indexFormat, offset);
- mAppliedIB = d3dIndexBuffer;
+ mDeviceContext->IASetIndexBuffer(d3dIndexBuffer.get(), indexFormat, offset);
+ mAppliedIB = d3dIndexBuffer.get();
mAppliedIBFormat = indexFormat;
mAppliedIBOffset = offset;
}
@@ -2371,9 +2302,8 @@ gl::Error Renderer11::drawTriangleFan(const gl::ContextState &data,
if (numTris > (std::numeric_limits<unsigned int>::max() / (sizeof(unsigned int) * 3)))
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create a scratch index buffer for GL_TRIANGLE_FAN, too many "
- "indices required.");
+ return gl::OutOfMemory() << "Failed to create a scratch index buffer for GL_TRIANGLE_FAN, "
+ "too many indices required.";
}
GetTriFanIndices(indexPointer, type, count, data.getState().isPrimitiveRestartEnabled(),
@@ -2392,14 +2322,14 @@ gl::Error Renderer11::drawTriangleFan(const gl::ContextState &data,
ANGLE_TRY(mTriangleFanIB->unmapBuffer());
IndexBuffer11 *indexBuffer = GetAs<IndexBuffer11>(mTriangleFanIB->getIndexBuffer());
- ID3D11Buffer *d3dIndexBuffer = indexBuffer->getBuffer();
+ const d3d11::Buffer &d3dIndexBuffer = indexBuffer->getBuffer();
DXGI_FORMAT indexFormat = indexBuffer->getIndexFormat();
- if (mAppliedIB != d3dIndexBuffer || mAppliedIBFormat != indexFormat ||
+ if (mAppliedIB != d3dIndexBuffer.get() || mAppliedIBFormat != indexFormat ||
mAppliedIBOffset != offset)
{
- mDeviceContext->IASetIndexBuffer(d3dIndexBuffer, indexFormat, offset);
- mAppliedIB = d3dIndexBuffer;
+ mDeviceContext->IASetIndexBuffer(d3dIndexBuffer.get(), indexFormat, offset);
+ mAppliedIB = d3dIndexBuffer.get();
mAppliedIBFormat = indexFormat;
mAppliedIBOffset = offset;
}
@@ -2418,11 +2348,12 @@ gl::Error Renderer11::drawTriangleFan(const gl::ContextState &data,
return gl::NoError();
}
-gl::Error Renderer11::applyShaders(const gl::ContextState &data, GLenum drawMode)
+gl::Error Renderer11::applyShaders(const gl::Context *context, GLenum drawMode)
{
// This method is called single-threaded.
ANGLE_TRY(ensureHLSLCompilerInitialized());
+ const auto &data = context->getContextState();
const auto &glState = data.getState();
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
programD3D->updateCachedInputLayout(glState);
@@ -2434,63 +2365,35 @@ gl::Error Renderer11::applyShaders(const gl::ContextState &data, GLenum drawMode
const gl::Framebuffer *drawFramebuffer = glState.getDrawFramebuffer();
ShaderExecutableD3D *pixelExe = nullptr;
- ANGLE_TRY(programD3D->getPixelExecutableForFramebuffer(drawFramebuffer, &pixelExe));
+ ANGLE_TRY(programD3D->getPixelExecutableForFramebuffer(context, drawFramebuffer, &pixelExe));
ShaderExecutableD3D *geometryExe = nullptr;
ANGLE_TRY(
programD3D->getGeometryExecutableForPrimitiveType(data, drawMode, &geometryExe, nullptr));
- ID3D11VertexShader *vertexShader =
- (vertexExe ? GetAs<ShaderExecutable11>(vertexExe)->getVertexShader() : nullptr);
+ const d3d11::VertexShader *vertexShader =
+ (vertexExe ? &GetAs<ShaderExecutable11>(vertexExe)->getVertexShader() : nullptr);
- ID3D11PixelShader *pixelShader = nullptr;
// Skip pixel shader if we're doing rasterizer discard.
- bool rasterizerDiscard = glState.getRasterizerState().rasterizerDiscard;
- if (!rasterizerDiscard)
+ const d3d11::PixelShader *pixelShader = nullptr;
+ if (!glState.getRasterizerState().rasterizerDiscard)
{
- pixelShader = (pixelExe ? GetAs<ShaderExecutable11>(pixelExe)->getPixelShader() : nullptr);
+ pixelShader = (pixelExe ? &GetAs<ShaderExecutable11>(pixelExe)->getPixelShader() : nullptr);
}
- ID3D11GeometryShader *geometryShader = nullptr;
- bool transformFeedbackActive = glState.isTransformFeedbackActiveUnpaused();
- if (transformFeedbackActive)
+ const d3d11::GeometryShader *geometryShader = nullptr;
+ if (glState.isTransformFeedbackActiveUnpaused())
{
geometryShader =
- (vertexExe ? GetAs<ShaderExecutable11>(vertexExe)->getStreamOutShader() : nullptr);
+ (vertexExe ? &GetAs<ShaderExecutable11>(vertexExe)->getStreamOutShader() : nullptr);
}
else
{
geometryShader =
- (geometryExe ? GetAs<ShaderExecutable11>(geometryExe)->getGeometryShader() : nullptr);
- }
-
- bool dirtyUniforms = false;
-
- if (reinterpret_cast<uintptr_t>(vertexShader) != mAppliedVertexShader)
- {
- mDeviceContext->VSSetShader(vertexShader, nullptr, 0);
- mAppliedVertexShader = reinterpret_cast<uintptr_t>(vertexShader);
- dirtyUniforms = true;
- }
-
- if (reinterpret_cast<uintptr_t>(geometryShader) != mAppliedGeometryShader)
- {
- mDeviceContext->GSSetShader(geometryShader, nullptr, 0);
- mAppliedGeometryShader = reinterpret_cast<uintptr_t>(geometryShader);
- dirtyUniforms = true;
- }
-
- if (reinterpret_cast<uintptr_t>(pixelShader) != mAppliedPixelShader)
- {
- mDeviceContext->PSSetShader(pixelShader, nullptr, 0);
- mAppliedPixelShader = reinterpret_cast<uintptr_t>(pixelShader);
- dirtyUniforms = true;
+ (geometryExe ? &GetAs<ShaderExecutable11>(geometryExe)->getGeometryShader() : nullptr);
}
- if (dirtyUniforms)
- {
- programD3D->dirtyAllUniforms();
- }
+ mStateManager.setDrawShaders(vertexShader, geometryShader, pixelShader);
return programD3D->applyUniforms(drawMode);
}
@@ -2520,15 +2423,17 @@ gl::Error Renderer11::applyUniforms(const ProgramD3D &programD3D,
}
}
- const UniformStorage11 *vertexUniformStorage =
+ UniformStorage11 *vertexUniformStorage =
GetAs<UniformStorage11>(&programD3D.getVertexUniformStorage());
- const UniformStorage11 *fragmentUniformStorage =
+ UniformStorage11 *fragmentUniformStorage =
GetAs<UniformStorage11>(&programD3D.getFragmentUniformStorage());
ASSERT(vertexUniformStorage);
ASSERT(fragmentUniformStorage);
- ID3D11Buffer *vertexConstantBuffer = vertexUniformStorage->getConstantBuffer();
- ID3D11Buffer *pixelConstantBuffer = fragmentUniformStorage->getConstantBuffer();
+ const d3d11::Buffer *vertexConstantBuffer = nullptr;
+ ANGLE_TRY(vertexUniformStorage->getConstantBuffer(this, &vertexConstantBuffer));
+ const d3d11::Buffer *pixelConstantBuffer = nullptr;
+ ANGLE_TRY(fragmentUniformStorage->getConstantBuffer(this, &pixelConstantBuffer));
float(*mapVS)[4] = nullptr;
float(*mapPS)[4] = nullptr;
@@ -2537,7 +2442,7 @@ gl::Error Renderer11::applyUniforms(const ProgramD3D &programD3D,
{
D3D11_MAPPED_SUBRESOURCE map = {0};
HRESULT result =
- mDeviceContext->Map(vertexConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
+ mDeviceContext->Map(vertexConstantBuffer->get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
ASSERT(SUCCEEDED(result));
mapVS = (float(*)[4])map.pData;
}
@@ -2546,7 +2451,7 @@ gl::Error Renderer11::applyUniforms(const ProgramD3D &programD3D,
{
D3D11_MAPPED_SUBRESOURCE map = {0};
HRESULT result =
- mDeviceContext->Map(pixelConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
+ mDeviceContext->Map(pixelConstantBuffer->get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
ASSERT(SUCCEEDED(result));
mapPS = (float(*)[4])map.pData;
}
@@ -2576,62 +2481,53 @@ gl::Error Renderer11::applyUniforms(const ProgramD3D &programD3D,
if (mapVS)
{
- mDeviceContext->Unmap(vertexConstantBuffer, 0);
+ mDeviceContext->Unmap(vertexConstantBuffer->get(), 0);
}
if (mapPS)
{
- mDeviceContext->Unmap(pixelConstantBuffer, 0);
+ mDeviceContext->Unmap(pixelConstantBuffer->get(), 0);
}
- if (mCurrentVertexConstantBuffer != vertexConstantBuffer)
+ ID3D11Buffer *appliedVertexConstants = vertexConstantBuffer->get();
+ if (mCurrentVertexConstantBuffer != reinterpret_cast<uintptr_t>(appliedVertexConstants))
{
mDeviceContext->VSSetConstantBuffers(
- d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK, 1, &vertexConstantBuffer);
- mCurrentVertexConstantBuffer = vertexConstantBuffer;
+ d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK, 1, &appliedVertexConstants);
+ mCurrentVertexConstantBuffer = reinterpret_cast<uintptr_t>(appliedVertexConstants);
}
- if (mCurrentPixelConstantBuffer != pixelConstantBuffer)
+ ID3D11Buffer *appliedPixelConstants = pixelConstantBuffer->get();
+ if (mCurrentPixelConstantBuffer != reinterpret_cast<uintptr_t>(appliedPixelConstants))
{
mDeviceContext->PSSetConstantBuffers(
- d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK, 1, &pixelConstantBuffer);
- mCurrentPixelConstantBuffer = pixelConstantBuffer;
+ d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK, 1, &appliedPixelConstants);
+ mCurrentPixelConstantBuffer = reinterpret_cast<uintptr_t>(appliedPixelConstants);
}
- if (!mDriverConstantBufferVS)
+ if (!mDriverConstantBufferVS.valid())
{
D3D11_BUFFER_DESC constantBufferDescription = {0};
d3d11::InitConstantBufferDesc(
&constantBufferDescription,
sizeof(dx_VertexConstants11) + mSamplerMetadataVS.sizeBytes());
- HRESULT result =
- mDevice->CreateBuffer(&constantBufferDescription, nullptr, &mDriverConstantBufferVS);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create vertex shader constant buffer, result: 0x%X.",
- result);
- }
+ ANGLE_TRY(allocateResource(constantBufferDescription, &mDriverConstantBufferVS));
+
+ ID3D11Buffer *driverVSConstants = mDriverConstantBufferVS.get();
mDeviceContext->VSSetConstantBuffers(d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DRIVER, 1,
- &mDriverConstantBufferVS);
+ &driverVSConstants);
}
- if (!mDriverConstantBufferPS)
+
+ if (!mDriverConstantBufferPS.valid())
{
D3D11_BUFFER_DESC constantBufferDescription = {0};
d3d11::InitConstantBufferDesc(&constantBufferDescription,
sizeof(dx_PixelConstants11) + mSamplerMetadataPS.sizeBytes());
- HRESULT result =
- mDevice->CreateBuffer(&constantBufferDescription, nullptr, &mDriverConstantBufferPS);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create pixel shader constant buffer, result: 0x%X.",
- result);
- }
+ ANGLE_TRY(allocateResource(constantBufferDescription, &mDriverConstantBufferPS));
+
+ ID3D11Buffer *driverVSConstants = mDriverConstantBufferPS.get();
mDeviceContext->PSSetConstantBuffers(d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DRIVER, 1,
- &mDriverConstantBufferPS);
+ &driverVSConstants);
}
// Sampler metadata and driver constants need to coexist in the same constant buffer to conserve
@@ -2652,11 +2548,12 @@ gl::Error Renderer11::applyUniforms(const ProgramD3D &programD3D,
if (programD3D.usesGeometryShader(drawMode))
{
// needed for the point sprite geometry shader
- if (mCurrentGeometryConstantBuffer != mDriverConstantBufferPS)
+ ID3D11Buffer *appliedGeometryConstants = mDriverConstantBufferPS.get();
+ if (mCurrentGeometryConstantBuffer != reinterpret_cast<uintptr_t>(appliedGeometryConstants))
{
- ASSERT(mDriverConstantBufferPS != nullptr);
- mDeviceContext->GSSetConstantBuffers(0, 1, &mDriverConstantBufferPS);
- mCurrentGeometryConstantBuffer = mDriverConstantBufferPS;
+ ASSERT(mDriverConstantBufferPS.valid());
+ mDeviceContext->GSSetConstantBuffers(0, 1, &appliedGeometryConstants);
+ mCurrentGeometryConstantBuffer = reinterpret_cast<uintptr_t>(appliedGeometryConstants);
}
}
@@ -2773,24 +2670,24 @@ void Renderer11::applyDriverConstantsIfNeeded(TShaderConstants *appliedConstants
const TShaderConstants &constants,
SamplerMetadataD3D11 *samplerMetadata,
size_t samplerMetadataReferencedBytes,
- ID3D11Buffer *driverConstantBuffer)
+ const d3d11::Buffer &driverConstantBuffer)
{
- ASSERT(driverConstantBuffer != nullptr);
+ ASSERT(driverConstantBuffer.valid());
if (memcmp(appliedConstants, &constants, sizeof(TShaderConstants)) != 0 ||
samplerMetadata->isDirty())
{
memcpy(appliedConstants, &constants, sizeof(TShaderConstants));
D3D11_MAPPED_SUBRESOURCE mapping = {0};
- HRESULT result =
- mDeviceContext->Map(driverConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapping);
+ HRESULT result = mDeviceContext->Map(driverConstantBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD,
+ 0, &mapping);
ASSERT(SUCCEEDED(result));
memcpy(mapping.pData, appliedConstants, sizeof(TShaderConstants));
// Previous buffer contents were discarded, so we need to refresh also the area of the
// buffer that isn't used by this program.
memcpy(&reinterpret_cast<uint8_t *>(mapping.pData)[sizeof(TShaderConstants)],
samplerMetadata->getData(), samplerMetadata->sizeBytes());
- mDeviceContext->Unmap(driverConstantBuffer, 0);
+ mDeviceContext->Unmap(driverConstantBuffer.get(), 0);
samplerMetadata->markClean();
}
@@ -2801,21 +2698,21 @@ template void Renderer11::applyDriverConstantsIfNeeded<dx_VertexConstants11>(
const dx_VertexConstants11 &constants,
SamplerMetadataD3D11 *samplerMetadata,
size_t samplerMetadataReferencedBytes,
- ID3D11Buffer *driverConstantBuffer);
+ const d3d11::Buffer &driverConstantBuffer);
template void Renderer11::applyDriverConstantsIfNeeded<dx_PixelConstants11>(
dx_PixelConstants11 *appliedConstants,
const dx_PixelConstants11 &constants,
SamplerMetadataD3D11 *samplerMetadata,
size_t samplerMetadataReferencedBytes,
- ID3D11Buffer *driverConstantBuffer);
+ const d3d11::Buffer &driverConstantBuffer);
template void Renderer11::applyDriverConstantsIfNeeded<dx_ComputeConstants11>(
dx_ComputeConstants11 *appliedConstants,
const dx_ComputeConstants11 &constants,
SamplerMetadataD3D11 *samplerMetadata,
size_t samplerMetadataReferencedBytes,
- ID3D11Buffer *driverConstantBuffer);
+ const d3d11::Buffer &driverConstantBuffer);
-void Renderer11::markAllStateDirty()
+void Renderer11::markAllStateDirty(const gl::Context *context)
{
TRACE_EVENT0("gpu.angle", "Renderer11::markAllStateDirty");
@@ -2834,24 +2731,17 @@ void Renderer11::markAllStateDirty()
mForceSetComputeSamplerStates[csamplerId] = true;
}
- mStateManager.invalidateEverything();
+ mStateManager.invalidateEverything(context);
mAppliedIB = nullptr;
mAppliedIBFormat = DXGI_FORMAT_UNKNOWN;
mAppliedIBOffset = 0;
- mAppliedVertexShader = angle::DirtyPointer;
- mAppliedGeometryShader = angle::DirtyPointer;
- mAppliedPixelShader = angle::DirtyPointer;
- mAppliedComputeShader = angle::DirtyPointer;
-
mAppliedTFObject = angle::DirtyPointer;
memset(&mAppliedVertexConstants, 0, sizeof(dx_VertexConstants11));
memset(&mAppliedPixelConstants, 0, sizeof(dx_PixelConstants11));
- mInputLayoutCache.markDirty();
-
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS; i++)
{
mCurrentConstantBufferVS[i] = static_cast<unsigned int>(-1);
@@ -2862,12 +2752,10 @@ void Renderer11::markAllStateDirty()
mCurrentConstantBufferPSSize[i] = 0;
}
- mCurrentVertexConstantBuffer = nullptr;
- mCurrentPixelConstantBuffer = nullptr;
- mCurrentGeometryConstantBuffer = nullptr;
- mCurrentComputeConstantBuffer = nullptr;
-
- mCurrentPrimitiveTopology = D3D_PRIMITIVE_TOPOLOGY_UNDEFINED;
+ mCurrentVertexConstantBuffer = angle::DirtyPointer;
+ mCurrentPixelConstantBuffer = angle::DirtyPointer;
+ mCurrentGeometryConstantBuffer = angle::DirtyPointer;
+ mCurrentComputeConstantBuffer = angle::DirtyPointer;
}
void Renderer11::releaseDeviceResources()
@@ -2885,10 +2773,10 @@ void Renderer11::releaseDeviceResources()
SafeDelete(mTrim);
SafeDelete(mPixelTransfer);
- SafeRelease(mDriverConstantBufferVS);
- SafeRelease(mDriverConstantBufferPS);
- SafeRelease(mDriverConstantBufferCS);
- SafeRelease(mSyncQuery);
+ mDriverConstantBufferVS.reset();
+ mDriverConstantBufferPS.reset();
+ mDriverConstantBufferCS.reset();
+ mSyncQuery.reset();
}
// set notify to true to broadcast a message to all contexts of the device loss
@@ -2927,17 +2815,13 @@ bool Renderer11::testDeviceResettable()
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,
-#if defined(_DEBUG)
- D3D11_CREATE_DEVICE_DEBUG,
-#else
- 0,
-#endif
- mAvailableFeatureLevels.data(), static_cast<unsigned int>(mAvailableFeatureLevels.size()),
- D3D11_SDK_VERSION, &dummyDevice, &dummyFeatureLevel, &dummyContext);
+ nullptr, mRequestedDriverType, nullptr, flags, mAvailableFeatureLevels.data(),
+ static_cast<unsigned int>(mAvailableFeatureLevels.size()), D3D11_SDK_VERSION, &dummyDevice,
+ &dummyFeatureLevel, &dummyContext);
if (!mDevice || FAILED(result))
{
@@ -3245,7 +3129,8 @@ const angle::WorkaroundsD3D &RendererD3D::getWorkarounds() const
return mWorkarounds;
}
-gl::Error Renderer11::copyImageInternal(const gl::Framebuffer *framebuffer,
+gl::Error Renderer11::copyImageInternal(const gl::Context *context,
+ const gl::Framebuffer *framebuffer,
const gl::Rectangle &sourceRect,
GLenum destFormat,
const gl::Offset &destOffset,
@@ -3255,7 +3140,7 @@ gl::Error Renderer11::copyImageInternal(const gl::Framebuffer *framebuffer,
ASSERT(colorAttachment);
RenderTarget11 *sourceRenderTarget = nullptr;
- ANGLE_TRY(colorAttachment->getRenderTarget(&sourceRenderTarget));
+ ANGLE_TRY(colorAttachment->getRenderTarget(context, &sourceRenderTarget));
ASSERT(sourceRenderTarget);
const d3d11::SharedSRV &source = sourceRenderTarget->getBlitShaderResourceView();
@@ -3281,14 +3166,15 @@ gl::Error Renderer11::copyImageInternal(const gl::Framebuffer *framebuffer,
// 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(source, sourceArea, sourceSize, sourceFormat, dest, destArea,
- destSize, nullptr, gl::GetUnsizedFormat(destFormat), GL_NEAREST,
- false, false, false));
+ 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::Framebuffer *framebuffer,
+gl::Error Renderer11::copyImage2D(const gl::Context *context,
+ const gl::Framebuffer *framebuffer,
const gl::Rectangle &sourceRect,
GLenum destFormat,
const gl::Offset &destOffset,
@@ -3300,17 +3186,19 @@ gl::Error Renderer11::copyImage2D(const gl::Framebuffer *framebuffer,
gl::ImageIndex index = gl::ImageIndex::Make2D(level);
RenderTargetD3D *destRenderTarget = nullptr;
- ANGLE_TRY(storage11->getRenderTarget(index, &destRenderTarget));
+ ANGLE_TRY(storage11->getRenderTarget(context, index, &destRenderTarget));
ASSERT(destRenderTarget);
- ANGLE_TRY(copyImageInternal(framebuffer, sourceRect, destFormat, destOffset, destRenderTarget));
+ ANGLE_TRY(copyImageInternal(context, framebuffer, sourceRect, destFormat, destOffset,
+ destRenderTarget));
storage11->markLevelDirty(level);
return gl::NoError();
}
-gl::Error Renderer11::copyImageCube(const gl::Framebuffer *framebuffer,
+gl::Error Renderer11::copyImageCube(const gl::Context *context,
+ const gl::Framebuffer *framebuffer,
const gl::Rectangle &sourceRect,
GLenum destFormat,
const gl::Offset &destOffset,
@@ -3323,17 +3211,19 @@ gl::Error Renderer11::copyImageCube(const gl::Framebuffer *framebuffer,
gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level);
RenderTargetD3D *destRenderTarget = nullptr;
- ANGLE_TRY(storage11->getRenderTarget(index, &destRenderTarget));
+ ANGLE_TRY(storage11->getRenderTarget(context, index, &destRenderTarget));
ASSERT(destRenderTarget);
- ANGLE_TRY(copyImageInternal(framebuffer, sourceRect, destFormat, destOffset, destRenderTarget));
+ ANGLE_TRY(copyImageInternal(context, framebuffer, sourceRect, destFormat, destOffset,
+ destRenderTarget));
storage11->markLevelDirty(level);
return gl::NoError();
}
-gl::Error Renderer11::copyImage3D(const gl::Framebuffer *framebuffer,
+gl::Error Renderer11::copyImage3D(const gl::Context *context,
+ const gl::Framebuffer *framebuffer,
const gl::Rectangle &sourceRect,
GLenum destFormat,
const gl::Offset &destOffset,
@@ -3345,17 +3235,19 @@ gl::Error Renderer11::copyImage3D(const gl::Framebuffer *framebuffer,
gl::ImageIndex index = gl::ImageIndex::Make3D(level, destOffset.z);
RenderTargetD3D *destRenderTarget = nullptr;
- ANGLE_TRY(storage11->getRenderTarget(index, &destRenderTarget));
+ ANGLE_TRY(storage11->getRenderTarget(context, index, &destRenderTarget));
ASSERT(destRenderTarget);
- ANGLE_TRY(copyImageInternal(framebuffer, sourceRect, destFormat, destOffset, destRenderTarget));
+ ANGLE_TRY(copyImageInternal(context, framebuffer, sourceRect, destFormat, destOffset,
+ destRenderTarget));
storage11->markLevelDirty(level);
return gl::NoError();
}
-gl::Error Renderer11::copyImage2DArray(const gl::Framebuffer *framebuffer,
+gl::Error Renderer11::copyImage2DArray(const gl::Context *context,
+ const gl::Framebuffer *framebuffer,
const gl::Rectangle &sourceRect,
GLenum destFormat,
const gl::Offset &destOffset,
@@ -3367,16 +3259,18 @@ gl::Error Renderer11::copyImage2DArray(const gl::Framebuffer *framebuffer,
gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, destOffset.z);
RenderTargetD3D *destRenderTarget = nullptr;
- ANGLE_TRY(storage11->getRenderTarget(index, &destRenderTarget));
+ ANGLE_TRY(storage11->getRenderTarget(context, index, &destRenderTarget));
ASSERT(destRenderTarget);
- ANGLE_TRY(copyImageInternal(framebuffer, sourceRect, destFormat, destOffset, destRenderTarget));
+ ANGLE_TRY(copyImageInternal(context, framebuffer, sourceRect, destFormat, destOffset,
+ destRenderTarget));
storage11->markLevelDirty(level);
return gl::NoError();
}
-gl::Error Renderer11::copyTexture(const gl::Texture *source,
+gl::Error Renderer11::copyTexture(const gl::Context *context,
+ const gl::Texture *source,
GLint sourceLevel,
const gl::Rectangle &sourceRect,
GLenum destFormat,
@@ -3388,10 +3282,10 @@ gl::Error Renderer11::copyTexture(const gl::Texture *source,
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha)
{
- const TextureD3D *sourceD3D = GetImplAs<TextureD3D>(source);
+ TextureD3D *sourceD3D = GetImplAs<TextureD3D>(source);
TextureStorage *sourceStorage = nullptr;
- ANGLE_TRY(const_cast<TextureD3D *>(sourceD3D)->getNativeTexture(&sourceStorage));
+ ANGLE_TRY(sourceD3D->getNativeTexture(context, &sourceStorage));
TextureStorage11_2D *sourceStorage11 = GetAs<TextureStorage11_2D>(sourceStorage);
ASSERT(sourceStorage11);
@@ -3404,14 +3298,14 @@ gl::Error Renderer11::copyTexture(const gl::Texture *source,
source->getFormat(GL_TEXTURE_2D, sourceLevel).info->format == destFormat &&
sourceStorage11->getFormatSet().texFormat == destStorage11->getFormatSet().texFormat)
{
- ID3D11Resource *sourceResource = nullptr;
- ANGLE_TRY(sourceStorage11->getResource(&sourceResource));
+ const TextureHelper11 *sourceResource = nullptr;
+ ANGLE_TRY(sourceStorage11->getResource(context, &sourceResource));
gl::ImageIndex sourceIndex = gl::ImageIndex::Make2D(sourceLevel);
UINT sourceSubresource = sourceStorage11->getSubresourceIndex(sourceIndex);
- ID3D11Resource *destResource = nullptr;
- ANGLE_TRY(destStorage11->getResource(&destResource));
+ const TextureHelper11 *destResource = nullptr;
+ ANGLE_TRY(destStorage11->getResource(context, &destResource));
gl::ImageIndex destIndex = gl::ImageIndex::MakeGeneric(destTarget, destLevel);
UINT destSubresource = destStorage11->getSubresourceIndex(destIndex);
@@ -3425,18 +3319,18 @@ gl::Error Renderer11::copyTexture(const gl::Texture *source,
1u,
};
- mDeviceContext->CopySubresourceRegion(destResource, destSubresource, destOffset.x,
- destOffset.y, destOffset.z, sourceResource,
+ mDeviceContext->CopySubresourceRegion(destResource->get(), destSubresource, destOffset.x,
+ destOffset.y, destOffset.z, sourceResource->get(),
sourceSubresource, &sourceBox);
}
else
{
- d3d11::SharedSRV sourceSRV;
- ANGLE_TRY(sourceStorage11->getSRVLevels(sourceLevel, sourceLevel, &sourceSRV));
+ 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(destIndex, &destRenderTargetD3D));
+ ANGLE_TRY(destStorage11->getRenderTarget(context, destIndex, &destRenderTargetD3D));
RenderTarget11 *destRenderTarget11 = GetAs<RenderTarget11>(destRenderTargetD3D);
@@ -3459,9 +3353,9 @@ gl::Error Renderer11::copyTexture(const gl::Texture *source,
// 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(sourceSRV, sourceArea, sourceSize, sourceFormat, destRTV,
- destArea, destSize, nullptr, destFormat, GL_NEAREST, false,
- unpackPremultiplyAlpha, unpackUnmultiplyAlpha));
+ ANGLE_TRY(mBlit->copyTexture(context, *sourceSRV, sourceArea, sourceSize, sourceFormat,
+ destRTV, destArea, destSize, nullptr, destFormat, GL_NEAREST,
+ false, unpackPremultiplyAlpha, unpackUnmultiplyAlpha));
}
destStorage11->markLevelDirty(destLevel);
@@ -3469,7 +3363,8 @@ gl::Error Renderer11::copyTexture(const gl::Texture *source,
return gl::NoError();
}
-gl::Error Renderer11::copyCompressedTexture(const gl::Texture *source,
+gl::Error Renderer11::copyCompressedTexture(const gl::Context *context,
+ const gl::Texture *source,
GLint sourceLevel,
TextureStorage *storage,
GLint destLevel)
@@ -3477,8 +3372,8 @@ gl::Error Renderer11::copyCompressedTexture(const gl::Texture *source,
TextureStorage11_2D *destStorage11 = GetAs<TextureStorage11_2D>(storage);
ASSERT(destStorage11);
- ID3D11Resource *destResource = nullptr;
- ANGLE_TRY(destStorage11->getResource(&destResource));
+ const TextureHelper11 *destResource = nullptr;
+ ANGLE_TRY(destStorage11->getResource(context, &destResource));
gl::ImageIndex destIndex = gl::ImageIndex::Make2D(destLevel);
UINT destSubresource = destStorage11->getSubresourceIndex(destIndex);
@@ -3487,19 +3382,19 @@ gl::Error Renderer11::copyCompressedTexture(const gl::Texture *source,
ASSERT(sourceD3D);
TextureStorage *sourceStorage = nullptr;
- ANGLE_TRY(sourceD3D->getNativeTexture(&sourceStorage));
+ ANGLE_TRY(sourceD3D->getNativeTexture(context, &sourceStorage));
TextureStorage11_2D *sourceStorage11 = GetAs<TextureStorage11_2D>(sourceStorage);
ASSERT(sourceStorage11);
- ID3D11Resource *sourceResource = nullptr;
- ANGLE_TRY(sourceStorage11->getResource(&sourceResource));
+ 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, destSubresource, 0, 0, 0, sourceResource,
- sourceSubresource, nullptr);
+ mDeviceContext->CopySubresourceRegion(destResource->get(), destSubresource, 0, 0, 0,
+ sourceResource->get(), sourceSubresource, nullptr);
return gl::NoError();
}
@@ -3555,14 +3450,8 @@ gl::Error Renderer11::createRenderTarget(int width,
// The format must be either an RTV or a DSV
ASSERT(bindRTV != bindDSV);
- ID3D11Texture2D *texture = nullptr;
- HRESULT result = mDevice->CreateTexture2D(&desc, nullptr, &texture);
- if (FAILED(result))
- {
- ASSERT(result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create render target texture, result: 0x%X.", result);
- }
+ TextureHelper11 texture;
+ ANGLE_TRY(allocateTexture(desc, formatInfo, &texture));
d3d11::SharedSRV srv;
d3d11::SharedSRV blitSRV;
@@ -3575,12 +3464,7 @@ gl::Error Renderer11::createRenderTarget(int width,
srvDesc.Texture2D.MostDetailedMip = 0;
srvDesc.Texture2D.MipLevels = 1;
- gl::Error err = allocateResource(srvDesc, texture, &srv);
- if (err.isError())
- {
- SafeRelease(texture);
- return err;
- }
+ ANGLE_TRY(allocateResource(srvDesc, texture.get(), &srv));
if (formatInfo.blitSRVFormat != formatInfo.srvFormat)
{
@@ -3592,16 +3476,11 @@ gl::Error Renderer11::createRenderTarget(int width,
blitSRVDesc.Texture2D.MostDetailedMip = 0;
blitSRVDesc.Texture2D.MipLevels = 1;
- err = allocateResource(blitSRVDesc, texture, &blitSRV);
- if (err.isError())
- {
- SafeRelease(texture);
- return err;
- }
+ ANGLE_TRY(allocateResource(blitSRVDesc, texture.get(), &blitSRV));
}
else
{
- blitSRV = srv;
+ blitSRV = srv.makeCopy();
}
}
@@ -3615,12 +3494,7 @@ gl::Error Renderer11::createRenderTarget(int width,
dsvDesc.Flags = 0;
d3d11::DepthStencilView dsv;
- gl::Error err = allocateResource(dsvDesc, texture, &dsv);
- if (err.isError())
- {
- SafeRelease(texture);
- return err;
- }
+ ANGLE_TRY(allocateResource(dsvDesc, texture.get(), &dsv));
*outRT = new TextureRenderTarget11(std::move(dsv), texture, srv, format, formatInfo,
width, height, 1, supportedSamples);
@@ -3634,12 +3508,7 @@ gl::Error Renderer11::createRenderTarget(int width,
rtvDesc.Texture2D.MipSlice = 0;
d3d11::RenderTargetView rtv;
- gl::Error err = allocateResource(rtvDesc, texture, &rtv);
- if (err.isError())
- {
- SafeRelease(texture);
- return err;
- }
+ ANGLE_TRY(allocateResource(rtvDesc, texture.get(), &rtv));
if (formatInfo.dataInitializerFunction != nullptr)
{
@@ -3654,14 +3523,13 @@ gl::Error Renderer11::createRenderTarget(int width,
{
UNREACHABLE();
}
-
- SafeRelease(texture);
}
else
{
- *outRT = new TextureRenderTarget11(
- d3d11::RenderTargetView(), nullptr, d3d11::SharedSRV(), d3d11::SharedSRV(), format,
- d3d11::Format::Get(GL_NONE, mRenderer11DeviceCaps), width, height, 1, supportedSamples);
+ *outRT = new TextureRenderTarget11(d3d11::RenderTargetView(), TextureHelper11(),
+ d3d11::SharedSRV(), d3d11::SharedSRV(), format,
+ d3d11::Format::Get(GL_NONE, mRenderer11DeviceCaps),
+ width, height, 1, supportedSamples);
}
return gl::NoError();
@@ -3678,33 +3546,29 @@ gl::Error Renderer11::createRenderTargetCopy(RenderTargetD3D *source, RenderTarg
RenderTarget11 *source11 = GetAs<RenderTarget11>(source);
RenderTarget11 *dest11 = GetAs<RenderTarget11>(newRT);
- mDeviceContext->CopySubresourceRegion(dest11->getTexture(), dest11->getSubresourceIndex(), 0, 0,
- 0, source11->getTexture(),
+ 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 void *function,
+gl::Error Renderer11::loadExecutable(const uint8_t *function,
size_t length,
ShaderType type,
const std::vector<D3DVarying> &streamOutVaryings,
bool separatedOutputBuffers,
ShaderExecutableD3D **outExecutable)
{
+ ShaderData shaderData(function, length);
+
switch (type)
{
case SHADER_VERTEX:
{
- ID3D11VertexShader *vertexShader = nullptr;
- ID3D11GeometryShader *streamOutShader = nullptr;
-
- HRESULT result = mDevice->CreateVertexShader(function, length, nullptr, &vertexShader);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to create vertex shader, " << result;
- }
+ d3d11::VertexShader vertexShader;
+ d3d11::GeometryShader streamOutShader;
+ ANGLE_TRY(allocateResource(shaderData, &vertexShader));
if (!streamOutVaryings.empty())
{
@@ -3724,68 +3588,37 @@ gl::Error Renderer11::loadExecutable(const void *function,
soDeclaration.push_back(entry);
}
- result = mDevice->CreateGeometryShaderWithStreamOutput(
- function, static_cast<unsigned int>(length), soDeclaration.data(),
- static_cast<unsigned int>(soDeclaration.size()), nullptr, 0, 0, nullptr,
- &streamOutShader);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to create steam output shader, " << result;
- }
+ ANGLE_TRY(allocateResource(shaderData, &soDeclaration, &streamOutShader));
}
- *outExecutable =
- new ShaderExecutable11(function, length, vertexShader, streamOutShader);
+ *outExecutable = new ShaderExecutable11(function, length, std::move(vertexShader),
+ std::move(streamOutShader));
}
break;
case SHADER_PIXEL:
{
- ID3D11PixelShader *pixelShader = nullptr;
-
- HRESULT result = mDevice->CreatePixelShader(function, length, nullptr, &pixelShader);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to create pixel shader, " << result;
- }
-
- *outExecutable = new ShaderExecutable11(function, length, pixelShader);
+ d3d11::PixelShader pixelShader;
+ ANGLE_TRY(allocateResource(shaderData, &pixelShader));
+ *outExecutable = new ShaderExecutable11(function, length, std::move(pixelShader));
}
break;
case SHADER_GEOMETRY:
{
- ID3D11GeometryShader *geometryShader = nullptr;
-
- HRESULT result =
- mDevice->CreateGeometryShader(function, length, nullptr, &geometryShader);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to create geometry shader, " << result;
- }
-
- *outExecutable = new ShaderExecutable11(function, length, geometryShader);
+ d3d11::GeometryShader geometryShader;
+ ANGLE_TRY(allocateResource(shaderData, &geometryShader));
+ *outExecutable = new ShaderExecutable11(function, length, std::move(geometryShader));
}
break;
case SHADER_COMPUTE:
{
- ID3D11ComputeShader *computeShader = nullptr;
-
- HRESULT result =
- mDevice->CreateComputeShader(function, length, nullptr, &computeShader);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory() << "Failed to create compute shader, " << result;
- }
-
- *outExecutable = new ShaderExecutable11(function, length, computeShader);
+ d3d11::ComputeShader computeShader;
+ ANGLE_TRY(allocateResource(shaderData, &computeShader));
+ *outExecutable = new ShaderExecutable11(function, length, std::move(computeShader));
}
break;
default:
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
return gl::NoError();
@@ -3817,7 +3650,7 @@ gl::Error Renderer11::compileToExecutable(gl::InfoLog &infoLog,
break;
default:
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
profileStream << "_" << getMajorShaderModel() << "_" << getMinorShaderModel()
@@ -3857,6 +3690,7 @@ gl::Error Renderer11::compileToExecutable(gl::InfoLog &infoLog,
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,
@@ -3871,8 +3705,9 @@ gl::Error Renderer11::compileToExecutable(gl::InfoLog &infoLog,
return gl::NoError();
}
- gl::Error error = loadExecutable(binary->GetBufferPointer(), binary->GetBufferSize(), type,
- streamOutVaryings, separatedOutputBuffers, outExectuable);
+ gl::Error error = loadExecutable(reinterpret_cast<const uint8_t *>(binary->GetBufferPointer()),
+ binary->GetBufferSize(), type, streamOutVaryings,
+ separatedOutputBuffers, outExectuable);
SafeRelease(binary);
if (error.isError())
@@ -3895,7 +3730,7 @@ gl::Error Renderer11::ensureHLSLCompilerInitialized()
UniformStorageD3D *Renderer11::createUniformStorage(size_t storageSize)
{
- return new UniformStorage11(this, storageSize);
+ return new UniformStorage11(storageSize);
}
VertexBuffer *Renderer11::createVertexBuffer()
@@ -3962,7 +3797,8 @@ bool Renderer11::supportsFastCopyBufferToTexture(GLenum internalFormat) const
return true;
}
-gl::Error Renderer11::fastCopyBufferToTexture(const gl::PixelUnpackState &unpack,
+gl::Error Renderer11::fastCopyBufferToTexture(const gl::Context *context,
+ const gl::PixelUnpackState &unpack,
unsigned int offset,
RenderTargetD3D *destRenderTarget,
GLenum destinationFormat,
@@ -3970,8 +3806,8 @@ gl::Error Renderer11::fastCopyBufferToTexture(const gl::PixelUnpackState &unpack
const gl::Box &destArea)
{
ASSERT(supportsFastCopyBufferToTexture(destinationFormat));
- return mPixelTransfer->copyBufferToTexture(unpack, offset, destRenderTarget, destinationFormat,
- sourcePixelsType, destArea);
+ return mPixelTransfer->copyBufferToTexture(context, unpack, offset, destRenderTarget,
+ destinationFormat, sourcePixelsType, destArea);
}
ImageD3D *Renderer11::createImage()
@@ -3979,14 +3815,15 @@ ImageD3D *Renderer11::createImage()
return new Image11(this);
}
-gl::Error Renderer11::generateMipmap(ImageD3D *dest, ImageD3D *src)
+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(dest11, src11, mRenderer11DeviceCaps);
+ return Image11::GenerateMipmap(context, dest11, src11, mRenderer11DeviceCaps);
}
-gl::Error Renderer11::generateMipmapUsingD3D(TextureStorage *storage,
+gl::Error Renderer11::generateMipmapUsingD3D(const gl::Context *context,
+ TextureStorage *storage,
const gl::TextureState &textureState)
{
TextureStorage11 *storage11 = GetAs<TextureStorage11>(storage);
@@ -3994,15 +3831,30 @@ gl::Error Renderer11::generateMipmapUsingD3D(TextureStorage *storage,
ASSERT(storage11->isRenderTarget());
ASSERT(storage11->supportsNativeMipmapFunction());
- d3d11::SharedSRV srv;
- ANGLE_TRY(storage11->getSRVLevels(textureState.getEffectiveBaseLevel(),
+ const d3d11::SharedSRV *srv = nullptr;
+ ANGLE_TRY(storage11->getSRVLevels(context, textureState.getEffectiveBaseLevel(),
textureState.getEffectiveMaxLevel(), &srv));
- mDeviceContext->GenerateMips(srv.get());
+ 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);
@@ -4065,7 +3917,19 @@ TextureStorage *Renderer11::createTextureStorage2DArray(GLenum internalformat,
levels);
}
-gl::Error Renderer11::readFromAttachment(const gl::FramebufferAttachment &srcAttachment,
+TextureStorage *Renderer11::createTextureStorage2DMultisample(GLenum internalformat,
+ GLsizei width,
+ GLsizei height,
+ int levels,
+ int samples,
+ GLboolean 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,
@@ -4078,14 +3942,11 @@ gl::Error Renderer11::readFromAttachment(const gl::FramebufferAttachment &srcAtt
const bool invertTexture = UsePresentPathFast(this, &srcAttachment);
- RenderTargetD3D *renderTarget = nullptr;
- ANGLE_TRY(srcAttachment.getRenderTarget(&renderTarget));
-
- RenderTarget11 *rt11 = GetAs<RenderTarget11>(renderTarget);
- ASSERT(rt11->getTexture());
+ RenderTarget11 *rt11 = nullptr;
+ ANGLE_TRY(srcAttachment.getRenderTarget(context, &rt11));
+ ASSERT(rt11->getTexture().valid());
- TextureHelper11 textureHelper =
- TextureHelper11::MakeAndReference(rt11->getTexture(), rt11->getFormatSet());
+ const TextureHelper11 &textureHelper = rt11->getTexture();
unsigned int sourceSubResource = rt11->getSubresourceIndex();
const gl::Extents &texSize = textureHelper.getExtents();
@@ -4129,7 +3990,7 @@ gl::Error Renderer11::readFromAttachment(const gl::FramebufferAttachment &srcAtt
// For 2D multisampled textures, it points to the multisampled resolve texture.
const TextureHelper11 *srcTexture = &textureHelper;
- if (textureHelper.getTextureType() == GL_TEXTURE_2D && textureHelper.getSampleCount() > 1)
+ if (textureHelper.is2D() && textureHelper.getSampleCount() > 1)
{
D3D11_TEXTURE2D_DESC resolveDesc;
resolveDesc.Width = static_cast<UINT>(texSize.width);
@@ -4144,20 +4005,11 @@ gl::Error Renderer11::readFromAttachment(const gl::FramebufferAttachment &srcAtt
resolveDesc.CPUAccessFlags = 0;
resolveDesc.MiscFlags = 0;
- ID3D11Texture2D *resolveTex2D = nullptr;
- HRESULT result = mDevice->CreateTexture2D(&resolveDesc, nullptr, &resolveTex2D);
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY,
- "Renderer11::readTextureData failed to create internal resolve "
- "texture for ReadPixels, HRESULT: 0x%X.",
- result);
- }
+ ANGLE_TRY(
+ allocateTexture(resolveDesc, textureHelper.getFormatSet(), &resolvedTextureHelper));
- mDeviceContext->ResolveSubresource(resolveTex2D, 0, textureHelper.getTexture2D(),
+ mDeviceContext->ResolveSubresource(resolvedTextureHelper.get(), 0, textureHelper.get(),
sourceSubResource, textureHelper.getFormat());
- resolvedTextureHelper =
- TextureHelper11::MakeAndReference(resolveTex2D, textureHelper.getFormatSet());
sourceSubResource = 0;
srcTexture = &resolvedTextureHelper;
@@ -4171,14 +4023,14 @@ gl::Error Renderer11::readFromAttachment(const gl::FramebufferAttachment &srcAtt
// Select the correct layer from a 3D attachment
srcBox.front = 0;
- if (textureHelper.getTextureType() == GL_TEXTURE_3D)
+ if (textureHelper.is3D())
{
srcBox.front = static_cast<UINT>(srcAttachment.layer());
}
srcBox.back = srcBox.front + 1;
- mDeviceContext->CopySubresourceRegion(stagingHelper.getResource(), 0, 0, 0, 0,
- srcTexture->getResource(), sourceSubResource, &srcBox);
+ mDeviceContext->CopySubresourceRegion(stagingHelper.get(), 0, 0, 0, 0, srcTexture->get(),
+ sourceSubResource, &srcBox);
if (!invertTexture)
{
@@ -4193,12 +4045,12 @@ gl::Error Renderer11::readFromAttachment(const gl::FramebufferAttachment &srcAtt
// tracking in the 'pixelBuffer' members, causing leaks. Instead we must use
// pixelBuffer.set() twice, which performs the addRef/release correctly
invertTexturePack.alignment = pack.alignment;
- invertTexturePack.pixelBuffer.set(pack.pixelBuffer.get());
+ invertTexturePack.pixelBuffer.set(context, pack.pixelBuffer.get());
invertTexturePack.reverseRowOrder = !pack.reverseRowOrder;
PackPixelsParams packParams(safeArea, format, type, outputPitch, invertTexturePack, 0);
gl::Error error = packPixels(stagingHelper, packParams, pixelsOut);
- invertTexturePack.pixelBuffer.set(nullptr);
+ invertTexturePack.pixelBuffer.set(context, nullptr);
ANGLE_TRY(error);
return gl::NoError();
}
@@ -4207,15 +4059,14 @@ gl::Error Renderer11::packPixels(const TextureHelper11 &textureHelper,
const PackPixelsParams &params,
uint8_t *pixelsOut)
{
- ID3D11Resource *readResource = textureHelper.getResource();
+ 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::Error(GL_OUT_OF_MEMORY,
- "Failed to map internal texture for reading, result: 0x%X.", hr);
+ return gl::OutOfMemory() << "Failed to map internal texture for reading, " << gl::FmtHR(hr);
}
uint8_t *source = static_cast<uint8_t *>(mapping.pData);
@@ -4231,7 +4082,8 @@ gl::Error Renderer11::packPixels(const TextureHelper11 &textureHelper,
return gl::NoError();
}
-gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &readRectIn,
+gl::Error Renderer11::blitRenderbufferRect(const gl::Context *context,
+ const gl::Rectangle &readRectIn,
const gl::Rectangle &drawRectIn,
RenderTargetD3D *readRenderTarget,
RenderTargetD3D *drawRenderTarget,
@@ -4253,8 +4105,7 @@ gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &readRectIn,
<< "Failed to retrieve the internal draw render target from the draw framebuffer.";
}
- TextureHelper11 drawTexture = TextureHelper11::MakeAndReference(
- drawRenderTarget11->getTexture(), drawRenderTarget11->getFormatSet());
+ const TextureHelper11 &drawTexture = drawRenderTarget11->getTexture();
unsigned int drawSubresource = drawRenderTarget11->getSubresourceIndex();
RenderTarget11 *readRenderTarget11 = GetAs<RenderTarget11>(readRenderTarget);
@@ -4270,8 +4121,9 @@ gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &readRectIn,
if (readRenderTarget->getSamples() > 1)
{
- ANGLE_TRY_RESULT(resolveMultisampledTexture(readRenderTarget11, depthBlit, stencilBlit),
- readTexture);
+ ANGLE_TRY_RESULT(
+ resolveMultisampledTexture(context, readRenderTarget11, depthBlit, stencilBlit),
+ readTexture);
if (!stencilBlit)
{
@@ -4283,20 +4135,19 @@ gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &readRectIn,
viewDesc.Texture2D.MipLevels = 1;
viewDesc.Texture2D.MostDetailedMip = 0;
- ANGLE_TRY(allocateResource(viewDesc, readTexture.getResource(), &readSRV));
+ ANGLE_TRY(allocateResource(viewDesc, readTexture.get(), &readSRV));
}
}
else
{
ASSERT(readRenderTarget11);
- readTexture = TextureHelper11::MakeAndReference(readRenderTarget11->getTexture(),
- readRenderTarget11->getFormatSet());
+ readTexture = readRenderTarget11->getTexture();
readSubresource = readRenderTarget11->getSubresourceIndex();
- readSRV = readRenderTarget11->getBlitShaderResourceView();
+ readSRV = readRenderTarget11->getBlitShaderResourceView().makeCopy();
if (!readSRV.valid())
{
ASSERT(depthBlit || stencilBlit);
- readSRV = readRenderTarget11->getShaderResourceView();
+ readSRV = readRenderTarget11->getShaderResourceView().makeCopy();
}
ASSERT(readSRV.valid());
}
@@ -4456,9 +4307,8 @@ gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &readRectIn,
// We also require complete framebuffer copies for depth-stencil blit.
D3D11_BOX *pSrcBox = wholeBufferCopy ? nullptr : &readBox;
- mDeviceContext->CopySubresourceRegion(drawTexture.getResource(), drawSubresource, dstX,
- dstY, 0, readTexture.getResource(), readSubresource,
- pSrcBox);
+ mDeviceContext->CopySubresourceRegion(drawTexture.get(), drawSubresource, dstX, dstY, 0,
+ readTexture.get(), readSubresource, pSrcBox);
}
else
{
@@ -4475,12 +4325,12 @@ gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &readRectIn,
{
const d3d11::DepthStencilView &drawDSV = drawRenderTarget11->getDepthStencilView();
ASSERT(readSRV.valid());
- ANGLE_TRY(mBlit->copyDepth(readSRV, readArea, readSize, drawDSV, drawArea, drawSize,
- scissor));
+ ANGLE_TRY(mBlit->copyDepth(context, readSRV, readArea, readSize, drawDSV, drawArea,
+ drawSize, scissor));
}
else if (stencilBlit)
{
- ANGLE_TRY(mBlit->copyStencil(readTexture, readSubresource, readArea, readSize,
+ ANGLE_TRY(mBlit->copyStencil(context, readTexture, readSubresource, readArea, readSize,
drawTexture, drawSubresource, drawArea, drawSize,
scissor));
}
@@ -4491,9 +4341,9 @@ gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &readRectIn,
// We don't currently support masking off any other channel than alpha
bool maskOffAlpha = colorMaskingNeeded && colorMask.alpha;
ASSERT(readSRV.valid());
- ANGLE_TRY(mBlit->copyTexture(readSRV, readArea, readSize, srcFormatInfo.format, drawRTV,
- drawArea, drawSize, scissor, destFormatInfo.format, filter,
- maskOffAlpha, false, false));
+ ANGLE_TRY(mBlit->copyTexture(
+ context, readSRV, readArea, readSize, srcFormatInfo.format, drawRTV, drawArea,
+ drawSize, scissor, destFormatInfo.format, filter, maskOffAlpha, false, false));
}
}
@@ -4546,17 +4396,20 @@ void Renderer11::onBufferDelete(const Buffer11 *deleted)
mAliveBuffers.erase(deleted);
}
-gl::ErrorOrResult<TextureHelper11>
-Renderer11::resolveMultisampledTexture(RenderTarget11 *renderTarget, bool depth, bool stencil)
+gl::ErrorOrResult<TextureHelper11> Renderer11::resolveMultisampledTexture(
+ const gl::Context *context,
+ RenderTarget11 *renderTarget,
+ bool depth,
+ bool stencil)
{
if (depth && !stencil)
{
- return mBlit->resolveDepth(renderTarget);
+ return mBlit->resolveDepth(context, renderTarget);
}
if (stencil)
{
- return mBlit->resolveStencil(renderTarget, depth);
+ return mBlit->resolveStencil(context, renderTarget, depth);
}
const auto &formatSet = renderTarget->getFormatSet();
@@ -4576,17 +4429,12 @@ Renderer11::resolveMultisampledTexture(RenderTarget11 *renderTarget, bool depth,
resolveDesc.CPUAccessFlags = 0;
resolveDesc.MiscFlags = 0;
- ID3D11Texture2D *resolveTexture = nullptr;
- HRESULT result = mDevice->CreateTexture2D(&resolveDesc, nullptr, &resolveTexture);
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create a multisample resolve texture, HRESULT: 0x%X.", result);
- }
+ TextureHelper11 resolveTexture;
+ ANGLE_TRY(allocateTexture(resolveDesc, formatSet, &resolveTexture));
- mDeviceContext->ResolveSubresource(resolveTexture, 0, renderTarget->getTexture(),
+ mDeviceContext->ResolveSubresource(resolveTexture.get(), 0, renderTarget->getTexture().get(),
renderTarget->getSubresourceIndex(), formatSet.texFormat);
- return TextureHelper11::MakeAndPossess2D(resolveTexture, renderTarget->getFormatSet());
+ return resolveTexture;
}
bool Renderer11::getLUID(LUID *adapterLuid) const
@@ -4634,15 +4482,16 @@ gl::ErrorOrResult<unsigned int> Renderer11::getVertexSpaceRequired(
return 16u;
}
- unsigned int elementCount = 0;
- if (instances == 0 || binding.divisor == 0)
+ 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), binding.divisor);
+ elementCount = UnsignedCeilDivide(static_cast<unsigned int>(instances), divisor);
}
gl::VertexFormatType formatType = gl::GetVertexFormatType(attrib);
@@ -4654,7 +4503,7 @@ gl::ErrorOrResult<unsigned int> Renderer11::getVertexSpaceRequired(
unsigned int elementSize = dxgiFormatInfo.pixelBytes;
if (elementSize > std::numeric_limits<unsigned int>::max() / elementCount)
{
- return gl::Error(GL_OUT_OF_MEMORY, "New vertex buffer size would result in an overflow.");
+ return gl::OutOfMemory() << "New vertex buffer size would result in an overflow.";
}
return elementSize * elementCount;
@@ -4674,7 +4523,10 @@ angle::WorkaroundsD3D Renderer11::generateWorkarounds() const
return d3d11::GenerateWorkarounds(mRenderer11DeviceCaps, mAdapterDescription);
}
-gl::Error Renderer11::clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd)
+gl::Error Renderer11::clearTextures(const gl::Context *context,
+ gl::SamplerType samplerType,
+ size_t rangeStart,
+ size_t rangeEnd)
{
return mStateManager.clearTextures(samplerType, rangeStart, rangeEnd);
}
@@ -4696,7 +4548,7 @@ egl::Error Renderer11::getEGLDevice(DeviceImpl **device)
}
*device = static_cast<DeviceImpl *>(mEGLDevice);
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
ContextImpl *Renderer11::createContext(const gl::ContextState &state)
@@ -4704,7 +4556,7 @@ ContextImpl *Renderer11::createContext(const gl::ContextState &state)
return new Context11(state, this);
}
-gl::Error Renderer11::genericDrawElements(Context11 *context,
+gl::Error Renderer11::genericDrawElements(const gl::Context *context,
GLenum mode,
GLsizei count,
GLenum type,
@@ -4721,14 +4573,14 @@ gl::Error Renderer11::genericDrawElements(Context11 *context,
programD3D->updateSamplerMapping();
- ANGLE_TRY(generateSwizzles(data));
+ ANGLE_TRY(generateSwizzles(context));
if (!applyPrimitiveType(mode, count, usesPointSize))
{
return gl::NoError();
}
- ANGLE_TRY(updateState(context, mode));
+ ANGLE_TRY(mStateManager.updateState(context, mode));
TranslatedIndexData indexInfo;
indexInfo.indexRange = indexRange;
@@ -4741,10 +4593,10 @@ gl::Error Renderer11::genericDrawElements(Context11 *context,
ASSERT(!glState.isTransformFeedbackActiveUnpaused());
size_t vertexCount = indexInfo.indexRange.vertexCount();
- ANGLE_TRY(applyVertexBuffer(glState, mode, static_cast<GLsizei>(indexInfo.indexRange.start),
+ ANGLE_TRY(applyVertexBuffer(context, mode, static_cast<GLsizei>(indexInfo.indexRange.start),
static_cast<GLsizei>(vertexCount), instances, &indexInfo));
- ANGLE_TRY(applyTextures(context, data));
- ANGLE_TRY(applyShaders(data, mode));
+ ANGLE_TRY(applyTextures(context));
+ ANGLE_TRY(applyShaders(context, mode));
ANGLE_TRY(programD3D->applyUniformBuffers(data));
if (!skipDraw(data, mode))
@@ -4755,7 +4607,7 @@ gl::Error Renderer11::genericDrawElements(Context11 *context,
return gl::NoError();
}
-gl::Error Renderer11::genericDrawArrays(Context11 *context,
+gl::Error Renderer11::genericDrawArrays(const gl::Context *context,
GLenum mode,
GLint first,
GLsizei count,
@@ -4770,22 +4622,22 @@ gl::Error Renderer11::genericDrawArrays(Context11 *context,
programD3D->updateSamplerMapping();
- ANGLE_TRY(generateSwizzles(data));
+ ANGLE_TRY(generateSwizzles(context));
if (!applyPrimitiveType(mode, count, usesPointSize))
{
return gl::NoError();
}
- ANGLE_TRY(updateState(context, mode));
+ ANGLE_TRY(mStateManager.updateState(context, mode));
ANGLE_TRY(applyTransformFeedbackBuffers(data));
- ANGLE_TRY(applyVertexBuffer(glState, mode, first, count, instances, nullptr));
- ANGLE_TRY(applyTextures(context, data));
- ANGLE_TRY(applyShaders(data, mode));
+ ANGLE_TRY(applyVertexBuffer(context, mode, first, count, instances, nullptr));
+ ANGLE_TRY(applyTextures(context));
+ ANGLE_TRY(applyShaders(context, mode));
ANGLE_TRY(programD3D->applyUniformBuffers(data));
if (!skipDraw(data, mode))
{
- ANGLE_TRY(drawArraysImpl(data, mode, first, count, instances));
+ ANGLE_TRY(drawArraysImpl(context, mode, first, count, instances));
if (glState.isTransformFeedbackActiveUnpaused())
{
@@ -4796,35 +4648,35 @@ gl::Error Renderer11::genericDrawArrays(Context11 *context,
return gl::NoError();
}
-gl::Error Renderer11::genericDrawIndirect(Context11 *context,
+gl::Error Renderer11::genericDrawIndirect(const gl::Context *context,
GLenum mode,
GLenum type,
const void *indirect)
{
- const auto &data = context->getContextState();
- const auto &glState = data.getState();
+ const auto &contextState = context->getContextState();
+ const auto &glState = context->getGLState();
gl::Program *program = glState.getProgram();
ASSERT(program != nullptr);
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
bool usesPointSize = programD3D->usesPointSize();
programD3D->updateSamplerMapping();
- ANGLE_TRY(generateSwizzles(data));
+ ANGLE_TRY(generateSwizzles(context));
applyPrimitiveType(mode, 0, usesPointSize);
- ANGLE_TRY(updateState(context, mode));
- ANGLE_TRY(applyTransformFeedbackBuffers(data));
+ ANGLE_TRY(mStateManager.updateState(context, mode));
+ ANGLE_TRY(applyTransformFeedbackBuffers(contextState));
ASSERT(!glState.isTransformFeedbackActiveUnpaused());
- ANGLE_TRY(applyTextures(context, data));
- ANGLE_TRY(applyShaders(data, mode));
- ANGLE_TRY(programD3D->applyUniformBuffers(data));
+ ANGLE_TRY(applyTextures(context));
+ ANGLE_TRY(applyShaders(context, mode));
+ ANGLE_TRY(programD3D->applyUniformBuffers(contextState));
if (type == GL_NONE)
{
- ANGLE_TRY(drawArraysIndirectImpl(data, mode, indirect));
+ ANGLE_TRY(drawArraysIndirectImpl(context, mode, indirect));
}
else
{
- ANGLE_TRY(drawElementsIndirectImpl(data, mode, type, indirect));
+ ANGLE_TRY(drawElementsIndirectImpl(context, mode, type, indirect));
}
return gl::NoError();
@@ -4863,28 +4715,14 @@ gl::Error Renderer11::applyComputeShader(const gl::ContextState &data)
ShaderExecutableD3D *computeExe = nullptr;
ANGLE_TRY(programD3D->getComputeExecutable(&computeExe));
-
ASSERT(computeExe != nullptr);
- ID3D11ComputeShader *computeShader = GetAs<ShaderExecutable11>(computeExe)->getComputeShader();
-
- bool dirtyUniforms = false;
- if (reinterpret_cast<uintptr_t>(computeShader) != mAppliedComputeShader)
- {
- mDeviceContext->CSSetShader(computeShader, nullptr, 0);
- mAppliedComputeShader = reinterpret_cast<uintptr_t>(computeShader);
- dirtyUniforms = true;
- }
-
- if (dirtyUniforms)
- {
- programD3D->dirtyAllUniforms();
- }
+ mStateManager.setComputeShader(&GetAs<ShaderExecutable11>(computeExe)->getComputeShader());
return programD3D->applyComputeUniforms();
}
-gl::Error Renderer11::dispatchCompute(Context11 *context,
+gl::Error Renderer11::dispatchCompute(const gl::Context *context,
GLuint numGroupsX,
GLuint numGroupsY,
GLuint numGroupsZ)
@@ -4898,8 +4736,8 @@ gl::Error Renderer11::dispatchCompute(Context11 *context,
programD3D->updateSamplerMapping();
- ANGLE_TRY(generateSwizzles(data, gl::SAMPLER_COMPUTE));
- ANGLE_TRY(applyTextures(context, data));
+ ANGLE_TRY(generateSwizzles(context, gl::SAMPLER_COMPUTE));
+ ANGLE_TRY(applyTextures(context));
ANGLE_TRY(applyComputeShader(data));
// TODO(Xinghua): applyUniformBuffers for compute shader.
mDeviceContext->Dispatch(numGroupsX, numGroupsY, numGroupsZ);
@@ -4925,11 +4763,14 @@ gl::Error Renderer11::applyComputeUniforms(const ProgramD3D &programD3D,
}
}
- const UniformStorage11 *computeUniformStorage =
+ UniformStorage11 *computeUniformStorage =
GetAs<UniformStorage11>(&programD3D.getComputeUniformStorage());
ASSERT(computeUniformStorage);
- ID3D11Buffer *computeConstantBuffer = computeUniformStorage->getConstantBuffer();
+ const d3d11::Buffer *computeConstantBufferObj = nullptr;
+ ANGLE_TRY(computeUniformStorage->getConstantBuffer(this, &computeConstantBufferObj));
+
+ ID3D11Buffer *computeConstantBuffer = computeConstantBufferObj->get();
if (totalRegisterCountCS > 0 && computeUniformsDirty)
{
@@ -4957,29 +4798,23 @@ gl::Error Renderer11::applyComputeUniforms(const ProgramD3D &programD3D,
mDeviceContext->Unmap(computeConstantBuffer, 0);
}
- if (mCurrentComputeConstantBuffer != computeConstantBuffer)
+ if (mCurrentComputeConstantBuffer != reinterpret_cast<uintptr_t>(computeConstantBuffer))
{
mDeviceContext->CSSetConstantBuffers(
d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK, 1, &computeConstantBuffer);
- mCurrentComputeConstantBuffer = computeConstantBuffer;
+ mCurrentComputeConstantBuffer = reinterpret_cast<uintptr_t>(computeConstantBuffer);
}
- if (!mDriverConstantBufferCS)
+ if (!mDriverConstantBufferCS.valid())
{
D3D11_BUFFER_DESC constantBufferDescription = {0};
d3d11::InitConstantBufferDesc(
&constantBufferDescription,
sizeof(dx_ComputeConstants11) + mSamplerMetadataCS.sizeBytes());
- HRESULT result =
- mDevice->CreateBuffer(&constantBufferDescription, nullptr, &mDriverConstantBufferCS);
- ASSERT(SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::OutOfMemory()
- << "Failed to create compute shader constant buffer, " << result;
- }
+ ANGLE_TRY(allocateResource(constantBufferDescription, &mDriverConstantBufferCS));
+ ID3D11Buffer *buffer = mDriverConstantBufferCS.get();
mDeviceContext->CSSetConstantBuffers(d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DRIVER, 1,
- &mDriverConstantBufferCS);
+ &buffer);
}
const dx_ComputeConstants11 &computeConstants = mStateManager.getComputeConstants();
@@ -4992,12 +4827,12 @@ gl::Error Renderer11::applyComputeUniforms(const ProgramD3D &programD3D,
}
gl::ErrorOrResult<TextureHelper11> Renderer11::createStagingTexture(
- GLenum textureType,
+ ResourceType textureType,
const d3d11::Format &formatSet,
const gl::Extents &size,
StagingAccess readAndWriteAccess)
{
- if (textureType == GL_TEXTURE_2D)
+ if (textureType == ResourceType::Texture2D)
{
D3D11_TEXTURE2D_DESC stagingDesc;
stagingDesc.Width = size.width;
@@ -5017,16 +4852,11 @@ gl::ErrorOrResult<TextureHelper11> Renderer11::createStagingTexture(
stagingDesc.CPUAccessFlags |= D3D11_CPU_ACCESS_WRITE;
}
- ID3D11Texture2D *stagingTex = nullptr;
- HRESULT result = mDevice->CreateTexture2D(&stagingDesc, nullptr, &stagingTex);
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY, "createStagingTexture failed, HRESULT: 0x%X.",
- result);
- }
- return TextureHelper11::MakeAndPossess2D(stagingTex, formatSet);
+ TextureHelper11 stagingTex;
+ ANGLE_TRY(allocateTexture(stagingDesc, formatSet, &stagingTex));
+ return stagingTex;
}
- ASSERT(textureType == GL_TEXTURE_3D);
+ ASSERT(textureType == ResourceType::Texture3D);
D3D11_TEXTURE3D_DESC stagingDesc;
stagingDesc.Width = size.width;
@@ -5039,14 +4869,67 @@ gl::ErrorOrResult<TextureHelper11> Renderer11::createStagingTexture(
stagingDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
stagingDesc.MiscFlags = 0;
- ID3D11Texture3D *stagingTex = nullptr;
- HRESULT result = mDevice->CreateTexture3D(&stagingDesc, nullptr, &stagingTex);
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY, "createStagingTexture failed, HRESULT: 0x%X.", result);
- }
+ 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,
+ ID3D11BlendState **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,
+ ID3D11DepthStencilState **outDSState)
+{
+ return mStateCache.getDepthStencilState(this, dsState, outDSState);
+}
- return TextureHelper11::MakeAndPossess3D(stagingTex, formatSet);
+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 &clearValues)
+{
+ RenderTarget11 *renderTarget11 = GetAs<RenderTarget11>(renderTarget);
+ const d3d11::RenderTargetView &rtv = renderTarget11->getRenderTargetView();
+
+ mDeviceContext->ClearRenderTargetView(rtv.get(), &clearValues.red);
+
+ return gl::NoError();
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
index 7371a0dd1b3..b70cb937b61 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
@@ -138,23 +138,25 @@ class Renderer11 : public RendererD3D
HANDLE shareHandle,
const egl::AttributeMap &attribs) const override;
- gl::Error setSamplerState(gl::SamplerType type,
+ gl::Error setSamplerState(const gl::Context *context,
+ gl::SamplerType type,
int index,
gl::Texture *texture,
const gl::SamplerState &sampler) override;
- gl::Error setTexture(gl::SamplerType type, int index, gl::Texture *texture) override;
+ gl::Error setTexture(const gl::Context *context,
+ gl::SamplerType type,
+ int index,
+ gl::Texture *texture) override;
gl::Error setUniformBuffers(const gl::ContextState &data,
const std::vector<GLint> &vertexUniformBuffers,
const std::vector<GLint> &fragmentUniformBuffers) override;
- gl::Error updateState(ContextImpl *contextImpl, GLenum drawMode);
-
bool applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSize);
gl::Error applyUniforms(const ProgramD3D &programD3D,
GLenum drawMode,
const std::vector<D3DUniform *> &uniformArray) override;
- gl::Error applyVertexBuffer(const gl::State &state,
+ gl::Error applyVertexBuffer(const gl::Context *context,
GLenum mode,
GLint first,
GLsizei count,
@@ -189,33 +191,38 @@ class Renderer11 : public RendererD3D
std::string getShaderModelSuffix() const override;
// Pixel operations
- gl::Error copyImage2D(const gl::Framebuffer *framebuffer,
+ 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::Framebuffer *framebuffer,
+ 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::Framebuffer *framebuffer,
+ 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::Framebuffer *framebuffer,
+ 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::Texture *source,
+ gl::Error copyTexture(const gl::Context *context,
+ const gl::Texture *source,
GLint sourceLevel,
const gl::Rectangle &sourceRect,
GLenum destFormat,
@@ -226,7 +233,8 @@ class Renderer11 : public RendererD3D
bool unpackFlipY,
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha) override;
- gl::Error copyCompressedTexture(const gl::Texture *source,
+ gl::Error copyCompressedTexture(const gl::Context *context,
+ const gl::Texture *source,
GLint sourceLevel,
TextureStorage *storage,
GLint destLevel) override;
@@ -240,7 +248,7 @@ class Renderer11 : public RendererD3D
gl::Error createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) override;
// Shader operations
- gl::Error loadExecutable(const void *function,
+ gl::Error loadExecutable(const uint8_t *function,
size_t length,
ShaderType type,
const std::vector<D3DVarying> &streamOutVaryings,
@@ -259,9 +267,18 @@ class Renderer11 : public RendererD3D
// Image operations
ImageD3D *createImage() override;
- gl::Error generateMipmap(ImageD3D *dest, ImageD3D *source) override;
- gl::Error generateMipmapUsingD3D(TextureStorage *storage,
+ 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;
@@ -291,6 +308,12 @@ class Renderer11 : public RendererD3D
GLsizei height,
GLsizei depth,
int levels) override;
+ TextureStorage *createTextureStorage2DMultisample(GLenum internalformat,
+ GLsizei width,
+ GLsizei height,
+ int levels,
+ int samples,
+ GLboolean fixedSampleLocations) override;
VertexBuffer *createVertexBuffer() override;
IndexBuffer *createIndexBuffer() override;
@@ -307,7 +330,14 @@ class Renderer11 : public RendererD3D
ID3D11DeviceContext1 *getDeviceContext1IfSupported() { return mDeviceContext1; };
IDXGIFactory *getDxgiFactory() { return mDxgiFactory; };
- RenderStateCache &getStateCache() { return mStateCache; }
+ gl::Error getBlendState(const d3d11::BlendStateKey &key, ID3D11BlendState **outBlendState);
+ gl::Error getRasterizerState(const gl::RasterizerState &rasterState,
+ bool scissorEnabled,
+ ID3D11RasterizerState **outRasterizerState);
+ gl::Error getDepthStencilState(const gl::DepthStencilState &dsState,
+ ID3D11DepthStencilState **outDSState);
+ gl::Error getSamplerState(const gl::SamplerState &samplerState,
+ ID3D11SamplerState **outSamplerState);
Blit11 *getBlitter() { return mBlit; }
Clear11 *getClearer() { return mClear; }
@@ -315,14 +345,15 @@ class Renderer11 : public RendererD3D
// Buffer-to-texture and Texture-to-buffer copies
bool supportsFastCopyBufferToTexture(GLenum internalFormat) const override;
- gl::Error fastCopyBufferToTexture(const gl::PixelUnpackState &unpack,
+ 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;
- void markAllStateDirty();
+ void markAllStateDirty(const gl::Context *context);
gl::Error packPixels(const TextureHelper11 &textureHelper,
const PackPixelsParams &params,
uint8_t *pixelsOut);
@@ -339,7 +370,8 @@ class Renderer11 : public RendererD3D
GLsizei count,
GLsizei instances) const override;
- gl::Error readFromAttachment(const gl::FramebufferAttachment &srcAttachment,
+ gl::Error readFromAttachment(const gl::Context *context,
+ const gl::FramebufferAttachment &srcAttachment,
const gl::Rectangle &sourceArea,
GLenum format,
GLenum type,
@@ -347,7 +379,8 @@ class Renderer11 : public RendererD3D
const gl::PixelPackState &pack,
uint8_t *pixels);
- gl::Error blitRenderbufferRect(const gl::Rectangle &readRect,
+ gl::Error blitRenderbufferRect(const gl::Context *context,
+ const gl::Rectangle &readRect,
const gl::Rectangle &drawRect,
RenderTargetD3D *readRenderTarget,
RenderTargetD3D *drawRenderTarget,
@@ -370,13 +403,13 @@ class Renderer11 : public RendererD3D
egl::Error getEGLDevice(DeviceImpl **device) override;
- gl::Error genericDrawArrays(Context11 *context,
+ gl::Error genericDrawArrays(const gl::Context *context,
GLenum mode,
GLint first,
GLsizei count,
GLsizei instances);
- gl::Error genericDrawElements(Context11 *context,
+ gl::Error genericDrawElements(const gl::Context *context,
GLenum mode,
GLsizei count,
GLenum type,
@@ -384,7 +417,7 @@ class Renderer11 : public RendererD3D
GLsizei instances,
const gl::IndexRange &indexRange);
- gl::Error genericDrawIndirect(Context11 *context,
+ gl::Error genericDrawIndirect(const gl::Context *context,
GLenum mode,
GLenum type,
const void *indirect);
@@ -396,7 +429,7 @@ class Renderer11 : public RendererD3D
gl::Version getMaxSupportedESVersion() const override;
- gl::Error dispatchCompute(Context11 *context,
+ gl::Error dispatchCompute(const gl::Context *context,
GLuint numGroupsX,
GLuint numGroupsY,
GLuint numGroupsZ);
@@ -404,11 +437,17 @@ class Renderer11 : public RendererD3D
const std::vector<D3DUniform *> &uniformArray) override;
gl::Error applyComputeShader(const gl::ContextState &data);
- gl::ErrorOrResult<TextureHelper11> createStagingTexture(GLenum textureType,
+ 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)
{
@@ -421,13 +460,35 @@ class Renderer11 : public RendererD3D
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 &clearValues) override;
+
protected:
- gl::Error clearTextures(gl::SamplerType samplerType,
+ gl::Error clearTextures(const gl::Context *context,
+ gl::SamplerType samplerType,
size_t rangeStart,
size_t rangeEnd) override;
private:
- gl::Error drawArraysImpl(const gl::ContextState &data,
+ gl::Error drawArraysImpl(const gl::Context *context,
GLenum mode,
GLint startVertex,
GLsizei count,
@@ -439,16 +500,14 @@ class Renderer11 : public RendererD3D
GLenum type,
const void *indices,
GLsizei instances);
- gl::Error drawArraysIndirectImpl(const gl::ContextState &data,
- GLenum mode,
- const void *indirect);
- gl::Error drawElementsIndirectImpl(const gl::ContextState &data,
+ gl::Error drawArraysIndirectImpl(const gl::Context *context, GLenum mode, const void *indirect);
+ gl::Error drawElementsIndirectImpl(const gl::Context *context,
GLenum mode,
GLenum type,
const void *indirect);
// Support directly using indirect draw buffer.
- bool supportsFastIndirectDraw(const gl::State &state, GLenum mode, GLenum type);
+ bool supportsFastIndirectDraw(const gl::Context *context, GLenum mode, GLenum type);
void generateCaps(gl::Caps *outCaps,
gl::TextureCapsMap *outTextureCaps,
@@ -470,12 +529,13 @@ class Renderer11 : public RendererD3D
int baseVertex,
int instances);
- gl::Error applyShaders(const gl::ContextState &data, GLenum drawMode);
- gl::Error generateSwizzle(gl::Texture *texture);
- gl::Error generateSwizzles(const gl::ContextState &data, gl::SamplerType type);
- gl::Error generateSwizzles(const gl::ContextState &data);
+ gl::Error applyShaders(const gl::Context *context, GLenum drawMode);
+ gl::Error generateSwizzle(const gl::Context *context, gl::Texture *texture);
+ gl::Error generateSwizzles(const gl::Context *context, gl::SamplerType type);
+ gl::Error generateSwizzles(const gl::Context *context);
- gl::ErrorOrResult<TextureHelper11> resolveMultisampledTexture(RenderTarget11 *renderTarget,
+ gl::ErrorOrResult<TextureHelper11> resolveMultisampledTexture(const gl::Context *context,
+ RenderTarget11 *renderTarget,
bool depth,
bool stencil);
@@ -517,9 +577,10 @@ class Renderer11 : public RendererD3D
const TShaderConstants &constants,
SamplerMetadataD3D11 *samplerMetadata,
size_t samplerMetadataReferencedBytes,
- ID3D11Buffer *driverConstantBuffer);
+ const d3d11::Buffer &driverConstantBuffer);
- gl::Error copyImageInternal(const gl::Framebuffer *framebuffer,
+ gl::Error copyImageInternal(const gl::Context *context,
+ const gl::Framebuffer *framebuffer,
const gl::Rectangle &sourceRect,
GLenum destFormat,
const gl::Offset &destOffset,
@@ -529,23 +590,24 @@ class Renderer11 : public RendererD3D
const gl::TextureCaps &colorBufferFormatCaps,
const gl::TextureCaps &depthStencilBufferFormatCaps) const;
+ egl::Error initializeD3DDevice();
+ void initializeDevice();
+ void releaseDeviceResources();
+ void release();
+
+ d3d11::ANGLED3D11DeviceType getDeviceType() const;
+
HMODULE mD3d11Module;
HMODULE mDxgiModule;
HMODULE mDCompModule;
std::vector<D3D_FEATURE_LEVEL> mAvailableFeatureLevels;
D3D_DRIVER_TYPE mRequestedDriverType;
+ bool mCreateDebugDevice;
bool mCreatedWithDeviceEXT;
DeviceD3D *mEGLDevice;
HLSLCompiler mCompiler;
- egl::Error initializeD3DDevice();
- void initializeDevice();
- void releaseDeviceResources();
- void release();
-
- d3d11::ANGLED3D11DeviceType getDeviceType() const;
-
RenderStateCache mStateCache;
// Currently applied sampler states
@@ -560,9 +622,6 @@ class Renderer11 : public RendererD3D
StateManager11 mStateManager;
- // Currently applied primitive topology
- D3D11_PRIMITIVE_TOPOLOGY mCurrentPrimitiveTopology;
-
// Currently applied index buffer
ID3D11Buffer *mAppliedIB;
DXGI_FORMAT mAppliedIBFormat;
@@ -572,34 +631,28 @@ class Renderer11 : public RendererD3D
// Currently applied transform feedback buffers
uintptr_t mAppliedTFObject;
- // Currently applied shaders
- uintptr_t mAppliedVertexShader;
- uintptr_t mAppliedGeometryShader;
- uintptr_t mAppliedPixelShader;
- uintptr_t mAppliedComputeShader;
-
dx_VertexConstants11 mAppliedVertexConstants;
- ID3D11Buffer *mDriverConstantBufferVS;
+ d3d11::Buffer mDriverConstantBufferVS;
SamplerMetadataD3D11 mSamplerMetadataVS;
- ID3D11Buffer *mCurrentVertexConstantBuffer;
+ uintptr_t mCurrentVertexConstantBuffer;
unsigned int mCurrentConstantBufferVS[gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS];
GLintptr mCurrentConstantBufferVSOffset[gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS];
GLsizeiptr mCurrentConstantBufferVSSize[gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS];
dx_PixelConstants11 mAppliedPixelConstants;
- ID3D11Buffer *mDriverConstantBufferPS;
+ d3d11::Buffer mDriverConstantBufferPS;
SamplerMetadataD3D11 mSamplerMetadataPS;
- ID3D11Buffer *mCurrentPixelConstantBuffer;
+ uintptr_t mCurrentPixelConstantBuffer;
unsigned int mCurrentConstantBufferPS[gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS];
GLintptr mCurrentConstantBufferPSOffset[gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS];
GLsizeiptr mCurrentConstantBufferPSSize[gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS];
dx_ComputeConstants11 mAppliedComputeConstants;
- ID3D11Buffer *mDriverConstantBufferCS;
+ d3d11::Buffer mDriverConstantBufferCS;
SamplerMetadataD3D11 mSamplerMetadataCS;
- ID3D11Buffer *mCurrentComputeConstantBuffer;
+ uintptr_t mCurrentComputeConstantBuffer;
- ID3D11Buffer *mCurrentGeometryConstantBuffer;
+ uintptr_t mCurrentGeometryConstantBuffer;
// Vertex, index and input layouts
VertexDataManager *mVertexDataManager;
@@ -620,7 +673,7 @@ class Renderer11 : public RendererD3D
Trim11 *mTrim;
// Sync query
- ID3D11Query *mSyncQuery;
+ d3d11::Query mSyncQuery;
// Created objects state tracking
std::set<const Buffer11 *> mAliveBuffers;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp
index 8cf8a25f857..7c99fa8f89b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp
@@ -17,12 +17,109 @@ namespace rx
namespace
{
+size_t ComputeMippedMemoryUsage(unsigned int width,
+ unsigned int height,
+ unsigned int depth,
+ size_t pixelSize,
+ unsigned int mipLevels)
+{
+ size_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<size_t>(mipWidth * mipHeight * mipDepth) * pixelSize;
+ }
+
+ return sizeSum;
+}
+
+size_t ComputeMemoryUsage(const D3D11_TEXTURE2D_DESC *desc)
+{
+ ASSERT(desc);
+ size_t pixelBytes = static_cast<size_t>(d3d11::GetDXGIFormatSizeInfo(desc->Format).pixelBytes);
+ return ComputeMippedMemoryUsage(desc->Width, desc->Height, 1, pixelBytes, desc->MipLevels);
+}
+
+size_t ComputeMemoryUsage(const D3D11_TEXTURE3D_DESC *desc)
+{
+ ASSERT(desc);
+ size_t pixelBytes = static_cast<size_t>(d3d11::GetDXGIFormatSizeInfo(desc->Format).pixelBytes);
+ return ComputeMippedMemoryUsage(desc->Width, desc->Height, desc->Depth, pixelBytes,
+ desc->MipLevels);
+}
+
+size_t ComputeMemoryUsage(const D3D11_BUFFER_DESC *desc)
+{
+ ASSERT(desc);
+ return static_cast<size_t>(desc->ByteWidth);
+}
+
template <typename T>
size_t ComputeMemoryUsage(const T *desc)
{
return 0;
}
+template <ResourceType ResourceT>
+size_t ComputeGenericMemoryUsage(ID3D11DeviceChild *genericResource)
+{
+ auto *typedResource = static_cast<GetD3D11Type<ResourceT> *>(genericResource);
+ GetDescType<ResourceT> desc;
+ typedResource->GetDesc(&desc);
+ return ComputeMemoryUsage(&desc);
+}
+
+size_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,
@@ -32,6 +129,56 @@ HRESULT CreateResource(ID3D11Device *device,
}
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)
@@ -40,6 +187,14 @@ HRESULT CreateResource(ID3D11Device *device,
}
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)
@@ -47,10 +202,128 @@ HRESULT CreateResource(ID3D11Device *device,
return device->CreateShaderResourceView(resource, desc, resourceOut);
}
-#define ANGLE_RESOURCE_STRINGIFY_OP(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) #RESTYPE
+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, 1.0f, 0);
+ }
+ }
+ else
+ {
+ ASSERT((desc->BindFlags & D3D11_BIND_RENDER_TARGET) != 0);
+ d3d11::RenderTargetView rtv;
+ ANGLE_TRY(renderer->allocateResourceNoDesc(texture, &rtv));
+
+ const FLOAT zero[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+ context->ClearRenderTargetView(rtv.get(), zero);
+ }
+
+ 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));
+
+ const FLOAT zero[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+ context->ClearRenderTargetView(rtv.get(), zero);
+ 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.
@@ -81,8 +354,13 @@ gl::Error ResourceManager11::allocate(Renderer11 *renderer,
ID3D11Device *device = renderer->getDevice();
T *resource = nullptr;
- HRESULT hr = CreateResource(device, desc, initData, &resource);
+ GetInitDataFromD3D11<T> *shadowInitData = initData;
+ if (!shadowInitData && renderer->isRobustResourceInitEnabled())
+ {
+ shadowInitData = createInitDataIfNeeded<T>(desc);
+ }
+ HRESULT hr = CreateResource(device, desc, shadowInitData, &resource);
if (FAILED(hr))
{
ASSERT(!resource);
@@ -95,6 +373,11 @@ gl::Error ResourceManager11::allocate(Renderer11 *renderer,
<< gl::FmtHR(hr);
}
+ if (!shadowInitData && renderer->isRobustResourceInitEnabled())
+ {
+ ANGLE_TRY(ClearResource(renderer, desc, resource));
+ }
+
ASSERT(resource);
incrResource(GetResourceTypeFromD3D11<T>(), ComputeMemoryUsage(desc));
*resourceOut = std::move(Resource11<T>(resource, this));
@@ -115,32 +398,114 @@ void ResourceManager11::decrResource(ResourceType resourceType, size_t memorySiz
mAllocatedResourceDeviceMemory[ResourceTypeIndex(resourceType)] -= memorySize;
}
-template <typename T>
-void ResourceManager11::onRelease(T *resource)
+void ResourceManager11::onReleaseGeneric(ResourceType resourceType, ID3D11DeviceChild *resource)
{
ASSERT(resource);
+ decrResource(resourceType, ComputeGenericMemoryUsage(resourceType, resource));
+}
- GetDescFromD3D11<T> desc;
- resource->GetDesc(&desc);
- decrResource(GetResourceTypeFromD3D11<T>(), ComputeMemoryUsage(&desc));
+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 = ComputeMemoryUsage(desc);
+ if (mZeroMemory.size() < requiredSize)
+ {
+ mZeroMemory.resize(requiredSize);
+ mZeroMemory.fill(0);
+ }
+
+ 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();
}
-#define ANGLE_INSTANTIATE_OP(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) \
- \
-template gl::Error \
- ResourceManager11::allocate(\
-Renderer11 *, \
- \
-const DESCTYPE *, \
- \
-INITDATATYPE *, \
- \
-Resource11<D3D11TYPE> *); \
+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 = ComputeMemoryUsage(desc);
+ if (mZeroMemory.size() < requiredSize)
+ {
+ mZeroMemory.resize(requiredSize);
+ mZeroMemory.fill(0);
+ }
+
+ 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;
+}
+
+#define ANGLE_INSTANTIATE_OP(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) \
\
-\
-template void \
- ResourceManager11::onRelease(D3D11TYPE *);
+template \
+gl::Error \
+ ResourceManager11::allocate(Renderer11 *, const DESCTYPE *, INITDATATYPE *, \
+ Resource11<D3D11TYPE> *);
ANGLE_RESOURCE_TYPE_OP(Instantitate, ANGLE_INSTANTIATE_OP)
-
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.h
index 1847c649a9d..ee3a1e7989b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.h
@@ -12,25 +12,57 @@
#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, DepthStencilView, ID3D11DepthStencilView, D3D11_DEPTH_STENCIL_VIEW_DESC, \
- ID3D11Resource) \
- OP(NAME, RenderTargetView, ID3D11RenderTargetView, D3D11_RENDER_TARGET_VIEW_DESC, \
- ID3D11Resource) \
- OP(NAME, ShaderResourceView, ID3D11ShaderResourceView, D3D11_SHADER_RESOURCE_VIEW_DESC, \
- ID3D11Resource)
+#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,
@@ -156,7 +188,14 @@ class Resource11Base : angle::NonCopyable
void reset() { 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())
@@ -221,12 +260,11 @@ class SharedResource11 : public Resource11Base<T, std::shared_ptr, TypedData<T>>
return *this;
}
- SharedResource11(const SharedResource11 &sharedObj) { this->mData = sharedObj.mData; }
-
- SharedResource11 &operator=(const SharedResource11 &sharedObj)
+ SharedResource11 makeCopy() const
{
- this->mData = sharedObj.mData;
- return *this;
+ SharedResource11 copy;
+ copy.mData = this->mData;
+ return std::move(copy);
}
private:
@@ -267,14 +305,25 @@ class ResourceManager11 final : angle::NonCopyable
}
template <typename T>
- void onRelease(T *resource);
+ void onRelease(T *resource)
+ {
+ onReleaseGeneric(GetResourceTypeFromD3D11<T>(), resource);
+ }
+
+ void onReleaseGeneric(ResourceType resourceType, ID3D11DeviceChild *resource);
private:
void incrResource(ResourceType resourceType, size_t memorySize);
void decrResource(ResourceType resourceType, size_t memorySize);
+ template <typename T>
+ GetInitDataFromD3D11<T> *createInitDataIfNeeded(const GetDescFromD3D11<T> *desc);
+
std::array<size_t, NumResourceTypes> mAllocatedResourceCounts;
std::array<size_t, NumResourceTypes> mAllocatedResourceDeviceMemory;
+ angle::MemoryBuffer mZeroMemory;
+
+ std::vector<D3D11_SUBRESOURCE_DATA> mShadowInitData;
};
template <typename ResourceT>
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp
index ca0bd3f86c6..9d70dbff3ac 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp
@@ -13,106 +13,111 @@
namespace rx
{
-ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11PixelShader *executable)
- : ShaderExecutableD3D(function, length)
+ShaderExecutable11::ShaderExecutable11(const void *function,
+ size_t length,
+ d3d11::PixelShader &&executable)
+ : ShaderExecutableD3D(function, length),
+ mPixelExecutable(std::move(executable)),
+ mVertexExecutable(),
+ mGeometryExecutable(),
+ mStreamOutExecutable(),
+ mComputeExecutable()
{
- mPixelExecutable = executable;
- mVertexExecutable = nullptr;
- mGeometryExecutable = nullptr;
- mStreamOutExecutable = nullptr;
- mComputeExecutable = nullptr;
}
-ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11VertexShader *executable, ID3D11GeometryShader *streamOut)
- : ShaderExecutableD3D(function, length)
+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()
{
- mVertexExecutable = executable;
- mPixelExecutable = nullptr;
- mGeometryExecutable = nullptr;
- mStreamOutExecutable = streamOut;
- mComputeExecutable = nullptr;
}
-ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11GeometryShader *executable)
- : ShaderExecutableD3D(function, length)
+ShaderExecutable11::ShaderExecutable11(const void *function,
+ size_t length,
+ d3d11::GeometryShader &&executable)
+ : ShaderExecutableD3D(function, length),
+ mPixelExecutable(),
+ mVertexExecutable(),
+ mGeometryExecutable(std::move(executable)),
+ mStreamOutExecutable(),
+ mComputeExecutable()
{
- mGeometryExecutable = executable;
- mVertexExecutable = nullptr;
- mPixelExecutable = nullptr;
- mStreamOutExecutable = nullptr;
- mComputeExecutable = nullptr;
}
ShaderExecutable11::ShaderExecutable11(const void *function,
size_t length,
- ID3D11ComputeShader *executable)
- : ShaderExecutableD3D(function, length)
+ d3d11::ComputeShader &&executable)
+ : ShaderExecutableD3D(function, length),
+ mPixelExecutable(),
+ mVertexExecutable(),
+ mGeometryExecutable(),
+ mStreamOutExecutable(),
+ mComputeExecutable(std::move(executable))
{
- mComputeExecutable = executable;
- mPixelExecutable = nullptr;
- mVertexExecutable = nullptr;
- mGeometryExecutable = nullptr;
- mStreamOutExecutable = nullptr;
}
ShaderExecutable11::~ShaderExecutable11()
{
- SafeRelease(mVertexExecutable);
- SafeRelease(mPixelExecutable);
- SafeRelease(mGeometryExecutable);
- SafeRelease(mStreamOutExecutable);
- SafeRelease(mComputeExecutable);
}
-ID3D11VertexShader *ShaderExecutable11::getVertexShader() const
+const d3d11::VertexShader &ShaderExecutable11::getVertexShader() const
{
return mVertexExecutable;
}
-ID3D11PixelShader *ShaderExecutable11::getPixelShader() const
+const d3d11::PixelShader &ShaderExecutable11::getPixelShader() const
{
return mPixelExecutable;
}
-ID3D11GeometryShader *ShaderExecutable11::getGeometryShader() const
+const d3d11::GeometryShader &ShaderExecutable11::getGeometryShader() const
{
return mGeometryExecutable;
}
-ID3D11GeometryShader *ShaderExecutable11::getStreamOutShader() const
+const d3d11::GeometryShader &ShaderExecutable11::getStreamOutShader() const
{
return mStreamOutExecutable;
}
-ID3D11ComputeShader *ShaderExecutable11::getComputeShader() const
+const d3d11::ComputeShader &ShaderExecutable11::getComputeShader() const
{
return mComputeExecutable;
}
-UniformStorage11::UniformStorage11(Renderer11 *renderer, size_t initialSize)
- : UniformStorageD3D(initialSize), mConstantBuffer(nullptr)
+UniformStorage11::UniformStorage11(size_t initialSize)
+ : UniformStorageD3D(initialSize), mConstantBuffer()
{
- ID3D11Device *d3d11Device = renderer->getDevice();
+}
- if (initialSize > 0)
+UniformStorage11::~UniformStorage11()
+{
+}
+
+gl::Error UniformStorage11::getConstantBuffer(Renderer11 *renderer, const d3d11::Buffer **bufferOut)
+{
+ if (size() > 0 && !mConstantBuffer.valid())
{
D3D11_BUFFER_DESC constantBufferDescription = {0};
- constantBufferDescription.ByteWidth = static_cast<unsigned int>(initialSize);
+
+ constantBufferDescription.ByteWidth = static_cast<unsigned int>(size());
constantBufferDescription.Usage = D3D11_USAGE_DYNAMIC;
constantBufferDescription.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
constantBufferDescription.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
constantBufferDescription.MiscFlags = 0;
constantBufferDescription.StructureByteStride = 0;
- HRESULT result =
- d3d11Device->CreateBuffer(&constantBufferDescription, nullptr, &mConstantBuffer);
- ASSERT(SUCCEEDED(result));
+ ANGLE_TRY(renderer->allocateResource(constantBufferDescription, &mConstantBuffer));
}
-}
-UniformStorage11::~UniformStorage11()
-{
- SafeRelease(mConstantBuffer);
+ *bufferOut = &mConstantBuffer;
+ return gl::NoError();
}
-}
+} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h
index 1fe1a20a914..c9a4b610142 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h
@@ -11,6 +11,7 @@
#define LIBANGLE_RENDERER_D3D_D3D11_SHADEREXECUTABLE11_H_
#include "libANGLE/renderer/d3d/ShaderExecutableD3D.h"
+#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
namespace rx
{
@@ -20,39 +21,42 @@ class UniformStorage11;
class ShaderExecutable11 : public ShaderExecutableD3D
{
public:
- ShaderExecutable11(const void *function, size_t length, ID3D11PixelShader *executable);
- ShaderExecutable11(const void *function, size_t length, ID3D11VertexShader *executable, ID3D11GeometryShader *streamOut);
- ShaderExecutable11(const void *function, size_t length, ID3D11GeometryShader *executable);
- ShaderExecutable11(const void *function, size_t length, ID3D11ComputeShader *executable);
+ 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);
virtual ~ShaderExecutable11();
- ID3D11PixelShader *getPixelShader() const;
- ID3D11VertexShader *getVertexShader() const;
- ID3D11GeometryShader *getGeometryShader() const;
- ID3D11GeometryShader *getStreamOutShader() const;
- ID3D11ComputeShader *getComputeShader() const;
+ 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:
- ID3D11PixelShader *mPixelExecutable;
- ID3D11VertexShader *mVertexExecutable;
- ID3D11GeometryShader *mGeometryExecutable;
- ID3D11GeometryShader *mStreamOutExecutable;
- ID3D11ComputeShader *mComputeExecutable;
+ d3d11::PixelShader mPixelExecutable;
+ d3d11::VertexShader mVertexExecutable;
+ d3d11::GeometryShader mGeometryExecutable;
+ d3d11::GeometryShader mStreamOutExecutable;
+ d3d11::ComputeShader mComputeExecutable;
};
class UniformStorage11 : public UniformStorageD3D
{
public:
- UniformStorage11(Renderer11 *renderer, size_t initialSize);
+ UniformStorage11(size_t initialSize);
virtual ~UniformStorage11();
- ID3D11Buffer *getConstantBuffer() const { return mConstantBuffer; }
+ gl::Error getConstantBuffer(Renderer11 *renderer, const d3d11::Buffer **bufferOut);
private:
- ID3D11Buffer *mConstantBuffer;
+ d3d11::Buffer mConstantBuffer;
};
-}
+} // namespace rx
#endif // LIBANGLE_RENDERER_D3D_D3D11_SHADEREXECUTABLE11_H_
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp
index 2a446f403f4..5beb6479ba3 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp
@@ -10,11 +10,12 @@
#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/d3d11/Framebuffer11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h"
+#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
namespace rx
{
@@ -141,25 +142,25 @@ static const GLenum QueryTypes[] = {GL_ANY_SAMPLES_PASSED, GL_ANY_SAMPLES_PASSED
StateManager11::StateManager11(Renderer11 *renderer)
: mRenderer(renderer),
- mBlendStateIsDirty(false),
+ mInternalDirtyBits(),
mCurBlendColor(0, 0, 0, 0),
mCurSampleMask(0),
- mDepthStencilStateIsDirty(false),
mCurStencilRef(0),
mCurStencilBackRef(0),
mCurStencilSize(0),
- mRasterizerStateIsDirty(false),
- mScissorStateIsDirty(false),
mCurScissorEnabled(false),
mCurScissorRect(),
- mViewportStateIsDirty(false),
mCurViewport(),
mCurNear(0.0f),
mCurFar(0.0f),
mViewportBounds(),
- mRenderTargetIsDirty(false),
+ mCurPresentPathFastEnabled(false),
+ mCurPresentPathFastColorBufferHeight(0),
mDirtyCurrentValueAttribs(),
- mCurrentValueAttribs()
+ mCurrentValueAttribs(),
+ mCurrentInputLayout(),
+ mDirtyVertexBufferRange(gl::MAX_VERTEX_ATTRIBS, 0),
+ mCurrentPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_UNDEFINED)
{
mCurBlendState.blend = false;
mCurBlendState.sourceBlendRGB = GL_ONE;
@@ -203,6 +204,10 @@ StateManager11::StateManager11(Renderer11 *renderer)
// Initially all current value attributes must be updated on first use.
mDirtyCurrentValueAttribs.flip();
+
+ mCurrentVertexBuffers.fill(nullptr);
+ mCurrentVertexStrides.fill(std::numeric_limits<UINT>::max());
+ mCurrentVertexOffsets.fill(std::numeric_limits<UINT>::max());
}
StateManager11::~StateManager11()
@@ -214,35 +219,36 @@ void StateManager11::updateStencilSizeIfChanged(bool depthStencilInitialized,
{
if (!depthStencilInitialized || stencilSize != mCurStencilSize)
{
- mCurStencilSize = stencilSize;
- mDepthStencilStateIsDirty = true;
+ mCurStencilSize = stencilSize;
+ mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
}
}
-void StateManager11::setViewportBounds(const int width, const int height)
+void StateManager11::checkPresentPath(const gl::Context *context)
{
- if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3 &&
- (mViewportBounds.width != width || mViewportBounds.height != height))
- {
- mViewportBounds = gl::Extents(width, height, 1);
- mViewportStateIsDirty = true;
- }
-}
+ if (!mRenderer->presentPathFastEnabled())
+ return;
-void StateManager11::updatePresentPath(bool presentPathFastActive,
- const gl::FramebufferAttachment *framebufferAttachment)
-{
- const int colorBufferHeight =
- framebufferAttachment ? framebufferAttachment->getSize().height : 0;
+ 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;
- mViewportStateIsDirty = true; // Viewport may need to be vertically inverted
- mScissorStateIsDirty = true; // Scissor rect may need to be vertically inverted
- mRasterizerStateIsDirty = true; // Cull Mode may need to be inverted
+
+ // 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
+ mInternalDirtyBits.set(DIRTY_BIT_VIEWPORT_STATE);
}
}
@@ -253,13 +259,15 @@ void StateManager11::setComputeConstants(GLuint numGroupsX, GLuint numGroupsY, G
mComputeConstants.numWorkGroups[2] = numGroupsZ;
}
-void StateManager11::syncState(const gl::State &state, const gl::State::DirtyBits &dirtyBits)
+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)
@@ -270,7 +278,7 @@ void StateManager11::syncState(const gl::State &state, const gl::State::DirtyBit
if (blendState.blendEquationRGB != mCurBlendState.blendEquationRGB ||
blendState.blendEquationAlpha != mCurBlendState.blendEquationAlpha)
{
- mBlendStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
}
break;
}
@@ -282,27 +290,27 @@ void StateManager11::syncState(const gl::State &state, const gl::State::DirtyBit
blendState.sourceBlendAlpha != mCurBlendState.sourceBlendAlpha ||
blendState.destBlendAlpha != mCurBlendState.destBlendAlpha)
{
- mBlendStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
}
break;
}
case gl::State::DIRTY_BIT_BLEND_ENABLED:
if (state.getBlendState().blend != mCurBlendState.blend)
{
- mBlendStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
}
break;
case gl::State::DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED:
if (state.getBlendState().sampleAlphaToCoverage !=
mCurBlendState.sampleAlphaToCoverage)
{
- mBlendStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
}
break;
case gl::State::DIRTY_BIT_DITHER_ENABLED:
if (state.getBlendState().dither != mCurBlendState.dither)
{
- mBlendStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
}
break;
case gl::State::DIRTY_BIT_COLOR_MASK:
@@ -313,38 +321,38 @@ void StateManager11::syncState(const gl::State &state, const gl::State::DirtyBit
blendState.colorMaskBlue != mCurBlendState.colorMaskBlue ||
blendState.colorMaskAlpha != mCurBlendState.colorMaskAlpha)
{
- mBlendStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
}
break;
}
case gl::State::DIRTY_BIT_BLEND_COLOR:
if (state.getBlendColor() != mCurBlendColor)
{
- mBlendStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
}
break;
case gl::State::DIRTY_BIT_DEPTH_MASK:
if (state.getDepthStencilState().depthMask != mCurDepthStencilState.depthMask)
{
- mDepthStencilStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
}
break;
case gl::State::DIRTY_BIT_DEPTH_TEST_ENABLED:
if (state.getDepthStencilState().depthTest != mCurDepthStencilState.depthTest)
{
- mDepthStencilStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
}
break;
case gl::State::DIRTY_BIT_DEPTH_FUNC:
if (state.getDepthStencilState().depthFunc != mCurDepthStencilState.depthFunc)
{
- mDepthStencilStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
}
break;
case gl::State::DIRTY_BIT_STENCIL_TEST_ENABLED:
if (state.getDepthStencilState().stencilTest != mCurDepthStencilState.stencilTest)
{
- mDepthStencilStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
}
break;
case gl::State::DIRTY_BIT_STENCIL_FUNCS_FRONT:
@@ -354,7 +362,7 @@ void StateManager11::syncState(const gl::State &state, const gl::State::DirtyBit
depthStencil.stencilMask != mCurDepthStencilState.stencilMask ||
state.getStencilRef() != mCurStencilRef)
{
- mDepthStencilStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
}
break;
}
@@ -365,7 +373,7 @@ void StateManager11::syncState(const gl::State &state, const gl::State::DirtyBit
depthStencil.stencilBackMask != mCurDepthStencilState.stencilBackMask ||
state.getStencilBackRef() != mCurStencilBackRef)
{
- mDepthStencilStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
}
break;
}
@@ -373,14 +381,14 @@ void StateManager11::syncState(const gl::State &state, const gl::State::DirtyBit
if (state.getDepthStencilState().stencilWritemask !=
mCurDepthStencilState.stencilWritemask)
{
- mDepthStencilStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
}
break;
case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_BACK:
if (state.getDepthStencilState().stencilBackWritemask !=
mCurDepthStencilState.stencilBackWritemask)
{
- mDepthStencilStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
}
break;
case gl::State::DIRTY_BIT_STENCIL_OPS_FRONT:
@@ -391,7 +399,7 @@ void StateManager11::syncState(const gl::State &state, const gl::State::DirtyBit
mCurDepthStencilState.stencilPassDepthFail ||
depthStencil.stencilPassDepthPass != mCurDepthStencilState.stencilPassDepthPass)
{
- mDepthStencilStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
}
break;
}
@@ -404,33 +412,33 @@ void StateManager11::syncState(const gl::State &state, const gl::State::DirtyBit
depthStencil.stencilBackPassDepthPass !=
mCurDepthStencilState.stencilBackPassDepthPass)
{
- mDepthStencilStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_DEPTH_STENCIL_STATE);
}
break;
}
case gl::State::DIRTY_BIT_CULL_FACE_ENABLED:
if (state.getRasterizerState().cullFace != mCurRasterState.cullFace)
{
- mRasterizerStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE);
}
break;
case gl::State::DIRTY_BIT_CULL_FACE:
if (state.getRasterizerState().cullMode != mCurRasterState.cullMode)
{
- mRasterizerStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE);
}
break;
case gl::State::DIRTY_BIT_FRONT_FACE:
if (state.getRasterizerState().frontFace != mCurRasterState.frontFace)
{
- mRasterizerStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE);
}
break;
case gl::State::DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED:
if (state.getRasterizerState().polygonOffsetFill !=
mCurRasterState.polygonOffsetFill)
{
- mRasterizerStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE);
}
break;
case gl::State::DIRTY_BIT_POLYGON_OFFSET:
@@ -439,7 +447,7 @@ void StateManager11::syncState(const gl::State &state, const gl::State::DirtyBit
if (rasterState.polygonOffsetFactor != mCurRasterState.polygonOffsetFactor ||
rasterState.polygonOffsetUnits != mCurRasterState.polygonOffsetUnits)
{
- mRasterizerStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE);
}
break;
}
@@ -447,37 +455,37 @@ void StateManager11::syncState(const gl::State &state, const gl::State::DirtyBit
if (state.getRasterizerState().rasterizerDiscard !=
mCurRasterState.rasterizerDiscard)
{
- mRasterizerStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE);
}
break;
case gl::State::DIRTY_BIT_SCISSOR:
if (state.getScissor() != mCurScissorRect)
{
- mScissorStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_SCISSOR_STATE);
}
break;
case gl::State::DIRTY_BIT_SCISSOR_TEST_ENABLED:
if (state.isScissorTestEnabled() != mCurScissorEnabled)
{
- mScissorStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_SCISSOR_STATE);
// Rasterizer state update needs mCurScissorsEnabled and updates when it changes
- mRasterizerStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_RASTERIZER_STATE);
}
break;
case gl::State::DIRTY_BIT_DEPTH_RANGE:
if (state.getNearPlane() != mCurNear || state.getFarPlane() != mCurFar)
{
- mViewportStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_VIEWPORT_STATE);
}
break;
case gl::State::DIRTY_BIT_VIEWPORT:
if (state.getViewport() != mCurViewport)
{
- mViewportStateIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_VIEWPORT_STATE);
}
break;
case gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING:
- mRenderTargetIsDirty = true;
+ invalidateRenderTarget(context);
break;
default:
if (dirtyBit >= gl::State::DIRTY_BIT_CURRENT_VALUE_0 &&
@@ -490,22 +498,21 @@ void StateManager11::syncState(const gl::State &state, const gl::State::DirtyBit
break;
}
}
+
+ // TODO(jmadill): Input layout and vertex buffer state.
}
-gl::Error StateManager11::setBlendState(const gl::Framebuffer *framebuffer,
- const gl::BlendState &blendState,
- const gl::ColorF &blendColor,
- unsigned int sampleMask)
+gl::Error StateManager11::syncBlendState(const gl::Context *context,
+ const gl::Framebuffer *framebuffer,
+ const gl::BlendState &blendState,
+ const gl::ColorF &blendColor,
+ unsigned int sampleMask)
{
- if (!mBlendStateIsDirty && sampleMask == mCurSampleMask)
- {
- return gl::NoError();
- }
-
ID3D11BlendState *dxBlendState = nullptr;
- const d3d11::BlendStateKey &key = RenderStateCache::GetBlendStateKey(framebuffer, blendState);
+ const d3d11::BlendStateKey &key =
+ RenderStateCache::GetBlendStateKey(context, framebuffer, blendState);
- ANGLE_TRY(mRenderer->getStateCache().getBlendState(key, &dxBlendState));
+ ANGLE_TRY(mRenderer->getBlendState(key, &dxBlendState));
ASSERT(dxBlendState != nullptr);
@@ -534,36 +541,14 @@ gl::Error StateManager11::setBlendState(const gl::Framebuffer *framebuffer,
mCurBlendColor = blendColor;
mCurSampleMask = sampleMask;
- mBlendStateIsDirty = false;
-
return gl::NoError();
}
-gl::Error StateManager11::setDepthStencilState(const gl::State &glState)
+gl::Error StateManager11::syncDepthStencilState(const gl::State &glState)
{
- const auto &fbo = *glState.getDrawFramebuffer();
-
- // 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());
-
- // CurDisableDepth/Stencil are reset automatically after we call forceSetDepthStencilState.
- if (!mDepthStencilStateIsDirty && mCurDisableDepth.valid() &&
- disableDepth == mCurDisableDepth.value() && mCurDisableStencil.valid() &&
- disableStencil == mCurDisableStencil.value())
- {
- return gl::NoError();
- }
-
mCurDepthStencilState = glState.getDepthStencilState();
mCurStencilRef = glState.getStencilRef();
mCurStencilBackRef = glState.getStencilBackRef();
- mCurDisableDepth = disableDepth;
- mCurDisableStencil = disableStencil;
// get the maximum size of the stencil ref
unsigned int maxStencil = 0;
@@ -577,25 +562,26 @@ gl::Error StateManager11::setDepthStencilState(const gl::State &glState)
ASSERT((mCurDepthStencilState.stencilMask & maxStencil) ==
(mCurDepthStencilState.stencilBackMask & maxStencil));
- ID3D11DepthStencilState *dxDepthStencilState = nullptr;
- gl::DepthStencilState dsStateKey = glState.getDepthStencilState();
+ gl::DepthStencilState modifiedGLState = glState.getDepthStencilState();
- if (disableDepth)
+ ASSERT(mCurDisableDepth.valid() && mCurDisableStencil.valid());
+
+ if (mCurDisableDepth.value())
{
- dsStateKey.depthTest = false;
- dsStateKey.depthMask = false;
+ modifiedGLState.depthTest = false;
+ modifiedGLState.depthMask = false;
}
- if (disableStencil)
+ if (mCurDisableStencil.value())
{
- dsStateKey.stencilWritemask = 0;
- dsStateKey.stencilBackWritemask = 0;
- dsStateKey.stencilTest = false;
+ modifiedGLState.stencilWritemask = 0;
+ modifiedGLState.stencilBackWritemask = 0;
+ modifiedGLState.stencilTest = false;
}
- ANGLE_TRY(mRenderer->getStateCache().getDepthStencilState(dsStateKey, &dxDepthStencilState));
-
- ASSERT(dxDepthStencilState);
+ ID3D11DepthStencilState *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
@@ -607,21 +593,17 @@ gl::Error StateManager11::setDepthStencilState(const gl::State &glState)
"Unexpected value of D3D11_DEFAULT_STENCIL_WRITE_MASK");
UINT dxStencilRef = std::min<UINT>(mCurStencilRef, 0xFFu);
- mRenderer->getDeviceContext()->OMSetDepthStencilState(dxDepthStencilState, dxStencilRef);
-
- mDepthStencilStateIsDirty = false;
+ mRenderer->getDeviceContext()->OMSetDepthStencilState(d3dState, dxStencilRef);
return gl::NoError();
}
-gl::Error StateManager11::setRasterizerState(const gl::RasterizerState &rasterState)
+gl::Error StateManager11::syncRasterizerState(const gl::Context *context, bool pointDrawMode)
{
// TODO: Remove pointDrawMode and multiSample from gl::RasterizerState.
- if (!mRasterizerStateIsDirty && rasterState.pointDrawMode == mCurRasterState.pointDrawMode &&
- rasterState.multiSample == mCurRasterState.multiSample)
- {
- return gl::NoError();
- }
+ gl::RasterizerState rasterState = context->getGLState().getRasterizerState();
+ rasterState.pointDrawMode = pointDrawMode;
+ rasterState.multiSample = mCurRasterState.multiSample;
ID3D11RasterizerState *dxRasterState = nullptr;
@@ -642,28 +624,23 @@ gl::Error StateManager11::setRasterizerState(const gl::RasterizerState &rasterSt
modifiedRasterState.frontFace = GL_CCW;
}
- ANGLE_TRY(mRenderer->getStateCache().getRasterizerState(
- modifiedRasterState, mCurScissorEnabled, &dxRasterState));
+ ANGLE_TRY(
+ mRenderer->getRasterizerState(modifiedRasterState, mCurScissorEnabled, &dxRasterState));
}
else
{
- ANGLE_TRY(mRenderer->getStateCache().getRasterizerState(rasterState, mCurScissorEnabled,
- &dxRasterState));
+ ANGLE_TRY(mRenderer->getRasterizerState(rasterState, mCurScissorEnabled, &dxRasterState));
}
mRenderer->getDeviceContext()->RSSetState(dxRasterState);
- mCurRasterState = rasterState;
- mRasterizerStateIsDirty = false;
+ mCurRasterState = rasterState;
return gl::NoError();
}
-void StateManager11::setScissorRectangle(const gl::Rectangle &scissor, bool enabled)
+void StateManager11::syncScissorRectangle(const gl::Rectangle &scissor, bool enabled)
{
- if (!mScissorStateIsDirty)
- return;
-
int modifiedScissorY = scissor.y;
if (mCurPresentPathFastEnabled)
{
@@ -683,17 +660,13 @@ void StateManager11::setScissorRectangle(const gl::Rectangle &scissor, bool enab
mCurScissorRect = scissor;
mCurScissorEnabled = enabled;
- mScissorStateIsDirty = false;
}
-void StateManager11::setViewport(const gl::Caps *caps,
- const gl::Rectangle &viewport,
- float zNear,
- float zFar)
+void StateManager11::syncViewport(const gl::Caps *caps,
+ const gl::Rectangle &viewport,
+ float zNear,
+ float zFar)
{
- if (!mViewportStateIsDirty)
- return;
-
float actualZNear = gl::clamp01(zNear);
float actualZFar = gl::clamp01(zFar);
@@ -791,50 +764,119 @@ void StateManager11::setViewport(const gl::Caps *caps,
mVertexConstants.viewScale[1] = mPixelConstants.viewScale[1];
mVertexConstants.viewScale[2] = mPixelConstants.viewScale[2];
mVertexConstants.viewScale[3] = mPixelConstants.viewScale[3];
-
- mViewportStateIsDirty = false;
}
-void StateManager11::invalidateRenderTarget()
+void StateManager11::invalidateRenderTarget(const gl::Context *context)
{
- mRenderTargetIsDirty = true;
+ mInternalDirtyBits.set(DIRTY_BIT_RENDER_TARGET);
+
+ // The D3D11 blend state is heavily dependent on the current render target.
+ mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
+
+ // nullptr only on display initialization.
+ if (!context)
+ {
+ return;
+ }
+
+ gl::Framebuffer *fbo = context->getGLState().getDrawFramebuffer();
+
+ // nullptr fbo can occur in some egl events like display initialization.
+ if (!fbo)
+ {
+ return;
+ }
+
+ // 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)
+ {
+ auto *firstAttachment = fbo->getFirstNonNullAttachment();
+ const auto &size = firstAttachment->getSize();
+ if (mViewportBounds.width != size.width || mViewportBounds.height != size.height)
+ {
+ mViewportBounds = gl::Extents(size.width, size.height, 1);
+ mInternalDirtyBits.set(DIRTY_BIT_VIEWPORT_STATE);
+ }
+ }
}
-void StateManager11::invalidateBoundViews()
+void StateManager11::invalidateBoundViews(const gl::Context *context)
{
mCurVertexSRVs.clear();
mCurPixelSRVs.clear();
- invalidateRenderTarget();
+ invalidateRenderTarget(context);
}
-void StateManager11::invalidateEverything()
+void StateManager11::invalidateEverything(const gl::Context *context)
{
- mBlendStateIsDirty = true;
- mDepthStencilStateIsDirty = true;
- mRasterizerStateIsDirty = true;
- mScissorStateIsDirty = true;
- mViewportStateIsDirty = true;
+ mInternalDirtyBits.set();
// We reset the current SRV data because it might not be in sync with D3D's state
// anymore. For example when a currently used SRV is used as an RTV, D3D silently
// remove it from its state.
- invalidateBoundViews();
+ invalidateBoundViews(context);
+
+ // All calls to IASetInputLayout go through the state manager, so it shouldn't be
+ // necessary to invalidate the state.
+
+ // Invalidate the vertex buffer state.
+ invalidateVertexBuffer();
+
+ mCurrentPrimitiveTopology = D3D_PRIMITIVE_TOPOLOGY_UNDEFINED;
+
+ mAppliedVertexShader.dirty();
+ mAppliedGeometryShader.dirty();
+ mAppliedPixelShader.dirty();
+ mAppliedComputeShader.dirty();
+}
+
+void StateManager11::invalidateVertexBuffer()
+{
+ unsigned int limit = std::min<unsigned int>(mRenderer->getNativeCaps().maxVertexAttributes,
+ gl::MAX_VERTEX_ATTRIBS);
+ mDirtyVertexBufferRange = gl::RangeUI(0, limit);
}
-void StateManager11::setOneTimeRenderTarget(ID3D11RenderTargetView *rtv,
+void StateManager11::setOneTimeRenderTarget(const gl::Context *context,
+ ID3D11RenderTargetView *rtv,
ID3D11DepthStencilView *dsv)
{
mRenderer->getDeviceContext()->OMSetRenderTargets(1, &rtv, dsv);
- mRenderTargetIsDirty = true;
+ invalidateRenderTarget(context);
}
-void StateManager11::setOneTimeRenderTargets(ID3D11RenderTargetView **rtvs,
+void StateManager11::setOneTimeRenderTargets(const gl::Context *context,
+ ID3D11RenderTargetView **rtvs,
UINT numRtvs,
ID3D11DepthStencilView *dsv)
{
mRenderer->getDeviceContext()->OMSetRenderTargets(numRtvs, (numRtvs > 0) ? rtvs : nullptr, dsv);
- mRenderTargetIsDirty = true;
+ invalidateRenderTarget(context);
}
void StateManager11::onBeginQuery(Query11 *query)
@@ -847,9 +889,9 @@ void StateManager11::onDeleteQueryObject(Query11 *query)
mCurrentQueries.erase(query);
}
-gl::Error StateManager11::onMakeCurrent(const gl::ContextState &data)
+gl::Error StateManager11::onMakeCurrent(const gl::Context *context)
{
- const gl::State &state = data.getState();
+ const gl::State &state = context->getGLState();
for (Query11 *query : mCurrentQueries)
{
@@ -907,9 +949,7 @@ gl::Error StateManager11::clearTextures(gl::SamplerType samplerType,
auto &currentSRVs = (samplerType == gl::SAMPLER_VERTEX ? mCurVertexSRVs : mCurPixelSRVs);
- gl::Range<size_t> clearRange(rangeStart, rangeStart);
- clearRange.extend(std::min(rangeEnd, currentSRVs.highestUsed()));
-
+ gl::Range<size_t> clearRange(rangeStart, std::min(rangeEnd, currentSRVs.highestUsed()));
if (clearRange.empty())
{
return gl::NoError();
@@ -918,18 +958,18 @@ gl::Error StateManager11::clearTextures(gl::SamplerType samplerType,
auto deviceContext = mRenderer->getDeviceContext();
if (samplerType == gl::SAMPLER_VERTEX)
{
- deviceContext->VSSetShaderResources(static_cast<unsigned int>(rangeStart),
- static_cast<unsigned int>(rangeEnd - rangeStart),
+ deviceContext->VSSetShaderResources(static_cast<unsigned int>(clearRange.low()),
+ static_cast<unsigned int>(clearRange.length()),
&mNullSRVs[0]);
}
else
{
- deviceContext->PSSetShaderResources(static_cast<unsigned int>(rangeStart),
- static_cast<unsigned int>(rangeEnd - rangeStart),
+ deviceContext->PSSetShaderResources(static_cast<unsigned int>(clearRange.low()),
+ static_cast<unsigned int>(clearRange.length()),
&mNullSRVs[0]);
}
- for (size_t samplerIndex = rangeStart; samplerIndex < rangeEnd; ++samplerIndex)
+ for (size_t samplerIndex : clearRange)
{
currentSRVs.update(samplerIndex, nullptr);
}
@@ -987,23 +1027,13 @@ void StateManager11::deinitialize()
mCurrentValueAttribs.clear();
}
-gl::Error StateManager11::syncFramebuffer(ContextImpl *contextImpl, gl::Framebuffer *framebuffer)
+gl::Error StateManager11::syncFramebuffer(const gl::Context *context, gl::Framebuffer *framebuffer)
{
Framebuffer11 *framebuffer11 = GetImplAs<Framebuffer11>(framebuffer);
- ANGLE_TRY(framebuffer11->markAttachmentsDirty());
- if (framebuffer11->hasAnyInternalDirtyBit())
- {
- ASSERT(framebuffer->id() != 0);
- framebuffer11->syncInternalState(contextImpl);
- }
-
- if (!mRenderTargetIsDirty)
- {
- return gl::NoError();
- }
-
- mRenderTargetIsDirty = false;
+ // 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.
@@ -1018,20 +1048,15 @@ gl::Error StateManager11::syncFramebuffer(ContextImpl *contextImpl, gl::Framebuf
}
}
- // Get the color render buffer and serial
- // Also extract the render target dimensions and view
- unsigned int renderTargetWidth = 0;
- unsigned int renderTargetHeight = 0;
- RTVArray framebufferRTVs;
- bool missingColorRenderTarget = true;
-
- framebufferRTVs.fill(nullptr);
+ 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)
@@ -1039,7 +1064,8 @@ gl::Error StateManager11::syncFramebuffer(ContextImpl *contextImpl, gl::Framebuf
const RenderTarget11 *renderTarget = colorRTs[rtIndex];
// Skip inactive rendertargets if the workaround is enabled.
- if (skipInactiveRTs && (!renderTarget || drawStates[rtIndex] == GL_NONE))
+ if (skipInactiveRTs &&
+ (!renderTarget || drawStates[rtIndex] == GL_NONE || !activeProgramOutputs[rtIndex]))
{
continue;
}
@@ -1049,19 +1075,12 @@ gl::Error StateManager11::syncFramebuffer(ContextImpl *contextImpl, gl::Framebuf
framebufferRTVs[appliedRTIndex] = renderTarget->getRenderTargetView().get();
ASSERT(framebufferRTVs[appliedRTIndex]);
maxExistingRT = static_cast<UINT>(appliedRTIndex) + 1;
-
- if (missingColorRenderTarget)
- {
- renderTargetWidth = renderTarget->getWidth();
- renderTargetHeight = renderTarget->getHeight();
- missingColorRenderTarget = false;
- }
}
// Unset conflicting texture SRVs
const auto *attachment = framebuffer->getColorbuffer(rtIndex);
ASSERT(attachment);
- unsetConflictingAttachmentResources(attachment, renderTarget->getTexture());
+ unsetConflictingAttachmentResources(attachment, renderTarget->getTexture().get());
appliedRTIndex++;
}
@@ -1074,18 +1093,11 @@ gl::Error StateManager11::syncFramebuffer(ContextImpl *contextImpl, gl::Framebuf
framebufferDSV = depthStencilRenderTarget->getDepthStencilView().get();
ASSERT(framebufferDSV);
- // If there is no render buffer, the width, height and format values come from
- // the depth stencil
- if (missingColorRenderTarget)
- {
- renderTargetWidth = depthStencilRenderTarget->getWidth();
- renderTargetHeight = depthStencilRenderTarget->getHeight();
- }
-
// Unset conflicting texture SRVs
const auto *attachment = framebuffer->getDepthOrStencilbuffer();
ASSERT(attachment);
- unsetConflictingAttachmentResources(attachment, depthStencilRenderTarget->getTexture());
+ unsetConflictingAttachmentResources(attachment,
+ depthStencilRenderTarget->getTexture().get());
}
// TODO(jmadill): Use context caps?
@@ -1095,11 +1107,6 @@ gl::Error StateManager11::syncFramebuffer(ContextImpl *contextImpl, gl::Framebuf
mRenderer->getDeviceContext()->OMSetRenderTargets(maxExistingRT, framebufferRTVs.data(),
framebufferDSV);
- // The D3D11 blend state is heavily dependent on the current render target.
- mBlendStateIsDirty = true;
-
- setViewportBounds(renderTargetWidth, renderTargetHeight);
-
return gl::NoError();
}
@@ -1137,4 +1144,216 @@ const std::vector<TranslatedAttribute> &StateManager11::getCurrentValueAttribs()
return mCurrentValueAttribs;
}
+void StateManager11::setInputLayout(const d3d11::InputLayout *inputLayout)
+{
+ ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
+ if (inputLayout == nullptr)
+ {
+ if (mCurrentInputLayout != 0)
+ {
+ deviceContext->IASetInputLayout(nullptr);
+ mCurrentInputLayout = 0;
+ }
+ }
+ else if (inputLayout->getSerial() != mCurrentInputLayout)
+ {
+ deviceContext->IASetInputLayout(inputLayout->get());
+ mCurrentInputLayout = inputLayout->getSerial();
+ }
+}
+
+bool StateManager11::queueVertexBufferChange(size_t bufferIndex,
+ ID3D11Buffer *buffer,
+ UINT stride,
+ UINT offset)
+{
+ if (buffer != mCurrentVertexBuffers[bufferIndex] ||
+ stride != mCurrentVertexStrides[bufferIndex] ||
+ offset != mCurrentVertexOffsets[bufferIndex])
+ {
+ 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])
+ {
+ 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 &data = context->getContextState();
+ const auto &glState = data.getState();
+
+ 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);
+ }
+
+ // TODO(jmadill): This can be recomputed only on framebuffer changes.
+ RenderTarget11 *firstRT = framebuffer11->getFirstRenderTarget();
+ int samples = (firstRT ? firstRT->getSamples() : 0);
+ unsigned int sampleMask = GetBlendSampleMask(data, samples);
+ if (sampleMask != mCurSampleMask)
+ {
+ mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
+ }
+
+ 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(&data.getCaps(), glState.getViewport(), glState.getNearPlane(),
+ glState.getFarPlane());
+ 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;
+ default:
+ UNREACHABLE();
+ break;
+ }
+ }
+
+ // 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::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() : 0;
+
+ if (serial != mAppliedVertexShader)
+ {
+ ID3D11VertexShader *appliedShader = shader ? shader->get() : nullptr;
+ mRenderer->getDeviceContext()->VSSetShader(appliedShader, nullptr, 0);
+ mAppliedVertexShader = serial;
+ }
+}
+
+void StateManager11::setGeometryShader(const d3d11::GeometryShader *shader)
+{
+ ResourceSerial serial = shader ? shader->getSerial() : 0;
+
+ if (serial != mAppliedGeometryShader)
+ {
+ ID3D11GeometryShader *appliedShader = shader ? shader->get() : nullptr;
+ mRenderer->getDeviceContext()->GSSetShader(appliedShader, nullptr, 0);
+ mAppliedGeometryShader = serial;
+ }
+}
+
+void StateManager11::setPixelShader(const d3d11::PixelShader *shader)
+{
+ ResourceSerial serial = shader ? shader->getSerial() : 0;
+
+ if (serial != mAppliedPixelShader)
+ {
+ ID3D11PixelShader *appliedShader = shader ? shader->get() : nullptr;
+ mRenderer->getDeviceContext()->PSSetShader(appliedShader, nullptr, 0);
+ mAppliedPixelShader = serial;
+ }
+}
+
+void StateManager11::setComputeShader(const d3d11::ComputeShader *shader)
+{
+ ResourceSerial serial = shader ? shader->getSerial() : 0;
+
+ if (serial != mAppliedComputeShader)
+ {
+ ID3D11ComputeShader *appliedShader = shader ? shader->get() : nullptr;
+ mRenderer->getDeviceContext()->CSSetShader(appliedShader, nullptr, 0);
+ mAppliedComputeShader = serial;
+ }
+}
+
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.h
index 83e8dfacecd..bc0f47675fd 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.h
@@ -55,23 +55,8 @@ class StateManager11 final : angle::NonCopyable
void initialize(const gl::Caps &caps);
void deinitialize();
- void syncState(const gl::State &state, const gl::State::DirtyBits &dirtyBits);
- gl::Error setBlendState(const gl::Framebuffer *framebuffer,
- const gl::BlendState &blendState,
- const gl::ColorF &blendColor,
- unsigned int sampleMask);
-
- gl::Error setDepthStencilState(const gl::State &glState);
-
- gl::Error setRasterizerState(const gl::RasterizerState &rasterState);
-
- void setScissorRectangle(const gl::Rectangle &scissor, bool enabled);
-
- void setViewport(const gl::Caps *caps, const gl::Rectangle &viewport, float zNear, float zFar);
-
- void updatePresentPath(bool presentPathFastActive,
- const gl::FramebufferAttachment *framebufferAttachment);
+ void syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits);
const dx_VertexConstants11 &getVertexConstants() const { return mVertexConstants; }
const dx_PixelConstants11 &getPixelConstants() const { return mPixelConstants; }
@@ -86,46 +71,104 @@ class StateManager11 final : angle::NonCopyable
ID3D11ShaderResourceView *srv);
gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd);
- gl::Error syncFramebuffer(ContextImpl *contextImpl, gl::Framebuffer *framebuffer);
-
- void invalidateRenderTarget();
- void invalidateBoundViews();
- void invalidateEverything();
-
- void setOneTimeRenderTarget(ID3D11RenderTargetView *rtv, ID3D11DepthStencilView *dsv);
- void setOneTimeRenderTargets(ID3D11RenderTargetView **rtvs,
+ // 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(const gl::Context *context);
+ void invalidateBoundViews(const gl::Context *context);
+ void invalidateVertexBuffer();
+ void invalidateEverything(const gl::Context *context);
+
+ void setOneTimeRenderTarget(const gl::Context *context,
+ ID3D11RenderTargetView *rtv,
+ ID3D11DepthStencilView *dsv);
+ void setOneTimeRenderTargets(const gl::Context *context,
+ ID3D11RenderTargetView **rtvs,
UINT numRtvs,
ID3D11DepthStencilView *dsv);
void onBeginQuery(Query11 *query);
void onDeleteQueryObject(Query11 *query);
- gl::Error onMakeCurrent(const gl::ContextState &data);
+ gl::Error onMakeCurrent(const gl::Context *context);
gl::Error updateCurrentValueAttribs(const gl::State &state,
VertexDataManager *vertexDataManager);
const std::vector<TranslatedAttribute> &getCurrentValueAttribs() const;
+ 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 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);
+
private:
- void setViewportBounds(const int width, const int height);
void 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::Caps *caps, const gl::Rectangle &viewport, float zNear, float zFar);
+
+ void checkPresentPath(const gl::Context *context);
+
+ gl::Error syncFramebuffer(const gl::Context *context, gl::Framebuffer *framebuffer);
+
+ 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_INVALID,
+ DIRTY_BIT_MAX = DIRTY_BIT_INVALID,
+ };
+
+ using DirtyBits = angle::BitSet<DIRTY_BIT_MAX>;
+
Renderer11 *mRenderer;
+ // Internal dirty bits.
+ DirtyBits mInternalDirtyBits;
+
// Blend State
- bool mBlendStateIsDirty;
- // TODO(dianx) temporary representation of a dirty bit. once we move enough states in,
- // try experimenting with dirty bit instead of a bool
gl::BlendState mCurBlendState;
gl::ColorF mCurBlendColor;
unsigned int mCurSampleMask;
// Currently applied depth stencil state
- bool mDepthStencilStateIsDirty;
gl::DepthStencilState mCurDepthStencilState;
int mCurStencilRef;
int mCurStencilBackRef;
@@ -134,16 +177,13 @@ class StateManager11 final : angle::NonCopyable
Optional<bool> mCurDisableStencil;
// Currently applied rasterizer state
- bool mRasterizerStateIsDirty;
gl::RasterizerState mCurRasterState;
// Currently applied scissor rectangle state
- bool mScissorStateIsDirty;
bool mCurScissorEnabled;
gl::Rectangle mCurScissorRect;
// Currently applied viewport state
- bool mViewportStateIsDirty;
gl::Rectangle mCurViewport;
float mCurNear;
float mCurFar;
@@ -161,9 +201,6 @@ class StateManager11 final : angle::NonCopyable
bool mCurPresentPathFastEnabled;
int mCurPresentPathFastColorBufferHeight;
- // Current RenderTarget state
- bool mRenderTargetIsDirty;
-
// Queries that are currently active in this state
std::set<Query11 *> mCurrentQueries;
@@ -207,6 +244,25 @@ class StateManager11 final : angle::NonCopyable
// Current translations of "Current-Value" data - owned by Context, not VertexArray.
gl::AttributesMask mDirtyCurrentValueAttribs;
std::vector<TranslatedAttribute> mCurrentValueAttribs;
+
+ // Current applied input layout.
+ ResourceSerial mCurrentInputLayout;
+
+ // 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;
};
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.cpp
index fbbdf552a14..1981b5f7b26 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerNV12.cpp
@@ -34,7 +34,7 @@ egl::Error StreamProducerNV12::validateD3DNV12Texture(void *pointer) const
textureD3D->GetDevice(&device);
if (device != mRenderer->getDevice())
{
- return egl::Error(EGL_BAD_PARAMETER, "Texture not created on ANGLE D3D device");
+ return egl::EglBadParameter() << "Texture not created on ANGLE D3D device";
}
// Get the description and validate it
@@ -42,17 +42,17 @@ egl::Error StreamProducerNV12::validateD3DNV12Texture(void *pointer) const
textureD3D->GetDesc(&desc);
if (desc.Format != DXGI_FORMAT_NV12)
{
- return egl::Error(EGL_BAD_PARAMETER, "Texture format not DXGI_FORMAT_NV12");
+ return egl::EglBadParameter() << "Texture format not DXGI_FORMAT_NV12";
}
if (desc.Width < 1 || desc.Height < 1)
{
- return egl::Error(EGL_BAD_PARAMETER, "Texture is of size 0");
+ return egl::EglBadParameter() << "Texture is of size 0";
}
if ((desc.Width % 2) != 0 || (desc.Height % 2) != 0)
{
- return egl::Error(EGL_BAD_PARAMETER, "Texture dimensions are not even");
+ return egl::EglBadParameter() << "Texture dimensions are not even";
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
void StreamProducerNV12::postD3DNV12Texture(void *pointer, const egl::AttributeMap &attributes)
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp
index 67554d37ca6..24420243ed0 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp
@@ -11,9 +11,9 @@
#include <EGL/eglext.h>
#include "libANGLE/features.h"
-#include "libANGLE/renderer/d3d/d3d11/formatutils11.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"
@@ -70,22 +70,22 @@ SwapChain11::SwapChain11(Renderer11 *renderer,
mSwapChain(nullptr),
mSwapChain1(nullptr),
mKeyedMutex(nullptr),
- mBackBufferTexture(nullptr),
+ mBackBufferTexture(),
mBackBufferRTView(),
mBackBufferSRView(),
mNeedsOffscreenTexture(NeedsOffscreenTexture(renderer, nativeWindow, orientation)),
- mOffscreenTexture(nullptr),
+ mOffscreenTexture(),
mOffscreenRTView(),
mOffscreenSRView(),
- mDepthStencilTexture(nullptr),
+ mDepthStencilTexture(),
mDepthStencilDSView(),
mDepthStencilSRView(),
- mQuadVB(nullptr),
- mPassThroughSampler(nullptr),
- mPassThroughIL(nullptr),
- mPassThroughVS(nullptr),
- mPassThroughPS(nullptr),
- mPassThroughRS(nullptr),
+ mQuadVB(),
+ mPassThroughSampler(),
+ mPassThroughIL(),
+ mPassThroughVS(),
+ mPassThroughPS(),
+ mPassThroughRS(),
mColorRenderTarget(this, renderer, false),
mDepthStencilRenderTarget(this, renderer, true),
mEGLSamples(samples)
@@ -111,21 +111,21 @@ void SwapChain11::release()
SafeRelease(mSwapChain1);
SafeRelease(mSwapChain);
SafeRelease(mKeyedMutex);
- SafeRelease(mBackBufferTexture);
+ mBackBufferTexture.reset();
mBackBufferRTView.reset();
mBackBufferSRView.reset();
- SafeRelease(mOffscreenTexture);
+ mOffscreenTexture.reset();
mOffscreenRTView.reset();
mOffscreenSRView.reset();
- SafeRelease(mDepthStencilTexture);
+ mDepthStencilTexture.reset();
mDepthStencilDSView.reset();
mDepthStencilSRView.reset();
- SafeRelease(mQuadVB);
- SafeRelease(mPassThroughSampler);
- SafeRelease(mPassThroughIL);
- SafeRelease(mPassThroughVS);
- SafeRelease(mPassThroughPS);
- SafeRelease(mPassThroughRS);
+ mQuadVB.reset();
+ mPassThroughSampler.reset();
+ mPassThroughIL.reset();
+ mPassThroughVS.reset();
+ mPassThroughPS.reset();
+ mPassThroughRS.reset();
if (!mAppCreatedShareHandle)
{
@@ -135,23 +135,25 @@ void SwapChain11::release()
void SwapChain11::releaseOffscreenColorBuffer()
{
- SafeRelease(mOffscreenTexture);
+ mOffscreenTexture.reset();
mOffscreenRTView.reset();
mOffscreenSRView.reset();
}
void SwapChain11::releaseOffscreenDepthBuffer()
{
- SafeRelease(mDepthStencilTexture);
+ mDepthStencilTexture.reset();
mDepthStencilDSView.reset();
mDepthStencilSRView.reset();
}
-EGLint SwapChain11::resetOffscreenBuffers(int backbufferWidth, int backbufferHeight)
+EGLint SwapChain11::resetOffscreenBuffers(const gl::Context *context,
+ int backbufferWidth,
+ int backbufferHeight)
{
if (mNeedsOffscreenTexture)
{
- EGLint result = resetOffscreenColorBuffer(backbufferWidth, backbufferHeight);
+ EGLint result = resetOffscreenColorBuffer(context, backbufferWidth, backbufferHeight);
if (result != EGL_SUCCESS)
{
return result;
@@ -170,7 +172,9 @@ EGLint SwapChain11::resetOffscreenBuffers(int backbufferWidth, int backbufferHei
return EGL_SUCCESS;
}
-EGLint SwapChain11::resetOffscreenColorBuffer(int backbufferWidth, int backbufferHeight)
+EGLint SwapChain11::resetOffscreenColorBuffer(const gl::Context *context,
+ int backbufferWidth,
+ int backbufferHeight)
{
ASSERT(mNeedsOffscreenTexture);
@@ -184,11 +188,7 @@ EGLint SwapChain11::resetOffscreenColorBuffer(int backbufferWidth, int backbuffe
ASSERT(backbufferHeight >= 1);
// Preserve the render target content
- ID3D11Texture2D *previousOffscreenTexture = mOffscreenTexture;
- if (previousOffscreenTexture)
- {
- previousOffscreenTexture->AddRef();
- }
+ TextureHelper11 previousOffscreenTexture(std::move(mOffscreenTexture));
const int previousWidth = mWidth;
const int previousHeight = mHeight;
@@ -209,19 +209,21 @@ EGLint SwapChain11::resetOffscreenColorBuffer(int backbufferWidth, int backbuffe
(void **)&tempResource11);
ASSERT(SUCCEEDED(result));
- mOffscreenTexture = d3d11::DynamicCastComObject<ID3D11Texture2D>(tempResource11);
+ mOffscreenTexture.set(d3d11::DynamicCastComObject<ID3D11Texture2D>(tempResource11),
+ backbufferFormatInfo);
SafeRelease(tempResource11);
}
else if (mD3DTexture != nullptr)
{
- mOffscreenTexture = d3d11::DynamicCastComObject<ID3D11Texture2D>(mD3DTexture);
+ mOffscreenTexture.set(d3d11::DynamicCastComObject<ID3D11Texture2D>(mD3DTexture),
+ backbufferFormatInfo);
}
else
{
UNREACHABLE();
}
- ASSERT(mOffscreenTexture != nullptr);
- mOffscreenTexture->GetDesc(&offscreenTextureDesc);
+ ASSERT(mOffscreenTexture.valid());
+ mOffscreenTexture.getDesc(&offscreenTextureDesc);
}
else
{
@@ -240,31 +242,23 @@ EGLint SwapChain11::resetOffscreenColorBuffer(int backbufferWidth, int backbuffe
offscreenTextureDesc.CPUAccessFlags = 0;
offscreenTextureDesc.MiscFlags = useSharedResource ? ANGLE_RESOURCE_SHARE_TYPE : 0;
- HRESULT result =
- device->CreateTexture2D(&offscreenTextureDesc, nullptr, &mOffscreenTexture);
-
- if (FAILED(result))
+ gl::Error err = mRenderer->allocateTexture(offscreenTextureDesc, backbufferFormatInfo,
+ &mOffscreenTexture);
+ if (err.isError())
{
- ERR() << "Could not create offscreen texture, " << gl::FmtHR(result);
+ ERR() << "Could not create offscreen texture, " << err;
release();
-
- if (d3d11::isDeviceLostError(result))
- {
- return EGL_CONTEXT_LOST;
- }
- else
- {
- return EGL_BAD_ALLOC;
- }
+ return EGL_BAD_ALLOC;
}
- d3d11::SetDebugName(mOffscreenTexture, "Offscreen back buffer texture");
+ 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;
- result = mOffscreenTexture->QueryInterface(__uuidof(IDXGIResource), (void**)&offscreenTextureResource);
+ HRESULT result = mOffscreenTexture.get()->QueryInterface(
+ __uuidof(IDXGIResource), (void **)&offscreenTextureResource);
// Fall back to no share handle on failure
if (FAILED(result))
@@ -286,7 +280,7 @@ EGLint SwapChain11::resetOffscreenColorBuffer(int backbufferWidth, int backbuffe
}
// This may return null if the original texture was created without a keyed mutex.
- mKeyedMutex = d3d11::DynamicCastComObject<IDXGIKeyedMutex>(mOffscreenTexture);
+ mKeyedMutex = d3d11::DynamicCastComObject<IDXGIKeyedMutex>(mOffscreenTexture.get());
D3D11_RENDER_TARGET_VIEW_DESC offscreenRTVDesc;
offscreenRTVDesc.Format = backbufferFormatInfo.rtvFormat;
@@ -295,7 +289,7 @@ EGLint SwapChain11::resetOffscreenColorBuffer(int backbufferWidth, int backbuffe
offscreenRTVDesc.Texture2D.MipSlice = 0;
gl::Error err =
- mRenderer->allocateResource(offscreenRTVDesc, mOffscreenTexture, &mOffscreenRTView);
+ mRenderer->allocateResource(offscreenRTVDesc, mOffscreenTexture.get(), &mOffscreenRTView);
ASSERT(!err.isError());
mOffscreenRTView.setDebugName("Offscreen back buffer render target");
@@ -308,12 +302,13 @@ EGLint SwapChain11::resetOffscreenColorBuffer(int backbufferWidth, int backbuffe
if (offscreenTextureDesc.BindFlags & D3D11_BIND_SHADER_RESOURCE)
{
- err = mRenderer->allocateResource(offscreenSRVDesc, mOffscreenTexture, &mOffscreenSRView);
+ err = mRenderer->allocateResource(offscreenSRVDesc, mOffscreenTexture.get(),
+ &mOffscreenSRView);
ASSERT(!err.isError());
mOffscreenSRView.setDebugName("Offscreen back buffer shader resource");
}
- if (previousOffscreenTexture != nullptr)
+ if (previousOffscreenTexture.valid())
{
D3D11_BOX sourceBox = {0};
sourceBox.left = 0;
@@ -325,14 +320,12 @@ EGLint SwapChain11::resetOffscreenColorBuffer(int backbufferWidth, int backbuffe
ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
const int yoffset = std::max(backbufferHeight - previousHeight, 0);
- deviceContext->CopySubresourceRegion(mOffscreenTexture, 0, 0, yoffset, 0,
- previousOffscreenTexture, 0, &sourceBox);
-
- SafeRelease(previousOffscreenTexture);
+ deviceContext->CopySubresourceRegion(mOffscreenTexture.get(), 0, 0, yoffset, 0,
+ previousOffscreenTexture.get(), 0, &sourceBox);
if (mSwapChain)
{
- swapRect(0, 0, backbufferWidth, backbufferHeight);
+ swapRect(context, 0, 0, backbufferWidth, backbufferHeight);
}
}
@@ -355,10 +348,22 @@ EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbuffe
depthStencilTextureDesc.MipLevels = 1;
depthStencilTextureDesc.ArraySize = 1;
depthStencilTextureDesc.SampleDesc.Count = getD3DSamples();
- depthStencilTextureDesc.SampleDesc.Quality = 0;
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;
+ }
+
if (depthBufferFormatInfo.srvFormat != DXGI_FORMAT_UNKNOWN)
{
depthStencilTextureDesc.BindFlags |= D3D11_BIND_SHADER_RESOURCE;
@@ -367,25 +372,15 @@ EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbuffe
depthStencilTextureDesc.CPUAccessFlags = 0;
depthStencilTextureDesc.MiscFlags = 0;
- ID3D11Device *device = mRenderer->getDevice();
- HRESULT result =
- device->CreateTexture2D(&depthStencilTextureDesc, nullptr, &mDepthStencilTexture);
- if (FAILED(result))
+ gl::Error err = mRenderer->allocateTexture(depthStencilTextureDesc, depthBufferFormatInfo,
+ &mDepthStencilTexture);
+ if (err.isError())
{
- ERR() << "Could not create depthstencil surface for new swap chain, "
- << gl::FmtHR(result);
+ ERR() << "Could not create depthstencil surface for new swap chain, " << err;
release();
-
- if (d3d11::isDeviceLostError(result))
- {
- return EGL_CONTEXT_LOST;
- }
- else
- {
- return EGL_BAD_ALLOC;
- }
+ return EGL_BAD_ALLOC;
}
- d3d11::SetDebugName(mDepthStencilTexture, "Offscreen depth stencil texture");
+ mDepthStencilTexture.setDebugName("Offscreen depth stencil texture");
D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilDesc;
depthStencilDesc.Format = depthBufferFormatInfo.dsvFormat;
@@ -394,8 +389,8 @@ EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbuffe
depthStencilDesc.Flags = 0;
depthStencilDesc.Texture2D.MipSlice = 0;
- gl::Error err = mRenderer->allocateResource(depthStencilDesc, mDepthStencilTexture,
- &mDepthStencilDSView);
+ err = mRenderer->allocateResource(depthStencilDesc, mDepthStencilTexture.get(),
+ &mDepthStencilDSView);
ASSERT(!err.isError());
mDepthStencilDSView.setDebugName("Offscreen depth stencil view");
@@ -409,7 +404,7 @@ EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbuffe
depthStencilSRVDesc.Texture2D.MostDetailedMip = 0;
depthStencilSRVDesc.Texture2D.MipLevels = static_cast<UINT>(-1);
- err = mRenderer->allocateResource(depthStencilSRVDesc, mDepthStencilTexture,
+ err = mRenderer->allocateResource(depthStencilSRVDesc, mDepthStencilTexture.get(),
&mDepthStencilSRView);
ASSERT(!err.isError());
mDepthStencilSRView.setDebugName("Offscreen depth stencil shader resource");
@@ -419,7 +414,9 @@ EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbuffe
return EGL_SUCCESS;
}
-EGLint SwapChain11::resize(EGLint backbufferWidth, EGLint backbufferHeight)
+EGLint SwapChain11::resize(const gl::Context *context,
+ EGLint backbufferWidth,
+ EGLint backbufferHeight)
{
TRACE_EVENT0("gpu.angle", "SwapChain11::resize");
ID3D11Device *device = mRenderer->getDevice();
@@ -442,10 +439,10 @@ EGLint SwapChain11::resize(EGLint backbufferWidth, EGLint backbufferHeight)
}
// Can only call resize if we have already created our swap buffer and resources
- ASSERT(mSwapChain && mBackBufferTexture && mBackBufferRTView.valid() &&
+ ASSERT(mSwapChain && mBackBufferTexture.valid() && mBackBufferRTView.valid() &&
mBackBufferSRView.valid());
- SafeRelease(mBackBufferTexture);
+ mBackBufferTexture.reset();
mBackBufferRTView.reset();
mBackBufferSRView.reset();
@@ -476,24 +473,30 @@ EGLint SwapChain11::resize(EGLint backbufferWidth, EGLint backbufferHeight)
}
}
- result = mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&mBackBufferTexture);
+ ID3D11Texture2D *backbufferTexture = nullptr;
+ result = mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D),
+ reinterpret_cast<void **>(&backbufferTexture));
ASSERT(SUCCEEDED(result));
if (SUCCEEDED(result))
{
- d3d11::SetDebugName(mBackBufferTexture, "Back buffer texture");
+ const auto &format =
+ d3d11::Format::Get(mOffscreenRenderTargetFormat, mRenderer->getRenderer11DeviceCaps());
+ mBackBufferTexture.set(backbufferTexture, format);
+ mBackBufferTexture.setDebugName("Back buffer texture");
- gl::Error err = mRenderer->allocateResourceNoDesc(mBackBufferTexture, &mBackBufferRTView);
+ gl::Error err =
+ mRenderer->allocateResourceNoDesc(mBackBufferTexture.get(), &mBackBufferRTView);
ASSERT(!err.isError());
mBackBufferRTView.setDebugName("Back buffer render target");
- err = mRenderer->allocateResourceNoDesc(mBackBufferTexture, &mBackBufferSRView);
+ err = mRenderer->allocateResourceNoDesc(mBackBufferTexture.get(), &mBackBufferSRView);
ASSERT(!err.isError());
mBackBufferSRView.setDebugName("Back buffer shader resource");
}
mFirstSwap = true;
- return resetOffscreenBuffers(backbufferWidth, backbufferHeight);
+ return resetOffscreenBuffers(context, backbufferWidth, backbufferHeight);
}
DXGI_FORMAT SwapChain11::getSwapChainNativeFormat() const
@@ -524,7 +527,10 @@ DXGI_FORMAT SwapChain11::getSwapChainNativeFormat() const
}
}
-EGLint SwapChain11::reset(EGLint backbufferWidth, EGLint backbufferHeight, EGLint swapInterval)
+EGLint SwapChain11::reset(const gl::Context *context,
+ EGLint backbufferWidth,
+ EGLint backbufferHeight,
+ EGLint swapInterval)
{
mSwapInterval = static_cast<unsigned int>(swapInterval);
if (mSwapInterval > 4)
@@ -537,7 +543,7 @@ EGLint SwapChain11::reset(EGLint backbufferWidth, EGLint backbufferHeight, EGLin
// If the swap chain already exists, just resize
if (mSwapChain != nullptr)
{
- return resize(backbufferWidth, backbufferHeight);
+ return resize(context, backbufferWidth, backbufferHeight);
}
TRACE_EVENT0("gpu.angle", "SwapChain11::reset");
@@ -552,7 +558,7 @@ EGLint SwapChain11::reset(EGLint backbufferWidth, EGLint backbufferHeight, EGLin
// old render target still exists for the purpose of preserving its contents.
SafeRelease(mSwapChain1);
SafeRelease(mSwapChain);
- SafeRelease(mBackBufferTexture);
+ mBackBufferTexture.reset();
mBackBufferRTView.reset();
// EGL allows creating a surface with 0x0 dimension, however, DXGI does not like 0x0 swapchains
@@ -589,22 +595,28 @@ EGLint SwapChain11::reset(EGLint backbufferWidth, EGLint backbufferHeight, EGLin
mSwapChain1 = d3d11::DynamicCastComObject<IDXGISwapChain1>(mSwapChain);
}
- result = mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&mBackBufferTexture);
+ ID3D11Texture2D *backbufferTex = nullptr;
+ result = mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D),
+ reinterpret_cast<LPVOID *>(&backbufferTex));
ASSERT(SUCCEEDED(result));
- d3d11::SetDebugName(mBackBufferTexture, "Back buffer texture");
+ const auto &format =
+ d3d11::Format::Get(mOffscreenRenderTargetFormat, mRenderer->getRenderer11DeviceCaps());
+ mBackBufferTexture.set(backbufferTex, format);
+ mBackBufferTexture.setDebugName("Back buffer texture");
- gl::Error err = mRenderer->allocateResourceNoDesc(mBackBufferTexture, &mBackBufferRTView);
+ gl::Error err =
+ mRenderer->allocateResourceNoDesc(mBackBufferTexture.get(), &mBackBufferRTView);
ASSERT(!err.isError());
mBackBufferRTView.setDebugName("Back buffer render target");
- err = mRenderer->allocateResourceNoDesc(mBackBufferTexture, &mBackBufferSRView);
+ err = mRenderer->allocateResourceNoDesc(mBackBufferTexture.get(), &mBackBufferSRView);
ASSERT(!err.isError());
mBackBufferSRView.setDebugName("Back buffer shader resource view");
}
mFirstSwap = true;
- return resetOffscreenBuffers(backbufferWidth, backbufferHeight);
+ return resetOffscreenBuffers(context, backbufferWidth, backbufferHeight);
}
void SwapChain11::initPassThroughResources()
@@ -620,8 +632,8 @@ void SwapChain11::initPassThroughResources()
ASSERT(device != nullptr);
// Make sure our resources are all not allocated, when we create
- ASSERT(mQuadVB == nullptr && mPassThroughSampler == nullptr);
- ASSERT(mPassThroughIL == nullptr && mPassThroughVS == nullptr && mPassThroughPS == nullptr);
+ ASSERT(!mQuadVB.valid() && !mPassThroughSampler.valid());
+ ASSERT(!mPassThroughIL.valid() && !mPassThroughVS.valid() && !mPassThroughPS.valid());
D3D11_BUFFER_DESC vbDesc;
vbDesc.ByteWidth = sizeof(d3d11::PositionTexCoordVertex) * 4;
@@ -631,9 +643,9 @@ void SwapChain11::initPassThroughResources()
vbDesc.MiscFlags = 0;
vbDesc.StructureByteStride = 0;
- HRESULT result = device->CreateBuffer(&vbDesc, nullptr, &mQuadVB);
- ASSERT(SUCCEEDED(result));
- d3d11::SetDebugName(mQuadVB, "Swap chain quad vertex buffer");
+ 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;
@@ -650,9 +662,9 @@ void SwapChain11::initPassThroughResources()
samplerDesc.MinLOD = 0;
samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;
- result = device->CreateSamplerState(&samplerDesc, &mPassThroughSampler);
- ASSERT(SUCCEEDED(result));
- d3d11::SetDebugName(mPassThroughSampler, "Swap chain pass through sampler");
+ err = mRenderer->allocateResource(samplerDesc, &mPassThroughSampler);
+ ASSERT(!err.isError());
+ mPassThroughSampler.setDebugName("Swap chain pass through sampler");
D3D11_INPUT_ELEMENT_DESC quadLayout[] =
{
@@ -660,28 +672,30 @@ void SwapChain11::initPassThroughResources()
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 8, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
- result = device->CreateInputLayout(quadLayout, 2, g_VS_Passthrough2D, sizeof(g_VS_Passthrough2D), &mPassThroughIL);
- ASSERT(SUCCEEDED(result));
- d3d11::SetDebugName(mPassThroughIL, "Swap chain pass through layout");
+ InputElementArray quadElements(quadLayout);
+ ShaderData vertexShaderData(g_VS_Passthrough2D);
- result = device->CreateVertexShader(g_VS_Passthrough2D, sizeof(g_VS_Passthrough2D), nullptr,
- &mPassThroughVS);
- ASSERT(SUCCEEDED(result));
- d3d11::SetDebugName(mPassThroughVS, "Swap chain pass through vertex shader");
+ 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)
{
- result = device->CreatePixelShader(g_PS_PassthroughRGBA2D, sizeof(g_PS_PassthroughRGBA2D),
- nullptr, &mPassThroughPS);
+ ShaderData pixelShaderData(g_PS_PassthroughRGBA2D);
+ err = mRenderer->allocateResource(pixelShaderData, &mPassThroughPS);
}
else
{
- result = device->CreatePixelShader(
- g_PS_PassthroughRGBA2DMS, sizeof(g_PS_PassthroughRGBA2DMS), nullptr, &mPassThroughPS);
+ ShaderData pixelShaderData(g_PS_PassthroughRGBA2DMS);
+ err = mRenderer->allocateResource(pixelShaderData, &mPassThroughPS);
}
- ASSERT(SUCCEEDED(result));
- d3d11::SetDebugName(mPassThroughPS, "Swap chain pass through pixel shader");
+ ASSERT(!err.isError());
+ mPassThroughPS.setDebugName("Swap chain pass through pixel shader");
// Use the default rasterizer state but without culling
D3D11_RASTERIZER_DESC rasterizerDesc;
@@ -695,26 +709,31 @@ void SwapChain11::initPassThroughResources()
rasterizerDesc.ScissorEnable = FALSE;
rasterizerDesc.MultisampleEnable = FALSE;
rasterizerDesc.AntialiasedLineEnable = FALSE;
- result = device->CreateRasterizerState(&rasterizerDesc, &mPassThroughRS);
- ASSERT(SUCCEEDED(result));
- d3d11::SetDebugName(mPassThroughRS, "Swap chain pass through rasterizer state");
+
+ 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(EGLint x, EGLint y, EGLint width, EGLint height)
+EGLint SwapChain11::swapRect(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height)
{
if (mNeedsOffscreenTexture)
{
- EGLint result = copyOffscreenToBackbuffer(x, y, width, height);
+ EGLint result = copyOffscreenToBackbuffer(context, x, y, width, height);
if (result != EGL_SUCCESS)
{
return result;
}
}
- EGLint result = present(x, y, width, height);
+ EGLint result = present(context, x, y, width, height);
if (result != EGL_SUCCESS)
{
return result;
@@ -725,7 +744,11 @@ EGLint SwapChain11::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
return EGL_SUCCESS;
}
-EGLint SwapChain11::copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width, EGLint height)
+EGLint SwapChain11::copyOffscreenToBackbuffer(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height)
{
if (!mSwapChain)
{
@@ -738,7 +761,8 @@ EGLint SwapChain11::copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width,
// Set vertices
D3D11_MAPPED_SUBRESOURCE mappedResource;
- HRESULT result = deviceContext->Map(mQuadVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
+ HRESULT result =
+ deviceContext->Map(mQuadVB.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if (FAILED(result))
{
return EGL_BAD_ACCESS;
@@ -772,11 +796,12 @@ EGLint SwapChain11::copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width,
d3d11::SetPositionTexCoordVertex(&vertices[2], x2, y1, u2, v1);
d3d11::SetPositionTexCoordVertex(&vertices[3], x2, y2, u2, v2);
- deviceContext->Unmap(mQuadVB, 0);
+ deviceContext->Unmap(mQuadVB.get(), 0);
+
+ auto stateManager = mRenderer->getStateManager();
- static UINT stride = sizeof(d3d11::PositionTexCoordVertex);
- static UINT startIdx = 0;
- deviceContext->IASetVertexBuffers(0, 1, &mQuadVB, &stride, &startIdx);
+ constexpr UINT stride = sizeof(d3d11::PositionTexCoordVertex);
+ stateManager->setSingleVertexBuffer(&mQuadVB, stride, 0);
// Apply state
deviceContext->OMSetDepthStencilState(nullptr, 0xFFFFFFFF);
@@ -784,19 +809,15 @@ EGLint SwapChain11::copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width,
static const float blendFactor[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
deviceContext->OMSetBlendState(nullptr, blendFactor, 0xFFFFFFF);
- deviceContext->RSSetState(mPassThroughRS);
+ deviceContext->RSSetState(mPassThroughRS.get());
// Apply shaders
- deviceContext->IASetInputLayout(mPassThroughIL);
- deviceContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
- deviceContext->VSSetShader(mPassThroughVS, nullptr, 0);
- deviceContext->PSSetShader(mPassThroughPS, nullptr, 0);
- deviceContext->GSSetShader(nullptr, nullptr, 0);
+ stateManager->setInputLayout(&mPassThroughIL);
+ stateManager->setPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
+ stateManager->setDrawShaders(&mPassThroughVS, nullptr, &mPassThroughPS);
- auto stateManager = mRenderer->getStateManager();
-
- // Apply render targets
- stateManager->setOneTimeRenderTarget(mBackBufferRTView.get(), nullptr);
+ // Apply render targets. Use the proxy context in display.
+ stateManager->setOneTimeRenderTarget(context, mBackBufferRTView.get(), nullptr);
// Set the viewport
D3D11_VIEWPORT viewport;
@@ -810,7 +831,9 @@ EGLint SwapChain11::copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width,
// Apply textures
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, mOffscreenSRView.get());
- deviceContext->PSSetSamplers(0, 1, &mPassThroughSampler);
+
+ ID3D11SamplerState *samplerState = mPassThroughSampler.get();
+ deviceContext->PSSetSamplers(0, 1, &samplerState);
// Draw
deviceContext->Draw(4, 0);
@@ -820,12 +843,16 @@ EGLint SwapChain11::copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width,
// cleanup is caught under the current eglSwapBuffers() PIX/Graphics Diagnostics call rather than the next one.
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
- mRenderer->markAllStateDirty();
+ mRenderer->markAllStateDirty(context);
return EGL_SUCCESS;
}
-EGLint SwapChain11::present(EGLint x, EGLint y, EGLint width, EGLint height)
+EGLint SwapChain11::present(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height)
{
if (!mSwapChain)
{
@@ -865,8 +892,8 @@ EGLint SwapChain11::present(EGLint x, EGLint y, EGLint width, EGLint height)
mFirstSwap = false;
// Some swapping mechanisms such as DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL unbind the current render
- // target. Mark it dirty.
- mRenderer->getStateManager()->invalidateRenderTarget();
+ // target. Mark it dirty. Use the proxy context in display since there is none available.
+ mRenderer->getStateManager()->invalidateRenderTarget(context);
if (result == DXGI_ERROR_DEVICE_REMOVED)
{
@@ -889,7 +916,7 @@ EGLint SwapChain11::present(EGLint x, EGLint y, EGLint width, EGLint height)
return EGL_SUCCESS;
}
-ID3D11Texture2D *SwapChain11::getOffscreenTexture()
+const TextureHelper11 &SwapChain11::getOffscreenTexture()
{
return mNeedsOffscreenTexture ? mOffscreenTexture : mBackBufferTexture;
}
@@ -914,7 +941,7 @@ const d3d11::SharedSRV &SwapChain11::getDepthStencilShaderResource()
return mDepthStencilSRView;
}
-ID3D11Texture2D *SwapChain11::getDepthStencilTexture()
+const TextureHelper11 &SwapChain11::getDepthStencilTexture()
{
return mDepthStencilTexture;
}
@@ -928,7 +955,7 @@ egl::Error SwapChain11::getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLu
{
if (!mSwapChain)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Swap chain uninitialized");
+ return egl::EglNotInitialized() << "Swap chain uninitialized";
}
DXGI_FRAME_STATISTICS stats = {};
@@ -936,7 +963,7 @@ egl::Error SwapChain11::getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLu
if (FAILED(result))
{
- return egl::Error(EGL_BAD_ALLOC, "Failed to get frame statistics, result: 0x%X", result);
+ return egl::EglBadAlloc() << "Failed to get frame statistics, " << gl::FmtHR(result);
}
// Conversion from DXGI_FRAME_STATISTICS to the output values:
@@ -963,7 +990,7 @@ egl::Error SwapChain11::getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLu
leftoverTicks * kMicrosecondsPerSecond / mQPCFrequency;
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
UINT SwapChain11::getD3DSamples() const
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h
index 8edc56a2be7..d64d821f060 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h
@@ -31,19 +31,28 @@ class SwapChain11 final : public SwapChainD3D
EGLint samples);
virtual ~SwapChain11();
- EGLint resize(EGLint backbufferWidth, EGLint backbufferHeight);
- EGLint reset(EGLint backbufferWidth, EGLint backbufferHeight, EGLint swapInterval) override;
- EGLint swapRect(EGLint x, EGLint y, EGLint width, EGLint height) 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 { return &mColorRenderTarget; }
RenderTargetD3D *getDepthStencilRenderTarget() override { return &mDepthStencilRenderTarget; }
- ID3D11Texture2D *getOffscreenTexture();
+ const TextureHelper11 &getOffscreenTexture();
const d3d11::RenderTargetView &getRenderTarget();
const d3d11::SharedSRV &getRenderTargetShaderResource();
- ID3D11Texture2D *getDepthStencilTexture();
+ const TextureHelper11 &getDepthStencilTexture();
const d3d11::DepthStencilView &getDepthStencil();
const d3d11::SharedSRV &getDepthStencilShaderResource();
@@ -60,14 +69,22 @@ class SwapChain11 final : public SwapChainD3D
void releaseOffscreenColorBuffer();
void releaseOffscreenDepthBuffer();
- EGLint resetOffscreenBuffers(int backbufferWidth, int backbufferHeight);
- EGLint resetOffscreenColorBuffer(int backbufferWidth, int backbufferHeight);
+ 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(EGLint x, EGLint y, EGLint width, EGLint height);
- EGLint present(EGLint x, EGLint y, EGLint width, EGLint height);
+ 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;
@@ -85,25 +102,25 @@ class SwapChain11 final : public SwapChainD3D
IDXGISwapChain1 *mSwapChain1;
IDXGIKeyedMutex *mKeyedMutex;
- ID3D11Texture2D *mBackBufferTexture;
+ TextureHelper11 mBackBufferTexture;
d3d11::RenderTargetView mBackBufferRTView;
d3d11::SharedSRV mBackBufferSRView;
const bool mNeedsOffscreenTexture;
- ID3D11Texture2D *mOffscreenTexture;
+ TextureHelper11 mOffscreenTexture;
d3d11::RenderTargetView mOffscreenRTView;
d3d11::SharedSRV mOffscreenSRView;
- ID3D11Texture2D *mDepthStencilTexture;
+ TextureHelper11 mDepthStencilTexture;
d3d11::DepthStencilView mDepthStencilDSView;
d3d11::SharedSRV mDepthStencilSRView;
- ID3D11Buffer *mQuadVB;
- ID3D11SamplerState *mPassThroughSampler;
- ID3D11InputLayout *mPassThroughIL;
- ID3D11VertexShader *mPassThroughVS;
- ID3D11PixelShader *mPassThroughPS;
- ID3D11RasterizerState *mPassThroughRS;
+ d3d11::Buffer mQuadVB;
+ d3d11::SamplerState mPassThroughSampler;
+ d3d11::InputLayout mPassThroughIL;
+ d3d11::VertexShader mPassThroughVS;
+ d3d11::PixelShader mPassThroughPS;
+ d3d11::RasterizerState mPassThroughRS;
SurfaceRenderTarget11 mColorRenderTarget;
SurfaceRenderTarget11 mDepthStencilRenderTarget;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp
index d4b6e351675..4e6ddfffa0c 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp
@@ -53,7 +53,7 @@ TextureStorage11::TextureStorage11(Renderer11 *renderer,
mTextureWidth(0),
mTextureHeight(0),
mTextureDepth(0),
- mDropStencilTexture(nullptr),
+ mDropStencilTexture(),
mBindFlags(bindFlags),
mMiscFlags(miscFlags)
{
@@ -62,7 +62,6 @@ TextureStorage11::TextureStorage11(Renderer11 *renderer,
TextureStorage11::~TextureStorage11()
{
mSrvCache.clear();
- SafeRelease(mDropStencilTexture);
}
DWORD TextureStorage11::GetTextureBindFlags(GLenum internalFormat,
@@ -168,7 +167,9 @@ UINT TextureStorage11::getSubresourceIndex(const gl::ImageIndex &index) const
return subresource;
}
-gl::Error TextureStorage11::getSRV(const gl::TextureState &textureState, d3d11::SharedSRV *outSRV)
+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();
@@ -214,7 +215,7 @@ gl::Error TextureStorage11::getSRV(const gl::TextureState &textureState, d3d11::
{
// Ensure drop texture gets created.
DropStencil result = DropStencil::CREATED;
- ANGLE_TRY_RESULT(ensureDropStencilTexture(), result);
+ ANGLE_TRY_RESULT(ensureDropStencilTexture(context), result);
// Clear the SRV cache if necessary.
// TODO(jmadill): Re-use find query result.
@@ -225,21 +226,23 @@ gl::Error TextureStorage11::getSRV(const gl::TextureState &textureState, d3d11::
}
}
- ANGLE_TRY(getCachedOrCreateSRV(key, outSRV));
+ ANGLE_TRY(getCachedOrCreateSRV(context, key, outSRV));
return gl::NoError();
}
-gl::Error TextureStorage11::getCachedOrCreateSRV(const SRVKey &key, d3d11::SharedSRV *outSRV)
+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;
+ *outSRV = &iter->second;
return gl::NoError();
}
- ID3D11Resource *texture = nullptr;
+ const TextureHelper11 *texture = nullptr;
DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN;
if (key.swizzle)
@@ -252,27 +255,30 @@ gl::Error TextureStorage11::getCachedOrCreateSRV(const SRVKey &key, d3d11::Share
}
else if (key.dropStencil)
{
- ASSERT(mDropStencilTexture);
- texture = mDropStencilTexture;
+ ASSERT(mDropStencilTexture.valid());
+ texture = &mDropStencilTexture;
format = DXGI_FORMAT_R32_FLOAT;
}
else
{
- ANGLE_TRY(getResource(&texture));
+ ANGLE_TRY(getResource(context, &texture));
format = mFormatInfo.srvFormat;
}
d3d11::SharedSRV srv;
- ANGLE_TRY(createSRV(key.baseLevel, key.mipLevels, format, texture, &srv));
+ ANGLE_TRY(createSRV(context, key.baseLevel, key.mipLevels, format, *texture, &srv));
- mSrvCache.insert(std::make_pair(key, srv));
- *outSRV = srv;
+ const auto &insertIt = mSrvCache.insert(std::make_pair(key, std::move(srv)));
+ *outSRV = &insertIt.first->second;
return gl::NoError();
}
-gl::Error TextureStorage11::getSRVLevel(int mipLevel, bool blitSRV, const d3d11::SharedSRV **outSRV)
+gl::Error TextureStorage11::getSRVLevel(const gl::Context *context,
+ int mipLevel,
+ bool blitSRV,
+ const d3d11::SharedSRV **outSRV)
{
ASSERT(mipLevel >= 0 && mipLevel < getLevelCount());
@@ -284,16 +290,17 @@ gl::Error TextureStorage11::getSRVLevel(int mipLevel, bool blitSRV, const d3d11:
// 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];
+ levelSRVs[mipLevel] = otherLevelSRVs[mipLevel].makeCopy();
}
else
{
- ID3D11Resource *resource = nullptr;
- ANGLE_TRY(getResource(&resource));
+ const TextureHelper11 *resource = nullptr;
+ ANGLE_TRY(getResource(context, &resource));
DXGI_FORMAT resourceFormat =
blitSRV ? mFormatInfo.blitSRVFormat : mFormatInfo.srvFormat;
- ANGLE_TRY(createSRV(mipLevel, 1, resourceFormat, resource, &levelSRVs[mipLevel]));
+ ANGLE_TRY(
+ createSRV(context, mipLevel, 1, resourceFormat, *resource, &levelSRVs[mipLevel]));
}
}
@@ -302,7 +309,10 @@ gl::Error TextureStorage11::getSRVLevel(int mipLevel, bool blitSRV, const d3d11:
return gl::NoError();
}
-gl::Error TextureStorage11::getSRVLevels(GLint baseLevel, GLint maxLevel, d3d11::SharedSRV *outSRV)
+gl::Error TextureStorage11::getSRVLevels(const gl::Context *context,
+ GLint baseLevel,
+ GLint maxLevel,
+ const d3d11::SharedSRV **outSRV)
{
unsigned int mipLevels = maxLevel - baseLevel + 1;
@@ -324,7 +334,7 @@ gl::Error TextureStorage11::getSRVLevels(GLint baseLevel, GLint maxLevel, d3d11:
// TODO(jmadill): Assert we don't need to drop stencil.
SRVKey key(baseLevel, mipLevels, false, false);
- ANGLE_TRY(getCachedOrCreateSRV(key, outSRV));
+ ANGLE_TRY(getCachedOrCreateSRV(context, key, outSRV));
return gl::NoError();
}
@@ -334,7 +344,8 @@ const d3d11::Format &TextureStorage11::getFormatSet() const
return mFormatInfo;
}
-gl::Error TextureStorage11::generateSwizzles(const gl::SwizzleState &swizzleTarget)
+gl::Error TextureStorage11::generateSwizzles(const gl::Context *context,
+ const gl::SwizzleState &swizzleTarget)
{
for (int level = 0; level < getLevelCount(); level++)
{
@@ -343,7 +354,7 @@ gl::Error TextureStorage11::generateSwizzles(const gl::SwizzleState &swizzleTarg
{
// Need to re-render the swizzle for this level
const d3d11::SharedSRV *sourceSRV = nullptr;
- ANGLE_TRY(getSRVLevel(level, true, &sourceSRV));
+ ANGLE_TRY(getSRVLevel(context, level, true, &sourceSRV));
const d3d11::RenderTargetView *destRTV;
ANGLE_TRY(getSwizzleRenderTarget(level, &destRTV));
@@ -352,7 +363,7 @@ gl::Error TextureStorage11::generateSwizzles(const gl::SwizzleState &swizzleTarg
Blit11 *blitter = mRenderer->getBlitter();
- ANGLE_TRY(blitter->swizzleTexture(*sourceSRV, *destRTV, size, swizzleTarget));
+ ANGLE_TRY(blitter->swizzleTexture(context, *sourceSRV, *destRTV, size, swizzleTarget));
mSwizzleCache[level] = swizzleTarget;
}
@@ -370,7 +381,7 @@ void TextureStorage11::markLevelDirty(int mipLevel)
mSwizzleCache[mipLevel] = gl::SwizzleState();
}
- SafeRelease(mDropStencilTexture);
+ mDropStencilTexture.reset();
}
void TextureStorage11::markDirty()
@@ -381,12 +392,13 @@ void TextureStorage11::markDirty()
}
}
-gl::Error TextureStorage11::updateSubresourceLevel(ID3D11Resource *srcTexture,
+gl::Error TextureStorage11::updateSubresourceLevel(const gl::Context *context,
+ const TextureHelper11 &srcTexture,
unsigned int sourceSubresource,
const gl::ImageIndex &index,
const gl::Box &copyArea)
{
- ASSERT(srcTexture);
+ ASSERT(srcTexture.valid());
const GLint level = index.mipIndex;
@@ -398,22 +410,22 @@ gl::Error TextureStorage11::updateSubresourceLevel(ID3D11Resource *srcTexture,
copyArea.width == texSize.width && copyArea.height == texSize.height &&
copyArea.depth == texSize.depth;
- ID3D11Resource *dstTexture = nullptr;
+ 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(&dstTexture));
+ ANGLE_TRY(getMippedResource(context, &dstTexture));
}
else
{
- ANGLE_TRY(getResource(&dstTexture));
+ ANGLE_TRY(getResource(context, &dstTexture));
}
unsigned int dstSubresource = getSubresourceIndex(index);
- ASSERT(dstTexture);
+ ASSERT(dstTexture->valid());
const d3d11::DXGIFormatSize &dxgiFormatSizeInfo =
d3d11::GetDXGIFormatSizeInfo(mFormatInfo.texFormat);
@@ -421,10 +433,8 @@ gl::Error TextureStorage11::updateSubresourceLevel(ID3D11Resource *srcTexture,
{
// CopySubresourceRegion cannot copy partial depth stencils, use the blitter instead
Blit11 *blitter = mRenderer->getBlitter();
- TextureHelper11 source = TextureHelper11::MakeAndReference(srcTexture, getFormatSet());
- TextureHelper11 dest = TextureHelper11::MakeAndReference(dstTexture, getFormatSet());
- return blitter->copyDepthStencil(source, sourceSubresource, copyArea, texSize, dest,
- dstSubresource, copyArea, texSize, nullptr);
+ return blitter->copyDepthStencil(srcTexture, sourceSubresource, copyArea, texSize,
+ *dstTexture, dstSubresource, copyArea, texSize, nullptr);
}
D3D11_BOX srcBox;
@@ -437,38 +447,40 @@ gl::Error TextureStorage11::updateSubresourceLevel(ID3D11Resource *srcTexture,
srcBox.front = copyArea.z;
srcBox.back = copyArea.z + copyArea.depth;
- ID3D11DeviceContext *context = mRenderer->getDeviceContext();
+ ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
- context->CopySubresourceRegion(dstTexture, dstSubresource, copyArea.x, copyArea.y, copyArea.z,
- srcTexture, sourceSubresource, fullCopy ? nullptr : &srcBox);
+ deviceContext->CopySubresourceRegion(dstTexture->get(), dstSubresource, copyArea.x, copyArea.y,
+ copyArea.z, srcTexture.get(), sourceSubresource,
+ fullCopy ? nullptr : &srcBox);
return gl::NoError();
}
-gl::Error TextureStorage11::copySubresourceLevel(ID3D11Resource *dstTexture,
+gl::Error TextureStorage11::copySubresourceLevel(const gl::Context *context,
+ const TextureHelper11 &dstTexture,
unsigned int dstSubresource,
const gl::ImageIndex &index,
const gl::Box &region)
{
- ASSERT(dstTexture);
+ ASSERT(dstTexture.valid());
- ID3D11Resource *srcTexture = nullptr;
+ 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(&srcTexture));
+ ANGLE_TRY(getMippedResource(context, &srcTexture));
}
else
{
- ANGLE_TRY(getResource(&srcTexture));
+ ANGLE_TRY(getResource(context, &srcTexture));
}
- ASSERT(srcTexture);
+ ASSERT(srcTexture->valid());
unsigned int srcSubresource = getSubresourceIndex(index);
- ID3D11DeviceContext *context = mRenderer->getDeviceContext();
+ ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
// D3D11 can't perform partial CopySubresourceRegion on depth/stencil textures, so pSrcBox
// should be nullptr.
@@ -476,26 +488,35 @@ gl::Error TextureStorage11::copySubresourceLevel(ID3D11Resource *dstTexture,
D3D11_BOX *pSrcBox = nullptr;
if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3)
{
- // 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;
+ 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;
+ }
}
- context->CopySubresourceRegion(dstTexture, dstSubresource, region.x, region.y, region.z,
- srcTexture, srcSubresource, pSrcBox);
+ deviceContext->CopySubresourceRegion(dstTexture.get(), dstSubresource, region.x, region.y,
+ region.z, srcTexture->get(), srcSubresource, pSrcBox);
return gl::NoError();
}
-gl::Error TextureStorage11::generateMipmap(const gl::ImageIndex &sourceIndex,
+gl::Error TextureStorage11::generateMipmap(const gl::Context *context,
+ const gl::ImageIndex &sourceIndex,
const gl::ImageIndex &destIndex)
{
ASSERT(sourceIndex.layerIndex == destIndex.layerIndex);
@@ -503,10 +524,10 @@ gl::Error TextureStorage11::generateMipmap(const gl::ImageIndex &sourceIndex,
markLevelDirty(destIndex.mipIndex);
RenderTargetD3D *source = nullptr;
- ANGLE_TRY(getRenderTarget(sourceIndex, &source));
+ ANGLE_TRY(getRenderTarget(context, sourceIndex, &source));
RenderTargetD3D *dest = nullptr;
- ANGLE_TRY(getRenderTarget(destIndex, &dest));
+ ANGLE_TRY(getRenderTarget(context, destIndex, &dest));
auto rt11 = GetAs<RenderTarget11>(source);
const d3d11::SharedSRV &sourceSRV = rt11->getBlitShaderResourceView();
@@ -520,8 +541,9 @@ gl::Error TextureStorage11::generateMipmap(const gl::ImageIndex &sourceIndex,
Blit11 *blitter = mRenderer->getBlitter();
GLenum format = gl::GetUnsizedFormat(source->getInternalFormat());
- return blitter->copyTexture(sourceSRV, sourceArea, sourceSize, format, destRTV, destArea,
- destSize, nullptr, format, GL_LINEAR, false, false, false);
+ 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)
@@ -544,26 +566,27 @@ void TextureStorage11::clearSRVCache()
}
}
-gl::Error TextureStorage11::copyToStorage(TextureStorage *destStorage)
+gl::Error TextureStorage11::copyToStorage(const gl::Context *context, TextureStorage *destStorage)
{
ASSERT(destStorage);
- ID3D11Resource *sourceResouce = nullptr;
- ANGLE_TRY(getResource(&sourceResouce));
+ const TextureHelper11 *sourceResouce = nullptr;
+ ANGLE_TRY(getResource(context, &sourceResouce));
TextureStorage11 *dest11 = GetAs<TextureStorage11>(destStorage);
- ID3D11Resource *destResource = nullptr;
- ANGLE_TRY(dest11->getResource(&destResource));
+ const TextureHelper11 *destResource = nullptr;
+ ANGLE_TRY(dest11->getResource(context, &destResource));
ID3D11DeviceContext *immediateContext = mRenderer->getDeviceContext();
- immediateContext->CopyResource(destResource, sourceResouce);
+ immediateContext->CopyResource(destResource->get(), sourceResouce->get());
dest11->markDirty();
return gl::NoError();
}
-gl::Error TextureStorage11::setData(const gl::ImageIndex &index,
+gl::Error TextureStorage11::setData(const gl::Context *context,
+ const gl::ImageIndex &index,
ImageD3D *image,
const gl::Box *destBox,
GLenum type,
@@ -574,9 +597,9 @@ gl::Error TextureStorage11::setData(const gl::ImageIndex &index,
markLevelDirty(index.mipIndex);
- ID3D11Resource *resource = nullptr;
- ANGLE_TRY(getResource(&resource));
- ASSERT(resource);
+ const TextureHelper11 *resource = nullptr;
+ ANGLE_TRY(getResource(context, &resource));
+ ASSERT(resource && resource->valid());
UINT destSubresource = getSubresourceIndex(index);
@@ -653,19 +676,20 @@ gl::Error TextureStorage11::setData(const gl::ImageIndex &index,
destD3DBox.front = destBox->z;
destD3DBox.back = destBox->z + destBox->depth;
- immediateContext->UpdateSubresource(resource, destSubresource, &destD3DBox, data,
+ immediateContext->UpdateSubresource(resource->get(), destSubresource, &destD3DBox, data,
bufferRowPitch, bufferDepthPitch);
}
else
{
- immediateContext->UpdateSubresource(resource, destSubresource, nullptr, data,
+ immediateContext->UpdateSubresource(resource->get(), destSubresource, nullptr, data,
bufferRowPitch, bufferDepthPitch);
}
return gl::NoError();
}
-gl::ErrorOrResult<TextureStorage11::DropStencil> TextureStorage11::ensureDropStencilTexture()
+gl::ErrorOrResult<TextureStorage11::DropStencil> TextureStorage11::ensureDropStencilTexture(
+ const gl::Context *context)
{
UNIMPLEMENTED();
return gl::InternalError() << "Drop stencil texture not implemented.";
@@ -677,13 +701,11 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swap
0,
swapchain->getRenderTargetInternalFormat()),
mTexture(swapchain->getOffscreenTexture()),
- mLevelZeroTexture(nullptr),
+ mLevelZeroTexture(),
mLevelZeroRenderTarget(nullptr),
mUseLevelZeroTexture(false),
- mSwizzleTexture(nullptr)
+ mSwizzleTexture()
{
- mTexture->AddRef();
-
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{
mAssociatedImages[i] = nullptr;
@@ -691,7 +713,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swap
}
D3D11_TEXTURE2D_DESC texDesc;
- mTexture->GetDesc(&texDesc);
+ mTexture.getDesc(&texDesc);
mMipLevels = texDesc.MipLevels;
mTextureWidth = texDesc.Width;
mTextureHeight = texDesc.Height;
@@ -714,12 +736,12 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer,
renderTarget,
levels),
internalformat),
- mTexture(nullptr),
+ mTexture(),
mHasKeyedMutex(false),
- mLevelZeroTexture(nullptr),
+ mLevelZeroTexture(),
mLevelZeroRenderTarget(nullptr),
mUseLevelZeroTexture(hintLevelZeroOnly && levels > 1),
- mSwizzleTexture(nullptr)
+ mSwizzleTexture()
{
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{
@@ -737,7 +759,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer,
ASSERT(!mUseLevelZeroTexture || mRenderer->getWorkarounds().zeroMaxLodWorkaround);
}
-TextureStorage11_2D::~TextureStorage11_2D()
+gl::Error TextureStorage11_2D::onDestroy(const gl::Context *context)
{
for (unsigned i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{
@@ -747,19 +769,10 @@ TextureStorage11_2D::~TextureStorage11_2D()
// We must let the Images recover their data before we delete it from the
// TextureStorage.
- gl::Error error = mAssociatedImages[i]->recoverFromAssociatedStorage();
- if (error.isError())
- {
- // TODO: Find a way to report this back to the context
- ERR() << "Error initialization texture storage: " << error;
- }
+ ANGLE_TRY(mAssociatedImages[i]->recoverFromAssociatedStorage(context));
}
}
- SafeRelease(mTexture);
- SafeRelease(mSwizzleTexture);
-
- SafeRelease(mLevelZeroTexture);
SafeDelete(mLevelZeroRenderTarget);
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
@@ -771,11 +784,20 @@ TextureStorage11_2D::~TextureStorage11_2D()
{
// If the keyed mutex is released that will unbind it and cause the state cache to become
// desynchronized.
- mRenderer->getStateManager()->invalidateBoundViews();
+ mRenderer->getStateManager()->invalidateBoundViews(context);
}
+
+ delete this;
+
+ return gl::NoError();
+}
+
+TextureStorage11_2D::~TextureStorage11_2D()
+{
}
-gl::Error TextureStorage11_2D::copyToStorage(TextureStorage *destStorage)
+gl::Error TextureStorage11_2D::copyToStorage(const gl::Context *context,
+ TextureStorage *destStorage)
{
ASSERT(destStorage);
@@ -786,36 +808,36 @@ gl::Error TextureStorage11_2D::copyToStorage(TextureStorage *destStorage)
{
// If either mTexture or mLevelZeroTexture exist, then we need to copy them into the
// corresponding textures in destStorage.
- if (mTexture)
+ if (mTexture.valid())
{
ANGLE_TRY(dest11->useLevelZeroWorkaroundTexture(false));
- ID3D11Resource *destResource = nullptr;
- ANGLE_TRY(dest11->getResource(&destResource));
+ const TextureHelper11 *destResource = nullptr;
+ ANGLE_TRY(dest11->getResource(context, &destResource));
- immediateContext->CopyResource(destResource, mTexture);
+ immediateContext->CopyResource(destResource->get(), mTexture.get());
}
- if (mLevelZeroTexture)
+ if (mLevelZeroTexture.valid())
{
ANGLE_TRY(dest11->useLevelZeroWorkaroundTexture(true));
- ID3D11Resource *destResource = nullptr;
- ANGLE_TRY(dest11->getResource(&destResource));
+ const TextureHelper11 *destResource = nullptr;
+ ANGLE_TRY(dest11->getResource(context, &destResource));
- immediateContext->CopyResource(destResource, mLevelZeroTexture);
+ immediateContext->CopyResource(destResource->get(), mLevelZeroTexture.get());
}
return gl::NoError();
}
- ID3D11Resource *sourceResouce = nullptr;
- ANGLE_TRY(getResource(&sourceResouce));
+ const TextureHelper11 *sourceResouce = nullptr;
+ ANGLE_TRY(getResource(context, &sourceResouce));
- ID3D11Resource *destResource = nullptr;
- ANGLE_TRY(dest11->getResource(&destResource));
+ const TextureHelper11 *destResource = nullptr;
+ ANGLE_TRY(dest11->getResource(context, &destResource));
- immediateContext->CopyResource(destResource, sourceResouce);
+ immediateContext->CopyResource(destResource->get(), sourceResouce->get());
dest11->markDirty();
return gl::NoError();
@@ -827,28 +849,30 @@ gl::Error TextureStorage11_2D::useLevelZeroWorkaroundTexture(bool useLevelZeroTe
if (useLevelZeroTexture && mMipLevels > 1)
{
- if (!mUseLevelZeroTexture && mTexture)
+ if (!mUseLevelZeroTexture && mTexture.valid())
{
ANGLE_TRY(ensureTextureExists(1));
// Pull data back from the mipped texture if necessary.
- ASSERT(mLevelZeroTexture);
+ ASSERT(mLevelZeroTexture.valid());
ID3D11DeviceContext *context = mRenderer->getDeviceContext();
- context->CopySubresourceRegion(mLevelZeroTexture, 0, 0, 0, 0, mTexture, 0, nullptr);
+ context->CopySubresourceRegion(mLevelZeroTexture.get(), 0, 0, 0, 0, mTexture.get(), 0,
+ nullptr);
}
mUseLevelZeroTexture = true;
}
else
{
- if (mUseLevelZeroTexture && mLevelZeroTexture)
+ if (mUseLevelZeroTexture && mLevelZeroTexture.valid())
{
ANGLE_TRY(ensureTextureExists(mMipLevels));
// Pull data back from the level zero texture if necessary.
- ASSERT(mTexture);
+ ASSERT(mTexture.valid());
ID3D11DeviceContext *context = mRenderer->getDeviceContext();
- context->CopySubresourceRegion(mTexture, 0, 0, 0, 0, mLevelZeroTexture, 0, nullptr);
+ context->CopySubresourceRegion(mTexture.get(), 0, 0, 0, 0, mLevelZeroTexture.get(), 0,
+ nullptr);
}
mUseLevelZeroTexture = false;
@@ -908,7 +932,8 @@ void TextureStorage11_2D::disassociateImage(const gl::ImageIndex &index, Image11
// 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::ImageIndex &index,
+gl::Error TextureStorage11_2D::releaseAssociatedImage(const gl::Context *context,
+ const gl::ImageIndex &index,
Image11 *incomingImage)
{
const GLint level = index.mipIndex;
@@ -925,37 +950,39 @@ gl::Error TextureStorage11_2D::releaseAssociatedImage(const gl::ImageIndex &inde
// 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());
+ ANGLE_TRY(mAssociatedImages[level]->recoverFromAssociatedStorage(context));
}
}
return gl::NoError();
}
-gl::Error TextureStorage11_2D::getResource(ID3D11Resource **outResource)
+gl::Error TextureStorage11_2D::getResource(const gl::Context *context,
+ const TextureHelper11 **outResource)
{
if (mUseLevelZeroTexture && mMipLevels > 1)
{
ANGLE_TRY(ensureTextureExists(1));
- *outResource = mLevelZeroTexture;
+ *outResource = &mLevelZeroTexture;
return gl::NoError();
}
ANGLE_TRY(ensureTextureExists(mMipLevels));
- *outResource = mTexture;
+ *outResource = &mTexture;
return gl::NoError();
}
-gl::Error TextureStorage11_2D::getMippedResource(ID3D11Resource **outResource)
+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;
+ *outResource = &mTexture;
return gl::NoError();
}
@@ -965,16 +992,14 @@ gl::Error TextureStorage11_2D::ensureTextureExists(int mipLevels)
bool useLevelZeroTexture = mRenderer->getWorkarounds().zeroMaxLodWorkaround
? (mipLevels == 1) && (mMipLevels > 1)
: false;
- ID3D11Texture2D **outputTexture = useLevelZeroTexture ? &mLevelZeroTexture : &mTexture;
+ 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 == nullptr && mTextureWidth > 0 && mTextureHeight > 0)
+ if (!outputTexture->valid() && mTextureWidth > 0 && mTextureHeight > 0)
{
ASSERT(mipLevels > 0);
- ID3D11Device *device = mRenderer->getDevice();
-
D3D11_TEXTURE2D_DESC desc;
desc.Width = mTextureWidth; // Compressed texture size constraints?
desc.Height = mTextureHeight;
@@ -988,29 +1013,16 @@ gl::Error TextureStorage11_2D::ensureTextureExists(int mipLevels)
desc.CPUAccessFlags = 0;
desc.MiscFlags = getMiscFlags();
- HRESULT result = device->CreateTexture2D(&desc, nullptr, outputTexture);
-
- // this can happen from windows TDR
- if (d3d11::isDeviceLostError(result))
- {
- mRenderer->notifyDeviceLost();
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create 2D texture storage, result: 0x%X.",
- result);
- }
- else if (FAILED(result))
- {
- ASSERT(result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create 2D texture storage, result: 0x%X.",
- result);
- }
-
- d3d11::SetDebugName(*outputTexture, "TexStorage2D.Texture");
+ ANGLE_TRY(mRenderer->allocateTexture(desc, mFormatInfo, outputTexture));
+ outputTexture->setDebugName("TexStorage2D.Texture");
}
return gl::NoError();
}
-gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT)
+gl::Error TextureStorage11_2D::getRenderTarget(const gl::Context *context,
+ const gl::ImageIndex &index,
+ RenderTargetD3D **outRT)
{
ASSERT(!index.hasLayer());
@@ -1033,14 +1045,14 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend
return gl::NoError();
}
- ID3D11Resource *texture = nullptr;
- ANGLE_TRY(getResource(&texture));
+ const TextureHelper11 *texture = nullptr;
+ ANGLE_TRY(getResource(context, &texture));
const d3d11::SharedSRV *srv = nullptr;
- ANGLE_TRY(getSRVLevel(level, false, &srv));
+ ANGLE_TRY(getSRVLevel(context, level, false, &srv));
const d3d11::SharedSRV *blitSRV = nullptr;
- ANGLE_TRY(getSRVLevel(level, true, &blitSRV));
+ ANGLE_TRY(getSRVLevel(context, level, true, &blitSRV));
if (mUseLevelZeroTexture)
{
@@ -1052,7 +1064,7 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend
rtvDesc.Texture2D.MipSlice = mTopLevel + level;
d3d11::RenderTargetView rtv;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mLevelZeroTexture, &rtv));
+ ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mLevelZeroTexture.get(), &rtv));
mLevelZeroRenderTarget = new TextureRenderTarget11(
std::move(rtv), mLevelZeroTexture, d3d11::SharedSRV(), d3d11::SharedSRV(),
@@ -1072,10 +1084,10 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend
rtvDesc.Texture2D.MipSlice = mTopLevel + level;
d3d11::RenderTargetView rtv;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture, &rtv));
+ ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv));
mRenderTarget[level] = new TextureRenderTarget11(
- std::move(rtv), texture, *srv, *blitSRV, mFormatInfo.internalFormat, getFormatSet(),
+ std::move(rtv), *texture, *srv, *blitSRV, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(level), getLevelHeight(level), 1, 0);
*outRT = mRenderTarget[level];
@@ -1091,20 +1103,21 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend
dsvDesc.Flags = 0;
d3d11::DepthStencilView dsv;
- ANGLE_TRY(mRenderer->allocateResource(dsvDesc, texture, &dsv));
+ ANGLE_TRY(mRenderer->allocateResource(dsvDesc, texture->get(), &dsv));
mRenderTarget[level] = new TextureRenderTarget11(
- std::move(dsv), texture, *srv, mFormatInfo.internalFormat, getFormatSet(),
+ std::move(dsv), *texture, *srv, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(level), getLevelHeight(level), 1, 0);
*outRT = mRenderTarget[level];
return gl::NoError();
}
-gl::Error TextureStorage11_2D::createSRV(int baseLevel,
+gl::Error TextureStorage11_2D::createSRV(const gl::Context *context,
+ int baseLevel,
int mipLevels,
DXGI_FORMAT format,
- ID3D11Resource *texture,
+ const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) const
{
ASSERT(outSRV);
@@ -1115,7 +1128,7 @@ gl::Error TextureStorage11_2D::createSRV(int baseLevel,
srvDesc.Texture2D.MostDetailedMip = mTopLevel + baseLevel;
srvDesc.Texture2D.MipLevels = mipLevels;
- ID3D11Resource *srvTexture = texture;
+ const TextureHelper11 *srvTexture = &texture;
if (mRenderer->getWorkarounds().zeroMaxLodWorkaround)
{
@@ -1127,37 +1140,37 @@ gl::Error TextureStorage11_2D::createSRV(int baseLevel,
if (mipLevels == 1 && mMipLevels > 1)
{
// We must use a SRV on the level-zero-only texture.
- ASSERT(mLevelZeroTexture != nullptr && texture == mLevelZeroTexture);
- srvTexture = mLevelZeroTexture;
+ ASSERT(mLevelZeroTexture.valid() && texture == mLevelZeroTexture);
+ srvTexture = &mLevelZeroTexture;
}
else
{
ASSERT(mipLevels == static_cast<int>(mMipLevels));
- ASSERT(mTexture != nullptr && texture == mTexture);
- srvTexture = mTexture;
+ ASSERT(mTexture.valid() && texture == mTexture);
+ srvTexture = &mTexture;
}
}
- ANGLE_TRY(mRenderer->allocateResource(srvDesc, srvTexture, outSRV));
+ ANGLE_TRY(mRenderer->allocateResource(srvDesc, srvTexture->get(), outSRV));
outSRV->setDebugName("TexStorage2D.SRV");
return gl::NoError();
}
-gl::Error TextureStorage11_2D::getSwizzleTexture(ID3D11Resource **outTexture)
+gl::Error TextureStorage11_2D::getSwizzleTexture(const TextureHelper11 **outTexture)
{
ASSERT(outTexture);
- if (!mSwizzleTexture)
+ if (!mSwizzleTexture.valid())
{
- ID3D11Device *device = mRenderer->getDevice();
+ 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 = mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()).texFormat;
+ desc.Format = format.texFormat;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT;
@@ -1165,19 +1178,11 @@ gl::Error TextureStorage11_2D::getSwizzleTexture(ID3D11Resource **outTexture)
desc.CPUAccessFlags = 0;
desc.MiscFlags = 0;
- HRESULT result = device->CreateTexture2D(&desc, nullptr, &mSwizzleTexture);
-
- ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create internal swizzle texture, result: 0x%X.", result);
- }
-
- d3d11::SetDebugName(mSwizzleTexture, "TexStorage2D.SwizzleTexture");
+ ANGLE_TRY(mRenderer->allocateTexture(desc, format, &mSwizzleTexture));
+ mSwizzleTexture.setDebugName("TexStorage2D.SwizzleTexture");
}
- *outTexture = mSwizzleTexture;
+ *outTexture = &mSwizzleTexture;
return gl::NoError();
}
@@ -1189,7 +1194,7 @@ gl::Error TextureStorage11_2D::getSwizzleRenderTarget(int mipLevel,
if (!mSwizzleRenderTargets[mipLevel].valid())
{
- ID3D11Resource *swizzleTexture = nullptr;
+ const TextureHelper11 *swizzleTexture = nullptr;
ANGLE_TRY(getSwizzleTexture(&swizzleTexture));
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
@@ -1198,7 +1203,7 @@ gl::Error TextureStorage11_2D::getSwizzleRenderTarget(int mipLevel,
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
rtvDesc.Texture2D.MipSlice = mTopLevel + mipLevel;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture,
+ ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture.get(),
&mSwizzleRenderTargets[mipLevel]));
}
@@ -1206,9 +1211,10 @@ gl::Error TextureStorage11_2D::getSwizzleRenderTarget(int mipLevel,
return gl::NoError();
}
-gl::ErrorOrResult<TextureStorage11::DropStencil> TextureStorage11_2D::ensureDropStencilTexture()
+gl::ErrorOrResult<TextureStorage11::DropStencil> TextureStorage11_2D::ensureDropStencilTexture(
+ const gl::Context *context)
{
- if (mDropStencilTexture)
+ if (mDropStencilTexture.valid())
{
return DropStencil::ALREADY_EXISTS;
}
@@ -1226,16 +1232,12 @@ gl::ErrorOrResult<TextureStorage11::DropStencil> TextureStorage11_2D::ensureDrop
dropDesc.Usage = D3D11_USAGE_DEFAULT;
dropDesc.Width = mTextureWidth;
- ID3D11Device *device = mRenderer->getDevice();
+ const auto &format =
+ d3d11::Format::Get(GL_DEPTH_COMPONENT32F, mRenderer->getRenderer11DeviceCaps());
+ ANGLE_TRY(mRenderer->allocateTexture(dropDesc, format, &mDropStencilTexture));
+ mDropStencilTexture.setDebugName("TexStorage2D.DropStencil");
- HRESULT hr = device->CreateTexture2D(&dropDesc, nullptr, &mDropStencilTexture);
- if (FAILED(hr))
- {
- return gl::InternalError() << "Error creating drop stencil texture.";
- }
- d3d11::SetDebugName(mDropStencilTexture, "TexStorage2D.DropStencil");
-
- ANGLE_TRY(initDropStencilTexture(gl::ImageIndexIterator::Make2D(0, mMipLevels)));
+ ANGLE_TRY(initDropStencilTexture(context, gl::ImageIndexIterator::Make2D(0, mMipLevels)));
return DropStencil::CREATED;
}
@@ -1248,31 +1250,39 @@ TextureStorage11_External::TextureStorage11_External(
{
ASSERT(stream->getProducerType() == egl::Stream::ProducerType::D3D11TextureNV12);
StreamProducerNV12 *producer = static_cast<StreamProducerNV12 *>(stream->getImplementation());
- mTexture = producer->getD3DTexture();
+ mTexture.set(producer->getD3DTexture(), mFormatInfo);
mSubresourceIndex = producer->getArraySlice();
- mTexture->AddRef();
+ mTexture.get()->AddRef();
mMipLevels = 1;
D3D11_TEXTURE2D_DESC desc;
- mTexture->GetDesc(&desc);
+ mTexture.getDesc(&desc);
mTextureWidth = desc.Width;
mTextureHeight = desc.Height;
mTextureDepth = 1;
mHasKeyedMutex = (desc.MiscFlags & D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX) != 0;
}
-TextureStorage11_External::~TextureStorage11_External()
+gl::Error TextureStorage11_External::onDestroy(const gl::Context *context)
{
- SafeRelease(mTexture);
if (mHasKeyedMutex)
{
// If the keyed mutex is released that will unbind it and cause the state cache to become
// desynchronized.
- mRenderer->getStateManager()->invalidateBoundViews();
+ mRenderer->getStateManager()->invalidateBoundViews(context);
}
+
+ delete this;
+
+ return gl::NoError();
+}
+
+TextureStorage11_External::~TextureStorage11_External()
+{
}
-gl::Error TextureStorage11_External::copyToStorage(TextureStorage *destStorage)
+gl::Error TextureStorage11_External::copyToStorage(const gl::Context *context,
+ TextureStorage *destStorage)
{
UNIMPLEMENTED();
return gl::NoError();
@@ -1298,7 +1308,8 @@ void TextureStorage11_External::disassociateImage(const gl::ImageIndex &index,
mAssociatedImage = nullptr;
}
-gl::Error TextureStorage11_External::releaseAssociatedImage(const gl::ImageIndex &index,
+gl::Error TextureStorage11_External::releaseAssociatedImage(const gl::Context *context,
+ const gl::ImageIndex &index,
Image11 *incomingImage)
{
ASSERT(index.mipIndex == 0);
@@ -1307,36 +1318,40 @@ gl::Error TextureStorage11_External::releaseAssociatedImage(const gl::ImageIndex
{
mAssociatedImage->verifyAssociatedStorageValid(this);
- ANGLE_TRY(mAssociatedImage->recoverFromAssociatedStorage());
+ ANGLE_TRY(mAssociatedImage->recoverFromAssociatedStorage(context));
}
return gl::NoError();
}
-gl::Error TextureStorage11_External::getResource(ID3D11Resource **outResource)
+gl::Error TextureStorage11_External::getResource(const gl::Context *context,
+ const TextureHelper11 **outResource)
{
- *outResource = mTexture;
+ *outResource = &mTexture;
return gl::NoError();
}
-gl::Error TextureStorage11_External::getMippedResource(ID3D11Resource **outResource)
+gl::Error TextureStorage11_External::getMippedResource(const gl::Context *context,
+ const TextureHelper11 **outResource)
{
- *outResource = mTexture;
+ *outResource = &mTexture;
return gl::NoError();
}
-gl::Error TextureStorage11_External::getRenderTarget(const gl::ImageIndex &index,
+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::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureStorage11_External::createSRV(int baseLevel,
+gl::Error TextureStorage11_External::createSRV(const gl::Context *context,
+ int baseLevel,
int mipLevels,
DXGI_FORMAT format,
- ID3D11Resource *texture,
+ const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) const
{
// Since external textures are treates as non-mipmapped textures, we ignore mipmap levels and
@@ -1353,25 +1368,23 @@ gl::Error TextureStorage11_External::createSRV(int baseLevel,
srvDesc.Texture2DArray.FirstArraySlice = mSubresourceIndex;
srvDesc.Texture2DArray.ArraySize = 1;
- ID3D11Resource *srvTexture = texture;
-
- ANGLE_TRY(mRenderer->allocateResource(srvDesc, srvTexture, outSRV));
+ ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), outSRV));
outSRV->setDebugName("TexStorage2D.SRV");
return gl::NoError();
}
-gl::Error TextureStorage11_External::getSwizzleTexture(ID3D11Resource **outTexture)
+gl::Error TextureStorage11_External::getSwizzleTexture(const TextureHelper11 **outTexture)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error TextureStorage11_External::getSwizzleRenderTarget(int mipLevel,
const d3d11::RenderTargetView **outRTV)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
TextureStorage11_EGLImage::TextureStorage11_EGLImage(Renderer11 *renderer,
@@ -1383,7 +1396,7 @@ TextureStorage11_EGLImage::TextureStorage11_EGLImage(Renderer11 *renderer,
renderTarget11->getInternalFormat()),
mImage(eglImage),
mCurrentRenderTarget(0),
- mSwizzleTexture(nullptr),
+ mSwizzleTexture(),
mSwizzleRenderTargets(gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
{
mCurrentRenderTarget = reinterpret_cast<uintptr_t>(renderTarget11);
@@ -1396,57 +1409,61 @@ TextureStorage11_EGLImage::TextureStorage11_EGLImage(Renderer11 *renderer,
TextureStorage11_EGLImage::~TextureStorage11_EGLImage()
{
- SafeRelease(mSwizzleTexture);
}
-gl::Error TextureStorage11_EGLImage::getResource(ID3D11Resource **outResource)
+gl::Error TextureStorage11_EGLImage::getResource(const gl::Context *context,
+ const TextureHelper11 **outResource)
{
- ANGLE_TRY(checkForUpdatedRenderTarget());
+ ANGLE_TRY(checkForUpdatedRenderTarget(context));
RenderTarget11 *renderTarget11 = nullptr;
- ANGLE_TRY(getImageRenderTarget(&renderTarget11));
- *outResource = renderTarget11->getTexture();
+ ANGLE_TRY(getImageRenderTarget(context, &renderTarget11));
+ *outResource = &renderTarget11->getTexture();
return gl::NoError();
}
-gl::Error TextureStorage11_EGLImage::getSRV(const gl::TextureState &textureState,
- d3d11::SharedSRV *outSRV)
+gl::Error TextureStorage11_EGLImage::getSRV(const gl::Context *context,
+ const gl::TextureState &textureState,
+ const d3d11::SharedSRV **outSRV)
{
- ANGLE_TRY(checkForUpdatedRenderTarget());
- return TextureStorage11::getSRV(textureState, outSRV);
+ ANGLE_TRY(checkForUpdatedRenderTarget(context));
+ return TextureStorage11::getSRV(context, textureState, outSRV);
}
-gl::Error TextureStorage11_EGLImage::getMippedResource(ID3D11Resource **)
+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::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureStorage11_EGLImage::getRenderTarget(const gl::ImageIndex &index,
+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());
+ ANGLE_TRY(checkForUpdatedRenderTarget(context));
- return mImage->getRenderTarget(outRT);
+ return mImage->getRenderTarget(context, outRT);
}
-gl::Error TextureStorage11_EGLImage::copyToStorage(TextureStorage *destStorage)
+gl::Error TextureStorage11_EGLImage::copyToStorage(const gl::Context *context,
+ TextureStorage *destStorage)
{
- ID3D11Resource *sourceResouce = nullptr;
- ANGLE_TRY(getResource(&sourceResouce));
+ const TextureHelper11 *sourceResouce = nullptr;
+ ANGLE_TRY(getResource(context, &sourceResouce));
ASSERT(destStorage);
TextureStorage11_2D *dest11 = GetAs<TextureStorage11_2D>(destStorage);
- ID3D11Resource *destResource = nullptr;
- ANGLE_TRY(dest11->getResource(&destResource));
+ const TextureHelper11 *destResource = nullptr;
+ ANGLE_TRY(dest11->getResource(context, &destResource));
ID3D11DeviceContext *immediateContext = mRenderer->getDeviceContext();
- immediateContext->CopyResource(destResource, sourceResouce);
+ immediateContext->CopyResource(destResource->get(), sourceResouce->get());
dest11->markDirty();
@@ -1465,7 +1482,9 @@ void TextureStorage11_EGLImage::verifyAssociatedImageValid(const gl::ImageIndex
{
}
-gl::Error TextureStorage11_EGLImage::releaseAssociatedImage(const gl::ImageIndex &, Image11 *)
+gl::Error TextureStorage11_EGLImage::releaseAssociatedImage(const gl::Context *context,
+ const gl::ImageIndex &,
+ Image11 *)
{
return gl::NoError();
}
@@ -1473,23 +1492,23 @@ gl::Error TextureStorage11_EGLImage::releaseAssociatedImage(const gl::ImageIndex
gl::Error TextureStorage11_EGLImage::useLevelZeroWorkaroundTexture(bool)
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureStorage11_EGLImage::getSwizzleTexture(ID3D11Resource **outTexture)
+gl::Error TextureStorage11_EGLImage::getSwizzleTexture(const TextureHelper11 **outTexture)
{
ASSERT(outTexture);
- if (!mSwizzleTexture)
+ if (!mSwizzleTexture.valid())
{
- ID3D11Device *device = mRenderer->getDevice();
+ 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 = mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()).texFormat;
+ desc.Format = format.texFormat;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT;
@@ -1497,19 +1516,11 @@ gl::Error TextureStorage11_EGLImage::getSwizzleTexture(ID3D11Resource **outTextu
desc.CPUAccessFlags = 0;
desc.MiscFlags = 0;
- HRESULT result = device->CreateTexture2D(&desc, nullptr, &mSwizzleTexture);
-
- ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create internal swizzle texture, result: 0x%X.", result);
- }
-
- d3d11::SetDebugName(mSwizzleTexture, "TexStorageEGLImage.SwizzleTexture");
+ ANGLE_TRY(mRenderer->allocateTexture(desc, format, &mSwizzleTexture));
+ mSwizzleTexture.setDebugName("TexStorageEGLImage.SwizzleTexture");
}
- *outTexture = mSwizzleTexture;
+ *outTexture = &mSwizzleTexture;
return gl::NoError();
}
@@ -1521,7 +1532,7 @@ gl::Error TextureStorage11_EGLImage::getSwizzleRenderTarget(int mipLevel,
if (!mSwizzleRenderTargets[mipLevel].valid())
{
- ID3D11Resource *swizzleTexture = nullptr;
+ const TextureHelper11 *swizzleTexture = nullptr;
ANGLE_TRY(getSwizzleTexture(&swizzleTexture));
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
@@ -1530,7 +1541,7 @@ gl::Error TextureStorage11_EGLImage::getSwizzleRenderTarget(int mipLevel,
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
rtvDesc.Texture2D.MipSlice = mTopLevel + mipLevel;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture,
+ ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture.get(),
&mSwizzleRenderTargets[mipLevel]));
}
@@ -1538,10 +1549,10 @@ gl::Error TextureStorage11_EGLImage::getSwizzleRenderTarget(int mipLevel,
return gl::NoError();
}
-gl::Error TextureStorage11_EGLImage::checkForUpdatedRenderTarget()
+gl::Error TextureStorage11_EGLImage::checkForUpdatedRenderTarget(const gl::Context *context)
{
RenderTarget11 *renderTarget11 = nullptr;
- ANGLE_TRY(getImageRenderTarget(&renderTarget11));
+ ANGLE_TRY(getImageRenderTarget(context, &renderTarget11));
if (mCurrentRenderTarget != reinterpret_cast<uintptr_t>(renderTarget11))
{
@@ -1552,10 +1563,11 @@ gl::Error TextureStorage11_EGLImage::checkForUpdatedRenderTarget()
return gl::NoError();
}
-gl::Error TextureStorage11_EGLImage::createSRV(int baseLevel,
+gl::Error TextureStorage11_EGLImage::createSRV(const gl::Context *context,
+ int baseLevel,
int mipLevels,
DXGI_FORMAT format,
- ID3D11Resource *texture,
+ const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) const
{
ASSERT(baseLevel == 0);
@@ -1572,26 +1584,27 @@ gl::Error TextureStorage11_EGLImage::createSRV(int baseLevel,
srvDesc.Texture2D.MostDetailedMip = mTopLevel + baseLevel;
srvDesc.Texture2D.MipLevels = mipLevels;
- ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture, outSRV));
+ ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), outSRV));
outSRV->setDebugName("TexStorageEGLImage.SRV");
}
else
{
RenderTarget11 *renderTarget = nullptr;
- ANGLE_TRY(getImageRenderTarget(&renderTarget));
+ ANGLE_TRY(getImageRenderTarget(context, &renderTarget));
ASSERT(texture == renderTarget->getTexture());
- *outSRV = renderTarget->getShaderResourceView();
+ *outSRV = renderTarget->getShaderResourceView().makeCopy();
}
return gl::NoError();
}
-gl::Error TextureStorage11_EGLImage::getImageRenderTarget(RenderTarget11 **outRT) const
+gl::Error TextureStorage11_EGLImage::getImageRenderTarget(const gl::Context *context,
+ RenderTarget11 **outRT) const
{
RenderTargetD3D *renderTargetD3D = nullptr;
- ANGLE_TRY(mImage->getRenderTarget(&renderTargetD3D));
+ ANGLE_TRY(mImage->getRenderTarget(context, &renderTargetD3D));
*outRT = GetAs<RenderTarget11>(renderTargetD3D);
return gl::NoError();
}
@@ -1610,10 +1623,10 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer,
renderTarget,
levels),
internalformat),
- mTexture(nullptr),
- mLevelZeroTexture(nullptr),
+ mTexture(),
+ mLevelZeroTexture(),
mUseLevelZeroTexture(hintLevelZeroOnly && levels > 1),
- mSwizzleTexture(nullptr)
+ mSwizzleTexture()
{
for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
{
@@ -1642,7 +1655,7 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer,
ASSERT(!mUseLevelZeroTexture || mRenderer->getWorkarounds().zeroMaxLodWorkaround);
}
-TextureStorage11_Cube::~TextureStorage11_Cube()
+gl::Error TextureStorage11_Cube::onDestroy(const gl::Context *context)
{
for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
{
@@ -1654,15 +1667,11 @@ TextureStorage11_Cube::~TextureStorage11_Cube()
// We must let the Images recover their data before we delete it from the
// TextureStorage.
- mAssociatedImages[face][level]->recoverFromAssociatedStorage();
+ ANGLE_TRY(mAssociatedImages[face][level]->recoverFromAssociatedStorage(context));
}
}
}
- SafeRelease(mTexture);
- SafeRelease(mSwizzleTexture);
- SafeRelease(mLevelZeroTexture);
-
for (unsigned int face = 0; face < CUBE_FACE_COUNT; face++)
{
SafeDelete(mLevelZeroRenderTarget[face]);
@@ -1675,6 +1684,14 @@ TextureStorage11_Cube::~TextureStorage11_Cube()
SafeDelete(mRenderTarget[face][level]);
}
}
+
+ delete this;
+
+ return gl::NoError();
+}
+
+TextureStorage11_Cube::~TextureStorage11_Cube()
+{
}
UINT TextureStorage11_Cube::getSubresourceIndex(const gl::ImageIndex &index) const
@@ -1697,7 +1714,8 @@ UINT TextureStorage11_Cube::getSubresourceIndex(const gl::ImageIndex &index) con
}
}
-gl::Error TextureStorage11_Cube::copyToStorage(TextureStorage *destStorage)
+gl::Error TextureStorage11_Cube::copyToStorage(const gl::Context *context,
+ TextureStorage *destStorage)
{
ASSERT(destStorage);
@@ -1709,36 +1727,36 @@ gl::Error TextureStorage11_Cube::copyToStorage(TextureStorage *destStorage)
// If either mTexture or mLevelZeroTexture exist, then we need to copy them into the
// corresponding textures in destStorage.
- if (mTexture)
+ if (mTexture.valid())
{
ANGLE_TRY(dest11->useLevelZeroWorkaroundTexture(false));
- ID3D11Resource *destResource = nullptr;
- ANGLE_TRY(dest11->getResource(&destResource));
+ const TextureHelper11 *destResource = nullptr;
+ ANGLE_TRY(dest11->getResource(context, &destResource));
- immediateContext->CopyResource(destResource, mTexture);
+ immediateContext->CopyResource(destResource->get(), mTexture.get());
}
- if (mLevelZeroTexture)
+ if (mLevelZeroTexture.valid())
{
ANGLE_TRY(dest11->useLevelZeroWorkaroundTexture(true));
- ID3D11Resource *destResource = nullptr;
- ANGLE_TRY(dest11->getResource(&destResource));
+ const TextureHelper11 *destResource = nullptr;
+ ANGLE_TRY(dest11->getResource(context, &destResource));
- immediateContext->CopyResource(destResource, mLevelZeroTexture);
+ immediateContext->CopyResource(destResource->get(), mLevelZeroTexture.get());
}
}
else
{
- ID3D11Resource *sourceResouce = nullptr;
- ANGLE_TRY(getResource(&sourceResouce));
+ const TextureHelper11 *sourceResouce = nullptr;
+ ANGLE_TRY(getResource(context, &sourceResouce));
- ID3D11Resource *destResource = nullptr;
- ANGLE_TRY(dest11->getResource(&destResource));
+ const TextureHelper11 *destResource = nullptr;
+ ANGLE_TRY(dest11->getResource(context, &destResource));
ID3D11DeviceContext *immediateContext = mRenderer->getDeviceContext();
- immediateContext->CopyResource(destResource, sourceResouce);
+ immediateContext->CopyResource(destResource->get(), sourceResouce->get());
}
dest11->markDirty();
@@ -1750,18 +1768,19 @@ gl::Error TextureStorage11_Cube::useLevelZeroWorkaroundTexture(bool useLevelZero
{
if (useLevelZeroTexture && mMipLevels > 1)
{
- if (!mUseLevelZeroTexture && mTexture)
+ if (!mUseLevelZeroTexture && mTexture.valid())
{
ANGLE_TRY(ensureTextureExists(1));
// Pull data back from the mipped texture if necessary.
- ASSERT(mLevelZeroTexture);
+ ASSERT(mLevelZeroTexture.valid());
ID3D11DeviceContext *context = mRenderer->getDeviceContext();
for (int face = 0; face < 6; face++)
{
- context->CopySubresourceRegion(mLevelZeroTexture, D3D11CalcSubresource(0, face, 1),
- 0, 0, 0, mTexture, face * mMipLevels, nullptr);
+ context->CopySubresourceRegion(mLevelZeroTexture.get(),
+ D3D11CalcSubresource(0, face, 1), 0, 0, 0,
+ mTexture.get(), face * mMipLevels, nullptr);
}
}
@@ -1769,18 +1788,19 @@ gl::Error TextureStorage11_Cube::useLevelZeroWorkaroundTexture(bool useLevelZero
}
else
{
- if (mUseLevelZeroTexture && mLevelZeroTexture)
+ if (mUseLevelZeroTexture && mLevelZeroTexture.valid())
{
ANGLE_TRY(ensureTextureExists(mMipLevels));
// Pull data back from the level zero texture if necessary.
- ASSERT(mTexture);
+ ASSERT(mTexture.valid());
ID3D11DeviceContext *context = mRenderer->getDeviceContext();
for (int face = 0; face < 6; face++)
{
- context->CopySubresourceRegion(mTexture, D3D11CalcSubresource(0, face, mMipLevels),
- 0, 0, 0, mLevelZeroTexture, face, nullptr);
+ context->CopySubresourceRegion(mTexture.get(),
+ D3D11CalcSubresource(0, face, mMipLevels), 0, 0, 0,
+ mLevelZeroTexture.get(), face, nullptr);
}
}
@@ -1834,7 +1854,8 @@ void TextureStorage11_Cube::disassociateImage(const gl::ImageIndex &index, Image
// 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::ImageIndex &index,
+gl::Error TextureStorage11_Cube::releaseAssociatedImage(const gl::Context *context,
+ const gl::ImageIndex &index,
Image11 *incomingImage)
{
const GLint level = index.mipIndex;
@@ -1856,7 +1877,8 @@ gl::Error TextureStorage11_Cube::releaseAssociatedImage(const gl::ImageIndex &in
// 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());
+ ANGLE_TRY(
+ mAssociatedImages[layerTarget][level]->recoverFromAssociatedStorage(context));
}
}
}
@@ -1864,29 +1886,31 @@ gl::Error TextureStorage11_Cube::releaseAssociatedImage(const gl::ImageIndex &in
return gl::NoError();
}
-gl::Error TextureStorage11_Cube::getResource(ID3D11Resource **outResource)
+gl::Error TextureStorage11_Cube::getResource(const gl::Context *context,
+ const TextureHelper11 **outResource)
{
if (mUseLevelZeroTexture && mMipLevels > 1)
{
ANGLE_TRY(ensureTextureExists(1));
- *outResource = mLevelZeroTexture;
+ *outResource = &mLevelZeroTexture;
return gl::NoError();
}
else
{
ANGLE_TRY(ensureTextureExists(mMipLevels));
- *outResource = mTexture;
+ *outResource = &mTexture;
return gl::NoError();
}
}
-gl::Error TextureStorage11_Cube::getMippedResource(ID3D11Resource **outResource)
+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;
+ *outResource = &mTexture;
return gl::NoError();
}
@@ -1896,16 +1920,14 @@ gl::Error TextureStorage11_Cube::ensureTextureExists(int mipLevels)
bool useLevelZeroTexture = mRenderer->getWorkarounds().zeroMaxLodWorkaround
? (mipLevels == 1) && (mMipLevels > 1)
: false;
- ID3D11Texture2D **outputTexture = useLevelZeroTexture ? &mLevelZeroTexture : &mTexture;
+ 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 == nullptr && mTextureWidth > 0 && mTextureHeight > 0)
+ if (!outputTexture->valid() && mTextureWidth > 0 && mTextureHeight > 0)
{
ASSERT(mMipLevels > 0);
- ID3D11Device *device = mRenderer->getDevice();
-
D3D11_TEXTURE2D_DESC desc;
desc.Width = mTextureWidth;
desc.Height = mTextureHeight;
@@ -1919,29 +1941,14 @@ gl::Error TextureStorage11_Cube::ensureTextureExists(int mipLevels)
desc.CPUAccessFlags = 0;
desc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE | getMiscFlags();
- HRESULT result = device->CreateTexture2D(&desc, nullptr, outputTexture);
-
- // this can happen from windows TDR
- if (d3d11::isDeviceLostError(result))
- {
- mRenderer->notifyDeviceLost();
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create cube texture storage, result: 0x%X.", result);
- }
- else if (FAILED(result))
- {
- ASSERT(result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create cube texture storage, result: 0x%X.", result);
- }
-
- d3d11::SetDebugName(*outputTexture, "TexStorageCube.Texture");
+ ANGLE_TRY(mRenderer->allocateTexture(desc, mFormatInfo, outputTexture));
+ outputTexture->setDebugName("TexStorageCube.Texture");
}
return gl::NoError();
}
-gl::Error TextureStorage11_Cube::createRenderTargetSRV(ID3D11Resource *texture,
+gl::Error TextureStorage11_Cube::createRenderTargetSRV(const TextureHelper11 &texture,
const gl::ImageIndex &index,
DXGI_FORMAT resourceFormat,
d3d11::SharedSRV *srv) const
@@ -1963,11 +1970,12 @@ gl::Error TextureStorage11_Cube::createRenderTargetSRV(ID3D11Resource *texture,
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
}
- ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture, srv));
+ ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), srv));
return gl::NoError();
}
-gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index,
+gl::Error TextureStorage11_Cube::getRenderTarget(const gl::Context *context,
+ const gl::ImageIndex &index,
RenderTargetD3D **outRT)
{
const int faceIndex = index.layerIndex;
@@ -1978,8 +1986,8 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index,
if (!mRenderTarget[faceIndex][level])
{
- ID3D11Resource *texture = nullptr;
- ANGLE_TRY(getResource(&texture));
+ const TextureHelper11 *texture = nullptr;
+ ANGLE_TRY(getResource(context, &texture));
if (mUseLevelZeroTexture)
{
@@ -1993,7 +2001,7 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index,
rtvDesc.Texture2DArray.ArraySize = 1;
d3d11::RenderTargetView rtv;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mLevelZeroTexture, &rtv));
+ ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mLevelZeroTexture.get(), &rtv));
mLevelZeroRenderTarget[faceIndex] = new TextureRenderTarget11(
std::move(rtv), mLevelZeroTexture, d3d11::SharedSRV(), d3d11::SharedSRV(),
@@ -2007,15 +2015,15 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index,
}
d3d11::SharedSRV srv;
- ANGLE_TRY(createRenderTargetSRV(texture, index, mFormatInfo.srvFormat, &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));
+ ANGLE_TRY(createRenderTargetSRV(*texture, index, mFormatInfo.blitSRVFormat, &blitSRV));
}
else
{
- blitSRV = srv;
+ blitSRV = srv.makeCopy();
}
srv.setDebugName("TexStorageCube.RenderTargetSRV");
@@ -2030,11 +2038,11 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index,
rtvDesc.Texture2DArray.ArraySize = 1;
d3d11::RenderTargetView rtv;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture, &rtv));
+ ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv));
rtv.setDebugName("TexStorageCube.RenderTargetRTV");
mRenderTarget[faceIndex][level] = new TextureRenderTarget11(
- std::move(rtv), texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
+ std::move(rtv), *texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(level), getLevelHeight(level), 1, 0);
}
else if (mFormatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN)
@@ -2048,11 +2056,11 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index,
dsvDesc.Texture2DArray.ArraySize = 1;
d3d11::DepthStencilView dsv;
- ANGLE_TRY(mRenderer->allocateResource(dsvDesc, texture, &dsv));
+ ANGLE_TRY(mRenderer->allocateResource(dsvDesc, texture->get(), &dsv));
dsv.setDebugName("TexStorageCube.RenderTargetDSV");
mRenderTarget[faceIndex][level] = new TextureRenderTarget11(
- std::move(dsv), texture, srv, mFormatInfo.internalFormat, getFormatSet(),
+ std::move(dsv), *texture, srv, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(level), getLevelHeight(level), 1, 0);
}
else
@@ -2066,10 +2074,11 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index,
return gl::NoError();
}
-gl::Error TextureStorage11_Cube::createSRV(int baseLevel,
+gl::Error TextureStorage11_Cube::createSRV(const gl::Context *context,
+ int baseLevel,
int mipLevels,
DXGI_FORMAT format,
- ID3D11Resource *texture,
+ const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) const
{
ASSERT(outSRV);
@@ -2095,7 +2104,7 @@ gl::Error TextureStorage11_Cube::createSRV(int baseLevel,
srvDesc.TextureCube.MostDetailedMip = mTopLevel + baseLevel;
}
- ID3D11Resource *srvTexture = texture;
+ const TextureHelper11 *srvTexture = &texture;
if (mRenderer->getWorkarounds().zeroMaxLodWorkaround)
{
@@ -2107,37 +2116,37 @@ gl::Error TextureStorage11_Cube::createSRV(int baseLevel,
if (mipLevels == 1 && mMipLevels > 1)
{
// We must use a SRV on the level-zero-only texture.
- ASSERT(mLevelZeroTexture != nullptr && texture == mLevelZeroTexture);
- srvTexture = mLevelZeroTexture;
+ ASSERT(mLevelZeroTexture.valid() && texture == mLevelZeroTexture);
+ srvTexture = &mLevelZeroTexture;
}
else
{
ASSERT(mipLevels == static_cast<int>(mMipLevels));
- ASSERT(mTexture != nullptr && texture == mTexture);
- srvTexture = mTexture;
+ ASSERT(mTexture.valid() && texture == mTexture);
+ srvTexture = &mTexture;
}
}
- ANGLE_TRY(mRenderer->allocateResource(srvDesc, srvTexture, outSRV));
+ ANGLE_TRY(mRenderer->allocateResource(srvDesc, srvTexture->get(), outSRV));
outSRV->setDebugName("TexStorageCube.SRV");
return gl::NoError();
}
-gl::Error TextureStorage11_Cube::getSwizzleTexture(ID3D11Resource **outTexture)
+gl::Error TextureStorage11_Cube::getSwizzleTexture(const TextureHelper11 **outTexture)
{
ASSERT(outTexture);
- if (!mSwizzleTexture)
+ if (!mSwizzleTexture.valid())
{
- ID3D11Device *device = mRenderer->getDevice();
+ const auto &format = mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps());
D3D11_TEXTURE2D_DESC desc;
desc.Width = mTextureWidth;
desc.Height = mTextureHeight;
desc.MipLevels = mMipLevels;
desc.ArraySize = CUBE_FACE_COUNT;
- desc.Format = mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()).texFormat;
+ desc.Format = format.texFormat;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT;
@@ -2145,19 +2154,11 @@ gl::Error TextureStorage11_Cube::getSwizzleTexture(ID3D11Resource **outTexture)
desc.CPUAccessFlags = 0;
desc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE;
- HRESULT result = device->CreateTexture2D(&desc, nullptr, &mSwizzleTexture);
-
- ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create internal swizzle texture, result: 0x%X.", result);
- }
-
- d3d11::SetDebugName(*outTexture, "TexStorageCube.SwizzleTexture");
+ ANGLE_TRY(mRenderer->allocateTexture(desc, format, &mSwizzleTexture));
+ mSwizzleTexture.setDebugName("TexStorageCube.SwizzleTexture");
}
- *outTexture = mSwizzleTexture;
+ *outTexture = &mSwizzleTexture;
return gl::NoError();
}
@@ -2169,7 +2170,7 @@ gl::Error TextureStorage11_Cube::getSwizzleRenderTarget(int mipLevel,
if (!mSwizzleRenderTargets[mipLevel].valid())
{
- ID3D11Resource *swizzleTexture = nullptr;
+ const TextureHelper11 *swizzleTexture = nullptr;
ANGLE_TRY(getSwizzleTexture(&swizzleTexture));
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
@@ -2180,7 +2181,7 @@ gl::Error TextureStorage11_Cube::getSwizzleRenderTarget(int mipLevel,
rtvDesc.Texture2DArray.FirstArraySlice = 0;
rtvDesc.Texture2DArray.ArraySize = CUBE_FACE_COUNT;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture,
+ ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture.get(),
&mSwizzleRenderTargets[mipLevel]));
}
@@ -2188,14 +2189,11 @@ gl::Error TextureStorage11_Cube::getSwizzleRenderTarget(int mipLevel,
return gl::NoError();
}
-gl::Error TextureStorage11::initDropStencilTexture(const gl::ImageIndexIterator &it)
+gl::Error TextureStorage11::initDropStencilTexture(const gl::Context *context,
+ const gl::ImageIndexIterator &it)
{
- ID3D11Resource *resource = nullptr;
- ANGLE_TRY(getResource(&resource));
- TextureHelper11 sourceTexture = TextureHelper11::MakeAndReference(resource, mFormatInfo);
- TextureHelper11 destTexture = TextureHelper11::MakeAndReference(
- mDropStencilTexture,
- d3d11::Format::Get(GL_DEPTH_COMPONENT32F, mRenderer->getRenderer11DeviceCaps()));
+ const TextureHelper11 *sourceTexture = nullptr;
+ ANGLE_TRY(getResource(context, &sourceTexture));
gl::ImageIndexIterator itCopy = it;
@@ -2206,17 +2204,18 @@ gl::Error TextureStorage11::initDropStencilTexture(const gl::ImageIndexIterator
1);
gl::Extents wholeSize(wholeArea.width, wholeArea.height, 1);
UINT subresource = getSubresourceIndex(index);
- ANGLE_TRY(mRenderer->getBlitter()->copyDepthStencil(sourceTexture, subresource, wholeArea,
- wholeSize, destTexture, subresource,
- wholeArea, wholeSize, nullptr));
+ ANGLE_TRY(mRenderer->getBlitter()->copyDepthStencil(
+ *sourceTexture, subresource, wholeArea, wholeSize, mDropStencilTexture, subresource,
+ wholeArea, wholeSize, nullptr));
}
return gl::NoError();
}
-gl::ErrorOrResult<TextureStorage11::DropStencil> TextureStorage11_Cube::ensureDropStencilTexture()
+gl::ErrorOrResult<TextureStorage11::DropStencil> TextureStorage11_Cube::ensureDropStencilTexture(
+ const gl::Context *context)
{
- if (mDropStencilTexture)
+ if (mDropStencilTexture.valid())
{
return DropStencil::ALREADY_EXISTS;
}
@@ -2234,16 +2233,12 @@ gl::ErrorOrResult<TextureStorage11::DropStencil> TextureStorage11_Cube::ensureDr
dropDesc.Usage = D3D11_USAGE_DEFAULT;
dropDesc.Width = mTextureWidth;
- ID3D11Device *device = mRenderer->getDevice();
+ const auto &format =
+ d3d11::Format::Get(GL_DEPTH_COMPONENT32F, mRenderer->getRenderer11DeviceCaps());
+ ANGLE_TRY(mRenderer->allocateTexture(dropDesc, format, &mDropStencilTexture));
+ mDropStencilTexture.setDebugName("TexStorageCube.DropStencil");
- HRESULT hr = device->CreateTexture2D(&dropDesc, nullptr, &mDropStencilTexture);
- if (FAILED(hr))
- {
- return gl::InternalError() << "Error creating drop stencil texture.";
- }
- d3d11::SetDebugName(mDropStencilTexture, "TexStorageCube.DropStencil");
-
- ANGLE_TRY(initDropStencilTexture(gl::ImageIndexIterator::MakeCube(0, mMipLevels)));
+ ANGLE_TRY(initDropStencilTexture(context, gl::ImageIndexIterator::MakeCube(0, mMipLevels)));
return DropStencil::CREATED;
}
@@ -2264,9 +2259,6 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer,
levels),
internalformat)
{
- mTexture = nullptr;
- mSwizzleTexture = nullptr;
-
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{
mAssociatedImages[i] = nullptr;
@@ -2282,7 +2274,7 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer,
mTextureDepth = depth;
}
-TextureStorage11_3D::~TextureStorage11_3D()
+gl::Error TextureStorage11_3D::onDestroy(const gl::Context *context)
{
for (unsigned i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{
@@ -2292,13 +2284,10 @@ TextureStorage11_3D::~TextureStorage11_3D()
// We must let the Images recover their data before we delete it from the
// TextureStorage.
- mAssociatedImages[i]->recoverFromAssociatedStorage();
+ ANGLE_TRY(mAssociatedImages[i]->recoverFromAssociatedStorage(context));
}
}
- SafeRelease(mTexture);
- SafeRelease(mSwizzleTexture);
-
for (RenderTargetMap::iterator i = mLevelLayerRenderTargets.begin();
i != mLevelLayerRenderTargets.end(); i++)
{
@@ -2310,6 +2299,14 @@ TextureStorage11_3D::~TextureStorage11_3D()
{
SafeDelete(mLevelRenderTargets[i]);
}
+
+ delete this;
+
+ return gl::NoError();
+}
+
+TextureStorage11_3D::~TextureStorage11_3D()
+{
}
void TextureStorage11_3D::associateImage(Image11 *image, const gl::ImageIndex &index)
@@ -2347,7 +2344,8 @@ void TextureStorage11_3D::disassociateImage(const gl::ImageIndex &index, Image11
// 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::ImageIndex &index,
+gl::Error TextureStorage11_3D::releaseAssociatedImage(const gl::Context *context,
+ const gl::ImageIndex &index,
Image11 *incomingImage)
{
const GLint level = index.mipIndex;
@@ -2364,23 +2362,22 @@ gl::Error TextureStorage11_3D::releaseAssociatedImage(const gl::ImageIndex &inde
// 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());
+ ANGLE_TRY(mAssociatedImages[level]->recoverFromAssociatedStorage(context));
}
}
return gl::NoError();
}
-gl::Error TextureStorage11_3D::getResource(ID3D11Resource **outResource)
+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 == nullptr && mTextureWidth > 0 && mTextureHeight > 0 && mTextureDepth > 0)
+ if (!mTexture.valid() && mTextureWidth > 0 && mTextureHeight > 0 && mTextureDepth > 0)
{
ASSERT(mMipLevels > 0);
- ID3D11Device *device = mRenderer->getDevice();
-
D3D11_TEXTURE3D_DESC desc;
desc.Width = mTextureWidth;
desc.Height = mTextureHeight;
@@ -2392,33 +2389,19 @@ gl::Error TextureStorage11_3D::getResource(ID3D11Resource **outResource)
desc.CPUAccessFlags = 0;
desc.MiscFlags = getMiscFlags();
- HRESULT result = device->CreateTexture3D(&desc, nullptr, &mTexture);
-
- // this can happen from windows TDR
- if (d3d11::isDeviceLostError(result))
- {
- mRenderer->notifyDeviceLost();
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create 3D texture storage, result: 0x%X.",
- result);
- }
- else if (FAILED(result))
- {
- ASSERT(result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create 3D texture storage, result: 0x%X.",
- result);
- }
-
- d3d11::SetDebugName(mTexture, "TexStorage3D.Texture");
+ ANGLE_TRY(mRenderer->allocateTexture(desc, mFormatInfo, &mTexture));
+ mTexture.setDebugName("TexStorage3D.Texture");
}
- *outResource = mTexture;
+ *outResource = &mTexture;
return gl::NoError();
}
-gl::Error TextureStorage11_3D::createSRV(int baseLevel,
+gl::Error TextureStorage11_3D::createSRV(const gl::Context *context,
+ int baseLevel,
int mipLevels,
DXGI_FORMAT format,
- ID3D11Resource *texture,
+ const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) const
{
ASSERT(outSRV);
@@ -2429,13 +2412,15 @@ gl::Error TextureStorage11_3D::createSRV(int baseLevel,
srvDesc.Texture3D.MostDetailedMip = baseLevel;
srvDesc.Texture3D.MipLevels = mipLevels;
- ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture, outSRV));
+ ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), outSRV));
outSRV->setDebugName("TexStorage3D.SRV");
return gl::NoError();
}
-gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT)
+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());
@@ -2446,14 +2431,14 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend
{
if (!mLevelRenderTargets[mipLevel])
{
- ID3D11Resource *texture = nullptr;
- ANGLE_TRY(getResource(&texture));
+ const TextureHelper11 *texture = nullptr;
+ ANGLE_TRY(getResource(context, &texture));
const d3d11::SharedSRV *srv = nullptr;
- ANGLE_TRY(getSRVLevel(mipLevel, false, &srv));
+ ANGLE_TRY(getSRVLevel(context, mipLevel, false, &srv));
const d3d11::SharedSRV *blitSRV = nullptr;
- ANGLE_TRY(getSRVLevel(mipLevel, true, &blitSRV));
+ ANGLE_TRY(getSRVLevel(context, mipLevel, true, &blitSRV));
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = mFormatInfo.rtvFormat;
@@ -2463,12 +2448,13 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend
rtvDesc.Texture3D.WSize = static_cast<UINT>(-1);
d3d11::RenderTargetView rtv;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture, &rtv));
+ ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv));
rtv.setDebugName("TexStorage3D.RTV");
mLevelRenderTargets[mipLevel] = new TextureRenderTarget11(
- std::move(rtv), texture, *srv, *blitSRV, mFormatInfo.internalFormat, getFormatSet(),
- getLevelWidth(mipLevel), getLevelHeight(mipLevel), getLevelDepth(mipLevel), 0);
+ std::move(rtv), *texture, *srv, *blitSRV, mFormatInfo.internalFormat,
+ getFormatSet(), getLevelWidth(mipLevel), getLevelHeight(mipLevel),
+ getLevelDepth(mipLevel), 0);
}
ASSERT(outRT);
@@ -2481,8 +2467,8 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend
LevelLayerKey key(mipLevel, layer);
if (mLevelLayerRenderTargets.find(key) == mLevelLayerRenderTargets.end())
{
- ID3D11Resource *texture = nullptr;
- ANGLE_TRY(getResource(&texture));
+ const TextureHelper11 *texture = nullptr;
+ ANGLE_TRY(getResource(context, &texture));
// TODO, what kind of SRV is expected here?
const d3d11::SharedSRV srv;
@@ -2496,11 +2482,11 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend
rtvDesc.Texture3D.WSize = 1;
d3d11::RenderTargetView rtv;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture, &rtv));
+ ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv));
rtv.setDebugName("TexStorage3D.LayerRTV");
mLevelLayerRenderTargets[key] = new TextureRenderTarget11(
- std::move(rtv), texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
+ std::move(rtv), *texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
}
@@ -2509,38 +2495,30 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend
return gl::NoError();
}
-gl::Error TextureStorage11_3D::getSwizzleTexture(ID3D11Resource **outTexture)
+gl::Error TextureStorage11_3D::getSwizzleTexture(const TextureHelper11 **outTexture)
{
ASSERT(outTexture);
- if (!mSwizzleTexture)
+ if (!mSwizzleTexture.valid())
{
- ID3D11Device *device = mRenderer->getDevice();
+ 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 = mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()).texFormat;
+ 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;
- HRESULT result = device->CreateTexture3D(&desc, nullptr, &mSwizzleTexture);
-
- ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create internal swizzle texture, result: 0x%X.", result);
- }
-
- d3d11::SetDebugName(mSwizzleTexture, "TexStorage3D.SwizzleTexture");
+ ANGLE_TRY(mRenderer->allocateTexture(desc, format, &mSwizzleTexture));
+ mSwizzleTexture.setDebugName("TexStorage3D.SwizzleTexture");
}
- *outTexture = mSwizzleTexture;
+ *outTexture = &mSwizzleTexture;
return gl::NoError();
}
@@ -2552,7 +2530,7 @@ gl::Error TextureStorage11_3D::getSwizzleRenderTarget(int mipLevel,
if (!mSwizzleRenderTargets[mipLevel].valid())
{
- ID3D11Resource *swizzleTexture = nullptr;
+ const TextureHelper11 *swizzleTexture = nullptr;
ANGLE_TRY(getSwizzleTexture(&swizzleTexture));
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
@@ -2563,7 +2541,7 @@ gl::Error TextureStorage11_3D::getSwizzleRenderTarget(int mipLevel,
rtvDesc.Texture3D.FirstWSlice = 0;
rtvDesc.Texture3D.WSize = static_cast<UINT>(-1);
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture,
+ ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture.get(),
&mSwizzleRenderTargets[mipLevel]));
mSwizzleRenderTargets[mipLevel].setDebugName("TexStorage3D.SwizzleRTV");
}
@@ -2588,9 +2566,6 @@ TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer,
levels),
internalformat)
{
- mTexture = nullptr;
- mSwizzleTexture = nullptr;
-
// adjust size if needed for compressed textures
d3d11::MakeValidSize(false, mFormatInfo.texFormat, &width, &height, &mTopLevel);
@@ -2600,29 +2575,34 @@ TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer,
mTextureDepth = depth;
}
-TextureStorage11_2DArray::~TextureStorage11_2DArray()
+gl::Error TextureStorage11_2DArray::onDestroy(const gl::Context *context)
{
- for (ImageMap::iterator i = mAssociatedImages.begin(); i != mAssociatedImages.end(); i++)
+ for (auto iter : mAssociatedImages)
{
- if (i->second)
+ if (iter.second)
{
- i->second->verifyAssociatedStorageValid(this);
+ iter.second->verifyAssociatedStorageValid(this);
// We must let the Images recover their data before we delete it from the
// TextureStorage.
- i->second->recoverFromAssociatedStorage();
+ ANGLE_TRY(iter.second->recoverFromAssociatedStorage(context));
}
}
mAssociatedImages.clear();
- SafeRelease(mTexture);
- SafeRelease(mSwizzleTexture);
-
- for (RenderTargetMap::iterator i = mRenderTargets.begin(); i != mRenderTargets.end(); i++)
+ for (auto iter : mRenderTargets)
{
- SafeDelete(i->second);
+ SafeDelete(iter.second);
}
mRenderTargets.clear();
+
+ delete this;
+
+ return gl::NoError();
+}
+
+TextureStorage11_2DArray::~TextureStorage11_2DArray()
+{
}
void TextureStorage11_2DArray::associateImage(Image11 *image, const gl::ImageIndex &index)
@@ -2671,7 +2651,8 @@ void TextureStorage11_2DArray::disassociateImage(const gl::ImageIndex &index,
// 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::ImageIndex &index,
+gl::Error TextureStorage11_2DArray::releaseAssociatedImage(const gl::Context *context,
+ const gl::ImageIndex &index,
Image11 *incomingImage)
{
const GLint level = index.mipIndex;
@@ -2688,23 +2669,22 @@ gl::Error TextureStorage11_2DArray::releaseAssociatedImage(const gl::ImageIndex
// 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());
+ ANGLE_TRY(mAssociatedImages[key]->recoverFromAssociatedStorage(context));
}
}
return gl::NoError();
}
-gl::Error TextureStorage11_2DArray::getResource(ID3D11Resource **outResource)
+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 == nullptr && mTextureWidth > 0 && mTextureHeight > 0 && mTextureDepth > 0)
+ if (!mTexture.valid() && mTextureWidth > 0 && mTextureHeight > 0 && mTextureDepth > 0)
{
ASSERT(mMipLevels > 0);
- ID3D11Device *device = mRenderer->getDevice();
-
D3D11_TEXTURE2D_DESC desc;
desc.Width = mTextureWidth;
desc.Height = mTextureHeight;
@@ -2718,33 +2698,19 @@ gl::Error TextureStorage11_2DArray::getResource(ID3D11Resource **outResource)
desc.CPUAccessFlags = 0;
desc.MiscFlags = getMiscFlags();
- HRESULT result = device->CreateTexture2D(&desc, nullptr, &mTexture);
-
- // this can happen from windows TDR
- if (d3d11::isDeviceLostError(result))
- {
- mRenderer->notifyDeviceLost();
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create 2D array texture storage, result: 0x%X.", result);
- }
- else if (FAILED(result))
- {
- ASSERT(result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create 2D array texture storage, result: 0x%X.", result);
- }
-
- d3d11::SetDebugName(mTexture, "TexStorage2DArray.Texture");
+ ANGLE_TRY(mRenderer->allocateTexture(desc, mFormatInfo, &mTexture));
+ mTexture.setDebugName("TexStorage2DArray.Texture");
}
- *outResource = mTexture;
+ *outResource = &mTexture;
return gl::NoError();
}
-gl::Error TextureStorage11_2DArray::createSRV(int baseLevel,
+gl::Error TextureStorage11_2DArray::createSRV(const gl::Context *context,
+ int baseLevel,
int mipLevels,
DXGI_FORMAT format,
- ID3D11Resource *texture,
+ const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) const
{
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
@@ -2755,13 +2721,13 @@ gl::Error TextureStorage11_2DArray::createSRV(int baseLevel,
srvDesc.Texture2DArray.FirstArraySlice = 0;
srvDesc.Texture2DArray.ArraySize = mTextureDepth;
- ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture, outSRV));
+ ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), outSRV));
outSRV->setDebugName("TexStorage2DArray.SRV");
return gl::NoError();
}
-gl::Error TextureStorage11_2DArray::createRenderTargetSRV(ID3D11Resource *texture,
+gl::Error TextureStorage11_2DArray::createRenderTargetSRV(const TextureHelper11 &texture,
const gl::ImageIndex &index,
DXGI_FORMAT resourceFormat,
d3d11::SharedSRV *srv) const
@@ -2774,12 +2740,13 @@ gl::Error TextureStorage11_2DArray::createRenderTargetSRV(ID3D11Resource *textur
srvDesc.Texture2DArray.FirstArraySlice = index.layerIndex;
srvDesc.Texture2DArray.ArraySize = 1;
- ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture, srv));
+ ANGLE_TRY(mRenderer->allocateResource(srvDesc, texture.get(), srv));
return gl::NoError();
}
-gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index,
+gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::Context *context,
+ const gl::ImageIndex &index,
RenderTargetD3D **outRT)
{
ASSERT(index.hasLayer());
@@ -2792,18 +2759,18 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index,
LevelLayerKey key(mipLevel, layer);
if (mRenderTargets.find(key) == mRenderTargets.end())
{
- ID3D11Resource *texture = nullptr;
- ANGLE_TRY(getResource(&texture));
+ const TextureHelper11 *texture = nullptr;
+ ANGLE_TRY(getResource(context, &texture));
d3d11::SharedSRV srv;
- ANGLE_TRY(createRenderTargetSRV(texture, index, mFormatInfo.srvFormat, &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));
+ ANGLE_TRY(createRenderTargetSRV(*texture, index, mFormatInfo.blitSRVFormat, &blitSRV));
}
else
{
- blitSRV = srv;
+ blitSRV = srv.makeCopy();
}
srv.setDebugName("TexStorage2DArray.RenderTargetSRV");
@@ -2818,11 +2785,11 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index,
rtvDesc.Texture2DArray.ArraySize = 1;
d3d11::RenderTargetView rtv;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture, &rtv));
+ ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv));
rtv.setDebugName("TexStorage2DArray.RenderTargetRTV");
mRenderTargets[key] = new TextureRenderTarget11(
- std::move(rtv), texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
+ std::move(rtv), *texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
}
else
@@ -2838,11 +2805,11 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index,
dsvDesc.Flags = 0;
d3d11::DepthStencilView dsv;
- ANGLE_TRY(mRenderer->allocateResource(dsvDesc, texture, &dsv));
+ ANGLE_TRY(mRenderer->allocateResource(dsvDesc, texture->get(), &dsv));
dsv.setDebugName("TexStorage2DArray.RenderTargetDSV");
mRenderTargets[key] = new TextureRenderTarget11(
- std::move(dsv), texture, srv, mFormatInfo.internalFormat, getFormatSet(),
+ std::move(dsv), *texture, srv, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
}
}
@@ -2852,18 +2819,18 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index,
return gl::NoError();
}
-gl::Error TextureStorage11_2DArray::getSwizzleTexture(ID3D11Resource **outTexture)
+gl::Error TextureStorage11_2DArray::getSwizzleTexture(const TextureHelper11 **outTexture)
{
- if (!mSwizzleTexture)
+ if (!mSwizzleTexture.valid())
{
- ID3D11Device *device = mRenderer->getDevice();
+ 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 = mFormatInfo.getSwizzleFormat(mRenderer->getRenderer11DeviceCaps()).texFormat;
+ desc.Format = format.texFormat;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT;
@@ -2871,19 +2838,11 @@ gl::Error TextureStorage11_2DArray::getSwizzleTexture(ID3D11Resource **outTextur
desc.CPUAccessFlags = 0;
desc.MiscFlags = 0;
- HRESULT result = device->CreateTexture2D(&desc, nullptr, &mSwizzleTexture);
-
- ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create internal swizzle texture, result: 0x%X.", result);
- }
-
- d3d11::SetDebugName(*outTexture, "TexStorage2DArray.SwizzleTexture");
+ ANGLE_TRY(mRenderer->allocateTexture(desc, format, &mSwizzleTexture));
+ mSwizzleTexture.setDebugName("TexStorage2DArray.SwizzleTexture");
}
- *outTexture = mSwizzleTexture;
+ *outTexture = &mSwizzleTexture;
return gl::NoError();
}
@@ -2895,7 +2854,7 @@ gl::Error TextureStorage11_2DArray::getSwizzleRenderTarget(int mipLevel,
if (!mSwizzleRenderTargets[mipLevel].valid())
{
- ID3D11Resource *swizzleTexture = nullptr;
+ const TextureHelper11 *swizzleTexture = nullptr;
ANGLE_TRY(getSwizzleTexture(&swizzleTexture));
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
@@ -2906,7 +2865,7 @@ gl::Error TextureStorage11_2DArray::getSwizzleRenderTarget(int mipLevel,
rtvDesc.Texture2DArray.FirstArraySlice = 0;
rtvDesc.Texture2DArray.ArraySize = mTextureDepth;
- ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture,
+ ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mSwizzleTexture.get(),
&mSwizzleRenderTargets[mipLevel]));
}
@@ -2914,10 +2873,10 @@ gl::Error TextureStorage11_2DArray::getSwizzleRenderTarget(int mipLevel,
return gl::NoError();
}
-gl::ErrorOrResult<TextureStorage11::DropStencil>
-TextureStorage11_2DArray::ensureDropStencilTexture()
+gl::ErrorOrResult<TextureStorage11::DropStencil> TextureStorage11_2DArray::ensureDropStencilTexture(
+ const gl::Context *context)
{
- if (mDropStencilTexture)
+ if (mDropStencilTexture.valid())
{
return DropStencil::ALREADY_EXISTS;
}
@@ -2935,21 +2894,226 @@ TextureStorage11_2DArray::ensureDropStencilTexture()
dropDesc.Usage = D3D11_USAGE_DEFAULT;
dropDesc.Width = mTextureWidth;
- ID3D11Device *device = mRenderer->getDevice();
-
- HRESULT hr = device->CreateTexture2D(&dropDesc, nullptr, &mDropStencilTexture);
- if (FAILED(hr))
- {
- return gl::InternalError() << "Error creating drop stencil texture.";
- }
- d3d11::SetDebugName(mDropStencilTexture, "TexStorage2DArray.DropStencil");
+ 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(
- gl::ImageIndexIterator::Make2DArray(0, mMipLevels, layerCounts.data())));
+ 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,
+ GLboolean 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)
+{
+ mRenderTarget.reset();
+ delete this;
+
+ 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 = 0;
+
+ 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) const
+{
+ 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/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h
index 4be8988e07a..1f28f76fd06 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h
@@ -13,7 +13,7 @@
#include "libANGLE/Error.h"
#include "libANGLE/Texture.h"
#include "libANGLE/renderer/d3d/TextureStorage.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"
#include <array>
@@ -45,16 +45,25 @@ class TextureStorage11 : public TextureStorage
UINT getBindFlags() const;
UINT getMiscFlags() const;
const d3d11::Format &getFormatSet() const;
- gl::Error getSRVLevels(GLint baseLevel, GLint maxLevel, d3d11::SharedSRV *outSRV);
- gl::Error generateSwizzles(const gl::SwizzleState &swizzleTarget);
+ 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(ID3D11Resource *texture, unsigned int sourceSubresource,
- const gl::ImageIndex &index, const gl::Box &copyArea);
+ gl::Error updateSubresourceLevel(const gl::Context *context,
+ const TextureHelper11 &texture,
+ unsigned int sourceSubresource,
+ const gl::ImageIndex &index,
+ const gl::Box &copyArea);
- gl::Error copySubresourceLevel(ID3D11Resource* dstTexture, unsigned int dstSubresource,
- const gl::ImageIndex &index, const gl::Box &region);
+ 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;
@@ -62,24 +71,31 @@ class TextureStorage11 : public TextureStorage
bool isManaged() const override;
bool supportsNativeMipmapFunction() const override;
int getLevelCount() const override;
- gl::Error generateMipmap(const gl::ImageIndex &sourceIndex,
+ gl::Error generateMipmap(const gl::Context *context,
+ const gl::ImageIndex &sourceIndex,
const gl::ImageIndex &destIndex) override;
- gl::Error copyToStorage(TextureStorage *destStorage) override;
- gl::Error setData(const gl::ImageIndex &index,
+ 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::TextureState &textureState, d3d11::SharedSRV *outSRV);
+ 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(ID3D11Resource **outResource) = 0;
+ 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::ImageIndex &index, Image11* incomingImage) = 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);
@@ -88,12 +104,19 @@ class TextureStorage11 : public TextureStorage
int getLevelDepth(int mipLevel) const;
// Some classes (e.g. TextureStorage11_2D) will override getMippedResource.
- virtual gl::Error getMippedResource(ID3D11Resource **outResource) { return getResource(outResource); }
+ virtual gl::Error getMippedResource(const gl::Context *context,
+ const TextureHelper11 **outResource)
+ {
+ return getResource(context, outResource);
+ }
- virtual gl::Error getSwizzleTexture(ID3D11Resource **outTexture) = 0;
+ virtual gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) = 0;
virtual gl::Error getSwizzleRenderTarget(int mipLevel,
const d3d11::RenderTargetView **outRTV) = 0;
- gl::Error getSRVLevel(int mipLevel, bool blitSRV, const d3d11::SharedSRV **outSRV);
+ 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
@@ -101,14 +124,15 @@ class TextureStorage11 : public TextureStorage
CREATED,
ALREADY_EXISTS
};
- virtual gl::ErrorOrResult<DropStencil> ensureDropStencilTexture();
- gl::Error initDropStencilTexture(const gl::ImageIndexIterator &it);
+ 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(int baseLevel,
+ virtual gl::Error createSRV(const gl::Context *context,
+ int baseLevel,
int mipLevels,
DXGI_FORMAT format,
- ID3D11Resource *texture,
+ const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) const = 0;
void verifySwizzleExists(const gl::SwizzleState &swizzleState);
@@ -126,7 +150,7 @@ class TextureStorage11 : public TextureStorage
unsigned int mTextureDepth;
gl::SwizzleState mSwizzleCache[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
- ID3D11Texture2D *mDropStencilTexture;
+ TextureHelper11 mDropStencilTexture;
private:
const UINT mBindFlags;
@@ -145,7 +169,9 @@ class TextureStorage11 : public TextureStorage
};
typedef std::map<SRVKey, d3d11::SharedSRV> SRVCache;
- gl::Error getCachedOrCreateSRV(const SRVKey &key, d3d11::SharedSRV *outSRV);
+ gl::Error getCachedOrCreateSRV(const gl::Context *context,
+ const SRVKey &key,
+ const d3d11::SharedSRV **outSRV);
SRVCache mSrvCache;
std::array<d3d11::SharedSRV, gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS> mLevelSRVs;
@@ -159,35 +185,43 @@ class TextureStorage11_2D : public TextureStorage11
TextureStorage11_2D(Renderer11 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels, bool hintLevelZeroOnly = false);
~TextureStorage11_2D() override;
- gl::Error getResource(ID3D11Resource **outResource) override;
- gl::Error getMippedResource(ID3D11Resource **outResource) override;
- gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT) 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(TextureStorage *destStorage) 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::ImageIndex &index, Image11 *incomingImage) override;
+ gl::Error releaseAssociatedImage(const gl::Context *context,
+ const gl::ImageIndex &index,
+ Image11 *incomingImage) override;
gl::Error useLevelZeroWorkaroundTexture(bool useLevelZeroTexture) override;
protected:
- gl::Error getSwizzleTexture(ID3D11Resource **outTexture) override;
+ gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
- gl::ErrorOrResult<DropStencil> ensureDropStencilTexture() override;
+ gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override;
gl::Error ensureTextureExists(int mipLevels);
private:
- gl::Error createSRV(int baseLevel,
+ gl::Error createSRV(const gl::Context *context,
+ int baseLevel,
int mipLevels,
DXGI_FORMAT format,
- ID3D11Resource *texture,
+ const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) const override;
- ID3D11Texture2D *mTexture;
+ TextureHelper11 mTexture;
RenderTarget11 *mRenderTarget[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
bool mHasKeyedMutex;
@@ -200,12 +234,12 @@ class TextureStorage11_2D : public TextureStorage11
// 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.
- ID3D11Texture2D *mLevelZeroTexture;
+ TextureHelper11 mLevelZeroTexture;
RenderTarget11 *mLevelZeroRenderTarget;
bool mUseLevelZeroTexture;
// Swizzle-related variables
- ID3D11Texture2D *mSwizzleTexture;
+ TextureHelper11 mSwizzleTexture;
d3d11::RenderTargetView mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
Image11 *mAssociatedImages[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
@@ -219,29 +253,37 @@ class TextureStorage11_External : public TextureStorage11
const egl::Stream::GLTextureDescription &glDesc);
~TextureStorage11_External() override;
- gl::Error getResource(ID3D11Resource **outResource) override;
- gl::Error getMippedResource(ID3D11Resource **outResource) override;
- gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT) override;
+ gl::Error onDestroy(const gl::Context *context) override;
- gl::Error copyToStorage(TextureStorage *destStorage) 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::ImageIndex &index, Image11 *incomingImage) override;
+ gl::Error releaseAssociatedImage(const gl::Context *context,
+ const gl::ImageIndex &index,
+ Image11 *incomingImage) override;
protected:
- gl::Error getSwizzleTexture(ID3D11Resource **outTexture) override;
+ gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
private:
- gl::Error createSRV(int baseLevel,
+ gl::Error createSRV(const gl::Context *context,
+ int baseLevel,
int mipLevels,
DXGI_FORMAT format,
- ID3D11Resource *texture,
+ const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) const override;
- ID3D11Texture2D *mTexture;
+ TextureHelper11 mTexture;
int mSubresourceIndex;
bool mHasKeyedMutex;
@@ -256,42 +298,50 @@ class TextureStorage11_EGLImage final : public TextureStorage11
RenderTarget11 *renderTarget11);
~TextureStorage11_EGLImage() override;
- gl::Error getResource(ID3D11Resource **outResource) override;
- gl::Error getSRV(const gl::TextureState &textureState, d3d11::SharedSRV *outSRV) override;
- gl::Error getMippedResource(ID3D11Resource **outResource) override;
- gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT) 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(TextureStorage *destStorage) 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::ImageIndex &index, Image11 *incomingImage) override;
+ gl::Error releaseAssociatedImage(const gl::Context *context,
+ const gl::ImageIndex &index,
+ Image11 *incomingImage) override;
gl::Error useLevelZeroWorkaroundTexture(bool useLevelZeroTexture) override;
protected:
- gl::Error getSwizzleTexture(ID3D11Resource **outTexture) override;
+ 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();
+ gl::Error checkForUpdatedRenderTarget(const gl::Context *context);
- gl::Error createSRV(int baseLevel,
+ gl::Error createSRV(const gl::Context *context,
+ int baseLevel,
int mipLevels,
DXGI_FORMAT format,
- ID3D11Resource *texture,
+ const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) const override;
- gl::Error getImageRenderTarget(RenderTarget11 **outRT) const;
+ gl::Error getImageRenderTarget(const gl::Context *context, RenderTarget11 **outRT) const;
EGLImageD3D *mImage;
uintptr_t mCurrentRenderTarget;
// Swizzle-related variables
- ID3D11Texture2D *mSwizzleTexture;
+ TextureHelper11 mSwizzleTexture;
std::vector<d3d11::RenderTargetView> mSwizzleRenderTargets;
};
@@ -301,51 +351,59 @@ class TextureStorage11_Cube : public TextureStorage11
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(ID3D11Resource **outResource) override;
- gl::Error getMippedResource(ID3D11Resource **outResource) override;
- gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT) 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(TextureStorage *destStorage) 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::ImageIndex &index, Image11 *incomingImage) override;
+ gl::Error releaseAssociatedImage(const gl::Context *context,
+ const gl::ImageIndex &index,
+ Image11 *incomingImage) override;
gl::Error useLevelZeroWorkaroundTexture(bool useLevelZeroTexture) override;
protected:
- gl::Error getSwizzleTexture(ID3D11Resource **outTexture) override;
+ gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
- gl::ErrorOrResult<DropStencil> ensureDropStencilTexture() override;
+ gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override;
gl::Error ensureTextureExists(int mipLevels);
private:
- gl::Error createSRV(int baseLevel,
+ gl::Error createSRV(const gl::Context *context,
+ int baseLevel,
int mipLevels,
DXGI_FORMAT format,
- ID3D11Resource *texture,
+ const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) const override;
- gl::Error createRenderTargetSRV(ID3D11Resource *texture,
+ gl::Error createRenderTargetSRV(const TextureHelper11 &texture,
const gl::ImageIndex &index,
DXGI_FORMAT resourceFormat,
d3d11::SharedSRV *srv) const;
static const size_t CUBE_FACE_COUNT = 6;
- ID3D11Texture2D *mTexture;
+ TextureHelper11 mTexture;
RenderTarget11 *mRenderTarget[CUBE_FACE_COUNT][gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
// Level-zero workaround members. See TextureStorage11_2D's workaround members for a description.
- ID3D11Texture2D *mLevelZeroTexture;
+ TextureHelper11 mLevelZeroTexture;
RenderTarget11 *mLevelZeroRenderTarget[CUBE_FACE_COUNT];
bool mUseLevelZeroTexture;
- ID3D11Texture2D *mSwizzleTexture;
+ TextureHelper11 mSwizzleTexture;
d3d11::RenderTargetView mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
Image11 *mAssociatedImages[CUBE_FACE_COUNT][gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
@@ -358,25 +416,32 @@ class TextureStorage11_3D : public TextureStorage11
GLsizei width, GLsizei height, GLsizei depth, int levels);
~TextureStorage11_3D() override;
- gl::Error getResource(ID3D11Resource **outResource) 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::ImageIndex &index, RenderTargetD3D **outRT) 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::ImageIndex &index, Image11 *incomingImage) override;
+ gl::Error releaseAssociatedImage(const gl::Context *context,
+ const gl::ImageIndex &index,
+ Image11 *incomingImage) override;
protected:
- gl::Error getSwizzleTexture(ID3D11Resource **outTexture) override;
+ gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
private:
- gl::Error createSRV(int baseLevel,
+ gl::Error createSRV(const gl::Context *context,
+ int baseLevel,
int mipLevels,
DXGI_FORMAT format,
- ID3D11Resource *texture,
+ const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) const override;
typedef std::pair<int, int> LevelLayerKey;
@@ -385,8 +450,8 @@ class TextureStorage11_3D : public TextureStorage11
RenderTarget11 *mLevelRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
- ID3D11Texture3D *mTexture;
- ID3D11Texture3D *mSwizzleTexture;
+ TextureHelper11 mTexture;
+ TextureHelper11 mSwizzleTexture;
d3d11::RenderTargetView mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
Image11 *mAssociatedImages[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
@@ -399,27 +464,34 @@ class TextureStorage11_2DArray : public TextureStorage11
GLsizei width, GLsizei height, GLsizei depth, int levels);
~TextureStorage11_2DArray() override;
- gl::Error getResource(ID3D11Resource **outResource) override;
- gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT) 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::ImageIndex &index, Image11 *incomingImage) override;
+ gl::Error releaseAssociatedImage(const gl::Context *context,
+ const gl::ImageIndex &index,
+ Image11 *incomingImage) override;
protected:
- gl::Error getSwizzleTexture(ID3D11Resource **outTexture) override;
+ gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
- gl::ErrorOrResult<DropStencil> ensureDropStencilTexture() override;
+ gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override;
private:
- gl::Error createSRV(int baseLevel,
+ gl::Error createSRV(const gl::Context *context,
+ int baseLevel,
int mipLevels,
DXGI_FORMAT format,
- ID3D11Resource *texture,
+ const TextureHelper11 &texture,
d3d11::SharedSRV *outSRV) const override;
- gl::Error createRenderTargetSRV(ID3D11Resource *texture,
+ gl::Error createRenderTargetSRV(const TextureHelper11 &texture,
const gl::ImageIndex &index,
DXGI_FORMAT resourceFormat,
d3d11::SharedSRV *srv) const;
@@ -428,15 +500,65 @@ class TextureStorage11_2DArray : public TextureStorage11
typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap;
RenderTargetMap mRenderTargets;
- ID3D11Texture2D *mTexture;
+ TextureHelper11 mTexture;
- ID3D11Texture2D *mSwizzleTexture;
+ TextureHelper11 mSwizzleTexture;
d3d11::RenderTargetView mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
typedef std::map<LevelLayerKey, Image11*> ImageMap;
ImageMap mAssociatedImages;
};
+class TextureStorage11_2DMultisample : public TextureStorage11
+{
+ public:
+ TextureStorage11_2DMultisample(Renderer11 *renderer,
+ GLenum internalformat,
+ GLsizei width,
+ GLsizei height,
+ int levels,
+ int samples,
+ GLboolean 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) const override;
+
+ TextureHelper11 mTexture;
+ std::unique_ptr<RenderTarget11> mRenderTarget;
+
+ unsigned int mSamples;
+ GLboolean mFixedSampleLocations;
+};
}
#endif // LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.cpp
index 39b293f9b09..240d6d26fac 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.cpp
@@ -31,6 +31,20 @@ 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()
@@ -49,12 +63,12 @@ void TransformFeedback11::resume()
{
}
-void TransformFeedback11::bindGenericBuffer(const BindingPointer<gl::Buffer> &binding)
+void TransformFeedback11::bindGenericBuffer(const gl::BindingPointer<gl::Buffer> &binding)
{
}
void TransformFeedback11::bindIndexedBuffer(size_t index,
- const OffsetBindingPointer<gl::Buffer> &binding)
+ const gl::OffsetBindingPointer<gl::Buffer> &binding)
{
mIsDirty = true;
mBufferOffsets[index] = static_cast<UINT>(binding.getOffset());
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.h
index 01879d6f3af..8a7cdd19750 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.h
@@ -31,8 +31,9 @@ class TransformFeedback11 : public TransformFeedbackImpl
void pause() override;
void resume() override;
- void bindGenericBuffer(const BindingPointer<gl::Buffer> &binding) override;
- void bindIndexedBuffer(size_t index, const OffsetBindingPointer<gl::Buffer> &binding) override;
+ void bindGenericBuffer(const gl::BindingPointer<gl::Buffer> &binding) override;
+ void bindIndexedBuffer(size_t index,
+ const gl::OffsetBindingPointer<gl::Buffer> &binding) override;
void onApply();
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp
index 73814a7aa2a..4697a87cc25 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp
@@ -10,7 +10,9 @@
#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;
@@ -29,34 +31,35 @@ VertexArray11::VertexArray11(const gl::VertexArrayState &data)
}
}
-VertexArray11::~VertexArray11()
+void VertexArray11::destroy(const gl::Context *context)
{
for (auto &buffer : mCurrentBuffers)
{
if (buffer.get())
{
- buffer.set(nullptr);
+ buffer.set(context, nullptr);
}
}
}
-void VertexArray11::syncState(ContextImpl *contextImpl, const gl::VertexArray::DirtyBits &dirtyBits)
+void VertexArray11::syncState(const gl::Context *context,
+ const gl::VertexArray::DirtyBits &dirtyBits)
{
for (auto dirtyBit : dirtyBits)
{
if (dirtyBit == gl::VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER)
continue;
- size_t index = gl::VertexArray::GetAttribIndex(dirtyBit);
+ size_t index = gl::VertexArray::GetVertexIndexFromDirtyBit(dirtyBit);
// TODO(jiawei.shao@intel.com): Vertex Attrib Bindings
ASSERT(index == mData.getBindingIndexFromAttribIndex(index));
mAttribsToUpdate.set(index);
}
}
-void VertexArray11::flushAttribUpdates(const gl::State &state)
+void VertexArray11::flushAttribUpdates(const gl::Context *context)
{
- const gl::Program *program = state.getProgram();
+ const gl::Program *program = context->getGLState().getProgram();
const auto &activeLocations = program->getActiveAttribLocationsMask();
if (mAttribsToUpdate.any())
@@ -67,12 +70,12 @@ void VertexArray11::flushAttribUpdates(const gl::State &state)
for (auto toUpdateIndex : activeToUpdate)
{
mAttribsToUpdate.reset(toUpdateIndex);
- updateVertexAttribStorage(toUpdateIndex);
+ updateVertexAttribStorage(context, toUpdateIndex);
}
}
}
-void VertexArray11::updateVertexAttribStorage(size_t attribIndex)
+void VertexArray11::updateVertexAttribStorage(const gl::Context *context, size_t attribIndex)
{
const auto &attrib = mData.getVertexAttribute(attribIndex);
const auto &binding = mData.getBindingFromAttribIndex(attribIndex);
@@ -104,7 +107,7 @@ void VertexArray11::updateVertexAttribStorage(size_t attribIndex)
}
gl::Buffer *oldBufferGL = mCurrentBuffers[attribIndex].get();
- gl::Buffer *newBufferGL = binding.buffer.get();
+ gl::Buffer *newBufferGL = binding.getBuffer().get();
Buffer11 *oldBuffer11 = oldBufferGL ? GetImplAs<Buffer11>(oldBufferGL) : nullptr;
Buffer11 *newBuffer11 = newBufferGL ? GetImplAs<Buffer11>(newBufferGL) : nullptr;
@@ -129,25 +132,26 @@ void VertexArray11::updateVertexAttribStorage(size_t attribIndex)
}
}
mOnBufferDataDirty[attribIndex].bind(newChannel);
- mCurrentBuffers[attribIndex] = binding.buffer;
+ mCurrentBuffers[attribIndex].set(context, binding.getBuffer().get());
}
}
-bool VertexArray11::hasDynamicAttrib(const gl::State &state)
+bool VertexArray11::hasDynamicAttrib(const gl::Context *context)
{
- flushAttribUpdates(state);
+ flushAttribUpdates(context);
return mDynamicAttribsMask.any();
}
-gl::Error VertexArray11::updateDirtyAndDynamicAttribs(VertexDataManager *vertexDataManager,
- const gl::State &state,
+gl::Error VertexArray11::updateDirtyAndDynamicAttribs(const gl::Context *context,
+ VertexDataManager *vertexDataManager,
GLint start,
GLsizei count,
GLsizei instances)
{
- flushAttribUpdates(state);
+ flushAttribUpdates(context);
- const gl::Program *program = state.getProgram();
+ const auto &glState = context->getGLState();
+ const gl::Program *program = glState.getProgram();
const auto &activeLocations = program->getActiveAttribLocationsMask();
const auto &attribs = mData.getVertexAttributes();
const auto &bindings = mData.getVertexBindings();
@@ -162,13 +166,13 @@ gl::Error VertexArray11::updateDirtyAndDynamicAttribs(VertexDataManager *vertexD
mAttribsToTranslate.reset(dirtyAttribIndex);
auto *translatedAttrib = &mTranslatedAttribs[dirtyAttribIndex];
- const auto &currentValue = state.getVertexAttribCurrentValue(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->divisor;
+ translatedAttrib->divisor = translatedAttrib->binding->getDivisor();
switch (mAttributeStorageTypes[dirtyAttribIndex])
{
@@ -197,13 +201,13 @@ gl::Error VertexArray11::updateDirtyAndDynamicAttribs(VertexDataManager *vertexD
for (auto dynamicAttribIndex : activeDynamicAttribs)
{
auto *dynamicAttrib = &mTranslatedAttribs[dynamicAttribIndex];
- const auto &currentValue = state.getVertexAttribCurrentValue(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->divisor;
+ dynamicAttrib->divisor = dynamicAttrib->binding->getDivisor();
}
return vertexDataManager->storeDynamicAttribs(&mTranslatedAttribs, activeDynamicAttribs,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h
index 4fda4341920..449ca596958 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h
@@ -22,13 +22,14 @@ class VertexArray11 : public VertexArrayImpl, public OnBufferDataDirtyReceiver
{
public:
VertexArray11(const gl::VertexArrayState &data);
- ~VertexArray11() override;
+ void destroy(const gl::Context *context) override;
- void syncState(ContextImpl *contextImpl, const gl::VertexArray::DirtyBits &dirtyBits) 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 hasDynamicAttrib(const gl::State &state);
- gl::Error updateDirtyAndDynamicAttribs(VertexDataManager *vertexDataManager,
- const gl::State &state,
+ bool hasDynamicAttrib(const gl::Context *context);
+ gl::Error updateDirtyAndDynamicAttribs(const gl::Context *context,
+ VertexDataManager *vertexDataManager,
GLint start,
GLsizei count,
GLsizei instances);
@@ -40,8 +41,8 @@ class VertexArray11 : public VertexArrayImpl, public OnBufferDataDirtyReceiver
void signal(size_t channelID) override;
private:
- void updateVertexAttribStorage(size_t attribIndex);
- void flushAttribUpdates(const gl::State &state);
+ void updateVertexAttribStorage(const gl::Context *context, size_t attribIndex);
+ void flushAttribUpdates(const gl::Context *context);
std::vector<VertexStorageType> mAttributeStorageTypes;
std::vector<TranslatedAttribute> mTranslatedAttribs;
@@ -56,7 +57,7 @@ class VertexArray11 : public VertexArrayImpl, public OnBufferDataDirtyReceiver
gl::AttributesMask mAttribsToTranslate;
// We need to keep a safe pointer to the Buffer so we can attach the correct dirty callbacks.
- std::vector<BindingPointer<gl::Buffer>> mCurrentBuffers;
+ std::vector<gl::BindingPointer<gl::Buffer>> mCurrentBuffers;
std::vector<OnBufferDataDirtyBinding> mOnBufferDataDirty;
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp
index 15ca724136a..611bd0f18ba 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp
@@ -19,30 +19,27 @@
namespace rx
{
-VertexBuffer11::VertexBuffer11(Renderer11 *const renderer) : mRenderer(renderer)
+VertexBuffer11::VertexBuffer11(Renderer11 *const renderer)
+ : mRenderer(renderer),
+ mBuffer(),
+ mBufferSize(0),
+ mDynamicUsage(false),
+ mMappedResourceData(nullptr)
{
- mBuffer = nullptr;
- mBufferSize = 0;
- mDynamicUsage = false;
- mMappedResourceData = nullptr;
}
VertexBuffer11::~VertexBuffer11()
{
ASSERT(mMappedResourceData == nullptr);
- SafeRelease(mBuffer);
}
gl::Error VertexBuffer11::initialize(unsigned int size, bool dynamicUsage)
{
- SafeRelease(mBuffer);
-
+ mBuffer.reset();
updateSerial();
if (size > 0)
{
- ID3D11Device *dxDevice = mRenderer->getDevice();
-
D3D11_BUFFER_DESC bufferDesc;
bufferDesc.ByteWidth = size;
bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
@@ -51,20 +48,15 @@ gl::Error VertexBuffer11::initialize(unsigned int size, bool dynamicUsage)
bufferDesc.MiscFlags = 0;
bufferDesc.StructureByteStride = 0;
- HRESULT result = dxDevice->CreateBuffer(&bufferDesc, nullptr, &mBuffer);
- if (FAILED(result))
- {
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to allocate internal vertex buffer of size, %lu.", size);
- }
+ ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &mBuffer));
if (dynamicUsage)
{
- d3d11::SetDebugName(mBuffer, "VertexBuffer11 (dynamic)");
+ mBuffer.setDebugName("VertexBuffer11 (dynamic)");
}
else
{
- d3d11::SetDebugName(mBuffer, "VertexBuffer11 (static)");
+ mBuffer.setDebugName("VertexBuffer11 (static)");
}
}
@@ -83,11 +75,11 @@ gl::Error VertexBuffer11::mapResource()
D3D11_MAPPED_SUBRESOURCE mappedResource;
HRESULT result =
- dxContext->Map(mBuffer, 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedResource);
+ dxContext->Map(mBuffer.get(), 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedResource);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to map internal vertex buffer, HRESULT: 0x%08x.", result);
+ return gl::OutOfMemory()
+ << "Failed to map internal vertex buffer, " << gl::FmtHR(result);
}
mMappedResourceData = reinterpret_cast<uint8_t *>(mappedResource.pData);
@@ -101,7 +93,7 @@ void VertexBuffer11::hintUnmapResource()
if (mMappedResourceData != nullptr)
{
ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
- dxContext->Unmap(mBuffer, 0);
+ dxContext->Unmap(mBuffer.get(), 0);
mMappedResourceData = nullptr;
}
@@ -116,9 +108,9 @@ gl::Error VertexBuffer11::storeVertexAttributes(const gl::VertexAttribute &attri
unsigned int offset,
const uint8_t *sourceData)
{
- if (!mBuffer)
+ if (!mBuffer.valid())
{
- return gl::Error(GL_OUT_OF_MEMORY, "Internal vertex buffer is not initialized.");
+ return gl::OutOfMemory() << "Internal vertex buffer is not initialized.";
}
int inputStride = static_cast<int>(ComputeVertexAttributeStride(attrib, binding));
@@ -130,7 +122,7 @@ gl::Error VertexBuffer11::storeVertexAttributes(const gl::VertexAttribute &attri
const uint8_t *input = sourceData;
- if (instances == 0 || binding.divisor == 0)
+ if (instances == 0 || binding.getDivisor() == 0)
{
input += inputStride * start;
}
@@ -164,27 +156,27 @@ gl::Error VertexBuffer11::setBufferSize(unsigned int size)
gl::Error VertexBuffer11::discard()
{
- if (!mBuffer)
+ if (!mBuffer.valid())
{
- return gl::Error(GL_OUT_OF_MEMORY, "Internal vertex buffer is not initialized.");
+ return gl::OutOfMemory() << "Internal vertex buffer is not initialized.";
}
ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
D3D11_MAPPED_SUBRESOURCE mappedResource;
- HRESULT result = dxContext->Map(mBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
+ HRESULT result = dxContext->Map(mBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to map internal buffer for discarding, HRESULT: 0x%08x", result);
+ return gl::OutOfMemory() << "Failed to map internal buffer for discarding, "
+ << gl::FmtHR(result);
}
- dxContext->Unmap(mBuffer, 0);
+ dxContext->Unmap(mBuffer.get(), 0);
return gl::NoError();
}
-ID3D11Buffer *VertexBuffer11::getBuffer() const
+const d3d11::Buffer &VertexBuffer11::getBuffer() const
{
return mBuffer;
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.h
index 038ba4284c4..ab619ae5030 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.h
@@ -12,6 +12,7 @@
#include <stdint.h>
#include "libANGLE/renderer/d3d/VertexBuffer.h"
+#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
namespace rx
{
@@ -41,7 +42,7 @@ class VertexBuffer11 : public VertexBuffer
void hintUnmapResource() override;
- ID3D11Buffer *getBuffer() const;
+ const d3d11::Buffer &getBuffer() const;
private:
~VertexBuffer11() override;
@@ -49,7 +50,7 @@ class VertexBuffer11 : public VertexBuffer
Renderer11 *const mRenderer;
- ID3D11Buffer *mBuffer;
+ d3d11::Buffer mBuffer;
unsigned int mBufferSize;
bool mDynamicUsage;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h
index 1d8d68565e6..a818f376ef3 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h
@@ -8,6 +8,9 @@
// 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
@@ -42,3 +45,5 @@ const DXGISupport &GetDXGISupport(DXGI_FORMAT dxgiFormat, D3D_FEATURE_LEVEL feat
} // namespace d3d11
} // namespace rx
+
+#endif // LIBANGLE_RENDERER_D3D_D3D11_DXGI_SUPPORT_TABLE_H_
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
index cd45b21c9c4..0b7815dfffe 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
@@ -1294,6 +1294,7 @@ void GenerateCaps(ID3D11Device *device, ID3D11DeviceContext *deviceContext, cons
// Multisample limits
caps->maxSamples = maxSamples;
+ caps->maxColorTextureSamples = maxSamples;
// GL extension support
extensions->setTextureExtensionSupport(*textureCapsMap);
@@ -1793,7 +1794,10 @@ void MakeValidSize(bool isImage, DXGI_FORMAT format, GLsizei *requestWidth, GLsi
upsampleCount++;
}
}
- *levelOffset = upsampleCount;
+ if (levelOffset)
+ {
+ *levelOffset = upsampleCount;
+ }
}
void GenerateInitialTextureData(GLint internalFormat,
@@ -1856,6 +1860,36 @@ void SetPositionLayerTexCoord3DVertex(PositionLayerTexCoord3DVertex* vertex, flo
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)
@@ -1894,36 +1928,9 @@ HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name)
#endif
}
-LazyInputLayout::LazyInputLayout(const D3D11_INPUT_ELEMENT_DESC *inputDesc,
- size_t inputDescLen,
- const BYTE *byteCode,
- size_t byteCodeLen,
- const char *debugName)
- : mInputDesc(inputDescLen),
- mByteCodeLen(byteCodeLen),
- mByteCode(byteCode),
- mDebugName(debugName)
+gl::Error LazyInputLayout::resolve(Renderer11 *renderer)
{
- if (inputDesc)
- {
- memcpy(&mInputDesc[0], inputDesc, sizeof(D3D11_INPUT_ELEMENT_DESC) * inputDescLen);
- }
-}
-
-ID3D11InputLayout *LazyInputLayout::resolve(ID3D11Device *device)
-{
- checkAssociatedDevice(device);
-
- if (mResource == nullptr && mByteCode != nullptr)
- {
- HRESULT result =
- device->CreateInputLayout(&mInputDesc[0], static_cast<UINT>(mInputDesc.size()),
- mByteCode, mByteCodeLen, &mResource);
- ASSERT(SUCCEEDED(result));
- d3d11::SetDebugName(mResource, mDebugName);
- }
-
- return mResource;
+ return resolveImpl(renderer, mInputDesc, &mByteCode, mDebugName);
}
LazyBlendState::LazyBlendState(const D3D11_BLEND_DESC &desc, const char *debugName)
@@ -1931,18 +1938,9 @@ LazyBlendState::LazyBlendState(const D3D11_BLEND_DESC &desc, const char *debugNa
{
}
-ID3D11BlendState *LazyBlendState::resolve(ID3D11Device *device)
+gl::Error LazyBlendState::resolve(Renderer11 *renderer)
{
- checkAssociatedDevice(device);
-
- if (mResource == nullptr)
- {
- HRESULT result = device->CreateBlendState(&mDesc, &mResource);
- ASSERT(SUCCEEDED(result));
- d3d11::SetDebugName(mResource, mDebugName);
- }
-
- return mResource;
+ return resolveImpl(renderer, mDesc, nullptr, mDebugName);
}
angle::WorkaroundsD3D GenerateWorkarounds(const Renderer11DeviceCaps &deviceCaps,
@@ -2031,136 +2029,80 @@ void InitConstantBufferDesc(D3D11_BUFFER_DESC *constantBufferDescription, size_t
} // namespace d3d11
-TextureHelper11::TextureHelper11()
- : mTextureType(GL_NONE),
- mFormat(DXGI_FORMAT_UNKNOWN),
- mFormatSet(nullptr),
- mSampleCount(0),
- mTexture2D(nullptr),
- mTexture3D(nullptr)
+// TextureHelper11 implementation.
+TextureHelper11::TextureHelper11() : mFormatSet(nullptr), mSampleCount(0)
{
}
-TextureHelper11::TextureHelper11(TextureHelper11 &&toCopy)
- : mTextureType(toCopy.mTextureType),
- mExtents(toCopy.mExtents),
- mFormat(toCopy.mFormat),
- mFormatSet(toCopy.mFormatSet),
- mSampleCount(toCopy.mSampleCount),
- mTexture2D(toCopy.mTexture2D),
- mTexture3D(toCopy.mTexture3D)
+TextureHelper11::TextureHelper11(TextureHelper11 &&toCopy) : TextureHelper11()
{
- toCopy.reset();
+ *this = std::move(toCopy);
}
-// static
-TextureHelper11 TextureHelper11::MakeAndReference(ID3D11Resource *genericResource,
- const d3d11::Format &formatSet)
+TextureHelper11::TextureHelper11(const TextureHelper11 &other)
+ : mFormatSet(other.mFormatSet), mExtents(other.mExtents), mSampleCount(other.mSampleCount)
{
- TextureHelper11 newHelper;
- newHelper.mFormatSet = &formatSet;
- newHelper.mTexture2D = d3d11::DynamicCastComObject<ID3D11Texture2D>(genericResource);
- newHelper.mTexture3D = d3d11::DynamicCastComObject<ID3D11Texture3D>(genericResource);
- newHelper.mTextureType = newHelper.mTexture2D ? GL_TEXTURE_2D : GL_TEXTURE_3D;
- newHelper.initDesc();
- return newHelper;
+ mData = other.mData;
}
-// static
-TextureHelper11 TextureHelper11::MakeAndPossess2D(ID3D11Texture2D *texToOwn,
- const d3d11::Format &formatSet)
+TextureHelper11::~TextureHelper11()
{
- TextureHelper11 newHelper;
- newHelper.mFormatSet = &formatSet;
- newHelper.mTexture2D = texToOwn;
- newHelper.mTextureType = GL_TEXTURE_2D;
- newHelper.initDesc();
- return newHelper;
}
-// static
-TextureHelper11 TextureHelper11::MakeAndPossess3D(ID3D11Texture3D *texToOwn,
- const d3d11::Format &formatSet)
+void TextureHelper11::getDesc(D3D11_TEXTURE2D_DESC *desc) const
{
- TextureHelper11 newHelper;
- newHelper.mFormatSet = &formatSet;
- newHelper.mTexture3D = texToOwn;
- newHelper.mTextureType = GL_TEXTURE_3D;
- newHelper.initDesc();
- return newHelper;
+ static_cast<ID3D11Texture2D *>(mData->object)->GetDesc(desc);
}
-void TextureHelper11::initDesc()
+void TextureHelper11::getDesc(D3D11_TEXTURE3D_DESC *desc) const
{
- if (mTextureType == GL_TEXTURE_2D)
- {
- ASSERT(!mTexture3D);
- D3D11_TEXTURE2D_DESC desc2D;
- mTexture2D->GetDesc(&desc2D);
-
- mExtents.width = static_cast<int>(desc2D.Width);
- mExtents.height = static_cast<int>(desc2D.Height);
- mExtents.depth = 1;
- mFormat = desc2D.Format;
- mSampleCount = desc2D.SampleDesc.Count;
- }
- else
- {
- ASSERT(mTexture3D && mTextureType == GL_TEXTURE_3D);
- D3D11_TEXTURE3D_DESC desc3D;
- mTexture3D->GetDesc(&desc3D);
-
- mExtents.width = static_cast<int>(desc3D.Width);
- mExtents.height = static_cast<int>(desc3D.Height);
- mExtents.depth = static_cast<int>(desc3D.Depth);
- mFormat = desc3D.Format;
- mSampleCount = 1;
- }
- ASSERT(mFormatSet && mFormat == mFormatSet->texFormat);
+ static_cast<ID3D11Texture3D *>(mData->object)->GetDesc(desc);
}
-TextureHelper11::~TextureHelper11()
+void TextureHelper11::initDesc(const D3D11_TEXTURE2D_DESC &desc2D)
{
- SafeRelease(mTexture2D);
- SafeRelease(mTexture3D);
+ 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;
}
-ID3D11Resource *TextureHelper11::getResource() const
+void TextureHelper11::initDesc(const D3D11_TEXTURE3D_DESC &desc3D)
{
- return mTexture2D ? static_cast<ID3D11Resource *>(mTexture2D)
- : static_cast<ID3D11Resource *>(mTexture3D);
+ 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 &&texture)
+TextureHelper11 &TextureHelper11::operator=(TextureHelper11 &&other)
{
- SafeRelease(mTexture2D);
- SafeRelease(mTexture3D);
+ std::swap(mData, other.mData);
+ std::swap(mExtents, other.mExtents);
+ std::swap(mFormatSet, other.mFormatSet);
+ std::swap(mSampleCount, other.mSampleCount);
+ return *this;
+}
- mTextureType = texture.mTextureType;
- mExtents = texture.mExtents;
- mFormat = texture.mFormat;
- mFormatSet = texture.mFormatSet;
- mSampleCount = texture.mSampleCount;
- mTexture2D = texture.mTexture2D;
- mTexture3D = texture.mTexture3D;
- texture.reset();
+TextureHelper11 &TextureHelper11::operator=(const TextureHelper11 &other)
+{
+ mData = other.mData;
+ mExtents = other.mExtents;
+ mFormatSet = other.mFormatSet;
+ mSampleCount = other.mSampleCount;
return *this;
}
-void TextureHelper11::reset()
+bool TextureHelper11::operator==(const TextureHelper11 &other) const
{
- mTextureType = GL_NONE;
- mExtents = gl::Extents();
- mFormat = DXGI_FORMAT_UNKNOWN;
- mFormatSet = nullptr;
- mSampleCount = 0;
- mTexture2D = nullptr;
- mTexture3D = nullptr;
+ return mData->object == other.mData->object;
}
-bool TextureHelper11::valid() const
+bool TextureHelper11::operator!=(const TextureHelper11 &other) const
{
- return (mTextureType != GL_NONE);
+ return mData->object != other.mData->object;
}
bool UsePresentPathFast(const Renderer11 *renderer,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h
index 071ebb3c20b..d83839c37f7 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h
@@ -18,8 +18,9 @@
#include "libANGLE/Caps.h"
#include "libANGLE/Error.h"
-#include "libANGLE/renderer/d3d/d3d11/texture_format_table.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
{
@@ -119,20 +120,30 @@ struct PositionVertex
float x, y, z, w;
};
-struct BlendStateKey
+struct BlendStateKey final
{
+ // This will zero-initialize the struct, including padding.
+ BlendStateKey();
+
gl::BlendState blendState;
bool mrt;
uint8_t rtvMasks[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT];
};
-HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name);
+bool operator==(const BlendStateKey &a, const BlendStateKey &b);
+bool operator!=(const BlendStateKey &a, const BlendStateKey &b);
-template <typename T>
-HRESULT SetDebugName(angle::ComPtr<T> &resource, const char *name)
+struct RasterizerStateKey final
{
- return SetDebugName(resource.Get(), name);
-}
+ // This will zero-initialize the struct, including padding.
+ RasterizerStateKey();
+
+ gl::RasterizerState rasterizerState;
+ bool scissorEnabled;
+};
+
+bool operator==(const RasterizerStateKey &a, const RasterizerStateKey &b);
+bool operator!=(const RasterizerStateKey &a, const RasterizerStateKey &b);
template <typename outType>
outType* DynamicCastComObject(IUnknown* object)
@@ -165,166 +176,88 @@ inline bool isDeviceLostError(HRESULT errorCode)
}
}
-inline ID3D11VertexShader *CompileVS(ID3D11Device *device, const BYTE *byteCode, size_t N, const char *name)
-{
- ID3D11VertexShader *vs = nullptr;
- HRESULT result = device->CreateVertexShader(byteCode, N, nullptr, &vs);
- ASSERT(SUCCEEDED(result));
- if (SUCCEEDED(result))
- {
- SetDebugName(vs, name);
- return vs;
- }
- return nullptr;
-}
-
-template <unsigned int N>
-ID3D11VertexShader *CompileVS(ID3D11Device *device, const BYTE (&byteCode)[N], const char *name)
+template <ResourceType ResourceT>
+class LazyResource : angle::NonCopyable
{
- return CompileVS(device, byteCode, N, name);
-}
+ public:
+ constexpr LazyResource() : mResource() {}
+ virtual ~LazyResource() {}
-inline ID3D11GeometryShader *CompileGS(ID3D11Device *device, const BYTE *byteCode, size_t N, const char *name)
-{
- ID3D11GeometryShader *gs = nullptr;
- HRESULT result = device->CreateGeometryShader(byteCode, N, nullptr, &gs);
- ASSERT(SUCCEEDED(result));
- if (SUCCEEDED(result))
+ virtual gl::Error resolve(Renderer11 *renderer) = 0;
+ void reset() { mResource.reset(); }
+ GetD3D11Type<ResourceT> *get() const
{
- SetDebugName(gs, name);
- return gs;
+ ASSERT(mResource.valid());
+ return mResource.get();
}
- return nullptr;
-}
-template <unsigned int N>
-ID3D11GeometryShader *CompileGS(ID3D11Device *device, const BYTE (&byteCode)[N], const char *name)
-{
- return CompileGS(device, byteCode, N, name);
-}
+ const Resource11<GetD3D11Type<ResourceT>> &getObj() const { return mResource; }
-inline ID3D11PixelShader *CompilePS(ID3D11Device *device, const BYTE *byteCode, size_t N, const char *name)
-{
- ID3D11PixelShader *ps = nullptr;
- HRESULT result = device->CreatePixelShader(byteCode, N, nullptr, &ps);
- ASSERT(SUCCEEDED(result));
- if (SUCCEEDED(result))
+ protected:
+ gl::Error resolveImpl(Renderer11 *renderer,
+ const GetDescType<ResourceT> &desc,
+ GetInitDataType<ResourceT> *initData,
+ const char *name)
{
- SetDebugName(ps, name);
- return ps;
+ if (!mResource.valid())
+ {
+ ANGLE_TRY(renderer->allocateResource(desc, initData, &mResource));
+ mResource.setDebugName(name);
+ }
+ return gl::NoError();
}
- return nullptr;
-}
-template <unsigned int N>
-ID3D11PixelShader *CompilePS(ID3D11Device *device, const BYTE (&byteCode)[N], const char *name)
-{
- return CompilePS(device, byteCode, N, name);
-}
-
-template <typename ResourceType>
-class LazyResource : angle::NonCopyable
-{
- public:
- LazyResource() : mResource(nullptr), mAssociatedDevice(nullptr) {}
- virtual ~LazyResource() { release(); }
-
- virtual ResourceType *resolve(ID3D11Device *device) = 0;
- void release() { SafeRelease(mResource); }
-
- protected:
- void checkAssociatedDevice(ID3D11Device *device);
-
- ResourceType *mResource;
- ID3D11Device *mAssociatedDevice;
+ Resource11<GetD3D11Type<ResourceT>> mResource;
};
-template <typename ResourceType>
-void LazyResource<ResourceType>::checkAssociatedDevice(ID3D11Device *device)
-{
- ASSERT(mAssociatedDevice == nullptr || device == mAssociatedDevice);
- mAssociatedDevice = device;
-}
-
template <typename D3D11ShaderType>
-class LazyShader final : public LazyResource<D3D11ShaderType>
+class LazyShader final : public LazyResource<GetResourceTypeFromD3D11<D3D11ShaderType>()>
{
public:
// All parameters must be constexpr. Not supported in VS2013.
- LazyShader(const BYTE *byteCode,
- size_t byteCodeSize,
- const char *name)
- : mByteCode(byteCode),
- mByteCodeSize(byteCodeSize),
- mName(name)
+ constexpr LazyShader(const BYTE *byteCode, size_t byteCodeSize, const char *name)
+ : mByteCode(byteCode, byteCodeSize), mName(name)
{
}
- D3D11ShaderType *resolve(ID3D11Device *device) override;
+ gl::Error resolve(Renderer11 *renderer) override
+ {
+ return this->resolveImpl(renderer, mByteCode, nullptr, mName);
+ }
private:
- const BYTE *mByteCode;
- size_t mByteCodeSize;
+ ShaderData mByteCode;
const char *mName;
};
-template <>
-inline ID3D11VertexShader *LazyShader<ID3D11VertexShader>::resolve(ID3D11Device *device)
-{
- checkAssociatedDevice(device);
- if (mResource == nullptr)
- {
- mResource = CompileVS(device, mByteCode, mByteCodeSize, mName);
- }
- return mResource;
-}
-
-template <>
-inline ID3D11GeometryShader *LazyShader<ID3D11GeometryShader>::resolve(ID3D11Device *device)
+class LazyInputLayout final : public LazyResource<ResourceType::InputLayout>
{
- checkAssociatedDevice(device);
- if (mResource == nullptr)
- {
- mResource = CompileGS(device, mByteCode, mByteCodeSize, mName);
- }
- return mResource;
-}
-
-template <>
-inline ID3D11PixelShader *LazyShader<ID3D11PixelShader>::resolve(ID3D11Device *device)
-{
- checkAssociatedDevice(device);
- if (mResource == nullptr)
+ public:
+ constexpr 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)
{
- mResource = CompilePS(device, mByteCode, mByteCodeSize, mName);
}
- return mResource;
-}
-
-class LazyInputLayout final : public LazyResource<ID3D11InputLayout>
-{
- public:
- LazyInputLayout(const D3D11_INPUT_ELEMENT_DESC *inputDesc,
- size_t inputDescLen,
- const BYTE *byteCode,
- size_t byteCodeLen,
- const char *debugName);
- ID3D11InputLayout *resolve(ID3D11Device *device) override;
+ gl::Error resolve(Renderer11 *renderer) override;
private:
- std::vector<D3D11_INPUT_ELEMENT_DESC> mInputDesc;
- size_t mByteCodeLen;
- const BYTE *mByteCode;
+ InputElementArray mInputDesc;
+ ShaderData mByteCode;
const char *mDebugName;
};
-class LazyBlendState final : public LazyResource<ID3D11BlendState>
+class LazyBlendState final : public LazyResource<ResourceType::BlendState>
{
public:
LazyBlendState(const D3D11_BLEND_DESC &desc, const char *debugName);
- ID3D11BlendState *resolve(ID3D11Device *device) override;
+ gl::Error resolve(Renderer11 *renderer);
private:
D3D11_BLEND_DESC mDesc;
@@ -360,43 +293,88 @@ enum ReservedConstantBufferSlot
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 : angle::NonCopyable
+class TextureHelper11 : public Resource11Base<ID3D11Resource, std::shared_ptr, GenericData>
{
public:
TextureHelper11();
- TextureHelper11(TextureHelper11 &&toCopy);
+ TextureHelper11(TextureHelper11 &&other);
+ TextureHelper11(const TextureHelper11 &other);
~TextureHelper11();
- TextureHelper11 &operator=(TextureHelper11 &&texture);
-
- static TextureHelper11 MakeAndReference(ID3D11Resource *genericResource,
- const d3d11::Format &formatSet);
- static TextureHelper11 MakeAndPossess2D(ID3D11Texture2D *texToOwn,
- const d3d11::Format &formatSet);
- static TextureHelper11 MakeAndPossess3D(ID3D11Texture3D *texToOwn,
- const d3d11::Format &formatSet);
+ TextureHelper11 &operator=(TextureHelper11 &&other);
+ TextureHelper11 &operator=(const TextureHelper11 &other);
- GLenum getTextureType() const { return mTextureType; }
+ 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 mFormat; }
+ DXGI_FORMAT getFormat() const { return mFormatSet->texFormat; }
const d3d11::Format &getFormatSet() const { return *mFormatSet; }
int getSampleCount() const { return mSampleCount; }
- ID3D11Texture2D *getTexture2D() const { return mTexture2D; }
- ID3D11Texture3D *getTexture3D() const { return mTexture3D; }
- ID3D11Resource *getResource() const;
- bool valid() const;
+
+ 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.
+ auto 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 reset();
- void initDesc();
+ void initDesc(const D3D11_TEXTURE2D_DESC &desc2D);
+ void initDesc(const D3D11_TEXTURE3D_DESC &desc3D);
- GLenum mTextureType;
- gl::Extents mExtents;
- DXGI_FORMAT mFormat;
const d3d11::Format *mFormatSet;
+ gl::Extents mExtents;
int mSampleCount;
- ID3D11Texture2D *mTexture2D;
- ID3D11Texture3D *mTexture3D;
};
enum class StagingAccess
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/MultiplyAlpha.hlsl b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/MultiplyAlpha.hlsl
index b788e1794be..0d10b8eafa7 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/MultiplyAlpha.hlsl
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/MultiplyAlpha.hlsl
@@ -7,6 +7,43 @@ SamplerState Sampler : register(s0);
// 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
{
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_luma_ps.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_luma_ps.h
new file mode 100644
index 00000000000..bd63ef33b0a
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_luma_ps.h
@@ -0,0 +1,77 @@
+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name Type Format Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler sampler NA NA 0 1
+// TextureF texture float4 2d 0 1
+//
+//
+//
+// Input signature:
+//
+// Name Index Mask Register SysValue Format Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION 0 xyzw 0 POS float
+// TEXCOORD 0 xy 1 NONE float xy
+//
+//
+// Output signature:
+//
+// Name Index Mask Register SysValue Format Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET 0 xyzw 0 TARGET float xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mul o0.xyz, r0.wwww, r0.xxxx
+mov o0.w, l(1.000000)
+ret
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_LUMA[] = {
+ 68, 88, 66, 67, 61, 193, 4, 85, 218, 250, 183, 199, 231, 187, 141, 93, 80, 186, 200,
+ 74, 1, 0, 0, 0, 136, 2, 0, 0, 5, 0, 0, 0, 52, 0, 0, 0, 220, 0,
+ 0, 0, 52, 1, 0, 0, 104, 1, 0, 0, 12, 2, 0, 0, 82, 68, 69, 70, 160,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 28, 0, 0, 0,
+ 0, 4, 255, 255, 0, 1, 0, 0, 109, 0, 0, 0, 92, 0, 0, 0, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 1, 0, 0, 0, 100, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4,
+ 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0,
+ 83, 97, 109, 112, 108, 101, 114, 0, 84, 101, 120, 116, 117, 114, 101, 70, 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, 54, 46, 51, 46, 57,
+ 54, 48, 48, 46, 49, 54, 51, 56, 52, 0, 171, 73, 83, 71, 78, 80, 0, 0, 0,
+ 2, 0, 0, 0, 8, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+ 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 68, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 3, 0, 0, 83,
+ 86, 95, 80, 79, 83, 73, 84, 73, 79, 78, 0, 84, 69, 88, 67, 79, 79, 82, 68,
+ 0, 171, 171, 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, 156, 0, 0, 0, 64, 0, 0, 0, 39, 0, 0, 0, 90, 0, 0, 3,
+ 0, 96, 16, 0, 0, 0, 0, 0, 88, 24, 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, 101, 0,
+ 0, 3, 242, 32, 16, 0, 0, 0, 0, 0, 104, 0, 0, 2, 1, 0, 0, 0, 69,
+ 0, 0, 9, 242, 0, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 1, 0, 0, 0,
+ 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 56, 0, 0,
+ 7, 114, 32, 16, 0, 0, 0, 0, 0, 246, 15, 16, 0, 0, 0, 0, 0, 6, 0,
+ 16, 0, 0, 0, 0, 0, 54, 0, 0, 5, 130, 32, 16, 0, 0, 0, 0, 0, 1,
+ 64, 0, 0, 0, 0, 128, 63, 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, 0, 0,
+ 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 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, 1,
+ 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, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_lumaalpha_ps.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_lumaalpha_ps.h
new file mode 100644
index 00000000000..435f5783e9e
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_lumaalpha_ps.h
@@ -0,0 +1,77 @@
+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name Type Format Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler sampler NA NA 0 1
+// TextureF texture float4 2d 0 1
+//
+//
+//
+// Input signature:
+//
+// Name Index Mask Register SysValue Format Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION 0 xyzw 0 POS float
+// TEXCOORD 0 xy 1 NONE float xy
+//
+//
+// Output signature:
+//
+// Name Index Mask Register SysValue Format Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET 0 xyzw 0 TARGET float xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mul o0.xyz, r0.wwww, r0.xxxx
+mov o0.w, r0.w
+ret
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_LUMAALPHA[] = {
+ 68, 88, 66, 67, 16, 240, 62, 171, 253, 134, 187, 96, 66, 174, 101, 13, 101, 43, 164,
+ 23, 1, 0, 0, 0, 136, 2, 0, 0, 5, 0, 0, 0, 52, 0, 0, 0, 220, 0,
+ 0, 0, 52, 1, 0, 0, 104, 1, 0, 0, 12, 2, 0, 0, 82, 68, 69, 70, 160,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 28, 0, 0, 0,
+ 0, 4, 255, 255, 0, 1, 0, 0, 109, 0, 0, 0, 92, 0, 0, 0, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 1, 0, 0, 0, 100, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4,
+ 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0,
+ 83, 97, 109, 112, 108, 101, 114, 0, 84, 101, 120, 116, 117, 114, 101, 70, 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, 54, 46, 51, 46, 57,
+ 54, 48, 48, 46, 49, 54, 51, 56, 52, 0, 171, 73, 83, 71, 78, 80, 0, 0, 0,
+ 2, 0, 0, 0, 8, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+ 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 68, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 3, 0, 0, 83,
+ 86, 95, 80, 79, 83, 73, 84, 73, 79, 78, 0, 84, 69, 88, 67, 79, 79, 82, 68,
+ 0, 171, 171, 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, 156, 0, 0, 0, 64, 0, 0, 0, 39, 0, 0, 0, 90, 0, 0, 3,
+ 0, 96, 16, 0, 0, 0, 0, 0, 88, 24, 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, 101, 0,
+ 0, 3, 242, 32, 16, 0, 0, 0, 0, 0, 104, 0, 0, 2, 1, 0, 0, 0, 69,
+ 0, 0, 9, 242, 0, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 1, 0, 0, 0,
+ 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 56, 0, 0,
+ 7, 114, 32, 16, 0, 0, 0, 0, 0, 246, 15, 16, 0, 0, 0, 0, 0, 6, 0,
+ 16, 0, 0, 0, 0, 0, 54, 0, 0, 5, 130, 32, 16, 0, 0, 0, 0, 0, 58,
+ 0, 16, 0, 0, 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, 2, 0, 0, 0, 1, 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, 1,
+ 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, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_luma_ps.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_luma_ps.h
new file mode 100644
index 00000000000..333fa69e0ab
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_luma_ps.h
@@ -0,0 +1,82 @@
+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name Type Format Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler sampler NA NA 0 1
+// TextureF texture float4 2d 0 1
+//
+//
+//
+// Input signature:
+//
+// Name Index Mask Register SysValue Format Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION 0 xyzw 0 POS float
+// TEXCOORD 0 xy 1 NONE float xy
+//
+//
+// Output signature:
+//
+// Name Index Mask Register SysValue Format Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET 0 xyzw 0 TARGET float xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r0.w, r0.x, r0.w
+movc o0.xyz, r1.xxxx, r0.wwww, r0.xyzx
+mov o0.w, l(1.000000)
+ret
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_LUMA[] = {
+ 68, 88, 66, 67, 64, 125, 110, 227, 139, 187, 78, 166, 27, 154, 215, 226, 168, 30, 14,
+ 98, 1, 0, 0, 0, 200, 2, 0, 0, 5, 0, 0, 0, 52, 0, 0, 0, 220, 0,
+ 0, 0, 52, 1, 0, 0, 104, 1, 0, 0, 76, 2, 0, 0, 82, 68, 69, 70, 160,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 28, 0, 0, 0,
+ 0, 4, 255, 255, 0, 1, 0, 0, 109, 0, 0, 0, 92, 0, 0, 0, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 1, 0, 0, 0, 100, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4,
+ 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0,
+ 83, 97, 109, 112, 108, 101, 114, 0, 84, 101, 120, 116, 117, 114, 101, 70, 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, 54, 46, 51, 46, 57,
+ 54, 48, 48, 46, 49, 54, 51, 56, 52, 0, 171, 73, 83, 71, 78, 80, 0, 0, 0,
+ 2, 0, 0, 0, 8, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+ 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 68, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 3, 0, 0, 83,
+ 86, 95, 80, 79, 83, 73, 84, 73, 79, 78, 0, 84, 69, 88, 67, 79, 79, 82, 68,
+ 0, 171, 171, 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, 220, 0, 0, 0, 64, 0, 0, 0, 55, 0, 0, 0, 90, 0, 0, 3,
+ 0, 96, 16, 0, 0, 0, 0, 0, 88, 24, 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, 101, 0,
+ 0, 3, 242, 32, 16, 0, 0, 0, 0, 0, 104, 0, 0, 2, 2, 0, 0, 0, 69,
+ 0, 0, 9, 242, 0, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 1, 0, 0, 0,
+ 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 49, 0, 0,
+ 7, 18, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 58, 0,
+ 16, 0, 0, 0, 0, 0, 14, 0, 0, 7, 130, 0, 16, 0, 0, 0, 0, 0, 10,
+ 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 55, 0, 0, 9,
+ 114, 32, 16, 0, 0, 0, 0, 0, 6, 0, 16, 0, 1, 0, 0, 0, 246, 15, 16,
+ 0, 0, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, 54, 0, 0, 5, 130, 32,
+ 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, 62, 0, 0, 1, 83,
+ 84, 65, 84, 116, 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 2, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_lumaalpha_ps.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_lumaalpha_ps.h
new file mode 100644
index 00000000000..64aeb9ae1fc
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_lumaalpha_ps.h
@@ -0,0 +1,82 @@
+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name Type Format Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler sampler NA NA 0 1
+// TextureF texture float4 2d 0 1
+//
+//
+//
+// Input signature:
+//
+// Name Index Mask Register SysValue Format Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION 0 xyzw 0 POS float
+// TEXCOORD 0 xy 1 NONE float xy
+//
+//
+// Output signature:
+//
+// Name Index Mask Register SysValue Format Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET 0 xyzw 0 TARGET float xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.y, r0.x, r0.w
+movc o0.xyz, r1.xxxx, r1.yyyy, r0.xyzx
+mov o0.w, r0.w
+ret
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_LUMAALPHA[] = {
+ 68, 88, 66, 67, 108, 4, 157, 10, 254, 47, 42, 8, 219, 0, 94, 160, 25, 199, 73,
+ 60, 1, 0, 0, 0, 200, 2, 0, 0, 5, 0, 0, 0, 52, 0, 0, 0, 220, 0,
+ 0, 0, 52, 1, 0, 0, 104, 1, 0, 0, 76, 2, 0, 0, 82, 68, 69, 70, 160,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 28, 0, 0, 0,
+ 0, 4, 255, 255, 0, 1, 0, 0, 109, 0, 0, 0, 92, 0, 0, 0, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 1, 0, 0, 0, 100, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4,
+ 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0,
+ 83, 97, 109, 112, 108, 101, 114, 0, 84, 101, 120, 116, 117, 114, 101, 70, 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, 54, 46, 51, 46, 57,
+ 54, 48, 48, 46, 49, 54, 51, 56, 52, 0, 171, 73, 83, 71, 78, 80, 0, 0, 0,
+ 2, 0, 0, 0, 8, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+ 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 68, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 3, 0, 0, 83,
+ 86, 95, 80, 79, 83, 73, 84, 73, 79, 78, 0, 84, 69, 88, 67, 79, 79, 82, 68,
+ 0, 171, 171, 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, 220, 0, 0, 0, 64, 0, 0, 0, 55, 0, 0, 0, 90, 0, 0, 3,
+ 0, 96, 16, 0, 0, 0, 0, 0, 88, 24, 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, 101, 0,
+ 0, 3, 242, 32, 16, 0, 0, 0, 0, 0, 104, 0, 0, 2, 2, 0, 0, 0, 69,
+ 0, 0, 9, 242, 0, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 1, 0, 0, 0,
+ 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 49, 0, 0,
+ 7, 18, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 58, 0,
+ 16, 0, 0, 0, 0, 0, 14, 0, 0, 7, 34, 0, 16, 0, 1, 0, 0, 0, 10,
+ 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 55, 0, 0, 9,
+ 114, 32, 16, 0, 0, 0, 0, 0, 6, 0, 16, 0, 1, 0, 0, 0, 86, 5, 16,
+ 0, 1, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, 54, 0, 0, 5, 130, 32,
+ 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 62, 0, 0, 1, 83,
+ 84, 65, 84, 116, 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 2, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/generate_shaders.bat b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/generate_shaders.bat
index 6aad63d3c52..def2082434c 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/generate_shaders.bat
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/generate_shaders.bat
@@ -40,6 +40,10 @@ call:BuildShader MultiplyAlpha.hlsl PS_FtoU_UM_RGBA ps_4_0 compiled\multiplyalph
call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PT_RGB ps_4_0 compiled\multiplyalpha_ftou_pt_rgb_ps.h %debug%
call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PM_RGB ps_4_0 compiled\multiplyalpha_ftou_pm_rgb_ps.h %debug%
call:BuildShader MultiplyAlpha.hlsl PS_FtoU_UM_RGB ps_4_0 compiled\multiplyalpha_ftou_um_rgb_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_LUMA ps_4_0 compiled\multiplyalpha_ftof_pm_luma_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_LUMA ps_4_0 compiled\multiplyalpha_ftof_um_luma_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_LUMAALPHA ps_4_0 compiled\multiplyalpha_ftof_pm_lumaalpha_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_LUMAALPHA ps_4_0 compiled\multiplyalpha_ftof_um_lumaalpha_ps.h %debug%
call:BuildShader Clear11.hlsl VS_Clear_FL9 vs_4_0_level_9_3 compiled\clear11_fl9vs.h %debug%
call:BuildShader Clear11.hlsl PS_ClearFloat_FL9 ps_4_0_level_9_3 compiled\clearfloat11_fl9ps.h %debug%
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp
index 6648a75fda0..dc1ae4c6530 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp
@@ -103,7 +103,8 @@ gl::Error Blit9::initialize()
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal blit vertex shader, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to create internal blit vertex shader, "
+ << gl::FmtHR(result);
}
void *lockPtr = nullptr;
@@ -113,7 +114,8 @@ gl::Error Blit9::initialize()
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
SafeRelease(mQuadVertexBuffer);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to lock internal blit vertex shader, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to lock internal blit vertex shader, "
+ << gl::FmtHR(result);
}
memcpy(lockPtr, quad, sizeof(quad));
@@ -131,7 +133,8 @@ gl::Error Blit9::initialize()
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
SafeRelease(mQuadVertexBuffer);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to lock internal blit vertex declaration, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to lock internal blit vertex declaration, "
+ << gl::FmtHR(result);
}
mGeometryLoaded = true;
@@ -162,7 +165,7 @@ gl::Error Blit9::setShader(ShaderId source, const char *profile,
HRESULT hr = (device->*setShader)(shader);
if (FAILED(hr))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to set shader for blit operation, result: 0x%X.", hr);
+ return gl::OutOfMemory() << "Failed to set shader for blit operation, " << gl::FmtHR(hr);
}
return gl::NoError();
@@ -233,7 +236,13 @@ gl::Error Blit9::boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest)
return gl::NoError();
}
-gl::Error Blit9::copy2D(const gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat, const gl::Offset &destOffset, TextureStorage *storage, GLint level)
+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());
@@ -241,7 +250,7 @@ gl::Error Blit9::copy2D(const gl::Framebuffer *framebuffer, const RECT &sourceRe
ASSERT(colorbuffer);
RenderTarget9 *renderTarget9 = nullptr;
- ANGLE_TRY(colorbuffer->getRenderTarget(&renderTarget9));
+ ANGLE_TRY(colorbuffer->getRenderTarget(context, &renderTarget9));
ASSERT(renderTarget9);
IDirect3DSurface9 *source = renderTarget9->getSurface();
@@ -249,7 +258,7 @@ gl::Error Blit9::copy2D(const gl::Framebuffer *framebuffer, const RECT &sourceRe
IDirect3DSurface9 *destSurface = nullptr;
TextureStorage9 *storage9 = GetAs<TextureStorage9>(storage);
- gl::Error error = storage9->getSurfaceLevel(GL_TEXTURE_2D, level, true, &destSurface);
+ gl::Error error = storage9->getSurfaceLevel(context, GL_TEXTURE_2D, level, true, &destSurface);
if (error.isError())
{
SafeRelease(source);
@@ -266,7 +275,14 @@ gl::Error Blit9::copy2D(const gl::Framebuffer *framebuffer, const RECT &sourceRe
return result;
}
-gl::Error Blit9::copyCube(const gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat, const gl::Offset &destOffset, TextureStorage *storage, GLenum target, GLint level)
+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())
@@ -278,7 +294,7 @@ gl::Error Blit9::copyCube(const gl::Framebuffer *framebuffer, const RECT &source
ASSERT(colorbuffer);
RenderTarget9 *renderTarget9 = nullptr;
- error = colorbuffer->getRenderTarget(&renderTarget9);
+ error = colorbuffer->getRenderTarget(context, &renderTarget9);
if (error.isError())
{
return error;
@@ -290,7 +306,7 @@ gl::Error Blit9::copyCube(const gl::Framebuffer *framebuffer, const RECT &source
IDirect3DSurface9 *destSurface = nullptr;
TextureStorage9 *storage9 = GetAs<TextureStorage9>(storage);
- error = storage9->getSurfaceLevel(target, level, true, &destSurface);
+ error = storage9->getSurfaceLevel(context, target, level, true, &destSurface);
if (error.isError())
{
SafeRelease(source);
@@ -307,7 +323,8 @@ gl::Error Blit9::copyCube(const gl::Framebuffer *framebuffer, const RECT &source
return result;
}
-gl::Error Blit9::copyTexture(const gl::Texture *source,
+gl::Error Blit9::copyTexture(const gl::Context *context,
+ const gl::Texture *source,
GLint sourceLevel,
const RECT &sourceRect,
GLenum destFormat,
@@ -324,7 +341,7 @@ gl::Error Blit9::copyTexture(const gl::Texture *source,
const TextureD3D *sourceD3D = GetImplAs<TextureD3D>(source);
TextureStorage *sourceStorage = nullptr;
- ANGLE_TRY(const_cast<TextureD3D *>(sourceD3D)->getNativeTexture(&sourceStorage));
+ ANGLE_TRY(const_cast<TextureD3D *>(sourceD3D)->getNativeTexture(context, &sourceStorage));
TextureStorage9_2D *sourceStorage9 = GetAs<TextureStorage9_2D>(sourceStorage);
ASSERT(sourceStorage9);
@@ -334,13 +351,15 @@ gl::Error Blit9::copyTexture(const gl::Texture *source,
ASSERT(sourceLevel == 0);
IDirect3DBaseTexture9 *sourceTexture = nullptr;
- ANGLE_TRY(sourceStorage9->getBaseTexture(&sourceTexture));
+ ANGLE_TRY(sourceStorage9->getBaseTexture(context, &sourceTexture));
IDirect3DSurface9 *sourceSurface = nullptr;
- ANGLE_TRY(sourceStorage9->getSurfaceLevel(GL_TEXTURE_2D, sourceLevel, true, &sourceSurface));
+ ANGLE_TRY(
+ sourceStorage9->getSurfaceLevel(context, GL_TEXTURE_2D, sourceLevel, true, &sourceSurface));
IDirect3DSurface9 *destSurface = nullptr;
- gl::Error error = destStorage9->getSurfaceLevel(destTarget, destLevel, true, &destSurface);
+ gl::Error error =
+ destStorage9->getSurfaceLevel(context, destTarget, destLevel, true, &destSurface);
if (error.isError())
{
SafeRelease(sourceSurface);
@@ -386,7 +405,8 @@ gl::Error Blit9::copy(IDirect3DSurface9 *source,
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to blit between textures, StretchRect result: 0x%X.", result);
+ return gl::OutOfMemory()
+ << "Failed to blit between textures, StretchRect " << gl::FmtHR(result);
}
return gl::NoError();
@@ -632,7 +652,8 @@ gl::Error Blit9::copySurfaceToTexture(IDirect3DSurface9 *surface,
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate internal texture for blit, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to allocate internal texture for blit, "
+ << gl::FmtHR(result);
}
IDirect3DSurface9 *textureSurface;
@@ -642,7 +663,8 @@ gl::Error Blit9::copySurfaceToTexture(IDirect3DSurface9 *surface,
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
SafeRelease(texture);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to query surface of internal blit texture, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to query surface of internal blit texture, "
+ << gl::FmtHR(result);
}
mRenderer->endScene();
@@ -654,7 +676,8 @@ gl::Error Blit9::copySurfaceToTexture(IDirect3DSurface9 *surface,
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
SafeRelease(texture);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to copy between internal blit textures, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to copy between internal blit textures, "
+ << gl::FmtHR(result);
}
*outTexture = texture;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.h
index 926c591a633..026874f8ae3 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.h
@@ -16,6 +16,7 @@
namespace gl
{
+class Context;
class Framebuffer;
class Texture;
struct Extents;
@@ -37,15 +38,23 @@ class Blit9 : angle::NonCopyable
// Copy from source surface to dest surface.
// sourceRect, xoffset, yoffset are in D3D coordinates (0,0 in upper-left)
- gl::Error copy2D(const gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat, const gl::Offset &destOffset, TextureStorage *storage, GLint level);
- gl::Error copyCube(const gl::Framebuffer *framebuffer,
+ 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::Texture *source,
+ gl::Error copyTexture(const gl::Context *context,
+ const gl::Texture *source,
GLint sourceLevel,
const RECT &sourceRect,
GLenum destFormat,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp
index 534a2524a96..5cadcdc5092 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp
@@ -22,7 +22,7 @@ Buffer9::~Buffer9()
mSize = 0;
}
-gl::Error Buffer9::setData(ContextImpl * /*context*/,
+gl::Error Buffer9::setData(const gl::Context * /*context*/,
GLenum /*target*/,
const void *data,
size_t size,
@@ -32,7 +32,7 @@ gl::Error Buffer9::setData(ContextImpl * /*context*/,
{
if (!mMemory.resize(size))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize internal buffer.");
+ return gl::OutOfMemory() << "Failed to resize internal buffer.";
}
}
@@ -55,7 +55,7 @@ gl::Error Buffer9::getData(const uint8_t **outData)
return gl::NoError();
}
-gl::Error Buffer9::setSubData(ContextImpl * /*context*/,
+gl::Error Buffer9::setSubData(const gl::Context * /*context*/,
GLenum /*target*/,
const void *data,
size_t size,
@@ -65,7 +65,7 @@ gl::Error Buffer9::setSubData(ContextImpl * /*context*/,
{
if (!mMemory.resize(offset + size))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize internal buffer.");
+ return gl::OutOfMemory() << "Failed to resize internal buffer.";
}
}
@@ -80,7 +80,7 @@ gl::Error Buffer9::setSubData(ContextImpl * /*context*/,
return gl::NoError();
}
-gl::Error Buffer9::copySubData(ContextImpl *context,
+gl::Error Buffer9::copySubData(const gl::Context *context,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
@@ -98,32 +98,32 @@ gl::Error Buffer9::copySubData(ContextImpl *context,
}
// We do not support buffer mapping in D3D9
-gl::Error Buffer9::map(ContextImpl *context, GLenum access, void **mapPtr)
+gl::Error Buffer9::map(const gl::Context *context, GLenum access, void **mapPtr)
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error Buffer9::mapRange(ContextImpl *context,
+gl::Error Buffer9::mapRange(const gl::Context *context,
size_t offset,
size_t length,
GLbitfield access,
void **mapPtr)
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error Buffer9::unmap(ContextImpl *context, GLboolean *result)
+gl::Error Buffer9::unmap(const gl::Context *context, GLboolean *result)
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error Buffer9::markTransformFeedbackUsage()
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.h
index a0a6ccc977c..6173afa09e1 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.h
@@ -29,28 +29,28 @@ class Buffer9 : public BufferD3D
gl::Error getData(const uint8_t **outData) override;
// BufferImpl implementation
- gl::Error setData(ContextImpl *context,
+ gl::Error setData(const gl::Context *context,
GLenum target,
const void *data,
size_t size,
GLenum usage) override;
- gl::Error setSubData(ContextImpl *context,
+ gl::Error setSubData(const gl::Context *context,
GLenum target,
const void *data,
size_t size,
size_t offset) override;
- gl::Error copySubData(ContextImpl *context,
+ gl::Error copySubData(const gl::Context *context,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size) override;
- gl::Error map(ContextImpl *context, GLenum access, void **mapPtr) override;
- gl::Error mapRange(ContextImpl *context,
+ 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(ContextImpl *context, GLboolean *result) override;
+ gl::Error unmap(const gl::Context *context, GLboolean *result) override;
gl::Error markTransformFeedbackUsage() override;
private:
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.cpp
index 326398076fb..6d89ad747d1 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.cpp
@@ -135,39 +135,44 @@ gl::Error Context9::finish()
return mRenderer->finish();
}
-gl::Error Context9::drawArrays(GLenum mode, GLint first, GLsizei count)
+gl::Error Context9::drawArrays(const gl::Context *context, GLenum mode, GLint first, GLsizei count)
{
- return mRenderer->genericDrawArrays(this, mode, first, count, 0);
+ return mRenderer->genericDrawArrays(context, mode, first, count, 0);
}
-gl::Error Context9::drawArraysInstanced(GLenum mode,
+gl::Error Context9::drawArraysInstanced(const gl::Context *context,
+ GLenum mode,
GLint first,
GLsizei count,
GLsizei instanceCount)
{
- return mRenderer->genericDrawArrays(this, mode, first, count, instanceCount);
+ return mRenderer->genericDrawArrays(context, mode, first, count, instanceCount);
}
-gl::Error Context9::drawElements(GLenum mode,
+gl::Error Context9::drawElements(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
const gl::IndexRange &indexRange)
{
- return mRenderer->genericDrawElements(this, mode, count, type, indices, 0, indexRange);
+ return mRenderer->genericDrawElements(context, mode, count, type, indices, 0, indexRange);
}
-gl::Error Context9::drawElementsInstanced(GLenum mode,
+gl::Error Context9::drawElementsInstanced(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
GLsizei instances,
const gl::IndexRange &indexRange)
{
- return mRenderer->genericDrawElements(this, mode, count, type, indices, instances, indexRange);
+ return mRenderer->genericDrawElements(context, mode, count, type, indices, instances,
+ indexRange);
}
-gl::Error Context9::drawRangeElements(GLenum mode,
+gl::Error Context9::drawRangeElements(const gl::Context *context,
+ GLenum mode,
GLuint start,
GLuint end,
GLsizei count,
@@ -175,16 +180,21 @@ gl::Error Context9::drawRangeElements(GLenum mode,
const void *indices,
const gl::IndexRange &indexRange)
{
- return mRenderer->genericDrawElements(this, mode, count, type, indices, 0, indexRange);
+ return mRenderer->genericDrawElements(context, mode, count, type, indices, 0, indexRange);
}
-gl::Error Context9::drawArraysIndirect(GLenum mode, const void *indirect)
+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(GLenum mode, GLenum type, const void *indirect)
+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";
@@ -228,7 +238,7 @@ void Context9::popGroupMarker()
mRenderer->getAnnotator()->endEvent();
}
-void Context9::syncState(const gl::State::DirtyBits &dirtyBits)
+void Context9::syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits)
{
mRenderer->getStateManager()->syncState(mState.getState(), dirtyBits);
}
@@ -243,7 +253,7 @@ GLint64 Context9::getTimestamp()
return mRenderer->getTimestamp();
}
-void Context9::onMakeCurrent(const gl::ContextState &data)
+void Context9::onMakeCurrent(const gl::Context *context)
{
}
@@ -267,7 +277,10 @@ const gl::Limitations &Context9::getNativeLimitations() const
return mRenderer->getNativeLimitations();
}
-gl::Error Context9::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
+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";
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.h
index f69ed97d26f..f71275f4ef6 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.h
@@ -64,32 +64,44 @@ class Context9 : public ContextImpl
gl::Error finish() override;
// Drawing methods.
- gl::Error drawArrays(GLenum mode, GLint first, GLsizei count) override;
- gl::Error drawArraysInstanced(GLenum mode,
+ 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(GLenum mode,
+ gl::Error drawElements(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
const gl::IndexRange &indexRange) override;
- gl::Error drawElementsInstanced(GLenum mode,
+ gl::Error drawElementsInstanced(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
GLsizei instances,
const gl::IndexRange &indexRange) override;
- gl::Error drawRangeElements(GLenum mode,
+ gl::Error drawRangeElements(const gl::Context *context,
+ GLenum mode,
GLuint start,
GLuint end,
GLsizei count,
GLenum type,
const void *indices,
const gl::IndexRange &indexRange) override;
- gl::Error drawArraysIndirect(GLenum mode, const void *indirect) override;
- gl::Error drawElementsIndirect(GLenum mode, GLenum type, const void *indirect) 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;
@@ -104,14 +116,14 @@ class Context9 : public ContextImpl
void popGroupMarker() override;
// State sync with dirty bits.
- void syncState(const gl::State::DirtyBits &dirtyBits) override;
+ 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::ContextState &data) override;
+ void onMakeCurrent(const gl::Context *context) override;
// Caps queries
const gl::Caps &getNativeCaps() const override;
@@ -119,7 +131,10 @@ class Context9 : public ContextImpl
const gl::Extensions &getNativeExtensions() const override;
const gl::Limitations &getNativeLimitations() const override;
- gl::Error dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ) override;
+ gl::Error dispatchCompute(const gl::Context *context,
+ GLuint numGroupsX,
+ GLuint numGroupsY,
+ GLuint numGroupsZ) override;
private:
Renderer9 *mRenderer;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.cpp
index 6779f56f2d8..bff38816555 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.cpp
@@ -38,7 +38,7 @@ gl::Error FenceNV9::set(GLenum condition)
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
SafeRelease(mQuery);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to end event query, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to end event query, " << gl::FmtHR(result);
}
return gl::NoError();
@@ -76,11 +76,11 @@ gl::Error FenceNV9::testHelper(bool flushCommandBuffer, GLboolean *outFinished)
if (d3d9::isDeviceLostError(result))
{
mRenderer->notifyDeviceLost();
- return gl::Error(GL_OUT_OF_MEMORY, "Device was lost while querying result of an event query.");
+ return gl::OutOfMemory() << "Device was lost while querying result of an event query.";
}
else if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to get query data, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to get query data, " << gl::FmtHR(result);
}
ASSERT(result == S_OK || result == S_FALSE);
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp
index 9155c98cd1e..97ecd6cc151 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp
@@ -8,18 +8,19 @@
#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/renderer_utils.h"
#include "libANGLE/renderer/d3d/TextureD3D.h"
-#include "libANGLE/renderer/d3d/d3d9/Renderer9.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
{
@@ -34,38 +35,36 @@ Framebuffer9::~Framebuffer9()
{
}
-gl::Error Framebuffer9::discard(size_t, const GLenum *)
+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(size_t, const GLenum *)
+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(size_t, const GLenum *, const gl::Rectangle &)
+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(ContextImpl *context, const ClearParameters &clearParams)
+gl::Error Framebuffer9::clearImpl(const gl::Context *context, const ClearParameters &clearParams)
{
const gl::FramebufferAttachment *colorAttachment = mState.getColorAttachment(0);
const gl::FramebufferAttachment *depthStencilAttachment = mState.getDepthOrStencilAttachment();
- gl::Error error =
- mRenderer->applyRenderTarget(context, colorAttachment, depthStencilAttachment);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(mRenderer->applyRenderTarget(context, colorAttachment, depthStencilAttachment));
const gl::State &glState = context->getGLState();
float nearZ = glState.getNearPlane();
@@ -75,10 +74,11 @@ gl::Error Framebuffer9::clearImpl(ContextImpl *context, const ClearParameters &c
mRenderer->setScissorRectangle(glState.getScissor(), glState.isScissorTestEnabled());
- return mRenderer->clear(clearParams, colorAttachment, depthStencilAttachment);
+ return mRenderer->clear(context, clearParams, colorAttachment, depthStencilAttachment);
}
-gl::Error Framebuffer9::readPixelsImpl(const gl::Rectangle &area,
+gl::Error Framebuffer9::readPixelsImpl(const gl::Context *context,
+ const gl::Rectangle &area,
GLenum format,
GLenum type,
size_t outputPitch,
@@ -91,11 +91,7 @@ gl::Error Framebuffer9::readPixelsImpl(const gl::Rectangle &area,
ASSERT(colorbuffer);
RenderTarget9 *renderTarget = nullptr;
- gl::Error error = colorbuffer->getRenderTarget(&renderTarget);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(colorbuffer->getRenderTarget(context, &renderTarget));
ASSERT(renderTarget);
IDirect3DSurface9 *surface = renderTarget->getSurface();
@@ -108,7 +104,8 @@ gl::Error Framebuffer9::readPixelsImpl(const gl::Rectangle &area,
{
UNIMPLEMENTED(); // FIXME: Requires resolve using StretchRect into non-multisampled render target
SafeRelease(surface);
- return gl::Error(GL_OUT_OF_MEMORY, "ReadPixels is unimplemented for multisampled framebuffer attachments.");
+ return gl::OutOfMemory()
+ << "ReadPixels is unimplemented for multisampled framebuffer attachments.";
}
IDirect3DDevice9 *device = mRenderer->getDevice();
@@ -140,7 +137,7 @@ gl::Error Framebuffer9::readPixelsImpl(const gl::Rectangle &area,
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
SafeRelease(surface);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate internal texture for ReadPixels.");
+ return gl::OutOfMemory() << "Failed to allocate internal texture for ReadPixels.";
}
}
@@ -162,7 +159,7 @@ gl::Error Framebuffer9::readPixelsImpl(const gl::Rectangle &area,
UNREACHABLE();
}
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to read internal render target data.");
+ return gl::OutOfMemory() << "Failed to read internal render target data.";
}
if (directToPixels)
@@ -185,7 +182,7 @@ gl::Error Framebuffer9::readPixelsImpl(const gl::Rectangle &area,
UNREACHABLE();
SafeRelease(systemSurface);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to lock internal render target.");
+ return gl::OutOfMemory() << "Failed to lock internal render target.";
}
uint8_t *source = reinterpret_cast<uint8_t *>(lock.pBits);
@@ -203,7 +200,7 @@ gl::Error Framebuffer9::readPixelsImpl(const gl::Rectangle &area,
packParams.format = format;
packParams.type = type;
packParams.outputPitch = static_cast<GLuint>(outputPitch);
- packParams.pack = pack;
+ packParams.pack.copyFrom(context, pack);
PackPixels(packParams, d3dFormatInfo.info(), inputPitch, source, pixels);
@@ -213,7 +210,8 @@ gl::Error Framebuffer9::readPixelsImpl(const gl::Rectangle &area,
return gl::NoError();
}
-gl::Error Framebuffer9::blitImpl(const gl::Rectangle &sourceArea,
+gl::Error Framebuffer9::blitImpl(const gl::Context *context,
+ const gl::Rectangle &sourceArea,
const gl::Rectangle &destArea,
const gl::Rectangle *scissor,
bool blitRenderTarget,
@@ -235,7 +233,7 @@ gl::Error Framebuffer9::blitImpl(const gl::Rectangle &sourceArea,
ASSERT(readBuffer);
RenderTarget9 *readRenderTarget = nullptr;
- gl::Error error = readBuffer->getRenderTarget(&readRenderTarget);
+ gl::Error error = readBuffer->getRenderTarget(context, &readRenderTarget);
if (error.isError())
{
return error;
@@ -246,7 +244,7 @@ gl::Error Framebuffer9::blitImpl(const gl::Rectangle &sourceArea,
ASSERT(drawBuffer);
RenderTarget9 *drawRenderTarget = nullptr;
- error = drawBuffer->getRenderTarget(&drawRenderTarget);
+ error = drawBuffer->getRenderTarget(context, &drawRenderTarget);
if (error.isError())
{
return error;
@@ -351,7 +349,7 @@ gl::Error Framebuffer9::blitImpl(const gl::Rectangle &sourceArea,
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Internal blit failed, StretchRect returned 0x%X.", result);
+ return gl::OutOfMemory() << "Internal blit failed, StretchRect " << gl::FmtHR(result);
}
}
@@ -361,7 +359,7 @@ gl::Error Framebuffer9::blitImpl(const gl::Rectangle &sourceArea,
ASSERT(readBuffer);
RenderTarget9 *readDepthStencil = nullptr;
- gl::Error error = readBuffer->getRenderTarget(&readDepthStencil);
+ gl::Error error = readBuffer->getRenderTarget(context, &readDepthStencil);
if (error.isError())
{
return error;
@@ -372,7 +370,7 @@ gl::Error Framebuffer9::blitImpl(const gl::Rectangle &sourceArea,
ASSERT(drawBuffer);
RenderTarget9 *drawDepthStencil = nullptr;
- error = drawBuffer->getRenderTarget(&drawDepthStencil);
+ error = drawBuffer->getRenderTarget(context, &drawDepthStencil);
if (error.isError())
{
return error;
@@ -393,7 +391,7 @@ gl::Error Framebuffer9::blitImpl(const gl::Rectangle &sourceArea,
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Internal blit failed, StretchRect returned 0x%X.", result);
+ return gl::OutOfMemory() << "Internal blit failed, StretchRect " << gl::FmtHR(result);
}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h
index 8401350b3d9..9d8d5e176b0 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h
@@ -21,21 +21,28 @@ class Framebuffer9 : public FramebufferD3D
Framebuffer9(const gl::FramebufferState &data, Renderer9 *renderer);
virtual ~Framebuffer9();
- gl::Error discard(size_t count, const GLenum *attachments) override;
- gl::Error invalidate(size_t count, const GLenum *attachments) override;
- gl::Error invalidateSub(size_t count, const GLenum *attachments, const gl::Rectangle &area) 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;
private:
- gl::Error clearImpl(ContextImpl *context, const ClearParameters &clearParams) override;
+ gl::Error clearImpl(const gl::Context *context, const ClearParameters &clearParams) override;
- gl::Error readPixelsImpl(const gl::Rectangle &area,
+ 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) const override;
- gl::Error blitImpl(const gl::Rectangle &sourceArea,
+ gl::Error blitImpl(const gl::Context *context,
+ const gl::Rectangle &sourceArea,
const gl::Rectangle &destArea,
const gl::Rectangle *scissor,
bool blitRenderTarget,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Image9.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Image9.cpp
index d3b4dc25aa0..089414b5c2e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Image9.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Image9.cpp
@@ -45,7 +45,9 @@ gl::Error Image9::generateMip(IDirect3DSurface9 *destSurface, IDirect3DSurface9
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to query the source surface description for mipmap generation, result: 0x%X.", result);
+ return gl::OutOfMemory()
+ << "Failed to query the source surface description for mipmap generation, "
+ << gl::FmtHR(result);
}
D3DSURFACE_DESC sourceDesc;
@@ -53,7 +55,9 @@ gl::Error Image9::generateMip(IDirect3DSurface9 *destSurface, IDirect3DSurface9
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to query the destination surface description for mipmap generation, result: 0x%X.", result);
+ return gl::OutOfMemory()
+ << "Failed to query the destination surface description for mipmap generation, "
+ << gl::FmtHR(result);
}
ASSERT(sourceDesc.Format == destDesc.Format);
@@ -68,7 +72,8 @@ gl::Error Image9::generateMip(IDirect3DSurface9 *destSurface, IDirect3DSurface9
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to lock the source surface for mipmap generation, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to lock the source surface for mipmap generation, "
+ << gl::FmtHR(result);
}
D3DLOCKED_RECT destLocked = {0};
@@ -77,7 +82,8 @@ gl::Error Image9::generateMip(IDirect3DSurface9 *destSurface, IDirect3DSurface9
if (FAILED(result))
{
sourceSurface->UnlockRect();
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to lock the destination surface for mipmap generation, result: 0x%X.", result);
+ 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);
@@ -132,14 +138,14 @@ gl::Error Image9::copyLockableSurfaces(IDirect3DSurface9 *dest, IDirect3DSurface
result = source->LockRect(&sourceLock, nullptr, 0);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to lock source surface for copy, result: 0x%X.", 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::Error(GL_OUT_OF_MEMORY, "Failed to lock source surface for copy, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to lock source surface for copy, " << gl::FmtHR(result);
}
ASSERT(sourceLock.pBits && destLock.pBits);
@@ -225,7 +231,7 @@ gl::Error Image9::createSurface()
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create image surface, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to create image surface, " << gl::FmtHR(result);
}
newTexture->GetSurfaceLevel(levelToFetch, &newSurface);
@@ -245,7 +251,7 @@ gl::Error Image9::createSurface()
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to lock image surface, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to lock image surface, " << gl::FmtHR(result);
}
d3dFormatInfo.dataInitializerFunction(mWidth, mHeight, 1, reinterpret_cast<uint8_t*>(lockedRect.pBits),
@@ -255,7 +261,7 @@ gl::Error Image9::createSurface()
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to unlock image surface, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to unlock image surface, " << gl::FmtHR(result);
}
}
}
@@ -281,7 +287,7 @@ gl::Error Image9::lock(D3DLOCKED_RECT *lockedRect, const RECT &rect)
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to lock image surface, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to lock image surface, " << gl::FmtHR(result);
}
mDirty = true;
@@ -329,11 +335,13 @@ gl::Error Image9::getSurface(IDirect3DSurface9 **outSurface)
return gl::NoError();
}
-gl::Error Image9::setManagedSurface2D(TextureStorage *storage, int level)
+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(GL_TEXTURE_2D, level, false, &surface);
+ gl::Error error = storage9->getSurfaceLevel(context, GL_TEXTURE_2D, level, false, &surface);
if (error.isError())
{
return error;
@@ -341,12 +349,15 @@ gl::Error Image9::setManagedSurface2D(TextureStorage *storage, int level)
return setManagedSurface(surface);
}
-gl::Error Image9::setManagedSurfaceCube(TextureStorage *storage, int face, int level)
+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(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level, false, &surface);
+ gl::Error error = storage9->getSurfaceLevel(context, GL_TEXTURE_CUBE_MAP_POSITIVE_X + face,
+ level, false, &surface);
if (error.isError())
{
return error;
@@ -379,7 +390,10 @@ gl::Error Image9::setManagedSurface(IDirect3DSurface9 *surface)
return gl::NoError();
}
-gl::Error Image9::copyToStorage(TextureStorage *storage, const gl::ImageIndex &index, const gl::Box &region)
+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())
@@ -393,7 +407,8 @@ gl::Error Image9::copyToStorage(TextureStorage *storage, const gl::ImageIndex &i
if (index.type == GL_TEXTURE_2D)
{
- error = storage9->getSurfaceLevel(GL_TEXTURE_2D, index.mipIndex, true, &destSurface);
+ error =
+ storage9->getSurfaceLevel(context, GL_TEXTURE_2D, index.mipIndex, true, &destSurface);
if (error.isError())
{
return error;
@@ -402,7 +417,7 @@ gl::Error Image9::copyToStorage(TextureStorage *storage, const gl::ImageIndex &i
else
{
ASSERT(gl::IsCubeMapTextureTarget(index.type));
- error = storage9->getSurfaceLevel(index.type, index.mipIndex, true, &destSurface);
+ error = storage9->getSurfaceLevel(context, index.type, index.mipIndex, true, &destSurface);
if (error.isError())
{
return error;
@@ -448,7 +463,8 @@ gl::Error Image9::copyToSurface(IDirect3DSurface9 *destSurface, const gl::Box &a
D3DPOOL_SYSTEMMEM, &surf, nullptr);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Internal CreateOffscreenPlainSurface call failed, result: 0x%X.", result);
+ return gl::OutOfMemory()
+ << "Internal CreateOffscreenPlainSurface call failed, " << gl::FmtHR(result);
}
copyLockableSurfaces(surf, sourceSurface);
@@ -457,7 +473,7 @@ gl::Error Image9::copyToSurface(IDirect3DSurface9 *destSurface, const gl::Box &a
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Internal UpdateSurface call failed, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Internal UpdateSurface call failed, " << gl::FmtHR(result);
}
}
else
@@ -467,7 +483,7 @@ gl::Error Image9::copyToSurface(IDirect3DSurface9 *destSurface, const gl::Box &a
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Internal UpdateSurface call failed, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Internal UpdateSurface call failed, " << gl::FmtHR(result);
}
}
@@ -476,7 +492,8 @@ gl::Error Image9::copyToSurface(IDirect3DSurface9 *destSurface, const gl::Box &a
// 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::Box &area,
+gl::Error Image9::loadData(const gl::Context *context,
+ const gl::Box &area,
const gl::PixelUnpackState &unpack,
GLenum type,
const void *input,
@@ -519,7 +536,9 @@ gl::Error Image9::loadData(const gl::Box &area,
return gl::NoError();
}
-gl::Error Image9::loadCompressedData(const gl::Box &area, const void *input)
+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);
@@ -588,7 +607,8 @@ gl::Error Image9::copyFromRTInternal(const gl::Offset &destOffset,
if (FAILED(result))
{
SafeRelease(surface);
- return gl::Error(GL_OUT_OF_MEMORY, "Could not create matching destination surface, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Could not create matching destination surface, "
+ << gl::FmtHR(result);
}
result = device->GetRenderTargetData(surface, renderTargetData);
@@ -597,7 +617,8 @@ gl::Error Image9::copyFromRTInternal(const gl::Offset &destOffset,
{
SafeRelease(renderTargetData);
SafeRelease(surface);
- return gl::Error(GL_OUT_OF_MEMORY, "GetRenderTargetData unexpectedly failed, result: 0x%X.", result);
+ return gl::OutOfMemory() << "GetRenderTargetData unexpectedly failed, "
+ << gl::FmtHR(result);
}
int width = sourceArea.width;
@@ -613,7 +634,9 @@ gl::Error Image9::copyFromRTInternal(const gl::Offset &destOffset,
{
SafeRelease(renderTargetData);
SafeRelease(surface);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to lock the source surface (rectangle might be invalid), result: 0x%X.", result);
+ return gl::OutOfMemory()
+ << "Failed to lock the source surface (rectangle might be invalid), "
+ << gl::FmtHR(result);
}
D3DLOCKED_RECT destLock = {0};
@@ -793,10 +816,12 @@ gl::Error Image9::copyFromRTInternal(const gl::Offset &destOffset,
return gl::NoError();
}
-gl::Error Image9::copyFromTexStorage(const gl::ImageIndex &imageIndex, TextureStorage *source)
+gl::Error Image9::copyFromTexStorage(const gl::Context *context,
+ const gl::ImageIndex &imageIndex,
+ TextureStorage *source)
{
RenderTargetD3D *renderTarget = nullptr;
- gl::Error error = source->getRenderTarget(imageIndex, &renderTarget);
+ gl::Error error = source->getRenderTarget(context, imageIndex, &renderTarget);
if (error.isError())
{
return error;
@@ -806,7 +831,8 @@ gl::Error Image9::copyFromTexStorage(const gl::ImageIndex &imageIndex, TextureSt
return copyFromRTInternal(gl::Offset(), sourceArea, renderTarget);
}
-gl::Error Image9::copyFromFramebuffer(const gl::Offset &destOffset,
+gl::Error Image9::copyFromFramebuffer(const gl::Context *context,
+ const gl::Offset &destOffset,
const gl::Rectangle &sourceArea,
const gl::Framebuffer *source)
{
@@ -814,7 +840,7 @@ gl::Error Image9::copyFromFramebuffer(const gl::Offset &destOffset,
ASSERT(srcAttachment);
RenderTargetD3D *renderTarget = nullptr;
- gl::Error error = srcAttachment->getRenderTarget(&renderTarget);
+ gl::Error error = srcAttachment->getRenderTarget(context, &renderTarget);
if (error.isError())
{
return error;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Image9.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Image9.h
index 068a67fc942..7ece2aa96e9 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Image9.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Image9.h
@@ -38,19 +38,33 @@ class Image9 : public ImageD3D
virtual bool isDirty() const;
- virtual gl::Error setManagedSurface2D(TextureStorage *storage, int level);
- virtual gl::Error setManagedSurfaceCube(TextureStorage *storage, int face, int level);
- virtual gl::Error copyToStorage(TextureStorage *storage, const gl::ImageIndex &index, const gl::Box &region);
-
- gl::Error loadData(const gl::Box &area,
+ 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::Box &area, const void *input) override;
-
- gl::Error copyFromTexStorage(const gl::ImageIndex &imageIndex, TextureStorage *source) override;
- gl::Error copyFromFramebuffer(const gl::Offset &destOffset,
+ 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;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp
index 378ceebe3a8..df86331766b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp
@@ -54,7 +54,8 @@ gl::Error IndexBuffer9::initialize(unsigned int bufferSize, GLenum indexType, bo
HRESULT result = mRenderer->createIndexBuffer(bufferSize, usageFlags, format, &mIndexBuffer);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate internal index buffer of size, %lu.", bufferSize);
+ return gl::OutOfMemory()
+ << "Failed to allocate internal index buffer of size " << bufferSize;
}
}
@@ -69,7 +70,7 @@ gl::Error IndexBuffer9::mapBuffer(unsigned int offset, unsigned int size, void**
{
if (!mIndexBuffer)
{
- return gl::Error(GL_OUT_OF_MEMORY, "Internal index buffer is not initialized.");
+ return gl::OutOfMemory() << "Internal index buffer is not initialized.";
}
DWORD lockFlags = mDynamic ? D3DLOCK_NOOVERWRITE : 0;
@@ -78,7 +79,7 @@ gl::Error IndexBuffer9::mapBuffer(unsigned int offset, unsigned int size, void**
HRESULT result = mIndexBuffer->Lock(offset, size, &mapPtr, lockFlags);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to lock internal index buffer, HRESULT: 0x%08x.", result);
+ return gl::OutOfMemory() << "Failed to lock internal index buffer, " << gl::FmtHR(result);
}
*outMappedMemory = mapPtr;
@@ -89,13 +90,13 @@ gl::Error IndexBuffer9::unmapBuffer()
{
if (!mIndexBuffer)
{
- return gl::Error(GL_OUT_OF_MEMORY, "Internal index buffer is not initialized.");
+ return gl::OutOfMemory() << "Internal index buffer is not initialized.";
}
HRESULT result = mIndexBuffer->Unlock();
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to unlock internal index buffer, HRESULT: 0x%08x.", result);
+ return gl::OutOfMemory() << "Failed to unlock internal index buffer, " << gl::FmtHR(result);
}
return gl::NoError();
@@ -127,7 +128,7 @@ gl::Error IndexBuffer9::discard()
{
if (!mIndexBuffer)
{
- return gl::Error(GL_OUT_OF_MEMORY, "Internal index buffer is not initialized.");
+ return gl::OutOfMemory() << "Internal index buffer is not initialized.";
}
void *dummy;
@@ -136,13 +137,13 @@ gl::Error IndexBuffer9::discard()
result = mIndexBuffer->Lock(0, 1, &dummy, D3DLOCK_DISCARD);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to lock internal index buffer, HRESULT: 0x%08x.", result);
+ return gl::OutOfMemory() << "Failed to lock internal index buffer, " << gl::FmtHR(result);
}
result = mIndexBuffer->Unlock();
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to unlock internal index buffer, HRESULT: 0x%08x.", result);
+ return gl::OutOfMemory() << "Failed to unlock internal index buffer, " << gl::FmtHR(result);
}
return gl::NoError();
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Query9.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Query9.cpp
index 0305720a4f7..4ba053e6bd6 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Query9.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Query9.cpp
@@ -36,7 +36,7 @@ gl::Error Query9::begin()
HRESULT result = mRenderer->getDevice()->CreateQuery(d3dQueryType, &mQuery);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Internal query creation failed, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Internal query creation failed, " << gl::FmtHR(result);
}
}
@@ -46,8 +46,7 @@ gl::Error Query9::begin()
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to begin internal query, result: 0x%X.",
- result);
+ return gl::OutOfMemory() << "Failed to begin internal query, " << gl::FmtHR(result);
}
}
@@ -62,7 +61,7 @@ gl::Error Query9::end()
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to end internal query, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to end internal query, " << gl::FmtHR(result);
}
mQueryFinished = false;
@@ -74,7 +73,7 @@ gl::Error Query9::end()
gl::Error Query9::queryCounter()
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION, "Unimplemented");
+ return gl::InternalError() << "Unimplemented";
}
template <typename T>
@@ -174,12 +173,12 @@ gl::Error Query9::testQuery()
if (d3d9::isDeviceLostError(result))
{
mRenderer->notifyDeviceLost();
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to test get query result, device is lost.");
+ return gl::OutOfMemory() << "Failed to test get query result, device is lost.";
}
else if (mRenderer->testDeviceLost())
{
mRenderer->notifyDeviceLost();
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to test get query result, device is lost.");
+ return gl::OutOfMemory() << "Failed to test get query result, device is lost.";
}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
index 4d0d284841e..b8b75c857aa 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
@@ -13,6 +13,7 @@
#include "common/utilities.h"
#include "libANGLE/Buffer.h"
+#include "libANGLE/Context.h"
#include "libANGLE/Display.h"
#include "libANGLE/Framebuffer.h"
#include "libANGLE/FramebufferAttachment.h"
@@ -183,7 +184,7 @@ egl::Error Renderer9::initialize()
if (mD3d9Module == nullptr)
{
- return egl::Error(EGL_NOT_INITIALIZED, D3D9_INIT_MISSING_DEP, "No D3D9 module found.");
+ return egl::EglNotInitialized(D3D9_INIT_MISSING_DEP) << "No D3D9 module found.";
}
typedef HRESULT(WINAPI * Direct3DCreate9ExFunc)(UINT, IDirect3D9Ex **);
@@ -210,8 +211,7 @@ egl::Error Renderer9::initialize()
if (!mD3d9)
{
- return egl::Error(EGL_NOT_INITIALIZED, D3D9_INIT_MISSING_DEP,
- "Could not create D3D9 device.");
+ return egl::EglNotInitialized(D3D9_INIT_MISSING_DEP) << "Could not create D3D9 device.";
}
if (mDisplay->getNativeDisplayId() != nullptr)
@@ -240,8 +240,8 @@ egl::Error Renderer9::initialize()
// D3DERR_INVALIDDEVICE, or another error we can't recover
// from
{
- return egl::Error(EGL_NOT_INITIALIZED, D3D9_INIT_OTHER_ERROR,
- "Failed to get device caps: Error code 0x%x\n", result);
+ return egl::EglNotInitialized(D3D9_INIT_OTHER_ERROR)
+ << "Failed to get device caps, " << gl::FmtHR(result);
}
}
}
@@ -254,8 +254,8 @@ egl::Error Renderer9::initialize()
if (mDeviceCaps.PixelShaderVersion < D3DPS_VERSION(minShaderModel, 0))
{
- return egl::Error(EGL_NOT_INITIALIZED, D3D9_INIT_UNSUPPORTED_VERSION,
- "Renderer does not support PS %u.%u.aborting!", 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
@@ -263,8 +263,8 @@ egl::Error Renderer9::initialize()
// Texture2D::ensureRenderTarget.
if ((mDeviceCaps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES) == 0)
{
- return egl::Error(EGL_NOT_INITIALIZED, D3D9_INIT_UNSUPPORTED_STRETCHRECT,
- "Renderer does not support StretctRect from textures.");
+ return egl::EglNotInitialized(D3D9_INIT_UNSUPPORTED_STRETCHRECT)
+ << "Renderer does not support StretctRect from textures.";
}
{
@@ -295,8 +295,8 @@ egl::Error Renderer9::initialize()
}
if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_DEVICELOST)
{
- return egl::Error(EGL_BAD_ALLOC, D3D9_INIT_OUT_OF_MEMORY,
- "CreateDevice failed: device lost of out of memory");
+ return egl::EglBadAlloc(D3D9_INIT_OUT_OF_MEMORY)
+ << "CreateDevice failed: device lost of out of memory";
}
if (FAILED(result))
@@ -310,9 +310,8 @@ egl::Error Renderer9::initialize()
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY ||
result == D3DERR_NOTAVAILABLE || result == D3DERR_DEVICELOST);
- return egl::Error(
- EGL_BAD_ALLOC, D3D9_INIT_OUT_OF_MEMORY,
- "CreateDevice2 failed: device lost, not available, or of out of memory");
+ return egl::EglBadAlloc(D3D9_INIT_OUT_OF_MEMORY)
+ << "CreateDevice2 failed: device lost, not available, or of out of memory";
}
}
@@ -342,7 +341,7 @@ egl::Error Renderer9::initialize()
initializeDevice();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
// do any one-time device initialization
@@ -568,6 +567,9 @@ void Renderer9::generateDisplayExtensions(egl::DisplayExtensions *outExtensions)
// Contexts are virtualized so textures can be shared globally
outExtensions->displayTextureShareGroup = true;
+
+ // D3D9 can be used without an output surface
+ outExtensions->surfacelessContext = true;
}
void Renderer9::startScene()
@@ -608,7 +610,7 @@ gl::Error Renderer9::flush()
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to issue event query, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to issue event query, " << gl::FmtHR(result);
}
// Grab the query data once
@@ -621,7 +623,7 @@ gl::Error Renderer9::flush()
notifyDeviceLost();
}
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to get event query data, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to get event query data, " << gl::FmtHR(result);
}
return gl::NoError();
@@ -640,7 +642,7 @@ gl::Error Renderer9::finish()
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to issue event query, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to issue event query, " << gl::FmtHR(result);
}
// Grab the query data once
@@ -653,7 +655,7 @@ gl::Error Renderer9::finish()
}
freeEventQuery(query);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to get event query data, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to get event query data, " << gl::FmtHR(result);
}
// Loop until the query completes
@@ -680,8 +682,7 @@ gl::Error Renderer9::finish()
}
freeEventQuery(query);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to get event query data, result: 0x%X.",
- result);
+ return gl::OutOfMemory() << "Failed to get event query data, " << gl::FmtHR(result);
}
}
@@ -723,7 +724,7 @@ egl::Error Renderer9::getD3DTextureInfo(const egl::Config *config,
IDirect3DTexture9 *texture = nullptr;
if (FAILED(d3dTexture->QueryInterface(&texture)))
{
- return egl::Error(EGL_BAD_PARAMETER, "client buffer is not a IDirect3DTexture9");
+ return egl::EglBadParameter() << "Client buffer is not a IDirect3DTexture9";
}
IDirect3DDevice9 *textureDevice = nullptr;
@@ -731,7 +732,7 @@ egl::Error Renderer9::getD3DTextureInfo(const egl::Config *config,
if (textureDevice != mDevice)
{
SafeRelease(texture);
- return egl::Error(EGL_BAD_PARAMETER, "Texture's device does not match.");
+ return egl::EglBadParameter() << "Texture's device does not match.";
}
SafeRelease(textureDevice);
@@ -758,8 +759,8 @@ egl::Error Renderer9::getD3DTextureInfo(const egl::Config *config,
break;
default:
- return egl::Error(EGL_BAD_PARAMETER, "Unknown client buffer texture format: %u.",
- desc.Format);
+ return egl::EglBadParameter()
+ << "Unknown client buffer texture format: " << desc.Format;
}
if (fboFormat)
@@ -769,7 +770,7 @@ egl::Error Renderer9::getD3DTextureInfo(const egl::Config *config,
*fboFormat = d3dFormatInfo.info().fboImplementationInternalFormat;
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error Renderer9::validateShareHandle(const egl::Config *config,
@@ -778,7 +779,7 @@ egl::Error Renderer9::validateShareHandle(const egl::Config *config,
{
if (shareHandle == nullptr)
{
- return egl::Error(EGL_BAD_PARAMETER, "NULL share handle.");
+ return egl::EglBadParameter() << "NULL share handle.";
}
EGLint width = attribs.getAsInt(EGL_WIDTH, 0);
@@ -794,7 +795,7 @@ egl::Error Renderer9::validateShareHandle(const egl::Config *config,
&texture, &shareHandle);
if (FAILED(result))
{
- return egl::Error(EGL_BAD_PARAMETER, "Failed to open share handle, result: 0x%X.", result);
+ return egl::EglBadParameter() << "Failed to open share handle, " << gl::FmtHR(result);
}
DWORD levelCount = texture->GetLevelCount();
@@ -807,10 +808,10 @@ egl::Error Renderer9::validateShareHandle(const egl::Config *config,
desc.Height != static_cast<UINT>(height) ||
desc.Format != backBufferd3dFormatInfo.texFormat)
{
- return egl::Error(EGL_BAD_PARAMETER, "Invalid texture parameters in share handle texture.");
+ return egl::EglBadParameter() << "Invalid texture parameters in share handle texture.";
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
ContextImpl *Renderer9::createContext(const gl::ContextState &state)
@@ -831,8 +832,7 @@ gl::Error Renderer9::allocateEventQuery(IDirect3DQuery9 **outQuery)
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate event query, result: 0x%X.",
- result);
+ return gl::OutOfMemory() << "Failed to allocate event query, " << gl::FmtHR(result);
}
}
else
@@ -912,7 +912,8 @@ bool Renderer9::supportsFastCopyBufferToTexture(GLenum internalFormat) const
return false;
}
-gl::Error Renderer9::fastCopyBufferToTexture(const gl::PixelUnpackState &unpack,
+gl::Error Renderer9::fastCopyBufferToTexture(const gl::Context *context,
+ const gl::PixelUnpackState &unpack,
unsigned int offset,
RenderTargetD3D *destRenderTarget,
GLenum destinationFormat,
@@ -921,10 +922,11 @@ gl::Error Renderer9::fastCopyBufferToTexture(const gl::PixelUnpackState &unpack,
{
// Pixel buffer objects are not supported in D3D9, since D3D9 is ES2-only and PBOs are ES3.
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error Renderer9::setSamplerState(gl::SamplerType type,
+gl::Error Renderer9::setSamplerState(const gl::Context *context,
+ gl::SamplerType type,
int index,
gl::Texture *texture,
const gl::SamplerState &samplerState)
@@ -936,11 +938,7 @@ gl::Error Renderer9::setSamplerState(gl::SamplerType type,
TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture);
TextureStorage *storage = nullptr;
- gl::Error error = textureD3D->getNativeTexture(&storage);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(textureD3D->getNativeTexture(context, &storage));
// Storage should exist, texture should be complete
ASSERT(storage);
@@ -985,7 +983,10 @@ gl::Error Renderer9::setSamplerState(gl::SamplerType type,
return gl::NoError();
}
-gl::Error Renderer9::setTexture(gl::SamplerType type, int index, gl::Texture *texture)
+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;
@@ -1000,21 +1001,13 @@ gl::Error Renderer9::setTexture(gl::SamplerType type, int index, gl::Texture *te
TextureD3D *textureImpl = GetImplAs<TextureD3D>(texture);
TextureStorage *texStorage = nullptr;
- gl::Error error = textureImpl->getNativeTexture(&texStorage);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(textureImpl->getNativeTexture(context, &texStorage));
// Texture should be complete and have a storage
ASSERT(texStorage);
TextureStorage9 *storage9 = GetAs<TextureStorage9>(texStorage);
- error = storage9->getBaseTexture(&d3dTexture);
- if (error.isError())
- {
- return error;
- }
+ 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
@@ -1042,7 +1035,7 @@ gl::Error Renderer9::setUniformBuffers(const gl::ContextState & /*data*/,
return gl::NoError();
}
-gl::Error Renderer9::updateState(Context9 *context, GLenum drawMode)
+gl::Error Renderer9::updateState(const gl::Context *context, GLenum drawMode)
{
const auto &data = context->getContextState();
const auto &glState = data.getState();
@@ -1071,7 +1064,7 @@ gl::Error Renderer9::updateState(Context9 *context, GLenum drawMode)
{
ASSERT(firstColorAttachment->isAttached());
RenderTarget9 *renderTarget = nullptr;
- ANGLE_TRY(firstColorAttachment->getRenderTarget(&renderTarget));
+ ANGLE_TRY(firstColorAttachment->getRenderTarget(context, &renderTarget));
samples = renderTarget->getSamples();
}
gl::RasterizerState rasterizer = glState.getRasterizerState();
@@ -1079,7 +1072,7 @@ gl::Error Renderer9::updateState(Context9 *context, GLenum drawMode)
rasterizer.multiSample = (samples != 0);
unsigned int mask = GetBlendSampleMask(data, samples);
- ANGLE_TRY(setBlendDepthRasterStates(data, mask));
+ ANGLE_TRY(setBlendDepthRasterStates(context, mask));
mStateManager.resetDirtyBits();
@@ -1091,9 +1084,9 @@ void Renderer9::setScissorRectangle(const gl::Rectangle &scissor, bool enabled)
mStateManager.setScissorState(scissor, enabled);
}
-gl::Error Renderer9::setBlendDepthRasterStates(const gl::ContextState &glData, GLenum drawMode)
+gl::Error Renderer9::setBlendDepthRasterStates(const gl::Context *context, GLenum drawMode)
{
- const auto &glState = glData.getState();
+ const auto &glState = context->getGLState();
auto drawFramebuffer = glState.getDrawFramebuffer();
ASSERT(!drawFramebuffer->hasAnyDirtyBit());
// Since framebuffer->getSamples will return the original samples which may be different with
@@ -1105,14 +1098,14 @@ gl::Error Renderer9::setBlendDepthRasterStates(const gl::ContextState &glData, G
{
ASSERT(firstColorAttachment->isAttached());
RenderTarget9 *renderTarget = nullptr;
- ANGLE_TRY(firstColorAttachment->getRenderTarget(&renderTarget));
+ 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(glData, samples);
+ unsigned int mask = GetBlendSampleMask(context->getContextState(), samples);
return mStateManager.setBlendDepthRasterStates(glState, mask);
}
@@ -1167,7 +1160,7 @@ bool Renderer9::applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSiz
return mPrimitiveCount > 0;
}
-gl::Error Renderer9::getNullColorbuffer(GLImplFactory *implFactory,
+gl::Error Renderer9::getNullColorbuffer(const gl::Context *context,
const gl::FramebufferAttachment *depthbuffer,
const gl::FramebufferAttachment **outColorBuffer)
{
@@ -1188,8 +1181,10 @@ gl::Error Renderer9::getNullColorbuffer(GLImplFactory *implFactory,
}
}
+ auto *implFactory = context->getImplementation();
+
gl::Renderbuffer *nullRenderbuffer = new gl::Renderbuffer(implFactory->createRenderbuffer(), 0);
- gl::Error error = nullRenderbuffer->setStorage(GL_NONE, size.width, size.height);
+ gl::Error error = nullRenderbuffer->setStorage(context, GL_NONE, size.width, size.height);
if (error.isError())
{
SafeDelete(nullRenderbuffer);
@@ -1197,7 +1192,7 @@ gl::Error Renderer9::getNullColorbuffer(GLImplFactory *implFactory,
}
gl::FramebufferAttachment *nullbuffer = new gl::FramebufferAttachment(
- GL_RENDERBUFFER, GL_NONE, gl::ImageIndex::MakeInvalid(), nullRenderbuffer);
+ context, GL_RENDERBUFFER, GL_NONE, gl::ImageIndex::MakeInvalid(), nullRenderbuffer);
// add nullbuffer to the cache
NullColorbufferCacheEntry *oldest = &mNullColorbufferCache[0];
@@ -1219,22 +1214,17 @@ gl::Error Renderer9::getNullColorbuffer(GLImplFactory *implFactory,
return gl::NoError();
}
-gl::Error Renderer9::applyRenderTarget(GLImplFactory *implFactory,
+gl::Error Renderer9::applyRenderTarget(const gl::Context *context,
const gl::FramebufferAttachment *colorAttachment,
const gl::FramebufferAttachment *depthStencilAttachment)
{
const gl::FramebufferAttachment *renderAttachment = colorAttachment;
- gl::Error error(GL_NO_ERROR);
// 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)
{
- error = getNullColorbuffer(implFactory, depthStencilAttachment, &renderAttachment);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(getNullColorbuffer(context, depthStencilAttachment, &renderAttachment));
}
ASSERT(renderAttachment != nullptr);
@@ -1243,11 +1233,7 @@ gl::Error Renderer9::applyRenderTarget(GLImplFactory *implFactory,
D3DFORMAT renderTargetFormat = D3DFMT_UNKNOWN;
RenderTarget9 *renderTarget = nullptr;
- error = renderAttachment->getRenderTarget(&renderTarget);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(renderAttachment->getRenderTarget(context, &renderTarget));
ASSERT(renderTarget);
bool renderTargetChanged = false;
@@ -1274,11 +1260,7 @@ gl::Error Renderer9::applyRenderTarget(GLImplFactory *implFactory,
if (depthStencilAttachment != nullptr)
{
- error = depthStencilAttachment->getRenderTarget(&depthStencilRenderTarget);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(depthStencilAttachment->getRenderTarget(context, &depthStencilRenderTarget));
ASSERT(depthStencilRenderTarget);
depthStencilSerial = depthStencilRenderTarget->getSerial();
@@ -1324,10 +1306,10 @@ gl::Error Renderer9::applyRenderTarget(GLImplFactory *implFactory,
return gl::NoError();
}
-gl::Error Renderer9::applyRenderTarget(GLImplFactory *implFactory,
+gl::Error Renderer9::applyRenderTarget(const gl::Context *context,
const gl::Framebuffer *framebuffer)
{
- return applyRenderTarget(implFactory, framebuffer->getColorbuffer(0),
+ return applyRenderTarget(context, framebuffer->getColorbuffer(0),
framebuffer->getDepthOrStencilbuffer());
}
@@ -1509,9 +1491,8 @@ gl::Error Renderer9::drawLineLoop(GLsizei count,
if (static_cast<unsigned int>(count) + 1 >
(std::numeric_limits<unsigned int>::max() / sizeof(unsigned int)))
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create a 32-bit looping index buffer for GL_LINE_LOOP, too "
- "many indices required.");
+ return gl::OutOfMemory() << "Failed to create a 32-bit looping index buffer for "
+ "GL_LINE_LOOP, too many indices required.";
}
const unsigned int spaceNeeded =
@@ -1593,9 +1574,8 @@ gl::Error Renderer9::drawLineLoop(GLsizei count,
if (static_cast<unsigned int>(count) + 1 >
(std::numeric_limits<unsigned short>::max() / sizeof(unsigned short)))
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create a 16-bit looping index buffer for GL_LINE_LOOP, too "
- "many indices required.");
+ return gl::OutOfMemory() << "Failed to create a 16-bit looping index buffer for "
+ "GL_LINE_LOOP, too many indices required.";
}
const unsigned int spaceNeeded =
@@ -1721,7 +1701,7 @@ gl::Error Renderer9::drawIndexedPoints(GLsizei count,
return drawPoints<GLuint>(mDevice, count, indices, minIndex);
default:
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
}
@@ -1790,30 +1770,31 @@ gl::Error Renderer9::getCountingIB(size_t count, StaticIndexBufferInterface **ou
}
else
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Could not create a counting index buffer for glDrawArraysInstanced.");
+ return gl::OutOfMemory()
+ << "Could not create a counting index buffer for glDrawArraysInstanced.";
}
*outIB = mCountingIB;
return gl::NoError();
}
-gl::Error Renderer9::applyShaders(const gl::ContextState &data, GLenum drawMode)
+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>(data.getState().getProgram());
- programD3D->updateCachedInputLayout(data.getState());
+ ProgramD3D *programD3D = GetImplAs<ProgramD3D>(state.getProgram());
+ programD3D->updateCachedInputLayout(state);
const auto &inputLayout = programD3D->getCachedInputLayout();
ShaderExecutableD3D *vertexExe = nullptr;
ANGLE_TRY(programD3D->getVertexExecutableForInputLayout(inputLayout, &vertexExe, nullptr));
- const gl::Framebuffer *drawFramebuffer = data.getState().getDrawFramebuffer();
+ const gl::Framebuffer *drawFramebuffer = state.getDrawFramebuffer();
ShaderExecutableD3D *pixelExe = nullptr;
- ANGLE_TRY(programD3D->getPixelExecutableForFramebuffer(drawFramebuffer, &pixelExe));
+ ANGLE_TRY(programD3D->getPixelExecutableForFramebuffer(context, drawFramebuffer, &pixelExe));
IDirect3DVertexShader9 *vertexShader =
(vertexExe ? GetAs<ShaderExecutable9>(vertexExe)->getVertexShader() : nullptr);
@@ -1945,7 +1926,8 @@ void Renderer9::applyUniformnbv(const D3DUniform *targetUniform, const GLint *v)
applyUniformnfv(targetUniform, (GLfloat *)vector);
}
-gl::Error Renderer9::clear(const ClearParameters &clearParams,
+gl::Error Renderer9::clear(const gl::Context *context,
+ const ClearParameters &clearParams,
const gl::FramebufferAttachment *colorBuffer,
const gl::FramebufferAttachment *depthStencilBuffer)
{
@@ -1953,7 +1935,7 @@ gl::Error Renderer9::clear(const ClearParameters &clearParams,
{
// Clearing buffers with non-float values is not supported by Renderer9 and ES 2.0
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
bool clearColor = clearParams.clearColor[0];
@@ -1964,7 +1946,7 @@ gl::Error Renderer9::clear(const ClearParameters &clearParams,
// Clearing individual buffers other than buffer zero is not supported by Renderer9 and
// ES 2.0
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
}
@@ -1977,7 +1959,7 @@ gl::Error Renderer9::clear(const ClearParameters &clearParams,
ASSERT(depthStencilBuffer != nullptr);
RenderTargetD3D *stencilRenderTarget = nullptr;
- gl::Error error = depthStencilBuffer->getRenderTarget(&stencilRenderTarget);
+ gl::Error error = depthStencilBuffer->getRenderTarget(context, &stencilRenderTarget);
if (error.isError())
{
return error;
@@ -2002,7 +1984,7 @@ gl::Error Renderer9::clear(const ClearParameters &clearParams,
ASSERT(colorBuffer != nullptr);
RenderTargetD3D *colorRenderTarget = nullptr;
- gl::Error error = colorBuffer->getRenderTarget(&colorRenderTarget);
+ gl::Error error = colorBuffer->getRenderTarget(context, &colorRenderTarget);
if (error.isError())
{
return error;
@@ -2259,6 +2241,10 @@ void Renderer9::releaseDeviceResources()
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);
}
}
@@ -2510,7 +2496,8 @@ D3DPOOL Renderer9::getBufferPool(DWORD usage) const
return D3DPOOL_DEFAULT;
}
-gl::Error Renderer9::copyImage2D(const gl::Framebuffer *framebuffer,
+gl::Error Renderer9::copyImage2D(const gl::Context *context,
+ const gl::Framebuffer *framebuffer,
const gl::Rectangle &sourceRect,
GLenum destFormat,
const gl::Offset &destOffset,
@@ -2523,10 +2510,11 @@ gl::Error Renderer9::copyImage2D(const gl::Framebuffer *framebuffer,
rect.right = sourceRect.x + sourceRect.width;
rect.bottom = sourceRect.y + sourceRect.height;
- return mBlit->copy2D(framebuffer, rect, destFormat, destOffset, storage, level);
+ return mBlit->copy2D(context, framebuffer, rect, destFormat, destOffset, storage, level);
}
-gl::Error Renderer9::copyImageCube(const gl::Framebuffer *framebuffer,
+gl::Error Renderer9::copyImageCube(const gl::Context *context,
+ const gl::Framebuffer *framebuffer,
const gl::Rectangle &sourceRect,
GLenum destFormat,
const gl::Offset &destOffset,
@@ -2540,10 +2528,12 @@ gl::Error Renderer9::copyImageCube(const gl::Framebuffer *framebuffer,
rect.right = sourceRect.x + sourceRect.width;
rect.bottom = sourceRect.y + sourceRect.height;
- return mBlit->copyCube(framebuffer, rect, destFormat, destOffset, storage, target, level);
+ return mBlit->copyCube(context, framebuffer, rect, destFormat, destOffset, storage, target,
+ level);
}
-gl::Error Renderer9::copyImage3D(const gl::Framebuffer *framebuffer,
+gl::Error Renderer9::copyImage3D(const gl::Context *context,
+ const gl::Framebuffer *framebuffer,
const gl::Rectangle &sourceRect,
GLenum destFormat,
const gl::Offset &destOffset,
@@ -2552,10 +2542,11 @@ gl::Error Renderer9::copyImage3D(const gl::Framebuffer *framebuffer,
{
// 3D textures are not available in the D3D9 backend.
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error Renderer9::copyImage2DArray(const gl::Framebuffer *framebuffer,
+gl::Error Renderer9::copyImage2DArray(const gl::Context *context,
+ const gl::Framebuffer *framebuffer,
const gl::Rectangle &sourceRect,
GLenum destFormat,
const gl::Offset &destOffset,
@@ -2564,10 +2555,11 @@ gl::Error Renderer9::copyImage2DArray(const gl::Framebuffer *framebuffer,
{
// 2D array textures are not available in the D3D9 backend.
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error Renderer9::copyTexture(const gl::Texture *source,
+gl::Error Renderer9::copyTexture(const gl::Context *context,
+ const gl::Texture *source,
GLint sourceLevel,
const gl::Rectangle &sourceRect,
GLenum destFormat,
@@ -2585,18 +2577,19 @@ gl::Error Renderer9::copyTexture(const gl::Texture *source,
rect.right = sourceRect.x + sourceRect.width;
rect.bottom = sourceRect.y + sourceRect.height;
- return mBlit->copyTexture(source, sourceLevel, rect, destFormat, destOffset, storage,
+ return mBlit->copyTexture(context, source, sourceLevel, rect, destFormat, destOffset, storage,
destTarget, destLevel, unpackFlipY, unpackPremultiplyAlpha,
unpackUnmultiplyAlpha);
}
-gl::Error Renderer9::copyCompressedTexture(const gl::Texture *source,
+gl::Error Renderer9::copyCompressedTexture(const gl::Context *context,
+ const gl::Texture *source,
GLint sourceLevel,
TextureStorage *storage,
GLint destLevel)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error Renderer9::createRenderTarget(int width,
@@ -2648,8 +2641,7 @@ gl::Error Renderer9::createRenderTarget(int width,
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create render target, result: 0x%X.",
- result);
+ return gl::OutOfMemory() << "Failed to create render target, " << gl::FmtHR(result);
}
if (requiresInitialization)
@@ -2690,14 +2682,14 @@ gl::Error Renderer9::createRenderTargetCopy(RenderTargetD3D *source, RenderTarge
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to copy render target, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to copy render target, " << gl::FmtHR(result);
}
*outRT = newRT;
return gl::NoError();
}
-gl::Error Renderer9::loadExecutable(const void *function,
+gl::Error Renderer9::loadExecutable(const uint8_t *function,
size_t length,
ShaderType type,
const std::vector<D3DVarying> &streamOutVaryings,
@@ -2733,7 +2725,7 @@ gl::Error Renderer9::loadExecutable(const void *function,
break;
default:
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
return gl::NoError();
@@ -2762,7 +2754,7 @@ gl::Error Renderer9::compileToExecutable(gl::InfoLog &infoLog,
break;
default:
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
profileStream << "_" << ((getMajorShaderModel() >= 3) ? 3 : 2);
@@ -2817,8 +2809,9 @@ gl::Error Renderer9::compileToExecutable(gl::InfoLog &infoLog,
return gl::NoError();
}
- error = loadExecutable(binary->GetBufferPointer(), binary->GetBufferSize(), type,
- streamOutVaryings, separatedOutputBuffers, outExectuable);
+ error = loadExecutable(reinterpret_cast<const uint8_t *>(binary->GetBufferPointer()),
+ binary->GetBufferSize(), type, streamOutVaryings, separatedOutputBuffers,
+ outExectuable);
SafeRelease(binary);
if (error.isError())
@@ -2899,8 +2892,7 @@ gl::Error Renderer9::copyToRenderTarget(IDirect3DSurface9 *dest,
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to blit internal texture, result: 0x%X.",
- result);
+ return gl::OutOfMemory() << "Failed to blit internal texture, " << gl::FmtHR(result);
}
return gl::NoError();
@@ -2911,20 +2903,34 @@ ImageD3D *Renderer9::createImage()
return new Image9(this);
}
-gl::Error Renderer9::generateMipmap(ImageD3D *dest, ImageD3D *src)
+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(TextureStorage *storage,
+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)
+{
+ UNREACHABLE();
+ return gl::NoError();
+}
+
TextureStorage *Renderer9::createTextureStorage2D(SwapChainD3D *swapChain)
{
SwapChain9 *swapChain9 = GetAs<SwapChain9>(swapChain);
@@ -2991,6 +2997,19 @@ TextureStorage *Renderer9::createTextureStorage2DArray(GLenum internalformat,
return nullptr;
}
+TextureStorage *Renderer9::createTextureStorage2DMultisample(GLenum internalformat,
+ GLsizei width,
+ GLsizei height,
+ int levels,
+ int samples,
+ GLboolean fixedSampleLocations)
+{
+ // 2D multisampled textures are not supported by the D3D9 backend.
+ UNREACHABLE();
+
+ return NULL;
+}
+
bool Renderer9::getLUID(LUID *adapterLuid) const
{
adapterLuid->HighPart = 0;
@@ -3029,20 +3048,21 @@ gl::ErrorOrResult<unsigned int> Renderer9::getVertexSpaceRequired(const gl::Vert
const d3d9::VertexFormat &d3d9VertexInfo =
d3d9::GetVertexFormatInfo(getCapsDeclTypes(), vertexFormatType);
- unsigned int elementCount = 0;
- if (instances == 0 || binding.divisor == 0)
+ 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), binding.divisor);
+ elementCount = UnsignedCeilDivide(static_cast<unsigned int>(instances), divisor);
}
if (d3d9VertexInfo.outputElementSize > std::numeric_limits<unsigned int>::max() / elementCount)
{
- return gl::Error(GL_OUT_OF_MEMORY, "New vertex buffer size would result in an overflow.");
+ return gl::OutOfMemory() << "New vertex buffer size would result in an overflow.";
}
return static_cast<unsigned int>(d3d9VertexInfo.outputElementSize) * elementCount;
@@ -3062,16 +3082,15 @@ angle::WorkaroundsD3D Renderer9::generateWorkarounds() const
return d3d9::GenerateWorkarounds();
}
-gl::Error Renderer9::clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd)
+gl::Error Renderer9::clearTextures(const gl::Context *context,
+ gl::SamplerType samplerType,
+ size_t rangeStart,
+ size_t rangeEnd)
{
// TODO(jmadill): faster way?
for (size_t samplerIndex = rangeStart; samplerIndex < rangeEnd; samplerIndex++)
{
- gl::Error error = setTexture(samplerType, static_cast<int>(samplerIndex), nullptr);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(setTexture(context, samplerType, static_cast<int>(samplerIndex), nullptr));
}
return gl::NoError();
@@ -3094,7 +3113,7 @@ egl::Error Renderer9::getEGLDevice(DeviceImpl **device)
}
*device = static_cast<DeviceImpl *>(mEGLDevice);
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
Renderer9::CurSamplerState::CurSamplerState()
@@ -3102,7 +3121,7 @@ Renderer9::CurSamplerState::CurSamplerState()
{
}
-gl::Error Renderer9::genericDrawElements(Context9 *context,
+gl::Error Renderer9::genericDrawElements(const gl::Context *context,
GLenum mode,
GLsizei count,
GLenum type,
@@ -3140,8 +3159,8 @@ gl::Error Renderer9::genericDrawElements(Context9 *context,
ANGLE_TRY(applyVertexBuffer(data.getState(), mode,
static_cast<GLsizei>(indexInfo.indexRange.start),
static_cast<GLsizei>(vertexCount), instances, &indexInfo));
- ANGLE_TRY(applyTextures(context, data));
- ANGLE_TRY(applyShaders(data, mode));
+ ANGLE_TRY(applyTextures(context));
+ ANGLE_TRY(applyShaders(context, mode));
ANGLE_TRY(programD3D->applyUniformBuffers(data));
if (!skipDraw(data, mode))
@@ -3152,7 +3171,7 @@ gl::Error Renderer9::genericDrawElements(Context9 *context,
return gl::NoError();
}
-gl::Error Renderer9::genericDrawArrays(Context9 *context,
+gl::Error Renderer9::genericDrawArrays(const gl::Context *context,
GLenum mode,
GLint first,
GLsizei count,
@@ -3174,8 +3193,8 @@ gl::Error Renderer9::genericDrawArrays(Context9 *context,
ANGLE_TRY(updateState(context, mode));
ANGLE_TRY(applyTransformFeedbackBuffers(data.getState()));
ANGLE_TRY(applyVertexBuffer(data.getState(), mode, first, count, instances, nullptr));
- ANGLE_TRY(applyTextures(context, data));
- ANGLE_TRY(applyShaders(data, mode));
+ ANGLE_TRY(applyTextures(context));
+ ANGLE_TRY(applyShaders(context, mode));
ANGLE_TRY(programD3D->applyUniformBuffers(data));
if (!skipDraw(data, mode))
@@ -3208,4 +3227,10 @@ gl::Error Renderer9::applyComputeUniforms(const ProgramD3D &programD3D,
return gl::InternalError() << "Compute shader is not implemented on D3D9";
}
+gl::Error Renderer9::clearRenderTarget(RenderTargetD3D *renderTarget, const gl::ColorF &clearValues)
+{
+ UNIMPLEMENTED();
+ return gl::InternalError() << "clearRenderTarget is not implemented on D3D9";
+}
+
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.h
index ce7fb7117b1..e22239ce2fb 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.h
@@ -119,17 +119,21 @@ class Renderer9 : public RendererD3D
DWORD Usage,
D3DFORMAT Format,
IDirect3DIndexBuffer9 **ppIndexBuffer);
- gl::Error setSamplerState(gl::SamplerType type,
+ gl::Error setSamplerState(const gl::Context *context,
+ gl::SamplerType type,
int index,
gl::Texture *texture,
const gl::SamplerState &sampler) override;
- gl::Error setTexture(gl::SamplerType type, int index, gl::Texture *texture) override;
+ gl::Error setTexture(const gl::Context *context,
+ gl::SamplerType type,
+ int index,
+ gl::Texture *texture) override;
gl::Error setUniformBuffers(const gl::ContextState &data,
const std::vector<GLint> &vertexUniformBuffers,
const std::vector<GLint> &fragmentUniformBuffers) override;
- gl::Error updateState(Context9 *context, GLenum drawMode);
+ gl::Error updateState(const gl::Context *context, GLenum drawMode);
void setScissorRectangle(const gl::Rectangle &scissor, bool enabled);
void setViewport(const gl::Rectangle &viewport,
@@ -139,8 +143,8 @@ class Renderer9 : public RendererD3D
GLenum frontFace,
bool ignoreViewport);
- gl::Error applyRenderTarget(GLImplFactory *implFactory, const gl::Framebuffer *frameBuffer);
- gl::Error applyRenderTarget(GLImplFactory *implFactory,
+ 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(const ProgramD3D &programD3D,
@@ -162,7 +166,8 @@ class Renderer9 : public RendererD3D
gl::Error applyTransformFeedbackBuffers(const gl::State &state);
- gl::Error clear(const ClearParameters &clearParams,
+ gl::Error clear(const gl::Context *context,
+ const ClearParameters &clearParams,
const gl::FramebufferAttachment *colorBuffer,
const gl::FramebufferAttachment *depthStencilBuffer);
@@ -193,33 +198,38 @@ class Renderer9 : public RendererD3D
DWORD getCapsDeclTypes() const;
// Pixel operations
- gl::Error copyImage2D(const gl::Framebuffer *framebuffer,
+ 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::Framebuffer *framebuffer,
+ 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::Framebuffer *framebuffer,
+ 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::Framebuffer *framebuffer,
+ 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::Texture *source,
+ gl::Error copyTexture(const gl::Context *context,
+ const gl::Texture *source,
GLint sourceLevel,
const gl::Rectangle &sourceRect,
GLenum destFormat,
@@ -230,7 +240,8 @@ class Renderer9 : public RendererD3D
bool unpackFlipY,
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha) override;
- gl::Error copyCompressedTexture(const gl::Texture *source,
+ gl::Error copyCompressedTexture(const gl::Context *context,
+ const gl::Texture *source,
GLint sourceLevel,
TextureStorage *storage,
GLint destLevel) override;
@@ -244,7 +255,7 @@ class Renderer9 : public RendererD3D
gl::Error createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) override;
// Shader operations
- gl::Error loadExecutable(const void *function,
+ gl::Error loadExecutable(const uint8_t *function,
size_t length,
ShaderType type,
const std::vector<D3DVarying> &streamOutVaryings,
@@ -263,9 +274,18 @@ class Renderer9 : public RendererD3D
// Image operations
ImageD3D *createImage() override;
- gl::Error generateMipmap(ImageD3D *dest, ImageD3D *source) override;
- gl::Error generateMipmapUsingD3D(TextureStorage *storage,
+ 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;
@@ -296,6 +316,13 @@ class Renderer9 : public RendererD3D
GLsizei depth,
int levels) override;
+ TextureStorage *createTextureStorage2DMultisample(GLenum internalformat,
+ GLsizei width,
+ GLsizei height,
+ int levels,
+ int samples,
+ GLboolean fixedSampleLocations) override;
+
// Buffer creation
VertexBuffer *createVertexBuffer() override;
IndexBuffer *createIndexBuffer() override;
@@ -307,7 +334,8 @@ class Renderer9 : public RendererD3D
// Buffer-to-texture and Texture-to-buffer copies
bool supportsFastCopyBufferToTexture(GLenum internalFormat) const override;
- gl::Error fastCopyBufferToTexture(const gl::PixelUnpackState &unpack,
+ gl::Error fastCopyBufferToTexture(const gl::Context *context,
+ const gl::PixelUnpackState &unpack,
unsigned int offset,
RenderTargetD3D *destRenderTarget,
GLenum destinationFormat,
@@ -343,13 +371,13 @@ class Renderer9 : public RendererD3D
StateManager9 *getStateManager() { return &mStateManager; }
- gl::Error genericDrawArrays(Context9 *context,
+ gl::Error genericDrawArrays(const gl::Context *context,
GLenum mode,
GLint first,
GLsizei count,
GLsizei instances);
- gl::Error genericDrawElements(Context9 *context,
+ gl::Error genericDrawElements(const gl::Context *context,
GLenum mode,
GLsizei count,
GLenum type,
@@ -367,8 +395,12 @@ class Renderer9 : public RendererD3D
gl::Error applyComputeUniforms(const ProgramD3D &programD3D,
const std::vector<D3DUniform *> &uniformArray) override;
+ gl::Error clearRenderTarget(RenderTargetD3D *renderTarget,
+ const gl::ColorF &clearValues) override;
+
protected:
- gl::Error clearTextures(gl::SamplerType samplerType,
+ gl::Error clearTextures(const gl::Context *context,
+ gl::SamplerType samplerType,
size_t rangeStart,
size_t rangeEnd) override;
@@ -386,7 +418,7 @@ class Renderer9 : public RendererD3D
const void *indices,
GLsizei instances);
- gl::Error applyShaders(const gl::ContextState &data, GLenum drawMode);
+ gl::Error applyShaders(const gl::Context *context, GLenum drawMode);
void generateCaps(gl::Caps *outCaps,
gl::TextureCapsMap *outTextureCaps,
@@ -395,7 +427,7 @@ class Renderer9 : public RendererD3D
angle::WorkaroundsD3D generateWorkarounds() const override;
- gl::Error setBlendDepthRasterStates(const gl::ContextState &glData, GLenum drawMode);
+ gl::Error setBlendDepthRasterStates(const gl::Context *context, GLenum drawMode);
void release();
@@ -416,7 +448,7 @@ class Renderer9 : public RendererD3D
gl::Error getCountingIB(size_t count, StaticIndexBufferInterface **outIB);
- gl::Error getNullColorbuffer(GLImplFactory *implFactory,
+ gl::Error getNullColorbuffer(const gl::Context *context,
const gl::FramebufferAttachment *depthbuffer,
const gl::FramebufferAttachment **outColorBuffer);
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/ShaderCache.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/ShaderCache.h
index 079e5f0e127..399770dd8d1 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/ShaderCache.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/ShaderCache.h
@@ -52,7 +52,7 @@ class ShaderCache : angle::NonCopyable
HRESULT result = createShader(function, &shader);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create shader, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to create shader, " << gl::FmtHR(result);
}
// Random eviction policy.
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp
index 65566674d7d..f9323ab6871 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp
@@ -79,13 +79,16 @@ static DWORD convertInterval(EGLint interval)
#endif
}
-EGLint SwapChain9::resize(int backbufferWidth, int backbufferHeight)
+EGLint SwapChain9::resize(const gl::Context *context, int backbufferWidth, int backbufferHeight)
{
// D3D9 does not support resizing swap chains without recreating them
- return reset(backbufferWidth, backbufferHeight, mSwapInterval);
+ return reset(context, backbufferWidth, backbufferHeight, mSwapInterval);
}
-EGLint SwapChain9::reset(int backbufferWidth, int backbufferHeight, EGLint swapInterval)
+EGLint SwapChain9::reset(const gl::Context *context,
+ int backbufferWidth,
+ int backbufferHeight,
+ EGLint swapInterval)
{
IDirect3DDevice9 *device = mRenderer->getDevice();
@@ -265,7 +268,11 @@ EGLint SwapChain9::reset(int backbufferWidth, int backbufferHeight, EGLint swapI
}
// parameters should be validated/clamped by caller
-EGLint SwapChain9::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
+EGLint SwapChain9::swapRect(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height)
{
if (!mSwapChain)
{
@@ -413,7 +420,7 @@ void *SwapChain9::getKeyedMutex()
egl::Error SwapChain9::getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc)
{
UNREACHABLE();
- return egl::Error(EGL_BAD_SURFACE);
+ return egl::EglBadSurface();
}
void SwapChain9::recreate()
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.h
index 11fde1a5403..6b12fa3967a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.h
@@ -30,9 +30,16 @@ class SwapChain9 : public SwapChainD3D
EGLint orientation);
virtual ~SwapChain9();
- EGLint resize(EGLint backbufferWidth, EGLint backbufferHeight);
- virtual EGLint reset(EGLint backbufferWidth, EGLint backbufferHeight, EGLint swapInterval);
- virtual EGLint swapRect(EGLint x, EGLint y, EGLint width, EGLint height);
+ EGLint resize(const gl::Context *context, EGLint backbufferWidth, EGLint backbufferHeight);
+ virtual EGLint reset(const gl::Context *context,
+ EGLint backbufferWidth,
+ EGLint backbufferHeight,
+ EGLint swapInterval);
+ virtual EGLint swapRect(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height);
virtual void recreate();
RenderTargetD3D *getColorRenderTarget() override { return &mColorRenderTarget; }
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp
index fd3e2c83846..9bcaeb6a6f7 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp
@@ -93,11 +93,16 @@ int TextureStorage9::getLevelCount() const
return static_cast<int>(mMipLevels) - mTopLevel;
}
-gl::Error TextureStorage9::setData(const gl::ImageIndex &index, ImageD3D *image, const gl::Box *destBox, GLenum type,
- const gl::PixelUnpackState &unpack, const uint8_t *pixelData)
+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::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
TextureStorage9_2D::TextureStorage9_2D(Renderer9 *renderer, SwapChain9 *swapchain)
@@ -147,7 +152,8 @@ TextureStorage9_2D::~TextureStorage9_2D()
// Increments refcount on surface.
// caller must Release() the returned surface
-gl::Error TextureStorage9_2D::getSurfaceLevel(GLenum target,
+gl::Error TextureStorage9_2D::getSurfaceLevel(const gl::Context *context,
+ GLenum target,
int level,
bool dirty,
IDirect3DSurface9 **outSurface)
@@ -155,7 +161,7 @@ gl::Error TextureStorage9_2D::getSurfaceLevel(GLenum target,
ASSERT(target == GL_TEXTURE_2D);
IDirect3DBaseTexture9 *baseTexture = nullptr;
- gl::Error error = getBaseTexture(&baseTexture);
+ gl::Error error = getBaseTexture(context, &baseTexture);
if (error.isError())
{
return error;
@@ -168,7 +174,8 @@ gl::Error TextureStorage9_2D::getSurfaceLevel(GLenum target,
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to get the surface from a texture, result: 0x%X.", 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
@@ -180,21 +187,23 @@ gl::Error TextureStorage9_2D::getSurfaceLevel(GLenum target,
return gl::NoError();
}
-gl::Error TextureStorage9_2D::getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT)
+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(&baseTexture);
+ gl::Error error = getBaseTexture(context, &baseTexture);
if (error.isError())
{
return error;
}
IDirect3DSurface9 *surface = nullptr;
- error = getSurfaceLevel(GL_TEXTURE_2D, index.mipIndex, false, &surface);
+ error = getSurfaceLevel(context, GL_TEXTURE_2D, index.mipIndex, false, &surface);
if (error.isError())
{
return error;
@@ -215,17 +224,19 @@ gl::Error TextureStorage9_2D::getRenderTarget(const gl::ImageIndex &index, Rende
return gl::NoError();
}
-gl::Error TextureStorage9_2D::generateMipmap(const gl::ImageIndex &sourceIndex, const gl::ImageIndex &destIndex)
+gl::Error TextureStorage9_2D::generateMipmap(const gl::Context *context,
+ const gl::ImageIndex &sourceIndex,
+ const gl::ImageIndex &destIndex)
{
IDirect3DSurface9 *upper = nullptr;
- gl::Error error = getSurfaceLevel(GL_TEXTURE_2D, sourceIndex.mipIndex, false, &upper);
+ gl::Error error = getSurfaceLevel(context, GL_TEXTURE_2D, sourceIndex.mipIndex, false, &upper);
if (error.isError())
{
return error;
}
IDirect3DSurface9 *lower = nullptr;
- error = getSurfaceLevel(GL_TEXTURE_2D, destIndex.mipIndex, true, &lower);
+ error = getSurfaceLevel(context, GL_TEXTURE_2D, destIndex.mipIndex, true, &lower);
if (error.isError())
{
SafeRelease(upper);
@@ -241,7 +252,8 @@ gl::Error TextureStorage9_2D::generateMipmap(const gl::ImageIndex &sourceIndex,
return error;
}
-gl::Error TextureStorage9_2D::getBaseTexture(IDirect3DBaseTexture9 **outTexture)
+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
@@ -258,7 +270,8 @@ gl::Error TextureStorage9_2D::getBaseTexture(IDirect3DBaseTexture9 **outTexture)
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create 2D storage texture, result: 0x%X.", result);
+ return gl::OutOfMemory()
+ << "Failed to create 2D storage texture, " << gl::FmtHR(result);
}
}
@@ -266,7 +279,7 @@ gl::Error TextureStorage9_2D::getBaseTexture(IDirect3DBaseTexture9 **outTexture)
return gl::NoError();
}
-gl::Error TextureStorage9_2D::copyToStorage(TextureStorage *destStorage)
+gl::Error TextureStorage9_2D::copyToStorage(const gl::Context *context, TextureStorage *destStorage)
{
ASSERT(destStorage);
@@ -276,14 +289,14 @@ gl::Error TextureStorage9_2D::copyToStorage(TextureStorage *destStorage)
for (int i = 0; i < levels; ++i)
{
IDirect3DSurface9 *srcSurf = nullptr;
- gl::Error error = getSurfaceLevel(GL_TEXTURE_2D, i, false, &srcSurf);
+ gl::Error error = getSurfaceLevel(context, GL_TEXTURE_2D, i, false, &srcSurf);
if (error.isError())
{
return error;
}
IDirect3DSurface9 *dstSurf = nullptr;
- error = dest9->getSurfaceLevel(GL_TEXTURE_2D, i, true, &dstSurf);
+ error = dest9->getSurfaceLevel(context, GL_TEXTURE_2D, i, true, &dstSurf);
if (error.isError())
{
SafeRelease(srcSurf);
@@ -321,7 +334,8 @@ TextureStorage9_EGLImage::~TextureStorage9_EGLImage()
{
}
-gl::Error TextureStorage9_EGLImage::getSurfaceLevel(GLenum target,
+gl::Error TextureStorage9_EGLImage::getSurfaceLevel(const gl::Context *context,
+ GLenum target,
int level,
bool,
IDirect3DSurface9 **outSurface)
@@ -330,7 +344,7 @@ gl::Error TextureStorage9_EGLImage::getSurfaceLevel(GLenum target,
ASSERT(level == 0);
RenderTargetD3D *renderTargetD3D = nullptr;
- gl::Error error = mImage->getRenderTarget(&renderTargetD3D);
+ gl::Error error = mImage->getRenderTarget(context, &renderTargetD3D);
if (error.isError())
{
return error;
@@ -342,19 +356,21 @@ gl::Error TextureStorage9_EGLImage::getSurfaceLevel(GLenum target,
return gl::NoError();
}
-gl::Error TextureStorage9_EGLImage::getRenderTarget(const gl::ImageIndex &index,
+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(outRT);
+ return mImage->getRenderTarget(context, outRT);
}
-gl::Error TextureStorage9_EGLImage::getBaseTexture(IDirect3DBaseTexture9 **outTexture)
+gl::Error TextureStorage9_EGLImage::getBaseTexture(const gl::Context *context,
+ IDirect3DBaseTexture9 **outTexture)
{
RenderTargetD3D *renderTargetD3D = nullptr;
- gl::Error error = mImage->getRenderTarget(&renderTargetD3D);
+ gl::Error error = mImage->getRenderTarget(context, &renderTargetD3D);
if (error.isError())
{
return error;
@@ -367,13 +383,16 @@ gl::Error TextureStorage9_EGLImage::getBaseTexture(IDirect3DBaseTexture9 **outTe
return gl::NoError();
}
-gl::Error TextureStorage9_EGLImage::generateMipmap(const gl::ImageIndex &, const gl::ImageIndex &)
+gl::Error TextureStorage9_EGLImage::generateMipmap(const gl::Context *context,
+ const gl::ImageIndex &,
+ const gl::ImageIndex &)
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureStorage9_EGLImage::copyToStorage(TextureStorage *destStorage)
+gl::Error TextureStorage9_EGLImage::copyToStorage(const gl::Context *context,
+ TextureStorage *destStorage)
{
ASSERT(destStorage);
ASSERT(getLevelCount() == 1);
@@ -381,7 +400,7 @@ gl::Error TextureStorage9_EGLImage::copyToStorage(TextureStorage *destStorage)
TextureStorage9 *dest9 = GetAs<TextureStorage9>(destStorage);
IDirect3DBaseTexture9 *destBaseTexture9 = nullptr;
- gl::Error error = dest9->getBaseTexture(&destBaseTexture9);
+ gl::Error error = dest9->getBaseTexture(context, &destBaseTexture9);
if (error.isError())
{
return error;
@@ -393,12 +412,12 @@ gl::Error TextureStorage9_EGLImage::copyToStorage(TextureStorage *destStorage)
HRESULT result = destTexture9->GetSurfaceLevel(destStorage->getTopLevel(), &destSurface);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to get the surface from a texture, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to get the surface from a texture, "
+ << gl::FmtHR(result);
}
RenderTargetD3D *sourceRenderTarget = nullptr;
- error = mImage->getRenderTarget(&sourceRenderTarget);
+ error = mImage->getRenderTarget(context, &sourceRenderTarget);
if (error.isError())
{
SafeRelease(destSurface);
@@ -456,13 +475,14 @@ TextureStorage9_Cube::~TextureStorage9_Cube()
// Increments refcount on surface.
// caller must Release() the returned surface
-gl::Error TextureStorage9_Cube::getSurfaceLevel(GLenum target,
+gl::Error TextureStorage9_Cube::getSurfaceLevel(const gl::Context *context,
+ GLenum target,
int level,
bool dirty,
IDirect3DSurface9 **outSurface)
{
IDirect3DBaseTexture9 *baseTexture = nullptr;
- gl::Error error = getBaseTexture(&baseTexture);
+ gl::Error error = getBaseTexture(context, &baseTexture);
if (error.isError())
{
return error;
@@ -476,7 +496,8 @@ gl::Error TextureStorage9_Cube::getSurfaceLevel(GLenum target,
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to get the surface from a texture, result: 0x%X.", 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
@@ -488,7 +509,9 @@ gl::Error TextureStorage9_Cube::getSurfaceLevel(GLenum target,
return gl::NoError();
}
-gl::Error TextureStorage9_Cube::getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT)
+gl::Error TextureStorage9_Cube::getRenderTarget(const gl::Context *context,
+ const gl::ImageIndex &index,
+ RenderTargetD3D **outRT)
{
ASSERT(outRT);
ASSERT(index.mipIndex == 0);
@@ -497,14 +520,14 @@ gl::Error TextureStorage9_Cube::getRenderTarget(const gl::ImageIndex &index, Ren
if (mRenderTarget[index.layerIndex] == nullptr && isRenderTarget())
{
IDirect3DBaseTexture9 *baseTexture = nullptr;
- gl::Error error = getBaseTexture(&baseTexture);
+ gl::Error error = getBaseTexture(context, &baseTexture);
if (error.isError())
{
return error;
}
IDirect3DSurface9 *surface = nullptr;
- error = getSurfaceLevel(GL_TEXTURE_CUBE_MAP_POSITIVE_X + index.layerIndex,
+ error = getSurfaceLevel(context, GL_TEXTURE_CUBE_MAP_POSITIVE_X + index.layerIndex,
mTopLevel + index.mipIndex, false, &surface);
if (error.isError())
{
@@ -521,17 +544,20 @@ gl::Error TextureStorage9_Cube::getRenderTarget(const gl::ImageIndex &index, Ren
return gl::NoError();
}
-gl::Error TextureStorage9_Cube::generateMipmap(const gl::ImageIndex &sourceIndex, const gl::ImageIndex &destIndex)
+gl::Error TextureStorage9_Cube::generateMipmap(const gl::Context *context,
+ const gl::ImageIndex &sourceIndex,
+ const gl::ImageIndex &destIndex)
{
IDirect3DSurface9 *upper = nullptr;
- gl::Error error = getSurfaceLevel(sourceIndex.type, sourceIndex.mipIndex, false, &upper);
+ gl::Error error =
+ getSurfaceLevel(context, sourceIndex.type, sourceIndex.mipIndex, false, &upper);
if (error.isError())
{
return error;
}
IDirect3DSurface9 *lower = nullptr;
- error = getSurfaceLevel(destIndex.type, destIndex.mipIndex, true, &lower);
+ error = getSurfaceLevel(context, destIndex.type, destIndex.mipIndex, true, &lower);
if (error.isError())
{
SafeRelease(upper);
@@ -547,7 +573,8 @@ gl::Error TextureStorage9_Cube::generateMipmap(const gl::ImageIndex &sourceIndex
return error;
}
-gl::Error TextureStorage9_Cube::getBaseTexture(IDirect3DBaseTexture9 **outTexture)
+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
@@ -564,7 +591,8 @@ gl::Error TextureStorage9_Cube::getBaseTexture(IDirect3DBaseTexture9 **outTextur
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create cube storage texture, result: 0x%X.", result);
+ return gl::OutOfMemory()
+ << "Failed to create cube storage texture, " << gl::FmtHR(result);
}
}
@@ -572,7 +600,8 @@ gl::Error TextureStorage9_Cube::getBaseTexture(IDirect3DBaseTexture9 **outTextur
return gl::NoError();
}
-gl::Error TextureStorage9_Cube::copyToStorage(TextureStorage *destStorage)
+gl::Error TextureStorage9_Cube::copyToStorage(const gl::Context *context,
+ TextureStorage *destStorage)
{
ASSERT(destStorage);
@@ -585,14 +614,15 @@ gl::Error TextureStorage9_Cube::copyToStorage(TextureStorage *destStorage)
{
IDirect3DSurface9 *srcSurf = nullptr;
gl::Error error =
- getSurfaceLevel(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, false, &srcSurf);
+ getSurfaceLevel(context, GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, false, &srcSurf);
if (error.isError())
{
return error;
}
IDirect3DSurface9 *dstSurf = nullptr;
- error = dest9->getSurfaceLevel(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, true, &dstSurf);
+ error = dest9->getSurfaceLevel(context, GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, true,
+ &dstSurf);
if (error.isError())
{
SafeRelease(srcSurf);
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h
index f0455a9b710..a33d096ee96 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h
@@ -32,12 +32,16 @@ class TextureStorage9 : public TextureStorage
D3DPOOL getPool() const;
DWORD getUsage() const;
- virtual gl::Error getSurfaceLevel(GLenum target,
+ virtual gl::Error getSurfaceLevel(const gl::Context *context,
+ GLenum target,
int level,
bool dirty,
IDirect3DSurface9 **outSurface) = 0;
- virtual gl::Error getBaseTexture(IDirect3DBaseTexture9 **outTexture) = 0;
- virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT) = 0;
+ virtual gl::Error getBaseTexture(const gl::Context *context,
+ IDirect3DBaseTexture9 **outTexture) = 0;
+ virtual gl::Error getRenderTarget(const gl::Context *context,
+ const gl::ImageIndex &index,
+ RenderTargetD3D **outRT) = 0;
virtual int getTopLevel() const;
virtual bool isRenderTarget() const;
@@ -45,8 +49,13 @@ class TextureStorage9 : public TextureStorage
bool supportsNativeMipmapFunction() const override;
virtual int getLevelCount() const;
- virtual gl::Error setData(const gl::ImageIndex &index, ImageD3D *image, const gl::Box *destBox, GLenum type,
- const gl::PixelUnpackState &unpack, const uint8_t *pixelData);
+ 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;
@@ -70,16 +79,22 @@ 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);
- virtual ~TextureStorage9_2D();
+ ~TextureStorage9_2D() override;
- gl::Error getSurfaceLevel(GLenum target,
+ gl::Error getSurfaceLevel(const gl::Context *context,
+ GLenum target,
int level,
bool dirty,
IDirect3DSurface9 **outSurface) override;
- virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT);
- virtual gl::Error getBaseTexture(IDirect3DBaseTexture9 **outTexture);
- virtual gl::Error generateMipmap(const gl::ImageIndex &sourceIndex, const gl::ImageIndex &destIndex);
- virtual gl::Error copyToStorage(TextureStorage *destStorage);
+ 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;
@@ -92,15 +107,20 @@ class TextureStorage9_EGLImage final : public TextureStorage9
TextureStorage9_EGLImage(Renderer9 *renderer, EGLImageD3D *image, RenderTarget9 *renderTarget9);
~TextureStorage9_EGLImage() override;
- gl::Error getSurfaceLevel(GLenum target,
+ gl::Error getSurfaceLevel(const gl::Context *context,
+ GLenum target,
int level,
bool dirty,
IDirect3DSurface9 **outSurface) override;
- gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT) override;
- gl::Error getBaseTexture(IDirect3DBaseTexture9 **outTexture) override;
- gl::Error generateMipmap(const gl::ImageIndex &sourceIndex,
+ 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(TextureStorage *destStorage) override;
+ gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
private:
EGLImageD3D *mImage;
@@ -112,14 +132,20 @@ class TextureStorage9_Cube : public TextureStorage9
TextureStorage9_Cube(Renderer9 *renderer, GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly);
virtual ~TextureStorage9_Cube();
- gl::Error getSurfaceLevel(GLenum target,
+ gl::Error getSurfaceLevel(const gl::Context *context,
+ GLenum target,
int level,
bool dirty,
IDirect3DSurface9 **outSurface) override;
- virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT);
- virtual gl::Error getBaseTexture(IDirect3DBaseTexture9 **outTexture);
- virtual gl::Error generateMipmap(const gl::ImageIndex &sourceIndex, const gl::ImageIndex &destIndex);
- virtual gl::Error copyToStorage(TextureStorage *destStorage);
+ 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:
static const size_t CUBE_FACE_COUNT = 6;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp
index e9c69304bd0..c0b80a847c3 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp
@@ -47,7 +47,8 @@ gl::Error VertexBuffer9::initialize(unsigned int size, bool dynamicUsage)
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate internal vertex buffer of size, %lu.", size);
+ return gl::OutOfMemory()
+ << "Failed to allocate internal vertex buffer of size " << size;
}
}
@@ -67,7 +68,7 @@ gl::Error VertexBuffer9::storeVertexAttributes(const gl::VertexAttribute &attrib
{
if (!mVertexBuffer)
{
- return gl::Error(GL_OUT_OF_MEMORY, "Internal vertex buffer is not initialized.");
+ return gl::OutOfMemory() << "Internal vertex buffer is not initialized.";
}
int inputStride = static_cast<int>(gl::ComputeVertexAttributeStride(attrib, binding));
@@ -88,12 +89,12 @@ gl::Error VertexBuffer9::storeVertexAttributes(const gl::VertexAttribute &attrib
HRESULT result = mVertexBuffer->Lock(offset, mapSize, reinterpret_cast<void**>(&mapPtr), lockFlags);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to lock internal vertex buffer, HRESULT: 0x%08x.", result);
+ return gl::OutOfMemory() << "Failed to lock internal vertex buffer, " << gl::FmtHR(result);
}
const uint8_t *input = sourceData;
- if (instances == 0 || binding.divisor == 0)
+ if (instances == 0 || binding.getDivisor() == 0)
{
input += inputStride * start;
}
@@ -138,7 +139,7 @@ gl::Error VertexBuffer9::discard()
{
if (!mVertexBuffer)
{
- return gl::Error(GL_OUT_OF_MEMORY, "Internal vertex buffer is not initialized.");
+ return gl::OutOfMemory() << "Internal vertex buffer is not initialized.";
}
void *dummy;
@@ -147,13 +148,15 @@ gl::Error VertexBuffer9::discard()
result = mVertexBuffer->Lock(0, 1, &dummy, D3DLOCK_DISCARD);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to lock internal buffer for discarding, HRESULT: 0x%08x", result);
+ return gl::OutOfMemory() << "Failed to lock internal buffer for discarding, "
+ << gl::FmtHR(result);
}
result = mVertexBuffer->Unlock();
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to unlock internal buffer for discarding, HRESULT: 0x%08x", result);
+ return gl::OutOfMemory() << "Failed to unlock internal buffer for discarding, "
+ << gl::FmtHR(result);
}
return gl::NoError();
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp
index c9555d4fe1d..abadf5c0b54 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp
@@ -232,7 +232,8 @@ gl::Error VertexDeclarationCache::applyDeclaration(
HRESULT result = device->CreateVertexDeclaration(elements, &lastCache->vertexDeclaration);
if (FAILED(result))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal vertex declaration, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to create internal vertex declaration, "
+ << gl::FmtHR(result);
}
device->SetVertexDeclaration(lastCache->vertexDeclaration);
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gen_angle_format_table.py b/chromium/third_party/angle/src/libANGLE/renderer/gen_angle_format_table.py
index f47a0245dca..2afab2a3938 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gen_angle_format_table.py
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gen_angle_format_table.py
@@ -61,7 +61,7 @@ static constexpr rx::FastCopyFunctionMap NoCopyFunctions;
constexpr Format g_formatInfoTable[] = {{
// clang-format off
- {{ Format::ID::NONE, GL_NONE, GL_NONE, nullptr, NoCopyFunctions, nullptr, GL_NONE, 0, 0, 0, 0, 0, 0 }},
+ {{ Format::ID::NONE, GL_NONE, GL_NONE, nullptr, NoCopyFunctions, nullptr, nullptr, GL_NONE, 0, 0, 0, 0, 0, 0 }},
{angle_format_info_cases} // clang-format on
}};
@@ -110,10 +110,7 @@ def get_mip_generation_function(angle_format):
return 'nullptr'
return 'GenerateMip<' + channel_struct + '>'
-def get_color_read_function(angle_format):
- channel_struct = get_channel_struct(angle_format)
- if channel_struct == None:
- return 'nullptr'
+def get_color_read_write_component_type(angle_format):
component_type_map = {
'uint': 'GLuint',
'int': 'GLint',
@@ -121,9 +118,24 @@ def get_color_read_function(angle_format):
'snorm': 'GLfloat',
'float': 'GLfloat'
}
- return 'ReadColor<' + channel_struct + ', '+ component_type_map[angle_format['componentType']] + '>'
+ return component_type_map[angle_format['componentType']]
+
+def get_color_read_function(angle_format):
+ channel_struct = get_channel_struct(angle_format)
+ if channel_struct == None:
+ return 'nullptr'
+ read_component_type = get_color_read_write_component_type(angle_format)
+ return 'ReadColor<' + channel_struct + ', '+ read_component_type + '>'
+
+def get_color_write_function(angle_format):
+ channel_struct = get_channel_struct(angle_format)
+ if channel_struct == None:
+ return 'nullptr'
+ write_component_type = get_color_read_write_component_type(angle_format)
+ return 'WriteColor<' + channel_struct + ', '+ write_component_type + '>'
+
-format_entry_template = """ {{ Format::ID::{id}, {glInternalFormat}, {fboImplementationInternalFormat}, {mipGenerationFunction}, {fastCopyFunctions}, {colorReadFunction}, {namedComponentType}, {R}, {G}, {B}, {A}, {D}, {S} }},
+format_entry_template = """ {{ Format::ID::{id}, {glInternalFormat}, {fboImplementationInternalFormat}, {mipGenerationFunction}, {fastCopyFunctions}, {colorReadFunction}, {colorWriteFunction}, {namedComponentType}, {R}, {G}, {B}, {A}, {D}, {S} }},
"""
def get_named_component_type(component_type):
@@ -172,6 +184,7 @@ def json_to_table_data(format_id, json, angle_to_gl):
# Derived values.
parsed["mipGenerationFunction"] = get_mip_generation_function(parsed)
parsed["colorReadFunction"] = get_color_read_function(parsed)
+ parsed["colorWriteFunction"] = get_color_write_function(parsed)
for channel in "ABDGLRS":
if parsed["bits"] != None and channel in parsed["bits"]:
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/BlitGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/BlitGL.cpp
index 9bdc9fe3755..a97c9cfb6ac 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/BlitGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/BlitGL.cpp
@@ -34,7 +34,7 @@ gl::Error CheckCompileStatus(const rx::FunctionsGL *functions, GLuint shader)
ASSERT(compileStatus == GL_TRUE);
if (compileStatus == GL_FALSE)
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to compile internal blit shader.");
+ return gl::OutOfMemory() << "Failed to compile internal blit shader.";
}
return gl::NoError();
@@ -47,7 +47,7 @@ gl::Error CheckLinkStatus(const rx::FunctionsGL *functions, GLuint program)
ASSERT(linkStatus == GL_TRUE);
if (linkStatus == GL_FALSE)
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to link internal blit program.");
+ return gl::OutOfMemory() << "Failed to link internal blit program.";
}
return gl::NoError();
@@ -163,7 +163,8 @@ BlitGL::~BlitGL()
}
}
-gl::Error BlitGL::copyImageToLUMAWorkaroundTexture(GLuint texture,
+gl::Error BlitGL::copyImageToLUMAWorkaroundTexture(const gl::Context *context,
+ GLuint texture,
GLenum textureType,
GLenum target,
GLenum lumaFormat,
@@ -180,14 +181,15 @@ gl::Error BlitGL::copyImageToLUMAWorkaroundTexture(GLuint texture,
gl::PixelUnpackState unpack;
mStateManager->setPixelUnpackState(unpack);
mFunctions->texImage2D(target, static_cast<GLint>(level), internalFormat, sourceArea.width,
- sourceArea.height, 0, format, source->getImplementationColorReadType(),
- nullptr);
+ sourceArea.height, 0, format,
+ source->getImplementationColorReadType(context), nullptr);
- return copySubImageToLUMAWorkaroundTexture(texture, textureType, target, lumaFormat, level,
- gl::Offset(0, 0, 0), sourceArea, source);
+ return copySubImageToLUMAWorkaroundTexture(context, texture, textureType, target, lumaFormat,
+ level, gl::Offset(0, 0, 0), sourceArea, source);
}
-gl::Error BlitGL::copySubImageToLUMAWorkaroundTexture(GLuint texture,
+gl::Error BlitGL::copySubImageToLUMAWorkaroundTexture(const gl::Context *context,
+ GLuint texture,
GLenum textureType,
GLenum target,
GLenum lumaFormat,
@@ -203,8 +205,8 @@ gl::Error BlitGL::copySubImageToLUMAWorkaroundTexture(GLuint texture,
mStateManager->bindFramebuffer(GL_FRAMEBUFFER, sourceFramebufferGL->getFramebufferID());
nativegl::CopyTexImageImageFormat copyTexImageFormat = nativegl::GetCopyTexImageImageFormat(
- mFunctions, mWorkarounds, source->getImplementationColorReadFormat(),
- source->getImplementationColorReadType());
+ mFunctions, mWorkarounds, source->getImplementationColorReadFormat(context),
+ source->getImplementationColorReadType(context));
mStateManager->bindTexture(GL_TEXTURE_2D, mScratchTextures[0]);
mFunctions->copyTexImage2D(GL_TEXTURE_2D, 0, copyTexImageFormat.internalFormat, sourceArea.x,
@@ -224,7 +226,7 @@ gl::Error BlitGL::copySubImageToLUMAWorkaroundTexture(GLuint texture,
mFunctions->texImage2D(GL_TEXTURE_2D, 0, copyTexImageFormat.internalFormat, sourceArea.width,
sourceArea.height, 0,
gl::GetUnsizedFormat(copyTexImageFormat.internalFormat),
- source->getImplementationColorReadType(), nullptr);
+ source->getImplementationColorReadType(context), nullptr);
mStateManager->bindFramebuffer(GL_FRAMEBUFFER, mScratchFBO);
mFunctions->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
@@ -426,7 +428,8 @@ gl::Error BlitGL::blitColorBufferWithShader(const gl::Framebuffer *source,
return gl::NoError();
}
-gl::Error BlitGL::copySubTexture(TextureGL *source,
+gl::Error BlitGL::copySubTexture(const gl::Context *context,
+ TextureGL *source,
size_t sourceLevel,
TextureGL *dest,
GLenum destTarget,
@@ -466,7 +469,7 @@ gl::Error BlitGL::copySubTexture(TextureGL *source,
}
source->setMinFilter(GL_NEAREST);
source->setMagFilter(GL_NEAREST);
- source->setBaseLevel(static_cast<GLuint>(sourceLevel));
+ source->setBaseLevel(context, static_cast<GLuint>(sourceLevel));
// Render to the destination texture, sampling from the source texture
ScopedGLState scopedState(
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/BlitGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/BlitGL.h
index aace37248a6..0a49d051d8c 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/BlitGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/BlitGL.h
@@ -36,7 +36,8 @@ class BlitGL : angle::NonCopyable
StateManagerGL *stateManager);
~BlitGL();
- gl::Error copyImageToLUMAWorkaroundTexture(GLuint texture,
+ gl::Error copyImageToLUMAWorkaroundTexture(const gl::Context *context,
+ GLuint texture,
GLenum textureType,
GLenum target,
GLenum lumaFormat,
@@ -45,7 +46,8 @@ class BlitGL : angle::NonCopyable
GLenum internalFormat,
const gl::Framebuffer *source);
- gl::Error copySubImageToLUMAWorkaroundTexture(GLuint texture,
+ gl::Error copySubImageToLUMAWorkaroundTexture(const gl::Context *context,
+ GLuint texture,
GLenum textureType,
GLenum target,
GLenum lumaFormat,
@@ -60,7 +62,8 @@ class BlitGL : angle::NonCopyable
const gl::Rectangle &destArea,
GLenum filter);
- gl::Error copySubTexture(TextureGL *source,
+ gl::Error copySubTexture(const gl::Context *context,
+ TextureGL *source,
size_t sourceLevel,
TextureGL *dest,
GLenum destTarget,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/BufferGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/BufferGL.cpp
index 91c87570bcf..cb284dd2d58 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/BufferGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/BufferGL.cpp
@@ -55,7 +55,7 @@ BufferGL::~BufferGL()
mBufferID = 0;
}
-gl::Error BufferGL::setData(ContextImpl * /*context*/,
+gl::Error BufferGL::setData(const gl::Context * /*context*/,
GLenum /*target*/,
const void *data,
size_t size,
@@ -68,7 +68,7 @@ gl::Error BufferGL::setData(ContextImpl * /*context*/,
{
if (!mShadowCopy.resize(size))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize buffer data shadow copy.");
+ return gl::OutOfMemory() << "Failed to resize buffer data shadow copy.";
}
if (size > 0 && data != nullptr)
@@ -82,7 +82,7 @@ gl::Error BufferGL::setData(ContextImpl * /*context*/,
return gl::NoError();
}
-gl::Error BufferGL::setSubData(ContextImpl * /*context*/,
+gl::Error BufferGL::setSubData(const gl::Context * /*context*/,
GLenum /*target*/,
const void *data,
size_t size,
@@ -99,7 +99,7 @@ gl::Error BufferGL::setSubData(ContextImpl * /*context*/,
return gl::NoError();
}
-gl::Error BufferGL::copySubData(ContextImpl *context,
+gl::Error BufferGL::copySubData(const gl::Context *context,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
@@ -122,7 +122,7 @@ gl::Error BufferGL::copySubData(ContextImpl *context,
return gl::NoError();
}
-gl::Error BufferGL::map(ContextImpl *context, GLenum access, void **mapPtr)
+gl::Error BufferGL::map(const gl::Context *context, GLenum access, void **mapPtr)
{
if (mShadowBufferData)
{
@@ -148,7 +148,7 @@ gl::Error BufferGL::map(ContextImpl *context, GLenum access, void **mapPtr)
return gl::NoError();
}
-gl::Error BufferGL::mapRange(ContextImpl *context,
+gl::Error BufferGL::mapRange(const gl::Context *context,
size_t offset,
size_t length,
GLbitfield access,
@@ -171,7 +171,7 @@ gl::Error BufferGL::mapRange(ContextImpl *context,
return gl::NoError();
}
-gl::Error BufferGL::unmap(ContextImpl *context, GLboolean *result)
+gl::Error BufferGL::unmap(const gl::Context *context, GLboolean *result)
{
ASSERT(result);
ASSERT(mIsMapped);
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/BufferGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/BufferGL.h
index 2114ddb04f3..b79d47d3733 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/BufferGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/BufferGL.h
@@ -26,28 +26,28 @@ class BufferGL : public BufferImpl
StateManagerGL *stateManager);
~BufferGL() override;
- gl::Error setData(ContextImpl *context,
+ gl::Error setData(const gl::Context *context,
GLenum target,
const void *data,
size_t size,
GLenum usage) override;
- gl::Error setSubData(ContextImpl *context,
+ gl::Error setSubData(const gl::Context *context,
GLenum target,
const void *data,
size_t size,
size_t offset) override;
- gl::Error copySubData(ContextImpl *contextImpl,
+ gl::Error copySubData(const gl::Context *context,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size) override;
- gl::Error map(ContextImpl *contextImpl, GLenum access, void **mapPtr) override;
- gl::Error mapRange(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl, GLboolean *result) override;
+ gl::Error unmap(const gl::Context *context, GLboolean *result) override;
gl::Error getIndexRange(GLenum type,
size_t offset,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.cpp
index 7093caf7138..2634d12247f 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.cpp
@@ -51,7 +51,9 @@ CompilerImpl *ContextGL::createCompiler()
ShaderImpl *ContextGL::createShader(const gl::ShaderState &data)
{
- return new ShaderGL(data, getFunctions(), getWorkaroundsGL());
+ return new ShaderGL(data, getFunctions(), getWorkaroundsGL(),
+ getExtensions().webglCompatibility,
+ mRenderer->getMultiviewImplementationType());
}
ProgramImpl *ContextGL::createProgram(const gl::ProgramState &data)
@@ -150,40 +152,44 @@ gl::Error ContextGL::finish()
return mRenderer->finish();
}
-gl::Error ContextGL::drawArrays(GLenum mode, GLint first, GLsizei count)
+gl::Error ContextGL::drawArrays(const gl::Context *context, GLenum mode, GLint first, GLsizei count)
{
- return mRenderer->drawArrays(mState, mode, first, count);
+ return mRenderer->drawArrays(context, mode, first, count);
}
-gl::Error ContextGL::drawArraysInstanced(GLenum mode,
+gl::Error ContextGL::drawArraysInstanced(const gl::Context *context,
+ GLenum mode,
GLint first,
GLsizei count,
GLsizei instanceCount)
{
- return mRenderer->drawArraysInstanced(mState, mode, first, count, instanceCount);
+ return mRenderer->drawArraysInstanced(context, mode, first, count, instanceCount);
}
-gl::Error ContextGL::drawElements(GLenum mode,
+gl::Error ContextGL::drawElements(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
const gl::IndexRange &indexRange)
{
- return mRenderer->drawElements(mState, mode, count, type, indices, indexRange);
+ return mRenderer->drawElements(context, mode, count, type, indices, indexRange);
}
-gl::Error ContextGL::drawElementsInstanced(GLenum mode,
+gl::Error ContextGL::drawElementsInstanced(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
GLsizei instances,
const gl::IndexRange &indexRange)
{
- return mRenderer->drawElementsInstanced(mState, mode, count, type, indices, instances,
+ return mRenderer->drawElementsInstanced(context, mode, count, type, indices, instances,
indexRange);
}
-gl::Error ContextGL::drawRangeElements(GLenum mode,
+gl::Error ContextGL::drawRangeElements(const gl::Context *context,
+ GLenum mode,
GLuint start,
GLuint end,
GLsizei count,
@@ -191,17 +197,23 @@ gl::Error ContextGL::drawRangeElements(GLenum mode,
const void *indices,
const gl::IndexRange &indexRange)
{
- return mRenderer->drawRangeElements(mState, mode, start, end, count, type, indices, indexRange);
+ return mRenderer->drawRangeElements(context, mode, start, end, count, type, indices,
+ indexRange);
}
-gl::Error ContextGL::drawArraysIndirect(GLenum mode, const void *indirect)
+gl::Error ContextGL::drawArraysIndirect(const gl::Context *context,
+ GLenum mode,
+ const void *indirect)
{
- return mRenderer->drawArraysIndirect(mState, mode, indirect);
+ return mRenderer->drawArraysIndirect(context, mode, indirect);
}
-gl::Error ContextGL::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
+gl::Error ContextGL::drawElementsIndirect(const gl::Context *context,
+ GLenum mode,
+ GLenum type,
+ const void *indirect)
{
- return mRenderer->drawElementsIndirect(mState, mode, type, indirect);
+ return mRenderer->drawElementsIndirect(context, mode, type, indirect);
}
void ContextGL::stencilFillPath(const gl::Path *path, GLenum fillMode, GLuint mask)
@@ -328,9 +340,9 @@ void ContextGL::popGroupMarker()
mRenderer->popGroupMarker();
}
-void ContextGL::syncState(const gl::State::DirtyBits &dirtyBits)
+void ContextGL::syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits)
{
- mRenderer->getStateManager()->syncState(mState, dirtyBits);
+ mRenderer->getStateManager()->syncState(context, dirtyBits);
}
GLint ContextGL::getGPUDisjoint()
@@ -343,10 +355,10 @@ GLint64 ContextGL::getTimestamp()
return mRenderer->getTimestamp();
}
-void ContextGL::onMakeCurrent(const gl::ContextState &data)
+void ContextGL::onMakeCurrent(const gl::Context *context)
{
// Queries need to be paused/resumed on context switches
- mRenderer->getStateManager()->onMakeCurrent(data);
+ mRenderer->getStateManager()->onMakeCurrent(context);
}
const gl::Caps &ContextGL::getNativeCaps() const
@@ -369,6 +381,11 @@ const gl::Limitations &ContextGL::getNativeLimitations() const
return mRenderer->getNativeLimitations();
}
+void ContextGL::applyNativeWorkarounds(gl::Workarounds *workarounds) const
+{
+ return mRenderer->applyNativeWorkarounds(workarounds);
+}
+
const FunctionsGL *ContextGL::getFunctions() const
{
return mRenderer->getFunctions();
@@ -384,9 +401,12 @@ const WorkaroundsGL &ContextGL::getWorkaroundsGL() const
return mRenderer->getWorkarounds();
}
-gl::Error ContextGL::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
+gl::Error ContextGL::dispatchCompute(const gl::Context *context,
+ GLuint numGroupsX,
+ GLuint numGroupsY,
+ GLuint numGroupsZ)
{
- return mRenderer->dispatchCompute(mState, numGroupsX, numGroupsY, numGroupsZ);
+ return mRenderer->dispatchCompute(context, numGroupsX, numGroupsY, numGroupsZ);
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.h
index 2e8a16225e9..de5ae6dc30b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.h
@@ -72,32 +72,44 @@ class ContextGL : public ContextImpl
gl::Error finish() override;
// Drawing methods.
- gl::Error drawArrays(GLenum mode, GLint first, GLsizei count) override;
- gl::Error drawArraysInstanced(GLenum mode,
+ 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(GLenum mode,
+ gl::Error drawElements(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
const gl::IndexRange &indexRange) override;
- gl::Error drawElementsInstanced(GLenum mode,
+ gl::Error drawElementsInstanced(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
GLsizei instances,
const gl::IndexRange &indexRange) override;
- gl::Error drawRangeElements(GLenum mode,
+ gl::Error drawRangeElements(const gl::Context *context,
+ GLenum mode,
GLuint start,
GLuint end,
GLsizei count,
GLenum type,
const void *indices,
const gl::IndexRange &indexRange) override;
- gl::Error drawArraysIndirect(GLenum mode, const void *indirect) override;
- gl::Error drawElementsIndirect(GLenum mode, GLenum type, const void *indirect) 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;
// CHROMIUM_path_rendering implementation
void stencilFillPath(const gl::Path *path, GLenum fillMode, GLuint mask) override;
@@ -156,14 +168,14 @@ class ContextGL : public ContextImpl
void popGroupMarker() override;
// State sync with dirty bits.
- void syncState(const gl::State::DirtyBits &dirtyBits) override;
+ 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::ContextState &data) override;
+ void onMakeCurrent(const gl::Context *context) override;
// Caps queries
const gl::Caps &getNativeCaps() const override;
@@ -171,12 +183,17 @@ class ContextGL : public ContextImpl
const gl::Extensions &getNativeExtensions() const override;
const gl::Limitations &getNativeLimitations() const override;
+ void applyNativeWorkarounds(gl::Workarounds *workarounds) const override;
+
// Handle helpers
const FunctionsGL *getFunctions() const;
StateManagerGL *getStateManager();
const WorkaroundsGL &getWorkaroundsGL() const;
- gl::Error dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ) override;
+ gl::Error dispatchCompute(const gl::Context *context,
+ GLuint numGroupsX,
+ GLuint numGroupsY,
+ GLuint numGroupsZ) override;
private:
RendererGL *mRenderer;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/DisplayGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/DisplayGL.cpp
index f951c23558b..55651966cf0 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/DisplayGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/DisplayGL.cpp
@@ -38,10 +38,10 @@ egl::Error DisplayGL::initialize(egl::Display *display)
const gl::Version &maxVersion = mRenderer->getMaxSupportedESVersion();
if (maxVersion < gl::Version(2, 0))
{
- return egl::Error(EGL_NOT_INITIALIZED, "OpenGL ES 2.0 is not supportable.");
+ return egl::EglNotInitialized() << "OpenGL ES 2.0 is not supportable.";
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
void DisplayGL::terminate()
@@ -83,7 +83,7 @@ egl::Error DisplayGL::makeCurrent(egl::Surface *drawSurface, egl::Surface *readS
if (!context)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
// Pause transform feedback before making a new surface current, to workaround anglebug.com/1426
@@ -95,7 +95,7 @@ egl::Error DisplayGL::makeCurrent(egl::Surface *drawSurface, egl::Surface *readS
SurfaceGL *glDrawSurface = GetImplAs<SurfaceGL>(drawSurface);
ANGLE_TRY(glDrawSurface->makeCurrent());
mCurrentDrawSurface = drawSurface;
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
else
{
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/FenceSyncGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/FenceSyncGL.cpp
index 8b6e34e47cf..6bb14339f0a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/FenceSyncGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/FenceSyncGL.cpp
@@ -37,7 +37,7 @@ gl::Error FenceSyncGL::set(GLenum condition, GLbitfield flags)
if (mSyncObject == 0)
{
// if glFenceSync fails, it returns 0.
- return gl::Error(GL_OUT_OF_MEMORY, "glFenceSync failed to create a GLsync object.");
+ return gl::OutOfMemory() << "glFenceSync failed to create a GLsync object.";
}
return gl::NoError();
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/FramebufferGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/FramebufferGL.cpp
index 15f23d47334..805f923dc27 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/FramebufferGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/FramebufferGL.cpp
@@ -10,13 +10,14 @@
#include "common/bitset_utils.h"
#include "common/debug.h"
-#include "libANGLE/ContextState.h"
+#include "libANGLE/Context.h"
#include "libANGLE/FramebufferAttachment.h"
#include "libANGLE/State.h"
#include "libANGLE/angletypes.h"
#include "libANGLE/formatutils.h"
#include "libANGLE/renderer/ContextImpl.h"
#include "libANGLE/renderer/gl/BlitGL.h"
+#include "libANGLE/renderer/gl/ContextGL.h"
#include "libANGLE/renderer/gl/FunctionsGL.h"
#include "libANGLE/renderer/gl/RenderbufferGL.h"
#include "libANGLE/renderer/gl/StateManagerGL.h"
@@ -44,7 +45,8 @@ FramebufferGL::FramebufferGL(const FramebufferState &state,
mWorkarounds(workarounds),
mBlitter(blitter),
mFramebufferID(0),
- mIsDefault(isDefault)
+ mIsDefault(isDefault),
+ mAppliedEnabledDrawBuffers(1)
{
if (!mIsDefault)
{
@@ -64,7 +66,8 @@ FramebufferGL::FramebufferGL(GLuint id,
mWorkarounds(workarounds),
mBlitter(blitter),
mFramebufferID(id),
- mIsDefault(true)
+ mIsDefault(true),
+ mAppliedEnabledDrawBuffers(1)
{
}
@@ -130,13 +133,13 @@ static void BindFramebufferAttachment(const FunctionsGL *functions,
}
}
-Error FramebufferGL::discard(size_t count, const GLenum *attachments)
+Error FramebufferGL::discard(const gl::Context *context, size_t count, const GLenum *attachments)
{
// glInvalidateFramebuffer accepts the same enums as glDiscardFramebufferEXT
- return invalidate(count, attachments);
+ return invalidate(context, count, attachments);
}
-Error FramebufferGL::invalidate(size_t count, const GLenum *attachments)
+Error FramebufferGL::invalidate(const gl::Context *context, size_t count, const GLenum *attachments)
{
const GLenum *finalAttachmentsPtr = attachments;
@@ -163,7 +166,8 @@ Error FramebufferGL::invalidate(size_t count, const GLenum *attachments)
return gl::NoError();
}
-Error FramebufferGL::invalidateSub(size_t count,
+Error FramebufferGL::invalidateSub(const gl::Context *context,
+ size_t count,
const GLenum *attachments,
const gl::Rectangle &area)
{
@@ -186,19 +190,19 @@ Error FramebufferGL::invalidateSub(size_t count,
area.height);
}
- return NoError();
+ return gl::NoError();
}
-Error FramebufferGL::clear(ContextImpl *context, GLbitfield mask)
+Error FramebufferGL::clear(const gl::Context *context, GLbitfield mask)
{
syncClearState(context, mask);
mStateManager->bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
mFunctions->clear(mask);
- return NoError();
+ return gl::NoError();
}
-Error FramebufferGL::clearBufferfv(ContextImpl *context,
+Error FramebufferGL::clearBufferfv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLfloat *values)
@@ -207,10 +211,10 @@ Error FramebufferGL::clearBufferfv(ContextImpl *context,
mStateManager->bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
mFunctions->clearBufferfv(buffer, drawbuffer, values);
- return NoError();
+ return gl::NoError();
}
-Error FramebufferGL::clearBufferuiv(ContextImpl *context,
+Error FramebufferGL::clearBufferuiv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLuint *values)
@@ -219,10 +223,10 @@ Error FramebufferGL::clearBufferuiv(ContextImpl *context,
mStateManager->bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
mFunctions->clearBufferuiv(buffer, drawbuffer, values);
- return NoError();
+ return gl::NoError();
}
-Error FramebufferGL::clearBufferiv(ContextImpl *context,
+Error FramebufferGL::clearBufferiv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLint *values)
@@ -231,10 +235,10 @@ Error FramebufferGL::clearBufferiv(ContextImpl *context,
mStateManager->bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
mFunctions->clearBufferiv(buffer, drawbuffer, values);
- return NoError();
+ return gl::NoError();
}
-Error FramebufferGL::clearBufferfi(ContextImpl *context,
+Error FramebufferGL::clearBufferfi(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
GLfloat depth,
@@ -244,33 +248,41 @@ Error FramebufferGL::clearBufferfi(ContextImpl *context,
mStateManager->bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
mFunctions->clearBufferfi(buffer, drawbuffer, depth, stencil);
- return NoError();
+ return gl::NoError();
}
-GLenum FramebufferGL::getImplementationColorReadFormat() const
+GLenum FramebufferGL::getImplementationColorReadFormat(const gl::Context *context) const
{
const auto *readAttachment = mState.getReadAttachment();
const Format &format = readAttachment->getFormat();
return format.info->getReadPixelsFormat();
}
-GLenum FramebufferGL::getImplementationColorReadType() const
+GLenum FramebufferGL::getImplementationColorReadType(const gl::Context *context) const
{
const auto *readAttachment = mState.getReadAttachment();
const Format &format = readAttachment->getFormat();
return format.info->getReadPixelsType();
}
-Error FramebufferGL::readPixels(ContextImpl *context,
- const gl::Rectangle &area,
+Error FramebufferGL::readPixels(const gl::Context *context,
+ const gl::Rectangle &origArea,
GLenum format,
GLenum type,
- void *pixels) const
+ void *ptrOrOffset) const
{
- // TODO: don't sync the pixel pack state here once the dirty bits contain the pixel pack buffer
- // binding
- const PixelPackState &packState = context->getGLState().getPackState();
- mStateManager->setPixelPackState(packState);
+ // 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();
+ }
+
+ PixelPackState packState;
+ packState.copyFrom(context, context->getGLState().getPackState());
nativegl::ReadPixelsFormat readPixelsFormat =
nativegl::GetReadPixelsFormat(mFunctions, mWorkarounds, format, type);
@@ -279,33 +291,67 @@ Error FramebufferGL::readPixels(ContextImpl *context,
mStateManager->bindFramebuffer(GL_READ_FRAMEBUFFER, mFramebufferID);
- if (mWorkarounds.packOverlappingRowsSeparatelyPackBuffer && packState.pixelBuffer.get() &&
- packState.rowLength != 0 && packState.rowLength < area.width)
+ bool useOverlappingRowsWorkaround = mWorkarounds.packOverlappingRowsSeparatelyPackBuffer &&
+ packState.pixelBuffer.get() && packState.rowLength != 0 &&
+ packState.rowLength < area.width;
+
+ GLubyte *pixels = reinterpret_cast<GLubyte *>(ptrOrOffset);
+ int leftClip = area.x - origArea.x;
+ int topClip = area.y - origArea.y;
+ if (leftClip || topClip)
{
- return readPixelsRowByRowWorkaround(area, readFormat, readType, packState, pixels);
+ // Adjust destination to match portion clipped off left and/or top.
+ const gl::InternalFormat &glFormat = gl::GetInternalFormatInfo(readFormat, readType);
+
+ GLuint rowBytes = 0;
+ ANGLE_TRY_RESULT(glFormat.computeRowPitch(readType, origArea.width, packState.alignment,
+ packState.rowLength),
+ rowBytes);
+ pixels += leftClip * glFormat.pixelBytes + topClip * rowBytes;
}
- if (mWorkarounds.packLastRowSeparatelyForPaddingInclusion)
+ if (packState.rowLength == 0 && area.width != origArea.width)
{
- gl::Extents size(area.width, area.height, 1);
+ // No rowLength was specified so it will derive from read width, but clipping changed the
+ // read width. Use the original width so we fill the user's buffer as they intended.
+ packState.rowLength = origArea.width;
+ }
- bool apply;
- ANGLE_TRY_RESULT(ShouldApplyLastRowPaddingWorkaround(size, packState, readFormat, readType,
- false, pixels),
- apply);
+ // We want to use rowLength, but that might not be supported.
+ bool cannotSetDesiredRowLength =
+ packState.rowLength && !GetImplAs<ContextGL>(context)->getNativeExtensions().packSubimage;
- if (apply)
+ gl::Error retVal = gl::NoError();
+ if (cannotSetDesiredRowLength || useOverlappingRowsWorkaround)
+ {
+ retVal = readPixelsRowByRow(context, area, readFormat, readType, packState, pixels);
+ }
+ else
+ {
+ gl::ErrorOrResult<bool> useLastRowPaddingWorkaround = false;
+ if (mWorkarounds.packLastRowSeparatelyForPaddingInclusion)
{
- return readPixelsPaddingWorkaround(area, readFormat, readType, packState, pixels);
+ useLastRowPaddingWorkaround =
+ ShouldApplyLastRowPaddingWorkaround(gl::Extents(area.width, area.height, 1),
+ packState, readFormat, readType, false, pixels);
}
- }
- mFunctions->readPixels(area.x, area.y, area.width, area.height, readFormat, readType, pixels);
+ if (useLastRowPaddingWorkaround.isError())
+ {
+ retVal = useLastRowPaddingWorkaround.getError();
+ }
+ else
+ {
+ retVal = readPixelsAllAtOnce(context, area, readFormat, readType, packState, pixels,
+ useLastRowPaddingWorkaround.getResult());
+ }
+ }
- return gl::NoError();
+ packState.pixelBuffer.set(context, nullptr);
+ return retVal;
}
-Error FramebufferGL::blit(ContextImpl *context,
+Error FramebufferGL::blit(const gl::Context *context,
const gl::Rectangle &sourceArea,
const gl::Rectangle &destArea,
GLbitfield mask,
@@ -367,7 +413,7 @@ Error FramebufferGL::blit(ContextImpl *context,
}
// Enable FRAMEBUFFER_SRGB if needed
- mStateManager->setFramebufferSRGBEnabledForFramebuffer(context->getContextState(), true, this);
+ mStateManager->setFramebufferSRGBEnabledForFramebuffer(context, true, this);
GLenum blitMask = mask;
if (needManualColorBlit && (mask & GL_COLOR_BUFFER_BIT) && readAttachmentSamples <= 1)
@@ -411,7 +457,7 @@ bool FramebufferGL::checkStatus() const
return (status == GL_FRAMEBUFFER_COMPLETE);
}
-void FramebufferGL::syncState(ContextImpl *contextImpl, const Framebuffer::DirtyBits &dirtyBits)
+void FramebufferGL::syncState(const gl::Context *context, const Framebuffer::DirtyBits &dirtyBits)
{
// Don't need to sync state for the default FBO.
if (mIsDefault)
@@ -438,6 +484,7 @@ void FramebufferGL::syncState(ContextImpl *contextImpl, const Framebuffer::Dirty
const auto &drawBuffers = mState.getDrawBufferStates();
mFunctions->drawBuffers(static_cast<GLsizei>(drawBuffers.size()),
drawBuffers.data());
+ mAppliedEnabledDrawBuffers = mState.getEnabledDrawBuffers();
break;
}
case Framebuffer::DIRTY_BIT_READ_BUFFER:
@@ -485,7 +532,29 @@ bool FramebufferGL::isDefault() const
return mIsDefault;
}
-void FramebufferGL::syncClearState(ContextImpl *context, GLbitfield mask)
+void FramebufferGL::maskOutInactiveOutputDrawBuffers(DrawBufferMask maxSet)
+{
+ auto targetAppliedDrawBuffers = mState.getEnabledDrawBuffers() & maxSet;
+ if (mAppliedEnabledDrawBuffers != targetAppliedDrawBuffers)
+ {
+ mAppliedEnabledDrawBuffers = targetAppliedDrawBuffers;
+
+ const auto &stateDrawBuffers = mState.getDrawBufferStates();
+ GLsizei drawBufferCount = static_cast<GLsizei>(stateDrawBuffers.size());
+ ASSERT(drawBufferCount <= IMPLEMENTATION_MAX_DRAW_BUFFERS);
+
+ GLenum drawBuffers[IMPLEMENTATION_MAX_DRAW_BUFFERS];
+ for (GLenum i = 0; static_cast<int>(i) < drawBufferCount; ++i)
+ {
+ drawBuffers[i] = targetAppliedDrawBuffers[i] ? stateDrawBuffers[i] : GL_NONE;
+ }
+
+ mStateManager->bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
+ mFunctions->drawBuffers(drawBufferCount, drawBuffers);
+ }
+}
+
+void FramebufferGL::syncClearState(const gl::Context *context, GLbitfield mask)
{
if (mFunctions->standard == STANDARD_GL_DESKTOP)
{
@@ -502,16 +571,18 @@ void FramebufferGL::syncClearState(ContextImpl *context, GLbitfield mask)
}
}
- mStateManager->setFramebufferSRGBEnabled(context->getContextState(), hasSRGBAttachment);
+ mStateManager->setFramebufferSRGBEnabled(context, hasSRGBAttachment);
}
else
{
- mStateManager->setFramebufferSRGBEnabled(context->getContextState(), !mIsDefault);
+ mStateManager->setFramebufferSRGBEnabled(context, !mIsDefault);
}
}
}
-void FramebufferGL::syncClearBufferState(ContextImpl *context, GLenum buffer, GLint drawBuffer)
+void FramebufferGL::syncClearBufferState(const gl::Context *context,
+ GLenum buffer,
+ GLint drawBuffer)
{
if (mFunctions->standard == STANDARD_GL_DESKTOP)
{
@@ -534,13 +605,13 @@ void FramebufferGL::syncClearBufferState(ContextImpl *context, GLenum buffer, GL
if (attachment != nullptr)
{
- mStateManager->setFramebufferSRGBEnabled(context->getContextState(),
+ mStateManager->setFramebufferSRGBEnabled(context,
attachment->getColorEncoding() == GL_SRGB);
}
}
else
{
- mStateManager->setFramebufferSRGBEnabled(context->getContextState(), !mIsDefault);
+ mStateManager->setFramebufferSRGBEnabled(context, !mIsDefault);
}
}
}
@@ -582,68 +653,73 @@ bool FramebufferGL::modifyInvalidateAttachmentsForEmulatedDefaultFBO(
return true;
}
-gl::Error FramebufferGL::readPixelsRowByRowWorkaround(const gl::Rectangle &area,
- GLenum format,
- GLenum type,
- const gl::PixelPackState &pack,
- void *pixels) const
+gl::Error FramebufferGL::readPixelsRowByRow(const gl::Context *context,
+ const gl::Rectangle &area,
+ GLenum format,
+ GLenum type,
+ const gl::PixelPackState &pack,
+ GLubyte *pixels) const
{
- intptr_t offset = reinterpret_cast<intptr_t>(pixels);
const gl::InternalFormat &glFormat = gl::GetInternalFormatInfo(format, type);
- GLuint rowBytes = 0;
+
+ GLuint rowBytes = 0;
ANGLE_TRY_RESULT(glFormat.computeRowPitch(type, area.width, pack.alignment, pack.rowLength),
rowBytes);
GLuint skipBytes = 0;
ANGLE_TRY_RESULT(glFormat.computeSkipBytes(rowBytes, 0, pack, false), skipBytes);
gl::PixelPackState directPack;
- directPack.pixelBuffer = pack.pixelBuffer;
+ directPack.pixelBuffer.set(context, pack.pixelBuffer.get());
directPack.alignment = 1;
mStateManager->setPixelPackState(directPack);
- directPack.pixelBuffer.set(nullptr);
+ directPack.pixelBuffer.set(context, nullptr);
- offset += skipBytes;
- for (GLint row = 0; row < area.height; ++row)
+ pixels += skipBytes;
+ for (GLint y = area.y; y < area.y + area.height; ++y)
{
- mFunctions->readPixels(area.x, row + area.y, area.width, 1, format, type,
- reinterpret_cast<void *>(offset));
- offset += row * rowBytes;
+ mFunctions->readPixels(area.x, y, area.width, 1, format, type, pixels);
+ pixels += rowBytes;
}
return gl::NoError();
}
-gl::Error FramebufferGL::readPixelsPaddingWorkaround(const gl::Rectangle &area,
- GLenum format,
- GLenum type,
- const gl::PixelPackState &pack,
- void *pixels) const
+gl::Error FramebufferGL::readPixelsAllAtOnce(const gl::Context *context,
+ const gl::Rectangle &area,
+ GLenum format,
+ GLenum type,
+ const gl::PixelPackState &pack,
+ GLubyte *pixels,
+ bool readLastRowSeparately) const
{
- const gl::InternalFormat &glFormat = gl::GetInternalFormatInfo(format, type);
- GLuint rowBytes = 0;
- ANGLE_TRY_RESULT(glFormat.computeRowPitch(type, area.width, pack.alignment, pack.rowLength),
- rowBytes);
- GLuint skipBytes = 0;
- ANGLE_TRY_RESULT(glFormat.computeSkipBytes(rowBytes, 0, pack, false), skipBytes);
-
- // Get all by the last row
- if (area.height > 1)
+ GLint height = area.height - readLastRowSeparately;
+ if (height > 0)
{
- mFunctions->readPixels(area.x, area.y, area.width, area.height - 1, format, type, pixels);
+ mStateManager->setPixelPackState(pack);
+ mFunctions->readPixels(area.x, area.y, area.width, height, format, type, pixels);
}
- // Get the last row manually
- gl::PixelPackState directPack;
- directPack.pixelBuffer = pack.pixelBuffer;
- directPack.alignment = 1;
- mStateManager->setPixelPackState(directPack);
- directPack.pixelBuffer.set(nullptr);
-
- intptr_t lastRowOffset =
- reinterpret_cast<intptr_t>(pixels) + skipBytes + (area.height - 1) * rowBytes;
- mFunctions->readPixels(area.x, area.y + area.height - 1, area.width, 1, format, type,
- reinterpret_cast<void *>(lastRowOffset));
+ if (readLastRowSeparately)
+ {
+ const gl::InternalFormat &glFormat = gl::GetInternalFormatInfo(format, type);
+
+ GLuint rowBytes = 0;
+ ANGLE_TRY_RESULT(glFormat.computeRowPitch(type, area.width, pack.alignment, pack.rowLength),
+ rowBytes);
+ GLuint skipBytes = 0;
+ ANGLE_TRY_RESULT(glFormat.computeSkipBytes(rowBytes, 0, pack, false), skipBytes);
+
+ gl::PixelPackState directPack;
+ directPack.pixelBuffer.set(context, pack.pixelBuffer.get());
+ directPack.alignment = 1;
+ mStateManager->setPixelPackState(directPack);
+ directPack.pixelBuffer.set(context, nullptr);
+
+ pixels += skipBytes + (area.height - 1) * rowBytes;
+ mFunctions->readPixels(area.x, area.y + area.height - 1, area.width, 1, format, type,
+ pixels);
+ }
return gl::NoError();
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/FramebufferGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/FramebufferGL.h
index b8abb5cb8a3..ea6f4af5781 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/FramebufferGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/FramebufferGL.h
@@ -39,40 +39,44 @@ class FramebufferGL : public FramebufferImpl
StateManagerGL *stateManager);
~FramebufferGL() override;
- gl::Error discard(size_t count, const GLenum *attachments) override;
- gl::Error invalidate(size_t count, const GLenum *attachments) override;
- gl::Error invalidateSub(size_t count,
+ 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 clear(ContextImpl *context, GLbitfield mask) override;
- gl::Error clearBufferfv(ContextImpl *context,
+ 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(ContextImpl *context,
+ gl::Error clearBufferuiv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLuint *values) override;
- gl::Error clearBufferiv(ContextImpl *context,
+ gl::Error clearBufferiv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLint *values) override;
- gl::Error clearBufferfi(ContextImpl *context,
+ gl::Error clearBufferfi(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
GLfloat depth,
GLint stencil) override;
- GLenum getImplementationColorReadFormat() const override;
- GLenum getImplementationColorReadType() const override;
- gl::Error readPixels(ContextImpl *context,
+ 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) const override;
- gl::Error blit(ContextImpl *context,
+ gl::Error blit(const gl::Context *context,
const gl::Rectangle &sourceArea,
const gl::Rectangle &destArea,
GLbitfield mask,
@@ -82,31 +86,37 @@ class FramebufferGL : public FramebufferImpl
bool checkStatus() const override;
- void syncState(ContextImpl *contextImpl, const gl::Framebuffer::DirtyBits &dirtyBits) override;
+ void syncState(const gl::Context *context,
+ const gl::Framebuffer::DirtyBits &dirtyBits) override;
GLuint getFramebufferID() const;
bool isDefault() const;
+ void maskOutInactiveOutputDrawBuffers(gl::DrawBufferMask maxSet);
+
private:
- void syncClearState(ContextImpl *context, GLbitfield mask);
- void syncClearBufferState(ContextImpl *context, GLenum buffer, GLint drawBuffer);
+ void syncClearState(const gl::Context *context, GLbitfield mask);
+ void syncClearBufferState(const gl::Context *context, GLenum buffer, GLint drawBuffer);
bool modifyInvalidateAttachmentsForEmulatedDefaultFBO(
size_t count,
const GLenum *attachments,
std::vector<GLenum> *modifiedAttachments) const;
- gl::Error readPixelsRowByRowWorkaround(const gl::Rectangle &area,
- GLenum format,
- GLenum type,
- const gl::PixelPackState &pack,
- void *pixels) const;
-
- gl::Error readPixelsPaddingWorkaround(const gl::Rectangle &area,
- GLenum format,
- GLenum type,
- const gl::PixelPackState &pack,
- void *pixels) const;
+ gl::Error readPixelsRowByRow(const gl::Context *context,
+ const gl::Rectangle &area,
+ GLenum format,
+ GLenum type,
+ const gl::PixelPackState &pack,
+ GLubyte *pixels) const;
+
+ gl::Error readPixelsAllAtOnce(const gl::Context *context,
+ const gl::Rectangle &area,
+ GLenum format,
+ GLenum type,
+ const gl::PixelPackState &pack,
+ GLubyte *pixels,
+ bool readLastRowSeparately) const;
const FunctionsGL *mFunctions;
StateManagerGL *mStateManager;
@@ -115,6 +125,8 @@ class FramebufferGL : public FramebufferImpl
GLuint mFramebufferID;
bool mIsDefault;
+
+ gl::DrawBufferMask mAppliedEnabledDrawBuffers;
};
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/FunctionsGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/FunctionsGL.cpp
index 2cf269d83e0..21ea3750127 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/FunctionsGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/FunctionsGL.cpp
@@ -789,7 +789,8 @@ FunctionsGL::FunctionsGL()
primitiveBoundingBox(nullptr),
eglImageTargetRenderbufferStorageOES(nullptr),
eglImageTargetTexture2DOES(nullptr),
- discardFramebuffer(nullptr)
+ discardFramebuffer(nullptr),
+ getInternalformatSampleivNV(nullptr)
{
}
@@ -848,6 +849,9 @@ void FunctionsGL::initializeProcsDesktopGL()
// Even though extensions are written against specific versions of GL, many drivers expose the extensions
// in even older versions. Always try loading the extensions regardless of GL version.
+ // GL_NV_internalformat_sample_query
+ ASSIGN_WITH_EXT("GL_NV_internalformat_sample_query", "glGetInternalformatSampleivNV", getInternalformatSampleivNV);
+
// GL_ARB_program_interface_query (loading only functions relevant to GL_NV_path_rendering here)
ASSIGN_WITH_EXT("GL_ARB_program_interface_query", "glGetProgramInterfaceiv", getProgramInterfaceiv);
ASSIGN_WITH_EXT("GL_ARB_program_interface_query", "glGetProgramResourceName", getProgramResourceName);
@@ -1799,6 +1803,9 @@ void FunctionsGL::initializeProcsGLES()
// clang-format off
+ // GL_NV_internalformat_sample_query
+ ASSIGN_WITH_EXT("GL_NV_internalformat_sample_query", "glGetInternalformatSampleivNV", getInternalformatSampleivNV);
+
// GL_NV_path_rendering
ASSIGN_WITH_EXT("GL_NV_path_rendering", "glMatrixLoadfEXT", matrixLoadEXT);
ASSIGN_WITH_EXT("GL_NV_path_rendering", "glGenPathsNV", genPathsNV);
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/FunctionsGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/FunctionsGL.h
index a629a9cb371..03513c26383 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/FunctionsGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/FunctionsGL.h
@@ -782,6 +782,9 @@ class FunctionsGL
// GL_EXT_discard_framebuffer
PFNGLDISCARDFRAMEBUFFEREXTPROC discardFramebuffer;
+ // GL_NV_internalformat_sample_query
+ PFNGLGETINTERNALFORMATSAMPLEIVNVPROC getInternalformatSampleivNV;
+
private:
void initializeProcsDesktopGL();
void initializeProcsGLES();
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.cpp
index b3e55462bb6..2ea74e2d722 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.cpp
@@ -8,17 +8,18 @@
#include "libANGLE/renderer/gl/ProgramGL.h"
-#include "common/bitset_utils.h"
#include "common/angleutils.h"
+#include "common/bitset_utils.h"
#include "common/debug.h"
#include "common/string_utils.h"
#include "common/utilities.h"
+#include "libANGLE/Context.h"
+#include "libANGLE/Uniform.h"
#include "libANGLE/renderer/gl/ContextGL.h"
#include "libANGLE/renderer/gl/FunctionsGL.h"
#include "libANGLE/renderer/gl/ShaderGL.h"
#include "libANGLE/renderer/gl/StateManagerGL.h"
#include "libANGLE/renderer/gl/WorkaroundsGL.h"
-#include "libANGLE/Uniform.h"
#include "platform/Platform.h"
namespace rx
@@ -48,9 +49,9 @@ ProgramGL::~ProgramGL()
mProgramID = 0;
}
-LinkResult ProgramGL::load(const ContextImpl *contextImpl,
- gl::InfoLog &infoLog,
- gl::BinaryInputStream *stream)
+gl::LinkResult ProgramGL::load(const gl::Context *context,
+ gl::InfoLog &infoLog,
+ gl::BinaryInputStream *stream)
{
preLink();
@@ -70,22 +71,12 @@ LinkResult ProgramGL::load(const ContextImpl *contextImpl,
}
postLink();
-
- // Re-apply UBO bindings to work around driver bugs.
- const WorkaroundsGL &workaroundsGL = GetAs<ContextGL>(contextImpl)->getWorkaroundsGL();
- if (workaroundsGL.reapplyUBOBindingsAfterLoadingBinaryProgram)
- {
- for (size_t bindingIndex : mState.getActiveUniformBlockBindingsMask())
- {
- GLuint uintIndex = static_cast<GLuint>(bindingIndex);
- setUniformBlockBinding(uintIndex, mState.getUniformBlockBinding(uintIndex));
- }
- }
+ reapplyUBOBindingsIfNeeded(context);
return true;
}
-gl::Error ProgramGL::save(gl::BinaryOutputStream *stream)
+void ProgramGL::save(const gl::Context *context, gl::BinaryOutputStream *stream)
{
GLint binaryLength = 0;
mFunctions->getProgramiv(mProgramID, GL_PROGRAM_BINARY_LENGTH, &binaryLength);
@@ -99,7 +90,21 @@ gl::Error ProgramGL::save(gl::BinaryOutputStream *stream)
stream->writeInt(binaryLength);
stream->writeBytes(&binary[0], binaryLength);
- return gl::NoError();
+ reapplyUBOBindingsIfNeeded(context);
+}
+
+void ProgramGL::reapplyUBOBindingsIfNeeded(const gl::Context *context)
+{
+ // Re-apply UBO bindings to work around driver bugs.
+ const WorkaroundsGL &workaroundsGL = GetImplAs<ContextGL>(context)->getWorkaroundsGL();
+ if (workaroundsGL.reapplyUBOBindingsAfterUsingBinaryProgram)
+ {
+ const auto &blocks = mState.getUniformBlocks();
+ for (size_t blockIndex : mState.getActiveUniformBlockBindingsMask())
+ {
+ setUniformBlockBinding(static_cast<GLuint>(blockIndex), blocks[blockIndex].binding);
+ }
+ }
}
void ProgramGL::setBinaryRetrievableHint(bool retrievable)
@@ -117,9 +122,9 @@ void ProgramGL::setSeparable(bool separable)
mFunctions->programParameteri(mProgramID, GL_PROGRAM_SEPARABLE, separable ? GL_TRUE : GL_FALSE);
}
-LinkResult ProgramGL::link(ContextImpl *contextImpl,
- const gl::VaryingPacking &packing,
- gl::InfoLog &infoLog)
+gl::LinkResult ProgramGL::link(const gl::Context *context,
+ const gl::VaryingPacking &packing,
+ gl::InfoLog &infoLog)
{
preLink();
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.h
index fa5a7c4ce1e..29ffb1d2262 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.h
@@ -31,16 +31,16 @@ class ProgramGL : public ProgramImpl
bool enablePathRendering);
~ProgramGL() override;
- LinkResult load(const ContextImpl *contextImpl,
- gl::InfoLog &infoLog,
- gl::BinaryInputStream *stream) override;
- gl::Error save(gl::BinaryOutputStream *stream) override;
+ gl::LinkResult load(const gl::Context *contextImpl,
+ 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;
- LinkResult link(ContextImpl *contextImpl,
- const gl::VaryingPacking &packing,
- gl::InfoLog &infoLog) override;
+ gl::LinkResult link(const gl::Context *contextImpl,
+ const gl::VaryingPacking &packing,
+ gl::InfoLog &infoLog) override;
GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override;
@@ -82,6 +82,7 @@ class ProgramGL : public ProgramImpl
void preLink();
bool checkLinkStatus(gl::InfoLog &infoLog);
void postLink();
+ void reapplyUBOBindingsIfNeeded(const gl::Context *context);
// Helper function, makes it simpler to type.
GLint uniLoc(GLint glLocation) const { return mUniformRealLocationMap[glLocation]; }
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/QueryGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/QueryGL.cpp
index 9ed36be56c1..01aa0c50e79 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/QueryGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/QueryGL.cpp
@@ -348,7 +348,7 @@ gl::Error SyncQueryGL::end()
else
{
ASSERT(false);
- return gl::Error(GL_INVALID_OPERATION, "No native support for sync queries.");
+ return gl::InternalError() << "No native support for sync queries.";
}
return gl::NoError();
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/RenderbufferGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/RenderbufferGL.cpp
index 1c4d35d6d89..b4e28d0313a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/RenderbufferGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/RenderbufferGL.cpp
@@ -72,7 +72,7 @@ gl::Error RenderbufferGL::setStorageMultisample(size_t samples, GLenum internalf
error = mFunctions->getError();
if (error == GL_OUT_OF_MEMORY)
{
- return gl::Error(GL_OUT_OF_MEMORY);
+ return gl::OutOfMemory();
}
ASSERT(error == GL_NO_ERROR);
@@ -85,7 +85,7 @@ gl::Error RenderbufferGL::setStorageMultisample(size_t samples, GLenum internalf
gl::Error RenderbufferGL::setStorageEGLImageTarget(egl::Image *image)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
GLuint RenderbufferGL::getRenderbufferID() const
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.cpp
index 85d84cd1379..7065b2a7485 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.cpp
@@ -35,6 +35,7 @@
#include "libANGLE/renderer/gl/TransformFeedbackGL.h"
#include "libANGLE/renderer/gl/VertexArrayGL.h"
#include "libANGLE/renderer/gl/renderergl_utils.h"
+#include "libANGLE/renderer/renderer_utils.h"
namespace
{
@@ -54,7 +55,6 @@ std::vector<GLuint> GatherPaths(const std::vector<gl::Path *> &paths)
} // namespace
-#ifndef NDEBUG
static void INTERNAL_GL_APIENTRY LogGLDebugMessage(GLenum source,
GLenum type,
GLuint id,
@@ -158,7 +158,6 @@ static void INTERNAL_GL_APIENTRY LogGLDebugMessage(GLenum source,
<< "\tMessage: " << message;
}
}
-#endif
namespace rx
{
@@ -168,21 +167,24 @@ RendererGL::RendererGL(const FunctionsGL *functions, const egl::AttributeMap &at
mFunctions(functions),
mStateManager(nullptr),
mBlitter(nullptr),
- mHasDebugOutput(false),
+ mUseDebugOutput(false),
mSkipDrawCalls(false),
- mCapsInitialized(false)
+ mCapsInitialized(false),
+ mMultiviewImplementationType(MultiviewImplementationTypeGL::UNSPECIFIED)
{
ASSERT(mFunctions);
nativegl_gl::GenerateWorkarounds(mFunctions, &mWorkarounds);
mStateManager = new StateManagerGL(mFunctions, getNativeCaps());
mBlitter = new BlitGL(functions, mWorkarounds, mStateManager);
- mHasDebugOutput = mFunctions->isAtLeastGL(gl::Version(4, 3)) ||
- mFunctions->hasGLExtension("GL_KHR_debug") ||
- mFunctions->isAtLeastGLES(gl::Version(3, 2)) ||
- mFunctions->hasGLESExtension("GL_KHR_debug");
-#ifndef NDEBUG
- if (mHasDebugOutput)
+ bool hasDebugOutput = mFunctions->isAtLeastGL(gl::Version(4, 3)) ||
+ mFunctions->hasGLExtension("GL_KHR_debug") ||
+ mFunctions->isAtLeastGLES(gl::Version(3, 2)) ||
+ mFunctions->hasGLESExtension("GL_KHR_debug");
+
+ mUseDebugOutput = hasDebugOutput && ShouldUseDebugLayers(attribMap);
+
+ if (mUseDebugOutput)
{
mFunctions->enable(GL_DEBUG_OUTPUT);
mFunctions->enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
@@ -196,7 +198,6 @@ RendererGL::RendererGL(const FunctionsGL *functions, const egl::AttributeMap &at
0, nullptr, GL_FALSE);
mFunctions->debugMessageCallback(&LogGLDebugMessage, nullptr);
}
-#endif
EGLint deviceType =
static_cast<EGLint>(attribMap.get(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_NONE));
@@ -231,31 +232,27 @@ gl::Error RendererGL::flush()
gl::Error RendererGL::finish()
{
-#ifdef NDEBUG
- if (mWorkarounds.finishDoesNotCauseQueriesToBeAvailable && mHasDebugOutput)
+ if (mWorkarounds.finishDoesNotCauseQueriesToBeAvailable && mUseDebugOutput)
{
mFunctions->enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
}
-#endif
mFunctions->finish();
-#ifdef NDEBUG
- if (mWorkarounds.finishDoesNotCauseQueriesToBeAvailable && mHasDebugOutput)
+ if (mWorkarounds.finishDoesNotCauseQueriesToBeAvailable && mUseDebugOutput)
{
mFunctions->disable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
}
-#endif
return gl::NoError();
}
-gl::Error RendererGL::drawArrays(const gl::ContextState &data,
+gl::Error RendererGL::drawArrays(const gl::Context *context,
GLenum mode,
GLint first,
GLsizei count)
{
- ANGLE_TRY(mStateManager->setDrawArraysState(data, first, count, 0));
+ ANGLE_TRY(mStateManager->setDrawArraysState(context, first, count, 0));
if (!mSkipDrawCalls)
{
@@ -265,13 +262,13 @@ gl::Error RendererGL::drawArrays(const gl::ContextState &data,
return gl::NoError();
}
-gl::Error RendererGL::drawArraysInstanced(const gl::ContextState &data,
+gl::Error RendererGL::drawArraysInstanced(const gl::Context *context,
GLenum mode,
GLint first,
GLsizei count,
GLsizei instanceCount)
{
- ANGLE_TRY(mStateManager->setDrawArraysState(data, first, count, instanceCount));
+ ANGLE_TRY(mStateManager->setDrawArraysState(context, first, count, instanceCount));
if (!mSkipDrawCalls)
{
@@ -281,7 +278,7 @@ gl::Error RendererGL::drawArraysInstanced(const gl::ContextState &data,
return gl::NoError();
}
-gl::Error RendererGL::drawElements(const gl::ContextState &data,
+gl::Error RendererGL::drawElements(const gl::Context *context,
GLenum mode,
GLsizei count,
GLenum type,
@@ -289,7 +286,7 @@ gl::Error RendererGL::drawElements(const gl::ContextState &data,
const gl::IndexRange &indexRange)
{
const void *drawIndexPtr = nullptr;
- ANGLE_TRY(mStateManager->setDrawElementsState(data, count, type, indices, 0, &drawIndexPtr));
+ ANGLE_TRY(mStateManager->setDrawElementsState(context, count, type, indices, 0, &drawIndexPtr));
if (!mSkipDrawCalls)
{
@@ -299,7 +296,7 @@ gl::Error RendererGL::drawElements(const gl::ContextState &data,
return gl::NoError();
}
-gl::Error RendererGL::drawElementsInstanced(const gl::ContextState &data,
+gl::Error RendererGL::drawElementsInstanced(const gl::Context *context,
GLenum mode,
GLsizei count,
GLenum type,
@@ -308,7 +305,7 @@ gl::Error RendererGL::drawElementsInstanced(const gl::ContextState &data,
const gl::IndexRange &indexRange)
{
const void *drawIndexPointer = nullptr;
- ANGLE_TRY(mStateManager->setDrawElementsState(data, count, type, indices, instances,
+ ANGLE_TRY(mStateManager->setDrawElementsState(context, count, type, indices, instances,
&drawIndexPointer));
if (!mSkipDrawCalls)
@@ -319,7 +316,7 @@ gl::Error RendererGL::drawElementsInstanced(const gl::ContextState &data,
return gl::NoError();
}
-gl::Error RendererGL::drawRangeElements(const gl::ContextState &data,
+gl::Error RendererGL::drawRangeElements(const gl::Context *context,
GLenum mode,
GLuint start,
GLuint end,
@@ -330,7 +327,7 @@ gl::Error RendererGL::drawRangeElements(const gl::ContextState &data,
{
const void *drawIndexPointer = nullptr;
ANGLE_TRY(
- mStateManager->setDrawElementsState(data, count, type, indices, 0, &drawIndexPointer));
+ mStateManager->setDrawElementsState(context, count, type, indices, 0, &drawIndexPointer));
if (!mSkipDrawCalls)
{
@@ -340,11 +337,11 @@ gl::Error RendererGL::drawRangeElements(const gl::ContextState &data,
return gl::NoError();
}
-gl::Error RendererGL::drawArraysIndirect(const gl::ContextState &data,
+gl::Error RendererGL::drawArraysIndirect(const gl::Context *context,
GLenum mode,
const void *indirect)
{
- ANGLE_TRY(mStateManager->setDrawIndirectState(data, GL_NONE));
+ ANGLE_TRY(mStateManager->setDrawIndirectState(context, GL_NONE));
if (!mSkipDrawCalls)
{
@@ -353,12 +350,12 @@ gl::Error RendererGL::drawArraysIndirect(const gl::ContextState &data,
return gl::NoError();
}
-gl::Error RendererGL::drawElementsIndirect(const gl::ContextState &data,
+gl::Error RendererGL::drawElementsIndirect(const gl::Context *context,
GLenum mode,
GLenum type,
const void *indirect)
{
- ANGLE_TRY(mStateManager->setDrawIndirectState(data, type));
+ ANGLE_TRY(mStateManager->setDrawIndirectState(context, type));
if (!mSkipDrawCalls)
{
@@ -606,7 +603,7 @@ void RendererGL::generateCaps(gl::Caps *outCaps,
gl::Limitations * /* outLimitations */) const
{
nativegl_gl::GenerateCaps(mFunctions, mWorkarounds, outCaps, outTextureCaps, outExtensions,
- &mMaxSupportedESVersion);
+ &mMaxSupportedESVersion, &mMultiviewImplementationType);
}
GLint RendererGL::getGPUDisjoint()
@@ -655,12 +652,24 @@ const gl::Limitations &RendererGL::getNativeLimitations() const
return mNativeLimitations;
}
-gl::Error RendererGL::dispatchCompute(const gl::ContextState &data,
+MultiviewImplementationTypeGL RendererGL::getMultiviewImplementationType() const
+{
+ ensureCapsInitialized();
+ return mMultiviewImplementationType;
+}
+
+void RendererGL::applyNativeWorkarounds(gl::Workarounds *workarounds) const
+{
+ ensureCapsInitialized();
+ nativegl_gl::ApplyWorkarounds(mFunctions, workarounds);
+}
+
+gl::Error RendererGL::dispatchCompute(const gl::Context *context,
GLuint numGroupsX,
GLuint numGroupsY,
GLuint numGroupsZ)
{
- ANGLE_TRY(mStateManager->setDispatchComputeState(data));
+ ANGLE_TRY(mStateManager->setDispatchComputeState(context));
mFunctions->dispatchCompute(numGroupsX, numGroupsY, numGroupsZ);
return gl::NoError();
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.h
index 82539f73b0d..da4cb7fe70b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.h
@@ -13,12 +13,14 @@
#include "libANGLE/Error.h"
#include "libANGLE/Version.h"
#include "libANGLE/renderer/gl/WorkaroundsGL.h"
+#include "libANGLE/renderer/gl/renderergl_utils.h"
namespace gl
{
class ContextState;
struct IndexRange;
class Path;
+struct Workarounds;
}
namespace egl
@@ -49,27 +51,27 @@ class RendererGL : angle::NonCopyable
gl::Error flush();
gl::Error finish();
- gl::Error drawArrays(const gl::ContextState &data, GLenum mode, GLint first, GLsizei count);
- gl::Error drawArraysInstanced(const gl::ContextState &data,
+ gl::Error drawArrays(const gl::Context *context, GLenum mode, GLint first, GLsizei count);
+ gl::Error drawArraysInstanced(const gl::Context *context,
GLenum mode,
GLint first,
GLsizei count,
GLsizei instanceCount);
- gl::Error drawElements(const gl::ContextState &data,
+ gl::Error drawElements(const gl::Context *context,
GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
const gl::IndexRange &indexRange);
- gl::Error drawElementsInstanced(const gl::ContextState &data,
+ gl::Error drawElementsInstanced(const gl::Context *context,
GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
GLsizei instances,
const gl::IndexRange &indexRange);
- gl::Error drawRangeElements(const gl::ContextState &data,
+ gl::Error drawRangeElements(const gl::Context *context,
GLenum mode,
GLuint start,
GLuint end,
@@ -77,8 +79,8 @@ class RendererGL : angle::NonCopyable
GLenum type,
const void *indices,
const gl::IndexRange &indexRange);
- gl::Error drawArraysIndirect(const gl::ContextState &data, GLenum mode, const void *indirect);
- gl::Error drawElementsIndirect(const gl::ContextState &data,
+ 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);
@@ -161,12 +163,14 @@ class RendererGL : angle::NonCopyable
const WorkaroundsGL &getWorkarounds() const { return mWorkarounds; }
BlitGL *getBlitter() const { return mBlitter; }
+ MultiviewImplementationTypeGL getMultiviewImplementationType() const;
const gl::Caps &getNativeCaps() const;
const gl::TextureCapsMap &getNativeTextureCaps() const;
const gl::Extensions &getNativeExtensions() const;
const gl::Limitations &getNativeLimitations() const;
+ void applyNativeWorkarounds(gl::Workarounds *workarounds) const;
- gl::Error dispatchCompute(const gl::ContextState &data,
+ gl::Error dispatchCompute(const gl::Context *context,
GLuint numGroupsX,
GLuint numGroupsY,
GLuint numGroupsZ);
@@ -187,7 +191,7 @@ class RendererGL : angle::NonCopyable
WorkaroundsGL mWorkarounds;
- bool mHasDebugOutput;
+ bool mUseDebugOutput;
// For performance debugging
bool mSkipDrawCalls;
@@ -197,6 +201,7 @@ class RendererGL : angle::NonCopyable
mutable gl::TextureCapsMap mNativeTextureCaps;
mutable gl::Extensions mNativeExtensions;
mutable gl::Limitations mNativeLimitations;
+ mutable MultiviewImplementationTypeGL mMultiviewImplementationType;
};
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.cpp
index 8fc7d464742..c9ee1c4e4c5 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.cpp
@@ -21,8 +21,15 @@ namespace rx
ShaderGL::ShaderGL(const gl::ShaderState &data,
const FunctionsGL *functions,
- const WorkaroundsGL &workarounds)
- : ShaderImpl(data), mFunctions(functions), mWorkarounds(workarounds), mShaderID(0)
+ const WorkaroundsGL &workarounds,
+ bool isWebGL,
+ MultiviewImplementationTypeGL multiviewImplementationType)
+ : ShaderImpl(data),
+ mFunctions(functions),
+ mWorkarounds(workarounds),
+ mShaderID(0),
+ mIsWebGL(isWebGL),
+ mMultiviewImplementationType(multiviewImplementationType)
{
ASSERT(mFunctions);
}
@@ -50,6 +57,11 @@ ShCompileOptions ShaderGL::prepareSourceAndReturnOptions(std::stringstream *sour
ShCompileOptions options = SH_INIT_GL_POSITION;
+ if (mIsWebGL)
+ {
+ options |= SH_INIT_OUTPUT_VARIABLES;
+ }
+
if (mWorkarounds.doWhileGLSLCausesGPUHang)
{
options |= SH_REWRITE_DO_WHILE_LOOPS;
@@ -95,6 +107,22 @@ ShCompileOptions ShaderGL::prepareSourceAndReturnOptions(std::stringstream *sour
options |= SH_REWRITE_FLOAT_UNARY_MINUS_OPERATOR;
}
+ if (!mWorkarounds.dontInitializeUninitializedLocals)
+ {
+ options |= SH_INITIALIZE_UNINITIALIZED_LOCALS;
+ }
+
+ if (mWorkarounds.clampPointSize)
+ {
+ options |= SH_CLAMP_POINT_SIZE;
+ }
+
+ if (mMultiviewImplementationType == MultiviewImplementationTypeGL::NV_VIEWPORT_ARRAY2)
+ {
+ options |= SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW;
+ options |= SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER;
+ }
+
return options;
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.h
index 0ecd89ce63c..bfe01f24f49 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.h
@@ -15,13 +15,16 @@ namespace rx
{
class FunctionsGL;
struct WorkaroundsGL;
+enum class MultiviewImplementationTypeGL;
class ShaderGL : public ShaderImpl
{
public:
ShaderGL(const gl::ShaderState &data,
const FunctionsGL *functions,
- const WorkaroundsGL &workarounds);
+ const WorkaroundsGL &workarounds,
+ bool isWebGL,
+ MultiviewImplementationTypeGL multiviewImplementationType);
~ShaderGL() override;
// ShaderImpl implementation
@@ -37,6 +40,8 @@ class ShaderGL : public ShaderImpl
const WorkaroundsGL &mWorkarounds;
GLuint mShaderID;
+ bool mIsWebGL;
+ MultiviewImplementationTypeGL mMultiviewImplementationType;
};
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.cpp
index 2e5e58cd48f..e607de130f8 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.cpp
@@ -14,7 +14,7 @@
#include "common/bitset_utils.h"
#include "common/mathutil.h"
#include "common/matrix_utils.h"
-#include "libANGLE/ContextState.h"
+#include "libANGLE/Context.h"
#include "libANGLE/Framebuffer.h"
#include "libANGLE/Query.h"
#include "libANGLE/TransformFeedback.h"
@@ -50,6 +50,7 @@ StateManagerGL::StateManagerGL(const FunctionsGL *functions, const gl::Caps &ren
mTextureUnitIndex(0),
mTextures(),
mSamplers(rendererCaps.maxCombinedTextureImageUnits, 0),
+ mImages(rendererCaps.maxImageUnits, ImageUnitBinding()),
mTransformFeedback(0),
mQueries(),
mPrevDrawTransformFeedback(nullptr),
@@ -206,6 +207,15 @@ void StateManagerGL::deleteTexture(GLuint texture)
}
}
+ for (size_t imageUnitIndex = 0; imageUnitIndex < mImages.size(); imageUnitIndex++)
+ {
+ if (mImages[imageUnitIndex].texture == texture)
+ {
+ bindImageTexture(static_cast<GLuint>(imageUnitIndex), 0, 0, false, 0, GL_READ_ONLY,
+ GL_R32UI);
+ }
+ }
+
mFunctions->deleteTextures(1, &texture);
}
}
@@ -407,6 +417,28 @@ void StateManagerGL::bindSampler(size_t unit, GLuint sampler)
}
}
+void StateManagerGL::bindImageTexture(GLuint unit,
+ GLuint texture,
+ GLint level,
+ GLboolean layered,
+ GLint layer,
+ GLenum access,
+ GLenum format)
+{
+ auto &binding = mImages[unit];
+ if (binding.texture != texture || binding.level != level || binding.layered != layered ||
+ binding.layer != layer || binding.access != access || binding.format != format)
+ {
+ binding.texture = texture;
+ binding.level = level;
+ binding.layered = layered;
+ binding.layer = layer;
+ binding.access = access;
+ binding.format = format;
+ mFunctions->bindImageTexture(unit, texture, level, layered, layer, access, format);
+ }
+}
+
void StateManagerGL::setPixelUnpackState(const gl::PixelUnpackState &unpack)
{
GLuint unpackBufferID = 0;
@@ -612,47 +644,43 @@ void StateManagerGL::onDeleteQueryObject(QueryGL *query)
mCurrentQueries.erase(query);
}
-gl::Error StateManagerGL::setDrawArraysState(const gl::ContextState &data,
+gl::Error StateManagerGL::setDrawArraysState(const gl::Context *context,
GLint first,
GLsizei count,
GLsizei instanceCount)
{
- const gl::State &state = data.getState();
+ const gl::State &glState = context->getGLState();
- const gl::Program *program = state.getProgram();
+ const gl::Program *program = glState.getProgram();
- const gl::VertexArray *vao = state.getVertexArray();
+ const gl::VertexArray *vao = glState.getVertexArray();
const VertexArrayGL *vaoGL = GetImplAs<VertexArrayGL>(vao);
- gl::Error error = vaoGL->syncDrawArraysState(program->getActiveAttribLocationsMask(), first,
- count, instanceCount);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(vaoGL->syncDrawArraysState(context, program->getActiveAttribLocationsMask(), first,
+ count, instanceCount));
bindVertexArray(vaoGL->getVertexArrayID(), vaoGL->getAppliedElementArrayBufferID());
- return setGenericDrawState(data);
+ return setGenericDrawState(context);
}
-gl::Error StateManagerGL::setDrawElementsState(const gl::ContextState &data,
+gl::Error StateManagerGL::setDrawElementsState(const gl::Context *context,
GLsizei count,
GLenum type,
const void *indices,
GLsizei instanceCount,
const void **outIndices)
{
- const gl::State &state = data.getState();
+ const gl::State &glState = context->getGLState();
- const gl::Program *program = state.getProgram();
+ const gl::Program *program = glState.getProgram();
- const gl::VertexArray *vao = state.getVertexArray();
+ const gl::VertexArray *vao = glState.getVertexArray();
const VertexArrayGL *vaoGL = GetImplAs<VertexArrayGL>(vao);
- gl::Error error =
- vaoGL->syncDrawElementsState(program->getActiveAttribLocationsMask(), count, type, indices,
- instanceCount, state.isPrimitiveRestartEnabled(), outIndices);
+ gl::Error error = vaoGL->syncDrawElementsState(context, program->getActiveAttribLocationsMask(),
+ count, type, indices, instanceCount,
+ glState.isPrimitiveRestartEnabled(), outIndices);
if (error.isError())
{
return error;
@@ -660,33 +688,33 @@ gl::Error StateManagerGL::setDrawElementsState(const gl::ContextState &data,
bindVertexArray(vaoGL->getVertexArrayID(), vaoGL->getAppliedElementArrayBufferID());
- return setGenericDrawState(data);
+ return setGenericDrawState(context);
}
-gl::Error StateManagerGL::setDrawIndirectState(const gl::ContextState &data, GLenum type)
+gl::Error StateManagerGL::setDrawIndirectState(const gl::Context *context, GLenum type)
{
- const gl::State &state = data.getState();
+ const gl::State &glState = context->getGLState();
- const gl::VertexArray *vao = state.getVertexArray();
+ const gl::VertexArray *vao = glState.getVertexArray();
const VertexArrayGL *vaoGL = GetImplAs<VertexArrayGL>(vao);
if (type != GL_NONE)
{
- ANGLE_TRY(vaoGL->syncElementArrayState());
+ ANGLE_TRY(vaoGL->syncElementArrayState(context));
}
bindVertexArray(vaoGL->getVertexArrayID(), vaoGL->getAppliedElementArrayBufferID());
- gl::Buffer *drawIndirectBuffer = state.getDrawIndirectBuffer();
+ gl::Buffer *drawIndirectBuffer = glState.getDrawIndirectBuffer();
ASSERT(drawIndirectBuffer);
const BufferGL *bufferGL = GetImplAs<BufferGL>(drawIndirectBuffer);
bindBuffer(GL_DRAW_INDIRECT_BUFFER, bufferGL->getBufferID());
- return setGenericDrawState(data);
+ return setGenericDrawState(context);
}
-gl::Error StateManagerGL::setDispatchComputeState(const gl::ContextState &data)
+gl::Error StateManagerGL::setDispatchComputeState(const gl::Context *context)
{
- setGenericShaderState(data);
+ setGenericShaderState(context);
return gl::NoError();
}
@@ -736,23 +764,24 @@ void StateManagerGL::resumeQuery(GLenum type)
}
}
-gl::Error StateManagerGL::onMakeCurrent(const gl::ContextState &data)
+gl::Error StateManagerGL::onMakeCurrent(const gl::Context *context)
{
- const gl::State &state = data.getState();
+ const gl::State &glState = context->getGLState();
// If the context has changed, pause the previous context's queries
- if (data.getContextID() != mPrevDrawContext)
+ auto contextID = context->getContextState().getContextID();
+ if (contextID != mPrevDrawContext)
{
pauseAllQueries();
}
mCurrentQueries.clear();
mPrevDrawTransformFeedback = nullptr;
- mPrevDrawContext = data.getContextID();
+ mPrevDrawContext = contextID;
// Set the current query state
for (GLenum queryType : QueryTypes)
{
- gl::Query *query = state.getActiveQuery(queryType);
+ gl::Query *query = glState.getActiveQuery(queryType);
if (query != nullptr)
{
QueryGL *queryGL = GetImplAs<QueryGL>(query);
@@ -764,17 +793,17 @@ gl::Error StateManagerGL::onMakeCurrent(const gl::ContextState &data)
// Seamless cubemaps are required for ES3 and higher contexts. It should be the cheapest to set
// this state here since MakeCurrent is expected to be called less frequently than draw calls.
- setTextureCubemapSeamlessEnabled(data.getClientMajorVersion() >= 3);
+ setTextureCubemapSeamlessEnabled(context->getClientMajorVersion() >= 3);
return gl::NoError();
}
-void StateManagerGL::setGenericShaderState(const gl::ContextState &data)
+void StateManagerGL::setGenericShaderState(const gl::Context *context)
{
- const gl::State &state = data.getState();
+ const gl::State &glState = context->getGLState();
// Sync the current program state
- const gl::Program *program = state.getProgram();
+ const gl::Program *program = glState.getProgram();
const ProgramGL *programGL = GetImplAs<ProgramGL>(program);
useProgram(programGL->getProgramID());
@@ -782,7 +811,7 @@ void StateManagerGL::setGenericShaderState(const gl::ContextState &data)
uniformBlockIndex++)
{
GLuint binding = program->getUniformBlockBinding(static_cast<GLuint>(uniformBlockIndex));
- const auto &uniformBuffer = state.getIndexedUniformBuffer(binding);
+ const auto &uniformBuffer = glState.getIndexedUniformBuffer(binding);
if (uniformBuffer.get() != nullptr)
{
@@ -805,18 +834,18 @@ void StateManagerGL::setGenericShaderState(const gl::ContextState &data)
GLenum textureType = samplerUniform.textureType;
for (GLuint textureUnitIndex : samplerUniform.boundTextureUnits)
{
- gl::Texture *texture = state.getSamplerTexture(textureUnitIndex, textureType);
- const gl::Sampler *sampler = state.getSampler(textureUnitIndex);
+ gl::Texture *texture = glState.getSamplerTexture(textureUnitIndex, textureType);
+ const gl::Sampler *sampler = glState.getSampler(textureUnitIndex);
const gl::SamplerState &samplerState =
sampler ? sampler->getSamplerState() : texture->getSamplerState();
- if (texture != nullptr &&
- texture->getTextureState().isSamplerComplete(samplerState, data))
+ if (texture != nullptr && texture->getTextureState().isSamplerComplete(
+ samplerState, context->getContextState()))
{
const TextureGL *textureGL = GetImplAs<TextureGL>(texture);
- if (mTextures[textureType][textureUnitIndex] != textureGL->getTextureID() ||
+ if (mTextures.at(textureType)[textureUnitIndex] != textureGL->getTextureID() ||
texture->hasAnyDirtyBit() || textureGL->hasAnyDirtyBit())
{
activeTexture(textureUnitIndex);
@@ -829,7 +858,7 @@ void StateManagerGL::setGenericShaderState(const gl::ContextState &data)
}
else
{
- if (mTextures[textureType][textureUnitIndex] != 0)
+ if (mTextures.at(textureType)[textureUnitIndex] != 0)
{
activeTexture(textureUnitIndex);
bindTexture(textureType, 0);
@@ -848,20 +877,46 @@ void StateManagerGL::setGenericShaderState(const gl::ContextState &data)
}
}
}
+
+ // TODO(xinghua.cao@intel.com): Track image units state with dirty bits to
+ // avoid update every draw call.
+ ASSERT(context->getClientVersion() >= gl::ES_3_1 || program->getImageBindings().size() == 0);
+ for (const gl::ImageBinding &imageUniform : program->getImageBindings())
+ {
+ for (size_t imageUnitIndex = 0; imageUnitIndex < imageUniform.elementCount;
+ imageUnitIndex++)
+ {
+ const gl::ImageUnit &imageUnit = glState.getImageUnit(
+ imageUniform.boundImageUnit + static_cast<GLuint>(imageUnitIndex));
+ const TextureGL *textureGL = SafeGetImplAs<TextureGL>(imageUnit.texture.get());
+ if (textureGL)
+ {
+ bindImageTexture(imageUniform.boundImageUnit + static_cast<GLuint>(imageUnitIndex),
+ textureGL->getTextureID(), imageUnit.level, imageUnit.layered,
+ imageUnit.layer, imageUnit.access, imageUnit.format);
+ }
+ else
+ {
+ bindImageTexture(imageUniform.boundImageUnit + static_cast<GLuint>(imageUnitIndex),
+ 0, imageUnit.level, imageUnit.layered, imageUnit.layer,
+ imageUnit.access, imageUnit.format);
+ }
+ }
+ }
}
-gl::Error StateManagerGL::setGenericDrawState(const gl::ContextState &data)
+gl::Error StateManagerGL::setGenericDrawState(const gl::Context *context)
{
- setGenericShaderState(data);
+ setGenericShaderState(context);
- const gl::State &state = data.getState();
+ const gl::State &glState = context->getGLState();
- const gl::Framebuffer *framebuffer = state.getDrawFramebuffer();
- const FramebufferGL *framebufferGL = GetImplAs<FramebufferGL>(framebuffer);
+ gl::Framebuffer *framebuffer = glState.getDrawFramebuffer();
+ FramebufferGL *framebufferGL = GetImplAs<FramebufferGL>(framebuffer);
bindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferGL->getFramebufferID());
// Set the current transform feedback state
- gl::TransformFeedback *transformFeedback = state.getCurrentTransformFeedback();
+ gl::TransformFeedback *transformFeedback = glState.getCurrentTransformFeedback();
if (transformFeedback)
{
TransformFeedbackGL *transformFeedbackGL =
@@ -878,6 +933,12 @@ gl::Error StateManagerGL::setGenericDrawState(const gl::ContextState &data)
mPrevDrawTransformFeedback = nullptr;
}
+ if (context->getExtensions().webglCompatibility)
+ {
+ auto activeOutputs = glState.getProgram()->getState().getActiveOutputVariables();
+ framebufferGL->maskOutInactiveOutputDrawBuffers(activeOutputs);
+ }
+
return gl::NoError();
}
@@ -1401,10 +1462,9 @@ void StateManagerGL::setClearStencil(GLint clearStencil)
}
}
-void StateManagerGL::syncState(const gl::ContextState &data,
- const gl::State::DirtyBits &glDirtyBits)
+void StateManagerGL::syncState(const gl::Context *context, const gl::State::DirtyBits &glDirtyBits)
{
- const gl::State &state = data.getState();
+ const gl::State &state = context->getGLState();
// The the current framebuffer binding sometimes requires resetting the srgb blending
if (glDirtyBits[gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING] &&
@@ -1658,7 +1718,7 @@ void StateManagerGL::syncState(const gl::ContextState &data,
break;
case gl::State::DIRTY_BIT_FRAMEBUFFER_SRGB:
setFramebufferSRGBEnabledForFramebuffer(
- data, state.getFramebufferSRGB(),
+ context, state.getFramebufferSRGB(),
GetImplAs<FramebufferGL>(state.getDrawFramebuffer()));
break;
default:
@@ -1677,9 +1737,9 @@ void StateManagerGL::syncState(const gl::ContextState &data,
}
}
-void StateManagerGL::setFramebufferSRGBEnabled(const gl::ContextState &data, bool enabled)
+void StateManagerGL::setFramebufferSRGBEnabled(const gl::Context *context, bool enabled)
{
- if (!data.getExtensions().sRGBWriteControl)
+ if (!context->getExtensions().sRGBWriteControl)
{
return;
}
@@ -1699,7 +1759,7 @@ void StateManagerGL::setFramebufferSRGBEnabled(const gl::ContextState &data, boo
}
}
-void StateManagerGL::setFramebufferSRGBEnabledForFramebuffer(const gl::ContextState &data,
+void StateManagerGL::setFramebufferSRGBEnabledForFramebuffer(const gl::Context *context,
bool enabled,
const FramebufferGL *framebuffer)
{
@@ -1710,11 +1770,11 @@ void StateManagerGL::setFramebufferSRGBEnabledForFramebuffer(const gl::ContextSt
// When SRGB blending is enabled, only SRGB capable formats will use it but the default
// framebuffer will always use it if it is enabled.
// TODO(geofflang): Update this when the framebuffer binding dirty changes, when it exists.
- setFramebufferSRGBEnabled(data, false);
+ setFramebufferSRGBEnabled(context, false);
}
else
{
- setFramebufferSRGBEnabled(data, enabled);
+ setFramebufferSRGBEnabled(context, enabled);
}
}
@@ -1816,6 +1876,12 @@ void StateManagerGL::setPathRenderingStencilState(GLenum func, GLint ref, GLuint
void StateManagerGL::setTextureCubemapSeamlessEnabled(bool enabled)
{
+ // TODO(jmadill): Also check for seamless extension.
+ if (!mFunctions->isAtLeastGL(gl::Version(3, 2)))
+ {
+ return;
+ }
+
if (mTextureCubemapSeamlessEnabled != enabled)
{
mTextureCubemapSeamlessEnabled = enabled;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.h
index 43dab84020d..552c2f95945 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.h
@@ -56,6 +56,13 @@ class StateManagerGL final : angle::NonCopyable
void activeTexture(size_t unit);
void bindTexture(GLenum type, GLuint texture);
void bindSampler(size_t unit, GLuint sampler);
+ void bindImageTexture(GLuint unit,
+ GLuint texture,
+ GLint level,
+ GLboolean layered,
+ GLint layer,
+ GLenum access,
+ GLenum format);
void bindFramebuffer(GLenum type, GLuint framebuffer);
void bindRenderbuffer(GLenum type, GLuint renderbuffer);
void bindTransformFeedback(GLenum type, GLuint transformFeedback);
@@ -123,8 +130,8 @@ class StateManagerGL final : angle::NonCopyable
GLint skipPixels,
GLuint packBuffer);
- void setFramebufferSRGBEnabled(const gl::ContextState &data, bool enabled);
- void setFramebufferSRGBEnabledForFramebuffer(const gl::ContextState &data,
+ void setFramebufferSRGBEnabled(const gl::Context *context, bool enabled);
+ void setFramebufferSRGBEnabledForFramebuffer(const gl::Context *context,
bool enabled,
const FramebufferGL *framebuffer);
@@ -141,35 +148,35 @@ class StateManagerGL final : angle::NonCopyable
void onDeleteQueryObject(QueryGL *query);
- gl::Error setDrawArraysState(const gl::ContextState &data,
+ gl::Error setDrawArraysState(const gl::Context *context,
GLint first,
GLsizei count,
GLsizei instanceCount);
- gl::Error setDrawElementsState(const gl::ContextState &data,
+ gl::Error setDrawElementsState(const gl::Context *context,
GLsizei count,
GLenum type,
const void *indices,
GLsizei instanceCount,
const void **outIndices);
- gl::Error setDrawIndirectState(const gl::ContextState &data, GLenum type);
+ gl::Error setDrawIndirectState(const gl::Context *context, GLenum type);
- gl::Error setDispatchComputeState(const gl::ContextState &data);
+ gl::Error setDispatchComputeState(const gl::Context *context);
void pauseTransformFeedback();
void pauseAllQueries();
void pauseQuery(GLenum type);
void resumeAllQueries();
void resumeQuery(GLenum type);
- gl::Error onMakeCurrent(const gl::ContextState &data);
+ gl::Error onMakeCurrent(const gl::Context *context);
- void syncState(const gl::ContextState &data, const gl::State::DirtyBits &glDirtyBits);
+ void syncState(const gl::Context *context, const gl::State::DirtyBits &glDirtyBits);
private:
// Set state that's common among draw commands and compute invocations.
- void setGenericShaderState(const gl::ContextState &data);
+ void setGenericShaderState(const gl::Context *context);
// Set state that's common among draw commands.
- gl::Error setGenericDrawState(const gl::ContextState &data);
+ gl::Error setGenericDrawState(const gl::Context *context);
void setTextureCubemapSeamlessEnabled(bool enabled);
@@ -196,6 +203,22 @@ class StateManagerGL final : angle::NonCopyable
std::map<GLenum, std::vector<GLuint>> mTextures;
std::vector<GLuint> mSamplers;
+ struct ImageUnitBinding
+ {
+ ImageUnitBinding()
+ : texture(0), level(0), layered(false), layer(0), access(GL_READ_ONLY), format(GL_R32UI)
+ {
+ }
+
+ GLuint texture;
+ GLint level;
+ GLboolean layered;
+ GLint layer;
+ GLenum access;
+ GLenum format;
+ };
+ std::vector<ImageUnitBinding> mImages;
+
GLuint mTransformFeedback;
std::map<GLenum, GLuint> mQueries;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/SurfaceGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/SurfaceGL.cpp
index bba938bba0d..602319de9d5 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/SurfaceGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/SurfaceGL.cpp
@@ -32,11 +32,11 @@ FramebufferImpl *SurfaceGL::createDefaultFramebuffer(const gl::FramebufferState
egl::Error SurfaceGL::getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc)
{
UNREACHABLE();
- return egl::Error(EGL_BAD_SURFACE);
+ return egl::EglBadSurface();
}
egl::Error SurfaceGL::unMakeCurrent()
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.cpp
index f84a534b5c1..352cc69ec82 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.cpp
@@ -11,6 +11,7 @@
#include "common/bitset_utils.h"
#include "common/debug.h"
#include "common/utilities.h"
+#include "libANGLE/Context.h"
#include "libANGLE/State.h"
#include "libANGLE/angletypes.h"
#include "libANGLE/formatutils.h"
@@ -31,6 +32,13 @@ namespace rx
namespace
{
+size_t GetLevelInfoIndex(GLenum target, size_t level)
+{
+ return gl::IsCubeMapTextureTarget(target)
+ ? ((level * 6) + gl::CubeMapTextureTargetToLayerIndex(target))
+ : level;
+}
+
bool UseTexImage2D(GLenum textureType)
{
return textureType == GL_TEXTURE_2D || textureType == GL_TEXTURE_CUBE_MAP;
@@ -127,7 +135,7 @@ TextureGL::TextureGL(const gl::TextureState &state,
mWorkarounds(workarounds),
mStateManager(stateManager),
mBlitter(blitter),
- mLevelInfo(gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS + 1),
+ mLevelInfo(),
mAppliedSwizzle(state.getSwizzleState()),
mAppliedSampler(state.getSamplerState()),
mAppliedBaseLevel(state.getEffectiveBaseLevel()),
@@ -140,6 +148,8 @@ TextureGL::TextureGL(const gl::TextureState &state,
mFunctions->genTextures(1, &mTextureID);
mStateManager->bindTexture(getTarget(), mTextureID);
+ mLevelInfo.resize((gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS + 1) *
+ (getTarget() == GL_TEXTURE_CUBE_MAP ? 6 : 1));
}
TextureGL::~TextureGL()
@@ -148,7 +158,7 @@ TextureGL::~TextureGL()
mTextureID = 0;
}
-gl::Error TextureGL::setImage(ContextImpl *contextImpl,
+gl::Error TextureGL::setImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -171,7 +181,8 @@ gl::Error TextureGL::setImage(ContextImpl *contextImpl,
}
gl::Box area(0, 0, 0, size.width, size.height, size.depth);
- return setSubImageRowByRowWorkaround(target, level, area, format, type, unpack, pixels);
+ return setSubImageRowByRowWorkaround(context, target, level, area, format, type, unpack,
+ pixels);
}
if (mWorkarounds.unpackLastRowSeparatelyForPaddingInclusion)
@@ -193,7 +204,8 @@ gl::Error TextureGL::setImage(ContextImpl *contextImpl,
}
gl::Box area(0, 0, 0, size.width, size.height, size.depth);
- return setSubImagePaddingWorkaround(target, level, area, format, type, unpack, pixels);
+ return setSubImagePaddingWorkaround(context, target, level, area, format, type, unpack,
+ pixels);
}
}
@@ -235,7 +247,7 @@ void TextureGL::setImageHelper(GLenum target,
UNREACHABLE();
}
- setLevelInfo(level, 1, GetLevelInfo(internalFormat, texImageFormat.internalFormat));
+ setLevelInfo(target, level, 1, GetLevelInfo(internalFormat, texImageFormat.internalFormat));
}
void TextureGL::reserveTexImageToBeFilled(GLenum target,
@@ -250,7 +262,7 @@ void TextureGL::reserveTexImageToBeFilled(GLenum target,
setImageHelper(target, level, internalFormat, size, format, type, nullptr);
}
-gl::Error TextureGL::setSubImage(ContextImpl *contextImpl,
+gl::Error TextureGL::setSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -264,14 +276,15 @@ gl::Error TextureGL::setSubImage(ContextImpl *contextImpl,
nativegl::TexSubImageFormat texSubImageFormat =
nativegl::GetTexSubImageFormat(mFunctions, mWorkarounds, format, type);
- ASSERT(mLevelInfo[level].lumaWorkaround.enabled ==
+ ASSERT(getLevelInfo(target, level).lumaWorkaround.enabled ==
GetLevelInfo(format, texSubImageFormat.format).lumaWorkaround.enabled);
mStateManager->bindTexture(getTarget(), mTextureID);
if (mWorkarounds.unpackOverlappingRowsSeparatelyUnpackBuffer && unpack.pixelBuffer.get() &&
unpack.rowLength != 0 && unpack.rowLength < area.width)
{
- return setSubImageRowByRowWorkaround(target, level, area, format, type, unpack, pixels);
+ return setSubImageRowByRowWorkaround(context, target, level, area, format, type, unpack,
+ pixels);
}
if (mWorkarounds.unpackLastRowSeparatelyForPaddingInclusion)
@@ -287,7 +300,8 @@ gl::Error TextureGL::setSubImage(ContextImpl *contextImpl,
// by uploading the last row (and last level if 3D) separately.
if (apply)
{
- return setSubImagePaddingWorkaround(target, level, area, format, type, unpack, pixels);
+ return setSubImagePaddingWorkaround(context, target, level, area, format, type, unpack,
+ pixels);
}
}
@@ -309,7 +323,8 @@ gl::Error TextureGL::setSubImage(ContextImpl *contextImpl,
return gl::NoError();
}
-gl::Error TextureGL::setSubImageRowByRowWorkaround(GLenum target,
+gl::Error TextureGL::setSubImageRowByRowWorkaround(const gl::Context *context,
+ GLenum target,
size_t level,
const gl::Box &area,
GLenum format,
@@ -318,10 +333,10 @@ gl::Error TextureGL::setSubImageRowByRowWorkaround(GLenum target,
const uint8_t *pixels)
{
gl::PixelUnpackState directUnpack;
- directUnpack.pixelBuffer = unpack.pixelBuffer;
+ directUnpack.pixelBuffer.set(context, unpack.pixelBuffer.get());
directUnpack.alignment = 1;
mStateManager->setPixelUnpackState(directUnpack);
- directUnpack.pixelBuffer.set(nullptr);
+ directUnpack.pixelBuffer.set(context, nullptr);
const gl::InternalFormat &glFormat = gl::GetInternalFormatInfo(format, type);
GLuint rowBytes = 0;
@@ -365,7 +380,8 @@ gl::Error TextureGL::setSubImageRowByRowWorkaround(GLenum target,
return gl::NoError();
}
-gl::Error TextureGL::setSubImagePaddingWorkaround(GLenum target,
+gl::Error TextureGL::setSubImagePaddingWorkaround(const gl::Context *context,
+ GLenum target,
size_t level,
const gl::Box &area,
GLenum format,
@@ -388,7 +404,7 @@ gl::Error TextureGL::setSubImagePaddingWorkaround(GLenum target,
mStateManager->setPixelUnpackState(unpack);
gl::PixelUnpackState directUnpack;
- directUnpack.pixelBuffer = unpack.pixelBuffer;
+ directUnpack.pixelBuffer.set(context, unpack.pixelBuffer.get());
directUnpack.alignment = 1;
if (useTexImage3D)
@@ -444,12 +460,12 @@ gl::Error TextureGL::setSubImagePaddingWorkaround(GLenum target,
lastRowPixels);
}
- directUnpack.pixelBuffer.set(nullptr);
+ directUnpack.pixelBuffer.set(context, nullptr);
return gl::NoError();
}
-gl::Error TextureGL::setCompressedImage(ContextImpl *contextImpl,
+gl::Error TextureGL::setCompressedImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -482,13 +498,14 @@ gl::Error TextureGL::setCompressedImage(ContextImpl *contextImpl,
UNREACHABLE();
}
- setLevelInfo(level, 1, GetLevelInfo(internalFormat, compressedTexImageFormat.internalFormat));
- ASSERT(!mLevelInfo[level].lumaWorkaround.enabled);
+ LevelInfoGL levelInfo = GetLevelInfo(internalFormat, compressedTexImageFormat.internalFormat);
+ ASSERT(!levelInfo.lumaWorkaround.enabled);
+ setLevelInfo(target, level, 1, levelInfo);
return gl::NoError();
}
-gl::Error TextureGL::setCompressedSubImage(ContextImpl *contextImpl,
+gl::Error TextureGL::setCompressedSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -522,76 +539,132 @@ gl::Error TextureGL::setCompressedSubImage(ContextImpl *contextImpl,
UNREACHABLE();
}
- ASSERT(!mLevelInfo[level].lumaWorkaround.enabled &&
+ ASSERT(!getLevelInfo(target, level).lumaWorkaround.enabled &&
!GetLevelInfo(format, compressedTexSubImageFormat.format).lumaWorkaround.enabled);
return gl::NoError();
}
-gl::Error TextureGL::copyImage(ContextImpl *contextImpl,
+gl::Error TextureGL::copyImage(const gl::Context *context,
GLenum target,
size_t level,
- const gl::Rectangle &sourceArea,
+ const gl::Rectangle &origSourceArea,
GLenum internalFormat,
const gl::Framebuffer *source)
{
- nativegl::CopyTexImageImageFormat copyTexImageFormat = nativegl::GetCopyTexImageImageFormat(
- mFunctions, mWorkarounds, internalFormat, source->getImplementationColorReadType());
+ GLenum type = source->getImplementationColorReadType(context);
+ nativegl::CopyTexImageImageFormat copyTexImageFormat =
+ nativegl::GetCopyTexImageImageFormat(mFunctions, mWorkarounds, internalFormat, type);
- LevelInfoGL levelInfo = GetLevelInfo(internalFormat, copyTexImageFormat.internalFormat);
- if (levelInfo.lumaWorkaround.enabled)
+ mStateManager->bindTexture(getTarget(), mTextureID);
+
+ const FramebufferGL *sourceFramebufferGL = GetImplAs<FramebufferGL>(source);
+ gl::Extents fbSize = sourceFramebufferGL->getState().getReadAttachment()->getSize();
+
+ // Did the read area go outside 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 the area outside the framebuffer must be zeroed.
+ // We just zero the whole thing before copying into the area that overlaps the framebuffer.
+ if (outside && context->getExtensions().webglCompatibility)
{
- gl::Error error = mBlitter->copyImageToLUMAWorkaroundTexture(
- mTextureID, getTarget(), target, levelInfo.sourceFormat, level, sourceArea,
- copyTexImageFormat.internalFormat, source);
- if (error.isError())
- {
- return error;
- }
+ // TODO(fjhenigman): When robust resource initialization is implemented, avoid redundant
+ // clearing of the texture.
+ GLuint pixelBytes =
+ gl::GetInternalFormatInfo(copyTexImageFormat.internalFormat, type).pixelBytes;
+ angle::MemoryBuffer *zero;
+ ANGLE_TRY(context->getZeroFilledBuffer(
+ origSourceArea.width * origSourceArea.height * pixelBytes, &zero));
+ mStateManager->setPixelUnpackState(gl::PixelUnpackState(1, 0));
+ mFunctions->texImage2D(target, static_cast<GLint>(level), copyTexImageFormat.internalFormat,
+ origSourceArea.width, origSourceArea.height, 0,
+ gl::GetUnsizedFormat(copyTexImageFormat.internalFormat), type,
+ zero->data());
}
- else
- {
- const FramebufferGL *sourceFramebufferGL = GetImplAs<FramebufferGL>(source);
- mStateManager->bindTexture(getTarget(), mTextureID);
- mStateManager->bindFramebuffer(GL_READ_FRAMEBUFFER,
- sourceFramebufferGL->getFramebufferID());
+ // Clip source area to framebuffer and copy if remaining area is not empty.
+ gl::Rectangle sourceArea;
+ if (ClipRectangle(origSourceArea, gl::Rectangle(0, 0, fbSize.width, fbSize.height),
+ &sourceArea))
+ {
+ LevelInfoGL levelInfo = GetLevelInfo(internalFormat, copyTexImageFormat.internalFormat);
+ gl::Offset destOffset(sourceArea.x - origSourceArea.x, sourceArea.y - origSourceArea.y, 0);
- if (UseTexImage2D(getTarget()))
+ if (levelInfo.lumaWorkaround.enabled)
{
- mFunctions->copyTexImage2D(target, static_cast<GLint>(level),
- copyTexImageFormat.internalFormat, sourceArea.x,
- sourceArea.y, sourceArea.width, sourceArea.height, 0);
+ if (outside)
+ {
+ ANGLE_TRY(mBlitter->copySubImageToLUMAWorkaroundTexture(
+ context, mTextureID, getTarget(), target, levelInfo.sourceFormat, level,
+ destOffset, sourceArea, source));
+ }
+ else
+ {
+ ANGLE_TRY(mBlitter->copyImageToLUMAWorkaroundTexture(
+ context, mTextureID, getTarget(), target, levelInfo.sourceFormat, level,
+ sourceArea, copyTexImageFormat.internalFormat, source));
+ }
+ }
+ else if (UseTexImage2D(getTarget()))
+ {
+ mStateManager->bindFramebuffer(GL_READ_FRAMEBUFFER,
+ sourceFramebufferGL->getFramebufferID());
+ if (outside)
+ {
+ mFunctions->copyTexSubImage2D(target, static_cast<GLint>(level), destOffset.x,
+ destOffset.y, sourceArea.x, sourceArea.y,
+ sourceArea.width, sourceArea.height);
+ }
+ else
+ {
+ mFunctions->copyTexImage2D(target, static_cast<GLint>(level),
+ copyTexImageFormat.internalFormat, sourceArea.x,
+ sourceArea.y, sourceArea.width, sourceArea.height, 0);
+ }
}
else
{
UNREACHABLE();
}
- }
- setLevelInfo(level, 1, levelInfo);
+ setLevelInfo(target, level, 1, levelInfo);
+ }
return gl::NoError();
}
-gl::Error TextureGL::copySubImage(ContextImpl *contextImpl,
+gl::Error TextureGL::copySubImage(const gl::Context *context,
GLenum target,
size_t level,
- const gl::Offset &destOffset,
- const gl::Rectangle &sourceArea,
+ const gl::Offset &origDestOffset,
+ const gl::Rectangle &origSourceArea,
const gl::Framebuffer *source)
{
const FramebufferGL *sourceFramebufferGL = GetImplAs<FramebufferGL>(source);
+ // Clip source area to framebuffer.
+ const gl::Extents fbSize = sourceFramebufferGL->getState().getReadAttachment()->getSize();
+ gl::Rectangle sourceArea;
+ if (!ClipRectangle(origSourceArea, gl::Rectangle(0, 0, fbSize.width, fbSize.height),
+ &sourceArea))
+ {
+ // nothing to do
+ return gl::NoError();
+ }
+ gl::Offset destOffset(origDestOffset.x + sourceArea.x - origSourceArea.x,
+ origDestOffset.y + sourceArea.y - origSourceArea.y, origDestOffset.z);
+
mStateManager->bindTexture(getTarget(), mTextureID);
mStateManager->bindFramebuffer(GL_READ_FRAMEBUFFER, sourceFramebufferGL->getFramebufferID());
- const LevelInfoGL &levelInfo = mLevelInfo[level];
+ const LevelInfoGL &levelInfo = getLevelInfo(target, level);
if (levelInfo.lumaWorkaround.enabled)
{
gl::Error error = mBlitter->copySubImageToLUMAWorkaroundTexture(
- mTextureID, getTarget(), target, levelInfo.sourceFormat, level, destOffset, sourceArea,
- source);
+ context, mTextureID, getTarget(), target, levelInfo.sourceFormat, level, destOffset,
+ sourceArea, source);
if (error.isError())
{
return error;
@@ -621,7 +694,7 @@ gl::Error TextureGL::copySubImage(ContextImpl *contextImpl,
return gl::NoError();
}
-gl::Error TextureGL::copyTexture(ContextImpl *contextImpl,
+gl::Error TextureGL::copyTexture(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -633,19 +706,19 @@ gl::Error TextureGL::copyTexture(ContextImpl *contextImpl,
const gl::Texture *source)
{
const TextureGL *sourceGL = GetImplAs<TextureGL>(source);
- const gl::ImageDesc &sourceImageDesc = sourceGL->mState.getImageDesc(source->getTarget(), 0);
+ const gl::ImageDesc &sourceImageDesc =
+ sourceGL->mState.getImageDesc(source->getTarget(), sourceLevel);
gl::Rectangle sourceArea(0, 0, sourceImageDesc.size.width, sourceImageDesc.size.height);
- const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat, type);
- reserveTexImageToBeFilled(getTarget(), 0, internalFormatInfo.sizedInternalFormat,
- sourceImageDesc.size, internalFormatInfo.format, type);
+ reserveTexImageToBeFilled(target, level, internalFormat, sourceImageDesc.size,
+ gl::GetUnsizedFormat(internalFormat), type);
- return copySubTextureHelper(target, level, gl::Offset(0, 0, 0), sourceLevel, sourceArea,
- internalFormat, unpackFlipY, unpackPremultiplyAlpha,
+ return copySubTextureHelper(context, target, level, gl::Offset(0, 0, 0), sourceLevel,
+ sourceArea, internalFormat, unpackFlipY, unpackPremultiplyAlpha,
unpackUnmultiplyAlpha, source);
}
-gl::Error TextureGL::copySubTexture(ContextImpl *contextImpl,
+gl::Error TextureGL::copySubTexture(const gl::Context *context,
GLenum target,
size_t level,
const gl::Offset &destOffset,
@@ -656,12 +729,14 @@ gl::Error TextureGL::copySubTexture(ContextImpl *contextImpl,
bool unpackUnmultiplyAlpha,
const gl::Texture *source)
{
- GLenum destFormat = mState.getImageDesc(mState.mTarget, 0).format.info->format;
- return copySubTextureHelper(target, level, destOffset, sourceLevel, sourceArea, destFormat,
- unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha, source);
+ GLenum destFormat = mState.getImageDesc(target, level).format.info->format;
+ return copySubTextureHelper(context, target, level, destOffset, sourceLevel, sourceArea,
+ destFormat, unpackFlipY, unpackPremultiplyAlpha,
+ unpackUnmultiplyAlpha, source);
}
-gl::Error TextureGL::copySubTextureHelper(GLenum target,
+gl::Error TextureGL::copySubTextureHelper(const gl::Context *context,
+ GLenum target,
size_t level,
const gl::Offset &destOffset,
size_t sourceLevel,
@@ -673,10 +748,13 @@ gl::Error TextureGL::copySubTextureHelper(GLenum target,
const gl::Texture *source)
{
TextureGL *sourceGL = GetImplAs<TextureGL>(source);
- const gl::ImageDesc &sourceImageDesc = sourceGL->mState.getImageDesc(source->getTarget(), 0);
+ const gl::ImageDesc &sourceImageDesc =
+ sourceGL->mState.getImageDesc(source->getTarget(), sourceLevel);
// Check is this is a simple copySubTexture that can be done with a copyTexSubImage
- bool needsLumaWorkaround = sourceGL->mLevelInfo[0].lumaWorkaround.enabled;
+ ASSERT(sourceGL->getTarget() == GL_TEXTURE_2D);
+ const LevelInfoGL &sourceLevelInfo = sourceGL->getLevelInfo(source->getTarget(), sourceLevel);
+ bool needsLumaWorkaround = sourceLevelInfo.lumaWorkaround.enabled;
GLenum sourceFormat = sourceImageDesc.format.info->format;
bool sourceFormatContainSupersetOfDestFormat =
@@ -692,13 +770,13 @@ gl::Error TextureGL::copySubTextureHelper(GLenum target,
}
// We can't use copyTexSubImage, do a manual copy
- return mBlitter->copySubTexture(
- sourceGL, sourceLevel, this, target, level, sourceImageDesc.size, sourceArea, destOffset,
- needsLumaWorkaround, sourceGL->mLevelInfo[sourceLevel].sourceFormat, unpackFlipY,
- unpackPremultiplyAlpha, unpackUnmultiplyAlpha);
+ return mBlitter->copySubTexture(context, sourceGL, sourceLevel, this, target, level,
+ sourceImageDesc.size, sourceArea, destOffset,
+ needsLumaWorkaround, sourceLevelInfo.sourceFormat, unpackFlipY,
+ unpackPremultiplyAlpha, unpackUnmultiplyAlpha);
}
-gl::Error TextureGL::setStorage(ContextImpl *contextImpl,
+gl::Error TextureGL::setStorage(const gl::Context *context,
GLenum target,
size_t levels,
GLenum internalFormat,
@@ -859,12 +937,12 @@ gl::Error TextureGL::setStorage(ContextImpl *contextImpl,
UNREACHABLE();
}
- setLevelInfo(0, levels, GetLevelInfo(internalFormat, texStorageFormat.internalFormat));
+ setLevelInfo(target, 0, levels, GetLevelInfo(internalFormat, texStorageFormat.internalFormat));
return gl::NoError();
}
-gl::Error TextureGL::setStorageMultisample(ContextImpl *contextImpl,
+gl::Error TextureGL::setStorageMultisample(const gl::Context *context,
GLenum target,
GLsizei samples,
GLint internalFormat,
@@ -881,20 +959,21 @@ gl::Error TextureGL::setStorageMultisample(ContextImpl *contextImpl,
mFunctions->texStorage2DMultisample(target, samples, texStorageFormat.internalFormat,
size.width, size.height, fixedSampleLocations);
- setLevelInfo(0, 1, GetLevelInfo(internalFormat, texStorageFormat.internalFormat));
+ setLevelInfo(target, 0, 1, GetLevelInfo(internalFormat, texStorageFormat.internalFormat));
return gl::NoError();
}
-gl::Error TextureGL::setImageExternal(GLenum target,
+gl::Error TextureGL::setImageExternal(const gl::Context *context,
+ GLenum target,
egl::Stream *stream,
const egl::Stream::GLTextureDescription &desc)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureGL::generateMipmap(ContextImpl *contextImpl)
+gl::Error TextureGL::generateMipmap(const gl::Context *context)
{
mStateManager->bindTexture(getTarget(), mTextureID);
mFunctions->generateMipmap(getTarget());
@@ -902,24 +981,24 @@ gl::Error TextureGL::generateMipmap(ContextImpl *contextImpl)
const GLuint effectiveBaseLevel = mState.getEffectiveBaseLevel();
const GLuint maxLevel = mState.getMipmapMaxLevel();
- ASSERT(maxLevel < mLevelInfo.size());
-
- setLevelInfo(effectiveBaseLevel, maxLevel - effectiveBaseLevel, mLevelInfo[effectiveBaseLevel]);
+ setLevelInfo(getTarget(), effectiveBaseLevel, maxLevel - effectiveBaseLevel,
+ getBaseLevelInfo());
return gl::NoError();
}
-void TextureGL::bindTexImage(egl::Surface *surface)
+gl::Error TextureGL::bindTexImage(const gl::Context *context, egl::Surface *surface)
{
ASSERT(getTarget() == GL_TEXTURE_2D);
// Make sure this texture is bound
mStateManager->bindTexture(getTarget(), mTextureID);
- setLevelInfo(0, 1, LevelInfoGL());
+ setLevelInfo(getTarget(), 0, 1, LevelInfoGL());
+ return gl::NoError();
}
-void TextureGL::releaseTexImage()
+gl::Error TextureGL::releaseTexImage(const gl::Context *context)
{
// Not all Surface implementations reset the size of mip 0 when releasing, do it manually
ASSERT(getTarget() == GL_TEXTURE_2D);
@@ -934,12 +1013,13 @@ void TextureGL::releaseTexImage()
{
UNREACHABLE();
}
+ return gl::NoError();
}
-gl::Error TextureGL::setEGLImageTarget(GLenum target, egl::Image *image)
+gl::Error TextureGL::setEGLImageTarget(const gl::Context *context, GLenum target, egl::Image *image)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
void TextureGL::syncState(const gl::Texture::DirtyBits &dirtyBits)
@@ -1058,7 +1138,7 @@ bool TextureGL::hasAnyDirtyBit() const
return mLocalDirtyBits.any();
}
-void TextureGL::setBaseLevel(GLuint baseLevel)
+gl::Error TextureGL::setBaseLevel(const gl::Context *context, GLuint baseLevel)
{
if (baseLevel != mAppliedBaseLevel)
{
@@ -1068,6 +1148,7 @@ void TextureGL::setBaseLevel(GLuint baseLevel)
mStateManager->bindTexture(getTarget(), mTextureID);
mFunctions->texParameteri(getTarget(), GL_TEXTURE_BASE_LEVEL, baseLevel);
}
+ return gl::NoError();
}
void TextureGL::setMinFilter(GLenum filter)
@@ -1116,7 +1197,7 @@ void TextureGL::syncTextureStateSwizzle(const FunctionsGL *functions,
GLenum value,
GLenum *outValue)
{
- const LevelInfoGL &levelInfo = mLevelInfo[mState.getEffectiveBaseLevel()];
+ const LevelInfoGL &levelInfo = getBaseLevelInfo();
GLenum resultSwizzle = value;
if (levelInfo.lumaWorkaround.enabled || levelInfo.depthStencilWorkaround)
{
@@ -1226,9 +1307,12 @@ void TextureGL::syncTextureStateSwizzle(const FunctionsGL *functions,
functions->texParameteri(getTarget(), name, resultSwizzle);
}
-void TextureGL::setLevelInfo(size_t level, size_t levelCount, const LevelInfoGL &levelInfo)
+void TextureGL::setLevelInfo(GLenum target,
+ size_t level,
+ size_t levelCount,
+ const LevelInfoGL &levelInfo)
{
- ASSERT(levelCount > 0 && level + levelCount < mLevelInfo.size());
+ ASSERT(levelCount > 0);
GLuint baseLevel = mState.getEffectiveBaseLevel();
bool needsResync = level <= baseLevel && level + levelCount >= baseLevel &&
@@ -1240,10 +1324,39 @@ void TextureGL::setLevelInfo(size_t level, size_t levelCount, const LevelInfoGL
for (size_t i = level; i < level + levelCount; i++)
{
- mLevelInfo[i] = levelInfo;
+ if (target == GL_TEXTURE_CUBE_MAP)
+ {
+ for (GLenum face = gl::FirstCubeMapTextureTarget; face <= gl::LastCubeMapTextureTarget;
+ face++)
+ {
+ size_t index = GetLevelInfoIndex(face, level);
+ ASSERT(index < mLevelInfo.size());
+ mLevelInfo[index] = levelInfo;
+ }
+ }
+ else
+ {
+ size_t index = GetLevelInfoIndex(target, level);
+ ASSERT(index < mLevelInfo.size());
+ mLevelInfo[index] = levelInfo;
+ }
}
}
+const LevelInfoGL &TextureGL::getLevelInfo(GLenum target, size_t level) const
+{
+ ASSERT(target != GL_TEXTURE_CUBE_MAP);
+ return mLevelInfo[GetLevelInfoIndex(target, level)];
+}
+
+const LevelInfoGL &TextureGL::getBaseLevelInfo() const
+{
+ GLint effectiveBaseLevel = mState.getEffectiveBaseLevel();
+ GLenum target =
+ getTarget() == GL_TEXTURE_CUBE_MAP ? gl::FirstCubeMapTextureTarget : getTarget();
+ return getLevelInfo(target, effectiveBaseLevel);
+}
+
GLuint TextureGL::getTextureID() const
{
return mTextureID;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.h
index e302f935029..c3f3fdcc92c 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.h
@@ -59,7 +59,7 @@ class TextureGL : public TextureImpl
BlitGL *blitter);
~TextureGL() override;
- gl::Error setImage(ContextImpl *contextImpl,
+ gl::Error setImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -68,7 +68,7 @@ class TextureGL : public TextureImpl
GLenum type,
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) override;
- gl::Error setSubImage(ContextImpl *contextImpl,
+ gl::Error setSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -77,7 +77,7 @@ class TextureGL : public TextureImpl
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) override;
- gl::Error setCompressedImage(ContextImpl *contextImpl,
+ gl::Error setCompressedImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -85,7 +85,7 @@ class TextureGL : public TextureImpl
const gl::PixelUnpackState &unpack,
size_t imageSize,
const uint8_t *pixels) override;
- gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+ gl::Error setCompressedSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -94,20 +94,20 @@ class TextureGL : public TextureImpl
size_t imageSize,
const uint8_t *pixels) override;
- gl::Error copyImage(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl,
+ gl::Error copyTexture(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -117,7 +117,7 @@ class TextureGL : public TextureImpl
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha,
const gl::Texture *source) override;
- gl::Error copySubTexture(ContextImpl *contextImpl,
+ gl::Error copySubTexture(const gl::Context *context,
GLenum target,
size_t level,
const gl::Offset &destOffset,
@@ -127,7 +127,8 @@ class TextureGL : public TextureImpl
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha,
const gl::Texture *source) override;
- gl::Error copySubTextureHelper(GLenum target,
+ gl::Error copySubTextureHelper(const gl::Context *context,
+ GLenum target,
size_t level,
const gl::Offset &destOffset,
size_t sourceLevel,
@@ -138,29 +139,32 @@ class TextureGL : public TextureImpl
bool unpackUnmultiplyAlpha,
const gl::Texture *source);
- gl::Error setStorage(ContextImpl *contextImpl,
+ gl::Error setStorage(const gl::Context *context,
GLenum target,
size_t levels,
GLenum internalFormat,
const gl::Extents &size) override;
- gl::Error setStorageMultisample(ContextImpl *contextImpl,
+ gl::Error setStorageMultisample(const gl::Context *context,
GLenum target,
GLsizei samples,
GLint internalFormat,
const gl::Extents &size,
GLboolean fixedSampleLocations) override;
- gl::Error setImageExternal(GLenum target,
+ gl::Error setImageExternal(const gl::Context *context,
+ GLenum target,
egl::Stream *stream,
const egl::Stream::GLTextureDescription &desc) override;
- gl::Error generateMipmap(ContextImpl *contextImpl) override;
+ gl::Error generateMipmap(const gl::Context *context) override;
- void bindTexImage(egl::Surface *surface) override;
- void releaseTexImage() override;
+ gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
+ gl::Error releaseTexImage(const gl::Context *context) override;
- gl::Error setEGLImageTarget(GLenum target, egl::Image *image) override;
+ gl::Error setEGLImageTarget(const gl::Context *context,
+ GLenum target,
+ egl::Image *image) override;
GLuint getTextureID() const;
GLenum getTarget() const;
@@ -168,7 +172,7 @@ class TextureGL : public TextureImpl
void syncState(const gl::Texture::DirtyBits &dirtyBits) override;
bool hasAnyDirtyBit() const;
- void setBaseLevel(GLuint baseLevel) override;
+ gl::Error setBaseLevel(const gl::Context *context, GLuint baseLevel) override;
void setMinFilter(GLenum filter);
void setMagFilter(GLenum filter);
@@ -190,7 +194,8 @@ class TextureGL : public TextureImpl
const gl::Extents &size,
GLenum format,
GLenum type);
- gl::Error setSubImageRowByRowWorkaround(GLenum target,
+ gl::Error setSubImageRowByRowWorkaround(const gl::Context *context,
+ GLenum target,
size_t level,
const gl::Box &area,
GLenum format,
@@ -198,7 +203,8 @@ class TextureGL : public TextureImpl
const gl::PixelUnpackState &unpack,
const uint8_t *pixels);
- gl::Error setSubImagePaddingWorkaround(GLenum target,
+ gl::Error setSubImagePaddingWorkaround(const gl::Context *context,
+ GLenum target,
size_t level,
const gl::Box &area,
GLenum format,
@@ -211,7 +217,9 @@ class TextureGL : public TextureImpl
GLenum value,
GLenum *outValue);
- void setLevelInfo(size_t level, size_t levelCount, const LevelInfoGL &levelInfo);
+ void setLevelInfo(GLenum target, size_t level, size_t levelCount, const LevelInfoGL &levelInfo);
+ const LevelInfoGL &getLevelInfo(GLenum target, size_t level) const;
+ const LevelInfoGL &getBaseLevelInfo() const;
const FunctionsGL *mFunctions;
const WorkaroundsGL &mWorkarounds;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp
index ae75a0f47dc..33354f882eb 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp
@@ -56,11 +56,12 @@ void TransformFeedbackGL::resume()
// Do not resume directly, StateManagerGL will handle beginning and resuming transform feedback.
}
-void TransformFeedbackGL::bindGenericBuffer(const BindingPointer<gl::Buffer> &binding)
+void TransformFeedbackGL::bindGenericBuffer(const gl::BindingPointer<gl::Buffer> &binding)
{
}
-void TransformFeedbackGL::bindIndexedBuffer(size_t index, const OffsetBindingPointer<gl::Buffer> &binding)
+void TransformFeedbackGL::bindIndexedBuffer(size_t index,
+ const gl::OffsetBindingPointer<gl::Buffer> &binding)
{
// Directly bind buffer (not through the StateManager methods) because the buffer bindings are
// tracked per transform feedback object
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.h
index f84edc0b741..1a6375d42e3 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.h
@@ -30,8 +30,9 @@ class TransformFeedbackGL : public TransformFeedbackImpl
void pause() override;
void resume() override;
- void bindGenericBuffer(const BindingPointer<gl::Buffer> &binding) override;
- void bindIndexedBuffer(size_t index, const OffsetBindingPointer<gl::Buffer> &binding) override;
+ void bindGenericBuffer(const gl::BindingPointer<gl::Buffer> &binding) override;
+ void bindIndexedBuffer(size_t index,
+ const gl::OffsetBindingPointer<gl::Buffer> &binding) override;
GLuint getTransformFeedbackID() const;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.cpp
index e5581e3ebe1..b22a215e46c 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.cpp
@@ -29,7 +29,7 @@ namespace
// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
bool AttributeNeedsStreaming(const VertexAttribute &attrib, const VertexBinding &binding)
{
- return (attrib.enabled && binding.buffer.get() == nullptr);
+ return (attrib.enabled && binding.getBuffer().get() == nullptr);
}
bool SameVertexAttribFormat(const VertexAttribute &a, const VertexAttribute &b)
@@ -40,7 +40,8 @@ bool SameVertexAttribFormat(const VertexAttribute &a, const VertexAttribute &b)
bool SameVertexBuffer(const VertexBinding &a, const VertexBinding &b)
{
- return a.stride == b.stride && a.offset == b.offset && a.buffer.get() == b.buffer.get();
+ return a.getStride() == b.getStride() && a.getOffset() == b.getOffset() &&
+ a.getBuffer().get() == b.getBuffer().get();
}
bool IsVertexAttribPointerSupported(size_t attribIndex, const VertexAttribute &attrib)
@@ -75,7 +76,7 @@ VertexArrayGL::VertexArrayGL(const VertexArrayState &state,
}
}
-VertexArrayGL::~VertexArrayGL()
+void VertexArrayGL::destroy(const gl::Context *context)
{
mStateManager->deleteVertexArray(mVertexArrayID);
mVertexArrayID = 0;
@@ -88,23 +89,25 @@ VertexArrayGL::~VertexArrayGL()
mStreamingArrayBufferSize = 0;
mStreamingArrayBuffer = 0;
- mAppliedElementArrayBuffer.set(nullptr);
+ mAppliedElementArrayBuffer.set(context, nullptr);
for (auto &binding : mAppliedBindings)
{
- binding.buffer.set(nullptr);
+ binding.setBuffer(context, nullptr);
}
}
-gl::Error VertexArrayGL::syncDrawArraysState(const gl::AttributesMask &activeAttributesMask,
+gl::Error VertexArrayGL::syncDrawArraysState(const gl::Context *context,
+ const gl::AttributesMask &activeAttributesMask,
GLint first,
GLsizei count,
GLsizei instanceCount) const
{
- return syncDrawState(activeAttributesMask, first, count, GL_NONE, nullptr, instanceCount, false,
- nullptr);
+ return syncDrawState(context, activeAttributesMask, first, count, GL_NONE, nullptr,
+ instanceCount, false, nullptr);
}
-gl::Error VertexArrayGL::syncDrawElementsState(const gl::AttributesMask &activeAttributesMask,
+gl::Error VertexArrayGL::syncDrawElementsState(const gl::Context *context,
+ const gl::AttributesMask &activeAttributesMask,
GLsizei count,
GLenum type,
const void *indices,
@@ -112,11 +115,11 @@ gl::Error VertexArrayGL::syncDrawElementsState(const gl::AttributesMask &activeA
bool primitiveRestartEnabled,
const void **outIndices) const
{
- return syncDrawState(activeAttributesMask, 0, count, type, indices, instanceCount,
+ return syncDrawState(context, activeAttributesMask, 0, count, type, indices, instanceCount,
primitiveRestartEnabled, outIndices);
}
-gl::Error VertexArrayGL::syncElementArrayState() const
+gl::Error VertexArrayGL::syncElementArrayState(const gl::Context *context) const
{
gl::Buffer *elementArrayBuffer = mData.getElementArrayBuffer().get();
ASSERT(elementArrayBuffer);
@@ -124,13 +127,14 @@ gl::Error VertexArrayGL::syncElementArrayState() const
{
const BufferGL *bufferGL = GetImplAs<BufferGL>(elementArrayBuffer);
mStateManager->bindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferGL->getBufferID());
- mAppliedElementArrayBuffer.set(elementArrayBuffer);
+ mAppliedElementArrayBuffer.set(context, elementArrayBuffer);
}
return gl::NoError();
}
-gl::Error VertexArrayGL::syncDrawState(const gl::AttributesMask &activeAttributesMask,
+gl::Error VertexArrayGL::syncDrawState(const gl::Context *context,
+ const gl::AttributesMask &activeAttributesMask,
GLint first,
GLsizei count,
GLenum type,
@@ -150,12 +154,8 @@ gl::Error VertexArrayGL::syncDrawState(const gl::AttributesMask &activeAttribute
IndexRange indexRange;
if (type != GL_NONE)
{
- Error error = syncIndexData(count, type, indices, primitiveRestartEnabled,
- attributesNeedStreaming, &indexRange, outIndices);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(syncIndexData(context, count, type, indices, primitiveRestartEnabled,
+ attributesNeedStreaming, &indexRange, outIndices));
}
else
{
@@ -166,17 +166,14 @@ gl::Error VertexArrayGL::syncDrawState(const gl::AttributesMask &activeAttribute
if (attributesNeedStreaming)
{
- Error error = streamAttributes(activeAttributesMask, instanceCount, indexRange);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(streamAttributes(activeAttributesMask, instanceCount, indexRange));
}
- return NoError();
+ return gl::NoError();
}
-gl::Error VertexArrayGL::syncIndexData(GLsizei count,
+gl::Error VertexArrayGL::syncIndexData(const gl::Context *context,
+ GLsizei count,
GLenum type,
const void *indices,
bool primitiveRestartEnabled,
@@ -195,7 +192,7 @@ gl::Error VertexArrayGL::syncIndexData(GLsizei count,
{
const BufferGL *bufferGL = GetImplAs<BufferGL>(elementArrayBuffer);
mStateManager->bindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferGL->getBufferID());
- mAppliedElementArrayBuffer.set(elementArrayBuffer);
+ mAppliedElementArrayBuffer.set(context, elementArrayBuffer);
}
// Only compute the index range if the attributes also need to be streamed
@@ -233,7 +230,7 @@ gl::Error VertexArrayGL::syncIndexData(GLsizei count,
}
mStateManager->bindBuffer(GL_ELEMENT_ARRAY_BUFFER, mStreamingElementArrayBuffer);
- mAppliedElementArrayBuffer.set(nullptr);
+ mAppliedElementArrayBuffer.set(context, nullptr);
// Make sure the element array buffer is large enough
const Type &indexTypeInfo = GetTypeInfo(type);
@@ -257,7 +254,7 @@ gl::Error VertexArrayGL::syncIndexData(GLsizei count,
*outIndices = nullptr;
}
- return NoError();
+ return gl::NoError();
}
void VertexArrayGL::computeStreamingAttributeSizes(const gl::AttributesMask &activeAttributesMask,
@@ -345,6 +342,8 @@ gl::Error VertexArrayGL::streamAttributes(const gl::AttributesMask &activeAttrib
for (auto idx : attribsToStream)
{
const auto &attrib = attribs[idx];
+ ASSERT(IsVertexAttribPointerSupported(idx, attrib));
+
const auto &binding = bindings[attrib.bindingIndex];
ASSERT(AttributeNeedsStreaming(attrib, binding));
@@ -356,7 +355,7 @@ gl::Error VertexArrayGL::streamAttributes(const gl::AttributesMask &activeAttrib
// Vertices do not apply the 'start' offset when the divisor is non-zero even when doing
// a non-instanced draw call
- const size_t firstIndex = binding.divisor == 0 ? indexRange.start : 0;
+ const size_t firstIndex = binding.getDivisor() == 0 ? indexRange.start : 0;
// Attributes using client memory ignore the VERTEX_ATTRIB_BINDING state.
// https://www.opengl.org/registry/specs/ARB/vertex_attrib_binding.txt
@@ -396,10 +395,10 @@ gl::Error VertexArrayGL::streamAttributes(const gl::AttributesMask &activeAttrib
if (unmapResult != GL_TRUE)
{
- return Error(GL_OUT_OF_MEMORY, "Failed to unmap the client data streaming buffer.");
+ return gl::OutOfMemory() << "Failed to unmap the client data streaming buffer.";
}
- return NoError();
+ return gl::NoError();
}
GLuint VertexArrayGL::getVertexArrayID() const
@@ -446,37 +445,45 @@ void VertexArrayGL::updateAttribEnabled(size_t attribIndex)
mAppliedAttributes[attribIndex].enabled = enabled;
}
-void VertexArrayGL::updateAttribPointer(size_t attribIndex)
+void VertexArrayGL::updateAttribPointer(const gl::Context *context, size_t attribIndex)
{
const VertexAttribute &attrib = mData.getVertexAttribute(attribIndex);
- // TODO(jiawei.shao@intel.com): Vertex Attrib Binding
- ASSERT(IsVertexAttribPointerSupported(attribIndex, attrib));
+ // According to SPEC, VertexAttribPointer should update the binding indexed attribIndex instead
+ // of the binding indexed attrib.bindingIndex (unless attribIndex == attrib.bindingIndex).
+ const VertexBinding &binding = mData.getVertexBinding(attribIndex);
- const GLuint bindingIndex = attrib.bindingIndex;
- const VertexBinding &binding = mData.getVertexBinding(bindingIndex);
+ // Since mAttributesNeedStreaming[attribIndex] keeps the value set in the last draw, here we
+ // only need to update it when the buffer has been changed. e.g. When we set an attribute to be
+ // streamed in the last draw, and only change its format in this draw without calling
+ // updateNeedsStreaming, it will still be streamed because the flag is already on.
+ const auto &bindingBuffer = binding.getBuffer();
+ if (bindingBuffer != mAppliedBindings[attribIndex].getBuffer())
+ {
+ updateNeedsStreaming(attribIndex);
+ }
- // We do not need to compare attrib.pointer because when we use a different client memory
- // pointer, we don't need to update mAttributesNeedStreaming by binding.buffer and we won't
- // update attribPointer in this function.
- if (SameVertexAttribFormat(mAppliedAttributes[attribIndex], attrib) &&
- mAppliedAttributes[attribIndex].bindingIndex == bindingIndex &&
- SameVertexBuffer(mAppliedBindings[attribIndex], binding))
+ // Early return when the vertex attribute isn't using a buffer object:
+ // - If we need to stream, defer the attribPointer to the draw call.
+ // - Skip the attribute that is disabled and uses a client memory pointer.
+ // - Skip the attribute whose buffer is detached by BindVertexBuffer. Since it cannot have a
+ // client memory pointer either, it must be disabled and shouldn't affect the draw.
+ const Buffer *arrayBuffer = bindingBuffer.get();
+ if (arrayBuffer == nullptr)
{
+ // Mark the applied binding isn't using a buffer by setting its buffer to nullptr so that if
+ // it starts to use a buffer later, there is no chance that the caching will skip it.
+ mAppliedBindings[attribIndex].setBuffer(context, nullptr);
return;
}
- updateNeedsStreaming(attribIndex);
-
- // If we need to stream, defer the attribPointer to the draw call.
- // Skip the attribute that is disabled and uses a client memory pointer.
- const Buffer *arrayBuffer = binding.buffer.get();
- if (arrayBuffer == nullptr)
+ // We do not need to compare attrib.pointer because when we use a different client memory
+ // pointer, we don't need to update mAttributesNeedStreaming by binding.buffer and we won't
+ // update attribPointer in this function.
+ if ((SameVertexAttribFormat(mAppliedAttributes[attribIndex], attrib)) &&
+ (mAppliedAttributes[attribIndex].bindingIndex == attrib.bindingIndex) &&
+ (SameVertexBuffer(mAppliedBindings[attribIndex], binding)))
{
- // Mark the applied binding is using a client memory pointer by setting its buffer to
- // nullptr so that if it doesn't use a client memory pointer later, there is no chance that
- // the caching will skip it.
- mAppliedBindings[bindingIndex].buffer.set(nullptr);
return;
}
@@ -488,21 +495,24 @@ void VertexArrayGL::updateAttribPointer(size_t attribIndex)
const BufferGL *arrayBufferGL = GetImplAs<BufferGL>(arrayBuffer);
mStateManager->bindBuffer(GL_ARRAY_BUFFER, arrayBufferGL->getBufferID());
-
- callVertexAttribPointer(static_cast<GLuint>(attribIndex), attrib, binding.stride,
- binding.offset);
-
- mAppliedAttributes[attribIndex].size = attrib.size;
- mAppliedAttributes[attribIndex].type = attrib.type;
- mAppliedAttributes[attribIndex].normalized = attrib.normalized;
- mAppliedAttributes[attribIndex].pureInteger = attrib.pureInteger;
- mAppliedAttributes[attribIndex].relativeOffset = attrib.relativeOffset;
-
- mAppliedAttributes[attribIndex].bindingIndex = bindingIndex;
-
- mAppliedBindings[bindingIndex].stride = binding.stride;
- mAppliedBindings[bindingIndex].offset = binding.offset;
- mAppliedBindings[bindingIndex].buffer = binding.buffer;
+ callVertexAttribPointer(static_cast<GLuint>(attribIndex), attrib, binding.getStride(),
+ binding.getOffset());
+
+ mAppliedAttributes[attribIndex].size = attrib.size;
+ mAppliedAttributes[attribIndex].type = attrib.type;
+ mAppliedAttributes[attribIndex].normalized = attrib.normalized;
+ mAppliedAttributes[attribIndex].pureInteger = attrib.pureInteger;
+
+ // After VertexAttribPointer, attrib.relativeOffset is set to 0 and attrib.bindingIndex is set
+ // to attribIndex in driver. If attrib.relativeOffset != 0 or attrib.bindingIndex !=
+ // attribIndex, they should be set in updateAttribFormat and updateAttribBinding. The cache
+ // should be consistent with driver so that we won't miss anything.
+ mAppliedAttributes[attribIndex].relativeOffset = 0;
+ mAppliedAttributes[attribIndex].bindingIndex = static_cast<GLuint>(attribIndex);
+
+ mAppliedBindings[attribIndex].setStride(binding.getStride());
+ mAppliedBindings[attribIndex].setOffset(binding.getOffset());
+ mAppliedBindings[attribIndex].setBuffer(context, binding.getBuffer().get());
}
void VertexArrayGL::callVertexAttribPointer(GLuint attribIndex,
@@ -523,25 +533,104 @@ void VertexArrayGL::callVertexAttribPointer(GLuint attribIndex,
}
}
-void VertexArrayGL::updateAttribDivisor(size_t attribIndex)
+bool VertexArrayGL::supportVertexAttribBinding() const
+{
+ ASSERT(mFunctions);
+ return (mFunctions->vertexAttribBinding != nullptr);
+}
+
+void VertexArrayGL::updateAttribFormat(size_t attribIndex)
+{
+ ASSERT(supportVertexAttribBinding());
+
+ const VertexAttribute &attrib = mData.getVertexAttribute(attribIndex);
+ if (SameVertexAttribFormat(mAppliedAttributes[attribIndex], attrib))
+ {
+ return;
+ }
+
+ if (attrib.pureInteger)
+ {
+ ASSERT(!attrib.normalized);
+ mFunctions->vertexAttribIFormat(static_cast<GLuint>(attribIndex), attrib.size, attrib.type,
+ attrib.relativeOffset);
+ }
+ else
+ {
+ mFunctions->vertexAttribFormat(static_cast<GLuint>(attribIndex), attrib.size, attrib.type,
+ attrib.normalized, attrib.relativeOffset);
+ }
+
+ mAppliedAttributes[attribIndex].size = attrib.size;
+ mAppliedAttributes[attribIndex].type = attrib.type;
+ mAppliedAttributes[attribIndex].normalized = attrib.normalized;
+ mAppliedAttributes[attribIndex].pureInteger = attrib.pureInteger;
+ mAppliedAttributes[attribIndex].relativeOffset = attrib.relativeOffset;
+}
+
+void VertexArrayGL::updateAttribBinding(size_t attribIndex)
{
- const GLuint bindingIndex = mData.getVertexAttribute(attribIndex).bindingIndex;
- ASSERT(attribIndex == bindingIndex);
+ ASSERT(supportVertexAttribBinding());
- const GLuint divisor = mData.getVertexBinding(bindingIndex).divisor;
- if (mAppliedAttributes[attribIndex].bindingIndex == bindingIndex &&
- mAppliedBindings[bindingIndex].divisor == divisor)
+ GLuint bindingIndex = mData.getVertexAttribute(attribIndex).bindingIndex;
+ if (mAppliedAttributes[attribIndex].bindingIndex == bindingIndex)
{
return;
}
- mFunctions->vertexAttribDivisor(static_cast<GLuint>(attribIndex), divisor);
+ mFunctions->vertexAttribBinding(static_cast<GLuint>(attribIndex), bindingIndex);
mAppliedAttributes[attribIndex].bindingIndex = bindingIndex;
- mAppliedBindings[bindingIndex].divisor = divisor;
}
-void VertexArrayGL::syncState(ContextImpl *contextImpl, const VertexArray::DirtyBits &dirtyBits)
+void VertexArrayGL::updateBindingBuffer(const gl::Context *context, size_t bindingIndex)
+{
+ ASSERT(supportVertexAttribBinding());
+
+ const VertexBinding &binding = mData.getVertexBinding(bindingIndex);
+ if (SameVertexBuffer(mAppliedBindings[bindingIndex], binding))
+ {
+ return;
+ }
+
+ const Buffer *arrayBuffer = binding.getBuffer().get();
+ GLuint bufferId = 0;
+ if (arrayBuffer != nullptr)
+ {
+ bufferId = GetImplAs<BufferGL>(arrayBuffer)->getBufferID();
+ }
+
+ mFunctions->bindVertexBuffer(static_cast<GLuint>(bindingIndex), bufferId, binding.getOffset(),
+ binding.getStride());
+
+ mAppliedBindings[bindingIndex].setStride(binding.getStride());
+ mAppliedBindings[bindingIndex].setOffset(binding.getOffset());
+ mAppliedBindings[bindingIndex].setBuffer(context, binding.getBuffer().get());
+}
+
+void VertexArrayGL::updateBindingDivisor(size_t bindingIndex)
+{
+ GLuint newDivisor = mData.getVertexBinding(bindingIndex).getDivisor();
+ if (mAppliedBindings[bindingIndex].getDivisor() == newDivisor)
+ {
+ return;
+ }
+
+ if (supportVertexAttribBinding())
+ {
+ mFunctions->vertexBindingDivisor(static_cast<GLuint>(bindingIndex), newDivisor);
+ }
+ else
+ {
+ // We can only use VertexAttribDivisor on platforms that don't support Vertex Attrib
+ // Binding.
+ mFunctions->vertexAttribDivisor(static_cast<GLuint>(bindingIndex), newDivisor);
+ }
+
+ mAppliedBindings[bindingIndex].setDivisor(newDivisor);
+}
+
+void VertexArrayGL::syncState(const gl::Context *context, const VertexArray::DirtyBits &dirtyBits)
{
mStateManager->bindVertexArray(mVertexArrayID, getAppliedElementArrayBufferID());
@@ -553,7 +642,7 @@ void VertexArrayGL::syncState(ContextImpl *contextImpl, const VertexArray::Dirty
continue;
}
- size_t index = VertexArray::GetAttribIndex(dirtyBit);
+ size_t index = VertexArray::GetVertexIndexFromDirtyBit(dirtyBit);
if (dirtyBit >= VertexArray::DIRTY_BIT_ATTRIB_0_ENABLED &&
dirtyBit < VertexArray::DIRTY_BIT_ATTRIB_MAX_ENABLED)
{
@@ -562,18 +651,32 @@ void VertexArrayGL::syncState(ContextImpl *contextImpl, const VertexArray::Dirty
else if (dirtyBit >= VertexArray::DIRTY_BIT_ATTRIB_0_POINTER &&
dirtyBit < VertexArray::DIRTY_BIT_ATTRIB_MAX_POINTER)
{
- updateAttribPointer(index);
+ updateAttribPointer(context, index);
}
+
else if (dirtyBit >= VertexArray::DIRTY_BIT_ATTRIB_0_FORMAT &&
+ dirtyBit < VertexArray::DIRTY_BIT_ATTRIB_MAX_FORMAT)
+ {
+ ASSERT(supportVertexAttribBinding());
+ updateAttribFormat(index);
+ }
+ else if (dirtyBit >= VertexArray::DIRTY_BIT_ATTRIB_0_BINDING &&
+ dirtyBit < VertexArray::DIRTY_BIT_ATTRIB_MAX_BINDING)
+ {
+ ASSERT(supportVertexAttribBinding());
+ updateAttribBinding(index);
+ }
+ else if (dirtyBit >= VertexArray::DIRTY_BIT_BINDING_0_BUFFER &&
dirtyBit < VertexArray::DIRTY_BIT_BINDING_MAX_BUFFER)
{
- // TODO(jiawei.shao@intel.com): Vertex Attrib Bindings
- ASSERT(index == mData.getBindingIndexFromAttribIndex(index));
+ ASSERT(supportVertexAttribBinding());
+ updateBindingBuffer(context, index);
}
+
else if (dirtyBit >= VertexArray::DIRTY_BIT_BINDING_0_DIVISOR &&
dirtyBit < VertexArray::DIRTY_BIT_BINDING_MAX_DIVISOR)
{
- updateAttribDivisor(index);
+ updateBindingDivisor(index);
}
else
UNREACHABLE();
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.h
index 24b30234dbc..7445b2c4eb8 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.h
@@ -23,28 +23,32 @@ class VertexArrayGL : public VertexArrayImpl
VertexArrayGL(const gl::VertexArrayState &data,
const FunctionsGL *functions,
StateManagerGL *stateManager);
- ~VertexArrayGL() override;
+ void destroy(const gl::Context *context) override;
- gl::Error syncDrawArraysState(const gl::AttributesMask &activeAttributesMask,
+ gl::Error syncDrawArraysState(const gl::Context *context,
+ const gl::AttributesMask &activeAttributesMask,
GLint first,
GLsizei count,
GLsizei instanceCount) const;
- gl::Error syncDrawElementsState(const gl::AttributesMask &activeAttributesMask,
+ gl::Error syncDrawElementsState(const gl::Context *context,
+ const gl::AttributesMask &activeAttributesMask,
GLsizei count,
GLenum type,
const void *indices,
GLsizei instanceCount,
bool primitiveRestartEnabled,
const void **outIndices) const;
- gl::Error syncElementArrayState() const;
+ gl::Error syncElementArrayState(const gl::Context *context) const;
GLuint getVertexArrayID() const;
GLuint getAppliedElementArrayBufferID() const;
- void syncState(ContextImpl *contextImpl, const gl::VertexArray::DirtyBits &dirtyBits) override;
+ void syncState(const gl::Context *context,
+ const gl::VertexArray::DirtyBits &dirtyBits) override;
private:
- gl::Error syncDrawState(const gl::AttributesMask &activeAttributesMask,
+ gl::Error syncDrawState(const gl::Context *context,
+ const gl::AttributesMask &activeAttributesMask,
GLint first,
GLsizei count,
GLenum type,
@@ -54,7 +58,8 @@ class VertexArrayGL : public VertexArrayImpl
const void **outIndices) const;
// Apply index data, only sets outIndexRange if attributesNeedStreaming is true
- gl::Error syncIndexData(GLsizei count,
+ gl::Error syncIndexData(const gl::Context *context,
+ GLsizei count,
GLenum type,
const void *indices,
bool primitiveRestartEnabled,
@@ -77,8 +82,14 @@ class VertexArrayGL : public VertexArrayImpl
void updateNeedsStreaming(size_t attribIndex);
void updateAttribEnabled(size_t attribIndex);
- void updateAttribPointer(size_t attribIndex);
- void updateAttribDivisor(size_t attribIndex);
+ void updateAttribPointer(const gl::Context *context, size_t attribIndex);
+
+ bool supportVertexAttribBinding() const;
+
+ void updateAttribFormat(size_t attribIndex);
+ void updateAttribBinding(size_t attribIndex);
+ void updateBindingBuffer(const gl::Context *context, size_t bindingIndex);
+ void updateBindingDivisor(size_t bindingIndex);
void callVertexAttribPointer(GLuint attribIndex,
const gl::VertexAttribute &attrib,
@@ -90,7 +101,7 @@ class VertexArrayGL : public VertexArrayImpl
GLuint mVertexArrayID;
- mutable BindingPointer<gl::Buffer> mAppliedElementArrayBuffer;
+ mutable gl::BindingPointer<gl::Buffer> mAppliedElementArrayBuffer;
mutable std::vector<gl::VertexAttribute> mAppliedAttributes;
mutable std::vector<gl::VertexBinding> mAppliedBindings;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/WorkaroundsGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/WorkaroundsGL.h
index 85bcdb11eec..bc74c8f448f 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/WorkaroundsGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/WorkaroundsGL.h
@@ -114,17 +114,25 @@ struct WorkaroundsGL
// Tracking bug: http://crbug.com/672380
bool emulateAtan2Float = false;
- // Some drivers seem to forget about UBO bindings when loading program binaries. Work around
- // this by re-applying the bindings after the program binary is loaded.
+ // Some drivers seem to forget about UBO bindings when using program binaries. Work around
+ // this by re-applying the bindings after the program binary is loaded or saved.
// This only seems to affect AMD OpenGL drivers, and some Android devices.
// http://anglebug.com/1637
- bool reapplyUBOBindingsAfterLoadingBinaryProgram = false;
+ bool reapplyUBOBindingsAfterUsingBinaryProgram = false;
// Some OpenGL drivers return 0 when we query MAX_VERTEX_ATTRIB_STRIDE in an OpenGL 4.4 or
// higher context.
// This only seems to affect AMD OpenGL drivers.
// Tracking bug: http://anglebug.com/1936
bool emulateMaxVertexAttribStride = false;
+
+ // Initializing uninitialized locals caused odd behavior on Mac in a few WebGL 2 tests.
+ // Tracking bug: http://anglebug/2041
+ bool dontInitializeUninitializedLocals = false;
+
+ // On some NVIDIA drivers the point size range reported from the API is inconsistent with the
+ // actual behavior. Clamp the point size to the value from the API to fix this.
+ bool clampPointSize = false;
};
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/DisplayCGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/DisplayCGL.h
index 407837ad9bc..0989360fcb7 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/DisplayCGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/DisplayCGL.h
@@ -42,7 +42,7 @@ class DisplayCGL : public DisplayGL
egl::ConfigSet generateConfigs() override;
bool testDeviceLost() override;
- egl::Error restoreLostDevice() override;
+ egl::Error restoreLostDevice(const egl::Display *display) override;
bool isValidNativeWindow(EGLNativeWindowType window) const override;
@@ -50,10 +50,8 @@ class DisplayCGL : public DisplayGL
std::string getVendorString() const override;
- egl::Error waitClient() const override;
- egl::Error waitNative(EGLint engine,
- egl::Surface *drawSurface,
- egl::Surface *readSurface) const override;
+ egl::Error waitClient(const gl::Context *context) const override;
+ egl::Error waitNative(const gl::Context *context, EGLint engine) const override;
private:
const FunctionsGL *getFunctionsGL() const override;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm
index 8c751010c50..c4d997d91e4 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm
@@ -68,14 +68,14 @@ egl::Error DisplayCGL::initialize(egl::Display *display)
if (pixelFormat == nullptr)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Could not create the context's pixel format.");
+ return egl::EglNotInitialized() << "Could not create the context's pixel format.";
}
}
CGLCreateContext(pixelFormat, nullptr, &mContext);
if (mContext == nullptr)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Could not create the CGL context.");
+ return egl::EglNotInitialized() << "Could not create the CGL context.";
}
CGLSetCurrentContext(mContext);
@@ -87,7 +87,7 @@ egl::Error DisplayCGL::initialize(egl::Display *display)
}
if (!handle)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Could not open the OpenGL Framework.");
+ return egl::EglNotInitialized() << "Could not open the OpenGL Framework.";
}
mFunctions = new FunctionsGLCGL(handle);
@@ -145,7 +145,7 @@ SurfaceImpl *DisplayCGL::createPixmapSurface(const egl::SurfaceState &state,
egl::Error DisplayCGL::getDevice(DeviceImpl **device)
{
UNIMPLEMENTED();
- return egl::Error(EGL_BAD_DISPLAY);
+ return egl::EglBadDisplay();
}
egl::ConfigSet DisplayCGL::generateConfigs()
@@ -220,10 +220,10 @@ bool DisplayCGL::testDeviceLost()
return false;
}
-egl::Error DisplayCGL::restoreLostDevice()
+egl::Error DisplayCGL::restoreLostDevice(const egl::Display *display)
{
UNIMPLEMENTED();
- return egl::Error(EGL_BAD_DISPLAY);
+ return egl::EglBadDisplay();
}
bool DisplayCGL::isValidNativeWindow(EGLNativeWindowType window) const
@@ -256,18 +256,16 @@ void DisplayCGL::generateCaps(egl::Caps *outCaps) const
outCaps->textureNPOT = true;
}
-egl::Error DisplayCGL::waitClient() const
+egl::Error DisplayCGL::waitClient(const gl::Context *context) const
{
// TODO(cwallez) UNIMPLEMENTED()
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error DisplayCGL::waitNative(EGLint engine,
- egl::Surface *drawSurface,
- egl::Surface *readSurface) const
+egl::Error DisplayCGL::waitNative(const gl::Context *context, EGLint engine) const
{
// TODO(cwallez) UNIMPLEMENTED()
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error DisplayCGL::makeCurrentSurfaceless(gl::Context *context)
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h
index f2c60ddfb54..743b10ef79e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h
@@ -29,11 +29,15 @@ class PbufferSurfaceCGL : public SurfaceGL
const FunctionsGL *functions);
~PbufferSurfaceCGL() override;
- egl::Error initialize(const DisplayImpl *displayImpl) override;
+ egl::Error initialize(const egl::Display *display) override;
egl::Error makeCurrent() override;
- egl::Error swap(const DisplayImpl *displayImpl) override;
- egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) 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;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm
index 4c3d172793e..f6fe8fe5a80 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm
@@ -55,7 +55,7 @@ PbufferSurfaceCGL::~PbufferSurfaceCGL()
}
}
-egl::Error PbufferSurfaceCGL::initialize(const DisplayImpl *displayImpl)
+egl::Error PbufferSurfaceCGL::initialize(const egl::Display *display)
{
mFunctions->genRenderbuffers(1, &mColorRenderbuffer);
mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mColorRenderbuffer);
@@ -72,40 +72,44 @@ egl::Error PbufferSurfaceCGL::initialize(const DisplayImpl *displayImpl)
mFunctions->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
GL_RENDERBUFFER, mDSRenderbuffer);
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error PbufferSurfaceCGL::makeCurrent()
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error PbufferSurfaceCGL::swap(const DisplayImpl *displayImpl)
+egl::Error PbufferSurfaceCGL::swap(const gl::Context *context)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error PbufferSurfaceCGL::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
+egl::Error PbufferSurfaceCGL::postSubBuffer(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error PbufferSurfaceCGL::querySurfacePointerANGLE(EGLint attribute, void **value)
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error PbufferSurfaceCGL::bindTexImage(gl::Texture *texture, EGLint buffer)
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error PbufferSurfaceCGL::releaseTexImage(EGLint buffer)
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
void PbufferSurfaceCGL::setSwapInterval(EGLint interval)
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h
index 44a5bf794be..b134ac862c6 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h
@@ -61,11 +61,15 @@ class WindowSurfaceCGL : public SurfaceGL
CGLContextObj context);
~WindowSurfaceCGL() override;
- egl::Error initialize(const DisplayImpl *displayImpl) override;
+ egl::Error initialize(const egl::Display *display) override;
egl::Error makeCurrent() override;
- egl::Error swap(const DisplayImpl *displayImpl) override;
- egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) 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;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm
index ea8791983f9..44b7271d052 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm
@@ -194,7 +194,7 @@ WindowSurfaceCGL::~WindowSurfaceCGL()
}
}
-egl::Error WindowSurfaceCGL::initialize(const DisplayImpl *displayImpl)
+egl::Error WindowSurfaceCGL::initialize(const egl::Display *display)
{
unsigned width = getWidth();
unsigned height = getHeight();
@@ -237,7 +237,7 @@ egl::Error WindowSurfaceCGL::makeCurrent()
return egl::Error(EGL_SUCCESS);
}
-egl::Error WindowSurfaceCGL::swap(const DisplayImpl *displayImpl)
+egl::Error WindowSurfaceCGL::swap(const gl::Context *context)
{
mFunctions->flush();
mSwapState.beingRendered->swapId = ++mCurrentSwapId;
@@ -272,7 +272,11 @@ egl::Error WindowSurfaceCGL::swap(const DisplayImpl *displayImpl)
return egl::Error(EGL_SUCCESS);
}
-egl::Error WindowSurfaceCGL::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
+egl::Error WindowSurfaceCGL::postSubBuffer(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height)
{
UNIMPLEMENTED();
return egl::Error(EGL_SUCCESS);
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/DisplayEGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/DisplayEGL.cpp
index d7215d0a962..95d3c74d23c 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/DisplayEGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/DisplayEGL.cpp
@@ -79,7 +79,7 @@ egl::Error DisplayEGL::initializeContext(const egl::AttributeMap &eglAttributes)
{
if (initializeRequested && (requestedMajor != 2 || requestedMinor != 0))
{
- return egl::Error(EGL_BAD_ATTRIBUTE, "Unsupported requested context version");
+ return egl::EglBadAttribute() << "Unsupported requested context version";
}
contextAttribLists.push_back({EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE});
}
@@ -89,7 +89,7 @@ egl::Error DisplayEGL::initializeContext(const egl::AttributeMap &eglAttributes)
mContext = mEGL->createContext(mConfig, EGL_NO_CONTEXT, attribList.data());
if (mContext != EGL_NO_CONTEXT)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp
index 7be9e71cafc..20fffc71f33 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp
@@ -112,10 +112,10 @@ FunctionsEGL::~FunctionsEGL()
egl::Error FunctionsEGL::initialize(EGLNativeDisplayType nativeDisplay)
{
-#define ANGLE_GET_PROC_OR_ERROR(MEMBER, NAME) \
- if (!SetPtr(MEMBER, getProcAddress(#NAME))) \
- { \
- return egl::Error(EGL_NOT_INITIALIZED, "Could not load EGL entry point " #NAME); \
+#define ANGLE_GET_PROC_OR_ERROR(MEMBER, NAME) \
+ if (!SetPtr(MEMBER, getProcAddress(#NAME))) \
+ { \
+ return egl::EglNotInitialized() << "Could not load EGL entry point " #NAME; \
}
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->bindAPIPtr, eglBindAPI);
@@ -142,7 +142,7 @@ egl::Error FunctionsEGL::initialize(EGLNativeDisplayType nativeDisplay)
mEGLDisplay = mFnPtrs->getDisplayPtr(nativeDisplay);
if (mEGLDisplay == EGL_NO_DISPLAY)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Failed to get system egl display");
+ return egl::EglNotInitialized() << "Failed to get system egl display";
}
if (mFnPtrs->initializePtr(mEGLDisplay, &majorVersion, &minorVersion) != EGL_TRUE)
{
@@ -150,7 +150,7 @@ egl::Error FunctionsEGL::initialize(EGLNativeDisplayType nativeDisplay)
}
if (majorVersion < 1 || (majorVersion == 1 && minorVersion < 4))
{
- return egl::Error(EGL_NOT_INITIALIZED, "Unsupported EGL version (require at least 1.4).");
+ return egl::EglNotInitialized() << "Unsupported EGL version (require at least 1.4).";
}
if (mFnPtrs->bindAPIPtr(EGL_OPENGL_ES_API) != EGL_TRUE)
{
@@ -179,7 +179,7 @@ egl::Error FunctionsEGL::initialize(EGLNativeDisplayType nativeDisplay)
#undef ANGLE_GET_PROC_OR_ERROR
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error FunctionsEGL::terminate()
@@ -187,7 +187,7 @@ egl::Error FunctionsEGL::terminate()
if (mFnPtrs->terminatePtr == nullptr || mFnPtrs->terminatePtr(mEGLDisplay) == EGL_TRUE)
{
mEGLDisplay = nullptr;
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
return egl::Error(mFnPtrs->getErrorPtr());
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGLDL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGLDL.cpp
index e6ef45d8dda..99963d325cd 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGLDL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGLDL.cpp
@@ -47,7 +47,7 @@ egl::Error FunctionsEGLDL::initialize(EGLNativeDisplayType nativeDisplay, const
sNativeLib.handle = dlopen(libName, RTLD_NOW);
if (!sNativeLib.handle)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Could not dlopen native EGL: %s", dlerror());
+ return egl::EglNotInitialized() << "Could not dlopen native EGL: " << dlerror();
}
}
@@ -55,7 +55,7 @@ egl::Error FunctionsEGLDL::initialize(EGLNativeDisplayType nativeDisplay, const
reinterpret_cast<PFNEGLGETPROCADDRESSPROC>(dlsym(sNativeLib.handle, "eglGetProcAddress"));
if (!mGetProcAddressPtr)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Could not find eglGetProcAddress");
+ return egl::EglNotInitialized() << "Could not find eglGetProcAddress";
}
return FunctionsEGL::initialize(nativeDisplay);
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.cpp
index 4dd637028f3..bab5490abe5 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.cpp
@@ -25,7 +25,7 @@ PbufferSurfaceEGL::~PbufferSurfaceEGL()
{
}
-egl::Error PbufferSurfaceEGL::initialize(const DisplayImpl *displayImpl)
+egl::Error PbufferSurfaceEGL::initialize(const egl::Display *display)
{
mSurface = mEGL->createPbufferSurface(mConfig, mAttribList.data());
if (mSurface == EGL_NO_SURFACE)
@@ -33,7 +33,7 @@ egl::Error PbufferSurfaceEGL::initialize(const DisplayImpl *displayImpl)
return egl::Error(mEGL->getError(), "eglCreatePbufferSurface failed");
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.h
index fb4fe6b71c6..debbc7e3c5a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.h
@@ -28,7 +28,7 @@ class PbufferSurfaceEGL : public SurfaceEGL
RendererGL *renderer);
~PbufferSurfaceEGL() override;
- egl::Error initialize(const DisplayImpl *displayImpl) override;
+ egl::Error initialize(const egl::Display *display) override;
};
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp
index 364def96db5..87d7c45c1c2 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp
@@ -44,29 +44,33 @@ egl::Error SurfaceEGL::makeCurrent()
{
return egl::Error(mEGL->getError(), "eglMakeCurrent failed");
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error SurfaceEGL::swap(const DisplayImpl *displayImpl)
+egl::Error SurfaceEGL::swap(const gl::Context *context)
{
EGLBoolean success = mEGL->swapBuffers(mSurface);
if (success == EGL_FALSE)
{
return egl::Error(mEGL->getError(), "eglSwapBuffers failed");
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error SurfaceEGL::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
+egl::Error SurfaceEGL::postSubBuffer(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height)
{
UNIMPLEMENTED();
- return egl::Error(EGL_BAD_SURFACE);
+ return egl::EglBadSurface();
}
egl::Error SurfaceEGL::querySurfacePointerANGLE(EGLint attribute, void **value)
{
UNIMPLEMENTED();
- return egl::Error(EGL_BAD_SURFACE);
+ return egl::EglBadSurface();
}
egl::Error SurfaceEGL::bindTexImage(gl::Texture *texture, EGLint buffer)
@@ -76,7 +80,7 @@ egl::Error SurfaceEGL::bindTexImage(gl::Texture *texture, EGLint buffer)
{
return egl::Error(mEGL->getError(), "eglBindTexImage failed");
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error SurfaceEGL::releaseTexImage(EGLint buffer)
@@ -86,7 +90,7 @@ egl::Error SurfaceEGL::releaseTexImage(EGLint buffer)
{
return egl::Error(mEGL->getError(), "eglReleaseTexImage failed");
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
void SurfaceEGL::setSwapInterval(EGLint interval)
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.h
index 6033ace54e3..fd886ed9860 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.h
@@ -29,8 +29,12 @@ class SurfaceEGL : public SurfaceGL
~SurfaceEGL() override;
egl::Error makeCurrent() override;
- egl::Error swap(const DisplayImpl *displayImpl) override;
- egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) 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;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.cpp
index c4d38536519..281d8202679 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.cpp
@@ -26,7 +26,7 @@ WindowSurfaceEGL::~WindowSurfaceEGL()
{
}
-egl::Error WindowSurfaceEGL::initialize(const DisplayImpl *displayImpl)
+egl::Error WindowSurfaceEGL::initialize(const egl::Display *display)
{
mSurface = mEGL->createWindowSurface(mConfig, mWindow, mAttribList.data());
if (mSurface == EGL_NO_SURFACE)
@@ -34,7 +34,7 @@ egl::Error WindowSurfaceEGL::initialize(const DisplayImpl *displayImpl)
return egl::Error(mEGL->getError(), "eglCreateWindowSurface failed");
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.h
index 51f894590b6..8a8bc695fc3 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.h
@@ -26,7 +26,7 @@ class WindowSurfaceEGL : public SurfaceEGL
RendererGL *renderer);
~WindowSurfaceEGL() override;
- egl::Error initialize(const DisplayImpl *displayImpl) override;
+ egl::Error initialize(const egl::Display *display) override;
private:
EGLNativeWindowType mWindow;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.cpp
index d013276f55f..b7500acbbfc 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.cpp
@@ -92,7 +92,8 @@ egl::Error DisplayAndroid::initialize(egl::Display *display)
EGLBoolean success = mEGL->chooseConfig(mConfigAttribList.data(), &mConfig, 1, &numConfig);
if (success == EGL_FALSE)
{
- return egl::Error(mEGL->getError(), "eglChooseConfig failed");
+ return egl::EglNotInitialized()
+ << "eglChooseConfig failed with " << egl::Error(mEGL->getError());
}
ANGLE_TRY(initializeContext(display->getAttributeMap()));
@@ -103,13 +104,15 @@ egl::Error DisplayAndroid::initialize(egl::Display *display)
mDummyPbuffer = mEGL->createPbufferSurface(mConfig, dummyPbufferAttribs);
if (mDummyPbuffer == EGL_NO_SURFACE)
{
- return egl::Error(mEGL->getError(), "eglCreatePbufferSurface failed");
+ return egl::EglNotInitialized()
+ << "eglCreatePbufferSurface failed with " << egl::Error(mEGL->getError());
}
success = mEGL->makeCurrent(mDummyPbuffer, mContext);
if (success == EGL_FALSE)
{
- return egl::Error(mEGL->getError(), "eglMakeCurrent failed");
+ return egl::EglNotInitialized()
+ << "eglMakeCurrent failed with " << egl::Error(mEGL->getError());
}
mFunctionsGL = mEGL->makeFunctionsGL();
@@ -363,10 +366,10 @@ bool DisplayAndroid::testDeviceLost()
return false;
}
-egl::Error DisplayAndroid::restoreLostDevice()
+egl::Error DisplayAndroid::restoreLostDevice(const egl::Display *display)
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
bool DisplayAndroid::isValidNativeWindow(EGLNativeWindowType window) const
@@ -377,21 +380,19 @@ bool DisplayAndroid::isValidNativeWindow(EGLNativeWindowType window) const
egl::Error DisplayAndroid::getDevice(DeviceImpl **device)
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error DisplayAndroid::waitClient() const
+egl::Error DisplayAndroid::waitClient(const gl::Context *context) const
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error DisplayAndroid::waitNative(EGLint engine,
- egl::Surface *drawSurface,
- egl::Surface *readSurface) const
+egl::Error DisplayAndroid::waitNative(const gl::Context *context, EGLint engine) const
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.h
index 87ae21e2648..27756c31b9f 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.h
@@ -47,16 +47,14 @@ class DisplayAndroid : public DisplayEGL
egl::ConfigSet generateConfigs() override;
bool testDeviceLost() override;
- egl::Error restoreLostDevice() override;
+ egl::Error restoreLostDevice(const egl::Display *display) override;
bool isValidNativeWindow(EGLNativeWindowType window) const override;
egl::Error getDevice(DeviceImpl **device) override;
- egl::Error waitClient() const override;
- egl::Error waitNative(EGLint engine,
- egl::Surface *drawSurface,
- egl::Surface *readSurface) const override;
+ egl::Error waitClient(const gl::Context *context) const override;
+ egl::Error waitNative(const gl::Context *context, EGLint engine) const override;
private:
template <typename T>
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.cpp
index 6d89d9ad196..cff3a313365 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.cpp
@@ -451,7 +451,7 @@ egl::Error DisplayOzone::initialize(egl::Display *display)
if (!mGBM)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Could not open drm device.");
+ return egl::EglNotInitialized() << "Could not open drm device.";
}
// ANGLE builds its executables with an RPATH so they pull in ANGLE's libGL and libEGL.
@@ -470,7 +470,7 @@ egl::Error DisplayOzone::initialize(egl::Display *display)
{
if (!mEGL->hasExtension(ext))
{
- return egl::Error(EGL_NOT_INITIALIZED, "need %s", ext);
+ return egl::EglNotInitialized() << "need " << ext;
}
}
@@ -497,7 +497,7 @@ egl::Error DisplayOzone::initialize(egl::Display *display)
EGLConfig config[1];
if (!mEGL->chooseConfig(attrib, config, 1, &numConfig) || numConfig < 1)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Could not get EGL config.");
+ return egl::EglNotInitialized() << "Could not get EGL config.";
}
mConfig = config[0];
}
@@ -506,7 +506,7 @@ egl::Error DisplayOzone::initialize(egl::Display *display)
if (!mEGL->makeCurrent(EGL_NO_SURFACE, mContext))
{
- return egl::Error(EGL_NOT_INITIALIZED, "Could not make context current.");
+ return egl::EglNotInitialized() << "Could not make context current.";
}
mFunctionsGL = mEGL->makeFunctionsGL();
@@ -897,7 +897,7 @@ SurfaceImpl *DisplayOzone::createPixmapSurface(const egl::SurfaceState &state,
egl::Error DisplayOzone::getDevice(DeviceImpl **device)
{
UNIMPLEMENTED();
- return egl::Error(EGL_BAD_DISPLAY);
+ return egl::EglBadDisplay();
}
egl::ConfigSet DisplayOzone::generateConfigs()
@@ -926,10 +926,10 @@ bool DisplayOzone::testDeviceLost()
return false;
}
-egl::Error DisplayOzone::restoreLostDevice()
+egl::Error DisplayOzone::restoreLostDevice(const egl::Display *display)
{
UNIMPLEMENTED();
- return egl::Error(EGL_BAD_DISPLAY);
+ return egl::EglBadDisplay();
}
bool DisplayOzone::isValidNativeWindow(EGLNativeWindowType window) const
@@ -937,18 +937,16 @@ bool DisplayOzone::isValidNativeWindow(EGLNativeWindowType window) const
return true;
}
-egl::Error DisplayOzone::waitClient() const
+egl::Error DisplayOzone::waitClient(const gl::Context *context) const
{
// TODO(fjhenigman) Implement this.
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error DisplayOzone::waitNative(EGLint engine,
- egl::Surface *drawSurface,
- egl::Surface *readSurface) const
+egl::Error DisplayOzone::waitNative(const gl::Context *context, EGLint engine) const
{
// TODO(fjhenigman) Implement this.
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
void DisplayOzone::setSwapInterval(EGLSurface drawable, SwapControlData *data)
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.h
index c867ac15b51..f9e9baa6f9e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.h
@@ -129,16 +129,14 @@ class DisplayOzone final : public DisplayEGL
egl::ConfigSet generateConfigs() override;
bool testDeviceLost() override;
- egl::Error restoreLostDevice() override;
+ egl::Error restoreLostDevice(const egl::Display *display) override;
bool isValidNativeWindow(EGLNativeWindowType window) const override;
egl::Error getDevice(DeviceImpl **device) override;
- egl::Error waitClient() const override;
- egl::Error waitNative(EGLint engine,
- egl::Surface *drawSurface,
- egl::Surface *readSurface) const override;
+ egl::Error waitClient(const gl::Context *context) const override;
+ egl::Error waitNative(const gl::Context *context, EGLint engine) const override;
// TODO(fjhenigman) Implement this.
// Swap interval can be set globally or per drawable.
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.cpp
index f1b056c2ea6..29678c9a56b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.cpp
@@ -26,9 +26,9 @@ SurfaceOzone::~SurfaceOzone()
delete mBuffer;
}
-egl::Error SurfaceOzone::initialize(const DisplayImpl *displayImpl)
+egl::Error SurfaceOzone::initialize(const egl::Display *display)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
FramebufferImpl *SurfaceOzone::createDefaultFramebuffer(const gl::FramebufferState &state)
@@ -38,36 +38,40 @@ FramebufferImpl *SurfaceOzone::createDefaultFramebuffer(const gl::FramebufferSta
egl::Error SurfaceOzone::makeCurrent()
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error SurfaceOzone::swap(const DisplayImpl *displayImpl)
+egl::Error SurfaceOzone::swap(const gl::Context *context)
{
mBuffer->present();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error SurfaceOzone::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
+egl::Error SurfaceOzone::postSubBuffer(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height)
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error SurfaceOzone::querySurfacePointerANGLE(EGLint attribute, void **value)
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error SurfaceOzone::bindTexImage(gl::Texture *texture, EGLint buffer)
{
mBuffer->bindTexImage();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error SurfaceOzone::releaseTexImage(EGLint buffer)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
void SurfaceOzone::setSwapInterval(EGLint interval)
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.h
index 918b72b10fd..10a32af459d 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.h
@@ -25,11 +25,15 @@ class SurfaceOzone : public SurfaceGL
FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override;
- egl::Error initialize(const DisplayImpl *displayImpl) override;
+ egl::Error initialize(const egl::Display *display) override;
egl::Error makeCurrent() override;
- egl::Error swap(const DisplayImpl *displayImpl) override;
- egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) 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;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/formatutilsgl.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/formatutilsgl.cpp
index e9035abef36..1a5f0efa485 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/formatutilsgl.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/formatutilsgl.cpp
@@ -188,9 +188,13 @@ static InternalFormatInfoMap BuildInternalFormatInfoMap()
InsertFormatMapping(&map, GL_BGRA_EXT, VersionOrExts(1, 2, "GL_EXT_bgra"), AlwaysSupported(), VersionOrExts(1, 2, "GL_EXT_bgra"), ExtsOnly("GL_EXT_texture_format_BGRA8888"), AlwaysSupported(), NeverSupported() );
// Floating point formats
+ // Note that GL_EXT_texture_shared_exponent and GL_ARB_color_buffer_float suggest that RGB9_E5
+ // would be renderable, but once support for renderable float textures got rolled into core GL
+ // spec it wasn't intended to be renderable. In practice it's not reliably renderable even
+ // with the extensions, there's a known bug in at least NVIDIA driver version 370.
// | Format | OpenGL texture support | Filter | OpenGL render support | OpenGL ES texture support | Filter | OpenGL ES render support |
InsertFormatMapping(&map, GL_R11F_G11F_B10F, VersionOrExts(3, 0, "GL_EXT_packed_float"), AlwaysSupported(), VersionOrExts(3, 0, "GL_EXT_packed_float GL_ARB_color_buffer_float"), VersionOnly(3, 0), AlwaysSupported(), ExtsOnly("GL_EXT_color_buffer_float") );
- InsertFormatMapping(&map, GL_RGB9_E5, VersionOrExts(3, 0, "GL_EXT_texture_shared_exponent"), AlwaysSupported(), VersionOrExts(3, 0, "GL_EXT_texture_shared_exponent GL_ARB_color_buffer_float"), VersionOnly(3, 0), AlwaysSupported(), NeverSupported() );
+ InsertFormatMapping(&map, GL_RGB9_E5, VersionOrExts(3, 0, "GL_EXT_texture_shared_exponent"), AlwaysSupported(), NeverSupported(), VersionOnly(3, 0), AlwaysSupported(), NeverSupported() );
InsertFormatMapping(&map, GL_R16F, VersionOrExts(3, 0, "GL_ARB_texture_rg ARB_texture_float"), AlwaysSupported(), VersionOrExts(3, 0, "GL_ARB_texture_rg GL_ARB_texture_float GL_ARB_color_buffer_float"), VersionOrExts(3, 0, "GL_OES_texture_half_float GL_EXT_texture_rg"), VersionOrExts(3, 0, "GL_OES_texture_half_float_linear"), VersionOrExtsAndExts(3, 0, "GL_EXT_texture_rg", "GL_EXT_color_buffer_half_float"));
InsertFormatMapping(&map, GL_RG16F, VersionOrExts(3, 0, "GL_ARB_texture_rg ARB_texture_float"), AlwaysSupported(), VersionOrExts(3, 0, "GL_ARB_texture_rg GL_ARB_texture_float GL_ARB_color_buffer_float"), VersionOrExts(3, 0, "GL_OES_texture_half_float GL_EXT_texture_rg"), VersionOrExts(3, 0, "GL_OES_texture_half_float_linear"), VersionOrExtsAndExts(3, 0, "GL_EXT_texture_rg", "GL_EXT_color_buffer_half_float"));
InsertFormatMapping(&map, GL_RGB16F, VersionOrExts(3, 0, "GL_ARB_texture_float"), AlwaysSupported(), VersionOrExts(3, 0, "GL_ARB_texture_float GL_ARB_color_buffer_float"), VersionOrExts(3, 0, "GL_OES_texture_half_float"), VersionOrExts(3, 0, "GL_OES_texture_half_float_linear"), ExtsOnly("GL_EXT_color_buffer_half_float") );
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp
index 8e7607d6c0a..c4009c5a53b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp
@@ -15,11 +15,12 @@
#include "common/debug.h"
#include "libANGLE/Config.h"
+#include "libANGLE/Context.h"
#include "libANGLE/Display.h"
#include "libANGLE/Surface.h"
+#include "libANGLE/renderer/gl/RendererGL.h"
#include "libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h"
#include "libANGLE/renderer/gl/glx/WindowSurfaceGLX.h"
-#include "libANGLE/renderer/gl/RendererGL.h"
#include "libANGLE/renderer/gl/renderergl_utils.h"
namespace rx
@@ -74,6 +75,7 @@ DisplayGLX::DisplayGLX(const egl::DisplayState &state)
mMinSwapInterval(0),
mMaxSwapInterval(0),
mCurrentSwapInterval(-1),
+ mCurrentDrawable(0),
mXDisplay(nullptr),
mEGLDisplay(nullptr)
{
@@ -98,14 +100,14 @@ egl::Error DisplayGLX::initialize(egl::Display *display)
mXDisplay = XOpenDisplay(nullptr);
if (!mXDisplay)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Could not open the default X display.");
+ return egl::EglNotInitialized() << "Could not open the default X display.";
}
}
std::string glxInitError;
if (!mGLX.initialize(mXDisplay, DefaultScreen(mXDisplay), &glxInitError))
{
- return egl::Error(EGL_NOT_INITIALIZED, glxInitError.c_str());
+ return egl::EglNotInitialized() << glxInitError;
}
mHasMultisample = mGLX.minorVersion > 3 || mGLX.hasExtension("GLX_ARB_multisample");
@@ -175,7 +177,7 @@ egl::Error DisplayGLX::initialize(egl::Display *display)
if (mContextConfig == nullptr)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Invalid visual ID requested.");
+ return egl::EglNotInitialized() << "Invalid visual ID requested.";
}
}
else
@@ -214,7 +216,8 @@ egl::Error DisplayGLX::initialize(egl::Display *display)
if (nConfigs == 0)
{
XFree(candidates);
- return egl::Error(EGL_NOT_INITIALIZED, "Could not find a decent GLX FBConfig to create the context.");
+ return egl::EglNotInitialized()
+ << "Could not find a decent GLX FBConfig to create the context.";
}
mContextConfig = candidates[0];
XFree(candidates);
@@ -235,9 +238,8 @@ egl::Error DisplayGLX::initialize(egl::Display *display)
EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE) ==
EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE)
{
- return egl::Error(EGL_NOT_INITIALIZED,
- "Cannot create an OpenGL ES platform on GLX without the "
- "GLX_ARB_create_context extension.");
+ return egl::EglNotInitialized() << "Cannot create an OpenGL ES platform on GLX without "
+ "the GLX_ARB_create_context extension.";
}
XVisualInfo visualTemplate;
@@ -248,8 +250,7 @@ egl::Error DisplayGLX::initialize(egl::Display *display)
XGetVisualInfo(mXDisplay, VisualIDMask, &visualTemplate, &numVisuals);
if (numVisuals <= 0)
{
- return egl::Error(EGL_NOT_INITIALIZED,
- "Could not get the visual info from the fb config");
+ return egl::EglNotInitialized() << "Could not get the visual info from the fb config";
}
ASSERT(numVisuals == 1);
@@ -258,7 +259,7 @@ egl::Error DisplayGLX::initialize(egl::Display *display)
if (!mContext)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Could not create GL context.");
+ return egl::EglNotInitialized() << "Could not create GL context.";
}
}
ASSERT(mContext);
@@ -282,12 +283,12 @@ egl::Error DisplayGLX::initialize(egl::Display *display)
mDummyPbuffer = mGLX.createPbuffer(mContextConfig, dummyPbufferAttribs);
if (!mDummyPbuffer)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Could not create the dummy pbuffer.");
+ return egl::EglNotInitialized() << "Could not create the dummy pbuffer.";
}
if (!mGLX.makeCurrent(mDummyPbuffer, mContext))
{
- return egl::Error(EGL_NOT_INITIALIZED, "Could not make the dummy pbuffer current.");
+ return egl::EglNotInitialized() << "Could not make the dummy pbuffer current.";
}
mFunctionsGL = new FunctionsGLGLX(mGLX.getProc);
@@ -302,7 +303,7 @@ egl::Error DisplayGLX::initialize(egl::Display *display)
EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE;
if (isOpenGLES && (IsIntel(vendor) || IsNvidia(vendor)))
{
- return egl::Error(EGL_NOT_INITIALIZED, "Intel or NVIDIA OpenGL ES drivers are not supported.");
+ return egl::EglNotInitialized() << "Intel or NVIDIA OpenGL ES drivers are not supported.";
}
syncXCommands();
@@ -331,6 +332,26 @@ void DisplayGLX::terminate()
SafeDelete(mFunctionsGL);
}
+egl::Error DisplayGLX::makeCurrent(egl::Surface *drawSurface,
+ egl::Surface *readSurface,
+ gl::Context *context)
+{
+ if (drawSurface)
+ {
+ glx::Drawable drawable = GetImplAs<SurfaceGLX>(drawSurface)->getDrawable();
+ if (drawable != mCurrentDrawable)
+ {
+ if (mGLX.makeCurrent(drawable, mContext) != True)
+ {
+ return egl::EglContextLost() << "Failed to make the GLX context current";
+ }
+ mCurrentDrawable = drawable;
+ }
+ }
+
+ return DisplayGL::makeCurrent(drawSurface, readSurface, context);
+}
+
SurfaceImpl *DisplayGLX::createWindowSurface(const egl::SurfaceState &state,
EGLNativeWindowType window,
const egl::AttributeMap &attribs)
@@ -339,7 +360,7 @@ SurfaceImpl *DisplayGLX::createWindowSurface(const egl::SurfaceState &state,
glx::FBConfig fbConfig = configIdToGLXConfig[state.config->configID];
return new WindowSurfaceGLX(state, mGLX, this, getRenderer(), window, mGLX.getDisplay(),
- mContext, fbConfig);
+ fbConfig);
}
SurfaceImpl *DisplayGLX::createPbufferSurface(const egl::SurfaceState &state,
@@ -352,8 +373,7 @@ SurfaceImpl *DisplayGLX::createPbufferSurface(const egl::SurfaceState &state,
EGLint height = static_cast<EGLint>(attribs.get(EGL_HEIGHT, 0));
bool largest = (attribs.get(EGL_LARGEST_PBUFFER, EGL_FALSE) == EGL_TRUE);
- return new PbufferSurfaceGLX(state, getRenderer(), width, height, largest, mGLX, mContext,
- fbConfig);
+ return new PbufferSurfaceGLX(state, getRenderer(), width, height, largest, mGLX, fbConfig);
}
SurfaceImpl *DisplayGLX::createPbufferFromClientBuffer(const egl::SurfaceState &state,
@@ -376,7 +396,7 @@ SurfaceImpl *DisplayGLX::createPixmapSurface(const egl::SurfaceState &state,
egl::Error DisplayGLX::getDevice(DeviceImpl **device)
{
UNIMPLEMENTED();
- return egl::Error(EGL_BAD_DISPLAY);
+ return egl::EglBadDisplay();
}
egl::Error DisplayGLX::initializeContext(glx::FBConfig config,
@@ -391,9 +411,8 @@ egl::Error DisplayGLX::initializeContext(glx::FBConfig config,
{
if (!mHasEXTCreateContextES2Profile)
{
- return egl::Error(EGL_NOT_INITIALIZED,
- "Cannot create an OpenGL ES platform on GLX without the "
- "GLX_EXT_create_context_es_profile extension.");
+ return egl::EglNotInitialized() << "Cannot create an OpenGL ES platform on GLX without "
+ "the GLX_EXT_create_context_es_profile extension.";
}
ASSERT(mHasARBCreateContextProfile);
@@ -425,72 +444,29 @@ egl::Error DisplayGLX::initializeContext(glx::FBConfig config,
// Also try to get any Desktop GL context, but if that fails fallback to
// asking for OpenGL ES contexts.
- struct ContextCreationInfo
- {
- ContextCreationInfo(EGLint displayType, int profileFlag, gl::Version version)
- : displayType(displayType), profileFlag(profileFlag), version(version)
- {
- }
-
- EGLint displayType;
- int profileFlag;
- gl::Version version;
- };
-
- // clang-format off
- std::vector<ContextCreationInfo> contextsToTry;
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, gl::Version(4, 5));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, gl::Version(4, 4));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, gl::Version(4, 3));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, gl::Version(4, 2));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, gl::Version(4, 1));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, gl::Version(4, 0));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, gl::Version(3, 3));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, gl::Version(3, 2));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, 0, gl::Version(3, 3));
-
- // On Mesa, do not try to create OpenGL context versions between 3.0 and
- // 3.2 because of compatibility problems. See crbug.com/659030
- if (!mIsMesa)
- {
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, 0, gl::Version(3, 2));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, 0, gl::Version(3, 1));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, 0, gl::Version(3, 0));
- }
-
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, 0, gl::Version(2, 1));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, 0, gl::Version(2, 0));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, 0, gl::Version(1, 5));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, 0, gl::Version(1, 4));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, 0, gl::Version(1, 3));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, 0, gl::Version(1, 2));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, 0, gl::Version(1, 1));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, 0, gl::Version(1, 0));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE, GLX_CONTEXT_ES2_PROFILE_BIT_EXT, gl::Version(3, 2));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE, GLX_CONTEXT_ES2_PROFILE_BIT_EXT, gl::Version(3, 1));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE, GLX_CONTEXT_ES2_PROFILE_BIT_EXT, gl::Version(3, 0));
- contextsToTry.emplace_back(EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE, GLX_CONTEXT_ES2_PROFILE_BIT_EXT, gl::Version(2, 0));
- // clang-format on
-
// NOTE: below we return as soon as we're able to create a context so the
// "error" variable is EGL_SUCCESS when returned contrary to the common idiom
// of returning "error" when there is an actual error.
- for (const auto &info : contextsToTry)
+ for (const auto &info : GenerateContextCreationToTry(requestedDisplayType, mIsMesa))
{
- if (requestedDisplayType != EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE &&
- requestedDisplayType != info.displayType)
+ int profileFlag = 0;
+ if (info.type == ContextCreationTry::Type::DESKTOP_CORE)
{
- continue;
+ profileFlag |= GLX_CONTEXT_CORE_PROFILE_BIT_ARB;
+ }
+ else if (info.type == ContextCreationTry::Type::ES)
+ {
+ profileFlag |= GLX_CONTEXT_ES2_PROFILE_BIT_EXT;
}
- egl::Error error = createContextAttribs(config, info.version, info.profileFlag, context);
+ egl::Error error = createContextAttribs(config, info.version, profileFlag, context);
if (!error.isError())
{
return error;
}
}
- return egl::Error(EGL_NOT_INITIALIZED, "Could not create a backing OpenGL context.");
+ return egl::EglNotInitialized() << "Could not create a backing OpenGL context.";
}
egl::ConfigSet DisplayGLX::generateConfigs()
@@ -680,9 +656,9 @@ bool DisplayGLX::testDeviceLost()
return false;
}
-egl::Error DisplayGLX::restoreLostDevice()
+egl::Error DisplayGLX::restoreLostDevice(const egl::Display *display)
{
- return egl::Error(EGL_BAD_DISPLAY);
+ return egl::EglBadDisplay();
}
bool DisplayGLX::isValidNativeWindow(EGLNativeWindowType window) const
@@ -713,15 +689,13 @@ std::string DisplayGLX::getVendorString() const
return "";
}
-egl::Error DisplayGLX::waitClient() const
+egl::Error DisplayGLX::waitClient(const gl::Context *context) const
{
mGLX.waitGL();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error DisplayGLX::waitNative(EGLint engine,
- egl::Surface *drawSurface,
- egl::Surface *readSurface) const
+egl::Error DisplayGLX::waitNative(const gl::Context *context, EGLint engine) const
{
// eglWaitNative is used to notice the driver of changes in X11 for the current surface, such as
// changes of the window size. We use this event to update the child window of WindowSurfaceGLX
@@ -729,29 +703,23 @@ egl::Error DisplayGLX::waitNative(EGLint engine,
// Handling eglWaitNative this way helps the application control when resize happens. This is
// important because drivers have a tendency to clobber the back buffer when the windows are
// resized. See http://crbug.com/326995
+ egl::Surface *drawSurface = context->getCurrentDrawSurface();
+ egl::Surface *readSurface = context->getCurrentReadSurface();
if (drawSurface != nullptr)
{
SurfaceGLX *glxDrawSurface = GetImplAs<SurfaceGLX>(drawSurface);
- egl::Error error = glxDrawSurface->checkForResize();
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(glxDrawSurface->checkForResize());
}
if (readSurface != drawSurface && readSurface != nullptr)
{
SurfaceGLX *glxReadSurface = GetImplAs<SurfaceGLX>(readSurface);
- egl::Error error = glxReadSurface->checkForResize();
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(glxReadSurface->checkForResize());
}
// We still need to forward the resizing of the child window to the driver.
mGLX.waitX();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
void DisplayGLX::syncXCommands() const
@@ -821,6 +789,8 @@ void DisplayGLX::generateExtensions(egl::DisplayExtensions *outExtensions) const
// Contexts are virtualized so textures can be shared globally
outExtensions->displayTextureShareGroup = true;
+
+ outExtensions->surfacelessContext = true;
}
void DisplayGLX::generateCaps(egl::Caps *outCaps) const
@@ -828,6 +798,13 @@ void DisplayGLX::generateCaps(egl::Caps *outCaps) const
outCaps->textureNPOT = true;
}
+egl::Error DisplayGLX::makeCurrentSurfaceless(gl::Context *context)
+{
+ // Nothing to do because GLX always uses the same context and the previous surface can be left
+ // current.
+ return egl::NoError();
+}
+
int DisplayGLX::getGLXFBConfigAttrib(glx::FBConfig config, int attrib) const
{
int result;
@@ -877,9 +854,9 @@ egl::Error DisplayGLX::createContextAttribs(glx::FBConfig,
if (!*context)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Could not create GL context.");
+ return egl::EglNotInitialized() << "Could not create GL context.";
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/DisplayGLX.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/DisplayGLX.h
index cd542cc6a59..2be457e8784 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/DisplayGLX.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/DisplayGLX.h
@@ -44,6 +44,10 @@ class DisplayGLX : public DisplayGL
egl::Error initialize(egl::Display *display) override;
void terminate() override;
+ egl::Error makeCurrent(egl::Surface *drawSurface,
+ egl::Surface *readSurface,
+ gl::Context *context) override;
+
SurfaceImpl *createWindowSurface(const egl::SurfaceState &state,
EGLNativeWindowType window,
const egl::AttributeMap &attribs) override;
@@ -60,7 +64,7 @@ class DisplayGLX : public DisplayGL
egl::ConfigSet generateConfigs() override;
bool testDeviceLost() override;
- egl::Error restoreLostDevice() override;
+ egl::Error restoreLostDevice(const egl::Display *display) override;
bool isValidNativeWindow(EGLNativeWindowType window) const override;
@@ -68,10 +72,8 @@ class DisplayGLX : public DisplayGL
std::string getVendorString() const override;
- egl::Error waitClient() const override;
- egl::Error waitNative(EGLint engine,
- egl::Surface *drawSurface,
- egl::Surface *readSurface) const override;
+ egl::Error waitClient(const gl::Context *context) const override;
+ egl::Error waitNative(const gl::Context *context, EGLint engine) const override;
// Synchronizes with the X server, if the display has been opened by ANGLE.
// Calling this is required at the end of every functions that does buffered
@@ -97,6 +99,8 @@ class DisplayGLX : public DisplayGL
void generateExtensions(egl::DisplayExtensions *outExtensions) const override;
void generateCaps(egl::Caps *outCaps) const override;
+ egl::Error makeCurrentSurfaceless(gl::Context *context) override;
+
int getGLXFBConfigAttrib(glx::FBConfig config, int attrib) const;
egl::Error createContextAttribs(glx::FBConfig,
const Optional<gl::Version> &version,
@@ -133,6 +137,8 @@ class DisplayGLX : public DisplayGL
int mMaxSwapInterval;
int mCurrentSwapInterval;
+ glx::Drawable mCurrentDrawable;
+
FunctionsGLX mGLX;
Display *mXDisplay;
egl::Display *mEGLDisplay;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp
index 57e22831b7a..4993f36caac 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp
@@ -21,14 +21,12 @@ PbufferSurfaceGLX::PbufferSurfaceGLX(const egl::SurfaceState &state,
EGLint height,
bool largest,
const FunctionsGLX &glx,
- glx::Context context,
glx::FBConfig fbConfig)
: SurfaceGLX(state, renderer),
mWidth(width),
mHeight(height),
mLargest(largest),
mGLX(glx),
- mContext(context),
mFBConfig(fbConfig),
mPbuffer(0)
{
@@ -42,7 +40,7 @@ PbufferSurfaceGLX::~PbufferSurfaceGLX()
}
}
-egl::Error PbufferSurfaceGLX::initialize(const DisplayImpl *displayImpl)
+egl::Error PbufferSurfaceGLX::initialize(const egl::Display *display)
{
// Avoid creating 0-sized PBuffers as it fails on the Intel Mesa driver
// as commented on https://bugs.freedesktop.org/show_bug.cgi?id=38869 so we
@@ -61,7 +59,7 @@ egl::Error PbufferSurfaceGLX::initialize(const DisplayImpl *displayImpl)
mPbuffer = mGLX.createPbuffer(mFBConfig, attribs);
if (!mPbuffer)
{
- return egl::Error(EGL_BAD_ALLOC, "Failed to create a native GLX pbuffer.");
+ return egl::EglBadAlloc() << "Failed to create a native GLX pbuffer.";
}
if (mLargest)
@@ -70,44 +68,44 @@ egl::Error PbufferSurfaceGLX::initialize(const DisplayImpl *displayImpl)
mGLX.queryDrawable(mPbuffer, GLX_HEIGHT, &mHeight);
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error PbufferSurfaceGLX::makeCurrent()
{
- if (mGLX.makeCurrent(mPbuffer, mContext) != True)
- {
- return egl::Error(EGL_BAD_DISPLAY);
- }
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error PbufferSurfaceGLX::swap(const DisplayImpl *displayImpl)
+egl::Error PbufferSurfaceGLX::swap(const gl::Context *context)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error PbufferSurfaceGLX::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
+egl::Error PbufferSurfaceGLX::postSubBuffer(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error PbufferSurfaceGLX::querySurfacePointerANGLE(EGLint attribute, void **value)
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error PbufferSurfaceGLX::bindTexImage(gl::Texture *texture, EGLint buffer)
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error PbufferSurfaceGLX::releaseTexImage(EGLint buffer)
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
void PbufferSurfaceGLX::setSwapInterval(EGLint interval)
@@ -138,6 +136,12 @@ EGLint PbufferSurfaceGLX::getSwapBehavior() const
egl::Error PbufferSurfaceGLX::checkForResize()
{
// The size of pbuffers never change
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
+}
+
+glx::Drawable PbufferSurfaceGLX::getDrawable() const
+{
+ return mPbuffer;
}
+
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h
index cf390e54675..797107125ca 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h
@@ -26,15 +26,18 @@ class PbufferSurfaceGLX : public SurfaceGLX
EGLint height,
bool largest,
const FunctionsGLX &glx,
- glx::Context context,
glx::FBConfig fbConfig);
~PbufferSurfaceGLX() override;
- egl::Error initialize(const DisplayImpl *displayImpl) override;
+ egl::Error initialize(const egl::Display *display) override;
egl::Error makeCurrent() override;
- egl::Error swap(const DisplayImpl *displayImpl) override;
- egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) 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;
@@ -47,6 +50,7 @@ class PbufferSurfaceGLX : public SurfaceGLX
EGLint getSwapBehavior() const override;
egl::Error checkForResize() override;
+ glx::Drawable getDrawable() const override;
private:
unsigned mWidth;
@@ -54,7 +58,6 @@ class PbufferSurfaceGLX : public SurfaceGLX
bool mLargest;
const FunctionsGLX &mGLX;
- glx::Context mContext;
glx::FBConfig mFBConfig;
glx::Pbuffer mPbuffer;
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/SurfaceGLX.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/SurfaceGLX.h
index 813516e8057..0d2d0bc5700 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/SurfaceGLX.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/SurfaceGLX.h
@@ -20,6 +20,7 @@ class SurfaceGLX : public SurfaceGL
SurfaceGLX(const egl::SurfaceState &state, RendererGL *renderer) : SurfaceGL(state, renderer) {}
virtual egl::Error checkForResize() = 0;
+ virtual glx::Drawable getDrawable() const = 0;
};
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp
index c357f9d41c2..06e3c45c436 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp
@@ -27,7 +27,6 @@ WindowSurfaceGLX::WindowSurfaceGLX(const egl::SurfaceState &state,
RendererGL *renderer,
Window window,
Display *display,
- glx::Context context,
glx::FBConfig fbConfig)
: SurfaceGLX(state, renderer),
mParent(window),
@@ -35,7 +34,6 @@ WindowSurfaceGLX::WindowSurfaceGLX(const egl::SurfaceState &state,
mDisplay(display),
mGLX(glx),
mGLXDisplay(glxDisplay),
- mContext(context),
mFBConfig(fbConfig),
mGLXWindow(0)
{
@@ -63,7 +61,7 @@ WindowSurfaceGLX::~WindowSurfaceGLX()
mGLXDisplay->syncXCommands();
}
-egl::Error WindowSurfaceGLX::initialize(const DisplayImpl *displayImpl)
+egl::Error WindowSurfaceGLX::initialize(const egl::Display *display)
{
// Check that the window's visual ID is valid, as part of the AMGLE_x11_visual
// extension.
@@ -74,9 +72,8 @@ egl::Error WindowSurfaceGLX::initialize(const DisplayImpl *displayImpl)
if (!mGLXDisplay->isValidWindowVisualId(visualId))
{
- return egl::Error(EGL_BAD_MATCH,
- "The visual of native_window doesn't match the visual given with "
- "ANGLE_X11_VISUAL_ID");
+ return egl::EglBadMatch() << "The visual of native_window doesn't match the visual "
+ "given with ANGLE_X11_VISUAL_ID";
}
}
@@ -88,13 +85,13 @@ egl::Error WindowSurfaceGLX::initialize(const DisplayImpl *displayImpl)
XVisualInfo *visualInfo = mGLX.getVisualFromFBConfig(mFBConfig);
if (!visualInfo)
{
- return egl::Error(EGL_BAD_NATIVE_WINDOW, "Failed to get the XVisualInfo for the child window.");
+ return egl::EglBadNativeWindow() << "Failed to get the XVisualInfo for the child window.";
}
Visual* visual = visualInfo->visual;
if (!getWindowDimensions(mParent, &mParentWidth, &mParentHeight))
{
- return egl::Error(EGL_BAD_NATIVE_WINDOW, "Failed to get the parent window's dimensions.");
+ return egl::EglBadNativeWindow() << "Failed to get the parent window's dimensions.";
}
// The depth, colormap and visual must match otherwise we get a X error
@@ -111,7 +108,7 @@ egl::Error WindowSurfaceGLX::initialize(const DisplayImpl *displayImpl)
if(!colormap)
{
XFree(visualInfo);
- return egl::Error(EGL_BAD_NATIVE_WINDOW, "Failed to create the Colormap for the child window.");
+ return egl::EglBadNativeWindow() << "Failed to create the Colormap for the child window.";
}
attributes.colormap = colormap;
attributes.border_pixel = 0;
@@ -129,19 +126,15 @@ egl::Error WindowSurfaceGLX::initialize(const DisplayImpl *displayImpl)
mGLXDisplay->syncXCommands();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error WindowSurfaceGLX::makeCurrent()
{
- if (mGLX.makeCurrent(mGLXWindow, mContext) != True)
- {
- return egl::Error(EGL_BAD_DISPLAY);
- }
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error WindowSurfaceGLX::swap(const DisplayImpl *displayImpl)
+egl::Error WindowSurfaceGLX::swap(const gl::Context *context)
{
// We need to swap before resizing as some drivers clobber the back buffer
// when the window is resized.
@@ -154,31 +147,35 @@ egl::Error WindowSurfaceGLX::swap(const DisplayImpl *displayImpl)
return error;
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error WindowSurfaceGLX::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
+egl::Error WindowSurfaceGLX::postSubBuffer(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height)
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error WindowSurfaceGLX::querySurfacePointerANGLE(EGLint attribute, void **value)
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error WindowSurfaceGLX::bindTexImage(gl::Texture *texture, EGLint buffer)
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error WindowSurfaceGLX::releaseTexImage(EGLint buffer)
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
void WindowSurfaceGLX::setSwapInterval(EGLint interval)
@@ -215,8 +212,7 @@ egl::Error WindowSurfaceGLX::checkForResize()
unsigned int newParentWidth, newParentHeight;
if (!getWindowDimensions(mParent, &newParentWidth, &newParentHeight))
{
- return egl::Error(EGL_BAD_CURRENT_SURFACE,
- "Failed to retrieve the size of the parent window.");
+ return egl::EglBadCurrentSurface() << "Failed to retrieve the size of the parent window.";
}
if (mParentWidth != newParentWidth || mParentHeight != newParentHeight)
@@ -230,7 +226,12 @@ egl::Error WindowSurfaceGLX::checkForResize()
XSync(mDisplay, False);
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
+}
+
+glx::Drawable WindowSurfaceGLX::getDrawable() const
+{
+ return mGLXWindow;
}
bool WindowSurfaceGLX::getWindowDimensions(Window window, unsigned int *width, unsigned int *height) const
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h
index 00515cc5483..549afc24563 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h
@@ -28,15 +28,18 @@ class WindowSurfaceGLX : public SurfaceGLX
RendererGL *renderer,
Window window,
Display *display,
- glx::Context context,
glx::FBConfig fbConfig);
~WindowSurfaceGLX() override;
- egl::Error initialize(const DisplayImpl *displayImpl) override;
+ egl::Error initialize(const egl::Display *display) override;
egl::Error makeCurrent() override;
- egl::Error swap(const DisplayImpl *displayImpl) override;
- egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) 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;
@@ -49,6 +52,7 @@ class WindowSurfaceGLX : public SurfaceGLX
EGLint getSwapBehavior() const override;
egl::Error checkForResize() override;
+ glx::Drawable getDrawable() const override;
private:
bool getWindowDimensions(Window window, unsigned int *width, unsigned int *height) const;
@@ -61,7 +65,6 @@ class WindowSurfaceGLX : public SurfaceGLX
const FunctionsGLX &mGLX;
DisplayGLX *mGLXDisplay;
- glx::Context mContext;
glx::FBConfig mFBConfig;
glx::Window mGLXWindow;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.cpp
index 68ead9a5e02..d3b1b6e5a87 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.cpp
@@ -14,6 +14,7 @@
#include "common/mathutil.h"
#include "libANGLE/Buffer.h"
#include "libANGLE/Caps.h"
+#include "libANGLE/Workarounds.h"
#include "libANGLE/formatutils.h"
#include "libANGLE/renderer/gl/FunctionsGL.h"
#include "libANGLE/renderer/gl/QueryGL.h"
@@ -22,6 +23,7 @@
#include <algorithm>
#include <sstream>
+#include <EGL/eglext.h>
using angle::CheckedNumeric;
@@ -108,9 +110,41 @@ static gl::TextureCaps GenerateTextureFormatCaps(const FunctionsGL *functions, G
std::vector<GLint> samples(numSamples);
functions->getInternalformativ(GL_RENDERBUFFER, internalFormat, GL_SAMPLES,
static_cast<GLsizei>(samples.size()), &samples[0]);
+
+ GLenum queryInternalFormat = internalFormat;
+ if (internalFormat == GL_STENCIL_INDEX8)
+ {
+ // The query below does generates an error with STENCIL_INDEX8 on NVIDIA driver
+ // 382.33. So for now we assume that the same sampling modes are conformant for
+ // STENCIL_INDEX8 as for DEPTH24_STENCIL8. Clean this up once the driver is fixed.
+ // http://anglebug.com/2059
+ queryInternalFormat = GL_DEPTH24_STENCIL8;
+ }
for (size_t sampleIndex = 0; sampleIndex < samples.size(); sampleIndex++)
{
- textureCaps.sampleCounts.insert(samples[sampleIndex]);
+ // Some NVIDIA drivers expose multisampling modes implemented as a combination of
+ // multisampling and supersampling. These are non-conformant and should not be
+ // exposed through ANGLE. Query which formats are conformant from the driver if
+ // supported.
+ GLint conformant = GL_TRUE;
+ if (functions->getInternalformatSampleivNV)
+ {
+ ASSERT(functions->getError() == GL_NO_ERROR);
+ functions->getInternalformatSampleivNV(GL_RENDERBUFFER, queryInternalFormat,
+ samples[sampleIndex], GL_CONFORMANT_NV,
+ 1, &conformant);
+ // getInternalFormatSampleivNV does not work for all formats on NVIDIA Shield TV
+ // drivers. Assume that formats with large sample counts are non-conformant in
+ // case the query generates an error.
+ if (functions->getError() != GL_NO_ERROR)
+ {
+ conformant = (samples[sampleIndex] <= 8) ? GL_TRUE : GL_FALSE;
+ }
+ }
+ if (conformant == GL_TRUE)
+ {
+ textureCaps.sampleCounts.insert(samples[sampleIndex]);
+ }
}
}
}
@@ -188,7 +222,8 @@ void GenerateCaps(const FunctionsGL *functions,
gl::Caps *caps,
gl::TextureCapsMap *textureCapsMap,
gl::Extensions *extensions,
- gl::Version *maxSupportedESVersion)
+ gl::Version *maxSupportedESVersion,
+ MultiviewImplementationTypeGL *multiviewImplementationType)
{
// Texture format support checks
const gl::FormatSet &allFormats = gl::GetAllSizedInternalFormats();
@@ -486,7 +521,15 @@ void GenerateCaps(const FunctionsGL *functions,
caps->maxUniformBufferBindings = QuerySingleGLInt(functions, GL_MAX_UNIFORM_BUFFER_BINDINGS);
caps->maxUniformBlockSize = QuerySingleGLInt64(functions, GL_MAX_UNIFORM_BLOCK_SIZE);
caps->uniformBufferOffsetAlignment = QuerySingleGLInt(functions, GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT);
- caps->maxCombinedUniformBlocks = caps->maxVertexUniformBlocks + caps->maxFragmentInputComponents;
+
+ GLuint maxCombinedUniformBlocks =
+ QuerySingleGLInt(functions, GL_MAX_COMBINED_UNIFORM_BLOCKS);
+ // The real cap contains the limits for shader types that are not available to ES, so limit
+ // the cap to the sum of vertex+fragment shader caps.
+ caps->maxCombinedUniformBlocks =
+ std::min(maxCombinedUniformBlocks,
+ caps->maxVertexUniformBlocks + caps->maxFragmentUniformBlocks);
+
caps->maxCombinedVertexUniformComponents = QuerySingleGLInt64(functions, GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS);
caps->maxCombinedFragmentUniformComponents = QuerySingleGLInt64(functions, GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS);
}
@@ -831,6 +874,18 @@ void GenerateCaps(const FunctionsGL *functions,
functions->hasGLESExtension("GL_EXT_shader_texture_lod");
extensions->fragDepth = functions->standard == STANDARD_GL_DESKTOP ||
functions->hasGLESExtension("GL_EXT_frag_depth");
+
+ if (functions->hasGLExtension("GL_NV_viewport_array2"))
+ {
+ extensions->multiview = true;
+ // GL_MAX_ARRAY_TEXTURE_LAYERS is guaranteed to be at least 256.
+ const int maxLayers = QuerySingleGLInt(functions, GL_MAX_ARRAY_TEXTURE_LAYERS);
+ // GL_MAX_VIEWPORTS is guaranteed to be at least 16.
+ const int maxViewports = QuerySingleGLInt(functions, GL_MAX_VIEWPORTS);
+ extensions->maxViews = static_cast<GLuint>(std::min(maxLayers, maxViewports));
+ *multiviewImplementationType = MultiviewImplementationTypeGL::NV_VIEWPORT_ARRAY2;
+ }
+
extensions->fboRenderMipmap = functions->isAtLeastGL(gl::Version(3, 0)) || functions->hasGLExtension("GL_EXT_framebuffer_object") ||
functions->isAtLeastGLES(gl::Version(3, 0)) || functions->hasGLESExtension("GL_OES_fbo_render_mipmap");
extensions->instancedArrays = functions->isAtLeastGL(gl::Version(3, 1)) ||
@@ -962,6 +1017,11 @@ void GenerateWorkarounds(const FunctionsGL *functions, WorkaroundsGL *workaround
workarounds->doWhileGLSLCausesGPUHang = true;
workarounds->useUnusedBlocksWithStandardOrSharedLayout = true;
workarounds->rewriteFloatUnaryMinusOperator = IsIntel(vendor);
+ workarounds->dontInitializeUninitializedLocals = true;
+#endif
+
+#if defined(ANGLE_PLATFORM_ANDROID)
+ workarounds->dontInitializeUninitializedLocals = true;
#endif
workarounds->finishDoesNotCauseQueriesToBeAvailable =
@@ -991,14 +1051,30 @@ void GenerateWorkarounds(const FunctionsGL *functions, WorkaroundsGL *workaround
// 364 are known to be affected, at least up to 375.
workarounds->emulateAtan2Float = IsNvidia(vendor);
- workarounds->reapplyUBOBindingsAfterLoadingBinaryProgram = IsAMD(vendor);
+ workarounds->reapplyUBOBindingsAfterUsingBinaryProgram = IsAMD(vendor);
+
+ workarounds->clampPointSize = IsNvidia(vendor);
#if defined(ANGLE_PLATFORM_ANDROID)
// TODO(jmadill): Narrow workaround range for specific devices.
- workarounds->reapplyUBOBindingsAfterLoadingBinaryProgram = true;
+ workarounds->reapplyUBOBindingsAfterUsingBinaryProgram = true;
+
+ workarounds->clampPointSize = true;
#endif
}
+void ApplyWorkarounds(const FunctionsGL *functions, gl::Workarounds *workarounds)
+{
+#if defined(ANGLE_PLATFORM_ANDROID)
+ VendorID vendor = GetVendorID(functions);
+
+ if (IsQualcomm(vendor))
+ {
+ workarounds->disableProgramCachingForTransformFeedback = true;
+ }
+#endif // defined(ANGLE_PLATFORM_ANDROID)
+}
+
} // namespace nativegl_gl
namespace nativegl
@@ -1109,4 +1185,55 @@ gl::ErrorOrResult<bool> ShouldApplyLastRowPaddingWorkaround(const gl::Extents &s
return checkedEndByte.ValueOrDie() > static_cast<size_t>(state.pixelBuffer->getSize());
}
+
+std::vector<ContextCreationTry> GenerateContextCreationToTry(EGLint requestedType, bool isMesaGLX)
+{
+ using Type = ContextCreationTry::Type;
+ constexpr EGLint kPlatformOpenGL = EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE;
+ constexpr EGLint kPlatformOpenGLES = EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE;
+
+ std::vector<ContextCreationTry> contextsToTry;
+
+ if (requestedType == EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE || requestedType == kPlatformOpenGL)
+ {
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_CORE, gl::Version(4, 5));
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_CORE, gl::Version(4, 4));
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_CORE, gl::Version(4, 3));
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_CORE, gl::Version(4, 2));
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_CORE, gl::Version(4, 1));
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_CORE, gl::Version(4, 0));
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_CORE, gl::Version(3, 3));
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_CORE, gl::Version(3, 2));
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_LEGACY, gl::Version(3, 3));
+
+ // On Mesa, do not try to create OpenGL context versions between 3.0 and
+ // 3.2 because of compatibility problems. See crbug.com/659030
+ if (!isMesaGLX)
+ {
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_LEGACY, gl::Version(3, 2));
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_LEGACY, gl::Version(3, 1));
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_LEGACY, gl::Version(3, 0));
+ }
+
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_LEGACY, gl::Version(2, 1));
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_LEGACY, gl::Version(2, 0));
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_LEGACY, gl::Version(1, 5));
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_LEGACY, gl::Version(1, 4));
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_LEGACY, gl::Version(1, 3));
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_LEGACY, gl::Version(1, 2));
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_LEGACY, gl::Version(1, 1));
+ contextsToTry.emplace_back(kPlatformOpenGL, Type::DESKTOP_LEGACY, gl::Version(1, 0));
+ }
+
+ if (requestedType == EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE ||
+ requestedType == kPlatformOpenGLES)
+ {
+ contextsToTry.emplace_back(kPlatformOpenGLES, Type::ES, gl::Version(3, 2));
+ contextsToTry.emplace_back(kPlatformOpenGLES, Type::ES, gl::Version(3, 1));
+ contextsToTry.emplace_back(kPlatformOpenGLES, Type::ES, gl::Version(3, 0));
+ contextsToTry.emplace_back(kPlatformOpenGLES, Type::ES, gl::Version(2, 0));
+ }
+
+ return contextsToTry;
+}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.h
index 98716db9805..76eb4788ee1 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.h
@@ -12,6 +12,7 @@
#include "libANGLE/angletypes.h"
#include "libANGLE/Error.h"
+#include "libANGLE/Version.h"
#include "libANGLE/renderer/driver_utils.h"
#include "libANGLE/renderer/gl/functionsgl_typedefs.h"
@@ -24,12 +25,18 @@ struct Caps;
class TextureCapsMap;
struct Extensions;
struct Version;
+struct Workarounds;
}
namespace rx
{
class FunctionsGL;
struct WorkaroundsGL;
+enum class MultiviewImplementationTypeGL
+{
+ NV_VIEWPORT_ARRAY2,
+ UNSPECIFIED
+};
VendorID GetVendorID(const FunctionsGL *functions);
std::string GetDriverVersion(const FunctionsGL *functions);
@@ -42,9 +49,11 @@ void GenerateCaps(const FunctionsGL *functions,
gl::Caps *caps,
gl::TextureCapsMap *textureCapsMap,
gl::Extensions *extensions,
- gl::Version *maxSupportedESVersion);
+ gl::Version *maxSupportedESVersion,
+ MultiviewImplementationTypeGL *multiviewImplementationType);
void GenerateWorkarounds(const FunctionsGL *functions, WorkaroundsGL *workarounds);
+void ApplyWorkarounds(const FunctionsGL *functions, gl::Workarounds *workarounds);
}
namespace nativegl
@@ -66,6 +75,27 @@ gl::ErrorOrResult<bool> ShouldApplyLastRowPaddingWorkaround(const gl::Extents &s
GLenum type,
bool is3D,
const void *pixels);
+
+struct ContextCreationTry
+{
+ enum class Type
+ {
+ DESKTOP_CORE,
+ DESKTOP_LEGACY,
+ ES,
+ };
+
+ ContextCreationTry(EGLint displayType, Type type, gl::Version version)
+ : displayType(displayType), type(type), version(version)
+ {
+ }
+
+ EGLint displayType;
+ Type type;
+ gl::Version version;
+};
+
+std::vector<ContextCreationTry> GenerateContextCreationToTry(EGLint requestedType, bool isMesaGLX);
}
#endif // LIBANGLE_RENDERER_GL_RENDERERGLUTILS_H_
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.cpp
index b60f9818273..ca872458518 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.cpp
@@ -47,8 +47,8 @@ egl::Error GetD3D11TextureInfo(EGLenum buftype,
default:
SafeRelease(texture11);
- return egl::Error(EGL_BAD_PARAMETER, "Unknown client buffer texture format: %u.",
- textureDesc.Format);
+ return egl::EglBadParameter()
+ << "Unknown client buffer texture format: " << textureDesc.Format;
}
}
@@ -57,8 +57,7 @@ egl::Error GetD3D11TextureInfo(EGLenum buftype,
if (d3d11Device == nullptr)
{
SafeRelease(texture11);
- return egl::Error(EGL_BAD_PARAMETER,
- "Could not query the D3D11 device from the client buffer.");
+ return egl::EglBadParameter() << "Could not query the D3D11 device from the client buffer.";
}
if (width)
@@ -88,7 +87,7 @@ egl::Error GetD3D11TextureInfo(EGLenum buftype,
SafeRelease(texture11);
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error GetD3D9TextureInfo(EGLenum buftype,
@@ -102,7 +101,7 @@ egl::Error GetD3D9TextureInfo(EGLenum buftype,
if (FAILED(texture9->GetLevelDesc(0, &surfaceDesc)))
{
SafeRelease(texture9);
- return egl::Error(EGL_BAD_PARAMETER, "Could not query description of the D3D9 surface.");
+ return egl::EglBadParameter() << "Could not query description of the D3D9 surface.";
}
if (buftype == EGL_D3D_TEXTURE_ANGLE)
@@ -118,8 +117,8 @@ egl::Error GetD3D9TextureInfo(EGLenum buftype,
default:
SafeRelease(texture9);
- return egl::Error(EGL_BAD_PARAMETER, "Unknown client buffer texture format: %u.",
- surfaceDesc.Format);
+ return egl::EglBadParameter()
+ << "Unknown client buffer texture format: " << surfaceDesc.Format;
}
}
@@ -137,8 +136,7 @@ egl::Error GetD3D9TextureInfo(EGLenum buftype,
if (FAILED(result))
{
SafeRelease(texture9);
- return egl::Error(EGL_BAD_PARAMETER,
- "Could not query the D3D9 device from the client buffer.");
+ return egl::EglBadParameter() << "Could not query the D3D9 device from the client buffer.";
}
if (device)
@@ -159,7 +157,7 @@ egl::Error GetD3D9TextureInfo(EGLenum buftype,
SafeRelease(texture9);
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error GetD3DTextureInfo(EGLenum buftype,
@@ -185,8 +183,8 @@ egl::Error GetD3DTextureInfo(EGLenum buftype,
}
else
{
- return egl::Error(EGL_BAD_PARAMETER,
- "Provided buffer is not a IDirect3DTexture9 or ID3D11Texture2D.");
+ return egl::EglBadParameter()
+ << "Provided buffer is not a IDirect3DTexture9 or ID3D11Texture2D.";
}
}
else if (buftype == EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE)
@@ -198,8 +196,7 @@ egl::Error GetD3DTextureInfo(EGLenum buftype,
reinterpret_cast<void **>(&texture11));
if (FAILED(result))
{
- return egl::Error(EGL_BAD_PARAMETER, "Failed to open share handle, result: 0x%X.",
- result);
+ return egl::EglBadParameter() << "Failed to open share handle, " << gl::FmtHR(result);
}
return GetD3D11TextureInfo(buftype, texture11, width, height, object, device);
@@ -207,7 +204,7 @@ egl::Error GetD3DTextureInfo(EGLenum buftype,
else
{
UNREACHABLE();
- return egl::Error(EGL_BAD_DISPLAY, "Unknown buftype for D3DTextureSurfaceWGL.");
+ return egl::EglBadDisplay() << "Unknown buftype for D3DTextureSurfaceWGL.";
}
}
@@ -218,12 +215,11 @@ D3DTextureSurfaceWGL::D3DTextureSurfaceWGL(const egl::SurfaceState &state,
EGLenum buftype,
EGLClientBuffer clientBuffer,
DisplayWGL *display,
- HGLRC wglContext,
HDC deviceContext,
ID3D11Device *displayD3D11Device,
const FunctionsGL *functionsGL,
const FunctionsWGL *functionsWGL)
- : SurfaceGL(state, renderer),
+ : SurfaceWGL(state, renderer),
mBuftype(buftype),
mClientBuffer(clientBuffer),
mRenderer(renderer),
@@ -233,7 +229,6 @@ D3DTextureSurfaceWGL::D3DTextureSurfaceWGL(const egl::SurfaceState &state,
mWorkarounds(renderer->getWorkarounds()),
mFunctionsGL(functionsGL),
mFunctionsWGL(functionsWGL),
- mWGLContext(wglContext),
mDeviceContext(deviceContext),
mWidth(0),
mHeight(0),
@@ -287,7 +282,7 @@ egl::Error D3DTextureSurfaceWGL::ValidateD3DTextureClientBuffer(EGLenum buftype,
nullptr);
}
-egl::Error D3DTextureSurfaceWGL::initialize(const DisplayImpl *displayImpl)
+egl::Error D3DTextureSurfaceWGL::initialize(const egl::Display *display)
{
IUnknown *device = nullptr;
ANGLE_TRY(GetD3DTextureInfo(mBuftype, mClientBuffer, mDisplayD3D11Device, &mWidth, &mHeight,
@@ -310,8 +305,8 @@ egl::Error D3DTextureSurfaceWGL::initialize(const DisplayImpl *displayImpl)
mDeviceHandle, mObject, mColorRenderbufferID, GL_RENDERBUFFER, WGL_ACCESS_READ_WRITE_NV);
if (mBoundObjectRenderbufferHandle == nullptr)
{
- return egl::Error(EGL_BAD_ALLOC, "Failed to register D3D object, error: 0x%08x.",
- HRESULT_CODE(GetLastError()));
+ return egl::EglBadAlloc() << "Failed to register D3D object, "
+ << gl::FmtErr(HRESULT_CODE(GetLastError()));
}
const egl::Config *config = mState.config;
@@ -339,25 +334,18 @@ egl::Error D3DTextureSurfaceWGL::initialize(const DisplayImpl *displayImpl)
GL_RENDERBUFFER, mDepthStencilRenderbufferID);
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error D3DTextureSurfaceWGL::makeCurrent()
{
- if (!mFunctionsWGL->makeCurrent(mDeviceContext, mWGLContext))
- {
- // TODO(geofflang): What error type here?
- return egl::Error(EGL_CONTEXT_LOST, "Failed to make the WGL context current.");
- }
-
if (!mFunctionsWGL->dxLockObjectsNV(mDeviceHandle, 1, &mBoundObjectRenderbufferHandle))
{
DWORD error = GetLastError();
- return egl::Error(EGL_BAD_ALLOC, "Failed to lock object, error: 0x%08x.",
- HRESULT_CODE(error));
+ return egl::EglBadAlloc() << "Failed to lock object, " << gl::FmtErr(HRESULT_CODE(error));
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error D3DTextureSurfaceWGL::unMakeCurrent()
@@ -365,22 +353,25 @@ egl::Error D3DTextureSurfaceWGL::unMakeCurrent()
if (!mFunctionsWGL->dxUnlockObjectsNV(mDeviceHandle, 1, &mBoundObjectRenderbufferHandle))
{
DWORD error = GetLastError();
- return egl::Error(EGL_BAD_ALLOC, "Failed to unlock object, error: 0x%08x.",
- HRESULT_CODE(error));
+ return egl::EglBadAlloc() << "Failed to unlock object, " << gl::FmtErr(HRESULT_CODE(error));
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error D3DTextureSurfaceWGL::swap(const DisplayImpl *displayImpl)
+egl::Error D3DTextureSurfaceWGL::swap(const gl::Context *context)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error D3DTextureSurfaceWGL::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
+egl::Error D3DTextureSurfaceWGL::postSubBuffer(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height)
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error D3DTextureSurfaceWGL::querySurfacePointerANGLE(EGLint attribute, void **value)
@@ -399,7 +390,7 @@ egl::Error D3DTextureSurfaceWGL::querySurfacePointerANGLE(EGLint attribute, void
UNREACHABLE();
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error D3DTextureSurfaceWGL::bindTexImage(gl::Texture *texture, EGLint buffer)
@@ -414,18 +405,17 @@ egl::Error D3DTextureSurfaceWGL::bindTexImage(gl::Texture *texture, EGLint buffe
if (mBoundObjectTextureHandle == nullptr)
{
DWORD error = GetLastError();
- return egl::Error(EGL_BAD_ALLOC, "Failed to register D3D object, error: 0x%08x.",
- HRESULT_CODE(error));
+ return egl::EglBadAlloc() << "Failed to register D3D object, "
+ << gl::FmtErr(HRESULT_CODE(error));
}
if (!mFunctionsWGL->dxLockObjectsNV(mDeviceHandle, 1, &mBoundObjectTextureHandle))
{
DWORD error = GetLastError();
- return egl::Error(EGL_BAD_ALLOC, "Failed to lock object, error: 0x%08x.",
- HRESULT_CODE(error));
+ return egl::EglBadAlloc() << "Failed to lock object, " << gl::FmtErr(HRESULT_CODE(error));
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error D3DTextureSurfaceWGL::releaseTexImage(EGLint buffer)
@@ -434,19 +424,18 @@ egl::Error D3DTextureSurfaceWGL::releaseTexImage(EGLint buffer)
if (!mFunctionsWGL->dxUnlockObjectsNV(mDeviceHandle, 1, &mBoundObjectTextureHandle))
{
DWORD error = GetLastError();
- return egl::Error(EGL_BAD_ALLOC, "Failed to unlock object, error: 0x%08x.",
- HRESULT_CODE(error));
+ return egl::EglBadAlloc() << "Failed to unlock object, " << gl::FmtErr(HRESULT_CODE(error));
}
if (!mFunctionsWGL->dxUnregisterObjectNV(mDeviceHandle, mBoundObjectTextureHandle))
{
DWORD error = GetLastError();
- return egl::Error(EGL_BAD_ALLOC, "Failed to unregister D3D object, error: 0x%08x.",
- HRESULT_CODE(error));
+ return egl::EglBadAlloc() << "Failed to unregister D3D object, "
+ << gl::FmtErr(HRESULT_CODE(error));
}
mBoundObjectTextureHandle = nullptr;
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
void D3DTextureSurfaceWGL::setSwapInterval(EGLint interval)
@@ -479,4 +468,10 @@ FramebufferImpl *D3DTextureSurfaceWGL::createDefaultFramebuffer(const gl::Frameb
return new FramebufferGL(mFramebufferID, data, mFunctionsGL, mWorkarounds,
mRenderer->getBlitter(), mStateManager);
}
+
+HDC D3DTextureSurfaceWGL::getDC() const
+{
+ return mDeviceContext;
+}
+
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.h
index 2ce2b05f45b..fe359254d28 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.h
@@ -9,7 +9,7 @@
#ifndef LIBANGLE_RENDERER_GL_WGL_D3DTEXTIRESURFACEWGL_H_
#define LIBANGLE_RENDERER_GL_WGL_D3DTEXTIRESURFACEWGL_H_
-#include "libANGLE/renderer/gl/SurfaceGL.h"
+#include "libANGLE/renderer/gl/wgl/SurfaceWGL.h"
#include <GL/wglext.h>
@@ -22,7 +22,7 @@ class DisplayWGL;
class StateManagerGL;
struct WorkaroundsGL;
-class D3DTextureSurfaceWGL : public SurfaceGL
+class D3DTextureSurfaceWGL : public SurfaceWGL
{
public:
D3DTextureSurfaceWGL(const egl::SurfaceState &state,
@@ -30,7 +30,6 @@ class D3DTextureSurfaceWGL : public SurfaceGL
EGLenum buftype,
EGLClientBuffer clientBuffer,
DisplayWGL *display,
- HGLRC wglContext,
HDC deviceContext,
ID3D11Device *displayD3D11Device,
const FunctionsGL *functionsGL,
@@ -41,12 +40,16 @@ class D3DTextureSurfaceWGL : public SurfaceGL
EGLClientBuffer clientBuffer,
ID3D11Device *d3d11Device);
- egl::Error initialize(const DisplayImpl *displayImpl) override;
+ egl::Error initialize(const egl::Display *display) override;
egl::Error makeCurrent() override;
egl::Error unMakeCurrent() override;
- egl::Error swap(const DisplayImpl *displayImpl) override;
- egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) 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;
@@ -60,6 +63,8 @@ class D3DTextureSurfaceWGL : public SurfaceGL
FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &data) override;
+ HDC getDC() const override;
+
private:
EGLenum mBuftype;
EGLClientBuffer mClientBuffer;
@@ -74,7 +79,6 @@ class D3DTextureSurfaceWGL : public SurfaceGL
const FunctionsGL *mFunctionsGL;
const FunctionsWGL *mFunctionsWGL;
- HGLRC mWGLContext;
HDC mDeviceContext;
size_t mWidth;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp
index 068ea9916c5..5ddff3765c5 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp
@@ -27,12 +27,11 @@ DXGISwapChainWindowSurfaceWGL::DXGISwapChainWindowSurfaceWGL(const egl::SurfaceS
EGLNativeWindowType window,
ID3D11Device *device,
HANDLE deviceHandle,
- HGLRC wglContext,
HDC deviceContext,
const FunctionsGL *functionsGL,
const FunctionsWGL *functionsWGL,
EGLint orientation)
- : SurfaceGL(state, renderer),
+ : SurfaceWGL(state, renderer),
mWindow(window),
mStateManager(renderer->getStateManager()),
mWorkarounds(renderer->getWorkarounds()),
@@ -42,7 +41,6 @@ DXGISwapChainWindowSurfaceWGL::DXGISwapChainWindowSurfaceWGL(const egl::SurfaceS
mDevice(device),
mDeviceHandle(deviceHandle),
mWGLDevice(deviceContext),
- mWGLContext(wglContext),
mSwapChainFormat(DXGI_FORMAT_UNKNOWN),
mSwapChainFlags(0),
mDepthBufferFormat(GL_NONE),
@@ -86,22 +84,21 @@ DXGISwapChainWindowSurfaceWGL::~DXGISwapChainWindowSurfaceWGL()
SafeRelease(mSwapChain1);
}
-egl::Error DXGISwapChainWindowSurfaceWGL::initialize(const DisplayImpl *displayImpl)
+egl::Error DXGISwapChainWindowSurfaceWGL::initialize(const egl::Display *display)
{
if (mOrientation != EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE)
{
// TODO(geofflang): Support the orientation extensions fully. Currently only inverting Y is
// supported. To support all orientations, an intermediate framebuffer will be needed with
// a blit before swap.
- return egl::Error(EGL_BAD_ATTRIBUTE,
- "DXGISwapChainWindowSurfaceWGL requires an orientation of "
- "EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE.");
+ return egl::EglBadAttribute() << "DXGISwapChainWindowSurfaceWGL requires an orientation of "
+ "EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE.";
}
RECT rect;
if (!GetClientRect(mWindow, &rect))
{
- return egl::Error(EGL_BAD_NATIVE_WINDOW, "Failed to query the window size.");
+ return egl::EglBadNativeWindow() << "Failed to query the window size.";
}
mWidth = rect.right - rect.left;
mHeight = rect.bottom - rect.top;
@@ -119,43 +116,30 @@ egl::Error DXGISwapChainWindowSurfaceWGL::initialize(const DisplayImpl *displayI
egl::Error DXGISwapChainWindowSurfaceWGL::makeCurrent()
{
- if (!mFunctionsWGL->makeCurrent(mWGLDevice, mWGLContext))
- {
- // TODO: What error type here?
- return egl::Error(EGL_CONTEXT_LOST, "Failed to make the WGL context current.");
- }
-
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error DXGISwapChainWindowSurfaceWGL::swap(const DisplayImpl *displayImpl)
+egl::Error DXGISwapChainWindowSurfaceWGL::swap(const gl::Context *context)
{
mFunctionsGL->flush();
- egl::Error error = setObjectsLocked(false);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(setObjectsLocked(false));
HRESULT result = mSwapChain->Present(mSwapInterval, 0);
mFirstSwap = false;
- error = setObjectsLocked(true);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(setObjectsLocked(true));
if (FAILED(result))
{
- return egl::Error(EGL_BAD_ALLOC, "Failed to present swap chain, result: 0x%X", result);
+ return egl::EglBadAlloc() << "Failed to present swap chain, " << gl::FmtHR(result);
}
return checkForResize();
}
-egl::Error DXGISwapChainWindowSurfaceWGL::postSubBuffer(EGLint x,
+egl::Error DXGISwapChainWindowSurfaceWGL::postSubBuffer(const gl::Context *context,
+ EGLint x,
EGLint y,
EGLint width,
EGLint height)
@@ -164,11 +148,7 @@ egl::Error DXGISwapChainWindowSurfaceWGL::postSubBuffer(EGLint x,
mFunctionsGL->flush();
- egl::Error error = setObjectsLocked(false);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(setObjectsLocked(false));
HRESULT result = S_OK;
if (mFirstSwap)
@@ -184,15 +164,11 @@ egl::Error DXGISwapChainWindowSurfaceWGL::postSubBuffer(EGLint x,
result = mSwapChain1->Present1(mSwapInterval, 0, &params);
}
- error = setObjectsLocked(true);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(setObjectsLocked(true));
if (FAILED(result))
{
- return egl::Error(EGL_BAD_ALLOC, "Failed to present swap chain, result: 0x%X", result);
+ return egl::EglBadAlloc() << "Failed to present swap chain, " << gl::FmtHR(result);
}
return checkForResize();
@@ -201,7 +177,7 @@ egl::Error DXGISwapChainWindowSurfaceWGL::postSubBuffer(EGLint x,
egl::Error DXGISwapChainWindowSurfaceWGL::querySurfacePointerANGLE(EGLint attribute, void **value)
{
UNREACHABLE();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error DXGISwapChainWindowSurfaceWGL::bindTexImage(gl::Texture *texture, EGLint buffer)
@@ -216,8 +192,8 @@ egl::Error DXGISwapChainWindowSurfaceWGL::bindTexImage(gl::Texture *texture, EGL
reinterpret_cast<void **>(&colorBuffer));
if (FAILED(result))
{
- return egl::Error(EGL_BAD_ALLOC, "Failed to query texture from swap chain, result: 0x%X",
- result);
+ return egl::EglBadAlloc() << "Failed to query texture from swap chain, "
+ << gl::FmtHR(result);
}
mTextureHandle = mFunctionsWGL->dxRegisterObjectNV(mDeviceHandle, colorBuffer, textureID,
@@ -225,8 +201,8 @@ egl::Error DXGISwapChainWindowSurfaceWGL::bindTexImage(gl::Texture *texture, EGL
SafeRelease(colorBuffer);
if (mTextureHandle == nullptr)
{
- return egl::Error(EGL_BAD_ALLOC, "Failed to register D3D object, error: 0x%08x.",
- HRESULT_CODE(GetLastError()));
+ return egl::EglBadAlloc() << "Failed to register D3D object, "
+ << gl::FmtErr(HRESULT_CODE(GetLastError()));
}
if (!mFunctionsWGL->dxLockObjectsNV(mDeviceHandle, 1, &mTextureHandle))
@@ -234,13 +210,13 @@ egl::Error DXGISwapChainWindowSurfaceWGL::bindTexImage(gl::Texture *texture, EGL
mFunctionsWGL->dxUnregisterObjectNV(mDeviceHandle, mTextureHandle);
mTextureHandle = nullptr;
- return egl::Error(EGL_BAD_ALLOC, "Failed to lock D3D object, error: 0x%08x.",
- HRESULT_CODE(GetLastError()));
+ return egl::EglBadAlloc() << "Failed to lock D3D object, "
+ << gl::FmtErr(HRESULT_CODE(GetLastError()));
}
mTextureID = textureID;
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error DXGISwapChainWindowSurfaceWGL::releaseTexImage(EGLint buffer)
@@ -249,20 +225,20 @@ egl::Error DXGISwapChainWindowSurfaceWGL::releaseTexImage(EGLint buffer)
if (!mFunctionsWGL->dxUnlockObjectsNV(mDeviceHandle, 1, &mTextureHandle))
{
- return egl::Error(EGL_BAD_ALLOC, "Failed to unlock D3D object, error: 0x%08x.",
- HRESULT_CODE(GetLastError()));
+ return egl::EglBadAlloc() << "Failed to unlock D3D object, "
+ << gl::FmtErr(HRESULT_CODE(GetLastError()));
}
if (!mFunctionsWGL->dxUnregisterObjectNV(mDeviceHandle, mTextureHandle))
{
- return egl::Error(EGL_BAD_ALLOC, "Failed to unregister D3D object, error: 0x%08x.",
- HRESULT_CODE(GetLastError()));
+ return egl::EglBadAlloc() << "Failed to unregister D3D object, "
+ << gl::FmtErr(HRESULT_CODE(GetLastError()));
}
mTextureID = 0;
mTextureHandle = nullptr;
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
void DXGISwapChainWindowSurfaceWGL::setSwapInterval(EGLint interval)
@@ -297,12 +273,17 @@ FramebufferImpl *DXGISwapChainWindowSurfaceWGL::createDefaultFramebuffer(
mRenderer->getBlitter(), mStateManager);
}
+HDC DXGISwapChainWindowSurfaceWGL::getDC() const
+{
+ return mWGLDevice;
+}
+
egl::Error DXGISwapChainWindowSurfaceWGL::setObjectsLocked(bool locked)
{
if (mRenderbufferBufferHandle == nullptr)
{
ASSERT(mTextureHandle == nullptr);
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
HANDLE resources[] = {
@@ -314,20 +295,20 @@ egl::Error DXGISwapChainWindowSurfaceWGL::setObjectsLocked(bool locked)
{
if (!mFunctionsWGL->dxLockObjectsNV(mDeviceHandle, count, resources))
{
- return egl::Error(EGL_BAD_ALLOC, "Failed to lock object, error: 0x%08x.",
- HRESULT_CODE(GetLastError()));
+ return egl::EglBadAlloc()
+ << "Failed to lock object, " << gl::FmtErr(HRESULT_CODE(GetLastError()));
}
}
else
{
if (!mFunctionsWGL->dxUnlockObjectsNV(mDeviceHandle, count, resources))
{
- return egl::Error(EGL_BAD_ALLOC, "Failed to lock object, error: 0x%08x.",
- HRESULT_CODE(GetLastError()));
+ return egl::EglBadAlloc()
+ << "Failed to lock object, " << gl::FmtErr(HRESULT_CODE(GetLastError()));
}
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error DXGISwapChainWindowSurfaceWGL::checkForResize()
@@ -335,7 +316,7 @@ egl::Error DXGISwapChainWindowSurfaceWGL::checkForResize()
RECT rect;
if (!GetClientRect(mWindow, &rect))
{
- return egl::Error(EGL_BAD_NATIVE_WINDOW, "Failed to query the window size.");
+ return egl::EglBadNativeWindow() << "Failed to query the window size.";
}
size_t newWidth = rect.right - rect.left;
@@ -353,7 +334,7 @@ egl::Error DXGISwapChainWindowSurfaceWGL::checkForResize()
}
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
static IDXGIFactory *GetDXGIFactoryFromDevice(ID3D11Device *device)
@@ -411,7 +392,7 @@ egl::Error DXGISwapChainWindowSurfaceWGL::createSwapChain()
IDXGIFactory *dxgiFactory = GetDXGIFactoryFromDevice(mDevice);
if (dxgiFactory == nullptr)
{
- return egl::Error(EGL_BAD_NATIVE_WINDOW, "Failed to query the DXGIFactory.");
+ return egl::EglBadNativeWindow() << "Failed to query the DXGIFactory.";
}
IDXGIFactory2 *dxgiFactory2 = nullptr;
@@ -444,8 +425,8 @@ egl::Error DXGISwapChainWindowSurfaceWGL::createSwapChain()
SafeRelease(dxgiFactory);
if (FAILED(result))
{
- return egl::Error(EGL_BAD_ALLOC, "Failed to create swap chain for window, result: 0x%X",
- result);
+ return egl::EglBadAlloc()
+ << "Failed to create swap chain for window, " << gl::FmtHR(result);
}
mSwapChain = mSwapChain1;
@@ -475,8 +456,8 @@ egl::Error DXGISwapChainWindowSurfaceWGL::createSwapChain()
SafeRelease(dxgiFactory);
if (FAILED(result))
{
- return egl::Error(EGL_BAD_ALLOC, "Failed to create swap chain for window, result: 0x%X",
- result);
+ return egl::EglBadAlloc()
+ << "Failed to create swap chain for window, " << gl::FmtHR(result);
}
}
@@ -485,8 +466,8 @@ egl::Error DXGISwapChainWindowSurfaceWGL::createSwapChain()
reinterpret_cast<void **>(&colorBuffer));
if (FAILED(result))
{
- return egl::Error(EGL_BAD_ALLOC, "Failed to query texture from swap chain, result: 0x%X",
- result);
+ return egl::EglBadAlloc() << "Failed to query texture from swap chain, "
+ << gl::FmtHR(result);
}
mFunctionsGL->genRenderbuffers(1, &mColorRenderbufferID);
@@ -497,8 +478,8 @@ egl::Error DXGISwapChainWindowSurfaceWGL::createSwapChain()
SafeRelease(colorBuffer);
if (mRenderbufferBufferHandle == nullptr)
{
- return egl::Error(EGL_BAD_ALLOC, "Failed to register D3D object, error: 0x%X.",
- HRESULT_CODE(GetLastError()));
+ return egl::EglBadAlloc() << "Failed to register D3D object, "
+ << gl::FmtErr(HRESULT_CODE(GetLastError()));
}
// Rebind the surface to the texture if needed.
@@ -508,8 +489,8 @@ egl::Error DXGISwapChainWindowSurfaceWGL::createSwapChain()
GL_TEXTURE_2D, WGL_ACCESS_READ_WRITE_NV);
if (mTextureHandle == nullptr)
{
- return egl::Error(EGL_BAD_ALLOC, "Failed to register D3D object, error: 0x%X.",
- HRESULT_CODE(GetLastError()));
+ return egl::EglBadAlloc()
+ << "Failed to register D3D object, " << gl::FmtErr(HRESULT_CODE(GetLastError()));
}
}
@@ -548,6 +529,6 @@ egl::Error DXGISwapChainWindowSurfaceWGL::createSwapChain()
mFirstSwap = true;
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h
index a4c34a76f20..31a56b9fd3a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h
@@ -10,7 +10,7 @@
#ifndef LIBANGLE_RENDERER_GL_WGL_DXGISWAPCHAINSURFACEWGL_H_
#define LIBANGLE_RENDERER_GL_WGL_DXGISWAPCHAINSURFACEWGL_H_
-#include "libANGLE/renderer/gl/SurfaceGL.h"
+#include "libANGLE/renderer/gl/wgl/SurfaceWGL.h"
#include <GL/wglext.h>
@@ -23,7 +23,7 @@ class DisplayWGL;
class StateManagerGL;
struct WorkaroundsGL;
-class DXGISwapChainWindowSurfaceWGL : public SurfaceGL
+class DXGISwapChainWindowSurfaceWGL : public SurfaceWGL
{
public:
DXGISwapChainWindowSurfaceWGL(const egl::SurfaceState &state,
@@ -31,18 +31,21 @@ class DXGISwapChainWindowSurfaceWGL : public SurfaceGL
EGLNativeWindowType window,
ID3D11Device *device,
HANDLE deviceHandle,
- HGLRC wglContext,
HDC deviceContext,
const FunctionsGL *functionsGL,
const FunctionsWGL *functionsWGL,
EGLint orientation);
~DXGISwapChainWindowSurfaceWGL() override;
- egl::Error initialize(const DisplayImpl *displayImpl) override;
+ egl::Error initialize(const egl::Display *display) override;
egl::Error makeCurrent() override;
- egl::Error swap(const DisplayImpl *displayImpl) override;
- egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) 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;
@@ -56,6 +59,8 @@ class DXGISwapChainWindowSurfaceWGL : public SurfaceGL
FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &data) override;
+ HDC getDC() const override;
+
private:
egl::Error setObjectsLocked(bool locked);
egl::Error checkForResize();
@@ -74,7 +79,6 @@ class DXGISwapChainWindowSurfaceWGL : public SurfaceGL
HANDLE mDeviceHandle;
HDC mWGLDevice;
- HGLRC mWGLContext;
DXGI_FORMAT mSwapChainFormat;
UINT mSwapChainFlags;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
index daa6363d058..bc999c523b9 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
@@ -60,9 +60,11 @@ class FunctionsGLWindows : public FunctionsGL
DisplayWGL::DisplayWGL(const egl::DisplayState &state)
: DisplayGL(state),
+ mCurrentDC(nullptr),
mOpenGLModule(nullptr),
mFunctionsWGL(nullptr),
mFunctionsGL(nullptr),
+ mHasWGLCreateContextRobustness(false),
mHasRobustness(false),
mWindowClass(0),
mWindow(nullptr),
@@ -90,7 +92,7 @@ egl::Error DisplayWGL::initialize(egl::Display *display)
mOpenGLModule = LoadLibraryA("opengl32.dll");
if (!mOpenGLModule)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Failed to load OpenGL library.");
+ return egl::EglNotInitialized() << "Failed to load OpenGL library.";
}
mFunctionsWGL = new FunctionsWGL();
@@ -118,7 +120,7 @@ egl::Error DisplayWGL::initialize(egl::Display *display)
mWindowClass = RegisterClassA(&intermediateClassDesc);
if (!mWindowClass)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Failed to register intermediate OpenGL window class.");
+ return egl::EglNotInitialized() << "Failed to register intermediate OpenGL window class.";
}
HWND dummyWindow = CreateWindowExA(0,
@@ -135,13 +137,14 @@ egl::Error DisplayWGL::initialize(egl::Display *display)
nullptr);
if (!dummyWindow)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Failed to create dummy OpenGL window.");
+ return egl::EglNotInitialized() << "Failed to create dummy OpenGL window.";
}
HDC dummyDeviceContext = GetDC(dummyWindow);
if (!dummyDeviceContext)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Failed to get the device context of the dummy OpenGL window.");
+ return egl::EglNotInitialized()
+ << "Failed to get the device context of the dummy OpenGL window.";
}
const PIXELFORMATDESCRIPTOR pixelFormatDescriptor = wgl::GetDefaultPixelFormatDescriptor();
@@ -149,37 +152,32 @@ egl::Error DisplayWGL::initialize(egl::Display *display)
int dummyPixelFormat = ChoosePixelFormat(dummyDeviceContext, &pixelFormatDescriptor);
if (dummyPixelFormat == 0)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Could not find a compatible pixel format for the dummy OpenGL window.");
+ return egl::EglNotInitialized()
+ << "Could not find a compatible pixel format for the dummy OpenGL window.";
}
if (!SetPixelFormat(dummyDeviceContext, dummyPixelFormat, &pixelFormatDescriptor))
{
- return egl::Error(EGL_NOT_INITIALIZED, "Failed to set the pixel format on the intermediate OpenGL window.");
+ return egl::EglNotInitialized()
+ << "Failed to set the pixel format on the intermediate OpenGL window.";
}
HGLRC dummyWGLContext = mFunctionsWGL->createContext(dummyDeviceContext);
if (!dummyDeviceContext)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Failed to create a WGL context for the dummy OpenGL window.");
+ return egl::EglNotInitialized()
+ << "Failed to create a WGL context for the dummy OpenGL window.";
}
if (!mFunctionsWGL->makeCurrent(dummyDeviceContext, dummyWGLContext))
{
- return egl::Error(EGL_NOT_INITIALIZED, "Failed to make the dummy WGL context current.");
- }
-
- // Grab the GL version from this context and use it as the maximum version available.
- typedef const GLubyte* (GL_APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);
- PFNGLGETSTRINGPROC getString = reinterpret_cast<PFNGLGETSTRINGPROC>(GetProcAddress(mOpenGLModule, "glGetString"));
- if (!getString)
- {
- return egl::Error(EGL_NOT_INITIALIZED, "Failed to get glGetString pointer.");
+ return egl::EglNotInitialized() << "Failed to make the dummy WGL context current.";
}
// Reinitialize the wgl functions to grab the extensions
mFunctionsWGL->initialize(mOpenGLModule, dummyDeviceContext);
- bool hasWGLCreateContextRobustness =
+ mHasWGLCreateContextRobustness =
mFunctionsWGL->hasExtension("WGL_ARB_create_context_robustness");
// Destroy the dummy window and context
@@ -195,9 +193,8 @@ egl::Error DisplayWGL::initialize(egl::Display *display)
!mFunctionsWGL->hasExtension("WGL_EXT_create_context_es2_profile") &&
!mFunctionsWGL->hasExtension("WGL_EXT_create_context_es_profile"))
{
- return egl::Error(EGL_NOT_INITIALIZED,
- "Cannot create an OpenGL ES platform on Windows without "
- "the WGL_EXT_create_context_es(2)_profile extension.");
+ return egl::EglNotInitialized() << "Cannot create an OpenGL ES platform on Windows without "
+ "the WGL_EXT_create_context_es(2)_profile extension.";
}
// Create the real intermediate context and windows
@@ -215,13 +212,14 @@ egl::Error DisplayWGL::initialize(egl::Display *display)
nullptr);
if (!mWindow)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Failed to create intermediate OpenGL window.");
+ return egl::EglNotInitialized() << "Failed to create intermediate OpenGL window.";
}
mDeviceContext = GetDC(mWindow);
if (!mDeviceContext)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Failed to get the device context of the intermediate OpenGL window.");
+ return egl::EglNotInitialized()
+ << "Failed to get the device context of the intermediate OpenGL window.";
}
if (mFunctionsWGL->choosePixelFormatARB)
@@ -240,89 +238,20 @@ egl::Error DisplayWGL::initialize(egl::Display *display)
if (mPixelFormat == 0)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Could not find a compatible pixel format for the intermediate OpenGL window.");
+ return egl::EglNotInitialized()
+ << "Could not find a compatible pixel format for the intermediate OpenGL window.";
}
if (!SetPixelFormat(mDeviceContext, mPixelFormat, &pixelFormatDescriptor))
{
- return egl::Error(EGL_NOT_INITIALIZED, "Failed to set the pixel format on the intermediate OpenGL window.");
+ return egl::EglNotInitialized()
+ << "Failed to set the pixel format on the intermediate OpenGL window.";
}
if (mFunctionsWGL->createContextAttribsARB)
{
- int flags = 0;
- // TODO: allow debug contexts
- // TODO: handle robustness
-
- int mask = 0;
-
- if (requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE)
- {
- mask |= WGL_CONTEXT_ES_PROFILE_BIT_EXT;
- }
- else
- {
- // Request core profile
- mask |= WGL_CONTEXT_CORE_PROFILE_BIT_ARB;
- }
-
- std::vector<int> contextCreationAttributes;
-
- if (hasWGLCreateContextRobustness)
- {
- contextCreationAttributes.push_back(WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB);
- contextCreationAttributes.push_back(WGL_LOSE_CONTEXT_ON_RESET_ARB);
- }
-
- // Don't request a specific version unless the user wants one. WGL will return the highest version
- // that the driver supports if no version is requested.
- EGLint requestedMajorVersion = static_cast<EGLint>(
- displayAttributes.get(EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, EGL_DONT_CARE));
- EGLint requestedMinorVersion = static_cast<EGLint>(
- displayAttributes.get(EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, EGL_DONT_CARE));
- if (requestedMajorVersion != EGL_DONT_CARE && requestedMinorVersion != EGL_DONT_CARE)
- {
- contextCreationAttributes.push_back(WGL_CONTEXT_MAJOR_VERSION_ARB);
- contextCreationAttributes.push_back(requestedMajorVersion);
-
- contextCreationAttributes.push_back(WGL_CONTEXT_MINOR_VERSION_ARB);
- contextCreationAttributes.push_back(requestedMinorVersion);
- }
- else
- {
- // the ES profile will give us ES version 1.1 unless a higher version is requested.
- // Requesting version 2.0 will give us the highest compatible version available (2.0,
- // 3.0, 3.1, etc).
- if (requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE)
- {
- contextCreationAttributes.push_back(WGL_CONTEXT_MAJOR_VERSION_ARB);
- contextCreationAttributes.push_back(2);
-
- contextCreationAttributes.push_back(WGL_CONTEXT_MINOR_VERSION_ARB);
- contextCreationAttributes.push_back(0);
- }
- }
- // Set the flag attributes
- if (flags != 0)
- {
- contextCreationAttributes.push_back(WGL_CONTEXT_FLAGS_ARB);
- contextCreationAttributes.push_back(flags);
- }
-
- // Set the mask attribute
- if (mask != 0)
- {
- contextCreationAttributes.push_back(WGL_CONTEXT_PROFILE_MASK_ARB);
- contextCreationAttributes.push_back(mask);
- }
-
- // Signal the end of the attributes
- contextCreationAttributes.push_back(0);
- contextCreationAttributes.push_back(0);
-
- mWGLContext = mFunctionsWGL->createContextAttribsARB(mDeviceContext, nullptr,
- &contextCreationAttributes[0]);
+ mWGLContext = initializeContextAttribs(displayAttributes);
}
// If wglCreateContextAttribsARB is unavailable or failed, try the standard wglCreateContext
@@ -334,19 +263,21 @@ egl::Error DisplayWGL::initialize(egl::Display *display)
if (!mWGLContext)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Failed to create a WGL context for the intermediate OpenGL window.");
+ return egl::EglNotInitialized()
+ << "Failed to create a WGL context for the intermediate OpenGL window.";
}
if (!mFunctionsWGL->makeCurrent(mDeviceContext, mWGLContext))
{
- return egl::Error(EGL_NOT_INITIALIZED, "Failed to make the intermediate WGL context current.");
+ return egl::EglNotInitialized() << "Failed to make the intermediate WGL context current.";
}
+ mCurrentDC = mDeviceContext;
mFunctionsGL = new FunctionsGLWindows(mOpenGLModule, mFunctionsWGL->getProcAddress);
mFunctionsGL->initialize();
mHasRobustness = mFunctionsGL->getGraphicsResetStatus != nullptr;
- if (hasWGLCreateContextRobustness != mHasRobustness)
+ if (mHasWGLCreateContextRobustness != mHasRobustness)
{
WARN() << "WGL_ARB_create_context_robustness exists but unable to OpenGL context with "
"robustness.";
@@ -356,7 +287,7 @@ egl::Error DisplayWGL::initialize(egl::Display *display)
VendorID vendor = GetVendorID(mFunctionsGL);
if (requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE && IsIntel(vendor))
{
- return egl::Error(EGL_NOT_INITIALIZED, "Intel OpenGL ES drivers are not supported.");
+ return egl::EglNotInitialized() << "Intel OpenGL ES drivers are not supported.";
}
// Create DXGI swap chains for windows that come from other processes. Windows is unable to
@@ -388,7 +319,7 @@ egl::Error DisplayWGL::initialize(egl::Display *display)
else
{
// Want to use DXGI swap chains but WGL_NV_DX_interop2 is not present, fail initialization
- return egl::Error(EGL_NOT_INITIALIZED, "WGL_NV_DX_interop2 is required but not present.");
+ return egl::EglNotInitialized() << "WGL_NV_DX_interop2 is required but not present.";
}
}
@@ -402,6 +333,7 @@ void DisplayWGL::terminate()
releaseD3DDevice(mD3D11DeviceHandle);
mFunctionsWGL->makeCurrent(mDeviceContext, nullptr);
+ mCurrentDC = nullptr;
mFunctionsWGL->deleteContext(mWGLContext);
mWGLContext = nullptr;
@@ -451,13 +383,13 @@ SurfaceImpl *DisplayWGL::createWindowSurface(const egl::SurfaceState &state,
}
return new DXGISwapChainWindowSurfaceWGL(state, getRenderer(), window, mD3D11Device,
- mD3D11DeviceHandle, mWGLContext, mDeviceContext,
- mFunctionsGL, mFunctionsWGL, orientation);
+ mD3D11DeviceHandle, mDeviceContext, mFunctionsGL,
+ mFunctionsWGL, orientation);
}
else
{
- return new WindowSurfaceWGL(state, getRenderer(), window, mPixelFormat, mWGLContext,
- mFunctionsWGL, orientation);
+ return new WindowSurfaceWGL(state, getRenderer(), window, mPixelFormat, mFunctionsWGL,
+ orientation);
}
}
@@ -471,7 +403,7 @@ SurfaceImpl *DisplayWGL::createPbufferSurface(const egl::SurfaceState &state,
EGLenum textureTarget = static_cast<EGLenum>(attribs.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE));
return new PbufferSurfaceWGL(state, getRenderer(), width, height, textureFormat, textureTarget,
- largest, mPixelFormat, mDeviceContext, mWGLContext, mFunctionsWGL);
+ largest, mPixelFormat, mDeviceContext, mFunctionsWGL);
}
SurfaceImpl *DisplayWGL::createPbufferFromClientBuffer(const egl::SurfaceState &state,
@@ -485,7 +417,7 @@ SurfaceImpl *DisplayWGL::createPbufferFromClientBuffer(const egl::SurfaceState &
return nullptr;
}
- return new D3DTextureSurfaceWGL(state, getRenderer(), buftype, clientBuffer, this, mWGLContext,
+ return new D3DTextureSurfaceWGL(state, getRenderer(), buftype, clientBuffer, this,
mDeviceContext, mD3D11Device, mFunctionsGL, mFunctionsWGL);
}
@@ -500,7 +432,7 @@ SurfaceImpl *DisplayWGL::createPixmapSurface(const egl::SurfaceState &state,
egl::Error DisplayWGL::getDevice(DeviceImpl **device)
{
UNIMPLEMENTED();
- return egl::Error(EGL_BAD_DISPLAY);
+ return egl::EglBadDisplay();
}
egl::ConfigSet DisplayWGL::generateConfigs()
@@ -589,9 +521,9 @@ bool DisplayWGL::testDeviceLost()
return false;
}
-egl::Error DisplayWGL::restoreLostDevice()
+egl::Error DisplayWGL::restoreLostDevice(const egl::Display *display)
{
- return egl::Error(EGL_BAD_DISPLAY);
+ return egl::EglBadDisplay();
}
bool DisplayWGL::isValidNativeWindow(EGLNativeWindowType window) const
@@ -632,19 +564,19 @@ egl::Error DisplayWGL::initializeD3DDevice()
{
if (mD3D11Device != nullptr)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
mDxgiModule = LoadLibrary(TEXT("dxgi.dll"));
if (!mDxgiModule)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Failed to load DXGI library.");
+ return egl::EglNotInitialized() << "Failed to load DXGI library.";
}
mD3d11Module = LoadLibrary(TEXT("d3d11.dll"));
if (!mD3d11Module)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Failed to load d3d11 library.");
+ return egl::EglNotInitialized() << "Failed to load d3d11 library.";
}
PFN_D3D11_CREATE_DEVICE d3d11CreateDevice = nullptr;
@@ -652,15 +584,14 @@ egl::Error DisplayWGL::initializeD3DDevice()
GetProcAddress(mD3d11Module, "D3D11CreateDevice"));
if (d3d11CreateDevice == nullptr)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Could not retrieve D3D11CreateDevice address.");
+ return egl::EglNotInitialized() << "Could not retrieve D3D11CreateDevice address.";
}
HRESULT result = d3d11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0,
D3D11_SDK_VERSION, &mD3D11Device, nullptr, nullptr);
if (FAILED(result))
{
- return egl::Error(EGL_NOT_INITIALIZED, "Could not create D3D11 device, error: 0x%X",
- result);
+ return egl::EglNotInitialized() << "Could not create D3D11 device, " << gl::FmtHR(result);
}
egl::Error error = registerD3DDevice(mD3D11Device, &mD3D11DeviceHandle);
@@ -669,7 +600,7 @@ egl::Error DisplayWGL::initializeD3DDevice()
return error;
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
void DisplayWGL::generateExtensions(egl::DisplayExtensions *outExtensions) const
@@ -689,6 +620,8 @@ void DisplayWGL::generateExtensions(egl::DisplayExtensions *outExtensions) const
// Contexts are virtualized so textures can be shared globally
outExtensions->displayTextureShareGroup = true;
+
+ outExtensions->surfacelessContext = true;
}
void DisplayWGL::generateCaps(egl::Caps *outCaps) const
@@ -696,18 +629,45 @@ void DisplayWGL::generateCaps(egl::Caps *outCaps) const
outCaps->textureNPOT = true;
}
-egl::Error DisplayWGL::waitClient() const
+egl::Error DisplayWGL::makeCurrentSurfaceless(gl::Context *context)
+{
+ // Nothing to do because WGL always uses the same context and the previous surface can be left
+ // current.
+ return egl::NoError();
+}
+
+egl::Error DisplayWGL::waitClient(const gl::Context *context) const
{
// Unimplemented as this is not needed for WGL
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error DisplayWGL::waitNative(EGLint engine,
- egl::Surface *drawSurface,
- egl::Surface *readSurface) const
+egl::Error DisplayWGL::waitNative(const gl::Context *context, EGLint engine) const
{
// Unimplemented as this is not needed for WGL
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
+}
+
+egl::Error DisplayWGL::makeCurrent(egl::Surface *drawSurface,
+ egl::Surface *readSurface,
+ gl::Context *context)
+{
+ if (drawSurface)
+ {
+ SurfaceWGL *drawSurfaceWGL = GetImplAs<SurfaceWGL>(drawSurface);
+ HDC dc = drawSurfaceWGL->getDC();
+ if (dc != mCurrentDC)
+ {
+ if (!mFunctionsWGL->makeCurrent(dc, mWGLContext))
+ {
+ // TODO(geofflang): What error type here?
+ return egl::EglContextLost() << "Failed to make the WGL context current.";
+ }
+ mCurrentDC = dc;
+ }
+ }
+
+ return DisplayGL::makeCurrent(drawSurface, readSurface, context);
}
egl::Error DisplayWGL::registerD3DDevice(IUnknown *device, HANDLE *outHandle)
@@ -720,13 +680,13 @@ egl::Error DisplayWGL::registerD3DDevice(IUnknown *device, HANDLE *outHandle)
{
iter->second.refCount++;
*outHandle = iter->second.handle;
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
HANDLE handle = mFunctionsWGL->dxOpenDeviceNV(device);
if (!handle)
{
- return egl::Error(EGL_BAD_PARAMETER, "Failed to open D3D device.");
+ return egl::EglBadParameter() << "Failed to open D3D device.";
}
device->AddRef();
@@ -737,7 +697,7 @@ egl::Error DisplayWGL::registerD3DDevice(IUnknown *device, HANDLE *outHandle)
mRegisteredD3DDevices[device] = newDeviceInfo;
*outHandle = handle;
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
void DisplayWGL::releaseD3DDevice(HANDLE deviceHandle)
@@ -757,4 +717,78 @@ void DisplayWGL::releaseD3DDevice(HANDLE deviceHandle)
}
}
}
+
+HGLRC DisplayWGL::initializeContextAttribs(const egl::AttributeMap &eglAttributes) const
+{
+ EGLint requestedDisplayType = static_cast<EGLint>(
+ eglAttributes.get(EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE));
+
+ // Create a context of the requested version, if any.
+ gl::Version requestedVersion(static_cast<EGLint>(eglAttributes.get(
+ EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, EGL_DONT_CARE)),
+ static_cast<EGLint>(eglAttributes.get(
+ EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, EGL_DONT_CARE)));
+ if (static_cast<EGLint>(requestedVersion.major) != EGL_DONT_CARE &&
+ static_cast<EGLint>(requestedVersion.minor) != EGL_DONT_CARE)
+ {
+ int profileMask = 0;
+ if (requestedDisplayType != EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE &&
+ requestedVersion >= gl::Version(3, 2))
+ {
+ profileMask |= WGL_CONTEXT_CORE_PROFILE_BIT_ARB;
+ }
+ return createContextAttribs(requestedVersion, profileMask);
+ }
+
+ // Try all the GL version in order as a workaround for Mesa context creation where the driver
+ // doesn't automatically return the highest version available.
+ for (const auto &info : GenerateContextCreationToTry(requestedDisplayType, false))
+ {
+ int profileFlag = 0;
+ if (info.type == ContextCreationTry::Type::DESKTOP_CORE)
+ {
+ profileFlag |= WGL_CONTEXT_CORE_PROFILE_BIT_ARB;
+ }
+ else if (info.type == ContextCreationTry::Type::ES)
+ {
+ profileFlag |= WGL_CONTEXT_ES_PROFILE_BIT_EXT;
+ }
+
+ HGLRC context = createContextAttribs(info.version, profileFlag);
+ if (context != nullptr)
+ {
+ return context;
+ }
+ }
+
+ return nullptr;
+}
+
+HGLRC DisplayWGL::createContextAttribs(const gl::Version &version, int profileMask) const
+{
+ std::vector<int> attribs;
+
+ if (mHasWGLCreateContextRobustness)
+ {
+ attribs.push_back(WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB);
+ attribs.push_back(WGL_LOSE_CONTEXT_ON_RESET_ARB);
+ }
+
+ attribs.push_back(WGL_CONTEXT_MAJOR_VERSION_ARB);
+ attribs.push_back(version.major);
+
+ attribs.push_back(WGL_CONTEXT_MINOR_VERSION_ARB);
+ attribs.push_back(version.minor);
+
+ if (profileMask != 0)
+ {
+ attribs.push_back(WGL_CONTEXT_PROFILE_MASK_ARB);
+ attribs.push_back(profileMask);
+ }
+
+ attribs.push_back(0);
+ attribs.push_back(0);
+
+ return mFunctionsWGL->createContextAttribsARB(mDeviceContext, nullptr, &attribs[0]);
+}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.h
index 9e7477dfe22..baf5a6ab5bc 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.h
@@ -44,7 +44,7 @@ class DisplayWGL : public DisplayGL
egl::ConfigSet generateConfigs() override;
bool testDeviceLost() override;
- egl::Error restoreLostDevice() override;
+ egl::Error restoreLostDevice(const egl::Display *display) override;
bool isValidNativeWindow(EGLNativeWindowType window) const override;
egl::Error validateClientBuffer(const egl::Config *configuration,
@@ -56,10 +56,12 @@ class DisplayWGL : public DisplayGL
std::string getVendorString() const override;
- egl::Error waitClient() const override;
- egl::Error waitNative(EGLint engine,
- egl::Surface *drawSurface,
- egl::Surface *readSurface) const override;
+ egl::Error waitClient(const gl::Context *context) const override;
+ egl::Error waitNative(const gl::Context *context, EGLint engine) const override;
+
+ egl::Error makeCurrent(egl::Surface *drawSurface,
+ egl::Surface *readSurface,
+ gl::Context *context) override;
egl::Error registerD3DDevice(IUnknown *device, HANDLE *outHandle);
void releaseD3DDevice(HANDLE handle);
@@ -72,11 +74,19 @@ class DisplayWGL : public DisplayGL
void generateExtensions(egl::DisplayExtensions *outExtensions) const override;
void generateCaps(egl::Caps *outCaps) const override;
+ egl::Error makeCurrentSurfaceless(gl::Context *context) override;
+
+ HGLRC initializeContextAttribs(const egl::AttributeMap &eglAttributes) const;
+ HGLRC createContextAttribs(const gl::Version &version, int profileMask) const;
+
+ HDC mCurrentDC;
+
HMODULE mOpenGLModule;
FunctionsWGL *mFunctionsWGL;
FunctionsGL *mFunctionsGL;
+ bool mHasWGLCreateContextRobustness;
bool mHasRobustness;
ATOM mWindowClass;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp
index 0650e91e965..61b6228389a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp
@@ -25,16 +25,14 @@ PbufferSurfaceWGL::PbufferSurfaceWGL(const egl::SurfaceState &state,
bool largest,
int pixelFormat,
HDC deviceContext,
- HGLRC wglContext,
const FunctionsWGL *functions)
- : SurfaceGL(state, renderer),
+ : SurfaceWGL(state, renderer),
mWidth(width),
mHeight(height),
mLargest(largest),
mTextureFormat(textureFormat),
mTextureTarget(textureTarget),
mPixelFormat(pixelFormat),
- mShareWGLContext(wglContext),
mParentDeviceContext(deviceContext),
mPbuffer(nullptr),
mPbufferDeviceContext(nullptr),
@@ -72,7 +70,7 @@ static int GetWGLTextureTarget(EGLenum eglTextureTarget)
}
}
-egl::Error PbufferSurfaceWGL::initialize(const DisplayImpl *displayImpl)
+egl::Error PbufferSurfaceWGL::initialize(const egl::Display *display)
{
const int pbufferCreationAttributes[] =
{
@@ -87,7 +85,8 @@ egl::Error PbufferSurfaceWGL::initialize(const DisplayImpl *displayImpl)
if (mPbuffer == nullptr)
{
DWORD error = GetLastError();
- return egl::Error(EGL_BAD_ALLOC, "Failed to create a native WGL pbuffer, error: 0x%08x.", HRESULT_CODE(error));
+ return egl::EglBadAlloc() << "Failed to create a native WGL pbuffer, "
+ << gl::FmtErr(HRESULT_CODE(error));
}
// The returned pbuffer may not be as large as requested, update the size members.
@@ -95,7 +94,8 @@ egl::Error PbufferSurfaceWGL::initialize(const DisplayImpl *displayImpl)
mFunctionsWGL->queryPbufferARB(mPbuffer, WGL_PBUFFER_HEIGHT_ARB, &mHeight) != TRUE)
{
DWORD error = GetLastError();
- return egl::Error(EGL_BAD_ALLOC, "Failed to query the WGL pbuffer's dimensions, error: 0x%08x.", HRESULT_CODE(error));
+ return egl::EglBadAlloc() << "Failed to query the WGL pbuffer's dimensions, "
+ << gl::FmtErr(HRESULT_CODE(error));
}
mPbufferDeviceContext = mFunctionsWGL->getPbufferDCARB(mPbuffer);
@@ -105,37 +105,36 @@ egl::Error PbufferSurfaceWGL::initialize(const DisplayImpl *displayImpl)
mPbuffer = nullptr;
DWORD error = GetLastError();
- return egl::Error(EGL_BAD_ALLOC, "Failed to get the WGL pbuffer handle, error: 0x%08x.", HRESULT_CODE(error));
+ return egl::EglBadAlloc() << "Failed to get the WGL pbuffer handle, "
+ << gl::FmtErr(HRESULT_CODE(error));
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error PbufferSurfaceWGL::makeCurrent()
{
- if (!mFunctionsWGL->makeCurrent(mPbufferDeviceContext, mShareWGLContext))
- {
- // TODO: What error type here?
- return egl::Error(EGL_CONTEXT_LOST, "Failed to make the WGL context current.");
- }
-
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error PbufferSurfaceWGL::swap(const DisplayImpl *displayImpl)
+egl::Error PbufferSurfaceWGL::swap(const gl::Context *context)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error PbufferSurfaceWGL::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
+egl::Error PbufferSurfaceWGL::postSubBuffer(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error PbufferSurfaceWGL::querySurfacePointerANGLE(EGLint attribute, void **value)
{
*value = nullptr;
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
static int GetWGLBufferBindTarget(EGLint buffer)
@@ -152,10 +151,11 @@ egl::Error PbufferSurfaceWGL::bindTexImage(gl::Texture *texture, EGLint buffer)
if (!mFunctionsWGL->bindTexImageARB(mPbuffer, GetWGLBufferBindTarget(buffer)))
{
DWORD error = GetLastError();
- return egl::Error(EGL_BAD_SURFACE, "Failed to bind native wgl pbuffer, error: 0x%08x.", HRESULT_CODE(error));
+ return egl::EglBadSurface()
+ << "Failed to bind native wgl pbuffer, " << gl::FmtErr(HRESULT_CODE(error));
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error PbufferSurfaceWGL::releaseTexImage(EGLint buffer)
@@ -163,10 +163,11 @@ egl::Error PbufferSurfaceWGL::releaseTexImage(EGLint buffer)
if (!mFunctionsWGL->releaseTexImageARB(mPbuffer, GetWGLBufferBindTarget(buffer)))
{
DWORD error = GetLastError();
- return egl::Error(EGL_BAD_SURFACE, "Failed to unbind native wgl pbuffer, error: 0x%08x.", HRESULT_CODE(error));
+ return egl::EglBadSurface()
+ << "Failed to unbind native wgl pbuffer, " << gl::FmtErr(HRESULT_CODE(error));
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
void PbufferSurfaceWGL::setSwapInterval(EGLint interval)
@@ -193,4 +194,8 @@ EGLint PbufferSurfaceWGL::getSwapBehavior() const
return EGL_BUFFER_PRESERVED;
}
+HDC PbufferSurfaceWGL::getDC() const
+{
+ return mPbufferDeviceContext;
+}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h
index aed427921ef..a60f14d9886 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h
@@ -9,7 +9,7 @@
#ifndef LIBANGLE_RENDERER_GL_WGL_PBUFFERSURFACEWGL_H_
#define LIBANGLE_RENDERER_GL_WGL_PBUFFERSURFACEWGL_H_
-#include "libANGLE/renderer/gl/SurfaceGL.h"
+#include "libANGLE/renderer/gl/wgl/SurfaceWGL.h"
#include <GL/wglext.h>
@@ -18,7 +18,7 @@ namespace rx
class FunctionsWGL;
-class PbufferSurfaceWGL : public SurfaceGL
+class PbufferSurfaceWGL : public SurfaceWGL
{
public:
PbufferSurfaceWGL(const egl::SurfaceState &state,
@@ -30,15 +30,18 @@ class PbufferSurfaceWGL : public SurfaceGL
bool largest,
int pixelFormat,
HDC deviceContext,
- HGLRC wglContext,
const FunctionsWGL *functions);
~PbufferSurfaceWGL() override;
- egl::Error initialize(const DisplayImpl *displayImpl) override;
+ egl::Error initialize(const egl::Display *display) override;
egl::Error makeCurrent() override;
- egl::Error swap(const DisplayImpl *displayImpl) override;
- egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) 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;
@@ -50,6 +53,8 @@ class PbufferSurfaceWGL : public SurfaceGL
EGLint isPostSubBufferSupported() const override;
EGLint getSwapBehavior() const override;
+ HDC getDC() const override;
+
private:
EGLint mWidth;
EGLint mHeight;
@@ -59,8 +64,6 @@ class PbufferSurfaceWGL : public SurfaceGL
int mPixelFormat;
- HGLRC mShareWGLContext;
-
HDC mParentDeviceContext;
HPBUFFERARB mPbuffer;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/SurfaceWGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/SurfaceWGL.h
new file mode 100644
index 00000000000..98623ffe3fe
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/SurfaceWGL.h
@@ -0,0 +1,27 @@
+//
+// Copyright (c) 2017 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// SurfaceWGL.h: Base class for WGL surface types
+
+#ifndef LIBANGLE_RENDERER_GL_WGL_SURFACEWGL_H_
+#define LIBANGLE_RENDERER_GL_WGL_SURFACEWGL_H_
+
+#include "libANGLE/renderer/gl/SurfaceGL.h"
+
+namespace rx
+{
+class SurfaceWGL : public SurfaceGL
+{
+ public:
+ SurfaceWGL(const egl::SurfaceState &state, RendererGL *renderer) : SurfaceGL(state, renderer) {}
+
+ ~SurfaceWGL() override {}
+
+ virtual HDC getDC() const = 0;
+};
+} // namespace rx
+
+#endif // LIBANGLE_RENDERER_GL_WGL_SURFACEWGL_H_
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp
index b6865477bce..2d43e692e77 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp
@@ -20,12 +20,10 @@ WindowSurfaceWGL::WindowSurfaceWGL(const egl::SurfaceState &state,
RendererGL *renderer,
EGLNativeWindowType window,
int pixelFormat,
- HGLRC wglContext,
const FunctionsWGL *functions,
EGLint orientation)
- : SurfaceGL(state, renderer),
+ : SurfaceWGL(state, renderer),
mPixelFormat(pixelFormat),
- mWGLContext(wglContext),
mWindow(window),
mDeviceContext(nullptr),
mFunctionsWGL(functions),
@@ -41,13 +39,14 @@ WindowSurfaceWGL::~WindowSurfaceWGL()
mDeviceContext = nullptr;
}
-egl::Error WindowSurfaceWGL::initialize(const DisplayImpl *displayImpl)
+egl::Error WindowSurfaceWGL::initialize(const egl::Display *display)
{
mDeviceContext = GetDC(mWindow);
if (!mDeviceContext)
{
- return egl::Error(EGL_BAD_NATIVE_WINDOW, "Failed to get the device context from the native window, "
- "error: 0x%X.", GetLastError());
+ return egl::EglBadNativeWindow()
+ << "Failed to get the device context from the native window, "
+ << gl::FmtErr(GetLastError());
}
// Require that the pixel format for this window has not been set yet or is equal to the Display's pixel format.
@@ -57,18 +56,21 @@ egl::Error WindowSurfaceWGL::initialize(const DisplayImpl *displayImpl)
PIXELFORMATDESCRIPTOR pixelFormatDescriptor = { 0 };
if (!DescribePixelFormat(mDeviceContext, mPixelFormat, sizeof(pixelFormatDescriptor), &pixelFormatDescriptor))
{
- return egl::Error(EGL_BAD_NATIVE_WINDOW, "Failed to DescribePixelFormat, error: 0x%X.", GetLastError());
+ return egl::EglBadNativeWindow()
+ << "Failed to DescribePixelFormat, " << gl::FmtErr(GetLastError());
}
if (!SetPixelFormat(mDeviceContext, mPixelFormat, &pixelFormatDescriptor))
{
- return egl::Error(EGL_NOT_INITIALIZED, "Failed to set the pixel format on the device context, "
- "error: 0x%X.", GetLastError());
+ return egl::EglNotInitialized()
+ << "Failed to set the pixel format on the device context, "
+ << gl::FmtErr(GetLastError());
}
}
else if (windowPixelFormat != mPixelFormat)
{
- return egl::Error(EGL_NOT_INITIALIZED, "Pixel format of the NativeWindow and NativeDisplayType must match.");
+ return egl::EglNotInitialized()
+ << "Pixel format of the NativeWindow and NativeDisplayType must match.";
}
// Check for the swap behavior of this pixel format
@@ -86,53 +88,51 @@ egl::Error WindowSurfaceWGL::initialize(const DisplayImpl *displayImpl)
break;
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error WindowSurfaceWGL::makeCurrent()
{
- if (!mFunctionsWGL->makeCurrent(mDeviceContext, mWGLContext))
- {
- // TODO: What error type here?
- return egl::Error(EGL_CONTEXT_LOST, "Failed to make the WGL context current.");
- }
-
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error WindowSurfaceWGL::swap(const DisplayImpl *displayImpl)
+egl::Error WindowSurfaceWGL::swap(const gl::Context *context)
{
if (!mFunctionsWGL->swapBuffers(mDeviceContext))
{
// TODO: What error type here?
- return egl::Error(EGL_CONTEXT_LOST, "Failed to swap buffers on the child window.");
+ return egl::EglContextLost() << "Failed to swap buffers on the child window.";
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error WindowSurfaceWGL::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
+egl::Error WindowSurfaceWGL::postSubBuffer(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height)
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error WindowSurfaceWGL::querySurfacePointerANGLE(EGLint attribute, void **value)
{
*value = nullptr;
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error WindowSurfaceWGL::bindTexImage(gl::Texture *texture, EGLint buffer)
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error WindowSurfaceWGL::releaseTexImage(EGLint buffer)
{
UNIMPLEMENTED();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
void WindowSurfaceWGL::setSwapInterval(EGLint interval)
@@ -175,4 +175,8 @@ EGLint WindowSurfaceWGL::getSwapBehavior() const
return mSwapBehavior;
}
+HDC WindowSurfaceWGL::getDC() const
+{
+ return mDeviceContext;
+}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h
index 981ef41bc9c..cda22257a74 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h
@@ -9,7 +9,7 @@
#ifndef LIBANGLE_RENDERER_GL_WGL_WINDOWSURFACEWGL_H_
#define LIBANGLE_RENDERER_GL_WGL_WINDOWSURFACEWGL_H_
-#include "libANGLE/renderer/gl/SurfaceGL.h"
+#include "libANGLE/renderer/gl/wgl/SurfaceWGL.h"
#include <GL/wglext.h>
@@ -18,23 +18,26 @@ namespace rx
class FunctionsWGL;
-class WindowSurfaceWGL : public SurfaceGL
+class WindowSurfaceWGL : public SurfaceWGL
{
public:
WindowSurfaceWGL(const egl::SurfaceState &state,
RendererGL *renderer,
EGLNativeWindowType window,
int pixelFormat,
- HGLRC wglContext,
const FunctionsWGL *functions,
EGLint orientation);
~WindowSurfaceWGL() override;
- egl::Error initialize(const DisplayImpl *displayImpl) override;
+ egl::Error initialize(const egl::Display *display) override;
egl::Error makeCurrent() override;
- egl::Error swap(const DisplayImpl *displayImpl) override;
- egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) 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;
@@ -46,11 +49,11 @@ class WindowSurfaceWGL : public SurfaceGL
EGLint isPostSubBufferSupported() const override;
EGLint getSwapBehavior() const override;
+ HDC getDC() const override;
+
private:
int mPixelFormat;
- HGLRC mWGLContext;
-
HWND mWindow;
HDC mDeviceContext;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/BufferNULL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/null/BufferNULL.cpp
index 0c5300dd150..97c6a59c1bd 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/BufferNULL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/BufferNULL.cpp
@@ -29,7 +29,7 @@ BufferNULL::~BufferNULL()
ASSERT(memoryReleaseResult);
}
-gl::Error BufferNULL::setData(ContextImpl *context,
+gl::Error BufferNULL::setData(const gl::Context *context,
GLenum target,
const void *data,
size_t size,
@@ -48,7 +48,7 @@ gl::Error BufferNULL::setData(ContextImpl *context,
return gl::NoError();
}
-gl::Error BufferNULL::setSubData(ContextImpl *context,
+gl::Error BufferNULL::setSubData(const gl::Context *context,
GLenum target,
const void *data,
size_t size,
@@ -61,7 +61,7 @@ gl::Error BufferNULL::setSubData(ContextImpl *context,
return gl::NoError();
}
-gl::Error BufferNULL::copySubData(ContextImpl *context,
+gl::Error BufferNULL::copySubData(const gl::Context *context,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
@@ -75,13 +75,13 @@ gl::Error BufferNULL::copySubData(ContextImpl *context,
return gl::NoError();
}
-gl::Error BufferNULL::map(ContextImpl *context, GLenum access, void **mapPtr)
+gl::Error BufferNULL::map(const gl::Context *context, GLenum access, void **mapPtr)
{
*mapPtr = mData.data();
return gl::NoError();
}
-gl::Error BufferNULL::mapRange(ContextImpl *context,
+gl::Error BufferNULL::mapRange(const gl::Context *context,
size_t offset,
size_t length,
GLbitfield access,
@@ -91,7 +91,7 @@ gl::Error BufferNULL::mapRange(ContextImpl *context,
return gl::NoError();
}
-gl::Error BufferNULL::unmap(ContextImpl *context, GLboolean *result)
+gl::Error BufferNULL::unmap(const gl::Context *context, GLboolean *result)
{
*result = GL_TRUE;
return gl::NoError();
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/BufferNULL.h b/chromium/third_party/angle/src/libANGLE/renderer/null/BufferNULL.h
index 6ba23cdb520..b8fa1634a49 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/BufferNULL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/BufferNULL.h
@@ -23,28 +23,28 @@ class BufferNULL : public BufferImpl
BufferNULL(const gl::BufferState &state, AllocationTrackerNULL *allocationTracker);
~BufferNULL() override;
- gl::Error setData(ContextImpl *context,
+ gl::Error setData(const gl::Context *context,
GLenum target,
const void *data,
size_t size,
GLenum usage) override;
- gl::Error setSubData(ContextImpl *context,
+ gl::Error setSubData(const gl::Context *context,
GLenum target,
const void *data,
size_t size,
size_t offset) override;
- gl::Error copySubData(ContextImpl *contextImpl,
+ gl::Error copySubData(const gl::Context *context,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size) override;
- gl::Error map(ContextImpl *contextImpl, GLenum access, void **mapPtr) override;
- gl::Error mapRange(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl, GLboolean *result) override;
+ gl::Error unmap(const gl::Context *context, GLboolean *result) override;
gl::Error getIndexRange(GLenum type,
size_t offset,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.cpp
index 4532541620c..14e6f6b712f 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.cpp
@@ -92,12 +92,16 @@ gl::Error ContextNULL::finish()
return gl::NoError();
}
-gl::Error ContextNULL::drawArrays(GLenum mode, GLint first, GLsizei count)
+gl::Error ContextNULL::drawArrays(const gl::Context *context,
+ GLenum mode,
+ GLint first,
+ GLsizei count)
{
return gl::NoError();
}
-gl::Error ContextNULL::drawArraysInstanced(GLenum mode,
+gl::Error ContextNULL::drawArraysInstanced(const gl::Context *context,
+ GLenum mode,
GLint first,
GLsizei count,
GLsizei instanceCount)
@@ -105,7 +109,8 @@ gl::Error ContextNULL::drawArraysInstanced(GLenum mode,
return gl::NoError();
}
-gl::Error ContextNULL::drawElements(GLenum mode,
+gl::Error ContextNULL::drawElements(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
@@ -114,7 +119,8 @@ gl::Error ContextNULL::drawElements(GLenum mode,
return gl::NoError();
}
-gl::Error ContextNULL::drawElementsInstanced(GLenum mode,
+gl::Error ContextNULL::drawElementsInstanced(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
@@ -124,7 +130,8 @@ gl::Error ContextNULL::drawElementsInstanced(GLenum mode,
return gl::NoError();
}
-gl::Error ContextNULL::drawRangeElements(GLenum mode,
+gl::Error ContextNULL::drawRangeElements(const gl::Context *context,
+ GLenum mode,
GLuint start,
GLuint end,
GLsizei count,
@@ -135,12 +142,17 @@ gl::Error ContextNULL::drawRangeElements(GLenum mode,
return gl::NoError();
}
-gl::Error ContextNULL::drawArraysIndirect(GLenum mode, const void *indirect)
+gl::Error ContextNULL::drawArraysIndirect(const gl::Context *context,
+ GLenum mode,
+ const void *indirect)
{
return gl::NoError();
}
-gl::Error ContextNULL::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
+gl::Error ContextNULL::drawElementsIndirect(const gl::Context *context,
+ GLenum mode,
+ GLenum type,
+ const void *indirect)
{
return gl::NoError();
}
@@ -250,7 +262,7 @@ void ContextNULL::popGroupMarker()
{
}
-void ContextNULL::syncState(const gl::State::DirtyBits &dirtyBits)
+void ContextNULL::syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits)
{
}
@@ -264,7 +276,7 @@ GLint64 ContextNULL::getTimestamp()
return 0;
}
-void ContextNULL::onMakeCurrent(const gl::ContextState &data)
+void ContextNULL::onMakeCurrent(const gl::Context *context)
{
}
@@ -363,7 +375,10 @@ std::vector<PathImpl *> ContextNULL::createPaths(GLsizei range)
return result;
}
-gl::Error ContextNULL::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
+gl::Error ContextNULL::dispatchCompute(const gl::Context *context,
+ GLuint numGroupsX,
+ GLuint numGroupsY,
+ GLuint numGroupsZ)
{
return gl::NoError();
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.h b/chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.h
index 0da4880acd5..0fe79ed0360 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.h
@@ -43,32 +43,44 @@ class ContextNULL : public ContextImpl
gl::Error finish() override;
// Drawing methods.
- gl::Error drawArrays(GLenum mode, GLint first, GLsizei count) override;
- gl::Error drawArraysInstanced(GLenum mode,
+ 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(GLenum mode,
+ gl::Error drawElements(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
const gl::IndexRange &indexRange) override;
- gl::Error drawElementsInstanced(GLenum mode,
+ gl::Error drawElementsInstanced(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
GLsizei instances,
const gl::IndexRange &indexRange) override;
- gl::Error drawRangeElements(GLenum mode,
+ gl::Error drawRangeElements(const gl::Context *context,
+ GLenum mode,
GLuint start,
GLuint end,
GLsizei count,
GLenum type,
const void *indices,
const gl::IndexRange &indexRange) override;
- gl::Error drawArraysIndirect(GLenum mode, const void *indirect) override;
- gl::Error drawElementsIndirect(GLenum mode, GLenum type, const void *indirect) 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;
// CHROMIUM_path_rendering path drawing methods.
void stencilFillPath(const gl::Path *path, GLenum fillMode, GLuint mask) override;
@@ -129,14 +141,14 @@ class ContextNULL : public ContextImpl
void popGroupMarker() override;
// State sync with dirty bits.
- void syncState(const gl::State::DirtyBits &dirtyBits) override;
+ 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::ContextState &data) override;
+ void onMakeCurrent(const gl::Context *context) override;
// Native capabilities, unmodified by gl::Context.
const gl::Caps &getNativeCaps() const override;
@@ -178,7 +190,10 @@ class ContextNULL : public ContextImpl
std::vector<PathImpl *> createPaths(GLsizei range) override;
- gl::Error dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ) override;
+ gl::Error dispatchCompute(const gl::Context *context,
+ GLuint numGroupsX,
+ GLuint numGroupsY,
+ GLuint numGroupsZ) override;
private:
gl::Caps mCaps;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/DeviceNULL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/null/DeviceNULL.cpp
index 4735eea41ac..80023b6c0da 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/DeviceNULL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/DeviceNULL.cpp
@@ -25,7 +25,7 @@ DeviceNULL::~DeviceNULL()
egl::Error DeviceNULL::getDevice(void **outValue)
{
UNIMPLEMENTED();
- return egl::Error(EGL_BAD_ACCESS);
+ return egl::EglBadAccess();
}
EGLint DeviceNULL::getType()
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/DisplayNULL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/null/DisplayNULL.cpp
index 61b3a8a700d..a90938ed459 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/DisplayNULL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/DisplayNULL.cpp
@@ -98,7 +98,7 @@ bool DisplayNULL::testDeviceLost()
return false;
}
-egl::Error DisplayNULL::restoreLostDevice()
+egl::Error DisplayNULL::restoreLostDevice(const egl::Display *display)
{
return egl::NoError();
}
@@ -119,14 +119,12 @@ egl::Error DisplayNULL::getDevice(DeviceImpl **device)
return egl::NoError();
}
-egl::Error DisplayNULL::waitClient() const
+egl::Error DisplayNULL::waitClient(const gl::Context *context) const
{
return egl::NoError();
}
-egl::Error DisplayNULL::waitNative(EGLint engine,
- egl::Surface *drawSurface,
- egl::Surface *readSurface) const
+egl::Error DisplayNULL::waitNative(const gl::Context *context, EGLint engine) const
{
return egl::NoError();
}
@@ -203,6 +201,7 @@ void DisplayNULL::generateExtensions(egl::DisplayExtensions *outExtensions) cons
outExtensions->createContextWebGLCompatibility = true;
outExtensions->createContextBindGeneratesResource = true;
outExtensions->swapBuffersWithDamage = true;
+ outExtensions->surfacelessContext = true;
}
void DisplayNULL::generateCaps(egl::Caps *outCaps) const
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/DisplayNULL.h b/chromium/third_party/angle/src/libANGLE/renderer/null/DisplayNULL.h
index a91c215b116..572724cc735 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/DisplayNULL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/DisplayNULL.h
@@ -33,7 +33,7 @@ class DisplayNULL : public DisplayImpl
egl::ConfigSet generateConfigs() override;
bool testDeviceLost() override;
- egl::Error restoreLostDevice() override;
+ egl::Error restoreLostDevice(const egl::Display *display) override;
bool isValidNativeWindow(EGLNativeWindowType window) const override;
@@ -41,10 +41,8 @@ class DisplayNULL : public DisplayImpl
egl::Error getDevice(DeviceImpl **device) override;
- egl::Error waitClient() const override;
- egl::Error waitNative(EGLint engine,
- egl::Surface *drawSurface,
- egl::Surface *readSurface) 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;
SurfaceImpl *createWindowSurface(const egl::SurfaceState &state,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/FenceNVNULL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/null/FenceNVNULL.cpp
index 9d7f26043e2..c9d747a4c87 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/FenceNVNULL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/FenceNVNULL.cpp
@@ -25,19 +25,19 @@ FenceNVNULL::~FenceNVNULL()
gl::Error FenceNVNULL::set(GLenum condition)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error FenceNVNULL::test(GLboolean *outFinished)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error FenceNVNULL::finish()
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/FramebufferNULL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/null/FramebufferNULL.cpp
index 4744fa7f46d..b64dd2ad668 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/FramebufferNULL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/FramebufferNULL.cpp
@@ -24,29 +24,34 @@ FramebufferNULL::~FramebufferNULL()
{
}
-gl::Error FramebufferNULL::discard(size_t count, const GLenum *attachments)
+gl::Error FramebufferNULL::discard(const gl::Context *context,
+ size_t count,
+ const GLenum *attachments)
{
return gl::NoError();
}
-gl::Error FramebufferNULL::invalidate(size_t count, const GLenum *attachments)
+gl::Error FramebufferNULL::invalidate(const gl::Context *context,
+ size_t count,
+ const GLenum *attachments)
{
return gl::NoError();
}
-gl::Error FramebufferNULL::invalidateSub(size_t count,
+gl::Error FramebufferNULL::invalidateSub(const gl::Context *context,
+ size_t count,
const GLenum *attachments,
const gl::Rectangle &area)
{
return gl::NoError();
}
-gl::Error FramebufferNULL::clear(ContextImpl *context, GLbitfield mask)
+gl::Error FramebufferNULL::clear(const gl::Context *context, GLbitfield mask)
{
return gl::NoError();
}
-gl::Error FramebufferNULL::clearBufferfv(ContextImpl *context,
+gl::Error FramebufferNULL::clearBufferfv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLfloat *values)
@@ -54,7 +59,7 @@ gl::Error FramebufferNULL::clearBufferfv(ContextImpl *context,
return gl::NoError();
}
-gl::Error FramebufferNULL::clearBufferuiv(ContextImpl *context,
+gl::Error FramebufferNULL::clearBufferuiv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLuint *values)
@@ -62,7 +67,7 @@ gl::Error FramebufferNULL::clearBufferuiv(ContextImpl *context,
return gl::NoError();
}
-gl::Error FramebufferNULL::clearBufferiv(ContextImpl *context,
+gl::Error FramebufferNULL::clearBufferiv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLint *values)
@@ -70,7 +75,7 @@ gl::Error FramebufferNULL::clearBufferiv(ContextImpl *context,
return gl::NoError();
}
-gl::Error FramebufferNULL::clearBufferfi(ContextImpl *context,
+gl::Error FramebufferNULL::clearBufferfi(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
GLfloat depth,
@@ -79,7 +84,7 @@ gl::Error FramebufferNULL::clearBufferfi(ContextImpl *context,
return gl::NoError();
}
-GLenum FramebufferNULL::getImplementationColorReadFormat() const
+GLenum FramebufferNULL::getImplementationColorReadFormat(const gl::Context *context) const
{
const gl::FramebufferAttachment *readAttachment = mState.getReadAttachment();
if (readAttachment == nullptr)
@@ -92,7 +97,7 @@ GLenum FramebufferNULL::getImplementationColorReadFormat() const
return format.info->getReadPixelsFormat();
}
-GLenum FramebufferNULL::getImplementationColorReadType() const
+GLenum FramebufferNULL::getImplementationColorReadType(const gl::Context *context) const
{
const gl::FramebufferAttachment *readAttachment = mState.getReadAttachment();
if (readAttachment == nullptr)
@@ -105,7 +110,7 @@ GLenum FramebufferNULL::getImplementationColorReadType() const
return format.info->getReadPixelsType();
}
-gl::Error FramebufferNULL::readPixels(ContextImpl *context,
+gl::Error FramebufferNULL::readPixels(const gl::Context *context,
const gl::Rectangle &area,
GLenum format,
GLenum type,
@@ -114,7 +119,7 @@ gl::Error FramebufferNULL::readPixels(ContextImpl *context,
return gl::NoError();
}
-gl::Error FramebufferNULL::blit(ContextImpl *context,
+gl::Error FramebufferNULL::blit(const gl::Context *context,
const gl::Rectangle &sourceArea,
const gl::Rectangle &destArea,
GLbitfield mask,
@@ -128,7 +133,7 @@ bool FramebufferNULL::checkStatus() const
return true;
}
-void FramebufferNULL::syncState(ContextImpl *contextImpl,
+void FramebufferNULL::syncState(const gl::Context *context,
const gl::Framebuffer::DirtyBits &dirtyBits)
{
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/FramebufferNULL.h b/chromium/third_party/angle/src/libANGLE/renderer/null/FramebufferNULL.h
index 93756d76ad7..f2201041e46 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/FramebufferNULL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/FramebufferNULL.h
@@ -21,40 +21,43 @@ class FramebufferNULL : public FramebufferImpl
FramebufferNULL(const gl::FramebufferState &state);
~FramebufferNULL() override;
- gl::Error discard(size_t count, const GLenum *attachments) override;
- gl::Error invalidate(size_t count, const GLenum *attachments) override;
- gl::Error invalidateSub(size_t count,
+ 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 clear(ContextImpl *context, GLbitfield mask) override;
- gl::Error clearBufferfv(ContextImpl *context,
+ 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(ContextImpl *context,
+ gl::Error clearBufferuiv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLuint *values) override;
- gl::Error clearBufferiv(ContextImpl *context,
+ gl::Error clearBufferiv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLint *values) override;
- gl::Error clearBufferfi(ContextImpl *context,
+ gl::Error clearBufferfi(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
GLfloat depth,
GLint stencil) override;
- GLenum getImplementationColorReadFormat() const override;
- GLenum getImplementationColorReadType() const override;
- gl::Error readPixels(ContextImpl *context,
+ 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) const override;
- gl::Error blit(ContextImpl *context,
+ gl::Error blit(const gl::Context *context,
const gl::Rectangle &sourceArea,
const gl::Rectangle &destArea,
GLbitfield mask,
@@ -62,7 +65,8 @@ class FramebufferNULL : public FramebufferImpl
bool checkStatus() const override;
- void syncState(ContextImpl *contextImpl, const gl::Framebuffer::DirtyBits &dirtyBits) override;
+ void syncState(const gl::Context *context,
+ const gl::Framebuffer::DirtyBits &dirtyBits) override;
gl::Error getSamplePosition(size_t index, GLfloat *xy) const override;
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/ImageNULL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/null/ImageNULL.cpp
index 86ba25f12a8..d106bf64869 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/ImageNULL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/ImageNULL.cpp
@@ -25,13 +25,13 @@ ImageNULL::~ImageNULL()
egl::Error ImageNULL::initialize()
{
UNIMPLEMENTED();
- return egl::Error(EGL_BAD_ACCESS);
+ return egl::EglBadAccess();
}
-gl::Error ImageNULL::orphan(egl::ImageSibling *sibling)
+gl::Error ImageNULL::orphan(const gl::Context *context, egl::ImageSibling *sibling)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/ImageNULL.h b/chromium/third_party/angle/src/libANGLE/renderer/null/ImageNULL.h
index e332d00792d..012f840cc67 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/ImageNULL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/ImageNULL.h
@@ -22,7 +22,7 @@ class ImageNULL : public ImageImpl
~ImageNULL() override;
egl::Error initialize() override;
- gl::Error orphan(egl::ImageSibling *sibling) override;
+ gl::Error orphan(const gl::Context *context, egl::ImageSibling *sibling) override;
};
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/PathNULL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/null/PathNULL.cpp
index bb52ea2c29d..ad0c8d59655 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/PathNULL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/PathNULL.cpp
@@ -29,7 +29,7 @@ gl::Error PathNULL::setCommands(GLsizei numCommands,
const void *coords)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
void PathNULL::setPathParameter(GLenum pname, GLfloat value)
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/ProgramNULL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/null/ProgramNULL.cpp
index 35bd46db535..cee30dd08ad 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/ProgramNULL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/ProgramNULL.cpp
@@ -22,16 +22,15 @@ ProgramNULL::~ProgramNULL()
{
}
-LinkResult ProgramNULL::load(const ContextImpl *contextImpl,
- gl::InfoLog &infoLog,
- gl::BinaryInputStream *stream)
+gl::LinkResult ProgramNULL::load(const gl::Context *contextImpl,
+ gl::InfoLog &infoLog,
+ gl::BinaryInputStream *stream)
{
return true;
}
-gl::Error ProgramNULL::save(gl::BinaryOutputStream *stream)
+void ProgramNULL::save(const gl::Context *context, gl::BinaryOutputStream *stream)
{
- return gl::NoError();
}
void ProgramNULL::setBinaryRetrievableHint(bool retrievable)
@@ -42,9 +41,9 @@ void ProgramNULL::setSeparable(bool separable)
{
}
-LinkResult ProgramNULL::link(ContextImpl *contextImpl,
- const gl::VaryingPacking &packing,
- gl::InfoLog &infoLog)
+gl::LinkResult ProgramNULL::link(const gl::Context *contextImpl,
+ const gl::VaryingPacking &packing,
+ gl::InfoLog &infoLog)
{
return true;
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/ProgramNULL.h b/chromium/third_party/angle/src/libANGLE/renderer/null/ProgramNULL.h
index 88c0598ec1e..363d3343911 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/ProgramNULL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/ProgramNULL.h
@@ -21,16 +21,16 @@ class ProgramNULL : public ProgramImpl
ProgramNULL(const gl::ProgramState &state);
~ProgramNULL() override;
- LinkResult load(const ContextImpl *contextImpl,
- gl::InfoLog &infoLog,
- gl::BinaryInputStream *stream) override;
- gl::Error save(gl::BinaryOutputStream *stream) override;
+ 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;
- LinkResult link(ContextImpl *contextImpl,
- const gl::VaryingPacking &packing,
- gl::InfoLog &infoLog) override;
+ gl::LinkResult link(const gl::Context *context,
+ const gl::VaryingPacking &packing,
+ gl::InfoLog &infoLog) override;
GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/SurfaceNULL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/null/SurfaceNULL.cpp
index 868269b9999..7cb6fd50f72 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/SurfaceNULL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/SurfaceNULL.cpp
@@ -24,7 +24,7 @@ SurfaceNULL::~SurfaceNULL()
{
}
-egl::Error SurfaceNULL::initialize(const DisplayImpl *displayImpl)
+egl::Error SurfaceNULL::initialize(const egl::Display *display)
{
return egl::NoError();
}
@@ -34,12 +34,16 @@ FramebufferImpl *SurfaceNULL::createDefaultFramebuffer(const gl::FramebufferStat
return new FramebufferNULL(state);
}
-egl::Error SurfaceNULL::swap(const DisplayImpl *displayImpl)
+egl::Error SurfaceNULL::swap(const gl::Context *context)
{
return egl::NoError();
}
-egl::Error SurfaceNULL::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
+egl::Error SurfaceNULL::postSubBuffer(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height)
{
return egl::NoError();
}
@@ -63,7 +67,7 @@ egl::Error SurfaceNULL::releaseTexImage(EGLint buffer)
egl::Error SurfaceNULL::getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc)
{
UNIMPLEMENTED();
- return egl::Error(EGL_BAD_ACCESS);
+ return egl::EglBadAccess();
}
void SurfaceNULL::setSwapInterval(EGLint interval)
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/SurfaceNULL.h b/chromium/third_party/angle/src/libANGLE/renderer/null/SurfaceNULL.h
index 4b084a32f9e..4877c8740b5 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/SurfaceNULL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/SurfaceNULL.h
@@ -21,10 +21,14 @@ class SurfaceNULL : public SurfaceImpl
SurfaceNULL(const egl::SurfaceState &surfaceState);
~SurfaceNULL() override;
- egl::Error initialize(const DisplayImpl *displayImpl) override;
+ egl::Error initialize(const egl::Display *display) override;
FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override;
- egl::Error swap(const DisplayImpl *displayImpl) override;
- egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) 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;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.cpp
index 16ef4ccc3b1..16145c02adc 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.cpp
@@ -22,7 +22,7 @@ TextureNULL::~TextureNULL()
{
}
-gl::Error TextureNULL::setImage(ContextImpl *contextImpl,
+gl::Error TextureNULL::setImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -37,7 +37,7 @@ gl::Error TextureNULL::setImage(ContextImpl *contextImpl,
return gl::NoError();
}
-gl::Error TextureNULL::setSubImage(ContextImpl *contextImpl,
+gl::Error TextureNULL::setSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -49,7 +49,7 @@ gl::Error TextureNULL::setSubImage(ContextImpl *contextImpl,
return gl::NoError();
}
-gl::Error TextureNULL::setCompressedImage(ContextImpl *contextImpl,
+gl::Error TextureNULL::setCompressedImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -61,7 +61,7 @@ gl::Error TextureNULL::setCompressedImage(ContextImpl *contextImpl,
return gl::NoError();
}
-gl::Error TextureNULL::setCompressedSubImage(ContextImpl *contextImpl,
+gl::Error TextureNULL::setCompressedSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -73,7 +73,7 @@ gl::Error TextureNULL::setCompressedSubImage(ContextImpl *contextImpl,
return gl::NoError();
}
-gl::Error TextureNULL::copyImage(ContextImpl *contextImpl,
+gl::Error TextureNULL::copyImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Rectangle &sourceArea,
@@ -83,7 +83,7 @@ gl::Error TextureNULL::copyImage(ContextImpl *contextImpl,
return gl::NoError();
}
-gl::Error TextureNULL::copySubImage(ContextImpl *contextImpl,
+gl::Error TextureNULL::copySubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Offset &destOffset,
@@ -93,7 +93,7 @@ gl::Error TextureNULL::copySubImage(ContextImpl *contextImpl,
return gl::NoError();
}
-gl::Error TextureNULL::setStorage(ContextImpl *contextImpl,
+gl::Error TextureNULL::setStorage(const gl::Context *context,
GLenum target,
size_t levels,
GLenum internalFormat,
@@ -102,40 +102,46 @@ gl::Error TextureNULL::setStorage(ContextImpl *contextImpl,
return gl::NoError();
}
-gl::Error TextureNULL::setEGLImageTarget(GLenum target, egl::Image *image)
+gl::Error TextureNULL::setEGLImageTarget(const gl::Context *context,
+ GLenum target,
+ egl::Image *image)
{
return gl::NoError();
}
-gl::Error TextureNULL::setImageExternal(GLenum target,
+gl::Error TextureNULL::setImageExternal(const gl::Context *context,
+ GLenum target,
egl::Stream *stream,
const egl::Stream::GLTextureDescription &desc)
{
return gl::NoError();
}
-gl::Error TextureNULL::generateMipmap(ContextImpl *contextImpl)
+gl::Error TextureNULL::generateMipmap(const gl::Context *context)
{
return gl::NoError();
}
-void TextureNULL::setBaseLevel(GLuint baseLevel)
+gl::Error TextureNULL::setBaseLevel(const gl::Context *context, GLuint baseLevel)
{
+ return gl::NoError();
}
-void TextureNULL::bindTexImage(egl::Surface *surface)
+gl::Error TextureNULL::bindTexImage(const gl::Context *context, egl::Surface *surface)
{
+ return gl::NoError();
}
-void TextureNULL::releaseTexImage()
+gl::Error TextureNULL::releaseTexImage(const gl::Context *context)
{
+ return gl::NoError();
}
void TextureNULL::syncState(const gl::Texture::DirtyBits &dirtyBits)
{
}
-gl::Error TextureNULL::setStorageMultisample(ContextImpl *contextImpl,
+gl::Error TextureNULL::setStorageMultisample(const gl::Context *context,
GLenum target,
GLsizei samples,
GLint internalformat,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.h b/chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.h
index c529090fb06..8da3fcbd9a4 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.h
@@ -21,7 +21,7 @@ class TextureNULL : public TextureImpl
TextureNULL(const gl::TextureState &state);
~TextureNULL() override;
- gl::Error setImage(ContextImpl *contextImpl,
+ gl::Error setImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -30,7 +30,7 @@ class TextureNULL : public TextureImpl
GLenum type,
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) override;
- gl::Error setSubImage(ContextImpl *contextImpl,
+ gl::Error setSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -39,7 +39,7 @@ class TextureNULL : public TextureImpl
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) override;
- gl::Error setCompressedImage(ContextImpl *contextImpl,
+ gl::Error setCompressedImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -47,7 +47,7 @@ class TextureNULL : public TextureImpl
const gl::PixelUnpackState &unpack,
size_t imageSize,
const uint8_t *pixels) override;
- gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+ gl::Error setCompressedSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -56,41 +56,44 @@ class TextureNULL : public TextureImpl
size_t imageSize,
const uint8_t *pixels) override;
- gl::Error copyImage(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl,
+ gl::Error setStorage(const gl::Context *context,
GLenum target,
size_t levels,
GLenum internalFormat,
const gl::Extents &size) override;
- gl::Error setEGLImageTarget(GLenum target, egl::Image *image) override;
+ gl::Error setEGLImageTarget(const gl::Context *context,
+ GLenum target,
+ egl::Image *image) override;
- gl::Error setImageExternal(GLenum target,
+ gl::Error setImageExternal(const gl::Context *context,
+ GLenum target,
egl::Stream *stream,
const egl::Stream::GLTextureDescription &desc) override;
- gl::Error generateMipmap(ContextImpl *contextImpl) override;
+ gl::Error generateMipmap(const gl::Context *context) override;
- void setBaseLevel(GLuint baseLevel) override;
+ gl::Error setBaseLevel(const gl::Context *context, GLuint baseLevel) override;
- void bindTexImage(egl::Surface *surface) override;
- void releaseTexImage() override;
+ gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
+ gl::Error releaseTexImage(const gl::Context *context) override;
void syncState(const gl::Texture::DirtyBits &dirtyBits) override;
- gl::Error setStorageMultisample(ContextImpl *contextImpl,
+ gl::Error setStorageMultisample(const gl::Context *context,
GLenum target,
GLsizei samples,
GLint internalformat,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/TransformFeedbackNULL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/null/TransformFeedbackNULL.cpp
index b26f29ad176..177fda3e763 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/TransformFeedbackNULL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/TransformFeedbackNULL.cpp
@@ -39,12 +39,12 @@ void TransformFeedbackNULL::resume()
{
}
-void TransformFeedbackNULL::bindGenericBuffer(const BindingPointer<gl::Buffer> &binding)
+void TransformFeedbackNULL::bindGenericBuffer(const gl::BindingPointer<gl::Buffer> &binding)
{
}
void TransformFeedbackNULL::bindIndexedBuffer(size_t index,
- const OffsetBindingPointer<gl::Buffer> &binding)
+ const gl::OffsetBindingPointer<gl::Buffer> &binding)
{
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/TransformFeedbackNULL.h b/chromium/third_party/angle/src/libANGLE/renderer/null/TransformFeedbackNULL.h
index 477e81d85a6..e7f3dc549f2 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/TransformFeedbackNULL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/TransformFeedbackNULL.h
@@ -26,8 +26,9 @@ class TransformFeedbackNULL : public TransformFeedbackImpl
void pause() override;
void resume() override;
- void bindGenericBuffer(const BindingPointer<gl::Buffer> &binding) override;
- void bindIndexedBuffer(size_t index, const OffsetBindingPointer<gl::Buffer> &binding) override;
+ void bindGenericBuffer(const gl::BindingPointer<gl::Buffer> &binding) override;
+ void bindIndexedBuffer(size_t index,
+ const gl::OffsetBindingPointer<gl::Buffer> &binding) override;
};
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/VertexArrayNULL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/null/VertexArrayNULL.cpp
index 95a835df160..c2b68933811 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/VertexArrayNULL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/VertexArrayNULL.cpp
@@ -18,8 +18,4 @@ VertexArrayNULL::VertexArrayNULL(const gl::VertexArrayState &data) : VertexArray
{
}
-VertexArrayNULL::~VertexArrayNULL()
-{
-}
-
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/VertexArrayNULL.h b/chromium/third_party/angle/src/libANGLE/renderer/null/VertexArrayNULL.h
index f8b2b0490ca..11b8e305c98 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/VertexArrayNULL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/VertexArrayNULL.h
@@ -19,7 +19,6 @@ class VertexArrayNULL : public VertexArrayImpl
{
public:
VertexArrayNULL(const gl::VertexArrayState &data);
- ~VertexArrayNULL() override;
};
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.cpp b/chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.cpp
index 7773e351e69..8109a56d794 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.cpp
@@ -12,6 +12,7 @@
#include "image_util/copyimage.h"
#include "image_util/imageformats.h"
+#include "libANGLE/AttributeMap.h"
#include "libANGLE/formatutils.h"
#include "libANGLE/renderer/Format.h"
@@ -170,6 +171,18 @@ PackPixelsParams::PackPixelsParams(const gl::Rectangle &areaIn,
{
}
+PackPixelsParams::PackPixelsParams(const gl::Context *context, const PackPixelsParams &other)
+ : area(other.area),
+ format(other.format),
+ type(other.type),
+ outputPitch(other.outputPitch),
+ packBuffer(other.packBuffer),
+ pack(),
+ offset(other.offset)
+{
+ pack.copyFrom(context, other.pack);
+}
+
void PackPixels(const PackPixelsParams &params,
const angle::Format &sourceFormat,
int inputPitchIn,
@@ -288,4 +301,17 @@ ColorCopyFunction FastCopyFunctionMap::get(const gl::FormatType &formatType) con
return nullptr;
}
+bool ShouldUseDebugLayers(const egl::AttributeMap &attribs)
+{
+ EGLAttrib debugSetting =
+ attribs.get(EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE, EGL_DONT_CARE);
+
+// Prefer to enable debug layers if compiling in Debug, and disabled in Release.
+#if !defined(NDEBUG)
+ return (debugSetting != EGL_FALSE);
+#else
+ return (debugSetting == EGL_TRUE);
+#endif // !defined(NDEBUG)
+}
+
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.h b/chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.h
index 803c8c2986e..ab953a9697c 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.h
@@ -12,24 +12,84 @@
#include <cstdint>
+#include <limits>
#include <map>
+#include "common/angleutils.h"
#include "libANGLE/angletypes.h"
namespace angle
{
struct Format;
-}
+} // namespace angle
namespace gl
{
struct FormatType;
struct InternalFormat;
-}
+} // namespace gl
+
+namespace egl
+{
+class AttributeMap;
+} // namespace egl
namespace rx
{
+class ResourceSerial
+{
+ public:
+ constexpr ResourceSerial() : mValue(kDirty) {}
+ constexpr ResourceSerial(uintptr_t value) : mValue(value) {}
+ constexpr bool operator==(ResourceSerial other) const { return mValue == other.mValue; }
+ constexpr bool operator!=(ResourceSerial other) const { return mValue != other.mValue; }
+
+ void dirty() { mValue = kDirty; }
+
+ private:
+ constexpr static uintptr_t kDirty = std::numeric_limits<uintptr_t>::max();
+
+ uintptr_t mValue;
+};
+
+class SerialFactory;
+
+class Serial final
+{
+ public:
+ constexpr Serial() : mValue(0) {}
+ constexpr Serial(const Serial &other) = default;
+ Serial &operator=(const Serial &other) = default;
+
+ constexpr bool operator==(const Serial &other) const { return mValue == other.mValue; }
+ constexpr bool operator!=(const Serial &other) const { return mValue != other.mValue; }
+ constexpr bool operator>(const Serial &other) const { return mValue > other.mValue; }
+ constexpr bool operator>=(const Serial &other) const { return mValue >= other.mValue; }
+ constexpr bool operator<(const Serial &other) const { return mValue < other.mValue; }
+ constexpr bool operator<=(const Serial &other) const { return mValue <= other.mValue; }
+
+ private:
+ friend class SerialFactory;
+ constexpr explicit Serial(uint64_t value) : mValue(value) {}
+ uint64_t mValue;
+};
+
+class SerialFactory final : angle::NonCopyable
+{
+ public:
+ SerialFactory() : mSerial(1) {}
+
+ Serial generate()
+ {
+ ASSERT(mSerial != std::numeric_limits<uint64_t>::max());
+ return Serial(mSerial++);
+ }
+
+ private:
+ uint64_t mSerial;
+};
+
using MipGenerationFunction = void (*)(size_t sourceWidth,
size_t sourceHeight,
size_t sourceDepth,
@@ -66,7 +126,7 @@ class FastCopyFunctionMap
const Entry *mData;
};
-struct PackPixelsParams
+struct PackPixelsParams : private angle::NonCopyable
{
PackPixelsParams();
PackPixelsParams(const gl::Rectangle &area,
@@ -75,6 +135,7 @@ struct PackPixelsParams
GLuint outputPitch,
const gl::PixelPackState &pack,
ptrdiff_t offset);
+ PackPixelsParams(const gl::Context *context, const PackPixelsParams &other);
gl::Rectangle area;
GLenum format;
@@ -126,6 +187,8 @@ struct LoadImageFunctionInfo
using LoadFunctionMap = LoadImageFunctionInfo (*)(GLenum);
+bool ShouldUseDebugLayers(const egl::AttributeMap &attribs);
+
} // namespace rx
#endif // LIBANGLE_RENDERER_RENDERER_UTILS_H_
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/BufferVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/BufferVk.cpp
index bdfa32cd245..fc73ff13c1a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/BufferVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/BufferVk.cpp
@@ -10,6 +10,7 @@
#include "libANGLE/renderer/vulkan/BufferVk.h"
#include "common/debug.h"
+#include "libANGLE/Context.h"
#include "libANGLE/renderer/vulkan/ContextVk.h"
#include "libANGLE/renderer/vulkan/RendererVk.h"
@@ -24,20 +25,20 @@ BufferVk::~BufferVk()
{
}
-void BufferVk::destroy(ContextImpl *contextImpl)
+void BufferVk::destroy(const gl::Context *context)
{
- VkDevice device = GetAs<ContextVk>(contextImpl)->getDevice();
+ VkDevice device = GetImplAs<ContextVk>(context)->getDevice();
mBuffer.destroy(device);
}
-gl::Error BufferVk::setData(ContextImpl *context,
+gl::Error BufferVk::setData(const gl::Context *context,
GLenum target,
const void *data,
size_t size,
GLenum usage)
{
- ContextVk *contextVk = GetAs<ContextVk>(context);
+ ContextVk *contextVk = GetImplAs<ContextVk>(context);
auto device = contextVk->getDevice();
// TODO(jmadill): Proper usage bit implementation. Likely will involve multiple backing buffers
@@ -93,7 +94,7 @@ gl::Error BufferVk::setData(ContextImpl *context,
return gl::NoError();
}
-gl::Error BufferVk::setSubData(ContextImpl *context,
+gl::Error BufferVk::setSubData(const gl::Context *context,
GLenum target,
const void *data,
size_t size,
@@ -102,29 +103,29 @@ gl::Error BufferVk::setSubData(ContextImpl *context,
ASSERT(mBuffer.getHandle() != VK_NULL_HANDLE);
ASSERT(mBuffer.getMemory().getHandle() != VK_NULL_HANDLE);
- VkDevice device = GetAs<ContextVk>(context)->getDevice();
+ VkDevice device = GetImplAs<ContextVk>(context)->getDevice();
ANGLE_TRY(setDataImpl(device, static_cast<const uint8_t *>(data), size, offset));
return gl::NoError();
}
-gl::Error BufferVk::copySubData(ContextImpl *context,
+gl::Error BufferVk::copySubData(const gl::Context *context,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error BufferVk::map(ContextImpl *context, GLenum access, void **mapPtr)
+gl::Error BufferVk::map(const gl::Context *context, GLenum access, void **mapPtr)
{
ASSERT(mBuffer.getHandle() != VK_NULL_HANDLE);
ASSERT(mBuffer.getMemory().getHandle() != VK_NULL_HANDLE);
- VkDevice device = GetAs<ContextVk>(context)->getDevice();
+ VkDevice device = GetImplAs<ContextVk>(context)->getDevice();
ANGLE_TRY(mBuffer.getMemory().map(device, 0, mState.getSize(), 0,
reinterpret_cast<uint8_t **>(mapPtr)));
@@ -132,7 +133,7 @@ gl::Error BufferVk::map(ContextImpl *context, GLenum access, void **mapPtr)
return gl::NoError();
}
-gl::Error BufferVk::mapRange(ContextImpl *context,
+gl::Error BufferVk::mapRange(const gl::Context *context,
size_t offset,
size_t length,
GLbitfield access,
@@ -141,7 +142,7 @@ gl::Error BufferVk::mapRange(ContextImpl *context,
ASSERT(mBuffer.getHandle() != VK_NULL_HANDLE);
ASSERT(mBuffer.getMemory().getHandle() != VK_NULL_HANDLE);
- VkDevice device = GetAs<ContextVk>(context)->getDevice();
+ VkDevice device = GetImplAs<ContextVk>(context)->getDevice();
ANGLE_TRY(
mBuffer.getMemory().map(device, offset, length, 0, reinterpret_cast<uint8_t **>(mapPtr)));
@@ -149,12 +150,12 @@ gl::Error BufferVk::mapRange(ContextImpl *context,
return gl::NoError();
}
-gl::Error BufferVk::unmap(ContextImpl *context, GLboolean *result)
+gl::Error BufferVk::unmap(const gl::Context *context, GLboolean *result)
{
ASSERT(mBuffer.getHandle() != VK_NULL_HANDLE);
ASSERT(mBuffer.getMemory().getHandle() != VK_NULL_HANDLE);
- VkDevice device = GetAs<ContextVk>(context)->getDevice();
+ VkDevice device = GetImplAs<ContextVk>(context)->getDevice();
mBuffer.getMemory().unmap(device);
@@ -168,7 +169,7 @@ gl::Error BufferVk::getIndexRange(GLenum type,
gl::IndexRange *outRange)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
vk::Error BufferVk::setDataImpl(VkDevice device, const uint8_t *data, size_t size, size_t offset)
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/BufferVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/BufferVk.h
index 410b5002ebf..bd08621f5a7 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/BufferVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/BufferVk.h
@@ -21,30 +21,30 @@ class BufferVk : public BufferImpl, public ResourceVk
public:
BufferVk(const gl::BufferState &state);
~BufferVk() override;
- void destroy(ContextImpl *contextImpl) override;
+ void destroy(const gl::Context *context) override;
- gl::Error setData(ContextImpl *context,
+ gl::Error setData(const gl::Context *context,
GLenum target,
const void *data,
size_t size,
GLenum usage) override;
- gl::Error setSubData(ContextImpl *context,
+ gl::Error setSubData(const gl::Context *context,
GLenum target,
const void *data,
size_t size,
size_t offset) override;
- gl::Error copySubData(ContextImpl *contextImpl,
+ gl::Error copySubData(const gl::Context *context,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size) override;
- gl::Error map(ContextImpl *contextImpl, GLenum access, void **mapPtr) override;
- gl::Error mapRange(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl, GLboolean *result) override;
+ gl::Error unmap(const gl::Context *context, GLboolean *result) override;
gl::Error getIndexRange(GLenum type,
size_t offset,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.cpp
index 2a2c699f75e..e6a3e29fc82 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.cpp
@@ -52,16 +52,16 @@ gl::Error ContextVk::initialize()
gl::Error ContextVk::flush()
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error ContextVk::finish()
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error ContextVk::initPipeline()
+gl::Error ContextVk::initPipeline(const gl::Context *context)
{
ASSERT(!mCurrentPipeline.valid());
@@ -108,8 +108,8 @@ gl::Error ContextVk::initPipeline()
VkVertexInputBindingDescription bindingDesc;
bindingDesc.binding = static_cast<uint32_t>(vertexBindings.size());
bindingDesc.stride = static_cast<uint32_t>(gl::ComputeVertexAttributeTypeSize(attrib));
- bindingDesc.inputRate =
- (binding.divisor > 0 ? VK_VERTEX_INPUT_RATE_INSTANCE : VK_VERTEX_INPUT_RATE_VERTEX);
+ bindingDesc.inputRate = (binding.getDivisor() > 0 ? VK_VERTEX_INPUT_RATE_INSTANCE
+ : VK_VERTEX_INPUT_RATE_VERTEX);
gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib);
@@ -228,7 +228,7 @@ gl::Error ContextVk::initPipeline()
// TODO(jmadill): Dynamic state.
vk::RenderPass *renderPass = nullptr;
- ANGLE_TRY_RESULT(vkFBO->getRenderPass(device), renderPass);
+ ANGLE_TRY_RESULT(vkFBO->getRenderPass(context, device), renderPass);
ASSERT(renderPass && renderPass->valid());
vk::PipelineLayout *pipelineLayout = nullptr;
@@ -264,7 +264,7 @@ gl::Error ContextVk::initPipeline()
return gl::NoError();
}
-gl::Error ContextVk::drawArrays(GLenum mode, GLint first, GLsizei count)
+gl::Error ContextVk::drawArrays(const gl::Context *context, GLenum mode, GLint first, GLsizei count)
{
if (mode != mCurrentDrawMode)
{
@@ -274,7 +274,7 @@ gl::Error ContextVk::drawArrays(GLenum mode, GLint first, GLsizei count)
if (!mCurrentPipeline.valid())
{
- ANGLE_TRY(initPipeline());
+ ANGLE_TRY(initPipeline(context));
ASSERT(mCurrentPipeline.valid());
}
@@ -300,7 +300,7 @@ gl::Error ContextVk::drawArrays(GLenum mode, GLint first, GLsizei count)
if (attrib.enabled)
{
// TODO(jmadill): Offset handling.
- gl::Buffer *bufferGL = binding.buffer.get();
+ gl::Buffer *bufferGL = binding.getBuffer().get();
ASSERT(bufferGL);
BufferVk *bufferVk = GetImplAs<BufferVk>(bufferGL);
vertexHandles.push_back(bufferVk->getVkBuffer().getHandle());
@@ -316,7 +316,7 @@ gl::Error ContextVk::drawArrays(GLenum mode, GLint first, GLsizei count)
vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(mRenderer->getStartedCommandBuffer(&commandBuffer));
- ANGLE_TRY(vkFBO->beginRenderPass(device, commandBuffer, queueSerial, state));
+ ANGLE_TRY(vkFBO->beginRenderPass(context, device, commandBuffer, queueSerial, state));
commandBuffer->bindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, mCurrentPipeline);
commandBuffer->bindVertexBuffers(0, vertexHandles, vertexOffsets);
@@ -326,26 +326,29 @@ gl::Error ContextVk::drawArrays(GLenum mode, GLint first, GLsizei count)
return gl::NoError();
}
-gl::Error ContextVk::drawArraysInstanced(GLenum mode,
+gl::Error ContextVk::drawArraysInstanced(const gl::Context *context,
+ GLenum mode,
GLint first,
GLsizei count,
GLsizei instanceCount)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error ContextVk::drawElements(GLenum mode,
+gl::Error ContextVk::drawElements(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
const gl::IndexRange &indexRange)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error ContextVk::drawElementsInstanced(GLenum mode,
+gl::Error ContextVk::drawElementsInstanced(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
@@ -353,10 +356,11 @@ gl::Error ContextVk::drawElementsInstanced(GLenum mode,
const gl::IndexRange &indexRange)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error ContextVk::drawRangeElements(GLenum mode,
+gl::Error ContextVk::drawRangeElements(const gl::Context *context,
+ GLenum mode,
GLuint start,
GLuint end,
GLsizei count,
@@ -384,13 +388,18 @@ vk::Error ContextVk::submitCommands(vk::CommandBuffer *commandBuffer)
return vk::NoError();
}
-gl::Error ContextVk::drawArraysIndirect(GLenum mode, const void *indirect)
+gl::Error ContextVk::drawArraysIndirect(const gl::Context *context,
+ GLenum mode,
+ const void *indirect)
{
UNIMPLEMENTED();
return gl::InternalError() << "DrawArraysIndirect hasn't been implemented for vulkan backend.";
}
-gl::Error ContextVk::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
+gl::Error ContextVk::drawElementsIndirect(const gl::Context *context,
+ GLenum mode,
+ GLenum type,
+ const void *indirect)
{
UNIMPLEMENTED();
return gl::InternalError()
@@ -429,7 +438,7 @@ void ContextVk::popGroupMarker()
UNIMPLEMENTED();
}
-void ContextVk::syncState(const gl::State::DirtyBits &dirtyBits)
+void ContextVk::syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits)
{
// TODO(jmadill): Vulkan dirty bits.
if (dirtyBits.any())
@@ -450,7 +459,7 @@ GLint64 ContextVk::getTimestamp()
return GLint64();
}
-void ContextVk::onMakeCurrent(const gl::ContextState & /*data*/)
+void ContextVk::onMakeCurrent(const gl::Context * /*context*/)
{
}
@@ -550,10 +559,13 @@ void ContextVk::invalidateCurrentPipeline()
mRenderer->enqueueGarbageOrDeleteNow(*this, mCurrentPipeline);
}
-gl::Error ContextVk::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
+gl::Error ContextVk::dispatchCompute(const gl::Context *context,
+ GLuint numGroupsX,
+ GLuint numGroupsY,
+ GLuint numGroupsZ)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.h
index 07d0810e3d0..b326beeb471 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.h
@@ -32,32 +32,44 @@ class ContextVk : public ContextImpl, public ResourceVk
gl::Error finish() override;
// Drawing methods.
- gl::Error drawArrays(GLenum mode, GLint first, GLsizei count) override;
- gl::Error drawArraysInstanced(GLenum mode,
+ 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(GLenum mode,
+ gl::Error drawElements(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
const gl::IndexRange &indexRange) override;
- gl::Error drawElementsInstanced(GLenum mode,
+ gl::Error drawElementsInstanced(const gl::Context *context,
+ GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
GLsizei instances,
const gl::IndexRange &indexRange) override;
- gl::Error drawRangeElements(GLenum mode,
+ gl::Error drawRangeElements(const gl::Context *context,
+ GLenum mode,
GLuint start,
GLuint end,
GLsizei count,
GLenum type,
const void *indices,
const gl::IndexRange &indexRange) override;
- gl::Error drawArraysIndirect(GLenum mode, const void *indirect) override;
- gl::Error drawElementsIndirect(GLenum mode, GLenum type, const void *indirect) 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;
@@ -72,14 +84,14 @@ class ContextVk : public ContextImpl, public ResourceVk
void popGroupMarker() override;
// State sync with dirty bits.
- void syncState(const gl::State::DirtyBits &dirtyBits) override;
+ 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::ContextState &data) override;
+ void onMakeCurrent(const gl::Context *context) override;
// Native capabilities, unmodified by gl::Context.
const gl::Caps &getNativeCaps() const override;
@@ -131,10 +143,13 @@ class ContextVk : public ContextImpl, public ResourceVk
// TODO(jmadill): Use pipeline cache.
void invalidateCurrentPipeline();
- gl::Error dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ) override;
+ gl::Error dispatchCompute(const gl::Context *context,
+ GLuint numGroupsX,
+ GLuint numGroupsY,
+ GLuint numGroupsZ) override;
private:
- gl::Error initPipeline();
+ gl::Error initPipeline(const gl::Context *context);
RendererVk *mRenderer;
vk::Pipeline mCurrentPipeline;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/DeviceVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/DeviceVk.cpp
index f4f60b90b58..2c9c1b350da 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/DeviceVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/DeviceVk.cpp
@@ -25,7 +25,7 @@ DeviceVk::~DeviceVk()
egl::Error DeviceVk::getDevice(void **outValue)
{
UNIMPLEMENTED();
- return egl::Error(EGL_BAD_ACCESS);
+ return egl::EglBadAccess();
}
EGLint DeviceVk::getType()
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk.cpp
index eccc78e58d0..a009830889e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk.cpp
@@ -44,7 +44,7 @@ egl::Error DisplayVk::makeCurrent(egl::Surface * /*drawSurface*/,
egl::Surface * /*readSurface*/,
gl::Context * /*context*/)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::ConfigSet DisplayVk::generateConfigs()
@@ -98,10 +98,10 @@ bool DisplayVk::testDeviceLost()
return false;
}
-egl::Error DisplayVk::restoreLostDevice()
+egl::Error DisplayVk::restoreLostDevice(const egl::Display *display)
{
UNIMPLEMENTED();
- return egl::Error(EGL_BAD_ACCESS);
+ return egl::EglBadAccess();
}
std::string DisplayVk::getVendorString() const
@@ -117,21 +117,19 @@ std::string DisplayVk::getVendorString() const
egl::Error DisplayVk::getDevice(DeviceImpl **device)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error DisplayVk::waitClient() const
+egl::Error DisplayVk::waitClient(const gl::Context *context) const
{
UNIMPLEMENTED();
- return egl::Error(EGL_BAD_ACCESS);
+ return egl::EglBadAccess();
}
-egl::Error DisplayVk::waitNative(EGLint engine,
- egl::Surface *drawSurface,
- egl::Surface *readSurface) const
+egl::Error DisplayVk::waitNative(const gl::Context *context, EGLint engine) const
{
UNIMPLEMENTED();
- return egl::Error(EGL_BAD_ACCESS);
+ return egl::EglBadAccess();
}
SurfaceImpl *DisplayVk::createWindowSurface(const egl::SurfaceState &state,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk.h
index f514efddc6c..2cc6059ec55 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk.h
@@ -32,16 +32,14 @@ class DisplayVk : public DisplayImpl
egl::ConfigSet generateConfigs() override;
bool testDeviceLost() override;
- egl::Error restoreLostDevice() override;
+ egl::Error restoreLostDevice(const egl::Display *display) override;
std::string getVendorString() const override;
egl::Error getDevice(DeviceImpl **device) override;
- egl::Error waitClient() const override;
- egl::Error waitNative(EGLint engine,
- egl::Surface *drawSurface,
- egl::Surface *readSurface) const override;
+ egl::Error waitClient(const gl::Context *context) const override;
+ egl::Error waitNative(const gl::Context *context, EGLint engine) const override;
SurfaceImpl *createWindowSurface(const egl::SurfaceState &state,
EGLNativeWindowType window,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FenceNVVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FenceNVVk.cpp
index c46bd012162..805fc8c697a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FenceNVVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FenceNVVk.cpp
@@ -25,19 +25,19 @@ FenceNVVk::~FenceNVVk()
gl::Error FenceNVVk::set(GLenum condition)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error FenceNVVk::test(GLboolean *outFinished)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error FenceNVVk::finish()
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FenceSyncVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FenceSyncVk.cpp
index d27f1308821..15a98177c16 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FenceSyncVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FenceSyncVk.cpp
@@ -25,25 +25,25 @@ FenceSyncVk::~FenceSyncVk()
gl::Error FenceSyncVk::set(GLenum condition, GLbitfield flags)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error FenceSyncVk::clientWait(GLbitfield flags, GLuint64 timeout, GLenum *outResult)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error FenceSyncVk::serverWait(GLbitfield flags, GLuint64 timeout)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error FenceSyncVk::getStatus(GLint *outResult)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
index 84b8907fc0a..9561698acd7 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
@@ -14,6 +14,8 @@
#include "common/debug.h"
#include "image_util/imageformats.h"
+#include "libANGLE/Context.h"
+#include "libANGLE/Display.h"
#include "libANGLE/formatutils.h"
#include "libANGLE/renderer/renderer_utils.h"
#include "libANGLE/renderer/vulkan/ContextVk.h"
@@ -30,10 +32,11 @@ namespace
{
gl::ErrorOrResult<const gl::InternalFormat *> GetReadAttachmentInfo(
+ const gl::Context *context,
const gl::FramebufferAttachment *readAttachment)
{
RenderTargetVk *renderTarget = nullptr;
- ANGLE_TRY(readAttachment->getRenderTarget(&renderTarget));
+ ANGLE_TRY(readAttachment->getRenderTarget(context, &renderTarget));
GLenum implFormat = renderTarget->format->format().fboImplementationInternalFormat;
return &gl::GetSizedInternalFormatInfo(implFormat);
@@ -91,45 +94,50 @@ FramebufferVk::~FramebufferVk()
{
}
-void FramebufferVk::destroy(ContextImpl *contextImpl)
+void FramebufferVk::destroy(const gl::Context *context)
{
- VkDevice device = GetAs<ContextVk>(contextImpl)->getDevice();
+ VkDevice device = GetImplAs<ContextVk>(context)->getDevice();
mRenderPass.destroy(device);
mFramebuffer.destroy(device);
}
-void FramebufferVk::destroyDefault(DisplayImpl *displayImpl)
+void FramebufferVk::destroyDefault(const egl::Display *display)
{
- VkDevice device = GetAs<DisplayVk>(displayImpl)->getRenderer()->getDevice();
+ VkDevice device = GetImplAs<DisplayVk>(display)->getRenderer()->getDevice();
mRenderPass.destroy(device);
mFramebuffer.destroy(device);
}
-gl::Error FramebufferVk::discard(size_t count, const GLenum *attachments)
+gl::Error FramebufferVk::discard(const gl::Context *context,
+ size_t count,
+ const GLenum *attachments)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error FramebufferVk::invalidate(size_t count, const GLenum *attachments)
+gl::Error FramebufferVk::invalidate(const gl::Context *context,
+ size_t count,
+ const GLenum *attachments)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error FramebufferVk::invalidateSub(size_t count,
+gl::Error FramebufferVk::invalidateSub(const gl::Context *context,
+ size_t count,
const GLenum *attachments,
const gl::Rectangle &area)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error FramebufferVk::clear(ContextImpl *context, GLbitfield mask)
+gl::Error FramebufferVk::clear(const gl::Context *context, GLbitfield mask)
{
- ContextVk *contextVk = GetAs<ContextVk>(context);
+ ContextVk *contextVk = GetImplAs<ContextVk>(context);
if (mState.getDepthAttachment() && (mask & GL_DEPTH_BUFFER_BIT) != 0)
{
@@ -170,7 +178,7 @@ gl::Error FramebufferVk::clear(ContextImpl *context, GLbitfield mask)
if (colorAttachment.isAttached())
{
RenderTargetVk *renderTarget = nullptr;
- ANGLE_TRY(colorAttachment.getRenderTarget(&renderTarget));
+ ANGLE_TRY(colorAttachment.getRenderTarget(context, &renderTarget));
renderTarget->image->changeLayoutTop(
VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, commandBuffer);
commandBuffer->clearSingleColorImage(*renderTarget->image, clearColorValue);
@@ -180,46 +188,46 @@ gl::Error FramebufferVk::clear(ContextImpl *context, GLbitfield mask)
return gl::NoError();
}
-gl::Error FramebufferVk::clearBufferfv(ContextImpl *context,
+gl::Error FramebufferVk::clearBufferfv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLfloat *values)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error FramebufferVk::clearBufferuiv(ContextImpl *context,
+gl::Error FramebufferVk::clearBufferuiv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLuint *values)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error FramebufferVk::clearBufferiv(ContextImpl *context,
+gl::Error FramebufferVk::clearBufferiv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLint *values)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error FramebufferVk::clearBufferfi(ContextImpl *context,
+gl::Error FramebufferVk::clearBufferfi(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
GLfloat depth,
GLint stencil)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-GLenum FramebufferVk::getImplementationColorReadFormat() const
+GLenum FramebufferVk::getImplementationColorReadFormat(const gl::Context *context) const
{
- auto errOrResult = GetReadAttachmentInfo(mState.getReadAttachment());
+ auto errOrResult = GetReadAttachmentInfo(context, mState.getReadAttachment());
// TODO(jmadill): Handle getRenderTarget error.
if (errOrResult.isError())
@@ -231,9 +239,9 @@ GLenum FramebufferVk::getImplementationColorReadFormat() const
return errOrResult.getResult()->format;
}
-GLenum FramebufferVk::getImplementationColorReadType() const
+GLenum FramebufferVk::getImplementationColorReadType(const gl::Context *context) const
{
- auto errOrResult = GetReadAttachmentInfo(mState.getReadAttachment());
+ auto errOrResult = GetReadAttachmentInfo(context, mState.getReadAttachment());
// TODO(jmadill): Handle getRenderTarget error.
if (errOrResult.isError())
@@ -245,7 +253,7 @@ GLenum FramebufferVk::getImplementationColorReadType() const
return errOrResult.getResult()->type;
}
-gl::Error FramebufferVk::readPixels(ContextImpl *context,
+gl::Error FramebufferVk::readPixels(const gl::Context *context,
const gl::Rectangle &area,
GLenum format,
GLenum type,
@@ -256,9 +264,9 @@ gl::Error FramebufferVk::readPixels(ContextImpl *context,
const auto *readAttachment = readFramebuffer->getReadColorbuffer();
RenderTargetVk *renderTarget = nullptr;
- ANGLE_TRY(readAttachment->getRenderTarget(&renderTarget));
+ ANGLE_TRY(readAttachment->getRenderTarget(context, &renderTarget));
- ContextVk *contextVk = GetAs<ContextVk>(context);
+ ContextVk *contextVk = GetImplAs<ContextVk>(context);
RendererVk *renderer = contextVk->getRenderer();
VkDevice device = renderer->getDevice();
@@ -304,7 +312,7 @@ gl::Error FramebufferVk::readPixels(ContextImpl *context,
params.format = format;
params.type = type;
params.outputPitch = inputPitch;
- params.pack = glState.getPackState();
+ params.pack.copyFrom(context, glState.getPackState());
PackPixels(params, angleFormat, inputPitch, mapPointer, reinterpret_cast<uint8_t *>(pixels));
@@ -318,14 +326,14 @@ gl::Error FramebufferVk::readPixels(ContextImpl *context,
return vk::NoError();
}
-gl::Error FramebufferVk::blit(ContextImpl *context,
+gl::Error FramebufferVk::blit(const gl::Context *context,
const gl::Rectangle &sourceArea,
const gl::Rectangle &destArea,
GLbitfield mask,
GLenum filter)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
bool FramebufferVk::checkStatus() const
@@ -334,9 +342,10 @@ bool FramebufferVk::checkStatus() const
return bool();
}
-void FramebufferVk::syncState(ContextImpl *contextImpl, const gl::Framebuffer::DirtyBits &dirtyBits)
+void FramebufferVk::syncState(const gl::Context *context,
+ const gl::Framebuffer::DirtyBits &dirtyBits)
{
- auto contextVk = GetAs<ContextVk>(contextImpl);
+ auto contextVk = GetImplAs<ContextVk>(context);
ASSERT(dirtyBits.any());
@@ -348,7 +357,8 @@ void FramebufferVk::syncState(ContextImpl *contextImpl, const gl::Framebuffer::D
contextVk->invalidateCurrentPipeline();
}
-gl::ErrorOrResult<vk::RenderPass *> FramebufferVk::getRenderPass(VkDevice device)
+gl::ErrorOrResult<vk::RenderPass *> FramebufferVk::getRenderPass(const gl::Context *context,
+ VkDevice device)
{
if (mRenderPass.valid())
{
@@ -369,7 +379,7 @@ gl::ErrorOrResult<vk::RenderPass *> FramebufferVk::getRenderPass(VkDevice device
VkAttachmentReference colorRef;
RenderTargetVk *renderTarget = nullptr;
- ANGLE_TRY(colorAttachment.getRenderTarget(&renderTarget));
+ ANGLE_TRY(colorAttachment.getRenderTarget(context, &renderTarget));
// TODO(jmadill): We would only need this flag for duplicated attachments.
colorDesc.flags = VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT;
@@ -404,7 +414,7 @@ gl::ErrorOrResult<vk::RenderPass *> FramebufferVk::getRenderPass(VkDevice device
VkAttachmentDescription depthStencilDesc;
RenderTargetVk *renderTarget = nullptr;
- ANGLE_TRY(depthStencilAttachment->getRenderTarget(&renderTarget));
+ ANGLE_TRY(depthStencilAttachment->getRenderTarget(context, &renderTarget));
depthStencilDesc.flags = 0;
depthStencilDesc.format = renderTarget->format->native;
@@ -457,7 +467,8 @@ gl::ErrorOrResult<vk::RenderPass *> FramebufferVk::getRenderPass(VkDevice device
return &mRenderPass;
}
-gl::ErrorOrResult<vk::Framebuffer *> FramebufferVk::getFramebuffer(VkDevice device)
+gl::ErrorOrResult<vk::Framebuffer *> FramebufferVk::getFramebuffer(const gl::Context *context,
+ VkDevice device)
{
// If we've already created our cached Framebuffer, return it.
if (mFramebuffer.valid())
@@ -466,7 +477,7 @@ gl::ErrorOrResult<vk::Framebuffer *> FramebufferVk::getFramebuffer(VkDevice devi
}
vk::RenderPass *renderPass = nullptr;
- ANGLE_TRY_RESULT(getRenderPass(device), renderPass);
+ ANGLE_TRY_RESULT(getRenderPass(context, device), renderPass);
// If we've a Framebuffer provided by a Surface (default FBO/backbuffer), query it.
if (mBackbuffer)
@@ -485,7 +496,7 @@ gl::ErrorOrResult<vk::Framebuffer *> FramebufferVk::getFramebuffer(VkDevice devi
if (colorAttachment.isAttached())
{
RenderTargetVk *renderTarget = nullptr;
- ANGLE_TRY(colorAttachment.getRenderTarget<RenderTargetVk>(&renderTarget));
+ ANGLE_TRY(colorAttachment.getRenderTarget<RenderTargetVk>(context, &renderTarget));
attachments.push_back(renderTarget->imageView->getHandle());
ASSERT(attachmentsSize.empty() || attachmentsSize == colorAttachment.getSize());
@@ -497,7 +508,7 @@ gl::ErrorOrResult<vk::Framebuffer *> FramebufferVk::getFramebuffer(VkDevice devi
if (depthStencilAttachment && depthStencilAttachment->isAttached())
{
RenderTargetVk *renderTarget = nullptr;
- ANGLE_TRY(depthStencilAttachment->getRenderTarget<RenderTargetVk>(&renderTarget));
+ ANGLE_TRY(depthStencilAttachment->getRenderTarget<RenderTargetVk>(context, &renderTarget));
attachments.push_back(renderTarget->imageView->getHandle());
ASSERT(attachmentsSize.empty() || attachmentsSize == depthStencilAttachment->getSize());
@@ -532,7 +543,8 @@ gl::Error FramebufferVk::getSamplePosition(size_t index, GLfloat *xy) const
return gl::InternalError() << "getSamplePosition is unimplemented.";
}
-gl::Error FramebufferVk::beginRenderPass(VkDevice device,
+gl::Error FramebufferVk::beginRenderPass(const gl::Context *context,
+ VkDevice device,
vk::CommandBuffer *commandBuffer,
Serial queueSerial,
const gl::State &glState)
@@ -543,7 +555,7 @@ gl::Error FramebufferVk::beginRenderPass(VkDevice device,
if (colorAttachment.isAttached())
{
RenderTargetVk *renderTarget = nullptr;
- ANGLE_TRY(colorAttachment.getRenderTarget<RenderTargetVk>(&renderTarget));
+ ANGLE_TRY(colorAttachment.getRenderTarget<RenderTargetVk>(context, &renderTarget));
renderTarget->resource->setQueueSerial(queueSerial);
}
}
@@ -552,16 +564,16 @@ gl::Error FramebufferVk::beginRenderPass(VkDevice device,
if (depthStencilAttachment && depthStencilAttachment->isAttached())
{
RenderTargetVk *renderTarget = nullptr;
- ANGLE_TRY(depthStencilAttachment->getRenderTarget<RenderTargetVk>(&renderTarget));
+ ANGLE_TRY(depthStencilAttachment->getRenderTarget<RenderTargetVk>(context, &renderTarget));
renderTarget->resource->setQueueSerial(queueSerial);
}
vk::Framebuffer *framebuffer = nullptr;
- ANGLE_TRY_RESULT(getFramebuffer(device), framebuffer);
+ ANGLE_TRY_RESULT(getFramebuffer(context, device), framebuffer);
ASSERT(framebuffer && framebuffer->valid());
vk::RenderPass *renderPass = nullptr;
- ANGLE_TRY_RESULT(getRenderPass(device), renderPass);
+ ANGLE_TRY_RESULT(getRenderPass(context, device), renderPass);
ASSERT(renderPass && renderPass->valid());
// TODO(jmadill): Proper clear value implementation.
@@ -580,7 +592,7 @@ gl::Error FramebufferVk::beginRenderPass(VkDevice device,
// TODO(jmadill): Iterate over all attachments.
ASSERT(mBackbuffer);
RenderTargetVk *renderTarget = nullptr;
- ANGLE_TRY(mState.getFirstColorAttachment()->getRenderTarget(&renderTarget));
+ ANGLE_TRY(mState.getFirstColorAttachment()->getRenderTarget(context, &renderTarget));
renderTarget->image->updateLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
commandBuffer->beginRenderPass(*renderPass, *framebuffer, glState.getViewport(),
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.h
index b28ffbd41a8..f3b8b0afa40 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.h
@@ -31,43 +31,46 @@ class FramebufferVk : public FramebufferImpl, public ResourceVk
WindowSurfaceVk *backbuffer);
~FramebufferVk() override;
- void destroy(ContextImpl *contextImpl) override;
- void destroyDefault(DisplayImpl *displayImpl) override;
-
- gl::Error discard(size_t count, const GLenum *attachments) override;
- gl::Error invalidate(size_t count, const GLenum *attachments) override;
- gl::Error invalidateSub(size_t count,
+ void destroy(const gl::Context *context) override;
+ void destroyDefault(const egl::Display *display) 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 clear(ContextImpl *context, GLbitfield mask) override;
- gl::Error clearBufferfv(ContextImpl *context,
+ 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(ContextImpl *context,
+ gl::Error clearBufferuiv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLuint *values) override;
- gl::Error clearBufferiv(ContextImpl *context,
+ gl::Error clearBufferiv(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
const GLint *values) override;
- gl::Error clearBufferfi(ContextImpl *context,
+ gl::Error clearBufferfi(const gl::Context *context,
GLenum buffer,
GLint drawbuffer,
GLfloat depth,
GLint stencil) override;
- GLenum getImplementationColorReadFormat() const override;
- GLenum getImplementationColorReadType() const override;
- gl::Error readPixels(ContextImpl *context,
+ 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) const override;
- gl::Error blit(ContextImpl *context,
+ gl::Error blit(const gl::Context *context,
const gl::Rectangle &sourceArea,
const gl::Rectangle &destArea,
GLbitfield mask,
@@ -75,22 +78,25 @@ class FramebufferVk : public FramebufferImpl, public ResourceVk
bool checkStatus() const override;
- void syncState(ContextImpl *contextImpl, const gl::Framebuffer::DirtyBits &dirtyBits) override;
+ void syncState(const gl::Context *context,
+ const gl::Framebuffer::DirtyBits &dirtyBits) override;
gl::Error getSamplePosition(size_t index, GLfloat *xy) const override;
- gl::Error beginRenderPass(VkDevice device,
+ gl::Error beginRenderPass(const gl::Context *context,
+ VkDevice device,
vk::CommandBuffer *commandBuffer,
Serial queueSerial,
const gl::State &glState);
- gl::ErrorOrResult<vk::RenderPass *> getRenderPass(VkDevice device);
+ gl::ErrorOrResult<vk::RenderPass *> getRenderPass(const gl::Context *context, VkDevice device);
private:
FramebufferVk(const gl::FramebufferState &state);
FramebufferVk(const gl::FramebufferState &state, WindowSurfaceVk *backbuffer);
- gl::ErrorOrResult<vk::Framebuffer *> getFramebuffer(VkDevice device);
+ gl::ErrorOrResult<vk::Framebuffer *> getFramebuffer(const gl::Context *context,
+ VkDevice device);
WindowSurfaceVk *mBackbuffer;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/GlslangWrapper.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/GlslangWrapper.cpp
index 5871c54a624..a2c14365a14 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/GlslangWrapper.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/GlslangWrapper.cpp
@@ -63,10 +63,10 @@ GlslangWrapper::~GlslangWrapper()
ASSERT(result != 0);
}
-LinkResult GlslangWrapper::linkProgram(const std::string &vertexSource,
- const std::string &fragmentSource,
- std::vector<uint32_t> *vertexCodeOut,
- std::vector<uint32_t> *fragmentCodeOut)
+gl::LinkResult GlslangWrapper::linkProgram(const std::string &vertexSource,
+ const std::string &fragmentSource,
+ std::vector<uint32_t> *vertexCodeOut,
+ std::vector<uint32_t> *fragmentCodeOut)
{
std::array<const char *, 2> strings = {{vertexSource.c_str(), fragmentSource.c_str()}};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/GlslangWrapper.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/GlslangWrapper.h
index da848b71170..a84437f2f21 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/GlslangWrapper.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/GlslangWrapper.h
@@ -15,7 +15,7 @@
namespace rx
{
-class GlslangWrapper : public RefCountObjectNoID
+class GlslangWrapper : public gl::RefCountObjectNoID
{
public:
// Increases the reference count.
@@ -23,10 +23,10 @@ class GlslangWrapper : public RefCountObjectNoID
static GlslangWrapper *GetReference();
static void ReleaseReference();
- LinkResult linkProgram(const std::string &vertexSource,
- const std::string &fragmentSource,
- std::vector<uint32_t> *vertexCodeOut,
- std::vector<uint32_t> *fragmentCodeOut);
+ gl::LinkResult linkProgram(const std::string &vertexSource,
+ const std::string &fragmentSource,
+ std::vector<uint32_t> *vertexCodeOut,
+ std::vector<uint32_t> *fragmentCodeOut);
private:
GlslangWrapper();
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ImageVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ImageVk.cpp
index d83119df0a8..3709da1465c 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ImageVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ImageVk.cpp
@@ -25,13 +25,13 @@ ImageVk::~ImageVk()
egl::Error ImageVk::initialize()
{
UNIMPLEMENTED();
- return egl::Error(EGL_BAD_ACCESS);
+ return egl::EglBadAccess();
}
-gl::Error ImageVk::orphan(egl::ImageSibling *sibling)
+gl::Error ImageVk::orphan(const gl::Context *context, egl::ImageSibling *sibling)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ImageVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ImageVk.h
index 85672f9d23a..5781c806c91 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ImageVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ImageVk.h
@@ -22,7 +22,7 @@ class ImageVk : public ImageImpl
~ImageVk() override;
egl::Error initialize() override;
- gl::Error orphan(egl::ImageSibling *sibling) override;
+ gl::Error orphan(const gl::Context *context, egl::ImageSibling *sibling) override;
};
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ProgramVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ProgramVk.cpp
index 6e53883df81..36cbb29ba4c 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ProgramVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ProgramVk.cpp
@@ -10,6 +10,7 @@
#include "libANGLE/renderer/vulkan/ProgramVk.h"
#include "common/debug.h"
+#include "libANGLE/Context.h"
#include "libANGLE/renderer/vulkan/ContextVk.h"
#include "libANGLE/renderer/vulkan/GlslangWrapper.h"
#include "libANGLE/renderer/vulkan/RendererVk.h"
@@ -25,27 +26,26 @@ ProgramVk::~ProgramVk()
{
}
-void ProgramVk::destroy(const ContextImpl *contextImpl)
+void ProgramVk::destroy(const gl::Context *contextImpl)
{
- VkDevice device = GetAs<ContextVk>(contextImpl)->getDevice();
+ VkDevice device = GetImplAs<ContextVk>(contextImpl)->getDevice();
mLinkedFragmentModule.destroy(device);
mLinkedVertexModule.destroy(device);
mPipelineLayout.destroy(device);
}
-LinkResult ProgramVk::load(const ContextImpl *contextImpl,
- gl::InfoLog &infoLog,
- gl::BinaryInputStream *stream)
+gl::LinkResult ProgramVk::load(const gl::Context *contextImpl,
+ gl::InfoLog &infoLog,
+ gl::BinaryInputStream *stream)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error ProgramVk::save(gl::BinaryOutputStream *stream)
+void ProgramVk::save(const gl::Context *context, gl::BinaryOutputStream *stream)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
}
void ProgramVk::setBinaryRetrievableHint(bool retrievable)
@@ -58,16 +58,18 @@ void ProgramVk::setSeparable(bool separable)
UNIMPLEMENTED();
}
-LinkResult ProgramVk::link(ContextImpl *contextImpl,
- const gl::VaryingPacking &packing,
- gl::InfoLog &infoLog)
+gl::LinkResult ProgramVk::link(const gl::Context *glContext,
+ const gl::VaryingPacking &packing,
+ gl::InfoLog &infoLog)
{
- ContextVk *context = GetAs<ContextVk>(contextImpl);
+ ContextVk *context = GetImplAs<ContextVk>(glContext);
RendererVk *renderer = context->getRenderer();
GlslangWrapper *glslangWrapper = renderer->getGlslangWrapper();
- const std::string &vertexSource = mState.getAttachedVertexShader()->getTranslatedSource();
- const std::string &fragmentSource = mState.getAttachedFragmentShader()->getTranslatedSource();
+ const std::string &vertexSource =
+ mState.getAttachedVertexShader()->getTranslatedSource(glContext);
+ const std::string &fragmentSource =
+ mState.getAttachedFragmentShader()->getTranslatedSource(glContext);
std::vector<uint32_t> vertexCode;
std::vector<uint32_t> fragmentCode;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ProgramVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ProgramVk.h
index ff8efc5d2d0..c24cc3f04eb 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ProgramVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ProgramVk.h
@@ -21,18 +21,18 @@ class ProgramVk : public ProgramImpl
public:
ProgramVk(const gl::ProgramState &state);
~ProgramVk() override;
- void destroy(const ContextImpl *contextImpl) override;
+ void destroy(const gl::Context *context) override;
- LinkResult load(const ContextImpl *contextImpl,
- gl::InfoLog &infoLog,
- gl::BinaryInputStream *stream) override;
- gl::Error save(gl::BinaryOutputStream *stream) override;
+ 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;
- LinkResult link(ContextImpl *contextImpl,
- const gl::VaryingPacking &packing,
- gl::InfoLog &infoLog) override;
+ gl::LinkResult link(const gl::Context *context,
+ const gl::VaryingPacking &packing,
+ gl::InfoLog &infoLog) override;
GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/QueryVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/QueryVk.cpp
index 01fd0c45aa8..c3eb2c46d76 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/QueryVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/QueryVk.cpp
@@ -25,49 +25,49 @@ QueryVk::~QueryVk()
gl::Error QueryVk::begin()
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error QueryVk::end()
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error QueryVk::queryCounter()
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error QueryVk::getResult(GLint *params)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error QueryVk::getResult(GLuint *params)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error QueryVk::getResult(GLint64 *params)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error QueryVk::getResult(GLuint64 *params)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error QueryVk::isResultAvailable(bool *available)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
index d873e274dd9..0b0f7fe93cc 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
@@ -25,7 +25,7 @@ RenderbufferVk::~RenderbufferVk()
gl::Error RenderbufferVk::setStorage(GLenum internalformat, size_t width, size_t height)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error RenderbufferVk::setStorageMultisample(size_t samples,
@@ -34,21 +34,22 @@ gl::Error RenderbufferVk::setStorageMultisample(size_t samples,
size_t height)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error RenderbufferVk::setStorageEGLImageTarget(egl::Image *image)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error RenderbufferVk::getAttachmentRenderTarget(GLenum binding,
+gl::Error RenderbufferVk::getAttachmentRenderTarget(const gl::Context *context,
+ GLenum binding,
const gl::ImageIndex &imageIndex,
FramebufferAttachmentRenderTarget **rtOut)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderbufferVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderbufferVk.h
index 95ce8bbd69b..cd3b58e520a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderbufferVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderbufferVk.h
@@ -28,7 +28,8 @@ class RenderbufferVk : public RenderbufferImpl
size_t height) override;
gl::Error setStorageEGLImageTarget(egl::Image *image) override;
- gl::Error getAttachmentRenderTarget(GLenum binding,
+ gl::Error getAttachmentRenderTarget(const gl::Context *context,
+ GLenum binding,
const gl::ImageIndex &imageIndex,
FramebufferAttachmentRenderTarget **rtOut) override;
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.cpp
index 1f51cd61053..bc090b03a59 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.cpp
@@ -95,11 +95,10 @@ RendererVk::RendererVk()
mDevice(VK_NULL_HANDLE),
mHostVisibleMemoryIndex(std::numeric_limits<uint32_t>::max()),
mGlslangWrapper(nullptr),
- mCurrentQueueSerial(),
- mLastCompletedQueueSerial(),
+ mLastCompletedQueueSerial(mQueueSerialFactory.generate()),
+ mCurrentQueueSerial(mQueueSerialFactory.generate()),
mInFlightCommands()
{
- ++mCurrentQueueSerial;
}
RendererVk::~RendererVk()
@@ -155,17 +154,7 @@ RendererVk::~RendererVk()
vk::Error RendererVk::initialize(const egl::AttributeMap &attribs, const char *wsiName)
{
-#if !defined(NDEBUG)
- // Validation layers enabled by default in Debug.
- mEnableValidationLayers = true;
-#endif
-
- // If specified in the attributes, override the default.
- if (attribs.contains(EGL_PLATFORM_ANGLE_ENABLE_VALIDATION_LAYER_ANGLE))
- {
- mEnableValidationLayers =
- (attribs.get(EGL_PLATFORM_ANGLE_ENABLE_VALIDATION_LAYER_ANGLE, EGL_FALSE) == EGL_TRUE);
- }
+ mEnableValidationLayers = ShouldUseDebugLayers(attribs);
// If we're loading the validation layers, we could be running from any random directory.
// Change to the executable directory so we can find the layers, then change back to the
@@ -215,7 +204,8 @@ vk::Error RendererVk::initialize(const egl::AttributeMap &attribs, const char *w
if (!HasStandardValidationLayer(instanceLayerProps))
{
// Generate an error if the attribute was requested, warning otherwise.
- if (attribs.contains(EGL_PLATFORM_ANGLE_ENABLE_VALIDATION_LAYER_ANGLE))
+ if (attribs.get(EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE, EGL_DONT_CARE) ==
+ EGL_TRUE)
{
ERR() << "Vulkan standard validation layers are missing.";
}
@@ -732,7 +722,8 @@ vk::Error RendererVk::submit(const VkSubmitInfo &submitInfo)
ASSERT(mInFlightCommands.size() < 1000u);
// Increment the queue serial. If this fails, we should restart ANGLE.
- ANGLE_VK_CHECK(++mCurrentQueueSerial, VK_ERROR_OUT_OF_HOST_MEMORY);
+ // TODO(jmadill): Overflow check.
+ mCurrentQueueSerial = mQueueSerialFactory.generate();
return vk::NoError();
}
@@ -757,7 +748,8 @@ vk::Error RendererVk::submitFrame(const VkSubmitInfo &submitInfo)
ASSERT(mInFlightCommands.size() < 1000u);
// Increment the queue serial. If this fails, we should restart ANGLE.
- ANGLE_VK_CHECK(++mCurrentQueueSerial, VK_ERROR_OUT_OF_HOST_MEMORY);
+ // TODO(jmadill): Overflow check.
+ mCurrentQueueSerial = mQueueSerialFactory.generate();
ANGLE_TRY(checkInFlightCommands());
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.h
index 48d393310f9..df02e1c24b8 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.h
@@ -124,8 +124,9 @@ class RendererVk : angle::NonCopyable
vk::CommandBuffer mCommandBuffer;
uint32_t mHostVisibleMemoryIndex;
GlslangWrapper *mGlslangWrapper;
- Serial mCurrentQueueSerial;
+ SerialFactory mQueueSerialFactory;
Serial mLastCompletedQueueSerial;
+ Serial mCurrentQueueSerial;
std::vector<vk::CommandBufferAndSerial> mInFlightCommands;
std::vector<vk::FenceAndSerial> mInFlightFences;
std::vector<std::unique_ptr<vk::IGarbageObject>> mGarbage;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
index 09de86e83ea..9deaff1f680 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
@@ -10,6 +10,8 @@
#include "libANGLE/renderer/vulkan/SurfaceVk.h"
#include "common/debug.h"
+#include "libANGLE/Context.h"
+#include "libANGLE/Display.h"
#include "libANGLE/Surface.h"
#include "libANGLE/renderer/vulkan/DisplayVk.h"
#include "libANGLE/renderer/vulkan/FramebufferVk.h"
@@ -47,7 +49,8 @@ VkPresentModeKHR GetDesiredPresentMode(const std::vector<VkPresentModeKHR> &pres
}
}
- ERR() << "Desired present mode not available. Falling back to " << presentModes[0];
+ WARN() << "Present mode " << bestChoice << " not available. Falling back to "
+ << presentModes[0];
return presentModes[0];
}
@@ -64,9 +67,9 @@ OffscreenSurfaceVk::~OffscreenSurfaceVk()
{
}
-egl::Error OffscreenSurfaceVk::initialize(const DisplayImpl *displayImpl)
+egl::Error OffscreenSurfaceVk::initialize(const egl::Display *display)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
FramebufferImpl *OffscreenSurfaceVk::createDefaultFramebuffer(const gl::FramebufferState &state)
@@ -75,33 +78,34 @@ FramebufferImpl *OffscreenSurfaceVk::createDefaultFramebuffer(const gl::Framebuf
return FramebufferVk::CreateUserFBO(state);
}
-egl::Error OffscreenSurfaceVk::swap(const DisplayImpl *displayImpl)
+egl::Error OffscreenSurfaceVk::swap(const gl::Context *context)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-egl::Error OffscreenSurfaceVk::postSubBuffer(EGLint /*x*/,
+egl::Error OffscreenSurfaceVk::postSubBuffer(const gl::Context * /*context*/,
+ EGLint /*x*/,
EGLint /*y*/,
EGLint /*width*/,
EGLint /*height*/)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error OffscreenSurfaceVk::querySurfacePointerANGLE(EGLint /*attribute*/, void ** /*value*/)
{
UNREACHABLE();
- return egl::Error(EGL_BAD_CURRENT_SURFACE);
+ return egl::EglBadCurrentSurface();
}
egl::Error OffscreenSurfaceVk::bindTexImage(gl::Texture * /*texture*/, EGLint /*buffer*/)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error OffscreenSurfaceVk::releaseTexImage(EGLint /*buffer*/)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error OffscreenSurfaceVk::getSyncValues(EGLuint64KHR * /*ust*/,
@@ -109,7 +113,7 @@ egl::Error OffscreenSurfaceVk::getSyncValues(EGLuint64KHR * /*ust*/,
EGLuint64KHR * /*sbc*/)
{
UNIMPLEMENTED();
- return egl::Error(EGL_BAD_ACCESS);
+ return egl::EglBadAccess();
}
void OffscreenSurfaceVk::setSwapInterval(EGLint /*interval*/)
@@ -137,12 +141,13 @@ EGLint OffscreenSurfaceVk::getSwapBehavior() const
}
gl::Error OffscreenSurfaceVk::getAttachmentRenderTarget(
+ const gl::Context * /*context*/,
GLenum /*binding*/,
const gl::ImageIndex & /*imageIndex*/,
FramebufferAttachmentRenderTarget ** /*rtOut*/)
{
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
WindowSurfaceVk::WindowSurfaceVk(const egl::SurfaceState &surfaceState,
@@ -169,9 +174,9 @@ WindowSurfaceVk::~WindowSurfaceVk()
ASSERT(mSwapchain == VK_NULL_HANDLE);
}
-void WindowSurfaceVk::destroy(const DisplayImpl *displayImpl)
+void WindowSurfaceVk::destroy(const egl::Display *display)
{
- const DisplayVk *displayVk = GetAs<DisplayVk>(displayImpl);
+ const DisplayVk *displayVk = GetImplAs<DisplayVk>(display);
RendererVk *rendererVk = displayVk->getRenderer();
VkDevice device = rendererVk->getDevice();
VkInstance instance = rendererVk->getInstance();
@@ -210,9 +215,9 @@ void WindowSurfaceVk::destroy(const DisplayImpl *displayImpl)
}
}
-egl::Error WindowSurfaceVk::initialize(const DisplayImpl *displayImpl)
+egl::Error WindowSurfaceVk::initialize(const egl::Display *display)
{
- const DisplayVk *displayVk = GetAs<DisplayVk>(displayImpl);
+ const DisplayVk *displayVk = GetImplAs<DisplayVk>(display);
return initializeImpl(displayVk->getRenderer()).toEGL(EGL_BAD_SURFACE);
}
@@ -412,9 +417,9 @@ FramebufferImpl *WindowSurfaceVk::createDefaultFramebuffer(const gl::Framebuffer
return FramebufferVk::CreateDefaultFBO(state, this);
}
-egl::Error WindowSurfaceVk::swap(const DisplayImpl *displayImpl)
+egl::Error WindowSurfaceVk::swap(const gl::Context *context)
{
- const DisplayVk *displayVk = GetAs<DisplayVk>(displayImpl);
+ const DisplayVk *displayVk = GetImplAs<DisplayVk>(context->getCurrentDisplay());
return swapImpl(displayVk->getRenderer()).toEGL(EGL_BAD_ALLOC);
}
@@ -465,26 +470,30 @@ vk::Error WindowSurfaceVk::nextSwapchainImage(RendererVk *renderer)
return vk::NoError();
}
-egl::Error WindowSurfaceVk::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
+egl::Error WindowSurfaceVk::postSubBuffer(const gl::Context *context,
+ EGLint x,
+ EGLint y,
+ EGLint width,
+ EGLint height)
{
// TODO(jmadill)
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error WindowSurfaceVk::querySurfacePointerANGLE(EGLint attribute, void **value)
{
UNREACHABLE();
- return egl::Error(EGL_BAD_CURRENT_SURFACE);
+ return egl::EglBadCurrentSurface();
}
egl::Error WindowSurfaceVk::bindTexImage(gl::Texture *texture, EGLint buffer)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error WindowSurfaceVk::releaseTexImage(EGLint buffer)
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error WindowSurfaceVk::getSyncValues(EGLuint64KHR * /*ust*/,
@@ -492,7 +501,7 @@ egl::Error WindowSurfaceVk::getSyncValues(EGLuint64KHR * /*ust*/,
EGLuint64KHR * /*sbc*/)
{
UNIMPLEMENTED();
- return egl::Error(EGL_BAD_ACCESS);
+ return egl::EglBadAccess();
}
void WindowSurfaceVk::setSwapInterval(EGLint interval)
@@ -521,7 +530,8 @@ EGLint WindowSurfaceVk::getSwapBehavior() const
return EGL_BUFFER_DESTROYED;
}
-gl::Error WindowSurfaceVk::getAttachmentRenderTarget(GLenum /*binding*/,
+gl::Error WindowSurfaceVk::getAttachmentRenderTarget(const gl::Context * /*context*/,
+ GLenum /*binding*/,
const gl::ImageIndex & /*target*/,
FramebufferAttachmentRenderTarget **rtOut)
{
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.h
index e42696baf51..48ed2f19816 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.h
@@ -26,10 +26,14 @@ class OffscreenSurfaceVk : public SurfaceImpl
OffscreenSurfaceVk(const egl::SurfaceState &surfaceState, EGLint width, EGLint height);
~OffscreenSurfaceVk() override;
- egl::Error initialize(const DisplayImpl *displayImpl) override;
+ egl::Error initialize(const egl::Display *display) override;
FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override;
- egl::Error swap(const DisplayImpl *displayImpl) override;
- egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) 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;
@@ -43,7 +47,8 @@ class OffscreenSurfaceVk : public SurfaceImpl
EGLint isPostSubBufferSupported() const override;
EGLint getSwapBehavior() const override;
- gl::Error getAttachmentRenderTarget(GLenum binding,
+ gl::Error getAttachmentRenderTarget(const gl::Context *context,
+ GLenum binding,
const gl::ImageIndex &imageIndex,
FramebufferAttachmentRenderTarget **rtOut) override;
@@ -61,12 +66,16 @@ class WindowSurfaceVk : public SurfaceImpl, public ResourceVk
EGLint height);
~WindowSurfaceVk() override;
- void destroy(const DisplayImpl *contextImpl) override;
+ void destroy(const egl::Display *display) override;
- egl::Error initialize(const DisplayImpl *displayImpl) override;
+ egl::Error initialize(const egl::Display *display) override;
FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override;
- egl::Error swap(const DisplayImpl *displayImpl) override;
- egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) 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;
@@ -80,7 +89,8 @@ class WindowSurfaceVk : public SurfaceImpl, public ResourceVk
EGLint isPostSubBufferSupported() const override;
EGLint getSwapBehavior() const override;
- gl::Error getAttachmentRenderTarget(GLenum binding,
+ gl::Error getAttachmentRenderTarget(const gl::Context *context,
+ GLenum binding,
const gl::ImageIndex &imageIndex,
FramebufferAttachmentRenderTarget **rtOut) override;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp
index 7c3bf4b12f7..bd5617de03f 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp
@@ -22,7 +22,7 @@ TextureVk::~TextureVk()
{
}
-gl::Error TextureVk::setImage(ContextImpl *contextImpl,
+gl::Error TextureVk::setImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -33,10 +33,10 @@ gl::Error TextureVk::setImage(ContextImpl *contextImpl,
const uint8_t *pixels)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureVk::setSubImage(ContextImpl *contextImpl,
+gl::Error TextureVk::setSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -46,10 +46,10 @@ gl::Error TextureVk::setSubImage(ContextImpl *contextImpl,
const uint8_t *pixels)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureVk::setCompressedImage(ContextImpl *contextImpl,
+gl::Error TextureVk::setCompressedImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -59,10 +59,10 @@ gl::Error TextureVk::setCompressedImage(ContextImpl *contextImpl,
const uint8_t *pixels)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureVk::setCompressedSubImage(ContextImpl *contextImpl,
+gl::Error TextureVk::setCompressedSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -72,10 +72,10 @@ gl::Error TextureVk::setCompressedSubImage(ContextImpl *contextImpl,
const uint8_t *pixels)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureVk::copyImage(ContextImpl *contextImpl,
+gl::Error TextureVk::copyImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Rectangle &sourceArea,
@@ -83,10 +83,10 @@ gl::Error TextureVk::copyImage(ContextImpl *contextImpl,
const gl::Framebuffer *source)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureVk::copySubImage(ContextImpl *contextImpl,
+gl::Error TextureVk::copySubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Offset &destOffset,
@@ -94,60 +94,65 @@ gl::Error TextureVk::copySubImage(ContextImpl *contextImpl,
const gl::Framebuffer *source)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureVk::setStorage(ContextImpl *contextImpl,
+gl::Error TextureVk::setStorage(const gl::Context *context,
GLenum target,
size_t levels,
GLenum internalFormat,
const gl::Extents &size)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureVk::setEGLImageTarget(GLenum target, egl::Image *image)
+gl::Error TextureVk::setEGLImageTarget(const gl::Context *context, GLenum target, egl::Image *image)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureVk::setImageExternal(GLenum target,
+gl::Error TextureVk::setImageExternal(const gl::Context *context,
+ GLenum target,
egl::Stream *stream,
const egl::Stream::GLTextureDescription &desc)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error TextureVk::generateMipmap(ContextImpl *contextImpl)
+gl::Error TextureVk::generateMipmap(const gl::Context *context)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-void TextureVk::setBaseLevel(GLuint baseLevel)
+gl::Error TextureVk::setBaseLevel(const gl::Context *context, GLuint baseLevel)
{
UNIMPLEMENTED();
+ return gl::InternalError();
}
-void TextureVk::bindTexImage(egl::Surface *surface)
+gl::Error TextureVk::bindTexImage(const gl::Context *context, egl::Surface *surface)
{
UNIMPLEMENTED();
+ return gl::InternalError();
}
-void TextureVk::releaseTexImage()
+gl::Error TextureVk::releaseTexImage(const gl::Context *context)
{
UNIMPLEMENTED();
+ return gl::InternalError();
}
-gl::Error TextureVk::getAttachmentRenderTarget(GLenum binding,
+gl::Error TextureVk::getAttachmentRenderTarget(const gl::Context *context,
+ GLenum binding,
const gl::ImageIndex &imageIndex,
FramebufferAttachmentRenderTarget **rtOut)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
void TextureVk::syncState(const gl::Texture::DirtyBits &dirtyBits)
@@ -155,7 +160,7 @@ void TextureVk::syncState(const gl::Texture::DirtyBits &dirtyBits)
UNIMPLEMENTED();
}
-gl::Error TextureVk::setStorageMultisample(ContextImpl *contextImpl,
+gl::Error TextureVk::setStorageMultisample(const gl::Context *context,
GLenum target,
GLsizei samples,
GLint internalformat,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.h
index 4ad6a30cc0d..70e86513452 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.h
@@ -21,7 +21,7 @@ class TextureVk : public TextureImpl
TextureVk(const gl::TextureState &state);
~TextureVk() override;
- gl::Error setImage(ContextImpl *contextImpl,
+ gl::Error setImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -30,7 +30,7 @@ class TextureVk : public TextureImpl
GLenum type,
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) override;
- gl::Error setSubImage(ContextImpl *contextImpl,
+ gl::Error setSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -39,7 +39,7 @@ class TextureVk : public TextureImpl
const gl::PixelUnpackState &unpack,
const uint8_t *pixels) override;
- gl::Error setCompressedImage(ContextImpl *contextImpl,
+ gl::Error setCompressedImage(const gl::Context *context,
GLenum target,
size_t level,
GLenum internalFormat,
@@ -47,7 +47,7 @@ class TextureVk : public TextureImpl
const gl::PixelUnpackState &unpack,
size_t imageSize,
const uint8_t *pixels) override;
- gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+ gl::Error setCompressedSubImage(const gl::Context *context,
GLenum target,
size_t level,
const gl::Box &area,
@@ -56,45 +56,49 @@ class TextureVk : public TextureImpl
size_t imageSize,
const uint8_t *pixels) override;
- gl::Error copyImage(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl,
+ 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(ContextImpl *contextImpl,
+ gl::Error setStorage(const gl::Context *context,
GLenum target,
size_t levels,
GLenum internalFormat,
const gl::Extents &size) override;
- gl::Error setEGLImageTarget(GLenum target, egl::Image *image) override;
+ gl::Error setEGLImageTarget(const gl::Context *context,
+ GLenum target,
+ egl::Image *image) override;
- gl::Error setImageExternal(GLenum target,
+ gl::Error setImageExternal(const gl::Context *context,
+ GLenum target,
egl::Stream *stream,
const egl::Stream::GLTextureDescription &desc) override;
- gl::Error generateMipmap(ContextImpl *contextImpl) override;
+ gl::Error generateMipmap(const gl::Context *context) override;
- void setBaseLevel(GLuint baseLevel) override;
+ gl::Error setBaseLevel(const gl::Context *context, GLuint baseLevel) override;
- void bindTexImage(egl::Surface *surface) override;
- void releaseTexImage() override;
+ gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
+ gl::Error releaseTexImage(const gl::Context *context) override;
- gl::Error getAttachmentRenderTarget(GLenum binding,
+ gl::Error getAttachmentRenderTarget(const gl::Context *context,
+ GLenum binding,
const gl::ImageIndex &imageIndex,
FramebufferAttachmentRenderTarget **rtOut) override;
void syncState(const gl::Texture::DirtyBits &dirtyBits) override;
- gl::Error setStorageMultisample(ContextImpl *contextImpl,
+ gl::Error setStorageMultisample(const gl::Context *context,
GLenum target,
GLsizei samples,
GLint internalformat,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp
index ea445c75306..5e800788b76 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp
@@ -43,13 +43,13 @@ void TransformFeedbackVk::resume()
UNIMPLEMENTED();
}
-void TransformFeedbackVk::bindGenericBuffer(const BindingPointer<gl::Buffer> &binding)
+void TransformFeedbackVk::bindGenericBuffer(const gl::BindingPointer<gl::Buffer> &binding)
{
UNIMPLEMENTED();
}
void TransformFeedbackVk::bindIndexedBuffer(size_t index,
- const OffsetBindingPointer<gl::Buffer> &binding)
+ const gl::OffsetBindingPointer<gl::Buffer> &binding)
{
UNIMPLEMENTED();
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TransformFeedbackVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TransformFeedbackVk.h
index ed8522c9c44..a379b36ab0b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TransformFeedbackVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TransformFeedbackVk.h
@@ -26,8 +26,9 @@ class TransformFeedbackVk : public TransformFeedbackImpl
void pause() override;
void resume() override;
- void bindGenericBuffer(const BindingPointer<gl::Buffer> &binding) override;
- void bindIndexedBuffer(size_t index, const OffsetBindingPointer<gl::Buffer> &binding) override;
+ void bindGenericBuffer(const gl::BindingPointer<gl::Buffer> &binding) override;
+ void bindIndexedBuffer(size_t index,
+ const gl::OffsetBindingPointer<gl::Buffer> &binding) override;
};
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
index e835be7faad..c00cb36f58d 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
@@ -11,6 +11,7 @@
#include "common/debug.h"
+#include "libANGLE/Context.h"
#include "libANGLE/renderer/vulkan/ContextVk.h"
namespace rx
@@ -20,16 +21,17 @@ VertexArrayVk::VertexArrayVk(const gl::VertexArrayState &data) : VertexArrayImpl
{
}
-VertexArrayVk::~VertexArrayVk()
+void VertexArrayVk::destroy(const gl::Context *context)
{
}
-void VertexArrayVk::syncState(ContextImpl *contextImpl, const gl::VertexArray::DirtyBits &dirtyBits)
+void VertexArrayVk::syncState(const gl::Context *context,
+ const gl::VertexArray::DirtyBits &dirtyBits)
{
ASSERT(dirtyBits.any());
// TODO(jmadill): Use pipeline cache.
- auto contextVk = GetAs<ContextVk>(contextImpl);
+ auto contextVk = GetImplAs<ContextVk>(context);
contextVk->invalidateCurrentPipeline();
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.h
index 7592bc0dff3..43f29b76c21 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.h
@@ -19,9 +19,10 @@ class VertexArrayVk : public VertexArrayImpl
{
public:
VertexArrayVk(const gl::VertexArrayState &data);
- ~VertexArrayVk() override;
+ void destroy(const gl::Context *context) override;
- void syncState(ContextImpl *contextImpl, const gl::VertexArray::DirtyBits &dirtyBits) override;
+ void syncState(const gl::Context *context,
+ const gl::VertexArray::DirtyBits &dirtyBits) override;
};
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/renderervk_utils.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/renderervk_utils.cpp
index 2b5b1a01dd7..900a8fe2648 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/renderervk_utils.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/renderervk_utils.cpp
@@ -177,20 +177,18 @@ gl::Error Error::toGL(GLenum glErrorCode) const
}
// TODO(jmadill): Set extended error code to 'vulkan internal error'.
- const std::string &message = toString();
- return gl::Error(glErrorCode, message.c_str());
+ return gl::Error(glErrorCode, glErrorCode, toString());
}
egl::Error Error::toEGL(EGLint eglErrorCode) const
{
if (!isError())
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
// TODO(jmadill): Set extended error code to 'vulkan internal error'.
- const std::string &message = toString();
- return egl::Error(eglErrorCode, message.c_str());
+ return egl::Error(eglErrorCode, eglErrorCode, toString());
}
std::string Error::toString() const
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/renderervk_utils.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/renderervk_utils.h
index 20f8f2e9e09..c979286673d 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/renderervk_utils.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/renderervk_utils.h
@@ -14,9 +14,10 @@
#include <vulkan/vulkan.h>
-#include "common/debug.h"
#include "common/Optional.h"
+#include "common/debug.h"
#include "libANGLE/Error.h"
+#include "libANGLE/renderer/renderer_utils.h"
namespace gl
{
@@ -47,35 +48,6 @@ enum DeleteSchedule
LATER,
};
-// A serial supports a few operations - comparison, increment, and assignment.
-// TODO(jmadill): Verify it's not easy to overflow the queue serial.
-class Serial final
-{
- public:
- Serial() : mValue(0) {}
- Serial(const Serial &other) : mValue(other.mValue) {}
- Serial(Serial &&other) : mValue(other.mValue) { other.mValue = 0; }
- Serial &operator=(const Serial &other)
- {
- mValue = other.mValue;
- return *this;
- }
- bool operator>=(Serial other) const { return mValue >= other.mValue; }
- bool operator>(Serial other) const { return mValue > other.mValue; }
-
- // This function fails if we're at the limits of our counting.
- bool operator++()
- {
- if (mValue == std::numeric_limits<uint32_t>::max())
- return false;
- mValue++;
- return true;
- }
-
- private:
- uint32_t mValue;
-};
-
// This is a small helper mixin for any GL object used in Vk command buffers. It records a serial
// at command submission times indicating it's order in the queue. We will use Fences to detect
// when commands are finished, and then handle lifetime management for the resources.
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/xcb/DisplayVkXcb.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/xcb/DisplayVkXcb.cpp
index bd4d013c6ee..68b1a0980e7 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/xcb/DisplayVkXcb.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/xcb/DisplayVkXcb.cpp
@@ -26,7 +26,7 @@ egl::Error DisplayVkXcb::initialize(egl::Display *display)
mXcbConnection = xcb_connect(nullptr, nullptr);
if (mXcbConnection == nullptr)
{
- return egl::Error(EGL_NOT_INITIALIZED);
+ return egl::EglNotInitialized();
}
return DisplayVk::initialize(display);
}