| // Copyright (C) 2026 The Android Open Source Project | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| import {test} from '@playwright/test'; | |
| /** | |
| * This test simply dumps WebGL information to the console. It's not a real | |
| * test, but it can be useful to quickly check the WebGL capabilities of the | |
| * environment where tests are running. It's very quick to run as it doesn't | |
| * load a trace or even load the Perfetto UI at all. | |
| */ | |
| test('Dump GL info', async ({browser}) => { | |
| const page = await browser.newPage(); | |
| const info = await page.evaluate(() => { | |
| // Use separate canvases to accurately detect support for each WebGL version | |
| const canvas1 = document.createElement('canvas'); | |
| const canvas2 = document.createElement('canvas'); | |
| const webgl2 = canvas2.getContext('webgl2'); | |
| const webgl1 = canvas1.getContext('webgl'); | |
| const gl = webgl2 ?? webgl1; | |
| if (!gl) { | |
| return { | |
| error: 'WebGL not supported', | |
| webgl2Supported: false, | |
| webgl1Supported: false, | |
| }; | |
| } | |
| const dbg = gl.getExtension('WEBGL_debug_renderer_info'); | |
| const contextType = webgl2 ? 'webgl2' : 'webgl1'; | |
| // Gather all available debug parameters | |
| const params: Record<string, unknown> = { | |
| contextType, | |
| webgl2Supported: !!webgl2, | |
| webgl1Supported: !!webgl1, | |
| debugExtensionAvailable: !!dbg, | |
| // Renderer info (from debug extension if available) | |
| renderer: dbg ? gl.getParameter(dbg.UNMASKED_RENDERER_WEBGL) : 'N/A', | |
| vendor: dbg ? gl.getParameter(dbg.UNMASKED_VENDOR_WEBGL) : 'N/A', | |
| // Standard WebGL parameters | |
| version: gl.getParameter(gl.VERSION), | |
| shadingLanguageVersion: gl.getParameter(gl.SHADING_LANGUAGE_VERSION), | |
| vendorString: gl.getParameter(gl.VENDOR), | |
| rendererString: gl.getParameter(gl.RENDERER), | |
| // Capabilities | |
| maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE), | |
| maxViewportDims: gl.getParameter(gl.MAX_VIEWPORT_DIMS), | |
| maxRenderbufferSize: gl.getParameter(gl.MAX_RENDERBUFFER_SIZE), | |
| maxVertexAttribs: gl.getParameter(gl.MAX_VERTEX_ATTRIBS), | |
| maxVertexUniformVectors: gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS), | |
| maxFragmentUniformVectors: gl.getParameter( | |
| gl.MAX_FRAGMENT_UNIFORM_VECTORS, | |
| ), | |
| maxVaryingVectors: gl.getParameter(gl.MAX_VARYING_VECTORS), | |
| maxTextureImageUnits: gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS), | |
| maxCombinedTextureImageUnits: gl.getParameter( | |
| gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS, | |
| ), | |
| // Precision formats (for fragment shaders) | |
| highFloatPrecision: gl.getShaderPrecisionFormat( | |
| gl.FRAGMENT_SHADER, | |
| gl.HIGH_FLOAT, | |
| ), | |
| mediumFloatPrecision: gl.getShaderPrecisionFormat( | |
| gl.FRAGMENT_SHADER, | |
| gl.MEDIUM_FLOAT, | |
| ), | |
| // Available extensions | |
| supportedExtensions: gl.getSupportedExtensions(), | |
| }; | |
| return params; | |
| }); | |
| console.log('GL INFO:', info); | |
| }); |