Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
export function setPrecision(src, requestedPrecision, maxSupportedPrecision)
{
if (src.substring(0, 9) !== 'precision')
{
// no precision supplied, so PixiJS will add the requested level.
let precision = requestedPrecision;
// If highp is requested but not supported, downgrade precision to a level all devices support.
if (requestedPrecision === PRECISION.HIGH && maxSupportedPrecision !== PRECISION.HIGH)
{
precision = PRECISION.MEDIUM;
}
return `precision ${precision} float;\n${src}`;
}
else if (maxSupportedPrecision !== PRECISION.HIGH && src.substring(0, 15) === 'precision highp')
{
// precision was supplied, but at a level this device does not support, so downgrading to mediump.
return src.replace('precision highp', 'precision mediump');
}
return src;
}
export function setPrecision(src, requestedPrecision, maxSupportedPrecision)
{
if (src.substring(0, 9) !== 'precision')
{
// no precision supplied, so PixiJS will add the requested level.
let precision = requestedPrecision;
// If highp is requested but not supported, downgrade precision to a level all devices support.
if (requestedPrecision === PRECISION.HIGH && maxSupportedPrecision !== PRECISION.HIGH)
{
precision = PRECISION.MEDIUM;
}
return `precision ${precision} float;\n${src}`;
}
else if (maxSupportedPrecision !== PRECISION.HIGH && src.substring(0, 15) === 'precision highp')
{
// precision was supplied, but at a level this device does not support, so downgrading to mediump.
return src.replace('precision highp', 'precision mediump');
}
return src;
}
name = name.replace(/\s+/g, '-');
if (nameCache[name])
{
nameCache[name]++;
name += `-${nameCache[name]}`;
}
else
{
nameCache[name] = 1;
}
this.vertexSrc = `#define SHADER_NAME ${name}\n${this.vertexSrc}`;
this.fragmentSrc = `#define SHADER_NAME ${name}\n${this.fragmentSrc}`;
this.vertexSrc = setPrecision(this.vertexSrc, settings.PRECISION_VERTEX, PRECISION.HIGH);
this.fragmentSrc = setPrecision(this.fragmentSrc, settings.PRECISION_FRAGMENT, getMaxFragmentPrecision());
}
// currently this does not extract structs only default types
this.extractData(this.vertexSrc, this.fragmentSrc);
// this is where we store shader references..
this.glPrograms = {};
this.syncUniforms = null;
}
export function getMaxFragmentPrecision()
{
if (!maxFragmentPrecision)
{
maxFragmentPrecision = PRECISION.MEDIUM;
const gl = getTestContext();
if (gl)
{
if (gl.getShaderPrecisionFormat)
{
const shaderFragment = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT);
maxFragmentPrecision = shaderFragment.precision ? PRECISION.HIGH : PRECISION.MEDIUM;
}
}
}
return maxFragmentPrecision;
}