Title: [293317] trunk/Source/ThirdParty/ANGLE
Revision
293317
Author
[email protected]
Date
2022-04-25 00:04:37 -0700 (Mon, 25 Apr 2022)

Log Message

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

Patch by Kimmo Kinnunen <[email protected]> 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):

Modified Paths

Diff

Modified: trunk/Source/ThirdParty/ANGLE/ChangeLog (293316 => 293317)


--- trunk/Source/ThirdParty/ANGLE/ChangeLog	2022-04-25 06:54:42 UTC (rev 293316)
+++ trunk/Source/ThirdParty/ANGLE/ChangeLog	2022-04-25 07:04:37 UTC (rev 293317)
@@ -1,3 +1,30 @@
+2022-04-25  Kimmo Kinnunen  <[email protected]>
+
+        REGRESSION (Safari 15.4) Performance regression after uploading WebGL buffers
+        https://bugs.webkit.org/show_bug.cgi?id=239015
+
+        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):
+
 2022-04-18  Elliott Williams  <[email protected]>
 
         [XCBuild] Use XCBuild for all command-line and project builds

Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/BufferMtl.h (293316 => 293317)


--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/BufferMtl.h	2022-04-25 06:54:42 UTC (rev 293316)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/BufferMtl.h	2022-04-25 07:04:37 UTC (rev 293317)
@@ -12,6 +12,7 @@
 
 #import <Metal/Metal.h>
 
+#include <optional>
 #include <utility>
 
 #include "libANGLE/Buffer.h"
@@ -215,17 +216,13 @@
 
     struct RestartRangeCache
     {
-        RestartRangeCache() : indexType(gl::DrawElementsType::InvalidEnum) { isDirty = true; }
         RestartRangeCache(std::vector<IndexRange> &&ranges_, gl::DrawElementsType indexType_)
-            : ranges(ranges_), indexType(indexType_), isDirty(false)
+            : ranges(ranges_), indexType(indexType_)
         {}
-        void markDirty() { isDirty = true; }
-        operator bool() const { return isDirty; }
-        std::vector<IndexRange> ranges;
-        gl::DrawElementsType indexType;
-        bool isDirty;
+        const std::vector<IndexRange> ranges;
+        const gl::DrawElementsType indexType;
     };
-    RestartRangeCache mRestartRangeCache;
+    std::optional<RestartRangeCache> mRestartRangeCache;
     std::vector<IndexRange> mRestartIndices;
 };
 

Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/BufferMtl.mm (293316 => 293317)


--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/BufferMtl.mm	2022-04-25 06:54:42 UTC (rev 293316)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/BufferMtl.mm	2022-04-25 07:04:37 UTC (rev 293317)
@@ -395,7 +395,7 @@
         buffer.convertedBuffer = nullptr;
         buffer.convertedOffset = 0;
     }
-    mRestartRangeCache.markDirty();
+    mRestartRangeCache.reset();
 }
 
 void BufferMtl::clearConversionBuffers()
@@ -403,7 +403,7 @@
     mVertexConversionBuffers.clear();
     mIndexConversionBuffers.clear();
     mUniformConversionBuffers.clear();
-    mRestartRangeCache.markDirty();
+    mRestartRangeCache.reset();
 }
 
 template <typename T>
@@ -433,9 +433,9 @@
 const std::vector<IndexRange> &BufferMtl::getRestartIndices(ContextMtl *ctx,
                                                             gl::DrawElementsType indexType)
 {
-    if (!mRestartRangeCache || mRestartRangeCache.indexType != indexType)
+    if (!mRestartRangeCache || mRestartRangeCache->indexType != indexType)
     {
-        mRestartRangeCache.markDirty();
+        mRestartRangeCache.reset();
         std::vector<IndexRange> ranges;
         switch (indexType)
         {
@@ -451,9 +451,9 @@
             default:
                 ASSERT(false);
         }
-        mRestartRangeCache = RestartRangeCache(std::move(ranges), indexType);
+        mRestartRangeCache.emplace(std::move(ranges), indexType);
     }
-    return mRestartRangeCache.ranges;
+    return mRestartRangeCache->ranges;
 }
 
 const std::vector<IndexRange> BufferMtl::getRestartIndicesFromClientData(
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to