blob: 3a67bedf3269d1dfa532b6e097960d4e7ef26467 [file] [log] [blame]
<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="../vr/resources/fake-vr-displays.js"></script>
<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/device/vr/vr_service.mojom.js"></script>
<script src="../vr/resources/mock-vr-service.js"></script>
<script src="../vr/resources/test-constants.js"></script>
<canvas id="webgl-canvas"></canvas>
<script src="../vr/resources/presentation-setup.js"></script>
<script>
let fakeDisplays = fakeVRDisplays();
// Very simple program setup with no error checking.
function setupProgram(gl, vertexSrc, fragmentSrc) {
let program = gl.createProgram();
let vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexSrc);
gl.compileShader(vertexShader);
gl.attachShader(program, vertexShader);
let fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentSrc);
gl.compileShader(fragmentShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program);
return program;
}
xr_session_test( (t, session, mockService) => {
// Setup simple WebGL geometry to draw with.
let program = setupProgram(gl,
"attribute vec4 vPosition; void main() { gl_Position = vPosition; }",
"void main() { gl_FragColor = vec4(1.0,0.0,0.0,1.0); }"
);
let vertexObject = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 0,0.5,0, -0.5,-0.5,0, 0.5,-0.5,0 ]), gl.STATIC_DRAW);
gl.enableVertexAttribArray(0);
gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
let indexObject = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexObject);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array([ 0, 1, 2]), gl.STATIC_DRAW);
// Session must have a baseLayer or frame requests will be ignored.
let webglLayer = new XRWebGLLayer(session, gl);
session.baseLayer = webglLayer;
let xrFramebuffer = webglLayer.framebuffer;
function runDrawTests(t, expectedError) {
t.step( () => {
// Make sure we're starting with a clean error slate.
assert_equals(gl.getError(), gl.NO_ERROR);
gl.bindFramebuffer(gl.FRAMEBUFFER, xrFramebuffer);
assert_equals(gl.getError(), gl.NO_ERROR);
}, "Framebuffer must be bindable");
t.step( () => {
gl.clear(gl.COLOR_BUFFER_BIT);
assert_equals(gl.getError(), gl[expectedError]);
gl.clear(gl.DEPTH_BUFFER_BIT);
assert_equals(gl.getError(), gl[expectedError]);
}, `Test clearing the framebuffer, expect ${expectedError}`);
t.step( () => {
gl.drawArrays(gl.TRIANGLES, 0, 3);
assert_equals(gl.getError(), gl[expectedError]);
}, `Test drawArrays, expect ${expectedError}`);
t.step( () => {
gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_BYTE, 0);
assert_equals(gl.getError(), gl[expectedError]);
}, `Test drawElements, expect ${expectedError}`);
}
// Drawing operations outside of a XR frame should fail.
runDrawTests(t, "INVALID_FRAMEBUFFER_OPERATION");
// Drawing operations within a XR frame should succeed.
session.requestAnimationFrame((time, xrFrame) => {
runDrawTests(t, "NO_ERROR");
t.done();
});
}, fakeDisplays["Pixel"], { exclusive: true },
"Ensure a WebGL layer's framebuffer can only be drawn to inside a XR frame");
</script>