aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2018-07-11 12:18:51 +0200
committerAnthony Ramine <n.oxyde@gmail.com>2018-07-16 10:16:30 +0200
commite7631cea61b870db37d6b609e516ec64dd254849 (patch)
treeb041f7a3e73cb99b6fd74ca4cafec3074dc98bca
parentcbac5d05be13888fa78fcb4678f1620860b80228 (diff)
downloadservo-e7631cea61b870db37d6b609e516ec64dd254849.tar.gz
servo-e7631cea61b870db37d6b609e516ec64dd254849.zip
Move ANGLE name shenanigans to WebGL thread
-rw-r--r--components/canvas/webgl_thread.rs53
-rw-r--r--components/canvas_traits/webgl.rs36
-rw-r--r--components/script/dom/webglprogram.rs12
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())
}