Title: [263999] trunk
Revision
263999
Author
[email protected]
Date
2020-07-06 17:01:51 -0700 (Mon, 06 Jul 2020)

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

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

Reply via email to