Diff
Modified: trunk/Source/ThirdParty/ANGLE/ChangeLog (283013 => 283014)
--- trunk/Source/ThirdParty/ANGLE/ChangeLog 2021-09-23 22:01:16 UTC (rev 283013)
+++ trunk/Source/ThirdParty/ANGLE/ChangeLog 2021-09-23 22:08:09 UTC (rev 283014)
@@ -1,3 +1,14 @@
+2021-09-23 Kyle Piddington <[email protected]>
+
+ [WebGL2, Safari 15 - iOS15] Problems with drawElements in some conditions
+ https://bugs.webkit.org/show_bug.cgi?id=230107
+
+ Index buffer rewrite was dispatching too many threads.
+ Reviewed by Dean Jackson.
+
+ * src/libANGLE/renderer/metal/ProvokingVertexHelper.mm:
+ (rx::ProvokingVertexHelper::preconditionIndexBuffer):
+
2021-09-20 Kimmo Kinnunen <[email protected]>
ANGLE Metal: single-component swizzles do not compile
Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProvokingVertexHelper.mm (283013 => 283014)
--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProvokingVertexHelper.mm 2021-09-23 22:01:16 UTC (rev 283013)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProvokingVertexHelper.mm 2021-09-23 22:08:09 UTC (rev 283014)
@@ -216,7 +216,9 @@
uint newIndexCount = indexCountForPrimCount(indexBufferKey, primCount);
size_t indexSize = gl::GetDrawElementsTypeSize(elementsType);
mtl::BufferRef newBuffer;
- if(mIndexBuffers.allocate(context, newIndexCount * indexSize,nullptr,&newBuffer) == angle::Result::Stop)
+ // To simplify draw loop code, we allocate space for the offset. This could be optimized to reduce
+ // memory, if needed.
+ if(mIndexBuffers.allocate(context, indexOffset + newIndexCount * indexSize, nullptr, &newBuffer) == angle::Result::Stop)
{
return nullptr;
}
@@ -229,7 +231,8 @@
encoder->setBuffer(indexBuffer, (uint32_t)indexOffset, 0);
encoder->setBufferForWrite(newBuffer,(uint32_t) indexOffset, 1);
encoder->setData(&indexCountEncoded, 2);
- encoder->dispatch(MTLSizeMake(primCount, 1, 1), threadsPerThreadgroup);
+ encoder->setData(&primCount, 3);
+ encoder->dispatch(MTLSizeMake((primCount + threadsPerThreadgroup.width - 1)/ threadsPerThreadgroup.width, 1, 1), threadsPerThreadgroup);
outIndexcount = newIndexCount;
outPrimitiveMode = getNewPrimitiveMode(indexBufferKey);
return newBuffer;
Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/rewrite_indices.metal (283013 => 283014)
--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/rewrite_indices.metal 2021-09-23 22:01:16 UTC (rev 283013)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/rewrite_indices.metal 2021-09-23 22:08:09 UTC (rev 283014)
@@ -219,6 +219,7 @@
device ushort *outIndexBufferUint16 [[ buffer(1), function_constant(outIndexBufferIsUint16) ]],
device uint *outIndexBufferUint32 [[ buffer(1), function_constant(outIndexBufferIsUint32) ]],
constant uint &indexCount [[ buffer(2) ]],
+ constant uint &primCount [[ buffer(3) ]],
uint prim [[thread_position_in_grid]])
{
constexpr uint restartIndex = 0xFFFFFFFF; // unused
@@ -225,30 +226,32 @@
uint baseIndex = 0;
uint _onIndex_ = onIndex;
uint _onOutIndex_ = onOutIndex;
- switch(fixIndexBufferMode)
+ if(prim < primCount)
{
- case MtlFixIndexBufferKeyPoints:
- _onIndex_ = prim;
- _onOutIndex_ = prim;
- break;
- case MtlFixIndexBufferKeyLines:
- _onIndex_ = prim * 2 + 0;
- _onOutIndex_ = prim * 2 + 0;
- break;
- case MtlFixIndexBufferKeyLineStrip:
- _onIndex_ = prim;
- _onOutIndex_ = prim * 2 + 0;
- break;
- case MtlFixIndexBufferKeyTriangles:
- _onIndex_ = prim * 3 + 0;
- _onOutIndex_ = prim * 3 + 0;
- break;
- case MtlFixIndexBufferKeyTriangleStrip:
- _onIndex_ = prim;
- _onOutIndex_ = prim * 3 + 0;
- break;
-
+ switch(fixIndexBufferMode)
+ {
+ case MtlFixIndexBufferKeyPoints:
+ _onIndex_ = prim;
+ _onOutIndex_ = prim;
+ break;
+ case MtlFixIndexBufferKeyLines:
+ _onIndex_ = prim * 2 + 0;
+ _onOutIndex_ = prim * 2 + 0;
+ break;
+ case MtlFixIndexBufferKeyLineStrip:
+ _onIndex_ = prim;
+ _onOutIndex_ = prim * 2 + 0;
+ break;
+ case MtlFixIndexBufferKeyTriangles:
+ _onIndex_ = prim * 3 + 0;
+ _onOutIndex_ = prim * 3 + 0;
+ break;
+ case MtlFixIndexBufferKeyTriangleStrip:
+ _onIndex_ = prim;
+ _onOutIndex_ = prim * 3 + 0;
+ break;
+ }
+ outputPrimitive(indexBufferUint16, indexBufferUint32, outIndexBufferUint16, outIndexBufferUint32, restartIndex, indexCount, baseIndex, onIndex, onOutIndex);
}
- outputPrimitive(indexBufferUint16, indexBufferUint32, outIndexBufferUint16, outIndexBufferUint32, restartIndex, indexCount, baseIndex, onIndex, onOutIndex);
}