ANGLE detection
This commit is contained in:
parent
cc0ae60c83
commit
38dd1ddbe8
122
src/ext/lib/angle-detect/detect-angle-backend.ts
Normal file
122
src/ext/lib/angle-detect/detect-angle-backend.ts
Normal file
@ -0,0 +1,122 @@
|
||||
/**
|
||||
* Used to detect ANGLE backend
|
||||
*/
|
||||
|
||||
export enum AngleVersion {
|
||||
OpenGL,
|
||||
D3D9,
|
||||
D3D11,
|
||||
Metal,
|
||||
Vulkan,
|
||||
NotAvailable,
|
||||
}
|
||||
|
||||
/**
|
||||
* Detects DirectX version. Note that D3D11 and D3D11on12
|
||||
* do not seem to be distinguishable
|
||||
* @param shaderSource
|
||||
* @returns
|
||||
*/
|
||||
function detectDX(shaderSource: string) {
|
||||
const glsl = shaderSource.match(/#version (\d+)( es)?$/m);
|
||||
|
||||
const glslVer = +glsl[1];
|
||||
|
||||
if (glslVer >= 300) {
|
||||
return AngleVersion.D3D11;
|
||||
}
|
||||
if (glslVer >= 100) {
|
||||
return AngleVersion.D3D9;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Detects OpenGL version.
|
||||
*/
|
||||
function detectGl(shaderSource: string) {
|
||||
// const glsl = shaderSource.match(/#version (\d+)( es)?$/m);
|
||||
// if (glsl && glsl[1]) {
|
||||
// // GLSL version to OpenGL
|
||||
// // https://en.wikipedia.org/wiki/OpenGL_Shading_Language
|
||||
// const OpenGL = {
|
||||
// 100: "OpenGL ES 2.0",
|
||||
// 300: "OpenGL ES 3.0",
|
||||
// 110: "OpenGL 2.0",
|
||||
// 120: "OpenGL 2.1",
|
||||
// 130: "OpenGL 3.0",
|
||||
// 140: "OpenGL 3.1",
|
||||
// 150: "OpenGL 3.2",
|
||||
// 330: "OpenGL 3.3",
|
||||
// 400: "OpenGL 4.0",
|
||||
// 410: "OpenGL 4.1",
|
||||
// 420: "OpenGL 4.2",
|
||||
// 430: "OpenGL 4.3",
|
||||
// 440: "OpenGL 4.4",
|
||||
// 450: "OpenGL 4.5",
|
||||
// 460: "OpenGL 4.6",
|
||||
// };
|
||||
|
||||
// return AngleVersion.OpenGL
|
||||
// }
|
||||
|
||||
return AngleVersion.OpenGL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Detects angle backend version. Vulkan detection not implemented.
|
||||
* @param str
|
||||
* @returns
|
||||
*/
|
||||
function detectBackend(str) {
|
||||
|
||||
if (str.match(/metal::float4/)) {
|
||||
return AngleVersion.Metal;
|
||||
}
|
||||
|
||||
if (str.match(/VS_OUTPUT main\(/)) {
|
||||
return detectDX(str);
|
||||
}
|
||||
|
||||
return detectGl(str);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks which ANGLE backend is being used.
|
||||
* Known limitations: D11on12 cannot be detected.
|
||||
* @returns
|
||||
*/
|
||||
function detectANGLEBackend(): AngleVersion {
|
||||
const canvas = document.createElement("canvas");
|
||||
const gl = canvas.getContext("webgl2") ||
|
||||
canvas.getContext("webgl") ||
|
||||
canvas.getContext("experimental-webgl");
|
||||
|
||||
const ext = (gl as any).getExtension("WEBGL_debug_shaders");
|
||||
|
||||
if (!ext) {
|
||||
return AngleVersion.NotAvailable;
|
||||
}
|
||||
|
||||
const isWebGL1 = gl instanceof WebGLRenderingContext;
|
||||
const shader = (gl as any).createShader((gl as any).VERTEX_SHADER);
|
||||
|
||||
(gl as any).shaderSource(
|
||||
shader,
|
||||
`#version ${isWebGL1 ? "100" : "300 es"}
|
||||
void main() {
|
||||
gl_Position = vec4(__VERSION__, 1.0, 1.0, 1.0);
|
||||
}
|
||||
`
|
||||
);
|
||||
|
||||
(gl as any).compileShader(shader);
|
||||
|
||||
if (!(gl as any).getShaderParameter(shader, (gl as any).COMPILE_STATUS)) {
|
||||
return console.error("invalid shader", (gl as any).getShaderInfoLog(shader));
|
||||
}
|
||||
|
||||
const source = ext.getTranslatedShaderSource(shader);
|
||||
|
||||
return detectBackend(source);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user