xrWebGLLayer_opaque_framebuffer.https.html (4699B)
1 <!DOCTYPE html> 2 <script src="/resources/testharness.js"></script> 3 <script src="/resources/testharnessreport.js"></script> 4 <script src="resources/webxr_util.js"></script> 5 <script src="resources/webxr_test_constants.js"></script> 6 7 <script> 8 let immersiveTestName = "Ensure that the framebuffer given by the WebGL layer" + 9 " is opaque for immersive"; 10 let nonImmersiveTestName = "Ensure that the framebuffer given by the WebGL layer" + 11 " is opaque for non-immersive"; 12 13 let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; 14 15 let testFunction = 16 (session, fakeDeviceController, t, sessionObjects) => new Promise((resolve, reject) => { 17 let gl = sessionObjects.gl; 18 let webglLayer = sessionObjects.glLayer; 19 let xrFramebuffer = webglLayer.framebuffer; 20 21 // Make sure we're starting with a clean error slate. 22 assert_equals(gl.getError(), gl.NO_ERROR); 23 24 if (session.mode == 'inline') { 25 // Creating a layer with an inline session should return a framebuffer of 26 // null, and as such most of these tests won't apply. 27 assert_equals(xrFramebuffer, null); 28 resolve(); 29 return; 30 } 31 32 assert_not_equals(xrFramebuffer, null); 33 34 // The XR framebuffer is not bound to the GL context by default. 35 assert_not_equals(xrFramebuffer, gl.getParameter(gl.FRAMEBUFFER_BINDING)); 36 37 assert_greater_than(webglLayer.framebufferWidth, 0); 38 assert_greater_than(webglLayer.framebufferHeight, 0); 39 40 gl.bindFramebuffer(gl.FRAMEBUFFER, xrFramebuffer); 41 assert_equals(gl.getError(), gl.NO_ERROR); 42 43 gl.deleteFramebuffer(xrFramebuffer); 44 assert_equals(gl.getError(), gl.INVALID_OPERATION); 45 46 // Make sure the framebuffer is still bound after failed attempt to delete. 47 let boundFramebuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING); 48 assert_equals(xrFramebuffer, boundFramebuffer); 49 assert_equals(gl.getError(), gl.NO_ERROR); 50 51 // WebGL 2 does not throw an error and instead returns 0 when there are no 52 // attachments 53 if (gl.getParameter(gl.VERSION).includes("WebGL 1.0")) { 54 // Ensure the framebuffer attachment properties cannot be inspected. 55 let attachments = [ 56 gl.COLOR_ATTACHMENT0, 57 gl.DEPTH_ATTACHMENT, 58 gl.STENCIL_ATTACHMENT, 59 ]; 60 61 let parameters = [ 62 gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, 63 gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, 64 gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, 65 gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, 66 ]; 67 68 for (let attachment of attachments) { 69 for (let parameter of parameters) { 70 let value = gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, attachment, parameter); 71 assert_equals(value, null); 72 assert_equals(gl.getError(), gl.INVALID_OPERATION); 73 } 74 } 75 } 76 77 let width = 64; 78 let height = 64; 79 80 // Ensure the framebuffer texture 2D attachmentments cannot be changed. 81 var texture = gl.createTexture(); 82 gl.bindTexture(gl.TEXTURE_2D, texture); 83 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); 84 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); 85 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); 86 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); 87 gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); 88 89 gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); 90 assert_equals(gl.getError(), gl.INVALID_OPERATION); 91 92 // Ensure the framebuffer renderbuffer attachmentments cannot be changed. 93 let renderbuffer = gl.createRenderbuffer(); 94 gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer); 95 gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height); 96 gl.framebufferRenderbuffer( 97 gl.FRAMEBUFFER, 98 gl.DEPTH_ATTACHMENT, 99 gl.RENDERBUFFER, 100 renderbuffer); 101 assert_equals(gl.getError(), gl.INVALID_OPERATION); 102 103 gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height); 104 gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, renderbuffer); 105 assert_equals(gl.getError(), gl.INVALID_OPERATION); 106 107 // Framebuffer status must be unsupported outside of a XR frame callback. 108 assert_equals(gl.checkFramebufferStatus(gl.FRAMEBUFFER), gl.FRAMEBUFFER_UNSUPPORTED); 109 110 session.requestAnimationFrame((time, xrFrame) => { 111 // Framebuffer status must be complete inside of a XR frame callback. 112 assert_equals(gl.checkFramebufferStatus(gl.FRAMEBUFFER), gl.FRAMEBUFFER_COMPLETE); 113 // Finished. 114 resolve(); 115 }); 116 }); 117 118 xr_session_promise_test( 119 immersiveTestName, testFunction, fakeDeviceInitParams, 'immersive-vr'); 120 121 xr_session_promise_test( 122 nonImmersiveTestName, testFunction, fakeDeviceInitParams, 'inline'); 123 124 </script>