⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 279331 in webkit


Ignore:
Timestamp:
Jun 28, 2021, 4:52:38 AM (5 years ago)
Author:
Adrian Perez de Castro
Message:

Merge r278152 - Cherry-pick ANGLE: D3D11: Skip blits if there is no intersection of dest areas
​https://bugs.webkit.org/show_bug.cgi?id=225190
<rdar://77084155>

Patch by Kimmo Kinnunen <​kkinnunen@apple.com> on 2021-05-27
Reviewed by David Kilzer.

Cherry-pick ANGLE commit b574643ef28c92fcea5122dd7a72acb42a514eed
Fixes a security issue on D3D11.
Potential a correctness issue on some OpenGL drivers.
No effect on Metal, but the nodiscard part is still useful.

Upstream description:
D3D11: Skip blits if there is no intersection of dest areas

Blit11 would clip the destination rectangle with the destination size
but ignore the result. gl::ClipRectangle returns false when the
rectangles do not intersect at all, indicating the blit can be skipped.

This could lead to an out-of-bounds write to the GPU memory for the
destination texture.

Mark ClipRectangle as nodiscard to prevent future issues.

  • src/libANGLE/angletypes.h:
  • src/libANGLE/renderer/d3d/d3d11/Blit11.cpp:
  • src/libANGLE/renderer/gl/FramebufferGL.cpp:

(rx::FramebufferGL::clipSrcRegion):

  • src/libANGLE/renderer/metal/ContextMtl.mm:

(rx::ContextMtl::updateScissor):

  • src/libANGLE/renderer/vulkan/ContextVk.cpp:

(rx::ContextVk::updateScissor):

  • src/tests/gl_tests/BlitFramebufferANGLETest.cpp:

(TEST_P):

Location:
releases/WebKitGTK/webkit-2.32/Source/ThirdParty/ANGLE
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • releases/WebKitGTK/webkit-2.32/Source/ThirdParty/ANGLE/ChangeLog

    r273516 r279331  
     12021-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
    1362021-02-25  Kyle Piddington  <kpiddington@apple.com>
    237
  • releases/WebKitGTK/webkit-2.32/Source/ThirdParty/ANGLE/src/libANGLE/angletypes.h

    r270351 r279331  
    8585
    8686// Calculate the intersection of two rectangles.  Returns false if the intersection is empty.
    87 bool ClipRectangle(const Rectangle &source, const Rectangle &clip, Rectangle *intersection);
     87ANGLE_NO_DISCARD bool ClipRectangle(const Rectangle &source,
     88                                    const Rectangle &clip,
     89                                    Rectangle *intersection);
    8890// Calculate the smallest rectangle that covers both rectangles.  This rectangle may cover areas
    8991// 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  
    142142{
    143143    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    }
    145148
    146149    // 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  
    11181118        // and dst region to appropriate in-bounds regions respectively.
    11191119        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        }
    11211124        GLuint xOffset = realSourceRegion.x - bounds.sourceRegion.x;
    11221125        GLuint yOffset = realSourceRegion.y - bounds.sourceRegion.y;
  • releases/WebKitGTK/webkit-2.32/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.mm

    r273516 r279331  
    18371837    // Clip the render area to the viewport.
    18381838    gl::Rectangle viewportClippedRenderArea;
    1839     gl::ClipRectangle(renderArea, glState.getViewport(), &viewportClippedRenderArea);
     1839    if (!gl::ClipRectangle(renderArea, glState.getViewport(), &viewportClippedRenderArea))
     1840    {
     1841        viewportClippedRenderArea = gl::Rectangle();
     1842    }
    18401843
    18411844    gl::Rectangle scissoredArea = ClipRectToScissor(getState(), viewportClippedRenderArea, false);
  • releases/WebKitGTK/webkit-2.32/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ContextVk.cpp

    r270351 r279331  
    26172617    // Clip the render area to the viewport.
    26182618    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    }
    26212624
    26222625    gl::Rectangle scissoredArea = ClipRectToScissor(getState(), viewportClippedRenderArea, false);
  • releases/WebKitGTK/webkit-2.32/Source/ThirdParty/ANGLE/src/tests/gl_tests/BlitFramebufferANGLETest.cpp

    r270351 r279331  
    24382438}
    24392439
     2440// Test an edge case in D3D11 stencil blitting on the CPU that does not properly clip the
     2441// destination regions
     2442TEST_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
    24402464// Use this to select which configurations (e.g. which renderer, which GLES major version) these
    24412465// tests should be run against.
Note: See TracChangeset for help on using the changeset viewer.