diff options
author | Mátyás Mustoha <matyas.mustoha@h-lab.eu> | 2020-02-20 13:32:38 +0100 |
---|---|---|
committer | Mátyás Mustoha <matyas.mustoha@h-lab.eu> | 2020-02-21 11:04:30 +0100 |
commit | b41805a9206f940737c2644f73d975ae35e38f99 (patch) | |
tree | 119787334ac1d38cb73cf3a1f7cae51aedf57c29 /components/script/dom/webgl2renderingcontext.rs | |
parent | f5ff38b87559cd25db44fa7bc6f2a9c4cb2264e0 (diff) | |
download | servo-b41805a9206f940737c2644f73d975ae35e38f99.tar.gz servo-b41805a9206f940737c2644f73d975ae35e38f99.zip |
Add support for WebGL2 framebuffer attachments
Adds an initial implementation for the framebuffer attachments
introduced with WebGL2 and the related enums and constrains checks.
Diffstat (limited to 'components/script/dom/webgl2renderingcontext.rs')
-rw-r--r-- | components/script/dom/webgl2renderingcontext.rs | 54 |
1 files changed, 50 insertions, 4 deletions
diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 0e9d24075a6..4c69efdcb55 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -2283,8 +2283,38 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { renderbuffertarget: u32, rb: Option<&WebGLRenderbuffer>, ) { - self.base - .FramebufferRenderbuffer(target, attachment, renderbuffertarget, rb) + if let Some(rb) = rb { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(rb), return); + } + + let fb_slot = match target { + constants::FRAMEBUFFER | constants::DRAW_FRAMEBUFFER => { + self.base.get_draw_framebuffer_slot() + }, + constants::READ_FRAMEBUFFER => &self.base.get_read_framebuffer_slot(), + _ => return self.base.webgl_error(InvalidEnum), + }; + + if renderbuffertarget != constants::RENDERBUFFER { + return self.base.webgl_error(InvalidEnum); + } + + match fb_slot.get() { + Some(fb) => match attachment { + constants::DEPTH_STENCIL_ATTACHMENT => { + handle_potential_webgl_error!( + self.base, + fb.renderbuffer(constants::DEPTH_ATTACHMENT, rb) + ); + handle_potential_webgl_error!( + self.base, + fb.renderbuffer(constants::STENCIL_ATTACHMENT, rb) + ); + }, + _ => handle_potential_webgl_error!(self.base, fb.renderbuffer(attachment, rb)), + }, + None => self.base.webgl_error(InvalidOperation), + }; } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6 @@ -2296,8 +2326,24 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { texture: Option<&WebGLTexture>, level: i32, ) { - self.base - .FramebufferTexture2D(target, attachment, textarget, texture, level) + if let Some(texture) = texture { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(texture), return); + } + + let fb_slot = match target { + constants::FRAMEBUFFER | constants::DRAW_FRAMEBUFFER => { + self.base.get_draw_framebuffer_slot() + }, + constants::READ_FRAMEBUFFER => self.base.get_read_framebuffer_slot(), + _ => return self.base.webgl_error(InvalidEnum), + }; + match fb_slot.get() { + Some(fb) => handle_potential_webgl_error!( + self.base, + fb.texture2d(attachment, textarget, texture, level) + ), + None => self.base.webgl_error(InvalidOperation), + } } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 |