diff options
Diffstat (limited to 'third_party/webrender/swgl/build.rs')
-rw-r--r-- | third_party/webrender/swgl/build.rs | 101 |
1 files changed, 23 insertions, 78 deletions
diff --git a/third_party/webrender/swgl/build.rs b/third_party/webrender/swgl/build.rs index 300ff9f282a..5133e9f397a 100644 --- a/third_party/webrender/swgl/build.rs +++ b/third_party/webrender/swgl/build.rs @@ -2,9 +2,9 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -extern crate cc; -extern crate glsl_to_cxx; -extern crate webrender_build; +use cc; +use glsl_to_cxx; +use webrender_build; use std::collections::HashSet; use std::fmt::Write; @@ -52,7 +52,7 @@ fn process_imports(shader_dir: &str, shader: &str, included: &mut HashSet<String } fn translate_shader(shader_key: &str, shader_dir: &str) { - let mut imported = String::from("#define SWGL 1\n#define __VERSION__ 150\n"); + let mut imported = String::from("#define SWGL 1\n"); let _ = write!(imported, "#define WR_MAX_VERTEX_TEXTURE_WIDTH {}U\n", webrender_build::MAX_VERTEX_TEXTURE_WIDTH); @@ -73,21 +73,11 @@ fn translate_shader(shader_key: &str, shader_dir: &str) { std::fs::write(&imp_name, imported).unwrap(); let mut build = cc::Build::new(); - build.no_default_flags(true); - if let Ok(tool) = build.try_get_compiler() { - if tool.is_like_msvc() { - build.flag("/EP"); - if tool.path().to_str().map_or(false, |p| p.contains("clang")) { - build.flag("/clang:-undef"); - } else { - build.flag("/u"); - } - } else { - build.flag("-xc").flag("-P").flag("-undef"); - } + if build.get_compiler().is_like_msvc() { + build.flag("/EP"); + } else { + build.flag("-xc").flag("-P"); } - // Use SWGLPP target to avoid pulling CFLAGS/CXXFLAGS. - build.target("SWGLPP"); build.file(&imp_name); let vs = build.clone() .define("WR_VERTEX_SHADER", Some("1")) @@ -100,11 +90,16 @@ fn translate_shader(shader_key: &str, shader_dir: &str) { std::fs::write(&vs_name, vs).unwrap(); std::fs::write(&fs_name, fs).unwrap(); - let args = vec![ + let mut args = vec![ "glsl_to_cxx".to_string(), vs_name, fs_name, ]; + let frag_include = format!("{}/{}.frag.h", shader_dir, shader); + if std::path::Path::new(&frag_include).exists() { + println!("cargo:rerun-if-changed={}/{}.frag.h", shader_dir, shader); + args.push(frag_include); + } let result = glsl_to_cxx::translate(&mut args.into_iter()); std::fs::write(format!("{}/{}.h", out_dir, shader), result).unwrap(); } @@ -117,9 +112,7 @@ fn main() { let shader_flags = ShaderFeatureFlags::GL | - ShaderFeatureFlags::DUAL_SOURCE_BLENDING | - ShaderFeatureFlags::ADVANCED_BLEND_EQUATION | - ShaderFeatureFlags::DEBUG; + ShaderFeatureFlags::DUAL_SOURCE_BLENDING; let mut shaders: Vec<String> = Vec::new(); for (name, features) in get_shader_features(shader_flags) { shaders.extend(features.iter().map(|f| { @@ -129,74 +122,26 @@ fn main() { shaders.sort(); - // We need to ensure that the C preprocessor does not pull compiler flags from - // the host or target environment. Set up a SWGLPP target with empty flags to - // work around this. - if let Ok(target) = std::env::var("TARGET") { - if let Ok(cc) = std::env::var(format!("CC_{}", target)) - .or(std::env::var(format!("CC_{}", target.replace("-", "_")))) { - std::env::set_var("CC_SWGLPP", cc); - } - } - std::env::set_var("CFLAGS_SWGLPP", ""); - for shader in &shaders { translate_shader(shader, &shader_dir); } write_load_shader(&shaders); - println!("cargo:rerun-if-changed=src/blend.h"); - println!("cargo:rerun-if-changed=src/composite.h"); println!("cargo:rerun-if-changed=src/gl_defs.h"); println!("cargo:rerun-if-changed=src/glsl.h"); println!("cargo:rerun-if-changed=src/program.h"); - println!("cargo:rerun-if-changed=src/rasterize.h"); - println!("cargo:rerun-if-changed=src/swgl_ext.h"); println!("cargo:rerun-if-changed=src/texture.h"); println!("cargo:rerun-if-changed=src/vector_type.h"); println!("cargo:rerun-if-changed=src/gl.cc"); - let mut build = cc::Build::new(); - build.cpp(true); - - if let Ok(tool) = build.try_get_compiler() { - if tool.is_like_msvc() { - build.flag("/std:c++17") - .flag("/EHs-") - .flag("/GR-") - .flag("/UMOZILLA_CONFIG_H"); - } else { - build.flag("-std=c++17") - .flag("-fno-exceptions") - .flag("-fno-rtti") - .flag("-fno-math-errno") - .flag("-UMOZILLA_CONFIG_H"); - } - // SWGL relies heavily on inlining for performance so override -Oz with -O2 - if tool.args().contains(&"-Oz".into()) { - build.flag("-O2"); - } - - // Most GLSL compilers assume something like fast-math so we turn it on. - // However, reciprocal division makes it so 1/1 = 0.999994 which can produce a lot of fuzz - // in reftests and the use of reciprocal instructions usually involves a refinement step - // which bloats our already bloated code. Further, our shader code is sufficiently parallel - // that we're more likely to be throughput bound vs latency bound. Having fewer - // instructions makes things easier on the processor and in places where it matters we can - // probably explicitly use reciprocal instructions and avoid the refinement step. - if tool.is_like_msvc() { - build.flag("/fp:fast") - .flag("-Xclang") - .flag("-mrecip=none"); - } else if tool.is_like_clang() { - // gcc only supports -mrecip=none on some targets so to keep - // things simple we don't use -ffast-math with gcc at all - build.flag("-ffast-math") - .flag("-mrecip=none"); - } - } - - build.file("src/gl.cc") + cc::Build::new() + .cpp(true) + .file("src/gl.cc") + .flag("-std=c++14") + .flag("-UMOZILLA_CONFIG_H") + .flag("-fno-exceptions") + .flag("-fno-rtti") + .flag("-fno-math-errno") .define("_GLIBCXX_USE_CXX11_ABI", Some("0")) .include(shader_dir) .include("src") |