From e58e8ab42e832604cc71b01a25ca1e199323d7c6 Mon Sep 17 00:00:00 2001 From: Martin Robinson Date: Thu, 6 Jul 2017 19:21:22 +0200 Subject: Upgrade to the latest version of WebRender --- components/script/dom/webglrenderbuffer.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 7094a6b3734..03589365c43 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -13,8 +13,8 @@ use dom::window::Window; use dom_struct::dom_struct; use ipc_channel::ipc::IpcSender; use std::cell::Cell; -use webrender_traits; -use webrender_traits::{WebGLCommand, WebGLRenderbufferId, WebGLResult, WebGLError}; +use webrender_api; +use webrender_api::{WebGLCommand, WebGLRenderbufferId, WebGLResult, WebGLError}; #[dom_struct] pub struct WebGLRenderbuffer { @@ -45,7 +45,7 @@ impl WebGLRenderbuffer { pub fn maybe_new(window: &Window, renderer: IpcSender) -> Option> { - let (sender, receiver) = webrender_traits::channel::msg_channel().unwrap(); + let (sender, receiver) = webrender_api::channel::msg_channel().unwrap(); renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateRenderbuffer(sender))).unwrap(); let result = receiver.recv().unwrap(); -- cgit v1.2.3 From 703962fe61d673536eb982b45795ae13748f0f6a Mon Sep 17 00:00:00 2001 From: Imanol Fernandez Date: Tue, 15 Aug 2017 16:05:22 +0200 Subject: Improve WebGL architecture. --- components/script/dom/webglrenderbuffer.rs | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 03589365c43..9a855651cc9 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.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; +use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLError, WebGLMsgSender, WebGLRenderbufferId, WebGLResult}; use dom::bindings::codegen::Bindings::WebGLRenderbufferBinding; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use dom::bindings::js::Root; @@ -11,10 +11,7 @@ use dom::bindings::reflector::reflect_dom_object; use dom::webglobject::WebGLObject; use dom::window::Window; use dom_struct::dom_struct; -use ipc_channel::ipc::IpcSender; use std::cell::Cell; -use webrender_api; -use webrender_api::{WebGLCommand, WebGLRenderbufferId, WebGLResult, WebGLError}; #[dom_struct] pub struct WebGLRenderbuffer { @@ -25,11 +22,11 @@ pub struct WebGLRenderbuffer { size: Cell>, internal_format: Cell>, #[ignore_heap_size_of = "Defined in ipc-channel"] - renderer: IpcSender, + renderer: WebGLMsgSender, } impl WebGLRenderbuffer { - fn new_inherited(renderer: IpcSender, + fn new_inherited(renderer: WebGLMsgSender, id: WebGLRenderbufferId) -> WebGLRenderbuffer { WebGLRenderbuffer { @@ -43,17 +40,17 @@ impl WebGLRenderbuffer { } } - pub fn maybe_new(window: &Window, renderer: IpcSender) + pub fn maybe_new(window: &Window, renderer: WebGLMsgSender) -> Option> { - let (sender, receiver) = webrender_api::channel::msg_channel().unwrap(); - renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateRenderbuffer(sender))).unwrap(); + let (sender, receiver) = webgl_channel().unwrap(); + renderer.send(WebGLCommand::CreateRenderbuffer(sender)).unwrap(); let result = receiver.recv().unwrap(); result.map(|renderbuffer_id| WebGLRenderbuffer::new(window, renderer, renderbuffer_id)) } pub fn new(window: &Window, - renderer: IpcSender, + renderer: WebGLMsgSender, id: WebGLRenderbufferId) -> Root { reflect_dom_object(box WebGLRenderbuffer::new_inherited(renderer, id), @@ -74,14 +71,14 @@ impl WebGLRenderbuffer { pub fn bind(&self, target: u32) { self.ever_bound.set(true); - let msg = CanvasMsg::WebGL(WebGLCommand::BindRenderbuffer(target, Some(self.id))); + let msg = WebGLCommand::BindRenderbuffer(target, Some(self.id)); self.renderer.send(msg).unwrap(); } pub fn delete(&self) { if !self.is_deleted.get() { self.is_deleted.set(true); - let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteRenderbuffer(self.id))); + let _ = self.renderer.send(WebGLCommand::DeleteRenderbuffer(self.id)); } } @@ -110,8 +107,7 @@ impl WebGLRenderbuffer { // FIXME: Invalidate completeness after the call - let msg = CanvasMsg::WebGL(WebGLCommand::RenderbufferStorage(constants::RENDERBUFFER, - internal_format, width, height)); + let msg = WebGLCommand::RenderbufferStorage(constants::RENDERBUFFER, internal_format, width, height); self.renderer.send(msg).unwrap(); self.size.set(Some((width, height))); -- cgit v1.2.3 From cfe22e3979b7270833a4b450b25fb2157deb1da2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 16 Aug 2017 16:42:13 +0200 Subject: Revert "Auto merge of #17891 - MortimerGoro:webgl_move, r=glennw,emilio" This reverts commit 90f55ea4580e2a15f7d70d0491444f18b972d450, reversing changes made to 2e60b27a2186a8cba4b952960155dfcf3f47d7db. --- components/script/dom/webglrenderbuffer.rs | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 9a855651cc9..03589365c43 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.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::webgl::{webgl_channel, WebGLCommand, WebGLError, WebGLMsgSender, WebGLRenderbufferId, WebGLResult}; +use canvas_traits::CanvasMsg; use dom::bindings::codegen::Bindings::WebGLRenderbufferBinding; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use dom::bindings::js::Root; @@ -11,7 +11,10 @@ use dom::bindings::reflector::reflect_dom_object; use dom::webglobject::WebGLObject; use dom::window::Window; use dom_struct::dom_struct; +use ipc_channel::ipc::IpcSender; use std::cell::Cell; +use webrender_api; +use webrender_api::{WebGLCommand, WebGLRenderbufferId, WebGLResult, WebGLError}; #[dom_struct] pub struct WebGLRenderbuffer { @@ -22,11 +25,11 @@ pub struct WebGLRenderbuffer { size: Cell>, internal_format: Cell>, #[ignore_heap_size_of = "Defined in ipc-channel"] - renderer: WebGLMsgSender, + renderer: IpcSender, } impl WebGLRenderbuffer { - fn new_inherited(renderer: WebGLMsgSender, + fn new_inherited(renderer: IpcSender, id: WebGLRenderbufferId) -> WebGLRenderbuffer { WebGLRenderbuffer { @@ -40,17 +43,17 @@ impl WebGLRenderbuffer { } } - pub fn maybe_new(window: &Window, renderer: WebGLMsgSender) + pub fn maybe_new(window: &Window, renderer: IpcSender) -> Option> { - let (sender, receiver) = webgl_channel().unwrap(); - renderer.send(WebGLCommand::CreateRenderbuffer(sender)).unwrap(); + let (sender, receiver) = webrender_api::channel::msg_channel().unwrap(); + renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateRenderbuffer(sender))).unwrap(); let result = receiver.recv().unwrap(); result.map(|renderbuffer_id| WebGLRenderbuffer::new(window, renderer, renderbuffer_id)) } pub fn new(window: &Window, - renderer: WebGLMsgSender, + renderer: IpcSender, id: WebGLRenderbufferId) -> Root { reflect_dom_object(box WebGLRenderbuffer::new_inherited(renderer, id), @@ -71,14 +74,14 @@ impl WebGLRenderbuffer { pub fn bind(&self, target: u32) { self.ever_bound.set(true); - let msg = WebGLCommand::BindRenderbuffer(target, Some(self.id)); + let msg = CanvasMsg::WebGL(WebGLCommand::BindRenderbuffer(target, Some(self.id))); self.renderer.send(msg).unwrap(); } pub fn delete(&self) { if !self.is_deleted.get() { self.is_deleted.set(true); - let _ = self.renderer.send(WebGLCommand::DeleteRenderbuffer(self.id)); + let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteRenderbuffer(self.id))); } } @@ -107,7 +110,8 @@ impl WebGLRenderbuffer { // FIXME: Invalidate completeness after the call - let msg = WebGLCommand::RenderbufferStorage(constants::RENDERBUFFER, internal_format, width, height); + let msg = CanvasMsg::WebGL(WebGLCommand::RenderbufferStorage(constants::RENDERBUFFER, + internal_format, width, height)); self.renderer.send(msg).unwrap(); self.size.set(Some((width, height))); -- cgit v1.2.3 From 676f2c8acf6fec8ad77d4daa51bef5bdcae101c5 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Wed, 16 Aug 2017 23:23:18 +0200 Subject: Revert "Auto merge of #18114 - emilio:revert-webgl-refactor, r=nox" This reverts commit 4d10d39e8fe841c5fe2ac58da2daaa13c10c140e, reversing changes made to ee94e2b7c0bd327abe8f9545b2a1f792f67a2bdd. --- components/script/dom/webglrenderbuffer.rs | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 03589365c43..9a855651cc9 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.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; +use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLError, WebGLMsgSender, WebGLRenderbufferId, WebGLResult}; use dom::bindings::codegen::Bindings::WebGLRenderbufferBinding; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use dom::bindings::js::Root; @@ -11,10 +11,7 @@ use dom::bindings::reflector::reflect_dom_object; use dom::webglobject::WebGLObject; use dom::window::Window; use dom_struct::dom_struct; -use ipc_channel::ipc::IpcSender; use std::cell::Cell; -use webrender_api; -use webrender_api::{WebGLCommand, WebGLRenderbufferId, WebGLResult, WebGLError}; #[dom_struct] pub struct WebGLRenderbuffer { @@ -25,11 +22,11 @@ pub struct WebGLRenderbuffer { size: Cell>, internal_format: Cell>, #[ignore_heap_size_of = "Defined in ipc-channel"] - renderer: IpcSender, + renderer: WebGLMsgSender, } impl WebGLRenderbuffer { - fn new_inherited(renderer: IpcSender, + fn new_inherited(renderer: WebGLMsgSender, id: WebGLRenderbufferId) -> WebGLRenderbuffer { WebGLRenderbuffer { @@ -43,17 +40,17 @@ impl WebGLRenderbuffer { } } - pub fn maybe_new(window: &Window, renderer: IpcSender) + pub fn maybe_new(window: &Window, renderer: WebGLMsgSender) -> Option> { - let (sender, receiver) = webrender_api::channel::msg_channel().unwrap(); - renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateRenderbuffer(sender))).unwrap(); + let (sender, receiver) = webgl_channel().unwrap(); + renderer.send(WebGLCommand::CreateRenderbuffer(sender)).unwrap(); let result = receiver.recv().unwrap(); result.map(|renderbuffer_id| WebGLRenderbuffer::new(window, renderer, renderbuffer_id)) } pub fn new(window: &Window, - renderer: IpcSender, + renderer: WebGLMsgSender, id: WebGLRenderbufferId) -> Root { reflect_dom_object(box WebGLRenderbuffer::new_inherited(renderer, id), @@ -74,14 +71,14 @@ impl WebGLRenderbuffer { pub fn bind(&self, target: u32) { self.ever_bound.set(true); - let msg = CanvasMsg::WebGL(WebGLCommand::BindRenderbuffer(target, Some(self.id))); + let msg = WebGLCommand::BindRenderbuffer(target, Some(self.id)); self.renderer.send(msg).unwrap(); } pub fn delete(&self) { if !self.is_deleted.get() { self.is_deleted.set(true); - let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteRenderbuffer(self.id))); + let _ = self.renderer.send(WebGLCommand::DeleteRenderbuffer(self.id)); } } @@ -110,8 +107,7 @@ impl WebGLRenderbuffer { // FIXME: Invalidate completeness after the call - let msg = CanvasMsg::WebGL(WebGLCommand::RenderbufferStorage(constants::RENDERBUFFER, - internal_format, width, height)); + let msg = WebGLCommand::RenderbufferStorage(constants::RENDERBUFFER, internal_format, width, height); self.renderer.send(msg).unwrap(); self.size.set(Some((width, height))); -- cgit v1.2.3 From 0e3c54c1911ba2c3bf305ee04f04fcd9bf2fc2fe Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Mon, 25 Sep 2017 23:30:24 +0200 Subject: Rename dom::bindings::js to dom::bindings::root --- components/script/dom/webglrenderbuffer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 9a855651cc9..be324d5e905 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -6,8 +6,8 @@ use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLError, WebGLMsgSender, WebGLRenderbufferId, WebGLResult}; use dom::bindings::codegen::Bindings::WebGLRenderbufferBinding; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; -use dom::bindings::js::Root; use dom::bindings::reflector::reflect_dom_object; +use dom::bindings::root::Root; use dom::webglobject::WebGLObject; use dom::window::Window; use dom_struct::dom_struct; -- cgit v1.2.3 From f87c2a8d7616112ca924e30292db2d244cf87eec Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Tue, 26 Sep 2017 01:53:40 +0200 Subject: Rename Root to DomRoot In a later PR, DomRoot will become a type alias of Root>, where Root will be able to handle all the things that need to be rooted that have a stable traceable address that doesn't move for the whole lifetime of the root. Stay tuned. --- components/script/dom/webglrenderbuffer.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index be324d5e905..89151a07f8d 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -7,7 +7,7 @@ use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLError, WebGLMsgSend use dom::bindings::codegen::Bindings::WebGLRenderbufferBinding; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use dom::bindings::reflector::reflect_dom_object; -use dom::bindings::root::Root; +use dom::bindings::root::DomRoot; use dom::webglobject::WebGLObject; use dom::window::Window; use dom_struct::dom_struct; @@ -41,7 +41,7 @@ impl WebGLRenderbuffer { } pub fn maybe_new(window: &Window, renderer: WebGLMsgSender) - -> Option> { + -> Option> { let (sender, receiver) = webgl_channel().unwrap(); renderer.send(WebGLCommand::CreateRenderbuffer(sender)).unwrap(); @@ -52,7 +52,7 @@ impl WebGLRenderbuffer { pub fn new(window: &Window, renderer: WebGLMsgSender, id: WebGLRenderbufferId) - -> Root { + -> DomRoot { reflect_dom_object(box WebGLRenderbuffer::new_inherited(renderer, id), window, WebGLRenderbufferBinding::Wrap) -- cgit v1.2.3 From aa15dc269f41503d81ad44cd7e85d69e6f4aeac7 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Mon, 16 Oct 2017 14:35:30 +0200 Subject: Remove use of unstable box syntax. http://www.robohornet.org gives a score of 101.36 on master, and 102.68 with this PR. The latter is slightly better, but probably within noise level. So it looks like this PR does not affect DOM performance. This is expected since `Box::new` is defined as: ```rust impl Box { #[inline(always)] pub fn new(x: T) -> Box { box x } } ``` With inlining, it should compile to the same as box syntax. --- components/script/dom/webglrenderbuffer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 89151a07f8d..c1cc99955b4 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -53,7 +53,7 @@ impl WebGLRenderbuffer { renderer: WebGLMsgSender, id: WebGLRenderbufferId) -> DomRoot { - reflect_dom_object(box WebGLRenderbuffer::new_inherited(renderer, id), + reflect_dom_object(Box::new(WebGLRenderbuffer::new_inherited(renderer, id)), window, WebGLRenderbufferBinding::Wrap) } -- cgit v1.2.3 From 4506f0d30cbbb02df32e9c16135ef288ad6b7e2e Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Wed, 18 Oct 2017 10:42:01 +1100 Subject: Replace all uses of the `heapsize` crate with `malloc_size_of`. Servo currently uses `heapsize`, but Stylo/Gecko use `malloc_size_of`. `malloc_size_of` is better -- it handles various cases that `heapsize` does not -- so this patch changes Servo to use `malloc_size_of`. This patch makes the following changes to the `malloc_size_of` crate. - Adds `MallocSizeOf` trait implementations for numerous types, some built-in (e.g. `VecDeque`), some external and Servo-only (e.g. `string_cache`). - Makes `enclosing_size_of_op` optional, because vanilla jemalloc doesn't support that operation. - For `HashSet`/`HashMap`, falls back to a computed estimate when `enclosing_size_of_op` isn't available. - Adds an extern "C" `malloc_size_of` function that does the actual heap measurement; this is based on the same functions from the `heapsize` crate. This patch makes the following changes elsewhere. - Converts all the uses of `heapsize` to instead use `malloc_size_of`. - Disables the "heapsize"/"heap_size" feature for the external crates that provide it. - Removes the `HeapSizeOf` implementation from `hashglobe`. - Adds `ignore` annotations to a few `Rc`/`Arc`, because `malloc_size_of` doesn't derive those types, unlike `heapsize`. --- components/script/dom/webglrenderbuffer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index c1cc99955b4..feac4eed416 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -21,7 +21,7 @@ pub struct WebGLRenderbuffer { is_deleted: Cell, size: Cell>, internal_format: Cell>, - #[ignore_heap_size_of = "Defined in ipc-channel"] + #[ignore_malloc_size_of = "Defined in ipc-channel"] renderer: WebGLMsgSender, } -- cgit v1.2.3 From e8f19fa7fcf0b51debbd33b0c0cf5f6b2c3bf82d Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Thu, 5 Apr 2018 18:01:32 +0200 Subject: Properly check the right internal formats in gl.renderbufferStorage --- components/script/dom/webglrenderbuffer.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index feac4eed416..a672f9faa72 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -95,11 +95,14 @@ impl WebGLRenderbuffer { // validation. match internal_format { constants::RGBA4 | - constants::DEPTH_STENCIL | + constants::RGB565 | + constants::RGB5_A1 | constants::DEPTH_COMPONENT16 | - constants::STENCIL_INDEX8 => - self.internal_format.set(Some(internal_format)), - + constants::STENCIL_INDEX8 | + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#6.7 + constants::DEPTH_STENCIL => { + self.internal_format.set(Some(internal_format)) + } _ => return Err(WebGLError::InvalidEnum), }; -- cgit v1.2.3 From ef7d495838f039111459a93bc5c9816f22062a2e Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Mon, 9 Jul 2018 10:32:09 +0200 Subject: Properly implement the checks for gl.renderbufferStorage (fixes #20563) --- components/script/dom/webglrenderbuffer.rs | 2 -- 1 file changed, 2 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index a672f9faa72..9e21d78fe5a 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -106,8 +106,6 @@ impl WebGLRenderbuffer { _ => return Err(WebGLError::InvalidEnum), }; - // FIXME: Check that w/h are < MAX_RENDERBUFFER_SIZE - // FIXME: Invalidate completeness after the call let msg = WebGLCommand::RenderbufferStorage(constants::RENDERBUFFER, internal_format, width, height); -- cgit v1.2.3 From 661e258b28fd7dcc92ab233f66bf49c061542865 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Tue, 24 Jul 2018 13:27:33 +0200 Subject: Store a reference to the WebGLRenderingContext in WebGLObject --- components/script/dom/webglrenderbuffer.rs | 59 +++++++++++++++--------------- 1 file changed, 30 insertions(+), 29 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 9e21d78fe5a..1074f9797e0 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -3,13 +3,14 @@ * 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::webgl::{webgl_channel, WebGLCommand, WebGLError, WebGLMsgSender, WebGLRenderbufferId, WebGLResult}; +use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult}; use dom::bindings::codegen::Bindings::WebGLRenderbufferBinding; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; -use dom::bindings::reflector::reflect_dom_object; +use dom::bindings::inheritance::Castable; +use dom::bindings::reflector::{DomObject, reflect_dom_object}; use dom::bindings::root::DomRoot; use dom::webglobject::WebGLObject; -use dom::window::Window; +use dom::webglrenderingcontext::WebGLRenderingContext; use dom_struct::dom_struct; use std::cell::Cell; @@ -21,41 +22,32 @@ pub struct WebGLRenderbuffer { is_deleted: Cell, size: Cell>, internal_format: Cell>, - #[ignore_malloc_size_of = "Defined in ipc-channel"] - renderer: WebGLMsgSender, } impl WebGLRenderbuffer { - fn new_inherited(renderer: WebGLMsgSender, - id: WebGLRenderbufferId) - -> WebGLRenderbuffer { - WebGLRenderbuffer { - webgl_object: WebGLObject::new_inherited(), + fn new_inherited(context: &WebGLRenderingContext, id: WebGLRenderbufferId) -> Self { + Self { + webgl_object: WebGLObject::new_inherited(context), id: id, ever_bound: Cell::new(false), is_deleted: Cell::new(false), - renderer: renderer, internal_format: Cell::new(None), size: Cell::new(None), } } - pub fn maybe_new(window: &Window, renderer: WebGLMsgSender) - -> Option> { + pub fn maybe_new(context: &WebGLRenderingContext) -> Option> { let (sender, receiver) = webgl_channel().unwrap(); - renderer.send(WebGLCommand::CreateRenderbuffer(sender)).unwrap(); - - let result = receiver.recv().unwrap(); - result.map(|renderbuffer_id| WebGLRenderbuffer::new(window, renderer, renderbuffer_id)) + context.send_command(WebGLCommand::CreateRenderbuffer(sender)); + receiver.recv().unwrap().map(|id| WebGLRenderbuffer::new(context, id)) } - pub fn new(window: &Window, - renderer: WebGLMsgSender, - id: WebGLRenderbufferId) - -> DomRoot { - reflect_dom_object(Box::new(WebGLRenderbuffer::new_inherited(renderer, id)), - window, - WebGLRenderbufferBinding::Wrap) + pub fn new(context: &WebGLRenderingContext, id: WebGLRenderbufferId) -> DomRoot { + reflect_dom_object( + Box::new(WebGLRenderbuffer::new_inherited(context, id)), + &*context.global(), + WebGLRenderbufferBinding::Wrap, + ) } } @@ -71,14 +63,17 @@ impl WebGLRenderbuffer { pub fn bind(&self, target: u32) { self.ever_bound.set(true); - let msg = WebGLCommand::BindRenderbuffer(target, Some(self.id)); - self.renderer.send(msg).unwrap(); + self.upcast::() + .context() + .send_command(WebGLCommand::BindRenderbuffer(target, Some(self.id))); } pub fn delete(&self) { if !self.is_deleted.get() { self.is_deleted.set(true); - let _ = self.renderer.send(WebGLCommand::DeleteRenderbuffer(self.id)); + self.upcast::() + .context() + .send_command(WebGLCommand::DeleteRenderbuffer(self.id)); } } @@ -108,8 +103,14 @@ impl WebGLRenderbuffer { // FIXME: Invalidate completeness after the call - let msg = WebGLCommand::RenderbufferStorage(constants::RENDERBUFFER, internal_format, width, height); - self.renderer.send(msg).unwrap(); + self.upcast::().context().send_command( + WebGLCommand::RenderbufferStorage( + constants::RENDERBUFFER, + internal_format, + width, + height, + ) + ); self.size.set(Some((width, height))); -- cgit v1.2.3 From 03eb7e4dd2c36265319440db38100ba9aa92e182 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 1 Aug 2018 15:40:53 -0400 Subject: webgl: Emulate some renderbuffer formats in non-GLES. --- components/script/dom/webglrenderbuffer.rs | 33 +++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 1074f9797e0..fa7d7324f94 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -4,13 +4,14 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult}; +use dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextConstants as WebGl2Constants; use dom::bindings::codegen::Bindings::WebGLRenderbufferBinding; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use dom::bindings::inheritance::Castable; use dom::bindings::reflector::{DomObject, reflect_dom_object}; use dom::bindings::root::DomRoot; use dom::webglobject::WebGLObject; -use dom::webglrenderingcontext::WebGLRenderingContext; +use dom::webglrenderingcontext::{WebGLRenderingContext, is_gles}; use dom_struct::dom_struct; use std::cell::Cell; @@ -61,6 +62,10 @@ impl WebGLRenderbuffer { self.size.get() } + pub fn internal_format(&self) -> u32 { + self.internal_format.get().unwrap_or(constants::RGBA4) + } + pub fn bind(&self, target: u32) { self.ever_bound.set(true); self.upcast::() @@ -88,25 +93,39 @@ impl WebGLRenderbuffer { pub fn storage(&self, internal_format: u32, width: i32, height: i32) -> WebGLResult<()> { // Validate the internal_format, and save it for completeness // validation. - match internal_format { + let actual_format = match internal_format { constants::RGBA4 | - constants::RGB565 | - constants::RGB5_A1 | constants::DEPTH_COMPONENT16 | constants::STENCIL_INDEX8 | // https://www.khronos.org/registry/webgl/specs/latest/1.0/#6.7 - constants::DEPTH_STENCIL => { - self.internal_format.set(Some(internal_format)) + constants::DEPTH_STENCIL => internal_format, + constants::RGB5_A1 => { + // 16-bit RGBA formats are not supported on desktop GL. + if is_gles() { + constants::RGB5_A1 + } else { + WebGl2Constants::RGBA8 + } + } + constants::RGB565 => { + // RGB565 is not supported on desktop GL. + if is_gles() { + constants::RGB565 + } else { + WebGl2Constants::RGB8 + } } _ => return Err(WebGLError::InvalidEnum), }; + self.internal_format.set(Some(internal_format)); + // FIXME: Invalidate completeness after the call self.upcast::().context().send_command( WebGLCommand::RenderbufferStorage( constants::RENDERBUFFER, - internal_format, + actual_format, width, height, ) -- cgit v1.2.3 From 1b08dd523274b1fb346b413cb986cd47409f3aa7 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Fri, 24 Aug 2018 13:43:32 -0400 Subject: webgl: Move framebuffer initialization logic to WebGL thread. --- components/script/dom/webglrenderbuffer.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index fa7d7324f94..f346407581f 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -23,6 +23,7 @@ pub struct WebGLRenderbuffer { is_deleted: Cell, size: Cell>, internal_format: Cell>, + is_initialized: Cell, } impl WebGLRenderbuffer { @@ -34,6 +35,7 @@ impl WebGLRenderbuffer { is_deleted: Cell::new(false), internal_format: Cell::new(None), size: Cell::new(None), + is_initialized: Cell::new(false), } } @@ -66,6 +68,14 @@ impl WebGLRenderbuffer { self.internal_format.get().unwrap_or(constants::RGBA4) } + pub fn mark_initialized(&self) { + self.is_initialized.set(true); + } + + pub fn is_initialized(&self) -> bool { + self.is_initialized.get() + } + pub fn bind(&self, target: u32) { self.ever_bound.set(true); self.upcast::() -- cgit v1.2.3 From bb8d9ba74c024a317fbbd49811541632404ef51c Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Fri, 24 Aug 2018 16:10:28 -0400 Subject: webgl: Ensure that depth and stencil attachments are rebound after messing with DEPTH_STENCIL attachments. --- components/script/dom/webglrenderbuffer.rs | 44 +++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index f346407581f..7ee108ebdc5 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -4,12 +4,14 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult}; +use dom::bindings::cell::DomRefCell; use dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextConstants as WebGl2Constants; use dom::bindings::codegen::Bindings::WebGLRenderbufferBinding; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use dom::bindings::inheritance::Castable; use dom::bindings::reflector::{DomObject, reflect_dom_object}; -use dom::bindings::root::DomRoot; +use dom::bindings::root::{DomRoot, Dom}; +use dom::webglframebuffer::WebGLFramebuffer; use dom::webglobject::WebGLObject; use dom::webglrenderingcontext::{WebGLRenderingContext, is_gles}; use dom_struct::dom_struct; @@ -24,6 +26,8 @@ pub struct WebGLRenderbuffer { size: Cell>, internal_format: Cell>, is_initialized: Cell, + // Framebuffer that this texture is attached to. + attached_framebuffers: DomRefCell>>, } impl WebGLRenderbuffer { @@ -36,6 +40,7 @@ impl WebGLRenderbuffer { internal_format: Cell::new(None), size: Cell::new(None), is_initialized: Cell::new(false), + attached_framebuffers: Default::default(), } } @@ -86,6 +91,29 @@ impl WebGLRenderbuffer { pub fn delete(&self) { if !self.is_deleted.get() { self.is_deleted.set(true); + + /* + If a renderbuffer object is deleted while its image is attached to the currently + bound framebuffer, then it is as if FramebufferRenderbuffer had been called, with + a renderbuffer of 0, for each attachment point to which this image was attached + in the currently bound framebuffer. + - GLES 2.0, 4.4.3, "Attaching Renderbuffer Images to a Framebuffer" + */ + let currently_bound_framebuffer = + self.upcast::() + .context() + .bound_framebuffer() + .map_or(0, |fb| fb.id().get()); + let current_framebuffer = + self.attached_framebuffers + .borrow() + .iter() + .position(|fb| fb.id().get() == currently_bound_framebuffer); + if let Some(fb_index) = current_framebuffer { + self.attached_framebuffers.borrow()[fb_index].detach_renderbuffer(self); + self.attached_framebuffers.borrow_mut().remove(fb_index); + } + self.upcast::() .context() .send_command(WebGLCommand::DeleteRenderbuffer(self.id)); @@ -145,4 +173,18 @@ impl WebGLRenderbuffer { Ok(()) } + + pub fn attach(&self, framebuffer: &WebGLFramebuffer) { + self.attached_framebuffers.borrow_mut().push(Dom::from_ref(framebuffer)); + } + + pub fn unattach(&self, fb: &WebGLFramebuffer) { + let mut attached_framebuffers = self.attached_framebuffers.borrow_mut(); + let idx = attached_framebuffers.iter().position(|attached| { + attached.id() == fb.id() + }); + if let Some(idx) = idx { + attached_framebuffers.remove(idx); + } + } } -- cgit v1.2.3 From 8ede221a83bf751eea8520b3431c1f222ecfbdea Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Fri, 31 Aug 2018 10:16:57 -0400 Subject: webgl: Ensure that renderbuffers have been bound before attaching to a framebuffer. --- components/script/dom/webglrenderbuffer.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 7ee108ebdc5..9637dae02e1 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -174,8 +174,12 @@ impl WebGLRenderbuffer { Ok(()) } - pub fn attach(&self, framebuffer: &WebGLFramebuffer) { + pub fn attach(&self, framebuffer: &WebGLFramebuffer) -> WebGLResult<()> { + if !self.ever_bound.get() { + return Err(WebGLError::InvalidOperation); + } self.attached_framebuffers.borrow_mut().push(Dom::from_ref(framebuffer)); + Ok(()) } pub fn unattach(&self, fb: &WebGLFramebuffer) { -- cgit v1.2.3 From 4edb7b194c99a1d394dddaeac2f5064ed8e93f62 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Mon, 10 Sep 2018 16:27:58 -0400 Subject: webgl: Remove knowledge of attached framebuffers from renderbuffers and textures. --- components/script/dom/webglrenderbuffer.rs | 38 ++++-------------------------- 1 file changed, 4 insertions(+), 34 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 9637dae02e1..96ef3bb0d67 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -4,14 +4,12 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult}; -use dom::bindings::cell::DomRefCell; use dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextConstants as WebGl2Constants; use dom::bindings::codegen::Bindings::WebGLRenderbufferBinding; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use dom::bindings::inheritance::Castable; use dom::bindings::reflector::{DomObject, reflect_dom_object}; -use dom::bindings::root::{DomRoot, Dom}; -use dom::webglframebuffer::WebGLFramebuffer; +use dom::bindings::root::DomRoot; use dom::webglobject::WebGLObject; use dom::webglrenderingcontext::{WebGLRenderingContext, is_gles}; use dom_struct::dom_struct; @@ -26,8 +24,6 @@ pub struct WebGLRenderbuffer { size: Cell>, internal_format: Cell>, is_initialized: Cell, - // Framebuffer that this texture is attached to. - attached_framebuffers: DomRefCell>>, } impl WebGLRenderbuffer { @@ -40,7 +36,6 @@ impl WebGLRenderbuffer { internal_format: Cell::new(None), size: Cell::new(None), is_initialized: Cell::new(false), - attached_framebuffers: Default::default(), } } @@ -102,16 +97,9 @@ impl WebGLRenderbuffer { let currently_bound_framebuffer = self.upcast::() .context() - .bound_framebuffer() - .map_or(0, |fb| fb.id().get()); - let current_framebuffer = - self.attached_framebuffers - .borrow() - .iter() - .position(|fb| fb.id().get() == currently_bound_framebuffer); - if let Some(fb_index) = current_framebuffer { - self.attached_framebuffers.borrow()[fb_index].detach_renderbuffer(self); - self.attached_framebuffers.borrow_mut().remove(fb_index); + .bound_framebuffer(); + if let Some(fb) = currently_bound_framebuffer { + fb.detach_renderbuffer(self); } self.upcast::() @@ -173,22 +161,4 @@ impl WebGLRenderbuffer { Ok(()) } - - pub fn attach(&self, framebuffer: &WebGLFramebuffer) -> WebGLResult<()> { - if !self.ever_bound.get() { - return Err(WebGLError::InvalidOperation); - } - self.attached_framebuffers.borrow_mut().push(Dom::from_ref(framebuffer)); - Ok(()) - } - - pub fn unattach(&self, fb: &WebGLFramebuffer) { - let mut attached_framebuffers = self.attached_framebuffers.borrow_mut(); - let idx = attached_framebuffers.iter().position(|attached| { - attached.id() == fb.id() - }); - if let Some(idx) = idx { - attached_framebuffers.remove(idx); - } - } } -- cgit v1.2.3 From 59b8f971b57e2f29b7511fdc9ac9a2bdb6715e60 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Mon, 10 Sep 2018 19:27:15 -0400 Subject: webgl: Mark framebuffers as uninitialized when their attached renderbuffer's storage changes. --- components/script/dom/webglrenderbuffer.rs | 1 + 1 file changed, 1 insertion(+) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 96ef3bb0d67..60cc25ed8f8 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -145,6 +145,7 @@ impl WebGLRenderbuffer { }; self.internal_format.set(Some(internal_format)); + self.is_initialized.set(false); // FIXME: Invalidate completeness after the call -- cgit v1.2.3 From c37a345dc9f4dda6ea29c42f96f6c7201c42cbac Mon Sep 17 00:00:00 2001 From: chansuke Date: Tue, 18 Sep 2018 23:24:15 +0900 Subject: Format script component --- components/script/dom/webglrenderbuffer.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 60cc25ed8f8..fd85a1b3ec7 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -42,7 +42,10 @@ impl WebGLRenderbuffer { pub fn maybe_new(context: &WebGLRenderingContext) -> Option> { let (sender, receiver) = webgl_channel().unwrap(); context.send_command(WebGLCommand::CreateRenderbuffer(sender)); - receiver.recv().unwrap().map(|id| WebGLRenderbuffer::new(context, id)) + receiver + .recv() + .unwrap() + .map(|id| WebGLRenderbuffer::new(context, id)) } pub fn new(context: &WebGLRenderingContext, id: WebGLRenderbufferId) -> DomRoot { @@ -54,7 +57,6 @@ impl WebGLRenderbuffer { } } - impl WebGLRenderbuffer { pub fn id(&self) -> WebGLRenderbufferId { self.id @@ -95,9 +97,7 @@ impl WebGLRenderbuffer { - GLES 2.0, 4.4.3, "Attaching Renderbuffer Images to a Framebuffer" */ let currently_bound_framebuffer = - self.upcast::() - .context() - .bound_framebuffer(); + self.upcast::().context().bound_framebuffer(); if let Some(fb) = currently_bound_framebuffer { fb.detach_renderbuffer(self); } @@ -149,14 +149,14 @@ impl WebGLRenderbuffer { // FIXME: Invalidate completeness after the call - self.upcast::().context().send_command( - WebGLCommand::RenderbufferStorage( + self.upcast::() + .context() + .send_command(WebGLCommand::RenderbufferStorage( constants::RENDERBUFFER, actual_format, width, height, - ) - ); + )); self.size.set(Some((width, height))); -- cgit v1.2.3 From 2ea6e9c8131bdd4a9915436a42d9bba2548b475c Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Fri, 21 Sep 2018 18:40:49 -0400 Subject: webgl: Use standard texture format for WebGL-specific DEPTH_STENCIL format. --- components/script/dom/webglrenderbuffer.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index fd85a1b3ec7..9165284257c 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -122,9 +122,9 @@ impl WebGLRenderbuffer { let actual_format = match internal_format { constants::RGBA4 | constants::DEPTH_COMPONENT16 | - constants::STENCIL_INDEX8 | - // https://www.khronos.org/registry/webgl/specs/latest/1.0/#6.7 - constants::DEPTH_STENCIL => internal_format, + constants::STENCIL_INDEX8 => internal_format, + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#6.8 + constants::DEPTH_STENCIL => WebGl2Constants::DEPTH24_STENCIL8, constants::RGB5_A1 => { // 16-bit RGBA formats are not supported on desktop GL. if is_gles() { -- cgit v1.2.3 From 3511e5209241f3029478173eee23f4f682a0a4d2 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Tue, 16 Oct 2018 11:15:49 +0200 Subject: Implement Drop for WebGLRenderbuffer --- components/script/dom/webglrenderbuffer.rs | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 9165284257c..edfed388c39 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -163,3 +163,9 @@ impl WebGLRenderbuffer { Ok(()) } } + +impl Drop for WebGLRenderbuffer { + fn drop(&mut self) { + self.delete(); + } +} -- cgit v1.2.3 From 8828925f4f2be35b8996a8db1acc85d5f063144c Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Tue, 16 Oct 2018 17:08:15 +0200 Subject: Properly support gl_PointSize and gl_PointCoord Fixes #21719. Fixes #20993. Fixes #20992. Fixes #21007. Fixes #20979. --- components/script/dom/webglrenderbuffer.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index edfed388c39..7b9863257de 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.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::webgl::{webgl_channel, WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult}; +use canvas_traits::webgl::{WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult, is_gles, webgl_channel}; use dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextConstants as WebGl2Constants; use dom::bindings::codegen::Bindings::WebGLRenderbufferBinding; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; @@ -11,7 +11,7 @@ use dom::bindings::inheritance::Castable; use dom::bindings::reflector::{DomObject, reflect_dom_object}; use dom::bindings::root::DomRoot; use dom::webglobject::WebGLObject; -use dom::webglrenderingcontext::{WebGLRenderingContext, is_gles}; +use dom::webglrenderingcontext::WebGLRenderingContext; use dom_struct::dom_struct; use std::cell::Cell; -- cgit v1.2.3 From e31462c37c2305a8e88e5d27901299ff76d7a853 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Mon, 10 Sep 2018 12:10:27 -0400 Subject: Implement WEBGL_color_buffer_float and EXT_color_buffer_half_float (fixes #22113) --- components/script/dom/webglrenderbuffer.rs | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 7b9863257de..2447ef28c09 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -4,7 +4,9 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl use canvas_traits::webgl::{WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult, is_gles, webgl_channel}; -use dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextConstants as WebGl2Constants; +use dom::bindings::codegen::Bindings::EXTColorBufferHalfFloatBinding::EXTColorBufferHalfFloatConstants; +use dom::bindings::codegen::Bindings::WEBGLColorBufferFloatBinding::WEBGLColorBufferFloatConstants; +use dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextConstants; use dom::bindings::codegen::Bindings::WebGLRenderbufferBinding; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use dom::bindings::inheritance::Castable; @@ -124,13 +126,13 @@ impl WebGLRenderbuffer { constants::DEPTH_COMPONENT16 | constants::STENCIL_INDEX8 => internal_format, // https://www.khronos.org/registry/webgl/specs/latest/1.0/#6.8 - constants::DEPTH_STENCIL => WebGl2Constants::DEPTH24_STENCIL8, + constants::DEPTH_STENCIL => WebGL2RenderingContextConstants::DEPTH24_STENCIL8, constants::RGB5_A1 => { // 16-bit RGBA formats are not supported on desktop GL. if is_gles() { constants::RGB5_A1 } else { - WebGl2Constants::RGBA8 + WebGL2RenderingContextConstants::RGBA8 } } constants::RGB565 => { @@ -138,17 +140,28 @@ impl WebGLRenderbuffer { if is_gles() { constants::RGB565 } else { - WebGl2Constants::RGB8 + WebGL2RenderingContextConstants::RGB8 } } + EXTColorBufferHalfFloatConstants::RGBA16F_EXT | + EXTColorBufferHalfFloatConstants::RGB16F_EXT => { + if !self.upcast().context().extension_manager().is_half_float_buffer_renderable() { + return Err(WebGLError::InvalidEnum); + } + internal_format + }, + WEBGLColorBufferFloatConstants::RGBA32F_EXT => { + if !self.upcast().context().extension_manager().is_float_buffer_renderable() { + return Err(WebGLError::InvalidEnum); + } + internal_format + }, _ => return Err(WebGLError::InvalidEnum), }; self.internal_format.set(Some(internal_format)); self.is_initialized.set(false); - // FIXME: Invalidate completeness after the call - self.upcast::() .context() .send_command(WebGLCommand::RenderbufferStorage( -- cgit v1.2.3 From 45f7199eee82c66637ec68287eafa40a651001c4 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 1 Nov 2018 23:45:06 +0100 Subject: `cargo fix --edition` --- components/script/dom/webglrenderbuffer.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 2447ef28c09..7176194e6a9 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -4,16 +4,16 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl use canvas_traits::webgl::{WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult, is_gles, webgl_channel}; -use dom::bindings::codegen::Bindings::EXTColorBufferHalfFloatBinding::EXTColorBufferHalfFloatConstants; -use dom::bindings::codegen::Bindings::WEBGLColorBufferFloatBinding::WEBGLColorBufferFloatConstants; -use dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextConstants; -use dom::bindings::codegen::Bindings::WebGLRenderbufferBinding; -use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; -use dom::bindings::inheritance::Castable; -use dom::bindings::reflector::{DomObject, reflect_dom_object}; -use dom::bindings::root::DomRoot; -use dom::webglobject::WebGLObject; -use dom::webglrenderingcontext::WebGLRenderingContext; +use crate::dom::bindings::codegen::Bindings::EXTColorBufferHalfFloatBinding::EXTColorBufferHalfFloatConstants; +use crate::dom::bindings::codegen::Bindings::WEBGLColorBufferFloatBinding::WEBGLColorBufferFloatConstants; +use crate::dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextConstants; +use crate::dom::bindings::codegen::Bindings::WebGLRenderbufferBinding; +use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; +use crate::dom::bindings::inheritance::Castable; +use crate::dom::bindings::reflector::{DomObject, reflect_dom_object}; +use crate::dom::bindings::root::DomRoot; +use crate::dom::webglobject::WebGLObject; +use crate::dom::webglrenderingcontext::WebGLRenderingContext; use dom_struct::dom_struct; use std::cell::Cell; -- cgit v1.2.3 From cb07debcb6f3d3561177ce536c320986720791b7 Mon Sep 17 00:00:00 2001 From: Pyfisch Date: Tue, 6 Nov 2018 13:01:35 +0100 Subject: Format remaining files --- components/script/dom/webglrenderbuffer.rs | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 7176194e6a9..616bfc353e3 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -122,9 +122,9 @@ impl WebGLRenderbuffer { // Validate the internal_format, and save it for completeness // validation. let actual_format = match internal_format { - constants::RGBA4 | - constants::DEPTH_COMPONENT16 | - constants::STENCIL_INDEX8 => internal_format, + constants::RGBA4 | constants::DEPTH_COMPONENT16 | constants::STENCIL_INDEX8 => { + internal_format + }, // https://www.khronos.org/registry/webgl/specs/latest/1.0/#6.8 constants::DEPTH_STENCIL => WebGL2RenderingContextConstants::DEPTH24_STENCIL8, constants::RGB5_A1 => { @@ -134,7 +134,7 @@ impl WebGLRenderbuffer { } else { WebGL2RenderingContextConstants::RGBA8 } - } + }, constants::RGB565 => { // RGB565 is not supported on desktop GL. if is_gles() { @@ -142,16 +142,26 @@ impl WebGLRenderbuffer { } else { WebGL2RenderingContextConstants::RGB8 } - } + }, EXTColorBufferHalfFloatConstants::RGBA16F_EXT | EXTColorBufferHalfFloatConstants::RGB16F_EXT => { - if !self.upcast().context().extension_manager().is_half_float_buffer_renderable() { + if !self + .upcast() + .context() + .extension_manager() + .is_half_float_buffer_renderable() + { return Err(WebGLError::InvalidEnum); } internal_format }, WEBGLColorBufferFloatConstants::RGBA32F_EXT => { - if !self.upcast().context().extension_manager().is_float_buffer_renderable() { + if !self + .upcast() + .context() + .extension_manager() + .is_float_buffer_renderable() + { return Err(WebGLError::InvalidEnum); } internal_format -- cgit v1.2.3 From 9e92eb205a2a12fe0be883e42cb7f82deebc9031 Mon Sep 17 00:00:00 2001 From: Pyfisch Date: Tue, 6 Nov 2018 20:38:02 +0100 Subject: Reorder imports --- components/script/dom/webglrenderbuffer.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 616bfc353e3..4e29172c070 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -3,14 +3,16 @@ * 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::webgl::{WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult, is_gles, webgl_channel}; +use canvas_traits::webgl::{ + is_gles, webgl_channel, WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult, +}; use crate::dom::bindings::codegen::Bindings::EXTColorBufferHalfFloatBinding::EXTColorBufferHalfFloatConstants; use crate::dom::bindings::codegen::Bindings::WEBGLColorBufferFloatBinding::WEBGLColorBufferFloatConstants; use crate::dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextConstants; use crate::dom::bindings::codegen::Bindings::WebGLRenderbufferBinding; use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::{DomObject, reflect_dom_object}; +use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; use crate::dom::bindings::root::DomRoot; use crate::dom::webglobject::WebGLObject; use crate::dom::webglrenderingcontext::WebGLRenderingContext; -- cgit v1.2.3 From a1a14459c141afc6ac6771b8a6c9ca374537edf2 Mon Sep 17 00:00:00 2001 From: Jan Andre Ikenmeyer Date: Mon, 19 Nov 2018 14:47:12 +0100 Subject: Update MPL license to https (part 3) --- components/script/dom/webglrenderbuffer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 4e29172c070..663b729286d 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -1,6 +1,6 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl use canvas_traits::webgl::{ -- cgit v1.2.3 From be69f9c3e6a6f5efb5ba1edd50955cb12c111bf8 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 14 Dec 2018 08:31:30 +0100 Subject: Rustfmt has changed its default style :/ --- components/script/dom/webglrenderbuffer.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 663b729286d..d1387b277aa 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -3,9 +3,6 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl -use canvas_traits::webgl::{ - is_gles, webgl_channel, WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult, -}; use crate::dom::bindings::codegen::Bindings::EXTColorBufferHalfFloatBinding::EXTColorBufferHalfFloatConstants; use crate::dom::bindings::codegen::Bindings::WEBGLColorBufferFloatBinding::WEBGLColorBufferFloatConstants; use crate::dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextConstants; @@ -16,6 +13,9 @@ use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; use crate::dom::bindings::root::DomRoot; use crate::dom::webglobject::WebGLObject; use crate::dom::webglrenderingcontext::WebGLRenderingContext; +use canvas_traits::webgl::{ + is_gles, webgl_channel, WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult, +}; use dom_struct::dom_struct; use std::cell::Cell; -- cgit v1.2.3 From dbaed5ed9276843ae3aa10f8671f65db839b7ffe Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 10 Jul 2019 17:34:16 -0400 Subject: Make GL/GLES decisions based on the API in use. --- components/script/dom/webglrenderbuffer.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index d1387b277aa..459b76466e3 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -14,7 +14,7 @@ use crate::dom::bindings::root::DomRoot; use crate::dom::webglobject::WebGLObject; use crate::dom::webglrenderingcontext::WebGLRenderingContext; use canvas_traits::webgl::{ - is_gles, webgl_channel, WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult, + webgl_channel, GlType, WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult, }; use dom_struct::dom_struct; use std::cell::Cell; @@ -120,7 +120,15 @@ impl WebGLRenderbuffer { self.ever_bound.get() } - pub fn storage(&self, internal_format: u32, width: i32, height: i32) -> WebGLResult<()> { + pub fn storage( + &self, + api_type: GlType, + internal_format: u32, + width: i32, + height: i32, + ) -> WebGLResult<()> { + let is_gles = api_type == GlType::Gles; + // Validate the internal_format, and save it for completeness // validation. let actual_format = match internal_format { @@ -131,7 +139,7 @@ impl WebGLRenderbuffer { constants::DEPTH_STENCIL => WebGL2RenderingContextConstants::DEPTH24_STENCIL8, constants::RGB5_A1 => { // 16-bit RGBA formats are not supported on desktop GL. - if is_gles() { + if is_gles { constants::RGB5_A1 } else { WebGL2RenderingContextConstants::RGBA8 @@ -139,7 +147,7 @@ impl WebGLRenderbuffer { }, constants::RGB565 => { // RGB565 is not supported on desktop GL. - if is_gles() { + if is_gles { constants::RGB565 } else { WebGL2RenderingContextConstants::RGB8 -- cgit v1.2.3 From 8f5c37c0b5011fa526f2b932bf7abb0bca8a7fd0 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Mon, 29 Jul 2019 10:05:48 -0400 Subject: Don't panic if WebGL thread can't be reached during finalization. --- components/script/dom/webglrenderbuffer.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 459b76466e3..f210b579e88 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -89,7 +89,7 @@ impl WebGLRenderbuffer { .send_command(WebGLCommand::BindRenderbuffer(target, Some(self.id))); } - pub fn delete(&self) { + pub fn delete(&self, fallible: bool) { if !self.is_deleted.get() { self.is_deleted.set(true); @@ -106,9 +106,13 @@ impl WebGLRenderbuffer { fb.detach_renderbuffer(self); } - self.upcast::() - .context() - .send_command(WebGLCommand::DeleteRenderbuffer(self.id)); + let context = self.upcast::().context(); + let cmd = WebGLCommand::DeleteRenderbuffer(self.id); + if fallible { + context.send_command_ignored(cmd); + } else { + context.send_command(cmd); + } } } @@ -199,6 +203,6 @@ impl WebGLRenderbuffer { impl Drop for WebGLRenderbuffer { fn drop(&mut self) { - self.delete(); + self.delete(true); } } -- cgit v1.2.3 From ea715a7a4cae5d2a2f41b059f36e08010d544de1 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Fri, 20 Sep 2019 01:28:06 -0400 Subject: webgl: Update framebuffer completion status when attached renderbuffer/texture storage changes. --- components/script/dom/webglrenderbuffer.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index f210b579e88..07afdbccb44 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -10,7 +10,8 @@ use crate::dom::bindings::codegen::Bindings::WebGLRenderbufferBinding; use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; -use crate::dom::bindings::root::DomRoot; +use crate::dom::bindings::root::{DomRoot, MutNullableDom}; +use crate::dom::webglframebuffer::WebGLFramebuffer; use crate::dom::webglobject::WebGLObject; use crate::dom::webglrenderingcontext::WebGLRenderingContext; use canvas_traits::webgl::{ @@ -28,6 +29,7 @@ pub struct WebGLRenderbuffer { size: Cell>, internal_format: Cell>, is_initialized: Cell, + attached_framebuffer: MutNullableDom, } impl WebGLRenderbuffer { @@ -40,6 +42,7 @@ impl WebGLRenderbuffer { internal_format: Cell::new(None), size: Cell::new(None), is_initialized: Cell::new(false), + attached_framebuffer: Default::default(), } } @@ -186,6 +189,10 @@ impl WebGLRenderbuffer { self.internal_format.set(Some(internal_format)); self.is_initialized.set(false); + if let Some(fb) = self.attached_framebuffer.get() { + fb.update_status(); + } + self.upcast::() .context() .send_command(WebGLCommand::RenderbufferStorage( @@ -199,6 +206,14 @@ impl WebGLRenderbuffer { Ok(()) } + + pub fn attach_to_framebuffer(&self, fb: &WebGLFramebuffer) { + self.attached_framebuffer.set(Some(fb)); + } + + pub fn detach_from_framebuffer(&self) { + self.attached_framebuffer.set(None); + } } impl Drop for WebGLRenderbuffer { -- cgit v1.2.3 From a358bca7667a2da42024aca4ef619dad6d812862 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Tue, 15 Oct 2019 12:57:00 -0500 Subject: Use surfman for managing GL surfaces Co-authored-by: Alan Jeffrey Co-authored-by: Zakor Gyula Co-authored-by: Josh Matthews --- components/script/dom/webglrenderbuffer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 07afdbccb44..ca75f83c336 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -106,7 +106,7 @@ impl WebGLRenderbuffer { let currently_bound_framebuffer = self.upcast::().context().bound_framebuffer(); if let Some(fb) = currently_bound_framebuffer { - fb.detach_renderbuffer(self); + let _ = fb.detach_renderbuffer(self); } let context = self.upcast::().context(); -- cgit v1.2.3 From 796ee705976f8072032a0fc88579ca18aed85999 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Fri, 14 Feb 2020 11:57:11 +0100 Subject: Add initial support for WebGL2 read framebuffer Adds support for binding to the read framebuffer slot and querying its status. --- components/script/dom/webglrenderbuffer.rs | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index ca75f83c336..8c8164f6243 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -96,20 +96,24 @@ impl WebGLRenderbuffer { if !self.is_deleted.get() { self.is_deleted.set(true); + let context = self.upcast::().context(); + /* - If a renderbuffer object is deleted while its image is attached to the currently - bound framebuffer, then it is as if FramebufferRenderbuffer had been called, with - a renderbuffer of 0, for each attachment point to which this image was attached - in the currently bound framebuffer. - - GLES 2.0, 4.4.3, "Attaching Renderbuffer Images to a Framebuffer" - */ - let currently_bound_framebuffer = - self.upcast::().context().bound_framebuffer(); - if let Some(fb) = currently_bound_framebuffer { + If a renderbuffer object is deleted while its image is attached to one or more + attachment points in a currently bound framebuffer object, then it is as if + FramebufferRenderbuffer had been called, with a renderbuffer of zero, for each + attachment point to which this image was attached in that framebuffer object. + In other words,the renderbuffer image is first detached from all attachment points + in that frame-buffer object. + - GLES 3.0, 4.4.2.3, "Attaching Renderbuffer Images to a Framebuffer" + */ + if let Some(fb) = context.get_draw_framebuffer_slot().get() { + let _ = fb.detach_renderbuffer(self); + } + if let Some(fb) = context.get_read_framebuffer_slot().get() { let _ = fb.detach_renderbuffer(self); } - let context = self.upcast::().context(); let cmd = WebGLCommand::DeleteRenderbuffer(self.id); if fallible { context.send_command_ignored(cmd); -- cgit v1.2.3 From b41805a9206f940737c2644f73d975ae35e38f99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Thu, 20 Feb 2020 13:32:38 +0100 Subject: Add support for WebGL2 framebuffer attachments Adds an initial implementation for the framebuffer attachments introduced with WebGL2 and the related enums and constrains checks. --- components/script/dom/webglrenderbuffer.rs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 8c8164f6243..9c173d20241 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -5,9 +5,8 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl use crate::dom::bindings::codegen::Bindings::EXTColorBufferHalfFloatBinding::EXTColorBufferHalfFloatConstants; use crate::dom::bindings::codegen::Bindings::WEBGLColorBufferFloatBinding::WEBGLColorBufferFloatConstants; -use crate::dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextConstants; +use crate::dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextConstants as constants; use crate::dom::bindings::codegen::Bindings::WebGLRenderbufferBinding; -use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; @@ -15,7 +14,7 @@ use crate::dom::webglframebuffer::WebGLFramebuffer; use crate::dom::webglobject::WebGLObject; use crate::dom::webglrenderingcontext::WebGLRenderingContext; use canvas_traits::webgl::{ - webgl_channel, GlType, WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult, + webgl_channel, GlType, WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult, WebGLVersion, }; use dom_struct::dom_struct; use std::cell::Cell; @@ -146,14 +145,21 @@ impl WebGLRenderbuffer { constants::RGBA4 | constants::DEPTH_COMPONENT16 | constants::STENCIL_INDEX8 => { internal_format }, + constants::DEPTH_COMPONENT24 | + constants::DEPTH_COMPONENT32F | + constants::DEPTH24_STENCIL8 | + constants::DEPTH32F_STENCIL8 => match self.upcast().context().webgl_version() { + WebGLVersion::WebGL1 => return Err(WebGLError::InvalidEnum), + _ => internal_format, + }, // https://www.khronos.org/registry/webgl/specs/latest/1.0/#6.8 - constants::DEPTH_STENCIL => WebGL2RenderingContextConstants::DEPTH24_STENCIL8, + constants::DEPTH_STENCIL => constants::DEPTH24_STENCIL8, constants::RGB5_A1 => { // 16-bit RGBA formats are not supported on desktop GL. if is_gles { constants::RGB5_A1 } else { - WebGL2RenderingContextConstants::RGBA8 + constants::RGBA8 } }, constants::RGB565 => { @@ -161,7 +167,7 @@ impl WebGLRenderbuffer { if is_gles { constants::RGB565 } else { - WebGL2RenderingContextConstants::RGB8 + constants::RGB8 } }, EXTColorBufferHalfFloatConstants::RGBA16F_EXT | -- cgit v1.2.3 From 859a3a4924b3c2ebf95bbfbc2bef2c659f2b0272 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Wed, 26 Feb 2020 12:09:10 +0100 Subject: Allow more WebGL2 FBO attachment formats Add support for most of the framebuffer attachment formats introduced in WebGL2 for textures and renderbuffers. Related format tables: - https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml - https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glRenderbufferStorage.xhtml --- components/script/dom/webglrenderbuffer.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 9c173d20241..bc1a11a7ecf 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -145,6 +145,31 @@ impl WebGLRenderbuffer { constants::RGBA4 | constants::DEPTH_COMPONENT16 | constants::STENCIL_INDEX8 => { internal_format }, + constants::R8 | + constants::R8UI | + constants::R8I | + constants::R16UI | + constants::R16I | + constants::R32UI | + constants::R32I | + constants::RG8 | + constants::RG8UI | + constants::RG8I | + constants::RG16UI | + constants::RG16I | + constants::RG32UI | + constants::RG32I | + constants::RGB8 | + constants::RGBA8 | + constants::SRGB8_ALPHA8 | + constants::RGB10_A2 | + constants::RGBA8UI | + constants::RGBA8I | + constants::RGB10_A2UI | + constants::RGBA16UI | + constants::RGBA16I | + constants::RGBA32I | + constants::RGBA32UI | constants::DEPTH_COMPONENT24 | constants::DEPTH_COMPONENT32F | constants::DEPTH24_STENCIL8 | -- cgit v1.2.3 From 5eaa9ef8cb552063df2645847a4ab3793c3ebcd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Tue, 3 Mar 2020 14:44:33 +0100 Subject: Add support for some more WebGL2 renderbuffer functions Adds support for the following WebGL2 calls: - `RenderbufferStorageMultisample` - `GetInternalFormativ` See: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.5 --- components/script/dom/webglrenderbuffer.rs | 40 ++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 7 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index bc1a11a7ecf..71e56bac1d3 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -14,7 +14,8 @@ use crate::dom::webglframebuffer::WebGLFramebuffer; use crate::dom::webglobject::WebGLObject; use crate::dom::webglrenderingcontext::WebGLRenderingContext; use canvas_traits::webgl::{ - webgl_channel, GlType, WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult, WebGLVersion, + webgl_channel, GlType, InternalFormatIntVec, WebGLCommand, WebGLError, WebGLRenderbufferId, + WebGLResult, WebGLVersion, }; use dom_struct::dom_struct; use std::cell::Cell; @@ -133,11 +134,13 @@ impl WebGLRenderbuffer { pub fn storage( &self, api_type: GlType, + sample_count: i32, internal_format: u32, width: i32, height: i32, ) -> WebGLResult<()> { let is_gles = api_type == GlType::Gles; + let webgl_version = self.upcast().context().webgl_version(); // Validate the internal_format, and save it for completeness // validation. @@ -173,7 +176,7 @@ impl WebGLRenderbuffer { constants::DEPTH_COMPONENT24 | constants::DEPTH_COMPONENT32F | constants::DEPTH24_STENCIL8 | - constants::DEPTH32F_STENCIL8 => match self.upcast().context().webgl_version() { + constants::DEPTH32F_STENCIL8 => match webgl_version { WebGLVersion::WebGL1 => return Err(WebGLError::InvalidEnum), _ => internal_format, }, @@ -221,6 +224,22 @@ impl WebGLRenderbuffer { _ => return Err(WebGLError::InvalidEnum), }; + if webgl_version != WebGLVersion::WebGL1 { + let (sender, receiver) = webgl_channel().unwrap(); + self.upcast::().context().send_command( + WebGLCommand::GetInternalFormatIntVec( + constants::RENDERBUFFER, + internal_format, + InternalFormatIntVec::Samples, + sender, + ), + ); + let samples = receiver.recv().unwrap(); + if sample_count < 0 || sample_count as usize > samples.len() { + return Err(WebGLError::InvalidOperation); + } + } + self.internal_format.set(Some(internal_format)); self.is_initialized.set(false); @@ -228,17 +247,24 @@ impl WebGLRenderbuffer { fb.update_status(); } - self.upcast::() - .context() - .send_command(WebGLCommand::RenderbufferStorage( + let command = match sample_count { + 0 => WebGLCommand::RenderbufferStorage( constants::RENDERBUFFER, actual_format, width, height, - )); + ), + _ => WebGLCommand::RenderbufferStorageMultisample( + constants::RENDERBUFFER, + sample_count, + actual_format, + width, + height, + ), + }; + self.upcast::().context().send_command(command); self.size.set(Some((width, height))); - Ok(()) } -- cgit v1.2.3 From 3ea6d87bcc37167464e856949a4b9b77d0e9318a Mon Sep 17 00:00:00 2001 From: YUAN LYU Date: Fri, 20 Mar 2020 22:14:18 -0400 Subject: Add trait DomObjectWrap to provide WRAP function --- components/script/dom/webglrenderbuffer.rs | 2 -- 1 file changed, 2 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 71e56bac1d3..51f1bdbad4e 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -6,7 +6,6 @@ use crate::dom::bindings::codegen::Bindings::EXTColorBufferHalfFloatBinding::EXTColorBufferHalfFloatConstants; use crate::dom::bindings::codegen::Bindings::WEBGLColorBufferFloatBinding::WEBGLColorBufferFloatConstants; use crate::dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextConstants as constants; -use crate::dom::bindings::codegen::Bindings::WebGLRenderbufferBinding; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; @@ -59,7 +58,6 @@ impl WebGLRenderbuffer { reflect_dom_object( Box::new(WebGLRenderbuffer::new_inherited(context, id)), &*context.global(), - WebGLRenderbufferBinding::Wrap, ) } } -- cgit v1.2.3 From 8bb1732258c44e6850618a8f2fbb2927bc01b090 Mon Sep 17 00:00:00 2001 From: Alan Jeffrey Date: Thu, 9 Jan 2020 17:28:46 -0600 Subject: Update surfman to 0.2 and remove glutin --- components/script/dom/webglrenderbuffer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index 51f1bdbad4e..f1a3ba99c53 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -233,7 +233,7 @@ impl WebGLRenderbuffer { ), ); let samples = receiver.recv().unwrap(); - if sample_count < 0 || sample_count as usize > samples.len() { + if sample_count < 0 || sample_count > samples.get(0).cloned().unwrap_or(0) { return Err(WebGLError::InvalidOperation); } } -- cgit v1.2.3 From 9c343fcc9600a1a2b768a4632793d0856d55ddce Mon Sep 17 00:00:00 2001 From: Tobias Tschinkowitz Date: Thu, 23 Apr 2020 18:23:01 +0200 Subject: Replaced failible boolean with an enum --- components/script/dom/webglrenderbuffer.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'components/script/dom/webglrenderbuffer.rs') diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index f1a3ba99c53..204fe9ab46e 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -11,7 +11,7 @@ use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::webglframebuffer::WebGLFramebuffer; use crate::dom::webglobject::WebGLObject; -use crate::dom::webglrenderingcontext::WebGLRenderingContext; +use crate::dom::webglrenderingcontext::{Operation, WebGLRenderingContext}; use canvas_traits::webgl::{ webgl_channel, GlType, InternalFormatIntVec, WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult, WebGLVersion, @@ -90,7 +90,7 @@ impl WebGLRenderbuffer { .send_command(WebGLCommand::BindRenderbuffer(target, Some(self.id))); } - pub fn delete(&self, fallible: bool) { + pub fn delete(&self, operation_fallibility: Operation) { if !self.is_deleted.get() { self.is_deleted.set(true); @@ -113,10 +113,9 @@ impl WebGLRenderbuffer { } let cmd = WebGLCommand::DeleteRenderbuffer(self.id); - if fallible { - context.send_command_ignored(cmd); - } else { - context.send_command(cmd); + match operation_fallibility { + Operation::Fallible => context.send_command_ignored(cmd), + Operation::Infallible => context.send_command(cmd), } } } @@ -277,6 +276,6 @@ impl WebGLRenderbuffer { impl Drop for WebGLRenderbuffer { fn drop(&mut self) { - self.delete(true); + self.delete(Operation::Fallible); } } -- cgit v1.2.3