129 lines
3.5 KiB
JavaScript
129 lines
3.5 KiB
JavaScript
var createInvalidAttribTestFn = (function() {
|
|
|
|
async function testPreserveDrawingBufferTrue(gl, drawFn, clear) {
|
|
debug('');
|
|
debug(`test preserveDrawingBuffer: true with ${drawFn.name} ${clear ? 'with' : 'without'} clear`);
|
|
|
|
if (clear) {
|
|
gl.clearColor(0, 0, 0, 0);
|
|
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
}
|
|
|
|
const skipTest = drawFn(gl);
|
|
if (skipTest) {
|
|
debug('skipped: extension does not exist');
|
|
return;
|
|
}
|
|
|
|
wtu.checkCanvas(gl, [255, 0, 0, 255], "canvas should be red");
|
|
|
|
await waitForComposite();
|
|
|
|
wtu.checkCanvas(gl, [255, 0, 0, 255], "canvas should be red");
|
|
wtu.glErrorShouldBe(gl, gl.NO_ERROR, "there should be no errors");
|
|
}
|
|
|
|
function setupWebGL({
|
|
webglVersion,
|
|
shadersFn,
|
|
attribs,
|
|
}) {
|
|
const positionBuf = gl.createBuffer();
|
|
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuf);
|
|
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
|
|
-1, -1,
|
|
1, -1,
|
|
-1, 1,
|
|
-1, 1,
|
|
1, -1,
|
|
1, 1,
|
|
]), gl.STATIC_DRAW);
|
|
gl.enableVertexAttribArray(0);
|
|
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
|
|
const indexBuf = gl.createBuffer();
|
|
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuf);
|
|
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint8Array([0, 1, 2, 3, 4, 5]), gl.STATIC_DRAW);
|
|
return gl;
|
|
}
|
|
|
|
function createInvalidAttribTestFn(gl) {
|
|
const vs = `
|
|
attribute vec4 vPosition;
|
|
void main()
|
|
{
|
|
gl_Position = vPosition;
|
|
}
|
|
`;
|
|
|
|
const fs = `
|
|
precision mediump float;
|
|
void main()
|
|
{
|
|
gl_FragColor = vec4(1, 0, 0, 1);
|
|
}
|
|
`
|
|
|
|
const program = wtu.setupProgram(gl, [vs, fs], ["vPosition"]);
|
|
if (!program) {
|
|
debug(`program failed to compile: ${wtu.getLastError()}`);
|
|
}
|
|
|
|
const positionBuffer = gl.createBuffer();
|
|
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
|
|
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
|
|
-1, -1,
|
|
1, -1,
|
|
-1, 1,
|
|
-1, 1,
|
|
1, -1,
|
|
1, 1,
|
|
]), gl.STATIC_DRAW);
|
|
|
|
const indexBuffer = gl.createBuffer();
|
|
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
|
|
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,
|
|
new Uint8Array([0, 1, 2, 3, 4, 5]),
|
|
gl.STATIC_DRAW);
|
|
|
|
return async function invalidAttribTestFn(drawFn) {
|
|
debug('');
|
|
|
|
// reset attribs
|
|
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
const numAttribs = gl.getParameter(gl.MAX_VERTEX_ATTRIBS);
|
|
for (let i = 0; i < numAttribs; ++i) {
|
|
gl.disableVertexAttribArray(i);
|
|
gl.vertexAttribPointer(1, 1, gl.FLOAT, false, 0, 0);
|
|
}
|
|
|
|
debug(`test ${drawFn.name} draws with valid attributes`);
|
|
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
|
|
gl.enableVertexAttribArray(0);
|
|
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
|
|
wtu.glErrorShouldBe(gl, gl.NO_ERROR, "there should be no errors");
|
|
|
|
gl.clearColor(0, 0, 0, 0,);
|
|
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
wtu.checkCanvas(gl, [0, 0, 0, 0], "canvas should be zero");
|
|
|
|
drawFn(gl);
|
|
|
|
wtu.checkCanvas(gl, [255, 0, 0, 255], "canvas should be red");
|
|
wtu.glErrorShouldBe(gl, gl.NO_ERROR, "there should be no errors");
|
|
|
|
debug(`test ${drawFn.name} generates INVALID_OPERATION draws with enabled attribute no buffer bound`);
|
|
gl.enableVertexAttribArray(1);
|
|
|
|
gl.clearColor(0, 0, 0, 0,);
|
|
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
wtu.checkCanvas(gl, [0, 0, 0, 0], "canvas should be zero");
|
|
|
|
drawFn(gl);
|
|
|
|
wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "should generate INVALID_OPERATION");
|
|
wtu.checkCanvas(gl, [0, 0, 0, 0], "canvas should be zero");
|
|
};
|
|
}
|
|
|
|
return createInvalidAttribTestFn;
|
|
}());
|