xrLayerInit.https.html (6739B)
1 <!doctype html> 2 <title>Tests for errors with invalid XRLayerInit parameters.</title> 3 <link rel="help" href="https://immersive-web.github.io/layers/#dom-xrwebglbinding-createquadlayer"> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <script src="../resources/webxr_util.js"></script> 7 <script src="../resources/webxr_test_constants.js"></script> 8 <script src="./xr_layer_promise_test.js"></script> 9 10 <canvas id="webgl-canvas"></canvas> 11 12 <script> 13 function testCommonXRLayerInitErrors(createLayerFn, valid_init, t, gl) { 14 const is_webgl2 = gl instanceof WebGL2RenderingContext; 15 return new Promise((resolve, reject) => { 16 const max_texture_size = gl.getParameter(gl.MAX_TEXTURE_SIZE); 17 if (!is_webgl2) { 18 // Check an exception on webgl2 color formats. 19 t.step(() => { 20 [ 21 0x8058, // GL_RGBA8 22 0x8051, // GL_RGB8 23 0x8C41, // GL_SRGB8 24 0x8C43 // GL_SRGB8_ALPHA8 25 ].forEach((colorFormat) => { 26 let invalid_color_format = Object.assign({}, valid_init, { colorFormat }); 27 assert_throws_js(TypeError, () => createLayerFn(invalid_color_format), "colorFormat for webgl2 only"); 28 }); 29 }); 30 } 31 32 t.step(() => { 33 // viewPixelWidth and viewPixelHeight must be greater than 0. 34 let invalid_pixel_width = Object.assign({}, valid_init, { viewPixelWidth: 0 }); 35 assert_throws_js(TypeError, () => createLayerFn(invalid_pixel_width), "viewPixelWidth is 0"); 36 }); 37 38 t.step(() => { 39 let invalid_pixel_height = Object.assign({}, valid_init, { viewPixelHeight: 0 }); 40 assert_throws_js(TypeError, () => createLayerFn(invalid_pixel_height), "viewPixelHeight is 0"); 41 }); 42 43 // viewPixelWidth and viewPixelHeight must not be too large. 44 t.step(() => { 45 let large_pixel_width = Object.assign({}, valid_init, { viewPixelWidth: max_texture_size + 1 }); 46 assert_throws_js(TypeError, () => createLayerFn(large_pixel_width), "viewPixelWidth is too large"); 47 }); 48 49 t.step(() => { 50 let large_pixel_height = Object.assign({}, valid_init, { viewPixelHeight: max_texture_size + 1 }); 51 assert_throws_js(TypeError, () => createLayerFn(large_pixel_height), "viewPixelHeight is too large"); 52 }); 53 }); 54 }; 55 56 function testXRLayerInitTextureArrayErrors(createLayerFn, valid_init, t, gl) { 57 const is_webgl2 = gl instanceof WebGL2RenderingContext; 58 return new Promise((resolve, reject) => { 59 let texture_array = Object.assign({}, valid_init, { textureType: 'texture-array', layout: 'stereo' }); 60 if (is_webgl2) { 61 const layer = createLayerFn(texture_array); 62 // 'stereo' layout should be supported with 'texture-array'. 63 assert_equals(layer.layout, 'stereo', "layout is not expected"); 64 } else { 65 // Check an exception on texture-array. 66 t.step(() => { 67 // texture-array is not supported for webgl. 68 assert_throws_js(TypeError, () => createLayerFn(texture_array), "texture-array for webgl2 only"); 69 }); 70 } 71 }); 72 } 73 74 function testXRLayerInitTransformErrors(createLayerFn, valid_init, t) { 75 return new Promise((resolve, reject) => { 76 t.step(() => { 77 // Check an exception for invalid transform object. 78 let invalid_transform = Object.assign({}, valid_init, { transform: { x: 0, y: 0, z: 0 } }); 79 assert_throws_js(TypeError, () => createLayerFn(invalid_transform), "Invalid transform object"); 80 }); 81 }); 82 } 83 84 function testXRLayerInitLayoutErrors(createLayerFn, valid_init, t, is_cube) { 85 return new Promise((resolve, reject) => { 86 t.step(() => { 87 // 'default' is invalid for all layers. 88 const default_layout = Object.assign({}, valid_init, { layout: 'default' }); 89 assert_throws_js(TypeError, () => createLayerFn(default_layout), "layout is 'default'"); 90 91 const stereo_layout = Object.assign({}, valid_init, { layout: 'stereo' }); 92 if (is_cube) { 93 // We don't support 'stereo' layout for cube layers. 94 assert_throws_js(TypeError, () => createLayerFn(stereo_layout), "layout is 'stereo'"); 95 } else { 96 // It should end up as 'stereo-left-right' when 'texture-array' is not used. 97 const layer = createLayerFn(stereo_layout); 98 const layout = layer.layout; 99 assert_equals(layout, 'stereo-left-right', "layout is not expected"); 100 } 101 resolve(); 102 }); 103 }); 104 }; 105 106 function testCompositionLayer(xrSession, deviceController, t, { gl, xrBinding, xrSpace }) { 107 const valid_init = { 108 space: xrSpace, 109 viewPixelWidth: 1024, 110 viewPixelHeight: 1024 111 }; 112 const create_quad_layer = xrBinding.createQuadLayer.bind(xrBinding); 113 const create_cylinder_layer = xrBinding.createCylinderLayer.bind(xrBinding); 114 const create_equirect_layer = xrBinding.createEquirectLayer.bind(xrBinding); 115 const create_cube_layer = xrBinding.createCubeLayer.bind(xrBinding); 116 117 return Promise.resolve() 118 // Quad layer. 119 .then(testCommonXRLayerInitErrors(create_quad_layer, valid_init, t, gl)) 120 .then(testXRLayerInitTextureArrayErrors(create_quad_layer, valid_init, t, gl)) 121 .then(testXRLayerInitTransformErrors(create_quad_layer, valid_init, t)) 122 .then(testXRLayerInitLayoutErrors(create_quad_layer, valid_init, t, false /*is_cube*/)) 123 // Cylinder layer. 124 .then(testCommonXRLayerInitErrors(create_cylinder_layer, valid_init, t, gl)) 125 .then(testXRLayerInitTextureArrayErrors(create_cylinder_layer, valid_init, t, gl)) 126 .then(testXRLayerInitTransformErrors(create_cylinder_layer, valid_init, t)) 127 .then(testXRLayerInitLayoutErrors(create_cylinder_layer, valid_init, t, false /*is_cube*/)) 128 // Equirect layer. 129 .then(testCommonXRLayerInitErrors(create_equirect_layer, valid_init, t, gl)) 130 .then(testXRLayerInitTextureArrayErrors(create_equirect_layer, valid_init, t, gl)) 131 .then(testXRLayerInitTransformErrors(create_equirect_layer, valid_init, t)) 132 .then(testXRLayerInitLayoutErrors(create_equirect_layer, valid_init, t, false /*is_cube*/)) 133 // Cube layer. 134 .then(testCommonXRLayerInitErrors(create_cube_layer, valid_init, t, gl)) 135 .then(testXRLayerInitLayoutErrors(create_cube_layer, valid_init, t, true /*is_cube*/)); 136 } 137 138 // This method tests XRLayerInit parameters, which are common to the Quad,Cylinder and Equirect layers. 139 xr_layer_promise_test("Ensure XrWebGLBinding's create layer methods throw the appropriate errors.", 140 testCompositionLayer, TRACKED_IMMERSIVE_DEVICE, 'immersive-vr', { requiredFeatures: ['layers'] }); 141 </script>