/* This Source Code Form is subject to the terms of the Mozilla Public *License,v.2.0.IfacopyoftheMPLwasnotdistributedwiththis
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use webrender::ShaderKind; use webrender_build::shader::{ShaderFeatureFlags, ShaderVersion, build_shader_strings}; use webrender_build::shader::get_shader_features; use glsl_lang::ast::{InterpolationQualifierData, NodeContent, SingleDeclaration}; use glsl_lang::ast::{StorageQualifierData, TranslationUnit, TypeSpecifierNonArrayData}; use glsl_lang::ast::TypeQualifierSpecData; use glsl_lang::parse::DefaultParse as _; use glsl_lang::visitor::{Host, Visit, Visitor};
/// Tests that a shader contains no flat scalar varyings. /// These must be avoided on Adreno 3xx devices due to bug 1630356. fn test_no_flat_scalar_varyings(
name: &str,
shader: &mut TranslationUnit,
_shader_kind: ShaderKind,
) { struct FlatScalarVaryingsVisitor {
shader_name: String,
}
/// Tests that a shader's varyings have an explicit precision specifier. /// Mali vendor tooling shows us that we are often varying-iterpolation bound, so using mediump /// where possible helps alleviate this. By enforcing that varyings are given explicit precisions, /// we ensure that highp is only used when necessary rather than just by default. fn test_varying_explicit_precision(
name: &str,
shader: &mut TranslationUnit,
shader_kind: ShaderKind,
) { struct VaryingExplicitPrecisionVisitor {
shader_name: String,
shader_kind: ShaderKind,
}
let has_explicit_precision = qualifiers
.iter()
.any(|qualifier| matches!(qualifier.content, TypeQualifierSpecData::Precision(_)));
assert!(
!is_varying || has_explicit_precision, "{}: {} is a varying without an explicit precision declared", self.shader_name,
&declaration.name.as_ref().unwrap()
);
for (shader, configs) in get_shader_features(flags) { for config in configs { let name = if config.is_empty() {
shader.to_string()
} else {
format!("{}_{}", shader, config.replace(",", "_"))
}; let vert_name = format!("{}.vert", name); let frag_name = format!("{}.frag", name);
let features = config
.split(",")
.filter(|f| !f.is_empty())
.collect::<Vec<_>>();
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.