diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2016-04-03 00:08:47 +0530 |
---|---|---|
committer | bors-servo <lbergstrom+bors@mozilla.com> | 2016-04-03 00:08:47 +0530 |
commit | 8b32e63db843b4ac534c33a87ed53a4acf9b6da7 (patch) | |
tree | a96e3c8742dae55815e6691369fdd1bc1d91e590 /components/script/dom/webglrenderingcontext.rs | |
parent | 85f9f9626eaff12b66299eb6190955f2726b432c (diff) | |
parent | 3fd7634f545871603577d83a08950ab6f7026f1c (diff) | |
download | servo-8b32e63db843b4ac534c33a87ed53a4acf9b6da7.tar.gz servo-8b32e63db843b4ac534c33a87ed53a4acf9b6da7.zip |
Auto merge of #10215 - ConnorGBrewster:webgl_finish, r=emilio
WebGL: Finish, Flush, DetachShader, GenerateMipmap
Implements #10212 and #10213
r? @emilio
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="35" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/10215)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/webglrenderingcontext.rs')
-rw-r--r-- | components/script/dom/webglrenderingcontext.rs | 72 |
1 files changed, 71 insertions, 1 deletions
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index e614b7afc6f..d08a9456624 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -181,6 +181,22 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { Root::from_ref(&*self.canvas) } + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11 + fn Flush(&self) { + self.ipc_renderer + .send(CanvasMsg::WebGL(WebGLCommand::Flush)) + .unwrap(); + } + + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11 + fn Finish(&self) { + let (sender, receiver) = ipc::channel().unwrap(); + self.ipc_renderer + .send(CanvasMsg::WebGL(WebGLCommand::Finish(sender))) + .unwrap(); + receiver.recv().unwrap() + } + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.1 fn DrawingBufferWidth(&self) -> i32 { let (sender, receiver) = ipc::channel().unwrap(); @@ -332,6 +348,15 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { } // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn DetachShader(&self, program: Option<&WebGLProgram>, shader: Option<&WebGLShader>) { + if let Some(program) = program { + if let Some(shader) = shader { + handle_potential_webgl_error!(self, program.detach_shader(shader)); + } + } + } + + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 fn BindAttribLocation(&self, program: Option<&WebGLProgram>, index: u32, name: DOMString) { if let Some(program) = program { @@ -414,6 +439,21 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { } } + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + fn GenerateMipmap(&self, target: u32) { + let slot = match target { + constants::TEXTURE_2D => &self.bound_texture_2d, + constants::TEXTURE_CUBE_MAP => &self.bound_texture_cube_map, + + _ => return self.webgl_error(InvalidEnum), + }; + + match slot.get() { + Some(texture) => handle_potential_webgl_error!(self, texture.generate_mipmap()), + None => self.webgl_error(InvalidOperation) + } + } + #[allow(unsafe_code)] // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 fn BufferData(&self, _cx: *mut JSContext, target: u32, data: Option<*mut JSObject>, usage: u32) { @@ -950,6 +990,25 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { } // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn Uniform1i(&self, + uniform: Option<&WebGLUniformLocation>, + val: i32) { + let uniform = match uniform { + Some(uniform) => uniform, + None => return, + }; + + match self.current_program.get() { + Some(ref program) if program.id() == uniform.program_id() => {}, + _ => return self.webgl_error(InvalidOperation), + }; + + self.ipc_renderer + .send(CanvasMsg::WebGL(WebGLCommand::Uniform1i(uniform.id(), val))) + .unwrap() + } + + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn Uniform1fv(&self, uniform: Option<&WebGLUniformLocation>, data: Vec<f32>) { @@ -1107,7 +1166,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { internal_format: u32, format: u32, data_type: u32, - source: Option<ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement >) { + source: Option<ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement>) { let texture = match target { constants::TEXTURE_2D => self.bound_texture_2d.get(), constants::TEXTURE_CUBE_MAP => self.bound_texture_cube_map.get(), @@ -1169,11 +1228,22 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { => unimplemented!(), }; + if size.width < 0 || size.height < 0 || level < 0 { + self.webgl_error(WebGLError::InvalidOperation); + } + // TODO(emilio): Invert axis, convert colorspace, premultiply alpha if requested let msg = WebGLCommand::TexImage2D(target, level, internal_format as i32, size.width, size.height, format, data_type, pixels); + // depth is always 1 when coming from html elements + handle_potential_webgl_error!(self, texture.unwrap().initialize(size.width as u32, + size.height as u32, + 1, + internal_format, + level as u32)); + self.ipc_renderer .send(CanvasMsg::WebGL(msg)) .unwrap() |