Diff
Modified: trunk/LayoutTests/ChangeLog (226814 => 226815)
--- trunk/LayoutTests/ChangeLog 2018-01-11 23:57:52 UTC (rev 226814)
+++ trunk/LayoutTests/ChangeLog 2018-01-12 00:03:23 UTC (rev 226815)
@@ -1,5 +1,9 @@
2018-01-11 Dean Jackson <[email protected]>
+ Rolling out 226814. It crashes on some bots.
+
+2018-01-11 Dean Jackson <[email protected]>
+
[WebGL] Simulated vertexAttrib0 can sometimes cause OUT_OF_MEMORY errors
https://bugs.webkit.org/show_bug.cgi?id=181558
<rdar://problem/36189833>
Deleted: trunk/LayoutTests/fast/canvas/webgl/simulated-vertexAttrib0-invalid-indicies-expected.txt (226814 => 226815)
--- trunk/LayoutTests/fast/canvas/webgl/simulated-vertexAttrib0-invalid-indicies-expected.txt 2018-01-11 23:57:52 UTC (rev 226814)
+++ trunk/LayoutTests/fast/canvas/webgl/simulated-vertexAttrib0-invalid-indicies-expected.txt 2018-01-12 00:03:23 UTC (rev 226815)
@@ -1,5 +0,0 @@
-CONSOLE MESSAGE: line 49: WebGL: INVALID_OPERATION: drawElements: attempt to access out of bounds arrays
-CONSOLE MESSAGE: line 59: WebGL: INVALID_OPERATION: drawElements: unable to simulate vertexAttrib0 array
-PASS: MAX_UINT index was unable to be simulated
-PASS: Huge index was unable to be simulated
-
Deleted: trunk/LayoutTests/fast/canvas/webgl/simulated-vertexAttrib0-invalid-indicies.html (226814 => 226815)
--- trunk/LayoutTests/fast/canvas/webgl/simulated-vertexAttrib0-invalid-indicies.html 2018-01-11 23:57:52 UTC (rev 226814)
+++ trunk/LayoutTests/fast/canvas/webgl/simulated-vertexAttrib0-invalid-indicies.html 2018-01-12 00:03:23 UTC (rev 226815)
@@ -1,67 +0,0 @@
-<canvas id="canvas" width="10" height="10"></canvas>
-<div></div>
-<script id='vertex-shader' type='x-shader/x-vertex'>
-attribute vec3 position;
-void main(void) {
- gl_Position = vec4(position, 1.0);
-}
-</script>
-<script id='fragment-shader' type='x-shader/x-fragment'>
-precision mediump float;
-void main(void) {
- gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
-}
-</script>
-<script>
-function output(msg) {
- document.querySelector("div").innerHTML += msg + "<br>";
-}
-
-if (window.testRunner)
- testRunner.dumpAsText();
-
-let canvas = document.getElementById("canvas");
-let gl = canvas.getContext("webgl");
-
-gl.getExtension("OES_element_index_uint");
-
-let vShader = gl.createShader(gl.VERTEX_SHADER);
-gl.shaderSource(vShader, document.getElementById("vertex-shader").text);
-gl.compileShader(vShader);
-
-let fShader = gl.createShader(gl.FRAGMENT_SHADER);
-gl.shaderSource(fShader, document.getElementById("fragment-shader").text);
-gl.compileShader(fShader);
-program = gl.createProgram();
-gl.attachShader(program, vShader);
-gl.attachShader(program, fShader);
-gl.linkProgram(program);
-gl.useProgram(program);
-
-let buffer = gl.createBuffer();
-gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffer);
-
-let data;
-
-// Maximum uint.
-data = "" Uint8Array([255, 255, 255, 255]);
-gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, data, gl.DYNAMIC_DRAW);
-gl.drawElements(gl.TRIANGLE_STRIP, 1, gl.UNSIGNED_INT,0);
-
-if (gl.getError() == gl.INVALID_OPERATION)
- output("PASS: MAX_UINT index was unable to be simulated");
-else
- output("FAIL: MAX_UINT index did not fail validation");
-
-// Two large numbers, one of which is smaller than 0.25 * max uint.
-data = "" Uint32Array([380000000, 4294967295]);
-gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, data, gl.DYNAMIC_DRAW);
-gl.drawElements(gl.TRIANGLE_STRIP, 1, gl.UNSIGNED_INT,0);
-
-if (gl.getError() == gl.INVALID_OPERATION)
- output("PASS: Huge index was unable to be simulated");
-else
- output("FAIL: Huge index did not fail validation");
-
-</script>
-
Modified: trunk/Source/WebCore/ChangeLog (226814 => 226815)
--- trunk/Source/WebCore/ChangeLog 2018-01-11 23:57:52 UTC (rev 226814)
+++ trunk/Source/WebCore/ChangeLog 2018-01-12 00:03:23 UTC (rev 226815)
@@ -1,5 +1,9 @@
2018-01-11 Dean Jackson <[email protected]>
+ Rolling out 226814. It crashes on some bots.
+
+2018-01-11 Dean Jackson <[email protected]>
+
[WebGL] Simulated vertexAttrib0 can sometimes cause OUT_OF_MEMORY errors
https://bugs.webkit.org/show_bug.cgi?id=181558
<rdar://problem/36189833>
Modified: trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp (226814 => 226815)
--- trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp 2018-01-11 23:57:52 UTC (rev 226814)
+++ trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp 2018-01-12 00:03:23 UTC (rev 226815)
@@ -1822,12 +1822,10 @@
// The number of required elements is one more than the maximum
// index that will be accessed.
- Checked<unsigned, RecordOverflow> checkedNumElementsRequired = Checked<unsigned>(maxIndex.value());
- checkedNumElementsRequired += 1;
- if (checkedNumElementsRequired.hasOverflowed())
- return false;
- numElementsRequired = checkedNumElementsRequired.unsafeGet();
- return true;
+ numElementsRequired = maxIndex.value() + 1;
+
+ // Check for overflow.
+ return numElementsRequired > 0;
}
bool WebGL2RenderingContext::validateBlendEquation(const char* functionName, GC3Denum mode)
Modified: trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp (226814 => 226815)
--- trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp 2018-01-11 23:57:52 UTC (rev 226814)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp 2018-01-12 00:03:23 UTC (rev 226815)
@@ -720,12 +720,10 @@
// The number of required elements is one more than the maximum
// index that will be accessed.
- Checked<unsigned, RecordOverflow> checkedNumElementsRequired = Checked<unsigned>(maxIndex.value());
- checkedNumElementsRequired += 1;
- if (checkedNumElementsRequired.hasOverflowed())
- return false;
- numElementsRequired = checkedNumElementsRequired.unsafeGet();
- return true;
+ numElementsRequired = maxIndex.value() + 1;
+
+ // Check for overflow.
+ return numElementsRequired > 0;
}
bool WebGLRenderingContext::validateBlendEquation(const char* functionName, GC3Denum mode)
Modified: trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp (226814 => 226815)
--- trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp 2018-01-11 23:57:52 UTC (rev 226814)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp 2018-01-12 00:03:23 UTC (rev 226815)
@@ -1892,12 +1892,8 @@
}
// Then set the last index in the index array and make sure it is valid.
- Checked<unsigned, RecordOverflow> checkedNumElementsRequired = Checked<unsigned>(lastIndex);
- checkedNumElementsRequired += 1;
- if (checkedNumElementsRequired.hasOverflowed())
- return false;
- numElementsRequired = checkedNumElementsRequired.unsafeGet();
- return true;
+ numElementsRequired = lastIndex + 1;
+ return numElementsRequired > 0;
}
bool WebGLRenderingContextBase::validateVertexAttributes(unsigned elementCount, unsigned primitiveCount)
@@ -2119,15 +2115,8 @@
clearIfComposited();
bool vertexAttrib0Simulated = false;
- if (!isGLES2Compliant()) {
- auto simulateVertexAttrib0Status = simulateVertexAttrib0(first + count - 1);
- if (!simulateVertexAttrib0Status) {
- // We were unable to simulate the attribute buffer.
- synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "drawArrays", "unable to simulate vertexAttrib0 array");
- return;
- }
- vertexAttrib0Simulated = simulateVertexAttrib0Status.value();
- }
+ if (!isGLES2Compliant())
+ vertexAttrib0Simulated = simulateVertexAttrib0(first + count - 1);
bool usesFallbackTexture = false;
if (!isGLES2NPOTStrict())
usesFallbackTexture = checkTextureCompleteness("drawArrays", true);
@@ -2156,13 +2145,7 @@
if (!isGLES2Compliant()) {
if (!numElements)
validateIndexArrayPrecise(count, type, static_cast<GC3Dintptr>(offset), numElements);
- auto simulateVertexAttrib0Status = simulateVertexAttrib0(numElements);
- if (!simulateVertexAttrib0Status) {
- // We were unable to simulate the attribute buffer.
- synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "drawElements", "unable to simulate vertexAttrib0 array");
- return;
- }
- vertexAttrib0Simulated = simulateVertexAttrib0Status.value();
+ vertexAttrib0Simulated = simulateVertexAttrib0(numElements);
}
bool usesFallbackTexture = false;
@@ -5699,8 +5682,11 @@
m_vertexAttrib0UsedBefore = false;
}
-bool WebGLRenderingContextBase::validateSimulatedVertexAttrib0(GC3Duint numVertex)
+bool WebGLRenderingContextBase::validateSimulatedVertexAttrib0(GC3Dsizei numVertex)
{
+ if (numVertex < 0)
+ return false;
+
if (!m_currentProgram)
return true;
@@ -5712,17 +5698,15 @@
if (state.enabled)
return true;
- Checked<GC3Duint, RecordOverflow> bufferSize(numVertex);
+ Checked<GC3Dsizei, RecordOverflow> bufferSize(numVertex);
bufferSize += 1;
- bufferSize *= Checked<GC3Duint>(4);
- if (bufferSize.hasOverflowed())
- return false;
+ bufferSize *= Checked<GC3Dsizei>(4);
Checked<GC3Dsizeiptr, RecordOverflow> bufferDataSize(bufferSize);
bufferDataSize *= Checked<GC3Dsizeiptr>(sizeof(GC3Dfloat));
- return !bufferDataSize.hasOverflowed() && bufferDataSize.unsafeGet() > 0;
+ return !bufferDataSize.hasOverflowed();
}
-std::optional<bool> WebGLRenderingContextBase::simulateVertexAttrib0(GC3Duint numVertex)
+bool WebGLRenderingContextBase::simulateVertexAttrib0(GC3Dsizei numVertex)
{
if (!m_currentProgram)
return false;
@@ -5738,21 +5722,15 @@
m_vertexAttrib0UsedBefore = true;
m_context->bindBuffer(GraphicsContext3D::ARRAY_BUFFER, m_vertexAttrib0Buffer->object());
- Checked<GC3Duint> bufferSize(numVertex);
+ Checked<GC3Dsizei> bufferSize(numVertex);
bufferSize += 1;
- bufferSize *= Checked<GC3Duint>(4);
+ bufferSize *= Checked<GC3Dsizei>(4);
Checked<GC3Dsizeiptr> bufferDataSize(bufferSize);
bufferDataSize *= Checked<GC3Dsizeiptr>(sizeof(GC3Dfloat));
if (bufferDataSize.unsafeGet() > m_vertexAttrib0BufferSize) {
- m_context->moveErrorsToSyntheticErrorList();
m_context->bufferData(GraphicsContext3D::ARRAY_BUFFER, bufferDataSize.unsafeGet(), 0, GraphicsContext3D::DYNAMIC_DRAW);
- if (m_context->getError() != GraphicsContext3D::NO_ERROR) {
- // We were unable to create a buffer.
- m_vertexAttrib0UsedBefore = false;
- return std::nullopt;
- }
m_vertexAttrib0BufferSize = bufferDataSize.unsafeGet();
m_forceAttrib0BufferRefill = true;
}
@@ -5767,7 +5745,7 @@
|| attribValue.value[3] != m_vertexAttrib0BufferValue[3])) {
auto bufferData = std::make_unique<GC3Dfloat[]>(bufferSize.unsafeGet());
- for (GC3Duint ii = 0; ii < numVertex + 1; ++ii) {
+ for (GC3Dsizei ii = 0; ii < numVertex + 1; ++ii) {
bufferData[ii * 4] = attribValue.value[0];
bufferData[ii * 4 + 1] = attribValue.value[1];
bufferData[ii * 4 + 2] = attribValue.value[2];
@@ -6070,15 +6048,8 @@
clearIfComposited();
bool vertexAttrib0Simulated = false;
- if (!isGLES2Compliant()) {
- auto simulateVertexAttrib0Status = simulateVertexAttrib0(first + count - 1);
- if (!simulateVertexAttrib0Status) {
- // We were unable to simulate the attribute buffer.
- synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "drawArraysInstanced", "unable to simulate vertexAttrib0 array");
- return;
- }
- vertexAttrib0Simulated = simulateVertexAttrib0Status.value();
- }
+ if (!isGLES2Compliant())
+ vertexAttrib0Simulated = simulateVertexAttrib0(first + count - 1);
if (!isGLES2NPOTStrict())
checkTextureCompleteness("drawArraysInstanced", true);
@@ -6108,13 +6079,7 @@
if (!isGLES2Compliant()) {
if (!numElements)
validateIndexArrayPrecise(count, type, static_cast<GC3Dintptr>(offset), numElements);
- auto simulateVertexAttrib0Status = simulateVertexAttrib0(numElements);
- if (!simulateVertexAttrib0Status) {
- // We were unable to simulate the attribute buffer.
- synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "drawArraysInstanced", "unable to simulate vertexAttrib0 array");
- return;
- }
- vertexAttrib0Simulated = simulateVertexAttrib0Status.value();
+ vertexAttrib0Simulated = simulateVertexAttrib0(numElements);
}
if (!isGLES2NPOTStrict())
checkTextureCompleteness("drawElementsInstanced", true);
Modified: trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.h (226814 => 226815)
--- trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.h 2018-01-11 23:57:52 UTC (rev 226814)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.h 2018-01-12 00:03:23 UTC (rev 226815)
@@ -792,8 +792,8 @@
// Helpers for simulating vertexAttrib0.
void initVertexAttrib0();
- std::optional<bool> simulateVertexAttrib0(GC3Duint numVertex);
- bool validateSimulatedVertexAttrib0(GC3Duint numVertex);
+ bool simulateVertexAttrib0(GC3Dsizei numVertex);
+ bool validateSimulatedVertexAttrib0(GC3Dsizei numVertex);
void restoreStatesAfterVertexAttrib0Simulation();
void dispatchContextLostEvent();