Title: [290087] trunk
Revision
290087
Author
d...@apple.com
Date
2022-02-17 16:09:11 -0800 (Thu, 17 Feb 2022)

Log Message

Source/ThirdParty/ANGLE:
Metal ANGLE: vertex array does not correctly observe contents of data buffers
https://bugs.webkit.org/show_bug.cgi?id=236733
<rdar://problem/88713302>
<rdar://problem/88499073>

Patch by Kyle Piddington <kpidding...@apple.com> on 2022-02-17
Reviewed by Dean Jackson.

Similar to previous bug (236427), we were not correctly observing changes to the
vertex buffer data. This caused us to miss rebinding vertex buffers
when data was updated without causing conversion

* src/libANGLE/renderer/metal/VertexArrayMtl.h:
* src/libANGLE/renderer/metal/VertexArrayMtl.mm:
(rx::VertexArrayMtl::syncState):
(rx::VertexArrayMtl::setupDraw):
(rx::VertexArrayMtl::syncDirtyAttrib):

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (290086 => 290087)


--- trunk/LayoutTests/ChangeLog	2022-02-18 00:01:20 UTC (rev 290086)
+++ trunk/LayoutTests/ChangeLog	2022-02-18 00:09:11 UTC (rev 290087)
@@ -25,6 +25,22 @@
 
         * platform/ios/TestExpectations: Mark tests as failing.
 
+2022-02-17  Kyle Piddington  <kpidding...@apple.com>
+
+        Metal ANGLE: vertex array does not correctly observe contents of data buffers
+        https://bugs.webkit.org/show_bug.cgi?id=236733
+        <rdar://problem/88713302>
+        <rdar://problem/88499073>
+
+        Reviewed by Dean Jackson.
+
+        Similar to previous bug (236427), we were not correctly observing changes to the
+        vertex buffer data. This caused us to miss rebinding vertex buffers
+        when data was updated without causing conversion
+
+        * fast/canvas/webgl/buffer-data-subdata-dynamic-buffer.html: Added.
+        * fast/canvas/webgl/buffer-data-subdata-dynamic-buffer-expected.txt: Added.
+
 2022-02-17  Matteo Flores  <matteo_flo...@apple.com>
 
         [css-grid] Incorrectly stretched SVGs without an aspect-ratio.

Added: trunk/LayoutTests/fast/canvas/webgl/buffer-data-subdata-dynamic-buffer-expected.txt (0 => 290087)


--- trunk/LayoutTests/fast/canvas/webgl/buffer-data-subdata-dynamic-buffer-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/canvas/webgl/buffer-data-subdata-dynamic-buffer-expected.txt	2022-02-18 00:09:11 UTC (rev 290087)
@@ -0,0 +1,14 @@
+ Checks that update-draws of bufferSubData are respected
+
+PASS gl.getError() is gl.NO_ERROR
+PASS gl.getError() is gl.NO_ERROR
+PASS gl.getError() is gl.NO_ERROR
+PASS gl.getError() is gl.NO_ERROR
+PASS top-left of canvas should be green.
+PASS bottom-left of canvas should be green.
+PASS Top-right of canvas should be green.
+PASS bottom-right of canvas should be green.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Property changes on: trunk/LayoutTests/fast/canvas/webgl/buffer-data-subdata-dynamic-buffer-expected.txt
___________________________________________________________________

Added: svn:eol-style

+native \ No newline at end of property

Added: svn:keywords

+Date Revision \ No newline at end of property

Added: svn:mime-type

+text/plain \ No newline at end of property

Added: trunk/LayoutTests/fast/canvas/webgl/buffer-data-subdata-dynamic-buffer.html (0 => 290087)


--- trunk/LayoutTests/fast/canvas/webgl/buffer-data-subdata-dynamic-buffer.html	                        (rev 0)
+++ trunk/LayoutTests/fast/canvas/webgl/buffer-data-subdata-dynamic-buffer.html	2022-02-18 00:09:11 UTC (rev 290087)
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+<script src="" </script>
+</head>
+<body>
+<canvas id="example" width="40" height="40" style="width: 40px; height: 40px;"></canvas>
+<div id="description"></div>
+<div id="console"></div>
+<script id="vshader" type="x-shader/x-vertex">
+#ifdef GL_ES
+precision highp float;
+#endif
+attribute vec4 vPosition;
+void main()
+{
+    gl_Position = vPosition;
+}
+</script>
+
+<script id="fshader" type="x-shader/x-fragment">
+#ifdef GL_ES
+precision highp float;
+#endif
+void main()
+{
+    gl_FragColor = vec4(0, 1, 0, 1);
+}
+</script>
+
+<script>
+function init()
+{
+    if (window.initNonKhronosFramework)
+        window.initNonKhronosFramework(false);
+
+    debug("Checks that update-draws of bufferSubData are respected");
+    debug("");
+
+    if (window.internals)
+        internals.settings.setWebGL2Enabled(true);
+    gl = initWebGL("example", "vshader", "fshader", [ "vPosition", "index" ],
+                   [ 1, 1, 1, 1 ], 1, null, true);
+
+    gl.disable(gl.DEPTH_TEST);
+    gl.disable(gl.BLEND);
+
+     // Vertex buffer data lower left triangle
+    // 2     
+    //
+    // o    1
+    var vertexData1 = new Float32Array([-1, -1, 1, -1, -1, 1]);
+    //Vertex buffer data upper right triangle
+    // 2      1
+    //
+    //        0
+    var vertexData2 = new Float32Array([ 1., -1., 1., 1., -1., 1.]);
+    
+    var vertexObject = gl.createBuffer();
+    gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
+    shouldBe("gl.getError()", "gl.NO_ERROR")
+    gl.bufferData(gl.ARRAY_BUFFER, vertexData1, gl.DYNAMIC_DRAW);
+    shouldBe("gl.getError()", "gl.NO_ERROR");
+    gl.enableVertexAttribArray(0);
+    gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
+    shouldBe("gl.getError()", "gl.NO_ERROR");
+    gl.drawArrays(gl.TRIANGLES, 0, 3);
+    gl.bufferData(gl.ARRAY_BUFFER, vertexData2, gl.DYNAMIC_DRAW);
+    shouldBe("gl.getError()", "gl.NO_ERROR");
+    gl.drawArrays(gl.TRIANGLES, 0, 3);
+    gl.flush();
+    checkGreenValue(0, 0, 255, "top-left of canvas should be green.");
+    checkGreenValue(0, 39, 255, "bottom-left of canvas should be green.");
+    checkGreenValue(39, 0, 255, "Top-right of canvas should be green.");
+    checkGreenValue(39, 39, 255, "bottom-right of canvas should be green.");
+    gl.deleteBuffer(vertexObject);
+
+    function checkGreenValue(x, y, value, msg) {
+        
+        var buf = new Uint8Array(4);
+        gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, buf);
+        if (buf[1] != value || buf[3] != 255) {
+            debug('expected: green channel should = ' + value + ' but was = ' + buf[2] + '.');
+            testFailed(msg);
+            return;
+        }
+        testPassed(msg);
+    }
+}
+
+init();
+</script>
+<script src=""
+</body>
+</html>
\ No newline at end of file
Property changes on: trunk/LayoutTests/fast/canvas/webgl/buffer-data-subdata-dynamic-buffer.html
___________________________________________________________________

Added: svn:eol-style

+native \ No newline at end of property

Added: svn:keywords

+Date Revision \ No newline at end of property

Added: svn:mime-type

+text/html \ No newline at end of property

Modified: trunk/Source/ThirdParty/ANGLE/ChangeLog (290086 => 290087)


--- trunk/Source/ThirdParty/ANGLE/ChangeLog	2022-02-18 00:01:20 UTC (rev 290086)
+++ trunk/Source/ThirdParty/ANGLE/ChangeLog	2022-02-18 00:09:11 UTC (rev 290087)
@@ -1,3 +1,22 @@
+2022-02-17  Kyle Piddington  <kpidding...@apple.com>
+
+        Metal ANGLE: vertex array does not correctly observe contents of data buffers
+        https://bugs.webkit.org/show_bug.cgi?id=236733
+        <rdar://problem/88713302>
+        <rdar://problem/88499073>
+
+        Reviewed by Dean Jackson.
+
+        Similar to previous bug (236427), we were not correctly observing changes to the
+        vertex buffer data. This caused us to miss rebinding vertex buffers
+        when data was updated without causing conversion
+
+        * src/libANGLE/renderer/metal/VertexArrayMtl.h:
+        * src/libANGLE/renderer/metal/VertexArrayMtl.mm:
+        (rx::VertexArrayMtl::syncState):
+        (rx::VertexArrayMtl::setupDraw):
+        (rx::VertexArrayMtl::syncDirtyAttrib):
+
 2022-02-17  Adrian Perez de Castro  <ape...@igalia.com>
 
         [GTK] Build broken with ENABLE_X11_TARGET=OFF and no X11 headers present

Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/VertexArrayMtl.h (290086 => 290087)


--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/VertexArrayMtl.h	2022-02-18 00:01:20 UTC (rev 290086)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/VertexArrayMtl.h	2022-02-18 00:09:11 UTC (rev 290087)
@@ -151,8 +151,9 @@
     mtl::BufferPool mDynamicIndexData;
 
     std::vector<uint32_t> mEmulatedInstanceAttribs;
-    bool mElementArrayDirty = true;
+
     bool mVertexArrayDirty = true;
+    bool mVertexDataDirty = true;
 };
 }  // namespace rx
 

Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/VertexArrayMtl.mm (290086 => 290087)


--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/VertexArrayMtl.mm	2022-02-18 00:01:20 UTC (rev 290086)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/VertexArrayMtl.mm	2022-02-18 00:09:11 UTC (rev 290087)
@@ -273,7 +273,7 @@
             case gl::VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER:
             case gl::VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER_DATA:
             {
-                mElementArrayDirty = true;
+                mVertexDataDirty = true;
                 break;
             }
 
@@ -301,7 +301,7 @@
     case gl::VertexArray::DIRTY_BIT_BUFFER_DATA_0 + INDEX:                                        \
         ANGLE_TRY(syncDirtyAttrib(context, attribs[INDEX], bindings[attribs[INDEX].bindingIndex], \
                                   INDEX));                                                        \
-        mVertexArrayDirty = true;                                                                 \
+        mVertexDataDirty = true;                                                                 \
         break;
 
                 ANGLE_VERTEX_INDEX_CASES(ANGLE_VERTEX_DIRTY_BUFFER_DATA_FUNC)
@@ -480,9 +480,9 @@
         }  // for (v)
     }
 
-    if(dirty || mElementArrayDirty)
+    if(dirty || mVertexDataDirty)
     {
-        mElementArrayDirty = false;
+        mVertexDataDirty = false;
         const gl::ProgramExecutable *executable = glContext->getState().getProgramExecutable();
         const gl::AttributesMask &programActiveAttribsMask =
                 executable->getActiveAttribLocationsMask();
@@ -652,6 +652,7 @@
         if (bufferGL)
         {
             BufferMtl *bufferMtl = mtl::GetImpl(bufferGL);
+            mContentsObservers->enableForBuffer(bufferGL, static_cast<uint32_t>(attribIndex));
             bool needConversion =
                 format.actualFormatId != format.intendedFormatId ||
                 (binding.getOffset() % format.actualAngleFormat().pixelBytes) != 0 ||
@@ -661,12 +662,10 @@
 
             if (needConversion)
             {
-                mContentsObservers->enableForBuffer(bufferGL, static_cast<uint32_t>(attribIndex));
                 ANGLE_TRY(convertVertexBuffer(glContext, bufferMtl, binding, attribIndex, format));
             }
             else
             {
-                mContentsObservers->disableForBuffer(bufferGL, static_cast<uint32_t>(attribIndex));
                 mCurrentArrayBuffers[attribIndex]       = bufferMtl;
                 mCurrentArrayBufferOffsets[attribIndex] = binding.getOffset();
                 mCurrentArrayBufferStrides[attribIndex] = binding.getStride();
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to