Title: [283014] trunk/Source/ThirdParty/ANGLE
Revision
283014
Author
[email protected]
Date
2021-09-23 15:08:09 -0700 (Thu, 23 Sep 2021)

Log Message

[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):

Modified Paths

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);
 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to