aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/canvas/webgl_thread.rs51
-rw-r--r--components/canvas_traits/webgl.rs8
-rw-r--r--components/script/dom/webglrenderingcontext.rs109
3 files changed, 78 insertions, 90 deletions
diff --git a/components/canvas/webgl_thread.rs b/components/canvas/webgl_thread.rs
index bfb6c7ab5cb..e27d85c4395 100644
--- a/components/canvas/webgl_thread.rs
+++ b/components/canvas/webgl_thread.rs
@@ -1066,21 +1066,8 @@ impl WebGLImpl {
fn get_tex_parameter(gl: &gl::Gl,
target: u32,
pname: u32,
- chan: WebGLSender<WebGLResult<WebGLParameter>> ) {
- let result = match pname {
- gl::TEXTURE_MAG_FILTER |
- gl::TEXTURE_MIN_FILTER |
- gl::TEXTURE_WRAP_S |
- gl::TEXTURE_WRAP_T => {
- let parameter = gl.get_tex_parameter_iv(target, pname);
- if parameter == 0 {
- Ok(WebGLParameter::Invalid)
- } else {
- Ok(WebGLParameter::Int(parameter))
- }
- }
- _ => Err(WebGLError::InvalidEnum)
- };
+ chan: WebGLSender<i32> ) {
+ let result = gl.get_tex_parameter_iv(target, pname);
chan.send(result).unwrap();
}
@@ -1117,25 +1104,16 @@ impl WebGLImpl {
fn vertex_attrib_offset(gl: &gl::Gl,
index: u32,
pname: u32,
- chan: WebGLSender<WebGLResult<isize>>) {
- let result = match pname {
- gl::VERTEX_ATTRIB_ARRAY_POINTER => Ok(gl.get_vertex_attrib_pointer_v(index, pname)),
- _ => Err(WebGLError::InvalidEnum),
- };
-
+ chan: WebGLSender<isize>) {
+ let result = gl.get_vertex_attrib_pointer_v(index, pname);
chan.send(result).unwrap();
}
fn buffer_parameter(gl: &gl::Gl,
target: u32,
param_id: u32,
- chan: WebGLSender<WebGLResult<WebGLParameter>>) {
- let result = match param_id {
- gl::BUFFER_SIZE |
- gl::BUFFER_USAGE =>
- Ok(WebGLParameter::Int(gl.get_buffer_parameter_iv(target, param_id))),
- _ => Err(WebGLError::InvalidEnum),
- };
+ chan: WebGLSender<i32>) {
+ let result = gl.get_buffer_parameter_iv(target, param_id);
chan.send(result).unwrap();
}
@@ -1178,21 +1156,8 @@ impl WebGLImpl {
fn shader_precision_format(gl: &gl::Gl,
shader_type: u32,
precision_type: u32,
- chan: WebGLSender<WebGLResult<(i32, i32, i32)>>) {
- let result = match precision_type {
- gl::LOW_FLOAT |
- gl::MEDIUM_FLOAT |
- gl::HIGH_FLOAT |
- gl::LOW_INT |
- gl::MEDIUM_INT |
- gl::HIGH_INT => {
- Ok(gl.get_shader_precision_format(shader_type, precision_type))
- },
- _=> {
- Err(WebGLError::InvalidEnum)
- }
- };
-
+ chan: WebGLSender<(i32, i32, i32)>) {
+ let result = gl.get_shader_precision_format(shader_type, precision_type);
chan.send(result).unwrap();
}
diff --git a/components/canvas_traits/webgl.rs b/components/canvas_traits/webgl.rs
index 70aeb40ab06..826003d2d92 100644
--- a/components/canvas_traits/webgl.rs
+++ b/components/canvas_traits/webgl.rs
@@ -204,19 +204,19 @@ pub enum WebGLCommand {
EnableVertexAttribArray(u32),
FramebufferRenderbuffer(u32, u32, u32, Option<WebGLRenderbufferId>),
FramebufferTexture2D(u32, u32, u32, Option<WebGLTextureId>, i32),
- GetBufferParameter(u32, u32, WebGLSender<WebGLResult<WebGLParameter>>),
+ GetBufferParameter(u32, u32, WebGLSender<i32>),
GetExtensions(WebGLSender<String>),
GetParameter(u32, WebGLSender<WebGLResult<WebGLParameter>>),
- GetTexParameter(u32, u32, WebGLSender<WebGLResult<WebGLParameter>>),
+ GetTexParameter(u32, u32, WebGLSender<i32>),
GetProgramParameter(WebGLProgramId, u32, WebGLSender<WebGLResult<WebGLParameter>>),
GetShaderParameter(WebGLShaderId, u32, WebGLSender<WebGLResult<WebGLParameter>>),
- GetShaderPrecisionFormat(u32, u32, WebGLSender<WebGLResult<(i32, i32, i32)>>),
+ GetShaderPrecisionFormat(u32, u32, WebGLSender<(i32, i32, i32)>),
GetActiveAttrib(WebGLProgramId, u32, WebGLSender<WebGLResult<(i32, u32, String)>>),
GetActiveUniform(WebGLProgramId, u32, WebGLSender<WebGLResult<(i32, u32, String)>>),
GetAttribLocation(WebGLProgramId, String, WebGLSender<Option<i32>>),
GetUniformLocation(WebGLProgramId, String, WebGLSender<Option<i32>>),
GetVertexAttrib(u32, u32, WebGLSender<WebGLResult<WebGLParameter>>),
- GetVertexAttribOffset(u32, u32, WebGLSender<WebGLResult<isize>>),
+ GetVertexAttribOffset(u32, u32, WebGLSender<isize>),
GetShaderInfoLog(WebGLShaderId, WebGLSender<String>),
GetProgramInfoLog(WebGLProgramId, WebGLSender<String>),
PolygonOffset(f32, f32),
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs
index 0145d84ffd8..64990da1504 100644
--- a/components/script/dom/webglrenderingcontext.rs
+++ b/components/script/dom/webglrenderingcontext.rs
@@ -1246,17 +1246,21 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
#[allow(unsafe_code)]
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
unsafe fn GetBufferParameter(&self, _cx: *mut JSContext, target: u32, parameter: u32) -> JSVal {
+ let parameter_matches = match parameter {
+ constants::BUFFER_SIZE |
+ constants::BUFFER_USAGE => true,
+ _ => false,
+ };
+
+ if !parameter_matches {
+ self.webgl_error(InvalidEnum);
+ return NullValue();
+ }
+
let (sender, receiver) = webgl_channel().unwrap();
self.send_command(WebGLCommand::GetBufferParameter(target, parameter, sender));
- match handle_potential_webgl_error!(self, receiver.recv().unwrap(), WebGLParameter::Invalid) {
- WebGLParameter::Int(val) => Int32Value(val),
- WebGLParameter::Bool(_) => panic!("Buffer parameter should not be bool"),
- WebGLParameter::Float(_) => panic!("Buffer parameter should not be float"),
- WebGLParameter::FloatArray(_) => panic!("Buffer parameter should not be float array"),
- WebGLParameter::String(_) => panic!("Buffer parameter should not be string"),
- WebGLParameter::Invalid => NullValue(),
- }
+ Int32Value(receiver.recv().unwrap())
}
#[allow(unsafe_code)]
@@ -1342,31 +1346,39 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
#[allow(unsafe_code)]
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8
unsafe fn GetTexParameter(&self, _cx: *mut JSContext, target: u32, pname: u32) -> JSVal {
- let texture = match target {
+ let target_matches = match target {
constants::TEXTURE_2D |
- constants::TEXTURE_CUBE_MAP => self.bound_texture(target),
+ constants::TEXTURE_CUBE_MAP => true,
+ _ => false,
+ };
+
+ let pname_matches = match pname {
+ constants::TEXTURE_MAG_FILTER |
+ constants::TEXTURE_MIN_FILTER |
+ constants::TEXTURE_WRAP_S |
+ constants::TEXTURE_WRAP_T => true,
+ _ => false,
+ };
+
+ if !target_matches || !pname_matches {
+ self.webgl_error(InvalidEnum);
+ return NullValue();
+ }
+
+ if self.bound_texture(target).is_none() {
+ self.webgl_error(InvalidOperation);
+ return NullValue();
+ }
+
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.send_command(WebGLCommand::GetTexParameter(target, pname, sender));
+
+ match receiver.recv().unwrap() {
+ value if value != 0 => Int32Value(value),
_ => {
self.webgl_error(InvalidEnum);
- return NullValue();
- }
- };
- if texture.is_some() {
- let (sender, receiver) = webgl_channel().unwrap();
- self.send_command(WebGLCommand::GetTexParameter(target, pname, sender));
- match handle_potential_webgl_error!(self, receiver.recv().unwrap(), WebGLParameter::Invalid) {
- WebGLParameter::Int(val) => Int32Value(val),
- WebGLParameter::Bool(_) => panic!("Texture parameter should not be bool"),
- WebGLParameter::Float(_) => panic!("Texture parameter should not be float"),
- WebGLParameter::FloatArray(_) => panic!("Texture parameter should not be float array"),
- WebGLParameter::String(_) => panic!("Texture parameter should not be string"),
- WebGLParameter::Invalid => {
- self.webgl_error(InvalidEnum);
- NullValue()
- }
+ NullValue()
}
- } else {
- self.webgl_error(InvalidOperation);
- NullValue()
}
}
@@ -2345,24 +2357,31 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
- fn GetShaderPrecisionFormat(&self,
- shader_type: u32,
- precision_type: u32)
- -> Option<DomRoot<WebGLShaderPrecisionFormat>> {
+ fn GetShaderPrecisionFormat(
+ &self,
+ shader_type: u32,
+ precision_type: u32
+ ) -> Option<DomRoot<WebGLShaderPrecisionFormat>> {
+ match precision_type {
+ constants::LOW_FLOAT |
+ constants::MEDIUM_FLOAT |
+ constants::HIGH_FLOAT |
+ constants::LOW_INT |
+ constants::MEDIUM_INT |
+ constants::HIGH_INT => (),
+ _ => {
+ self.webgl_error(InvalidEnum);
+ return None;
+ },
+ }
+
let (sender, receiver) = webgl_channel().unwrap();
self.send_command(WebGLCommand::GetShaderPrecisionFormat(shader_type,
precision_type,
sender));
- match receiver.recv().unwrap() {
- Ok((range_min, range_max, precision)) => {
- Some(WebGLShaderPrecisionFormat::new(self.global().as_window(), range_min, range_max, precision))
- },
- Err(error) => {
- self.webgl_error(error);
- None
- }
- }
+ let (range_min, range_max, precision) = receiver.recv().unwrap();
+ Some(WebGLShaderPrecisionFormat::new(self.global().as_window(), range_min, range_max, precision))
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
@@ -2413,10 +2432,14 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
fn GetVertexAttribOffset(&self, index: u32, pname: u32) -> i64 {
+ if pname != constants::VERTEX_ATTRIB_ARRAY_POINTER {
+ self.webgl_error(InvalidEnum);
+ return 0;
+ }
let (sender, receiver) = webgl_channel().unwrap();
self.send_command(WebGLCommand::GetVertexAttribOffset(index, pname, sender));
- handle_potential_webgl_error!(self, receiver.recv().unwrap(), 0) as i64
+ receiver.recv().unwrap() as i64
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3