import PixelFormat from '../Core/PixelFormat.js'; import CheckFloatTexturePrecisionFS from '../Shaders/CheckFloatTexturePrecisionFS.js'; import ComputeCommand from './ComputeCommand.js'; import ComputeEngine from './ComputeEngine.js'; import Framebuffer from './Framebuffer.js'; import PixelDatatype from './PixelDatatype.js'; import Texture from './Texture.js'; /** * Checks if the context's floating point textures support 6 decimal places of precision. * * @param {Context} context A context wrapping a gl implementation. * @returns {Boolean} Whether or not the context's floating point textures support 6 decimal places of precision * * @private */ function checkFloatTexturePrecision(context) { if (!context.floatingPointTexture) { return false; } var computeEngine = new ComputeEngine(context); var outputTexture = new Texture({ context : context, width : 1, height : 1, pixelFormat : PixelFormat.RGBA }); var floatTexture = new Texture({ context : context, width : 1, height : 1, pixelFormat : PixelFormat.RGBA, pixelDatatype : checkFloatTexturePrecision._getFloatPixelType(), source : { width : 1, height : 1, arrayBufferView : checkFloatTexturePrecision._getArray([123456, 0, 0, 0]) } }); var framebuffer = new Framebuffer({ context : context, colorTextures : [outputTexture], destroyAttachments : false }); var readState = { framebuffer : framebuffer, x : 0, y : 0, width : 1, height : 1 }; var sixPlaces = false; var computeCommand = new ComputeCommand({ fragmentShaderSource : CheckFloatTexturePrecisionFS, outputTexture : outputTexture, uniformMap : { u_floatTexture : function() { return floatTexture; } }, persists : false, postExecute : function() { var pixel = context.readPixels(readState); sixPlaces = pixel[0] === 0; } }); computeCommand.execute(computeEngine); computeEngine.destroy(); framebuffer.destroy(); return sixPlaces; } checkFloatTexturePrecision._getFloatPixelType = function() { return PixelDatatype.FLOAT; }; checkFloatTexturePrecision._getArray = function(array) { return new Float32Array(array); }; export default checkFloatTexturePrecision;