Files
tubestation/gfx/webrender/tests/angle_shader_validation.rs
Kartikaya Gupta 52c4335d06 Bug 1335525 - Add top-level webrender crates to gfx/. r=gfx
MozReview-Commit-ID: BXVNHlczLh5
2017-02-06 11:42:52 -05:00

86 lines
2.9 KiB
Rust

extern crate angle;
#[macro_use]
extern crate lazy_static;
extern crate webrender;
use angle::hl::{BuiltInResources, Output, ShaderSpec, ShaderValidator};
include!(concat!(env!("OUT_DIR"), "/shaders.rs"));
// from glslang
const FRAGMENT_SHADER: u32 = 0x8B30;
const VERTEX_SHADER: u32 = 0x8B31;
#[test]
fn validate_shaders() {
angle::hl::initialize().unwrap();
let shared_src = SHADERS.get("shared").unwrap();
let prim_shared_src = SHADERS.get("prim_shared").unwrap();
let clip_shared_src = SHADERS.get("clip_shared").unwrap();
for (filename, file_source) in SHADERS.iter() {
let is_prim = filename.starts_with("ps_");
let is_clip = filename.starts_with("cs_");
let is_vert = filename.ends_with(".vs");
let is_frag = filename.ends_with(".fs");
if !(is_prim ^ is_clip) || !(is_vert ^ is_frag) {
continue;
}
let base_filename = filename.splitn(2, '.').next().unwrap();
let mut shader_prefix = format!("#version 300 es\n
// Base shader: {}\n
#define WR_MAX_VERTEX_TEXTURE_WIDTH {}\n",
base_filename, webrender::renderer::MAX_VERTEX_TEXTURE_WIDTH);
if is_vert {
shader_prefix.push_str("#define WR_VERTEX_SHADER\n");
} else {
shader_prefix.push_str("#define WR_FRAGMENT_SHADER\n");
}
let mut build_configs = vec!["#define WR_FEATURE_TRANSFORM\n"];
if is_prim {
// the transform feature may be disabled for the prim shaders
build_configs.push("// WR_FEATURE_TRANSFORM disabled\n");
}
for config_prefix in build_configs {
let mut shader_source = String::new();
shader_source.push_str(shader_prefix.as_str());
shader_source.push_str(config_prefix);
shader_source.push_str(shared_src);
shader_source.push_str(prim_shared_src);
if is_clip {
shader_source.push_str(clip_shared_src);
}
if let Some(optional_src) = SHADERS.get(base_filename) {
shader_source.push_str(optional_src);
}
shader_source.push_str(file_source);
let gl_type = if is_vert { VERTEX_SHADER } else { FRAGMENT_SHADER };
let resources = BuiltInResources::default();
let validator = ShaderValidator::new(gl_type,
ShaderSpec::Gles3,
Output::Essl,
&resources).unwrap();
match validator.compile_and_translate(&[&shader_source]) {
Ok(_) => {
println!("Shader translated succesfully: {}", filename);
},
Err(_) => {
panic!("Shader compilation failed: {}\n{}",
filename, validator.info_log());
},
}
}
}
}