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

Changeset 293317 in webkit


Ignore:
Timestamp:
Apr 25, 2022, 12:04:37 AM (4 years ago)
Author:
commit-queue@webkit.org
Message:

REGRESSION (Safari 15.4) Performance regression after uploading WebGL buffers
https://bugs.webkit.org/show_bug.cgi?id=239015

Patch by Kimmo Kinnunen <kkinnunen@apple.com> on 2022-04-25
Reviewed by Dean Jackson.

BufferMtl::getRestartIndices() would recalculate restart indices on each
draw because RestartRangeCache::operator bool() would return m_isDirty
instead of the intended !m_isDirty.

Use std::optional to hold the RestartRangeCache instead of
maintaining m_isDirty. This allows the type system to contribute to the
correctness of the code. Dirty restart range cache is not useful and takes
up memory.

Re-apply hunks from r281550 "ANGLE Metal index buffer left mapped when building primitive restart ranges".

These were overwritten in r286638 "Roll ANGLE to include upstreamed Metal backend".

  • src/libANGLE/renderer/metal/BufferMtl.h:

(rx::BufferMtl::RestartRangeCache::RestartRangeCache):

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

(rx::BufferMtl::markConversionBuffersDirty):
(rx::BufferMtl::clearConversionBuffers):
(rx::BufferMtl::getRestartIndices):

Location:
trunk/Source/ThirdParty/ANGLE
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/ThirdParty/ANGLE/ChangeLog

    r292959 r293317  
     12022-04-25  Kimmo Kinnunen  <kkinnunen@apple.com>
     2
     3        REGRESSION (Safari 15.4) Performance regression after uploading WebGL buffers
     4        https://bugs.webkit.org/show_bug.cgi?id=239015
     5
     6        Reviewed by Dean Jackson.
     7
     8        BufferMtl::getRestartIndices() would recalculate restart indices on each
     9        draw because RestartRangeCache::operator bool() would return m_isDirty
     10        instead of the intended !m_isDirty.
     11
     12        Use std::optional to hold the RestartRangeCache instead of
     13        maintaining m_isDirty. This allows the type system to contribute to the
     14        correctness of the code. Dirty restart range cache is not useful and takes
     15        up memory.
     16
     17        Re-apply hunks from r281550 "ANGLE Metal index buffer left mapped when building primitive restart ranges".
     18
     19        These were overwritten in r286638 "Roll ANGLE to include upstreamed Metal backend".
     20
     21        * src/libANGLE/renderer/metal/BufferMtl.h:
     22        (rx::BufferMtl::RestartRangeCache::RestartRangeCache):
     23        * src/libANGLE/renderer/metal/BufferMtl.mm:
     24        (rx::BufferMtl::markConversionBuffersDirty):
     25        (rx::BufferMtl::clearConversionBuffers):
     26        (rx::BufferMtl::getRestartIndices):
     27
    1282022-04-18  Elliott Williams  <emw@apple.com>
    229
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/BufferMtl.h

    r287068 r293317  
    1313#import <Metal/Metal.h>
    1414
     15#include <optional>
    1516#include <utility>
    1617
     
    216217    struct RestartRangeCache
    217218    {
    218         RestartRangeCache() : indexType(gl::DrawElementsType::InvalidEnum) { isDirty = true; }
    219219        RestartRangeCache(std::vector<IndexRange> &&ranges_, gl::DrawElementsType indexType_)
    220             : ranges(ranges_), indexType(indexType_), isDirty(false)
     220            : ranges(ranges_), indexType(indexType_)
    221221        {}
    222         void markDirty() { isDirty = true; }
    223         operator bool() const { return isDirty; }
    224         std::vector<IndexRange> ranges;
    225         gl::DrawElementsType indexType;
    226         bool isDirty;
     222        const std::vector<IndexRange> ranges;
     223        const gl::DrawElementsType indexType;
    227224    };
    228     RestartRangeCache mRestartRangeCache;
     225    std::optional<RestartRangeCache> mRestartRangeCache;
    229226    std::vector<IndexRange> mRestartIndices;
    230227};
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/BufferMtl.mm

    r287068 r293317  
    396396        buffer.convertedOffset = 0;
    397397    }
    398     mRestartRangeCache.markDirty();
     398    mRestartRangeCache.reset();
    399399}
    400400
     
    404404    mIndexConversionBuffers.clear();
    405405    mUniformConversionBuffers.clear();
    406     mRestartRangeCache.markDirty();
     406    mRestartRangeCache.reset();
    407407}
    408408
     
    434434                                                            gl::DrawElementsType indexType)
    435435{
    436     if (!mRestartRangeCache || mRestartRangeCache.indexType != indexType)
    437     {
    438         mRestartRangeCache.markDirty();
     436    if (!mRestartRangeCache || mRestartRangeCache->indexType != indexType)
     437    {
     438        mRestartRangeCache.reset();
    439439        std::vector<IndexRange> ranges;
    440440        switch (indexType)
     
    452452                ASSERT(false);
    453453        }
    454         mRestartRangeCache = RestartRangeCache(std::move(ranges), indexType);
    455     }
    456     return mRestartRangeCache.ranges;
     454        mRestartRangeCache.emplace(std::move(ranges), indexType);
     455    }
     456    return mRestartRangeCache->ranges;
    457457}
    458458
Note: See TracChangeset for help on using the changeset viewer.