aboutsummaryrefslogtreecommitdiffstats
path: root/third_party/webrender/swgl/build.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/webrender/swgl/build.rs')
-rw-r--r--third_party/webrender/swgl/build.rs101
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")