diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2018-07-11 12:18:51 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2018-07-16 10:16:30 +0200 |
commit | e7631cea61b870db37d6b609e516ec64dd254849 (patch) | |
tree | b041f7a3e73cb99b6fd74ca4cafec3074dc98bca | |
parent | cbac5d05be13888fa78fcb4678f1620860b80228 (diff) | |
download | servo-e7631cea61b870db37d6b609e516ec64dd254849.tar.gz servo-e7631cea61b870db37d6b609e516ec64dd254849.zip |
Move ANGLE name shenanigans to WebGL thread
-rw-r--r-- | components/canvas/webgl_thread.rs | 53 | ||||
-rw-r--r-- | components/canvas_traits/webgl.rs | 36 | ||||
-rw-r--r-- | components/script/dom/webglprogram.rs | 12 |
3 files changed, 50 insertions, 51 deletions
diff --git a/components/canvas/webgl_thread.rs b/components/canvas/webgl_thread.rs index 3bfe49125ba..5fb1fad4eba 100644 --- a/components/canvas/webgl_thread.rs +++ b/components/canvas/webgl_thread.rs @@ -646,8 +646,9 @@ impl WebGLImpl { ctx.gl().attach_shader(program_id.get(), shader_id.get()), WebGLCommand::DetachShader(program_id, shader_id) => ctx.gl().detach_shader(program_id.get(), shader_id.get()), - WebGLCommand::BindAttribLocation(program_id, index, ref name) => - ctx.gl().bind_attrib_location(program_id.get(), index, name), + WebGLCommand::BindAttribLocation(program_id, index, ref name) => { + ctx.gl().bind_attrib_location(program_id.get(), index, &to_name_in_compiled_shader(name)) + } WebGLCommand::BlendColor(r, g, b, a) => ctx.gl().blend_color(r, g, b, a), WebGLCommand::BlendEquation(mode) => @@ -1100,11 +1101,13 @@ impl WebGLImpl { chan.send(parameter).unwrap(); } - fn uniform_location(gl: &gl::Gl, - program_id: WebGLProgramId, - name: &str, - chan: &WebGLSender<Option<i32>>) { - let location = gl.get_uniform_location(program_id.get(), name); + fn uniform_location( + gl: &gl::Gl, + program_id: WebGLProgramId, + name: &str, + chan: &WebGLSender<Option<i32>>, + ) { + let location = gl.get_uniform_location(program_id.get(), &to_name_in_compiled_shader(name)); let location = if location == -1 { None } else { @@ -1223,3 +1226,39 @@ impl WebGLImpl { gl.compile_shader(shader_id.get()); } } + +/// ANGLE adds a `_u` prefix to variable names: +/// +/// https://chromium.googlesource.com/angle/angle/+/855d964bd0d05f6b2cb303f625506cf53d37e94f +/// +/// To avoid hard-coding this we would need to use the `sh::GetAttributes` and `sh::GetUniforms` +/// API to look up the `x.name` and `x.mappedName` members. +const ANGLE_NAME_PREFIX: &'static str = "_u"; + +fn to_name_in_compiled_shader(s: &str) -> String { + map_dot_separated(s, |s, mapped| { + mapped.push_str(ANGLE_NAME_PREFIX); + mapped.push_str(s); + }) +} + +fn from_name_in_compiled_shader(s: &str) -> String { + map_dot_separated(s, |s, mapped| { + mapped.push_str(if s.starts_with(ANGLE_NAME_PREFIX) { + &s[ANGLE_NAME_PREFIX.len()..] + } else { + s + }) + }) +} + +fn map_dot_separated<F: Fn(&str, &mut String)>(s: &str, f: F) -> String { + let mut iter = s.split('.'); + let mut mapped = String::new(); + f(iter.next().unwrap(), &mut mapped); + for s in iter { + mapped.push('.'); + f(s, &mut mapped); + } + mapped +} diff --git a/components/canvas_traits/webgl.rs b/components/canvas_traits/webgl.rs index 451a3d19f19..0d9046656d0 100644 --- a/components/canvas_traits/webgl.rs +++ b/components/canvas_traits/webgl.rs @@ -589,39 +589,3 @@ parameters! { }), } } - -/// ANGLE adds a `_u` prefix to variable names: -/// -/// https://chromium.googlesource.com/angle/angle/+/855d964bd0d05f6b2cb303f625506cf53d37e94f -/// -/// To avoid hard-coding this we would need to use the `sh::GetAttributes` and `sh::GetUniforms` -/// API to look up the `x.name` and `x.mappedName` members. -const ANGLE_NAME_PREFIX: &'static str = "_u"; - -pub fn to_name_in_compiled_shader(s: &str) -> String { - map_dot_separated(s, |s, mapped| { - mapped.push_str(ANGLE_NAME_PREFIX); - mapped.push_str(s); - }) -} - -pub fn from_name_in_compiled_shader(s: &str) -> String { - map_dot_separated(s, |s, mapped| { - mapped.push_str(if s.starts_with(ANGLE_NAME_PREFIX) { - &s[ANGLE_NAME_PREFIX.len()..] - } else { - s - }) - }) -} - -fn map_dot_separated<F: Fn(&str, &mut String)>(s: &str, f: F) -> String { - let mut iter = s.split('.'); - let mut mapped = String::new(); - f(iter.next().unwrap(), &mut mapped); - for s in iter { - mapped.push('.'); - f(s, &mut mapped); - } - mapped -} diff --git a/components/script/dom/webglprogram.rs b/components/script/dom/webglprogram.rs index e2a6f8fcf8d..f0d86b4bc69 100644 --- a/components/script/dom/webglprogram.rs +++ b/components/script/dom/webglprogram.rs @@ -3,8 +3,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl -use canvas_traits::webgl::{ActiveAttribInfo, ActiveUniformInfo, WebGLCommand, WebGLError, WebGLMsgSender}; -use canvas_traits::webgl::{WebGLProgramId, WebGLResult, to_name_in_compiled_shader, webgl_channel}; +use canvas_traits::webgl::{ActiveAttribInfo, ActiveUniformInfo, WebGLCommand, WebGLError}; +use canvas_traits::webgl::{WebGLMsgSender, WebGLProgramId, WebGLResult, webgl_channel}; use dom::bindings::cell::DomRefCell; use dom::bindings::codegen::Bindings::WebGLProgramBinding; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; @@ -248,10 +248,8 @@ impl WebGLProgram { return Err(WebGLError::InvalidOperation); } - let name = to_name_in_compiled_shader(&name); - self.renderer - .send(WebGLCommand::BindAttribLocation(self.id, index, name)) + .send(WebGLCommand::BindAttribLocation(self.id, index, name.into())) .unwrap(); Ok(()) } @@ -326,11 +324,9 @@ impl WebGLProgram { return Ok(None); } - let name = to_name_in_compiled_shader(&name); - let (sender, receiver) = webgl_channel().unwrap(); self.renderer - .send(WebGLCommand::GetUniformLocation(self.id, name, sender)) + .send(WebGLCommand::GetUniformLocation(self.id, name.into(), sender)) .unwrap(); Ok(receiver.recv().unwrap()) } |