summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webxr/xrWebGLLayer_framebuffer_draw.https.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/webxr/xrWebGLLayer_framebuffer_draw.https.html')
-rw-r--r--testing/web-platform/tests/webxr/xrWebGLLayer_framebuffer_draw.https.html92
1 files changed, 92 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webxr/xrWebGLLayer_framebuffer_draw.https.html b/testing/web-platform/tests/webxr/xrWebGLLayer_framebuffer_draw.https.html
new file mode 100644
index 0000000000..eb797cf93a
--- /dev/null
+++ b/testing/web-platform/tests/webxr/xrWebGLLayer_framebuffer_draw.https.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
+
+<script>
+
+let testName =
+ "Ensure a WebGL layer's framebuffer can only be drawn to inside a XR frame";
+
+let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
+
+// 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;
+}
+
+let testFunction =
+ (session, fakeDeviceController, t, sessionObjects) => new Promise((resolve, reject) => {
+ let gl = sessionObjects.gl;
+ let webglLayer = sessionObjects.glLayer;
+ // 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);
+
+ let xrFramebuffer = webglLayer.framebuffer;
+
+ function runDrawTests(expectedError) {
+ // 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);
+
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ assert_equals(gl.getError(), gl[expectedError]);
+
+ gl.clear(gl.DEPTH_BUFFER_BIT);
+ assert_equals(gl.getError(), gl[expectedError]);
+
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
+ assert_equals(gl.getError(), gl[expectedError]);
+
+ gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_BYTE, 0);
+ assert_equals(gl.getError(), gl[expectedError]);
+ }
+
+ // Drawing operations outside of a XR frame should fail.
+ runDrawTests("INVALID_FRAMEBUFFER_OPERATION");
+
+ // Drawing operations within a XR frame should succeed.
+ session.requestAnimationFrame((time, xrFrame) => {
+ runDrawTests("NO_ERROR");
+ resolve();
+ });
+});
+
+xr_session_promise_test(
+ testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
+
+</script>