Log Message
Fix transform feedback tests https://bugs.webkit.org/show_bug.cgi?id=213906
Patch by James Darpinian <[email protected]> on 2020-07-06 Reviewed by Dean Jackson. Fix transform feedback conformance tests by implementing missing functionality such as: - Transform feedback object state tracking - Validation for all GL errors that can affect state tracking before calling ANGLE - Default transform feedback object - Pause/resume - Fix vertexAttribDivisor in WebGL 2 (unrelated to transform feedback) After this, all related tests pass except for a few that also fail in Chrome, and one that uses PIXEL_PACK_BUFFER which is not yet supported. * html/canvas/WebGL2RenderingContext.cpp: (WebCore::WebGL2RenderingContext::~WebGL2RenderingContext): (WebCore::WebGL2RenderingContext::initializeNewContext): (WebCore::WebGL2RenderingContext::deleteTransformFeedback): (WebCore::WebGL2RenderingContext::bindTransformFeedback): (WebCore::ValidateTransformFeedbackPrimitiveMode): (WebCore::WebGL2RenderingContext::beginTransformFeedback): (WebCore::WebGL2RenderingContext::endTransformFeedback): (WebCore::WebGL2RenderingContext::transformFeedbackVaryings): (WebCore::WebGL2RenderingContext::pauseTransformFeedback): (WebCore::WebGL2RenderingContext::resumeTransformFeedback): (WebCore::WebGL2RenderingContext::setIndexedBufferBinding): (WebCore::WebGL2RenderingContext::getIndexedParameter): (WebCore::WebGL2RenderingContext::getMaxTransformFeedbackSeparateAttribs): (WebCore::WebGL2RenderingContext::getParameter): (WebCore::WebGL2RenderingContext::uncacheDeletedBuffer): * html/canvas/WebGL2RenderingContext.h: * html/canvas/WebGLProgram.cpp: (WebCore::WebGLProgram::cacheInfoIfNeeded): * html/canvas/WebGLProgram.h: * html/canvas/WebGLTransformFeedback.cpp: (WebCore::WebGLTransformFeedback::create): (WebCore::WebGLTransformFeedback::WebGLTransformFeedback): (WebCore::WebGLTransformFeedback::setProgram): (WebCore::WebGLTransformFeedback::setBoundIndexedTransformFeedbackBuffer): (WebCore::WebGLTransformFeedback::getBoundIndexedTransformFeedbackBuffer): (WebCore::WebGLTransformFeedback::hasEnoughBuffers const): (WebCore::WebGLTransformFeedback::usesBuffer): (WebCore::WebGLTransformFeedback::unbindBuffer): (WebCore::WebGLTransformFeedback::validateProgramForResume const): * html/canvas/WebGLTransformFeedback.h: * platform/graphics/angle/GraphicsContextGLANGLE.cpp: (WebCore::GraphicsContextGLOpenGL::vertexAttribDivisor):
Modified Paths
- trunk/LayoutTests/webgl/2.0.0/conformance2/rendering/instanced-arrays-expected.txt
- trunk/LayoutTests/webgl/2.0.0/conformance2/rendering/instanced-rendering-bug-expected.txt
- trunk/LayoutTests/webgl/2.0.0/conformance2/state/gl-object-get-calls-expected.txt
- trunk/LayoutTests/webgl/2.0.0/conformance2/transform_feedback/transform_feedback-expected.txt
- trunk/Source/WebCore/ChangeLog
- trunk/Source/WebCore/bindings/js/CallTracerTypes.h
- trunk/Source/WebCore/bindings/js/WebCoreBuiltinNames.h
- trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp
- trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.h
- trunk/Source/WebCore/html/canvas/WebGLProgram.cpp
- trunk/Source/WebCore/html/canvas/WebGLProgram.h
- trunk/Source/WebCore/html/canvas/WebGLTransformFeedback.cpp
- trunk/Source/WebCore/html/canvas/WebGLTransformFeedback.h
- trunk/Source/WebCore/html/canvas/WebGLTransformFeedback.idl
- trunk/Source/WebCore/platform/graphics/angle/GraphicsContextGLANGLE.cpp
Diff
Modified: trunk/LayoutTests/webgl/2.0.0/conformance2/rendering/instanced-arrays-expected.txt (263998 => 263999)
--- trunk/LayoutTests/webgl/2.0.0/conformance2/rendering/instanced-arrays-expected.txt 2020-07-06 23:59:23 UTC (rev 263998)
+++ trunk/LayoutTests/webgl/2.0.0/conformance2/rendering/instanced-arrays-expected.txt 2020-07-07 00:01:51 UTC (rev 263999)
@@ -1,57 +1,5 @@
This test runs the WebGL Test listed below in an iframe and reports PASS or FAIL.
Test: ../../resources/webgl_test_files/conformance2/rendering/instanced-arrays.html
-[ 1: PASS ] WebGL context exists
-[ 2: PASS ] gl.VERTEX_ATTRIB_ARRAY_DIVISOR is 0x88FE
-[ 3: PASS ] Vertex attribute 0 must has a default divisor of 0
-[ 4: PASS ] Vertex attribute 1 must has a default divisor of 0
-[ 5: PASS ] Vertex attribute 2 must has a default divisor of 0
-[ 6: PASS ] Vertex attribute 3 must has a default divisor of 0
-[ 7: PASS ] Vertex attribute 4 must has a default divisor of 0
-[ 8: PASS ] Vertex attribute 5 must has a default divisor of 0
-[ 9: PASS ] Vertex attribute 6 must has a default divisor of 0
-[ 10: PASS ] Vertex attribute 7 must has a default divisor of 0
-[ 11: PASS ] Vertex attribute 8 must has a default divisor of 0
-[ 12: PASS ] Vertex attribute 9 must has a default divisor of 0
-[ 13: PASS ] Vertex attribute 10 must has a default divisor of 0
-[ 14: PASS ] Vertex attribute 11 must has a default divisor of 0
-[ 15: PASS ] Vertex attribute 12 must has a default divisor of 0
-[ 16: PASS ] Vertex attribute 13 must has a default divisor of 0
-[ 17: PASS ] Vertex attribute 14 must has a default divisor of 0
-[ 18: PASS ] Vertex attribute 15 must has a default divisor of 0
-[ 19: PASS ] getError was expected value: INVALID_VALUE : vertexAttribDivisor index set greater than or equal to MAX_VERTEX_ATTRIBS should be an invalid value
-[ 20: FAIL ] getError expected: NO_ERROR. Was INVALID_OPERATION : vertexAttribDivisor index set less than MAX_VERTEX_ATTRIBS should succeed
-[ 21: PASS ] Set value of VERTEX_ATTRIB_ARRAY_DIVISOR matches expecation
-[ 22: FAIL ] should be 255,0,0,255 at (0, 25) expected: 255,0,0,255 was 0,0,0,0
-[ 23: FAIL ] should be 0,255,0,255 at (25, 25) expected: 0,255,0,255 was 0,0,0,0
-[ 24: FAIL ] should be 0,0,255,255 at (0, 0) expected: 0,0,255,255 was 0,0,0,0
-[ 25: FAIL ] should be 255,255,0,255 at (25, 0) expected: 255,255,0,255 was 0,0,0,0
-[ 26: FAIL ] getError expected: INVALID_VALUE. Was INVALID_OPERATION : drawArraysInstanced cannot have a primcount less than 0
-[ 27: PASS ] getError was expected value: INVALID_VALUE : drawArraysInstanced cannot have a count less than 0
-[ 28: FAIL ] getError expected: NO_ERROR. Was INVALID_OPERATION : It's allowed for all vertex attributes to have non-zero divisors when calling drawArraysInstanced
-[ 29: FAIL ] getError expected: NO_ERROR. Was INVALID_OPERATION : drawArraysInstanced with POINTS should succeed
-[ 30: FAIL ] getError expected: NO_ERROR. Was INVALID_OPERATION : drawArraysInstanced with LINES should succeed
-[ 31: FAIL ] getError expected: NO_ERROR. Was INVALID_OPERATION : drawArraysInstanced with LINE_LIST should return succeed
-[ 32: FAIL ] getError expected: NO_ERROR. Was INVALID_OPERATION : drawArraysInstanced with TRI_LIST should succeed
-[ 33: PASS ] getError was expected value: INVALID_ENUM : drawArraysInstanced with QUAD_STRIP should return INVALID_ENUM
-[ 34: PASS ] getError was expected value: INVALID_ENUM : drawArraysInstanced with QUADS should return INVALID_ENUM
-[ 35: PASS ] getError was expected value: INVALID_ENUM : drawArraysInstanced with POLYGON should return INVALID_ENUM
-[ 36: FAIL ] should be 255,0,0,255 at (0, 25) expected: 255,0,0,255 was 0,0,0,0
-[ 37: FAIL ] should be 0,255,0,255 at (25, 25) expected: 0,255,0,255 was 0,0,0,0
-[ 38: FAIL ] should be 0,0,255,255 at (0, 0) expected: 0,0,255,255 was 0,0,0,0
-[ 39: FAIL ] should be 255,255,0,255 at (25, 0) expected: 255,255,0,255 was 0,0,0,0
-[ 40: PASS ] getError was expected value: INVALID_VALUE : drawElementsInstanced cannot have a primcount less than 0
-[ 41: PASS ] getError was expected value: INVALID_VALUE : drawElementsInstanced cannot have a count less than 0
-[ 42: FAIL ] getError expected: NO_ERROR. Was INVALID_OPERATION : It's allowed for all vertex attributes to have non-zero divisors when calling drawElementsInstanced
-[ 43: FAIL ] getError expected: NO_ERROR. Was INVALID_OPERATION : drawElementsInstanced with UNSIGNED_BYTE should succeed
-[ 44: PASS ] getError was expected value: NO_ERROR : drawElementsInstanced with POINTS should succeed
-[ 45: PASS ] getError was expected value: NO_ERROR : drawElementsInstanced with LINES should succeed
-[ 46: PASS ] getError was expected value: NO_ERROR : drawElementsInstanced with LINE_LIST should return succeed
-[ 47: PASS ] getError was expected value: NO_ERROR : drawElementsInstanced with TRI_LIST should succeed
-[ 48: PASS ] getError was expected value: INVALID_ENUM : drawElementsInstanced with QUAD_STRIP should return INVALID_ENUM
-[ 49: PASS ] getError was expected value: INVALID_ENUM : drawElementsInstanced with QUADS should return INVALID_ENUM
-[ 50: PASS ] getError was expected value: INVALID_ENUM : drawElementsInstanced with POLYGON should return INVALID_ENUM
-[ 51: PASS ] getError was expected value: NO_ERROR : there should be no errors
-[ 52: PASS ] successfullyParsed is true
-[ FAIL ] 17 failures reported
+[ PASS ] All tests passed
Modified: trunk/LayoutTests/webgl/2.0.0/conformance2/rendering/instanced-rendering-bug-expected.txt (263998 => 263999)
--- trunk/LayoutTests/webgl/2.0.0/conformance2/rendering/instanced-rendering-bug-expected.txt 2020-07-06 23:59:23 UTC (rev 263998)
+++ trunk/LayoutTests/webgl/2.0.0/conformance2/rendering/instanced-rendering-bug-expected.txt 2020-07-07 00:01:51 UTC (rev 263999)
@@ -1,87 +1,5 @@
This test runs the WebGL Test listed below in an iframe and reports PASS or FAIL.
Test: ../../resources/webgl_test_files/conformance2/rendering/instanced-rendering-bug.html
-[ 1: PASS ] WebGL context exists
-[ 2: PASS ] Set up program succeeded
-[ 3: FAIL ] getError expected: NO_ERROR. Was INVALID_OPERATION : drawArraysInstanced should succeed
-[ 4: FAIL ] instance 0 should be 127,0,0,255 at (1, 0) expected: 127,0,0,255 was 0,0,0,0
-[ 5: FAIL ] instance 1 should be 127,0,0,255 at (38, 0) expected: 127,0,0,255 was 0,0,0,0
-[ 6: FAIL ] instance 2 should be 127,0,0,255 at (76, 0) expected: 127,0,0,255 was 0,0,0,0
-[ 7: FAIL ] instance 3 should be 127,0,0,255 at (113, 0) expected: 127,0,0,255 was 0,0,0,0
-[ 8: FAIL ] instance 4 should be 255,0,0,255 at (151, 0) expected: 255,0,0,255 was 0,0,0,0
-[ 9: FAIL ] instance 5 should be 255,0,0,255 at (188, 0) expected: 255,0,0,255 was 0,0,0,0
-[ 10: FAIL ] instance 6 should be 255,0,0,255 at (226, 0) expected: 255,0,0,255 was 0,0,0,0
-[ 11: FAIL ] instance 7 should be 255,0,0,255 at (263, 0) expected: 255,0,0,255 was 0,0,0,0
-[ 12: PASS ] getError was expected value: NO_ERROR : clean up should succeed
-[ 13: PASS ] Set up program succeeded
-[ 14: FAIL ] getError expected: NO_ERROR. Was INVALID_OPERATION : drawArraysInstanced should succeed
-[ 15: FAIL ] instance 0 should be 102,0,0,255 at (1, 0) expected: 102,0,0,255 was 0,0,0,0
-[ 16: FAIL ] instance 1 should be 102,0,0,255 at (51, 0) expected: 102,0,0,255 was 0,0,0,0
-[ 17: FAIL ] instance 2 should be 102,0,0,255 at (101, 0) expected: 102,0,0,255 was 0,0,0,0
-[ 18: FAIL ] instance 3 should be 102,0,0,255 at (151, 0) expected: 102,0,0,255 was 0,0,0,0
-[ 19: FAIL ] instance 4 should be 204,0,0,255 at (201, 0) expected: 204,0,0,255 was 0,0,0,0
-[ 20: FAIL ] instance 5 should be 204,0,0,255 at (251, 0) expected: 204,0,0,255 was 0,0,0,0
-[ 21: PASS ] getError was expected value: NO_ERROR : clean up should succeed
-[ 22: PASS ] Set up program succeeded
-[ 23: FAIL ] getError expected: NO_ERROR. Was INVALID_OPERATION : drawArraysInstanced should succeed
-[ 24: FAIL ] instance 0 should be 127,0,0,255 at (1, 0) expected: 127,0,0,255 was 0,0,0,0
-[ 25: FAIL ] instance 1 should be 127,0,0,255 at (51, 0) expected: 127,0,0,255 was 0,0,0,0
-[ 26: FAIL ] instance 2 should be 127,0,0,255 at (101, 0) expected: 127,0,0,255 was 0,0,0,0
-[ 27: FAIL ] instance 3 should be 255,0,0,255 at (151, 0) expected: 255,0,0,255 was 0,0,0,0
-[ 28: FAIL ] instance 4 should be 255,0,0,255 at (201, 0) expected: 255,0,0,255 was 0,0,0,0
-[ 29: FAIL ] instance 5 should be 255,0,0,255 at (251, 0) expected: 255,0,0,255 was 0,0,0,0
-[ 30: PASS ] getError was expected value: NO_ERROR : clean up should succeed
-[ 31: PASS ] Set up program succeeded
-[ 32: FAIL ] getError expected: NO_ERROR. Was INVALID_OPERATION : drawArraysInstanced should succeed
-[ 33: FAIL ] instance 0 should be 69,0,0,255 at (1, 0) expected: 69,0,0,255 was 0,0,0,0
-[ 34: FAIL ] instance 1 should be 69,0,0,255 at (38, 0) expected: 69,0,0,255 was 0,0,0,0
-[ 35: FAIL ] instance 2 should be 69,0,0,255 at (76, 0) expected: 69,0,0,255 was 0,0,0,0
-[ 36: FAIL ] instance 3 should be 139,0,0,255 at (113, 0) expected: 139,0,0,255 was 0,0,0,0
-[ 37: FAIL ] instance 4 should be 139,0,0,255 at (151, 0) expected: 139,0,0,255 was 0,0,0,0
-[ 38: FAIL ] instance 5 should be 139,0,0,255 at (188, 0) expected: 139,0,0,255 was 0,0,0,0
-[ 39: FAIL ] instance 6 should be 208,0,0,255 at (226, 0) expected: 208,0,0,255 was 0,0,0,0
-[ 40: FAIL ] instance 7 should be 208,0,0,255 at (263, 0) expected: 208,0,0,255 was 0,0,0,0
-[ 41: PASS ] getError was expected value: NO_ERROR : clean up should succeed
-[ 42: PASS ] Set up program succeeded
-[ 43: FAIL ] getError expected: NO_ERROR. Was INVALID_OPERATION : drawElementsInstanced should succeed
-[ 44: FAIL ] instance 0 should be 127,0,0,255 at (1, 0) expected: 127,0,0,255 was 0,0,0,0
-[ 45: FAIL ] instance 1 should be 127,0,0,255 at (38, 0) expected: 127,0,0,255 was 0,0,0,0
-[ 46: FAIL ] instance 2 should be 127,0,0,255 at (76, 0) expected: 127,0,0,255 was 0,0,0,0
-[ 47: FAIL ] instance 3 should be 127,0,0,255 at (113, 0) expected: 127,0,0,255 was 0,0,0,0
-[ 48: FAIL ] instance 4 should be 255,0,0,255 at (151, 0) expected: 255,0,0,255 was 0,0,0,0
-[ 49: FAIL ] instance 5 should be 255,0,0,255 at (188, 0) expected: 255,0,0,255 was 0,0,0,0
-[ 50: FAIL ] instance 6 should be 255,0,0,255 at (226, 0) expected: 255,0,0,255 was 0,0,0,0
-[ 51: FAIL ] instance 7 should be 255,0,0,255 at (263, 0) expected: 255,0,0,255 was 0,0,0,0
-[ 52: PASS ] getError was expected value: NO_ERROR : clean up should succeed
-[ 53: PASS ] Set up program succeeded
-[ 54: FAIL ] getError expected: NO_ERROR. Was INVALID_OPERATION : drawElementsInstanced should succeed
-[ 55: FAIL ] instance 0 should be 102,0,0,255 at (1, 0) expected: 102,0,0,255 was 0,0,0,0
-[ 56: FAIL ] instance 1 should be 102,0,0,255 at (51, 0) expected: 102,0,0,255 was 0,0,0,0
-[ 57: FAIL ] instance 2 should be 102,0,0,255 at (101, 0) expected: 102,0,0,255 was 0,0,0,0
-[ 58: FAIL ] instance 3 should be 102,0,0,255 at (151, 0) expected: 102,0,0,255 was 0,0,0,0
-[ 59: FAIL ] instance 4 should be 204,0,0,255 at (201, 0) expected: 204,0,0,255 was 0,0,0,0
-[ 60: FAIL ] instance 5 should be 204,0,0,255 at (251, 0) expected: 204,0,0,255 was 0,0,0,0
-[ 61: PASS ] getError was expected value: NO_ERROR : clean up should succeed
-[ 62: PASS ] Set up program succeeded
-[ 63: FAIL ] getError expected: NO_ERROR. Was INVALID_OPERATION : drawElementsInstanced should succeed
-[ 64: FAIL ] instance 0 should be 127,0,0,255 at (1, 0) expected: 127,0,0,255 was 0,0,0,0
-[ 65: FAIL ] instance 1 should be 127,0,0,255 at (51, 0) expected: 127,0,0,255 was 0,0,0,0
-[ 66: FAIL ] instance 2 should be 127,0,0,255 at (101, 0) expected: 127,0,0,255 was 0,0,0,0
-[ 67: FAIL ] instance 3 should be 255,0,0,255 at (151, 0) expected: 255,0,0,255 was 0,0,0,0
-[ 68: FAIL ] instance 4 should be 255,0,0,255 at (201, 0) expected: 255,0,0,255 was 0,0,0,0
-[ 69: FAIL ] instance 5 should be 255,0,0,255 at (251, 0) expected: 255,0,0,255 was 0,0,0,0
-[ 70: PASS ] getError was expected value: NO_ERROR : clean up should succeed
-[ 71: PASS ] Set up program succeeded
-[ 72: FAIL ] getError expected: NO_ERROR. Was INVALID_OPERATION : drawElementsInstanced should succeed
-[ 73: FAIL ] instance 0 should be 69,0,0,255 at (1, 0) expected: 69,0,0,255 was 0,0,0,0
-[ 74: FAIL ] instance 1 should be 69,0,0,255 at (38, 0) expected: 69,0,0,255 was 0,0,0,0
-[ 75: FAIL ] instance 2 should be 69,0,0,255 at (76, 0) expected: 69,0,0,255 was 0,0,0,0
-[ 76: FAIL ] instance 3 should be 139,0,0,255 at (113, 0) expected: 139,0,0,255 was 0,0,0,0
-[ 77: FAIL ] instance 4 should be 139,0,0,255 at (151, 0) expected: 139,0,0,255 was 0,0,0,0
-[ 78: FAIL ] instance 5 should be 139,0,0,255 at (188, 0) expected: 139,0,0,255 was 0,0,0,0
-[ 79: FAIL ] instance 6 should be 208,0,0,255 at (226, 0) expected: 208,0,0,255 was 0,0,0,0
-[ 80: FAIL ] instance 7 should be 208,0,0,255 at (263, 0) expected: 208,0,0,255 was 0,0,0,0
-[ 81: PASS ] getError was expected value: NO_ERROR : clean up should succeed
-[ 82: PASS ] successfullyParsed is true
-[ FAIL ] 64 failures reported
+[ PASS ] All tests passed
Modified: trunk/LayoutTests/webgl/2.0.0/conformance2/state/gl-object-get-calls-expected.txt (263998 => 263999)
--- trunk/LayoutTests/webgl/2.0.0/conformance2/state/gl-object-get-calls-expected.txt 2020-07-06 23:59:23 UTC (rev 263998)
+++ trunk/LayoutTests/webgl/2.0.0/conformance2/state/gl-object-get-calls-expected.txt 2020-07-07 00:01:51 UTC (rev 263999)
@@ -279,13 +279,13 @@
[ 275: FAIL ] gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_TYPE) should be 5124. Was 5126.
[ 276: FAIL ] gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_INTEGER) should be true (of type boolean). Was null (of type object).
[ 277: FAIL ] getError expected: NO_ERROR. Was INVALID_ENUM :
-[ 278: FAIL ] getVertexAttrib did not generate INVALID_ENUM for invalid parameter enum: NO_ERROR
-[ 279: FAIL ] getError expected: INVALID_VALUE. Was INVALID_ENUM : after evaluating: gl.getVertexAttrib(16, gl.CURRENT_VERTEX_ATTRIB)
+[ 278: PASS ] getVertexAttrib correctly handled invalid parameter enums
+[ 279: PASS ] getError was expected value: INVALID_VALUE : after evaluating: gl.getVertexAttrib(16, gl.CURRENT_VERTEX_ATTRIB)
[ 280: PASS ] gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) is gl.NONE
-[ 281: FAIL ] getError expected: INVALID_OPERATION. Was INVALID_VALUE :
+[ 281: PASS ] getError was expected value: INVALID_OPERATION :
[ 282: PASS ] gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) is gl.NONE
[ 283: PASS ] gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) is null
-[ 284: FAIL ] getError expected: NO_ERROR. Was INVALID_OPERATION :
+[ 284: PASS ] getError was expected value: NO_ERROR :
[ 285: PASS ] gl.getInternalformatParameter(gl.RENDERBUFFER, gl.R32I, gl.SAMPLES) is non-null.
[ 286: PASS ] getError was expected value: NO_ERROR :
[ 287: PASS ] getInternalformatParameter correctly handled invalid target enums
@@ -311,5 +311,5 @@
[ 307: PASS ] getSamplerParameter correctly handled invalid pname enums
[ 308: FAIL ] gl.getSyncParameter(sync, gl.OBJECT_TYPE) should be 37142. Threw exception TypeError: Argument 1 ('sync') to WebGL2RenderingContext.getSyncParameter must be an instance of WebGLSync
[ 309: FAIL ] successfullyParsed should be true (of type boolean). Was undefined (of type undefined).
-[ FAIL ] 58 failures reported
+[ FAIL ] 54 failures reported
Modified: trunk/LayoutTests/webgl/2.0.0/conformance2/transform_feedback/transform_feedback-expected.txt (263998 => 263999)
--- trunk/LayoutTests/webgl/2.0.0/conformance2/transform_feedback/transform_feedback-expected.txt 2020-07-06 23:59:23 UTC (rev 263998)
+++ trunk/LayoutTests/webgl/2.0.0/conformance2/transform_feedback/transform_feedback-expected.txt 2020-07-07 00:01:51 UTC (rev 263999)
@@ -1,96 +1,5 @@
This test runs the WebGL Test listed below in an iframe and reports PASS or FAIL.
Test: ../../resources/webgl_test_files/conformance2/transform_feedback/transform_feedback.html
-[ 1: PASS ] WebGL context exists
-[ 2: PASS ] gl.TRANSFORM_FEEDBACK_BINDING is 0x8E25
-[ 3: PASS ] getError was expected value: NO_ERROR : TRANSFORM_FEEDBACK_BINDING query should succeed
-[ 4: PASS ] gl.getParameter(gl.TRANSFORM_FEEDBACK_BINDING) is null
-[ 5: PASS ] gl.getParameter(gl.TRANSFORM_FEEDBACK_BINDING) is null
-[ 6: PASS ] gl.getParameter(gl.TRANSFORM_FEEDBACK_BINDING) is tf
-[ 7: PASS ] gl.getParameter(gl.TRANSFORM_FEEDBACK_BINDING) is tf1
-[ 8: PASS ] gl.getParameter(gl.TRANSFORM_FEEDBACK_BINDING) is null
-[ 9: PASS ] getError was expected value: INVALID_OPERATION : binding a deleted Transform Feedback object
-[ 10: PASS ] gl.getParameter(gl.TRANSFORM_FEEDBACK_BINDING) is null
-[ 11: PASS ] getError was expected value: NO_ERROR : there should be no errors
-[ 12: FAIL ] gl.getIndexedParameter(gl.TRANSFORM_FEEDBACK_BUFFER_BINDING, 0) should be null. Was [object WebGLBuffer].
-[ 13: PASS ] getError was expected value: NO_ERROR : binding buffer to ARRAY_BUFFER
-[ 14: PASS ] getError was expected value: NO_ERROR : createTransformFeedback should not set an error
-[ 15: PASS ] tf is non-null.
-[ 16: PASS ] gl.isTransformFeedback(tf) is false
-[ 17: PASS ] gl.isTransformFeedback(tf) is true
-[ 18: PASS ] gl.isTransformFeedback(tf) is true
-[ 19: PASS ] gl.isTransformFeedback(tf) is false
-[ 20: PASS ] gl.isTransformFeedback(null) is false
-[ 21: PASS ] getError was expected value: NO_ERROR : linking transform feedback shader should not set an error
-[ 22: PASS ] program is non-null.
-[ 23: PASS ] getError was expected value: NO_ERROR : after evaluating: gl.getBufferSubData(gl.TRANSFORM_FEEDBACK_BUFFER, 0, retArray, 0, retArray.length)
-[ 24: PASS ] getError was expected value: NO_ERROR : after evaluating: gl.getBufferSubData(gl.TRANSFORM_FEEDBACK_BUFFER, 0, retArray, 0, retArray.length)
-[ 25: PASS ] getError was expected value: INVALID_OPERATION : after evaluating: gl.getBufferSubData(gl.TRANSFORM_FEEDBACK_BUFFER, 0, retArray, 0, retArray.length)
-[ 26: PASS ] buffer should match expected values
-[ 27: PASS ] getError was expected value: NO_ERROR : linking transform feedback shader should not set an error
-[ 28: PASS ] program is non-null.
-[ 29: PASS ] buffer should match expected values
-[ 30: PASS ] getError was expected value: NO_ERROR : linking transform feedback shader should not set an error
-[ 31: PASS ] program is non-null.
-[ 32: PASS ] buffer should match expected values
-[ 33: PASS ] buffer should match expected values
-[ 34: PASS ] TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN query's result didn't become available too early
-[ 35: PASS ] TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN query returned a correct result (3)
-[ 36: PASS ] getError was expected value: NO_ERROR : linking transform feedback shader should not set an error
-[ 37: PASS ] program is non-null.
-[ 38: PASS ] gl.getProgramParameter(program, gl.TRANSFORM_FEEDBACK_VARYINGS) is 2
-[ 39: PASS ] getError was expected value: NO_ERROR : Should be no errors from valid getTransformFeedbackVarying.
-[ 40: PASS ] activeInfo is non-null.
-[ 41: PASS ] activeInfo.name is 'out_add'
-[ 42: PASS ] activeInfo.type is gl.FLOAT_VEC4
-[ 43: PASS ] activeInfo.size is 1
-[ 44: PASS ] getError was expected value: NO_ERROR : Should be no errors from valid getTransformFeedbackVarying.
-[ 45: PASS ] activeInfo is non-null.
-[ 46: PASS ] activeInfo.name is 'out_mul'
-[ 47: PASS ] activeInfo.type is gl.FLOAT_VEC4
-[ 48: PASS ] activeInfo.size is 1
-[ 49: PASS ] getError was expected value: INVALID_VALUE : Should be INVALID_VALUE when calling getTransformFeedbackVarying with an invalid index.
-[ 50: PASS ] activeInfo is null
-[ 51: PASS ] gl.getProgramParameter(program, gl.TRANSFORM_FEEDBACK_VARYINGS) is 2
-[ 52: PASS ] getError was expected value: NO_ERROR : Should be no errors from valid getTransformFeedbackVarying.
-[ 53: PASS ] activeInfo is non-null.
-[ 54: PASS ] activeInfo.name is 'out_add'
-[ 55: PASS ] activeInfo.type is gl.FLOAT_VEC4
-[ 56: PASS ] activeInfo.size is 1
-[ 57: PASS ] getError was expected value: NO_ERROR : Should be no errors from valid getTransformFeedbackVarying.
-[ 58: PASS ] activeInfo is non-null.
-[ 59: PASS ] activeInfo.name is 'out_mul'
-[ 60: PASS ] activeInfo.type is gl.FLOAT_VEC4
-[ 61: PASS ] activeInfo.size is 1
-[ 62: PASS ] getError was expected value: INVALID_VALUE : Should be INVALID_VALUE when calling getTransformFeedbackVarying with an invalid index.
-[ 63: PASS ] activeInfo is null
-[ 64: PASS ] getError was expected value: NO_ERROR : linking transform feedback shader should not set an error
-[ 65: PASS ] gl.getProgramParameter(program, gl.LINK_STATUS) is true
-[ 66: PASS ] gl.getProgramParameter(program, gl.TRANSFORM_FEEDBACK_VARYINGS) is 1
-[ 67: PASS ] getError was expected value: NO_ERROR : Should be no errors from valid getTransformFeedbackVarying.
-[ 68: PASS ] activeInfo is non-null.
-[ 69: PASS ] activeInfo.name is 'out_mul'
-[ 70: PASS ] activeInfo.type is gl.FLOAT_VEC4
-[ 71: PASS ] activeInfo.size is 1
-[ 72: PASS ] getError was expected value: INVALID_VALUE : Should be INVALID_VALUE when calling getTransformFeedbackVarying with an invalid index.
-[ 73: PASS ] activeInfo is null
-[ 74: PASS ] getError was expected value: INVALID_VALUE : Should be INVALID_VALUE when calling getTransformFeedbackVarying with an invalid index.
-[ 75: PASS ] activeInfo is null
-[ 76: PASS ] getError was expected value: NO_ERROR : linking transform feedback shader should not set an error
-[ 77: PASS ] gl.getProgramParameter(program, gl.LINK_STATUS) is true
-[ 78: PASS ] gl.getProgramParameter(program, gl.TRANSFORM_FEEDBACK_VARYINGS) is 2
-[ 79: PASS ] getError was expected value: NO_ERROR : Should be no errors from valid getTransformFeedbackVarying.
-[ 80: PASS ] activeInfo is non-null.
-[ 81: PASS ] activeInfo.name is 'out_add'
-[ 82: PASS ] activeInfo.type is gl.FLOAT_VEC4
-[ 83: PASS ] activeInfo.size is 1
-[ 84: PASS ] getError was expected value: NO_ERROR : Should be no errors from valid getTransformFeedbackVarying.
-[ 85: PASS ] activeInfo is non-null.
-[ 86: PASS ] activeInfo.name is 'out_mul'
-[ 87: PASS ] activeInfo.type is gl.FLOAT_VEC4
-[ 88: PASS ] activeInfo.size is 1
-[ 89: PASS ] getError was expected value: INVALID_VALUE : Should be INVALID_VALUE when calling getTransformFeedbackVarying with an invalid index.
-[ 90: PASS ] activeInfo is null
-[ 91: PASS ] successfullyParsed is true
-[ FAIL ] 1 failures reported
+[ PASS ] All tests passed
Modified: trunk/Source/WebCore/ChangeLog (263998 => 263999)
--- trunk/Source/WebCore/ChangeLog 2020-07-06 23:59:23 UTC (rev 263998)
+++ trunk/Source/WebCore/ChangeLog 2020-07-07 00:01:51 UTC (rev 263999)
@@ -1,3 +1,54 @@
+2020-07-06 James Darpinian <[email protected]>
+
+ Fix transform feedback tests
+ https://bugs.webkit.org/show_bug.cgi?id=213906
+
+ Reviewed by Dean Jackson.
+
+ Fix transform feedback conformance tests by implementing missing functionality such as:
+ - Transform feedback object state tracking
+ - Validation for all GL errors that can affect state tracking before calling ANGLE
+ - Default transform feedback object
+ - Pause/resume
+ - Fix vertexAttribDivisor in WebGL 2 (unrelated to transform feedback)
+
+ After this, all related tests pass except for a few that also fail in Chrome, and one that uses
+ PIXEL_PACK_BUFFER which is not yet supported.
+
+ * html/canvas/WebGL2RenderingContext.cpp:
+ (WebCore::WebGL2RenderingContext::~WebGL2RenderingContext):
+ (WebCore::WebGL2RenderingContext::initializeNewContext):
+ (WebCore::WebGL2RenderingContext::deleteTransformFeedback):
+ (WebCore::WebGL2RenderingContext::bindTransformFeedback):
+ (WebCore::ValidateTransformFeedbackPrimitiveMode):
+ (WebCore::WebGL2RenderingContext::beginTransformFeedback):
+ (WebCore::WebGL2RenderingContext::endTransformFeedback):
+ (WebCore::WebGL2RenderingContext::transformFeedbackVaryings):
+ (WebCore::WebGL2RenderingContext::pauseTransformFeedback):
+ (WebCore::WebGL2RenderingContext::resumeTransformFeedback):
+ (WebCore::WebGL2RenderingContext::setIndexedBufferBinding):
+ (WebCore::WebGL2RenderingContext::getIndexedParameter):
+ (WebCore::WebGL2RenderingContext::getMaxTransformFeedbackSeparateAttribs):
+ (WebCore::WebGL2RenderingContext::getParameter):
+ (WebCore::WebGL2RenderingContext::uncacheDeletedBuffer):
+ * html/canvas/WebGL2RenderingContext.h:
+ * html/canvas/WebGLProgram.cpp:
+ (WebCore::WebGLProgram::cacheInfoIfNeeded):
+ * html/canvas/WebGLProgram.h:
+ * html/canvas/WebGLTransformFeedback.cpp:
+ (WebCore::WebGLTransformFeedback::create):
+ (WebCore::WebGLTransformFeedback::WebGLTransformFeedback):
+ (WebCore::WebGLTransformFeedback::setProgram):
+ (WebCore::WebGLTransformFeedback::setBoundIndexedTransformFeedbackBuffer):
+ (WebCore::WebGLTransformFeedback::getBoundIndexedTransformFeedbackBuffer):
+ (WebCore::WebGLTransformFeedback::hasEnoughBuffers const):
+ (WebCore::WebGLTransformFeedback::usesBuffer):
+ (WebCore::WebGLTransformFeedback::unbindBuffer):
+ (WebCore::WebGLTransformFeedback::validateProgramForResume const):
+ * html/canvas/WebGLTransformFeedback.h:
+ * platform/graphics/angle/GraphicsContextGLANGLE.cpp:
+ (WebCore::GraphicsContextGLOpenGL::vertexAttribDivisor):
+
2020-07-06 Myles C. Maxfield <[email protected]>
Locale-specific quotes infrastructure needs to compare locale strings properly
Modified: trunk/Source/WebCore/bindings/js/CallTracerTypes.h (263998 => 263999)
--- trunk/Source/WebCore/bindings/js/CallTracerTypes.h 2020-07-06 23:59:23 UTC (rev 263998)
+++ trunk/Source/WebCore/bindings/js/CallTracerTypes.h 2020-07-07 00:01:51 UTC (rev 263999)
@@ -61,7 +61,6 @@
#include "WebGLShader.h"
#include "WebGLSync.h"
#include "WebGLTexture.h"
-#include "WebGLTransformFeedback.h"
#include "WebGLUniformLocation.h"
#include "WebGLVertexArrayObject.h"
#endif
@@ -68,6 +67,7 @@
#if ENABLE(WEBGL2)
#include "WebGL2RenderingContext.h"
+#include "WebGLTransformFeedback.h"
#endif
namespace WebCore {
@@ -101,10 +101,12 @@
WebGLShader*,
WebGLSync*,
WebGLTexture*,
- WebGLTransformFeedback*,
WebGLUniformLocation*,
WebGLVertexArrayObject*,
#endif
+#if ENABLE(WEBGL2)
+ WebGLTransformFeedback*,
+#endif
RefPtr<ArrayBuffer>,
RefPtr<ArrayBufferView>,
RefPtr<CanvasGradient>,
Modified: trunk/Source/WebCore/bindings/js/WebCoreBuiltinNames.h (263998 => 263999)
--- trunk/Source/WebCore/bindings/js/WebCoreBuiltinNames.h 2020-07-06 23:59:23 UTC (rev 263998)
+++ trunk/Source/WebCore/bindings/js/WebCoreBuiltinNames.h 2020-07-07 00:01:51 UTC (rev 263999)
@@ -235,6 +235,7 @@
macro(VisualViewport) \
macro(WebGL2RenderingContext) \
macro(WebGLVertexArrayObject) \
+ macro(WebGLTransformFeedback) \
macro(WebKitMediaKeyError) \
macro(WebKitMediaKeyMessageEvent) \
macro(WebKitMediaKeyNeededEvent) \
Modified: trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp (263998 => 263999)
--- trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp 2020-07-06 23:59:23 UTC (rev 263998)
+++ trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp 2020-07-07 00:01:51 UTC (rev 263999)
@@ -112,7 +112,6 @@
// they will be freed before the last context is removed from the context group.
m_readFramebufferBinding = nullptr;
m_boundTransformFeedback = nullptr;
- m_boundTransformFeedbackBuffers.clear();
m_boundTransformFeedbackBuffer = nullptr;
m_boundUniformBuffer = nullptr;
m_boundIndexedUniformBuffers.clear();
@@ -135,11 +134,12 @@
// NEEDS_PORT: boolean occlusion query, transform feedback primitives written query, elapsed query
- int maxTransformFeedbackAttribs = getIntParameter(GraphicsContextGL::MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS);
- ASSERT(maxTransformFeedbackAttribs >= 4);
- m_boundTransformFeedbackBuffers.resize(maxTransformFeedbackAttribs);
+ m_maxTransformFeedbackSeparateAttribs = getUnsignedIntParameter(GraphicsContextGL::MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS);
+ ASSERT(m_maxTransformFeedbackSeparateAttribs >= 4);
- // NEEDS_PORT: set up default transform feedback object
+ m_defaultTransformFeedback = createTransformFeedback();
+ m_context->bindTransformFeedback(GraphicsContextGL::TRANSFORM_FEEDBACK, m_defaultTransformFeedback->object());
+ m_boundTransformFeedback = m_defaultTransformFeedback;
m_boundIndexedUniformBuffers.resize(getIntParameter(GraphicsContextGL::MAX_UNIFORM_BUFFER_BINDINGS));
m_uniformBufferOffsetAlignment = getIntParameter(GraphicsContextGL::UNIFORM_BUFFER_OFFSET_ALIGNMENT);
@@ -1785,11 +1785,18 @@
void WebGL2RenderingContext::deleteTransformFeedback(WebGLTransformFeedback* feedbackObject)
{
- if (isContextLostOrPending())
+ if (isContextLostOrPending() || !feedbackObject || feedbackObject->isDeleted() || !validateWebGLObject("deleteTransformFeedback", feedbackObject))
return;
+
+ ASSERT(feedbackObject != m_defaultTransformFeedback);
+
+ if (feedbackObject->isActive()) {
+ synthesizeGLError(GraphicsContextGL::INVALID_OPERATION, "deleteTransformFeedback", "attempt to delete an active transform feedback object");
+ return;
+ }
if (m_boundTransformFeedback == feedbackObject)
- m_boundTransformFeedback = nullptr;
+ m_boundTransformFeedback = m_defaultTransformFeedback;
deleteObject(feedbackObject);
}
@@ -1817,16 +1824,64 @@
return;
}
- m_context->bindTransformFeedback(target, objectOrZero(feedbackObject));
- m_boundTransformFeedback = feedbackObject;
+ if (target != GraphicsContextGL::TRANSFORM_FEEDBACK) {
+ synthesizeGLError(GraphicsContextGL::INVALID_ENUM, "bindTransformFeedback", "target must be TRANSFORM_FEEDBACK");
+ return;
+ }
+ if (m_boundTransformFeedback->isActive() && !m_boundTransformFeedback->isPaused()) {
+ synthesizeGLError(GraphicsContextGL::INVALID_OPERATION, "bindTransformFeedback", "transform feedback is active and not paused");
+ return;
+ }
+
+ auto toBeBound = feedbackObject ? feedbackObject : m_defaultTransformFeedback.get();
+ m_context->bindTransformFeedback(target, toBeBound->object());
+ m_boundTransformFeedback = toBeBound;
}
+static bool ValidateTransformFeedbackPrimitiveMode(GCGLenum mode)
+{
+ switch (mode) {
+ case GL_POINTS:
+ case GL_LINES:
+ case GL_TRIANGLES:
+ return true;
+ default:
+ return false;
+ }
+}
+
void WebGL2RenderingContext::beginTransformFeedback(GCGLenum primitiveMode)
{
if (isContextLostOrPending())
return;
+
+ if (!ValidateTransformFeedbackPrimitiveMode(primitiveMode)) {
+ synthesizeGLError(GraphicsContextGL::INVALID_ENUM, "beginTransformFeedback", "invalid transform feedback primitive mode");
+ return;
+ }
+ if (!m_currentProgram) {
+ synthesizeGLError(GraphicsContextGL::INVALID_OPERATION, "beginTransformFeedback", "no program is active");
+ return;
+ }
+ if (m_boundTransformFeedback->isActive()) {
+ synthesizeGLError(GraphicsContextGL::INVALID_OPERATION, "beginTransformFeedback", "transform feedback is already active");
+ return;
+ }
+ int requiredBufferCount = m_currentProgram->requiredTransformFeedbackBufferCount();
+ if (!requiredBufferCount) {
+ synthesizeGLError(GraphicsContextGL::INVALID_OPERATION, "beginTransformFeedback", "current active program does not specify any transform feedback varyings to record");
+ return;
+ }
+ if (!m_boundTransformFeedback->hasEnoughBuffers(requiredBufferCount)) {
+ synthesizeGLError(GraphicsContextGL::INVALID_OPERATION, "beginTransformFeedback", "not enough transform feedback buffers bound");
+ return;
+ }
m_context->beginTransformFeedback(primitiveMode);
+
+ m_boundTransformFeedback->setProgram(*m_currentProgram);
+ m_boundTransformFeedback->setActive(true);
+ m_boundTransformFeedback->setPaused(false);
}
void WebGL2RenderingContext::endTransformFeedback()
@@ -1834,13 +1889,36 @@
if (isContextLostOrPending())
return;
+ if (!m_boundTransformFeedback->isActive()) {
+ synthesizeGLError(GraphicsContextGL::INVALID_OPERATION, "endTransformFeedback", "transform feedback is not active");
+ return;
+ }
+
m_context->endTransformFeedback();
+
+ m_boundTransformFeedback->setPaused(false);
+ m_boundTransformFeedback->setActive(false);
}
void WebGL2RenderingContext::transformFeedbackVaryings(WebGLProgram& program, const Vector<String>& varyings, GCGLenum bufferMode)
{
- if (isContextLostOrPending() || varyings.isEmpty() || !validateWebGLObject("transformFeedbackVaryings", &program))
+ if (isContextLostOrPending() || !validateWebGLObject("transformFeedbackVaryings", &program))
return;
+
+ switch (bufferMode) {
+ case GraphicsContextGL::SEPARATE_ATTRIBS:
+ if (varyings.size() > m_maxTransformFeedbackSeparateAttribs) {
+ synthesizeGLError(GraphicsContextGL::INVALID_VALUE, "transformFeedbackVaryings", "too many varyings");
+ return;
+ }
+ break;
+ case GraphicsContextGL::INTERLEAVED_ATTRIBS:
+ break;
+ default:
+ synthesizeGLError(GraphicsContextGL::INVALID_ENUM, "transformFeedbackVaryings", "invalid buffer mode");
+ return;
+ }
+ program.setRequiredTransformFeedbackBufferCount(bufferMode == GraphicsContextGL::INTERLEAVED_ATTRIBS ? 1 : varyings.size());
m_context->transformFeedbackVaryings(program.object(), varyings, bufferMode);
}
@@ -1861,12 +1939,39 @@
void WebGL2RenderingContext::pauseTransformFeedback()
{
- LOG(WebGL, "[[ NOT IMPLEMENTED ]] pauseTransformFeedback()");
+ if (isContextLostOrPending())
+ return;
+
+ if (!m_boundTransformFeedback->isActive()) {
+ synthesizeGLError(GraphicsContextGL::INVALID_OPERATION, "pauseTransformFeedback", "transform feedback is not active");
+ return;
+ }
+
+ if (m_boundTransformFeedback->isPaused()) {
+ synthesizeGLError(GraphicsContextGL::INVALID_OPERATION, "pauseTransformFeedback", "transform feedback is already paused");
+ return;
+ }
+
+ m_boundTransformFeedback->setPaused(true);
+ m_context->pauseTransformFeedback();
}
void WebGL2RenderingContext::resumeTransformFeedback()
{
- LOG(WebGL, "[[ NOT IMPLEMENTED ]] resumeTransformFeedback()");
+ if (isContextLostOrPending())
+ return;
+
+ if (!m_boundTransformFeedback->validateProgramForResume(m_currentProgram.get())) {
+ synthesizeGLError(GraphicsContextGL::INVALID_OPERATION, "resumeTransformFeedback", "the current program is not the same as when beginTransformFeedback was called");
+ return;
+ }
+ if (!m_boundTransformFeedback->isActive() || !m_boundTransformFeedback->isPaused()) {
+ synthesizeGLError(GraphicsContextGL::INVALID_OPERATION, "resumeTransformFeedback", "transform feedback is not active or not paused");
+ return;
+ }
+
+ m_boundTransformFeedback->setPaused(false);
+ m_context->resumeTransformFeedback();
}
bool WebGL2RenderingContext::setIndexedBufferBinding(const char *functionName, GCGLenum target, GCGLuint index, WebGLBuffer* buffer)
@@ -1879,7 +1984,7 @@
switch (target) {
case GraphicsContextGL::TRANSFORM_FEEDBACK_BUFFER:
- if (index >= m_boundTransformFeedbackBuffers.size()) {
+ if (index > m_maxTransformFeedbackSeparateAttribs) {
synthesizeGLError(GraphicsContextGL::INVALID_VALUE, functionName, "index out of range");
return false;
}
@@ -1900,7 +2005,7 @@
switch (target) {
case GraphicsContextGL::TRANSFORM_FEEDBACK_BUFFER:
- m_boundTransformFeedbackBuffers[index] = buffer;
+ m_boundTransformFeedback->setBoundIndexedTransformFeedbackBuffer(index, buffer);
break;
case GraphicsContextGL::UNIFORM_BUFFER:
m_boundIndexedUniformBuffers[index] = buffer;
@@ -1938,12 +2043,15 @@
return nullptr;
switch (target) {
- case GraphicsContextGL::TRANSFORM_FEEDBACK_BUFFER_BINDING:
- if (index >= m_boundTransformFeedbackBuffers.size()) {
+ case GraphicsContextGL::TRANSFORM_FEEDBACK_BUFFER_BINDING: {
+ WebGLBuffer* buffer;
+ bool success = m_boundTransformFeedback->getBoundIndexedTransformFeedbackBuffer(index, &buffer);
+ if (!success) {
synthesizeGLError(GraphicsContextGL::INVALID_VALUE, "getIndexedParameter", "index out of range");
return nullptr;
}
- return m_boundTransformFeedbackBuffers[index];
+ return makeRefPtr(buffer);
+ }
case GraphicsContextGL::TRANSFORM_FEEDBACK_BUFFER_SIZE:
case GraphicsContextGL::TRANSFORM_FEEDBACK_BUFFER_START:
case GraphicsContextGL::UNIFORM_BUFFER_SIZE:
@@ -1958,7 +2066,6 @@
return nullptr;
}
return m_boundIndexedUniformBuffers[index];
- return nullptr;
default:
synthesizeGLError(GraphicsContextGL::INVALID_ENUM, "getIndexedParameter", "invalid parameter name");
return nullptr;
@@ -2484,6 +2591,11 @@
m_context->hint(target, mode);
}
+GCGLuint WebGL2RenderingContext::maxTransformFeedbackSeparateAttribs() const
+{
+ return m_maxTransformFeedbackSeparateAttribs;
+}
+
GCGLenum WebGL2RenderingContext::baseInternalFormatFromInternalFormat(GCGLenum internalformat)
{
// Handles sized, unsized, and compressed internal formats.
@@ -2692,8 +2804,7 @@
case GraphicsContextGL::TRANSFORM_FEEDBACK_BUFFER_BINDING:
return m_boundTransformFeedbackBuffer;
case GraphicsContextGL::TRANSFORM_FEEDBACK_BINDING:
- // FIXME: NEEDS_PORT: support default transform feedback object.
- return m_boundTransformFeedback;
+ return m_boundTransformFeedback == m_defaultTransformFeedback ? nullptr : m_boundTransformFeedback;
case GraphicsContextGL::TRANSFORM_FEEDBACK_PAUSED:
return getBooleanParameter(pname);
case GraphicsContextGL::UNIFORM_BUFFER_BINDING:
@@ -3022,11 +3133,8 @@
REMOVE_BUFFER_FROM_BINDING(m_boundPixelUnpackBuffer);
REMOVE_BUFFER_FROM_BINDING(m_boundTransformFeedbackBuffer);
REMOVE_BUFFER_FROM_BINDING(m_boundUniformBuffer);
+ m_boundTransformFeedback->unbindBuffer(*buffer);
- size_t index = m_boundTransformFeedbackBuffers.find(buffer);
- if (index < m_boundTransformFeedbackBuffers.size())
- m_boundTransformFeedbackBuffers[index] = nullptr;
-
WebGLRenderingContextBase::uncacheDeletedBuffer(buffer);
}
Modified: trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.h (263998 => 263999)
--- trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.h 2020-07-06 23:59:23 UTC (rev 263998)
+++ trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.h 2020-07-07 00:01:51 UTC (rev 263999)
@@ -246,6 +246,7 @@
void renderbufferStorage(GCGLenum target, GCGLenum internalformat, GCGLsizei width, GCGLsizei height) final;
void hint(GCGLenum target, GCGLenum mode) final;
+ GCGLuint maxTransformFeedbackSeparateAttribs() const;
private:
WebGL2RenderingContext(CanvasBase&, GraphicsContextGLAttributes);
@@ -304,7 +305,7 @@
RefPtr<WebGLFramebuffer> m_readFramebufferBinding;
RefPtr<WebGLTransformFeedback> m_boundTransformFeedback;
- Vector<RefPtr<WebGLBuffer>> m_boundTransformFeedbackBuffers;
+ RefPtr<WebGLTransformFeedback> m_defaultTransformFeedback;
RefPtr<WebGLBuffer> m_boundCopyReadBuffer;
RefPtr<WebGLBuffer> m_boundCopyWriteBuffer;
@@ -324,6 +325,7 @@
GCGLint m_unpackImageHeight { 0 };
GCGLint m_unpackSkipImages { 0 };
GCGLint m_uniformBufferOffsetAlignment { 0 };
+ GCGLuint m_maxTransformFeedbackSeparateAttribs { 0 };
};
} // namespace WebCore
Modified: trunk/Source/WebCore/html/canvas/WebGLProgram.cpp (263998 => 263999)
--- trunk/Source/WebCore/html/canvas/WebGLProgram.cpp 2020-07-06 23:59:23 UTC (rev 263998)
+++ trunk/Source/WebCore/html/canvas/WebGLProgram.cpp 2020-07-07 00:01:51 UTC (rev 263999)
@@ -224,8 +224,10 @@
GCGLint linkStatus = 0;
context->getProgramiv(object(), GraphicsContextGL::LINK_STATUS, &linkStatus);
m_linkStatus = linkStatus;
- if (m_linkStatus)
+ if (m_linkStatus) {
cacheActiveAttribLocations(context);
+ m_requiredTransformFeedbackBufferCount = m_requiredTransformFeedbackBufferCountAfterNextLink;
+ }
m_infoValid = true;
}
Modified: trunk/Source/WebCore/html/canvas/WebGLProgram.h (263998 => 263999)
--- trunk/Source/WebCore/html/canvas/WebGLProgram.h 2020-07-06 23:59:23 UTC (rev 263998)
+++ trunk/Source/WebCore/html/canvas/WebGLProgram.h 2020-07-07 00:01:51 UTC (rev 263999)
@@ -69,6 +69,16 @@
WebGLShader* getAttachedShader(GCGLenum);
bool attachShader(WebGLShader*);
bool detachShader(WebGLShader*);
+
+ void setRequiredTransformFeedbackBufferCount(int count)
+ {
+ m_requiredTransformFeedbackBufferCountAfterNextLink = count;
+ }
+ int requiredTransformFeedbackBufferCount()
+ {
+ cacheInfoIfNeeded();
+ return m_requiredTransformFeedbackBufferCount;
+ }
private:
WebGLProgram(WebGLRenderingContextBase&);
@@ -89,6 +99,8 @@
RefPtr<WebGLShader> m_fragmentShader;
bool m_infoValid { true };
+ int m_requiredTransformFeedbackBufferCountAfterNextLink { 0 };
+ int m_requiredTransformFeedbackBufferCount { 0 };
};
} // namespace WebCore
Modified: trunk/Source/WebCore/html/canvas/WebGLTransformFeedback.cpp (263998 => 263999)
--- trunk/Source/WebCore/html/canvas/WebGLTransformFeedback.cpp 2020-07-06 23:59:23 UTC (rev 263998)
+++ trunk/Source/WebCore/html/canvas/WebGLTransformFeedback.cpp 2020-07-07 00:01:51 UTC (rev 263999)
@@ -25,7 +25,7 @@
#include "config.h"
-#if ENABLE(WEBGL)
+#if ENABLE(WEBGL2)
#include "WebGLTransformFeedback.h"
#include "WebGLContextGroup.h"
@@ -33,7 +33,7 @@
namespace WebCore {
-Ref<WebGLTransformFeedback> WebGLTransformFeedback::create(WebGLRenderingContextBase& ctx)
+Ref<WebGLTransformFeedback> WebGLTransformFeedback::create(WebGL2RenderingContext& ctx)
{
return adoptRef(*new WebGLTransformFeedback(ctx));
}
@@ -43,10 +43,11 @@
deleteObject(0);
}
-WebGLTransformFeedback::WebGLTransformFeedback(WebGLRenderingContextBase& ctx)
+WebGLTransformFeedback::WebGLTransformFeedback(WebGL2RenderingContext& ctx)
: WebGLSharedObject(ctx)
{
setObject(ctx.graphicsContextGL()->createTransformFeedback());
+ m_boundIndexedTransformFeedbackBuffers.resize(ctx.maxTransformFeedbackSeparateAttribs());
}
void WebGLTransformFeedback::deleteObjectImpl(GraphicsContextGLOpenGL* context3d, PlatformGLObject object)
@@ -54,6 +55,50 @@
context3d->deleteTransformFeedback(object);
}
+void WebGLTransformFeedback::setProgram(WebGLProgram& program)
+{
+ m_program = &program;
+ m_programLinkCount = program.getLinkCount();
}
-#endif // ENABLE(WEBGL)
+void WebGLTransformFeedback::setBoundIndexedTransformFeedbackBuffer(GCGLuint index, WebGLBuffer* buffer)
+{
+ ASSERT(index < m_boundIndexedTransformFeedbackBuffers.size());
+ m_boundIndexedTransformFeedbackBuffers[index] = buffer;
+}
+
+bool WebGLTransformFeedback::getBoundIndexedTransformFeedbackBuffer(GCGLuint index, WebGLBuffer** outBuffer)
+{
+ if (index > m_boundIndexedTransformFeedbackBuffers.size())
+ return false;
+ *outBuffer = m_boundIndexedTransformFeedbackBuffers[index].get();
+ return true;
+}
+
+bool WebGLTransformFeedback::hasEnoughBuffers(GCGLuint numRequired) const
+{
+ if (numRequired > m_boundIndexedTransformFeedbackBuffers.size())
+ return false;
+ for (GCGLuint i = 0; i < numRequired; i++) {
+ if (!m_boundIndexedTransformFeedbackBuffers[i].get())
+ return false;
+ }
+ return true;
+}
+
+void WebGLTransformFeedback::unbindBuffer(WebGLBuffer& buffer)
+{
+ for (auto& boundBuffer : m_boundIndexedTransformFeedbackBuffers) {
+ if (boundBuffer == &buffer)
+ boundBuffer = nullptr;
+ }
+}
+
+bool WebGLTransformFeedback::validateProgramForResume(WebGLProgram* program) const
+{
+ return program && m_program == program && program->getLinkCount() == m_programLinkCount;
+}
+
+}
+
+#endif // ENABLE(WEBGL2)
Modified: trunk/Source/WebCore/html/canvas/WebGLTransformFeedback.h (263998 => 263999)
--- trunk/Source/WebCore/html/canvas/WebGLTransformFeedback.h 2020-07-06 23:59:23 UTC (rev 263998)
+++ trunk/Source/WebCore/html/canvas/WebGLTransformFeedback.h 2020-07-07 00:01:51 UTC (rev 263999)
@@ -25,8 +25,9 @@
#pragma once
-#if ENABLE(WEBGL)
+#if ENABLE(WEBGL2)
+#include "WebGL2RenderingContext.h"
#include "WebGLSharedObject.h"
namespace WebCore {
@@ -35,12 +36,42 @@
public:
virtual ~WebGLTransformFeedback();
- static Ref<WebGLTransformFeedback> create(WebGLRenderingContextBase&);
+ static Ref<WebGLTransformFeedback> create(WebGL2RenderingContext&);
+
+ bool isActive() const { return m_active; }
+ bool isPaused() const { return m_paused; }
+
+ void setActive(bool active) { m_active = active; }
+ void setPaused(bool paused) { m_paused = paused; }
+
+ // These are the indexed bind points for transform feedback buffers.
+ // Returns false if index is out of range and the caller should
+ // synthesize a GL error.
+ void setBoundIndexedTransformFeedbackBuffer(GCGLuint index, WebGLBuffer*);
+ bool getBoundIndexedTransformFeedbackBuffer(GCGLuint index, WebGLBuffer** outBuffer);
+
+ bool validateProgramForResume(WebGLProgram*) const;
+ bool hasEverBeenBound() const { return object() && m_hasEverBeenBound; }
+ void setHasEverBeenBound() { m_hasEverBeenBound = true; }
+
+ WebGLProgram* program() const { return m_program.get(); }
+ void setProgram(WebGLProgram&);
+
+ void unbindBuffer(WebGLBuffer&);
+
+ bool hasEnoughBuffers(GCGLuint numRequired) const;
private:
- WebGLTransformFeedback(WebGLRenderingContextBase&);
+ WebGLTransformFeedback(WebGL2RenderingContext&);
void deleteObjectImpl(GraphicsContextGLOpenGL*, PlatformGLObject) override;
+
+ bool m_active { false };
+ bool m_paused { false };
+ bool m_hasEverBeenBound { false };
+ unsigned m_programLinkCount { 0 };
+ Vector<RefPtr<WebGLBuffer>> m_boundIndexedTransformFeedbackBuffers;
+ RefPtr<WebGLProgram> m_program;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/html/canvas/WebGLTransformFeedback.idl (263998 => 263999)
--- trunk/Source/WebCore/html/canvas/WebGLTransformFeedback.idl 2020-07-06 23:59:23 UTC (rev 263998)
+++ trunk/Source/WebCore/html/canvas/WebGLTransformFeedback.idl 2020-07-07 00:01:51 UTC (rev 263999)
@@ -24,6 +24,7 @@
*/
[
- Conditional=WEBGL
+ Conditional=WEBGL2,
+ EnabledAtRuntime=WebGL2
] interface WebGLTransformFeedback {
};
Modified: trunk/Source/WebCore/platform/graphics/angle/GraphicsContextGLANGLE.cpp (263998 => 263999)
--- trunk/Source/WebCore/platform/graphics/angle/GraphicsContextGLANGLE.cpp 2020-07-06 23:59:23 UTC (rev 263998)
+++ trunk/Source/WebCore/platform/graphics/angle/GraphicsContextGLANGLE.cpp 2020-07-07 00:01:51 UTC (rev 263999)
@@ -1929,7 +1929,10 @@
void GraphicsContextGLOpenGL::vertexAttribDivisor(GCGLuint index, GCGLuint divisor)
{
- getExtensions().vertexAttribDivisor(index, divisor);
+ if (m_isForWebGL2)
+ gl::VertexAttribDivisor(index, divisor);
+ else
+ getExtensions().vertexAttribDivisor(index, divisor);
}
GCGLuint GraphicsContextGLOpenGL::getUniformBlockIndex(PlatformGLObject program, const String& uniformBlockName)
_______________________________________________ webkit-changes mailing list [email protected] https://lists.webkit.org/mailman/listinfo/webkit-changes
