diff options
author | Istvan Miklos <istvan.miklos@h-lab.eu> | 2020-05-18 13:30:39 +0200 |
---|---|---|
committer | Istvan Miklos <istvan.miklos@h-lab.eu> | 2020-05-26 11:33:58 +0200 |
commit | b298160ff28182d8e894e436429d86b459e3e0a4 (patch) | |
tree | 1639d3b48df023f023e4203e147ebda348cd11e3 /components/script/dom | |
parent | ce076a8382a81675cb93c56e0bdc8d1be60eaf15 (diff) | |
download | servo-b298160ff28182d8e894e436429d86b459e3e0a4.tar.gz servo-b298160ff28182d8e894e436429d86b459e3e0a4.zip |
Add support for WebGL2 TexImage2D
Adds initial support for one of the WebGL2 `TexImage2D` call.
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/webgl2renderingcontext.rs | 68 | ||||
-rw-r--r-- | components/script/dom/webglrenderingcontext.rs | 2 | ||||
-rw-r--r-- | components/script/dom/webidls/WebGL2RenderingContext.webidl | 8 |
3 files changed, 72 insertions, 6 deletions
diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 7dd7ddd0279..41d3cd5b66c 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -2917,7 +2917,6 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.6 - #[allow(unsafe_code)] fn TexImage2D__( &self, target: u32, @@ -2928,6 +2927,73 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { border: i32, format: u32, type_: u32, + source: ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement, + ) -> Fallible<()> { + if self.bound_pixel_unpack_buffer.get().is_some() { + return Ok(self.base.webgl_error(InvalidOperation)); + } + + let validator = TexImage2DValidator::new( + &self.base, + target, + level, + internalformat as u32, + width, + height, + border, + format, + type_, + ); + + let TexImage2DValidatorResult { + texture, + target, + width: _, + height: _, + level, + border, + internal_format, + format, + data_type, + } = match validator.validate() { + Ok(result) => result, + Err(_) => return Ok(()), + }; + + let unpacking_alignment = self.base.texture_unpacking_alignment(); + + let pixels = match self.base.get_image_pixels(source)? { + Some(pixels) => pixels, + None => return Ok(()), + }; + + self.base.tex_image_2d( + &texture, + target, + data_type, + internal_format, + format, + level, + border, + unpacking_alignment, + pixels, + ); + + Ok(()) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.6 + #[allow(unsafe_code)] + fn TexImage2D___( + &self, + target: u32, + level: i32, + internalformat: i32, + width: i32, + height: i32, + border: i32, + format: u32, + type_: u32, src_data: CustomAutoRooterGuard<ArrayBufferView>, src_offset: u32, ) -> Fallible<()> { diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 1c45f14b3d3..c602b294548 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -638,7 +638,7 @@ impl WebGLRenderingContext { } } - fn get_image_pixels(&self, source: TexImageSource) -> Fallible<Option<TexPixels>> { + pub fn get_image_pixels(&self, source: TexImageSource) -> Fallible<Option<TexPixels>> { Ok(Some(match source { TexImageSource::ImageData(image_data) => TexPixels::new( image_data.to_shared_memory(), diff --git a/components/script/dom/webidls/WebGL2RenderingContext.webidl b/components/script/dom/webidls/WebGL2RenderingContext.webidl index d410f8899e4..7595fd951cf 100644 --- a/components/script/dom/webidls/WebGL2RenderingContext.webidl +++ b/components/script/dom/webidls/WebGL2RenderingContext.webidl @@ -508,10 +508,10 @@ interface mixin WebGL2RenderingContextOverloads //[Throws] //void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, // GLint border, GLenum format, GLenum type, GLintptr pboOffset); - //[Throws] - //void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, - // GLint border, GLenum format, GLenum type, - // TexImageSource source); // May throw DOMException + [Throws] + void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, + GLint border, GLenum format, GLenum type, + TexImageSource source); // May throw DOMException [Throws] void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, /*[AllowShared]*/ ArrayBufferView srcData, |