wonder.js
Version:
124 lines (112 loc) • 5.16 kB
JavaScript
;
var Js_option = require("bs-platform/lib/js/js_option.js");
var Caml_option = require("bs-platform/lib/js/caml_option.js");
var Log$WonderLog = require("wonder-log/lib/js/src/Log.js");
var Contract$WonderLog = require("wonder-log/lib/js/src/Contract.js");
var OptionService$Wonderjs = require("../../../atom/OptionService.js");
var StateDataMain$Wonderjs = require("../../../state/main/data/StateDataMain.js");
var IsDebugMainService$Wonderjs = require("../../../state/main/state/IsDebugMainService.js");
function _getElementIndexUint(gl) {
var match = gl.getExtension("OES_element_index_uint");
if (match == null) {
Log$WonderLog.fatal(Log$WonderLog.buildFatalMessage("_getExtension", "not support OES_element_index_uint extension", "", "", ""));
return false;
} else {
return true;
}
}
function _getExtension(name, gl) {
var tmp;
switch (name) {
case "element_index_uint" :
tmp = _getElementIndexUint(gl);
break;
case "instanced_arrays" :
tmp = gl.getExtension("ANGLE_instanced_arrays");
break;
default:
tmp = gl.getExtension(name);
}
if (tmp == null) {
return undefined;
} else {
return Caml_option.some(tmp);
}
}
function _detectExtension(gl, record) {
return /* record */[
/* extensionInstancedArrays */_getExtension("instanced_arrays", gl),
/* extensionElementIndexUint */_getExtension("element_index_uint", gl),
/* precision */record[/* precision */2],
/* maxTextureUnit */record[/* maxTextureUnit */3]
];
}
function _detectPrecision(gl, record) {
var vertexShader = gl.VERTEX_SHADER;
var fragmentShader = gl.FRAGMENT_SHADER;
var highFloat = gl.HIGH_FLOAT;
var mediumFloat = gl.MEDIUM_FLOAT;
var vertexShaderPrecisionHighpFloat = gl.getShaderPrecisionFormat(vertexShader, highFloat);
var vertexShaderPrecisionMediumpFloat = gl.getShaderPrecisionFormat(vertexShader, mediumFloat);
var fragmentShaderPrecisionHighpFloat = gl.getShaderPrecisionFormat(fragmentShader, highFloat);
var fragmentShaderPrecisionMediumpFloat = gl.getShaderPrecisionFormat(fragmentShader, mediumFloat);
var highpAvailable = vertexShaderPrecisionHighpFloat.precision > 0 && fragmentShaderPrecisionHighpFloat.precision > 0;
var mediumpAvailable = vertexShaderPrecisionMediumpFloat.precision > 0 && fragmentShaderPrecisionMediumpFloat.precision > 0;
if (highpAvailable) {
return /* record */[
/* extensionInstancedArrays */record[/* extensionInstancedArrays */0],
/* extensionElementIndexUint */record[/* extensionElementIndexUint */1],
/* precision *//* HIGHP */0,
/* maxTextureUnit */record[/* maxTextureUnit */3]
];
} else if (mediumpAvailable) {
Log$WonderLog.warn("not support highp, using mediump instead");
return /* record */[
/* extensionInstancedArrays */record[/* extensionInstancedArrays */0],
/* extensionElementIndexUint */record[/* extensionElementIndexUint */1],
/* precision *//* MEDIUMP */1,
/* maxTextureUnit */record[/* maxTextureUnit */3]
];
} else {
Log$WonderLog.warn("not support highp and mediump, using lowp instead");
return /* record */[
/* extensionInstancedArrays */record[/* extensionInstancedArrays */0],
/* extensionElementIndexUint */record[/* extensionElementIndexUint */1],
/* precision *//* LOWP */2,
/* maxTextureUnit */record[/* maxTextureUnit */3]
];
}
}
function _getTextureCapability(gl, record) {
return /* record */[
/* extensionInstancedArrays */record[/* extensionInstancedArrays */0],
/* extensionElementIndexUint */record[/* extensionElementIndexUint */1],
/* precision */record[/* precision */2],
/* maxTextureUnit */gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS)
];
}
function _detectCapability(gl, record) {
return _detectPrecision(gl, _getTextureCapability(gl, record));
}
function detect(gl, record) {
return _detectCapability(gl, _detectExtension(gl, record));
}
var hasExtension = Js_option.isSome;
function unsafeGetInstanceExtension(record) {
Contract$WonderLog.requireCheck((function (param) {
return Contract$WonderLog.test(Log$WonderLog.buildAssertMessage("extensionInstancedArrays exist", "not"), (function (param) {
return Contract$WonderLog.assertExist(record[/* extensionInstancedArrays */0]);
}));
}), IsDebugMainService$Wonderjs.getIsDebug(StateDataMain$Wonderjs.stateData));
return OptionService$Wonderjs.unsafeGet(record[/* extensionInstancedArrays */0]);
}
exports._getElementIndexUint = _getElementIndexUint;
exports._getExtension = _getExtension;
exports._detectExtension = _detectExtension;
exports._detectPrecision = _detectPrecision;
exports._getTextureCapability = _getTextureCapability;
exports._detectCapability = _detectCapability;
exports.detect = detect;
exports.hasExtension = hasExtension;
exports.unsafeGetInstanceExtension = unsafeGetInstanceExtension;
/* Log-WonderLog Not a pure module */