aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/webgl2renderingcontext.rs
diff options
context:
space:
mode:
authorMátyás Mustoha <matyas.mustoha@h-lab.eu>2020-02-20 13:32:38 +0100
committerMátyás Mustoha <matyas.mustoha@h-lab.eu>2020-02-21 11:04:30 +0100
commitb41805a9206f940737c2644f73d975ae35e38f99 (patch)
tree119787334ac1d38cb73cf3a1f7cae51aedf57c29 /components/script/dom/webgl2renderingcontext.rs
parentf5ff38b87559cd25db44fa7bc6f2a9c4cb2264e0 (diff)
downloadservo-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.rs54
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