54 lines
2.0 KiB
JavaScript
54 lines
2.0 KiB
JavaScript
'use strict';
|
|
|
|
var isWebGLSupported = require('../../utils/browser/isWebGLSupported.js');
|
|
var isWebGPUSupported = require('../../utils/browser/isWebGPUSupported.js');
|
|
var AbstractRenderer = require('./shared/system/AbstractRenderer.js');
|
|
|
|
"use strict";
|
|
const renderPriority = ["webgl", "webgpu", "canvas"];
|
|
async function autoDetectRenderer(options) {
|
|
let preferredOrder = [];
|
|
if (options.preference) {
|
|
preferredOrder.push(options.preference);
|
|
renderPriority.forEach((item) => {
|
|
if (item !== options.preference) {
|
|
preferredOrder.push(item);
|
|
}
|
|
});
|
|
} else {
|
|
preferredOrder = renderPriority.slice();
|
|
}
|
|
let RendererClass;
|
|
let finalOptions = {};
|
|
for (let i = 0; i < preferredOrder.length; i++) {
|
|
const rendererType = preferredOrder[i];
|
|
if (rendererType === "webgpu" && await isWebGPUSupported.isWebGPUSupported()) {
|
|
const { WebGPURenderer } = await Promise.resolve().then(function () { return require('./gpu/WebGPURenderer.js'); });
|
|
RendererClass = WebGPURenderer;
|
|
finalOptions = { ...options, ...options.webgpu };
|
|
break;
|
|
} else if (rendererType === "webgl" && isWebGLSupported.isWebGLSupported(
|
|
options.failIfMajorPerformanceCaveat ?? AbstractRenderer.AbstractRenderer.defaultOptions.failIfMajorPerformanceCaveat
|
|
)) {
|
|
const { WebGLRenderer } = await Promise.resolve().then(function () { return require('./gl/WebGLRenderer.js'); });
|
|
RendererClass = WebGLRenderer;
|
|
finalOptions = { ...options, ...options.webgl };
|
|
break;
|
|
} else if (rendererType === "canvas") {
|
|
finalOptions = { ...options };
|
|
throw new Error("CanvasRenderer is not yet implemented");
|
|
}
|
|
}
|
|
delete finalOptions.webgpu;
|
|
delete finalOptions.webgl;
|
|
if (!RendererClass) {
|
|
throw new Error("No available renderer for the current environment");
|
|
}
|
|
const renderer = new RendererClass();
|
|
await renderer.init(finalOptions);
|
|
return renderer;
|
|
}
|
|
|
|
exports.autoDetectRenderer = autoDetectRenderer;
|
|
//# sourceMappingURL=autoDetectRenderer.js.map
|