mirror of https://github.com/CesiumGS/cesium.git
333 lines
9.6 KiB
JavaScript
333 lines
9.6 KiB
JavaScript
import {
|
|
clone,
|
|
defaultValue,
|
|
defined,
|
|
DeveloperError,
|
|
WebGLConstants,
|
|
} from "@cesium/engine";
|
|
|
|
function getWebGLStub(canvas, options) {
|
|
const stub = clone(WebGLConstants);
|
|
|
|
stub.canvas = canvas;
|
|
stub.drawingBufferWidth = Math.max(canvas.width, 1);
|
|
stub.drawingBufferHeight = Math.max(canvas.height, 1);
|
|
|
|
stub.activeTexture = noop;
|
|
stub.attachShader = noop;
|
|
stub.bindAttribLocation = noop;
|
|
stub.bindBuffer = noop;
|
|
stub.bindFramebuffer = noop;
|
|
stub.bindRenderbuffer = noop;
|
|
stub.bindTexture = noop;
|
|
stub.blendColor = noop;
|
|
stub.blendEquation = noop;
|
|
stub.blendEquationSeparate = noop;
|
|
stub.blendFunc = noop;
|
|
stub.blendFuncSeparate = noop;
|
|
stub.bufferData = noop;
|
|
stub.bufferSubData = noop;
|
|
stub.checkFramebufferStatus = checkFramebufferStatusStub;
|
|
stub.clear = noop;
|
|
stub.clearColor = noop;
|
|
stub.clearDepth = noop;
|
|
stub.clearStencil = noop;
|
|
stub.colorMask = noop;
|
|
stub.compileShader = noop;
|
|
stub.compressedTexImage2D = noop;
|
|
stub.compressedTexSubImage2D = noop;
|
|
stub.copyTexImage2D = noop;
|
|
stub.copyTexSubImage2D = noop;
|
|
stub.createBuffer = createStub;
|
|
stub.createFramebuffer = createStub;
|
|
stub.createProgram = createStub;
|
|
stub.createRenderbuffer = createStub;
|
|
stub.createShader = createStub;
|
|
stub.createTexture = createStub;
|
|
stub.cullFace = noop;
|
|
stub.deleteBuffer = noop;
|
|
stub.deleteFramebuffer = noop;
|
|
stub.deleteProgram = noop;
|
|
stub.deleteRenderbuffer = noop;
|
|
stub.deleteShader = noop;
|
|
stub.deleteTexture = noop;
|
|
stub.depthFunc = noop;
|
|
stub.depthMask = noop;
|
|
stub.depthRange = noop;
|
|
stub.detachShader = noop;
|
|
stub.disable = noop;
|
|
stub.disableVertexAttribArray = noop;
|
|
stub.drawArrays = noop;
|
|
stub.drawElements = noop;
|
|
stub.enable = noop;
|
|
stub.enableVertexAttribArray = noop;
|
|
stub.finish = noop;
|
|
stub.flush = noop;
|
|
stub.framebufferRenderbuffer = noop;
|
|
stub.framebufferTexture2D = noop;
|
|
stub.frontFace = noop;
|
|
stub.generateMipmap = noop;
|
|
stub.getActiveAttrib = getStub;
|
|
stub.getActiveUniform = getStub;
|
|
stub.getAttachedShaders = getStubWarning;
|
|
stub.getAttribLocation = getStub;
|
|
stub.getBufferParameter = getStubWarning;
|
|
stub.getContextAttributes = getContextAttributesStub(options);
|
|
stub.getError = getErrorStub;
|
|
stub.getExtension = getExtensionStub;
|
|
stub.getFramebufferAttachmentParameter = getStubWarning;
|
|
stub.getParameter = getParameterStub(options);
|
|
stub.getProgramParameter = getProgramParameterStub;
|
|
stub.getProgramInfoLog = getStub;
|
|
stub.getRenderbufferParameter = getStubWarning;
|
|
stub.getShaderParameter = getShaderParameterStub;
|
|
stub.getShaderInfoLog = getStub;
|
|
stub.getShaderPrecisionFormat = getShaderPrecisionStub;
|
|
stub.getShaderSource = getStubWarning;
|
|
stub.getSupportedExtensions = getStubWarning;
|
|
stub.getTexParameter = getStubWarning;
|
|
stub.getUniform = getStub;
|
|
stub.getUniformLocation = getStub;
|
|
stub.getVertexAttrib = getStubWarning;
|
|
stub.getVertexAttribOffset = getStubWarning;
|
|
stub.hint = noop;
|
|
stub.isBuffer = getStubWarning;
|
|
stub.isContextLost = getStubWarning;
|
|
stub.isEnabled = getStubWarning;
|
|
stub.isFramebuffer = getStubWarning;
|
|
stub.isProgram = getStubWarning;
|
|
stub.isRenderbuffer = getStubWarning;
|
|
stub.isShader = getStubWarning;
|
|
stub.isTexture = getStubWarning;
|
|
stub.lineWidth = noop;
|
|
stub.linkProgram = noop;
|
|
stub.pixelStorei = noop;
|
|
stub.polygonOffset = noop;
|
|
stub.readPixels = readPixelsStub;
|
|
stub.renderbufferStorage = noop;
|
|
stub.sampleCoverage = noop;
|
|
stub.scissor = noop;
|
|
stub.shaderSource = noop;
|
|
stub.stencilFunc = noop;
|
|
stub.stencilFuncSeparate = noop;
|
|
stub.stencilMask = noop;
|
|
stub.stencilMaskSeparate = noop;
|
|
stub.stencilOp = noop;
|
|
stub.stencilOpSeparate = noop;
|
|
stub.texParameterf = noop;
|
|
stub.texParameteri = noop;
|
|
stub.texImage2D = noop;
|
|
stub.texSubImage2D = noop;
|
|
stub.uniform1f = noop;
|
|
stub.uniform1fv = noop;
|
|
stub.uniform1i = noop;
|
|
stub.uniform1iv = noop;
|
|
stub.uniform2f = noop;
|
|
stub.uniform2fv = noop;
|
|
stub.uniform2i = noop;
|
|
stub.uniform2iv = noop;
|
|
stub.uniform3f = noop;
|
|
stub.uniform3fv = noop;
|
|
stub.uniform3i = noop;
|
|
stub.uniform3iv = noop;
|
|
stub.uniform4f = noop;
|
|
stub.uniform4fv = noop;
|
|
stub.uniform4i = noop;
|
|
stub.uniform4iv = noop;
|
|
stub.uniformMatrix2fv = noop;
|
|
stub.uniformMatrix3fv = noop;
|
|
stub.uniformMatrix4fv = noop;
|
|
stub.useProgram = noop;
|
|
stub.validateProgram = noop;
|
|
stub.vertexAttrib1f = noop;
|
|
stub.vertexAttrib1fv = noop;
|
|
stub.vertexAttrib2f = noop;
|
|
stub.vertexAttrib2fv = noop;
|
|
stub.vertexAttrib3f = noop;
|
|
stub.vertexAttrib3fv = noop;
|
|
stub.vertexAttrib4f = noop;
|
|
stub.vertexAttrib4fv = noop;
|
|
stub.vertexAttribPointer = noop;
|
|
stub.viewport = noop;
|
|
|
|
return stub;
|
|
}
|
|
|
|
// ANGLE_instanced_arrays
|
|
const instancedArraysStub = {
|
|
drawElementsInstancedANGLE: noop,
|
|
drawArraysInstancedANGLE: noop,
|
|
vertexAttribDivisorANGLE: noop,
|
|
};
|
|
|
|
function noop() {}
|
|
|
|
function createStub() {
|
|
return {};
|
|
}
|
|
|
|
function getStub() {
|
|
return {};
|
|
}
|
|
|
|
function getStubWarning() {
|
|
//>>includeStart('debug', pragmas.debug);
|
|
throw new DeveloperError(
|
|
"A stub for this get/is function is not defined. Can it use getStub() or does it need a new one?",
|
|
);
|
|
//>>includeEnd('debug');
|
|
}
|
|
|
|
function checkFramebufferStatusStub(target) {
|
|
return WebGLConstants.FRAMEBUFFER_COMPLETE;
|
|
}
|
|
|
|
function getContextAttributesStub(options) {
|
|
const contextAttributes = {
|
|
alpha: defaultValue(options.alpha, true),
|
|
depth: defaultValue(options.depth, true),
|
|
stencil: defaultValue(options.stencil, false),
|
|
antialias: defaultValue(options.antialias, true),
|
|
premultipliedAlpha: defaultValue(options.premultipliedAlpha, true),
|
|
preserveDrawingBuffer: defaultValue(options.preserveDrawingBuffer, false),
|
|
powerPreference: defaultValue(options.powerPreference, false),
|
|
failIfMajorPerformanceCaveat: defaultValue(
|
|
options.failIfMajorPerformanceCaveat,
|
|
false,
|
|
),
|
|
};
|
|
|
|
return function () {
|
|
return contextAttributes;
|
|
};
|
|
}
|
|
|
|
function getErrorStub() {
|
|
return WebGLConstants.NO_ERROR;
|
|
}
|
|
|
|
function getExtensionStub(name) {
|
|
// Many 3D Tiles tests rely on instanced arrays
|
|
if (name === "ANGLE_instanced_arrays") {
|
|
return instancedArraysStub;
|
|
}
|
|
|
|
// Voxel tests rely on floating point textures
|
|
if (name === "OES_texture_float") {
|
|
return {};
|
|
}
|
|
|
|
// No other extensions are stubbed.
|
|
return null;
|
|
}
|
|
|
|
function getParameterStub(options) {
|
|
// These are not the minimum maximum; instead, they are typical maximums.
|
|
const parameterStubValues = {};
|
|
parameterStubValues[WebGLConstants.STENCIL_BITS] = options.stencil ? 8 : 0;
|
|
parameterStubValues[WebGLConstants.MAX_COMBINED_TEXTURE_IMAGE_UNITS] = 32;
|
|
parameterStubValues[WebGLConstants.MAX_CUBE_MAP_TEXTURE_SIZE] = 16384;
|
|
parameterStubValues[WebGLConstants.MAX_FRAGMENT_UNIFORM_VECTORS] = 1024;
|
|
parameterStubValues[WebGLConstants.MAX_TEXTURE_IMAGE_UNITS] = 16;
|
|
parameterStubValues[WebGLConstants.MAX_RENDERBUFFER_SIZE] = 16384;
|
|
parameterStubValues[WebGLConstants.MAX_TEXTURE_SIZE] = 16384;
|
|
parameterStubValues[WebGLConstants.MAX_VARYING_VECTORS] = 30;
|
|
parameterStubValues[WebGLConstants.MAX_VERTEX_ATTRIBS] = 16;
|
|
parameterStubValues[WebGLConstants.MAX_VERTEX_TEXTURE_IMAGE_UNITS] = 16;
|
|
parameterStubValues[WebGLConstants.MAX_VERTEX_UNIFORM_VECTORS] = 4096;
|
|
parameterStubValues[WebGLConstants.ALIASED_LINE_WIDTH_RANGE] = [1, 1];
|
|
parameterStubValues[WebGLConstants.ALIASED_POINT_SIZE_RANGE] = [1, 1024];
|
|
parameterStubValues[WebGLConstants.MAX_VIEWPORT_DIMS] = [16384, 16384];
|
|
parameterStubValues[WebGLConstants.MAX_TEXTURE_MAX_ANISOTROPY_EXT] = 16; // Assuming extension
|
|
parameterStubValues[WebGLConstants.MAX_DRAW_BUFFERS] = 8; // Assuming extension
|
|
parameterStubValues[WebGLConstants.MAX_COLOR_ATTACHMENTS] = 8; // Assuming extension
|
|
parameterStubValues[WebGLConstants.MAX_SAMPLES] = 8; // Assuming WebGL2
|
|
|
|
return function (pname) {
|
|
const value = parameterStubValues[pname];
|
|
|
|
//>>includeStart('debug', pragmas.debug);
|
|
if (!defined(value)) {
|
|
throw new DeveloperError(
|
|
`A WebGL parameter stub for ${pname} is not defined. Add it.`,
|
|
);
|
|
}
|
|
//>>includeEnd('debug');
|
|
|
|
return value;
|
|
};
|
|
}
|
|
|
|
function getProgramParameterStub(program, pname) {
|
|
if (
|
|
pname === WebGLConstants.LINK_STATUS ||
|
|
pname === WebGLConstants.VALIDATE_STATUS
|
|
) {
|
|
return true;
|
|
}
|
|
|
|
if (
|
|
pname === WebGLConstants.ACTIVE_UNIFORMS ||
|
|
pname === WebGLConstants.ACTIVE_ATTRIBUTES
|
|
) {
|
|
return 0;
|
|
}
|
|
|
|
//>>includeStart('debug', pragmas.debug);
|
|
throw new DeveloperError(
|
|
`A WebGL parameter stub for ${pname} is not defined. Add it.`,
|
|
);
|
|
//>>includeEnd('debug');
|
|
}
|
|
|
|
function getShaderParameterStub(shader, pname) {
|
|
//>>includeStart('debug', pragmas.debug);
|
|
if (pname !== WebGLConstants.COMPILE_STATUS) {
|
|
throw new DeveloperError(
|
|
`A WebGL parameter stub for ${pname} is not defined. Add it.`,
|
|
);
|
|
}
|
|
//>>includeEnd('debug');
|
|
|
|
return true;
|
|
}
|
|
|
|
function getShaderPrecisionStub(shadertype, precisiontype) {
|
|
//>>includeStart('debug', pragmas.debug);
|
|
if (shadertype !== WebGLConstants.FRAGMENT_SHADER) {
|
|
throw new DeveloperError(
|
|
"getShaderPrecision only has a stub for FRAGMENT_SHADER. Update it.",
|
|
);
|
|
}
|
|
|
|
if (
|
|
precisiontype !== WebGLConstants.HIGH_FLOAT &&
|
|
precisiontype !== WebGLConstants.HIGH_INT
|
|
) {
|
|
throw new DeveloperError(
|
|
"getShaderPrecision only has a stub for HIGH_FLOAT and HIGH_INT. Update it.",
|
|
);
|
|
}
|
|
//>>includeEnd('debug');
|
|
|
|
if (precisiontype === WebGLConstants.HIGH_FLOAT) {
|
|
return {
|
|
rangeMin: 127,
|
|
rangeMax: 127,
|
|
precision: 23,
|
|
};
|
|
}
|
|
|
|
// HIGH_INT
|
|
return {
|
|
rangeMin: 31,
|
|
rangeMax: 30,
|
|
precision: 0,
|
|
};
|
|
}
|
|
|
|
function readPixelsStub(x, y, width, height, format, type, pixels) {
|
|
return [0, 0, 0, 0];
|
|
}
|
|
export default getWebGLStub;
|