From a8c5a3204515a5483dd6c496b0b09d84180c8a08 Mon Sep 17 00:00:00 2001 From: David Zbarsky Date: Sat, 28 Nov 2015 18:38:14 -0800 Subject: [PATCH 1/3] Implement getProgramParameter and do a little cleanup --- components/canvas/webgl_paint_task.rs | 38 +++++++++++++++---- components/canvas_traits/lib.rs | 5 ++- components/script/dom/webglprogram.rs | 9 ++++- .../script/dom/webglrenderingcontext.rs | 27 ++++++++----- components/script/dom/webglshader.rs | 14 ++----- .../dom/webidls/WebGLRenderingContext.webidl | 2 +- 6 files changed, 64 insertions(+), 31 deletions(-) diff --git a/components/canvas/webgl_paint_task.rs b/components/canvas/webgl_paint_task.rs index 28fabacf72e6..355addfc8236 100644 --- a/components/canvas/webgl_paint_task.rs +++ b/components/canvas/webgl_paint_task.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use canvas_traits::{CanvasCommonMsg, CanvasMsg, CanvasWebGLMsg, FromLayoutMsg, FromPaintMsg}; -use canvas_traits::{WebGLFramebufferBindingRequest, WebGLShaderParameter}; +use canvas_traits::{WebGLError, WebGLFramebufferBindingRequest, WebGLParameter, WebGLResult}; use core::nonzero::NonZero; use euclid::size::Size2D; use gleam::gl; @@ -110,6 +110,8 @@ impl WebGLPaintTask { gl::enable_vertex_attrib_array(attrib_id), CanvasWebGLMsg::GetAttribLocation(program_id, name, chan) => self.attrib_location(program_id, name, chan), + CanvasWebGLMsg::GetProgramParameter(program_id, param_id, chan) => + self.program_parameter(program_id, param_id, chan), CanvasWebGLMsg::GetShaderParameter(shader_id, param_id, chan) => self.shader_parameter(shader_id, param_id, chan), CanvasWebGLMsg::GetUniformLocation(program_id, name, chan) => @@ -315,16 +317,36 @@ impl WebGLPaintTask { chan.send(attrib_location).unwrap(); } + fn program_parameter(&self, + program_id: u32, + param_id: u32, + chan: IpcSender>) { + let result = match param_id { + gl::DELETE_STATUS | + gl::LINK_STATUS | + gl::VALIDATE_STATUS => + Ok(WebGLParameter::Bool(gl::get_program_iv(program_id, param_id) != 0)), + gl::ATTACHED_SHADERS | + gl::ACTIVE_ATTRIBUTES | + gl::ACTIVE_UNIFORMS => + Ok(WebGLParameter::Int(gl::get_program_iv(program_id, param_id))), + _ => Err(WebGLError::InvalidEnum), + }; + + chan.send(result).unwrap(); + } + fn shader_parameter(&self, - shader_id: u32, - param_id: u32, - chan: IpcSender) { + shader_id: u32, + param_id: u32, + chan: IpcSender>) { let result = match param_id { gl::SHADER_TYPE => - WebGLShaderParameter::Int(gl::get_shader_iv(shader_id, param_id)), - gl::DELETE_STATUS | gl::COMPILE_STATUS => - WebGLShaderParameter::Bool(gl::get_shader_iv(shader_id, param_id) != 0), - _ => panic!("Unexpected shader parameter type"), + Ok(WebGLParameter::Int(gl::get_shader_iv(shader_id, param_id))), + gl::DELETE_STATUS | + gl::COMPILE_STATUS => + Ok(WebGLParameter::Bool(gl::get_shader_iv(shader_id, param_id) != 0)), + _ => Err(WebGLError::InvalidEnum), }; chan.send(result).unwrap(); diff --git a/components/canvas_traits/lib.rs b/components/canvas_traits/lib.rs index b68ab5d53f04..d07134ec83b5 100644 --- a/components/canvas_traits/lib.rs +++ b/components/canvas_traits/lib.rs @@ -159,7 +159,8 @@ pub enum CanvasWebGLMsg { BindTexture(u32, u32), DrawArrays(u32, i32, i32), EnableVertexAttribArray(u32), - GetShaderParameter(u32, u32, IpcSender), + GetProgramParameter(u32, u32, IpcSender>), + GetShaderParameter(u32, u32, IpcSender>), GetAttribLocation(u32, String, IpcSender>), GetUniformLocation(u32, String, IpcSender>), PolygonOffset(f32, f32), @@ -196,7 +197,7 @@ pub enum WebGLFramebufferBindingRequest { } #[derive(Clone, Deserialize, Serialize)] -pub enum WebGLShaderParameter { +pub enum WebGLParameter { Int(i32), Bool(bool), Invalid, diff --git a/components/script/dom/webglprogram.rs b/components/script/dom/webglprogram.rs index eb822fcaec0d..fb5a6c590f21 100644 --- a/components/script/dom/webglprogram.rs +++ b/components/script/dom/webglprogram.rs @@ -3,7 +3,7 @@ * 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::{CanvasMsg, CanvasWebGLMsg, WebGLError, WebGLResult}; +use canvas_traits::{CanvasMsg, CanvasWebGLMsg, WebGLError, WebGLResult, WebGLParameter}; use dom::bindings::codegen::Bindings::WebGLProgramBinding; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use dom::bindings::global::GlobalRef; @@ -129,6 +129,13 @@ impl WebGLProgram { .unwrap(); Ok(receiver.recv().unwrap()) } + + /// glGetProgramParameter + pub fn parameter(&self, param_id: u32) -> WebGLResult { + let (sender, receiver) = ipc::channel().unwrap(); + self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::GetProgramParameter(self.id, param_id, sender))).unwrap(); + receiver.recv().unwrap() + } } impl Drop for WebGLProgram { diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index d21691f14af4..b5a1cfb2f9c7 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -4,7 +4,7 @@ use canvas_traits::WebGLError::*; use canvas_traits::{CanvasCommonMsg, CanvasMsg, CanvasWebGLMsg, WebGLError}; -use canvas_traits::{WebGLFramebufferBindingRequest, WebGLShaderParameter}; +use canvas_traits::{WebGLFramebufferBindingRequest, WebGLParameter}; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::{WebGLRenderingContextMethods}; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::{self, WebGLContextAttributes}; @@ -629,21 +629,30 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { } // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - fn GetShaderInfoLog(&self, shader: Option<&WebGLShader>) -> Option { - if let Some(shader) = shader { - shader.info_log().map(DOMString::from) + fn GetProgramParameter(&self, _: *mut JSContext, program: Option<&WebGLProgram>, param_id: u32) -> JSVal { + if let Some(program) = program { + match handle_potential_webgl_error!(self, program.parameter(param_id), WebGLParameter::Invalid) { + WebGLParameter::Int(val) => Int32Value(val), + WebGLParameter::Bool(val) => BooleanValue(val), + WebGLParameter::Invalid => NullValue(), + } } else { - None + NullValue() } } + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn GetShaderInfoLog(&self, shader: Option<&WebGLShader>) -> Option { + shader.and_then(|s| s.info_log()).map(DOMString::from) + } + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 fn GetShaderParameter(&self, _: *mut JSContext, shader: Option<&WebGLShader>, param_id: u32) -> JSVal { if let Some(shader) = shader { - match handle_potential_webgl_error!(self, shader.parameter(param_id), WebGLShaderParameter::Invalid) { - WebGLShaderParameter::Int(val) => Int32Value(val), - WebGLShaderParameter::Bool(val) => BooleanValue(val), - WebGLShaderParameter::Invalid => NullValue(), + match handle_potential_webgl_error!(self, shader.parameter(param_id), WebGLParameter::Invalid) { + WebGLParameter::Int(val) => Int32Value(val), + WebGLParameter::Bool(val) => BooleanValue(val), + WebGLParameter::Invalid => NullValue(), } } else { NullValue() diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 9d52030c56a5..9df8f0bbaa87 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -4,9 +4,8 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl use angle::hl::{BuiltInResources, Output, ShaderValidator}; -use canvas_traits::{CanvasMsg, CanvasWebGLMsg, WebGLError, WebGLResult, WebGLShaderParameter}; +use canvas_traits::{CanvasMsg, CanvasWebGLMsg, WebGLError, WebGLResult, WebGLParameter}; use dom::bindings::cell::DOMRefCell; -use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use dom::bindings::codegen::Bindings::WebGLShaderBinding; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; @@ -132,16 +131,11 @@ impl WebGLShader { self.info_log.borrow().clone() } - /// glGetShaderParameter - pub fn parameter(&self, param_id: u32) -> WebGLResult { - match param_id { - constants::SHADER_TYPE | constants::DELETE_STATUS | constants::COMPILE_STATUS => {}, - _ => return Err(WebGLError::InvalidEnum), - } - + /// glGetParameter + pub fn parameter(&self, param_id: u32) -> WebGLResult { let (sender, receiver) = ipc::channel().unwrap(); self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::GetShaderParameter(self.id, param_id, sender))).unwrap(); - Ok(receiver.recv().unwrap()) + receiver.recv().unwrap() } /// Get the shader source diff --git a/components/script/dom/webidls/WebGLRenderingContext.webidl b/components/script/dom/webidls/WebGLRenderingContext.webidl index 27019ed77542..1c55a37595e6 100644 --- a/components/script/dom/webidls/WebGLRenderingContext.webidl +++ b/components/script/dom/webidls/WebGLRenderingContext.webidl @@ -570,7 +570,7 @@ interface WebGLRenderingContextBase //any getFramebufferAttachmentParameter(GLenum target, GLenum attachment, // GLenum pname); - //any getProgramParameter(WebGLProgram? program, GLenum pname); + any getProgramParameter(WebGLProgram? program, GLenum pname); //DOMString? getProgramInfoLog(WebGLProgram? program); //any getRenderbufferParameter(GLenum target, GLenum pname); any getShaderParameter(WebGLShader? shader, GLenum pname); From ae2c6831c59432c6437a73026a7f38a4ed1de4ed Mon Sep 17 00:00:00 2001 From: David Zbarsky Date: Sun, 29 Nov 2015 20:01:26 -0800 Subject: [PATCH 2/3] Implement GetParameter more fully --- components/canvas/webgl_paint_task.rs | 134 ++++++++++++++++++ components/canvas_traits/lib.rs | 3 + .../script/dom/webglrenderingcontext.rs | 32 +++-- 3 files changed, 157 insertions(+), 12 deletions(-) diff --git a/components/canvas/webgl_paint_task.rs b/components/canvas/webgl_paint_task.rs index 355addfc8236..e32f24f8bc4c 100644 --- a/components/canvas/webgl_paint_task.rs +++ b/components/canvas/webgl_paint_task.rs @@ -110,6 +110,8 @@ impl WebGLPaintTask { gl::enable_vertex_attrib_array(attrib_id), CanvasWebGLMsg::GetAttribLocation(program_id, name, chan) => self.attrib_location(program_id, name, chan), + CanvasWebGLMsg::GetParameter(param_id, chan) => + self.parameter(param_id, chan), CanvasWebGLMsg::GetProgramParameter(program_id, param_id, chan) => self.program_parameter(program_id, param_id, chan), CanvasWebGLMsg::GetShaderParameter(shader_id, param_id, chan) => @@ -317,6 +319,138 @@ impl WebGLPaintTask { chan.send(attrib_location).unwrap(); } + fn parameter(&self, + param_id: u32, + chan: IpcSender>) { + let result = match param_id { + gl::ACTIVE_TEXTURE | + gl::ALPHA_BITS | + gl::BLEND_DST_ALPHA | + gl::BLEND_DST_RGB | + gl::BLEND_EQUATION_ALPHA | + gl::BLEND_EQUATION_RGB | + gl::BLEND_SRC_ALPHA | + gl::BLEND_SRC_RGB | + gl::BLUE_BITS | + gl::CULL_FACE_MODE | + gl::DEPTH_BITS | + gl::DEPTH_FUNC | + gl::FRONT_FACE | + gl::GENERATE_MIPMAP_HINT | + gl::GREEN_BITS | + //gl::IMPLEMENTATION_COLOR_READ_FORMAT | + //gl::IMPLEMENTATION_COLOR_READ_TYPE | + gl::MAX_COMBINED_TEXTURE_IMAGE_UNITS | + gl::MAX_CUBE_MAP_TEXTURE_SIZE | + //gl::MAX_FRAGMENT_UNIFORM_VECTORS | + gl::MAX_RENDERBUFFER_SIZE | + gl::MAX_TEXTURE_IMAGE_UNITS | + gl::MAX_TEXTURE_SIZE | + //gl::MAX_VARYING_VECTORS | + gl::MAX_VERTEX_ATTRIBS | + gl::MAX_VERTEX_TEXTURE_IMAGE_UNITS | + //gl::MAX_VERTEX_UNIFORM_VECTORS | + gl::PACK_ALIGNMENT | + gl::RED_BITS | + gl::SAMPLE_BUFFERS | + gl::SAMPLES | + gl::STENCIL_BACK_FAIL | + gl::STENCIL_BACK_FUNC | + gl::STENCIL_BACK_PASS_DEPTH_FAIL | + gl::STENCIL_BACK_PASS_DEPTH_PASS | + gl::STENCIL_BACK_REF | + gl::STENCIL_BACK_VALUE_MASK | + gl::STENCIL_BACK_WRITEMASK | + gl::STENCIL_BITS | + gl::STENCIL_CLEAR_VALUE | + gl::STENCIL_FAIL | + gl::STENCIL_FUNC | + gl::STENCIL_PASS_DEPTH_FAIL | + gl::STENCIL_PASS_DEPTH_PASS | + gl::STENCIL_REF | + gl::STENCIL_VALUE_MASK | + gl::STENCIL_WRITEMASK | + gl::SUBPIXEL_BITS | + gl::UNPACK_ALIGNMENT => { + //gl::UNPACK_COLORSPACE_CONVERSION_WEBGL => + let mut result = 0i32; + gl::get_integer_v(param_id, &mut result); + Ok(WebGLParameter::Int(result)) + }, + + gl::BLEND | + gl::CULL_FACE | + gl::DEPTH_TEST | + gl::DEPTH_WRITEMASK | + gl::DITHER | + gl::POLYGON_OFFSET_FILL | + gl::SAMPLE_COVERAGE_INVERT | + gl::STENCIL_TEST => { + //gl::UNPACK_FLIP_Y_WEBGL | + //gl::UNPACK_PREMULTIPLY_ALPHA_WEBGL => + let mut result = 0u8; + gl::get_boolean_v(param_id, &mut result); + Ok(WebGLParameter::Bool(result != 0)) + }, + + gl::DEPTH_CLEAR_VALUE | + gl::LINE_WIDTH | + gl::POLYGON_OFFSET_FACTOR | + gl::POLYGON_OFFSET_UNITS | + gl::SAMPLE_COVERAGE_VALUE => { + let mut result = 0f32; + gl::get_float_v(param_id, &mut result); + Ok(WebGLParameter::Float(result)) + }, + + gl::VERSION => Ok(WebGLParameter::String("WebGL 1.0".to_owned())), + gl::RENDERER | + gl::VENDOR => Ok(WebGLParameter::String("Mozilla/Servo".to_owned())), + gl::SHADING_LANGUAGE_VERSION => Ok(WebGLParameter::String("WebGL GLSL ES 1.0".to_owned())), + + // TODO(zbarsky, ecoal95): Implement support for the following valid parameters + // Float32Array + gl::ALIASED_LINE_WIDTH_RANGE | + gl::ALIASED_POINT_SIZE_RANGE | + //gl::BLEND_COLOR | + gl::COLOR_CLEAR_VALUE | + gl::DEPTH_RANGE | + + // WebGLBuffer + gl::ARRAY_BUFFER_BINDING | + gl::ELEMENT_ARRAY_BUFFER_BINDING | + + // WebGLFrameBuffer + gl::FRAMEBUFFER_BINDING | + + // WebGLRenderBuffer + gl::RENDERBUFFER_BINDING | + + // WebGLProgram + gl::CURRENT_PROGRAM | + + // WebGLTexture + gl::TEXTURE_BINDING_2D | + gl::TEXTURE_BINDING_CUBE_MAP | + + // sequence + gl::COLOR_WRITEMASK | + + // Uint32Array + gl::COMPRESSED_TEXTURE_FORMATS | + + // Int32Array + gl::MAX_VIEWPORT_DIMS | + gl::SCISSOR_BOX | + gl::VIEWPORT => Err(WebGLError::InvalidEnum), + + // Invalid parameters + _ => Err(WebGLError::InvalidEnum) + }; + + chan.send(result).unwrap(); + } + fn program_parameter(&self, program_id: u32, param_id: u32, diff --git a/components/canvas_traits/lib.rs b/components/canvas_traits/lib.rs index d07134ec83b5..ad7915d90556 100644 --- a/components/canvas_traits/lib.rs +++ b/components/canvas_traits/lib.rs @@ -159,6 +159,7 @@ pub enum CanvasWebGLMsg { BindTexture(u32, u32), DrawArrays(u32, i32, i32), EnableVertexAttribArray(u32), + GetParameter(u32, IpcSender>), GetProgramParameter(u32, u32, IpcSender>), GetShaderParameter(u32, u32, IpcSender>), GetAttribLocation(u32, String, IpcSender>), @@ -200,6 +201,8 @@ pub enum WebGLFramebufferBindingRequest { pub enum WebGLParameter { Int(i32), Bool(bool), + String(String), + Float(f32), Invalid, } diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index b5a1cfb2f9c7..e7022af36a91 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -30,7 +30,7 @@ use euclid::size::Size2D; use ipc_channel::ipc::{self, IpcSender}; use js::jsapi::{JSContext, JSObject, RootedValue}; use js::jsapi::{JS_GetFloat32ArrayData, JS_GetObjectAsArrayBufferView}; -use js::jsval::{BooleanValue, Int32Value, JSVal, NullValue, UndefinedValue}; +use js::jsval::{BooleanValue, DoubleValue, Int32Value, JSVal, NullValue, UndefinedValue}; use msg::constellation_msg::ScriptMsg as ConstellationMsg; use net_traits::image::base::PixelFormat; use net_traits::image_cache_task::ImageResponse; @@ -192,18 +192,22 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { #[allow(unsafe_code)] // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 fn GetParameter(&self, cx: *mut JSContext, parameter: u32) -> JSVal { - // TODO(ecoal95): Implement the missing parameters from the spec - unsafe { - let mut rval = RootedValue::new(cx, UndefinedValue()); - match parameter { - constants::VERSION => - "WebGL 1.0".to_jsval(cx, rval.handle_mut()), - constants::RENDERER | - constants::VENDOR => - "Mozilla/Servo".to_jsval(cx, rval.handle_mut()), - _ => rval.ptr = NullValue(), + let (sender, receiver) = ipc::channel().unwrap(); + self.ipc_renderer + .send(CanvasMsg::WebGL(CanvasWebGLMsg::GetParameter(parameter, sender))) + .unwrap(); + match handle_potential_webgl_error!(self, receiver.recv().unwrap(), WebGLParameter::Invalid) { + WebGLParameter::Int(val) => Int32Value(val), + WebGLParameter::Bool(val) => BooleanValue(val), + WebGLParameter::Float(val) => DoubleValue(val as f64), + WebGLParameter::String(val) => { + let mut rval = RootedValue::new(cx, UndefinedValue()); + unsafe { + val.to_jsval(cx, rval.handle_mut()); + } + rval.ptr } - rval.ptr + WebGLParameter::Invalid => NullValue(), } } @@ -634,6 +638,8 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { match handle_potential_webgl_error!(self, program.parameter(param_id), WebGLParameter::Invalid) { WebGLParameter::Int(val) => Int32Value(val), WebGLParameter::Bool(val) => BooleanValue(val), + WebGLParameter::String(_) => panic!("Program parameter should not be string"), + WebGLParameter::Float(_) => panic!("Program parameter should not be float"), WebGLParameter::Invalid => NullValue(), } } else { @@ -652,6 +658,8 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { match handle_potential_webgl_error!(self, shader.parameter(param_id), WebGLParameter::Invalid) { WebGLParameter::Int(val) => Int32Value(val), WebGLParameter::Bool(val) => BooleanValue(val), + WebGLParameter::String(_) => panic!("Shader parameter should not be string"), + WebGLParameter::Float(_) => panic!("Shader parameter should not be float"), WebGLParameter::Invalid => NullValue(), } } else { From 637e8b235ce516f1156c675cd6ce301fa16d4845 Mon Sep 17 00:00:00 2001 From: David Zbarsky Date: Sun, 29 Nov 2015 20:38:38 -0800 Subject: [PATCH 3/3] Implement getBufferParameter --- components/canvas/webgl_paint_task.rs | 16 ++++++++++++++++ components/canvas_traits/lib.rs | 1 + components/script/dom/webglrenderingcontext.rs | 16 ++++++++++++++++ .../dom/webidls/WebGLRenderingContext.webidl | 2 +- 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/components/canvas/webgl_paint_task.rs b/components/canvas/webgl_paint_task.rs index e32f24f8bc4c..cb1924de152d 100644 --- a/components/canvas/webgl_paint_task.rs +++ b/components/canvas/webgl_paint_task.rs @@ -110,6 +110,8 @@ impl WebGLPaintTask { gl::enable_vertex_attrib_array(attrib_id), CanvasWebGLMsg::GetAttribLocation(program_id, name, chan) => self.attrib_location(program_id, name, chan), + CanvasWebGLMsg::GetBufferParameter(target, param_id,chan) => + self.buffer_parameter(target, param_id, chan), CanvasWebGLMsg::GetParameter(param_id, chan) => self.parameter(param_id, chan), CanvasWebGLMsg::GetProgramParameter(program_id, param_id, chan) => @@ -451,6 +453,20 @@ impl WebGLPaintTask { chan.send(result).unwrap(); } + fn buffer_parameter(&self, + target: u32, + param_id: u32, + chan: IpcSender>) { + 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.send(result).unwrap(); + } + fn program_parameter(&self, program_id: u32, param_id: u32, diff --git a/components/canvas_traits/lib.rs b/components/canvas_traits/lib.rs index ad7915d90556..9706c0bccc5e 100644 --- a/components/canvas_traits/lib.rs +++ b/components/canvas_traits/lib.rs @@ -159,6 +159,7 @@ pub enum CanvasWebGLMsg { BindTexture(u32, u32), DrawArrays(u32, i32, i32), EnableVertexAttribArray(u32), + GetBufferParameter(u32, u32, IpcSender>), GetParameter(u32, IpcSender>), GetProgramParameter(u32, u32, IpcSender>), GetShaderParameter(u32, u32, IpcSender>), diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index e7022af36a91..f00307a19f83 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -189,6 +189,22 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { receiver.recv().unwrap() } + #[allow(unsafe_code)] + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 + fn GetBufferParameter(&self, cx: *mut JSContext, target: u32, parameter: u32) -> JSVal { + let (sender, receiver) = ipc::channel().unwrap(); + self.ipc_renderer + .send(CanvasMsg::WebGL(CanvasWebGLMsg::GetBufferParameter(target, parameter, sender))) + .unwrap(); + 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::String(_) => panic!("Buffer parameter should not be string"), + WebGLParameter::Invalid => NullValue(), + } + } + #[allow(unsafe_code)] // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 fn GetParameter(&self, cx: *mut JSContext, parameter: u32) -> JSVal { diff --git a/components/script/dom/webidls/WebGLRenderingContext.webidl b/components/script/dom/webidls/WebGLRenderingContext.webidl index 1c55a37595e6..905046591f15 100644 --- a/components/script/dom/webidls/WebGLRenderingContext.webidl +++ b/components/script/dom/webidls/WebGLRenderingContext.webidl @@ -563,7 +563,7 @@ interface WebGLRenderingContextBase [WebGLHandlesContextLoss] GLint getAttribLocation(WebGLProgram? program, DOMString name); - //any getBufferParameter(GLenum target, GLenum pname); + any getBufferParameter(GLenum target, GLenum pname); any getParameter(GLenum pname); [WebGLHandlesContextLoss] GLenum getError();