Changeset 279331 in webkit
- Timestamp:
- Jun 28, 2021, 4:52:38 AM (5 years ago)
- Location:
- releases/WebKitGTK/webkit-2.32/Source/ThirdParty/ANGLE
- Files:
-
- 7 edited
-
ChangeLog (modified) (1 diff)
-
src/libANGLE/angletypes.h (modified) (1 diff)
-
src/libANGLE/renderer/d3d/d3d11/Blit11.cpp (modified) (1 diff)
-
src/libANGLE/renderer/gl/FramebufferGL.cpp (modified) (1 diff)
-
src/libANGLE/renderer/metal/ContextMtl.mm (modified) (1 diff)
-
src/libANGLE/renderer/vulkan/ContextVk.cpp (modified) (1 diff)
-
src/tests/gl_tests/BlitFramebufferANGLETest.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
releases/WebKitGTK/webkit-2.32/Source/ThirdParty/ANGLE/ChangeLog
r273516 r279331 1 2021-05-27 Kimmo Kinnunen <kkinnunen@apple.com> 2 3 Cherry-pick ANGLE: D3D11: Skip blits if there is no intersection of dest areas 4 https://bugs.webkit.org/show_bug.cgi?id=225190 5 <rdar://77084155> 6 7 Reviewed by David Kilzer. 8 9 Cherry-pick ANGLE commit b574643ef28c92fcea5122dd7a72acb42a514eed 10 Fixes a security issue on D3D11. 11 Potential a correctness issue on some OpenGL drivers. 12 No effect on Metal, but the nodiscard part is still useful. 13 14 Upstream description: 15 D3D11: Skip blits if there is no intersection of dest areas 16 17 Blit11 would clip the destination rectangle with the destination size 18 but ignore the result. gl::ClipRectangle returns false when the 19 rectangles do not intersect at all, indicating the blit can be skipped. 20 21 This could lead to an out-of-bounds write to the GPU memory for the 22 destination texture. 23 24 Mark ClipRectangle as nodiscard to prevent future issues. 25 * src/libANGLE/angletypes.h: 26 * src/libANGLE/renderer/d3d/d3d11/Blit11.cpp: 27 * src/libANGLE/renderer/gl/FramebufferGL.cpp: 28 (rx::FramebufferGL::clipSrcRegion): 29 * src/libANGLE/renderer/metal/ContextMtl.mm: 30 (rx::ContextMtl::updateScissor): 31 * src/libANGLE/renderer/vulkan/ContextVk.cpp: 32 (rx::ContextVk::updateScissor): 33 * src/tests/gl_tests/BlitFramebufferANGLETest.cpp: 34 (TEST_P): 35 1 36 2021-02-25 Kyle Piddington <kpiddington@apple.com> 2 37 -
releases/WebKitGTK/webkit-2.32/Source/ThirdParty/ANGLE/src/libANGLE/angletypes.h
r270351 r279331 85 85 86 86 // Calculate the intersection of two rectangles. Returns false if the intersection is empty. 87 bool ClipRectangle(const Rectangle &source, const Rectangle &clip, Rectangle *intersection); 87 ANGLE_NO_DISCARD bool ClipRectangle(const Rectangle &source, 88 const Rectangle &clip, 89 Rectangle *intersection); 88 90 // Calculate the smallest rectangle that covers both rectangles. This rectangle may cover areas 89 91 // not covered by the two rectangles, for example in this situation: -
releases/WebKitGTK/webkit-2.32/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp
r249823 r279331 142 142 { 143 143 gl::Rectangle clippedDestArea(destArea.x, destArea.y, destArea.width, destArea.height); 144 gl::ClipRectangle(clippedDestArea, clipRect, &clippedDestArea); 144 if (!gl::ClipRectangle(clippedDestArea, clipRect, &clippedDestArea)) 145 { 146 return; 147 } 145 148 146 149 // Determine if entire rows can be copied at once instead of each individual pixel. There -
releases/WebKitGTK/webkit-2.32/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FramebufferGL.cpp
r271118 r279331 1118 1118 // and dst region to appropriate in-bounds regions respectively. 1119 1119 gl::Rectangle realSourceRegion; 1120 ClipRectangle(bounds.sourceRegion, bounds.sourceBounds, &realSourceRegion); 1120 if (!ClipRectangle(bounds.sourceRegion, bounds.sourceBounds, &realSourceRegion)) 1121 { 1122 return angle::Result::Stop; 1123 } 1121 1124 GLuint xOffset = realSourceRegion.x - bounds.sourceRegion.x; 1122 1125 GLuint yOffset = realSourceRegion.y - bounds.sourceRegion.y; -
releases/WebKitGTK/webkit-2.32/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.mm
r273516 r279331 1837 1837 // Clip the render area to the viewport. 1838 1838 gl::Rectangle viewportClippedRenderArea; 1839 gl::ClipRectangle(renderArea, glState.getViewport(), &viewportClippedRenderArea); 1839 if (!gl::ClipRectangle(renderArea, glState.getViewport(), &viewportClippedRenderArea)) 1840 { 1841 viewportClippedRenderArea = gl::Rectangle(); 1842 } 1840 1843 1841 1844 gl::Rectangle scissoredArea = ClipRectToScissor(getState(), viewportClippedRenderArea, false); -
releases/WebKitGTK/webkit-2.32/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ContextVk.cpp
r270351 r279331 2617 2617 // Clip the render area to the viewport. 2618 2618 gl::Rectangle viewportClippedRenderArea; 2619 gl::ClipRectangle(renderArea, getCorrectedViewport(glState.getViewport()), 2620 &viewportClippedRenderArea); 2619 if (!gl::ClipRectangle(renderArea, getCorrectedViewport(glState.getViewport()), 2620 &viewportClippedRenderArea)) 2621 { 2622 viewportClippedRenderArea = gl::Rectangle(); 2623 } 2621 2624 2622 2625 gl::Rectangle scissoredArea = ClipRectToScissor(getState(), viewportClippedRenderArea, false); -
releases/WebKitGTK/webkit-2.32/Source/ThirdParty/ANGLE/src/tests/gl_tests/BlitFramebufferANGLETest.cpp
r270351 r279331 2438 2438 } 2439 2439 2440 // Test an edge case in D3D11 stencil blitting on the CPU that does not properly clip the 2441 // destination regions 2442 TEST_P(BlitFramebufferTest, BlitFramebufferStencilClipNoIntersection) 2443 { 2444 GLFramebuffer framebuffers[2]; 2445 glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffers[0]); 2446 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffers[1]); 2447 2448 GLRenderbuffer renderbuffers[2]; 2449 glBindRenderbuffer(GL_RENDERBUFFER, renderbuffers[0]); 2450 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 4, 4); 2451 glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 2452 renderbuffers[0]); 2453 2454 glBindRenderbuffer(GL_RENDERBUFFER, renderbuffers[1]); 2455 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 4, 4); 2456 glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 2457 renderbuffers[1]); 2458 2459 glBlitFramebuffer(0, 0, 4, 4, 1 << 24, 1 << 24, 1 << 25, 1 << 25, GL_STENCIL_BUFFER_BIT, 2460 GL_NEAREST); 2461 EXPECT_GL_NO_ERROR(); 2462 } 2463 2440 2464 // Use this to select which configurations (e.g. which renderer, which GLES major version) these 2441 2465 // tests should be run against.
Note:
See TracChangeset
for help on using the changeset viewer.