From 431e3ddf8dfb68e2c5449f2f7cf49aa83be289a8 Mon Sep 17 00:00:00 2001 From: Igor Gutorov Date: Tue, 20 Mar 2018 21:00:46 +0200 Subject: [PATCH 1/4] Simplify GetTexParameter --- components/canvas/webgl_thread.rs | 17 +------ components/canvas_traits/webgl.rs | 2 +- .../script/dom/webglrenderingcontext.rs | 50 +++++++++++-------- 3 files changed, 32 insertions(+), 37 deletions(-) diff --git a/components/canvas/webgl_thread.rs b/components/canvas/webgl_thread.rs index bfb6c7ab5cb..e4d807b01d6 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> ) { - 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 ) { + let result = gl.get_tex_parameter_iv(target, pname); chan.send(result).unwrap(); } diff --git a/components/canvas_traits/webgl.rs b/components/canvas_traits/webgl.rs index 70aeb40ab06..ac0e5a17b99 100644 --- a/components/canvas_traits/webgl.rs +++ b/components/canvas_traits/webgl.rs @@ -207,7 +207,7 @@ pub enum WebGLCommand { GetBufferParameter(u32, u32, WebGLSender>), GetExtensions(WebGLSender), GetParameter(u32, WebGLSender>), - GetTexParameter(u32, u32, WebGLSender>), + GetTexParameter(u32, u32, WebGLSender), GetProgramParameter(WebGLProgramId, u32, WebGLSender>), GetShaderParameter(WebGLShaderId, u32, WebGLSender>), GetShaderPrecisionFormat(u32, u32, WebGLSender>), diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 0145d84ffd8..c6443ecfd29 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -1342,31 +1342,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(); + 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() - } - } - } else { - self.webgl_error(InvalidOperation); - NullValue() } } From 0747853ad0b0d936704112691884e14d86047e9e Mon Sep 17 00:00:00 2001 From: Igor Gutorov Date: Tue, 20 Mar 2018 21:08:28 +0200 Subject: [PATCH 2/4] Simplify VertexAttribOffset --- components/canvas/webgl_thread.rs | 8 ++------ components/canvas_traits/webgl.rs | 2 +- components/script/dom/webglrenderingcontext.rs | 6 +++++- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/components/canvas/webgl_thread.rs b/components/canvas/webgl_thread.rs index e4d807b01d6..f4f90b5a629 100644 --- a/components/canvas/webgl_thread.rs +++ b/components/canvas/webgl_thread.rs @@ -1104,12 +1104,8 @@ impl WebGLImpl { fn vertex_attrib_offset(gl: &gl::Gl, index: u32, pname: u32, - chan: WebGLSender>) { - let result = match pname { - gl::VERTEX_ATTRIB_ARRAY_POINTER => Ok(gl.get_vertex_attrib_pointer_v(index, pname)), - _ => Err(WebGLError::InvalidEnum), - }; - + chan: WebGLSender) { + let result = gl.get_vertex_attrib_pointer_v(index, pname); chan.send(result).unwrap(); } diff --git a/components/canvas_traits/webgl.rs b/components/canvas_traits/webgl.rs index ac0e5a17b99..a9bfadeea17 100644 --- a/components/canvas_traits/webgl.rs +++ b/components/canvas_traits/webgl.rs @@ -216,7 +216,7 @@ pub enum WebGLCommand { GetAttribLocation(WebGLProgramId, String, WebGLSender>), GetUniformLocation(WebGLProgramId, String, WebGLSender>), GetVertexAttrib(u32, u32, WebGLSender>), - GetVertexAttribOffset(u32, u32, WebGLSender>), + GetVertexAttribOffset(u32, u32, WebGLSender), GetShaderInfoLog(WebGLShaderId, WebGLSender), GetProgramInfoLog(WebGLProgramId, WebGLSender), PolygonOffset(f32, f32), diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index c6443ecfd29..8373f39da0a 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -2421,10 +2421,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() } // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 From 7e5160b79e9443894ae14164ffd7df28408cadb8 Mon Sep 17 00:00:00 2001 From: Igor Gutorov Date: Tue, 20 Mar 2018 21:13:29 +0200 Subject: [PATCH 3/4] Simplify BufferParameter --- components/canvas/webgl_thread.rs | 9 ++------ components/canvas_traits/webgl.rs | 2 +- .../script/dom/webglrenderingcontext.rs | 22 +++++++++++-------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/components/canvas/webgl_thread.rs b/components/canvas/webgl_thread.rs index f4f90b5a629..b0248fc4dfc 100644 --- a/components/canvas/webgl_thread.rs +++ b/components/canvas/webgl_thread.rs @@ -1112,13 +1112,8 @@ impl WebGLImpl { fn buffer_parameter(gl: &gl::Gl, target: u32, param_id: u32, - chan: WebGLSender>) { - 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) { + let result = gl.get_buffer_parameter_iv(target, param_id); chan.send(result).unwrap(); } diff --git a/components/canvas_traits/webgl.rs b/components/canvas_traits/webgl.rs index a9bfadeea17..a54d614ee46 100644 --- a/components/canvas_traits/webgl.rs +++ b/components/canvas_traits/webgl.rs @@ -204,7 +204,7 @@ pub enum WebGLCommand { EnableVertexAttribArray(u32), FramebufferRenderbuffer(u32, u32, u32, Option), FramebufferTexture2D(u32, u32, u32, Option, i32), - GetBufferParameter(u32, u32, WebGLSender>), + GetBufferParameter(u32, u32, WebGLSender), GetExtensions(WebGLSender), GetParameter(u32, WebGLSender>), GetTexParameter(u32, u32, WebGLSender), diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 8373f39da0a..799a1a20e46 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)] @@ -2428,7 +2432,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { let (sender, receiver) = webgl_channel().unwrap(); self.send_command(WebGLCommand::GetVertexAttribOffset(index, pname, sender)); - receiver.recv().unwrap() + receiver.recv().unwrap() as i64 } // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 From bdd53f35af0da13ea4a94cd5780cabeaa84d6477 Mon Sep 17 00:00:00 2001 From: Igor Gutorov Date: Tue, 20 Mar 2018 21:44:08 +0200 Subject: [PATCH 4/4] Simplify GetShaderPrecisionFormat --- components/canvas/webgl_thread.rs | 17 ++-------- components/canvas_traits/webgl.rs | 2 +- .../script/dom/webglrenderingcontext.rs | 33 +++++++++++-------- 3 files changed, 23 insertions(+), 29 deletions(-) diff --git a/components/canvas/webgl_thread.rs b/components/canvas/webgl_thread.rs index b0248fc4dfc..e27d85c4395 100644 --- a/components/canvas/webgl_thread.rs +++ b/components/canvas/webgl_thread.rs @@ -1156,21 +1156,8 @@ impl WebGLImpl { fn shader_precision_format(gl: &gl::Gl, shader_type: u32, precision_type: u32, - chan: WebGLSender>) { - 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 a54d614ee46..826003d2d92 100644 --- a/components/canvas_traits/webgl.rs +++ b/components/canvas_traits/webgl.rs @@ -210,7 +210,7 @@ pub enum WebGLCommand { GetTexParameter(u32, u32, WebGLSender), GetProgramParameter(WebGLProgramId, u32, WebGLSender>), GetShaderParameter(WebGLShaderId, u32, WebGLSender>), - GetShaderPrecisionFormat(u32, u32, WebGLSender>), + GetShaderPrecisionFormat(u32, u32, WebGLSender<(i32, i32, i32)>), GetActiveAttrib(WebGLProgramId, u32, WebGLSender>), GetActiveUniform(WebGLProgramId, u32, WebGLSender>), GetAttribLocation(WebGLProgramId, String, WebGLSender>), diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 799a1a20e46..64990da1504 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -2357,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> { + fn GetShaderPrecisionFormat( + &self, + shader_type: u32, + precision_type: u32 + ) -> Option> { + 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