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