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/webglshader.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index b66151bf353..edd9cf7bdb3 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -16,8 +16,8 @@ use dom_struct::dom_struct; use ipc_channel::ipc::IpcSender; use std::cell::Cell; use std::sync::{ONCE_INIT, Once}; -use webrender_traits; -use webrender_traits::{WebGLCommand, WebGLParameter, WebGLResult, WebGLShaderId}; +use webrender_api; +use webrender_api::{WebGLCommand, WebGLParameter, WebGLResult, WebGLShaderId}; #[derive(Clone, Copy, PartialEq, Debug, JSTraceable, HeapSizeOf)] pub enum ShaderCompilationStatus { @@ -71,7 +71,7 @@ impl WebGLShader { renderer: IpcSender, shader_type: u32) -> Option> { - let (sender, receiver) = webrender_traits::channel::msg_channel().unwrap(); + let (sender, receiver) = webrender_api::channel::msg_channel().unwrap(); renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateShader(shader_type, sender))).unwrap(); let result = receiver.recv().unwrap(); @@ -170,7 +170,7 @@ impl WebGLShader { /// glGetParameter pub fn parameter(&self, param_id: u32) -> WebGLResult { - let (sender, receiver) = webrender_traits::channel::msg_channel().unwrap(); + let (sender, receiver) = webrender_api::channel::msg_channel().unwrap(); self.renderer.send(CanvasMsg::WebGL(WebGLCommand::GetShaderParameter(self.id, param_id, sender))).unwrap(); 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/webglshader.rs | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index edd9cf7bdb3..cf6fc55072d 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -4,7 +4,7 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl use angle::hl::{BuiltInResources, Output, ShaderValidator}; -use canvas_traits::CanvasMsg; +use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLMsgSender, WebGLParameter, WebGLResult, WebGLShaderId}; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::WebGLShaderBinding; use dom::bindings::js::Root; @@ -13,11 +13,8 @@ use dom::bindings::str::DOMString; use dom::webglobject::WebGLObject; use dom::window::Window; use dom_struct::dom_struct; -use ipc_channel::ipc::IpcSender; use std::cell::Cell; use std::sync::{ONCE_INIT, Once}; -use webrender_api; -use webrender_api::{WebGLCommand, WebGLParameter, WebGLResult, WebGLShaderId}; #[derive(Clone, Copy, PartialEq, Debug, JSTraceable, HeapSizeOf)] pub enum ShaderCompilationStatus { @@ -37,7 +34,7 @@ pub struct WebGLShader { attached_counter: Cell, compilation_status: Cell, #[ignore_heap_size_of = "Defined in ipc-channel"] - renderer: IpcSender, + renderer: WebGLMsgSender, } #[cfg(not(target_os = "android"))] @@ -49,7 +46,7 @@ const SHADER_OUTPUT_FORMAT: Output = Output::Essl; static GLSLANG_INITIALIZATION: Once = ONCE_INIT; impl WebGLShader { - fn new_inherited(renderer: IpcSender, + fn new_inherited(renderer: WebGLMsgSender, id: WebGLShaderId, shader_type: u32) -> WebGLShader { @@ -68,18 +65,18 @@ impl WebGLShader { } pub fn maybe_new(window: &Window, - renderer: IpcSender, + renderer: WebGLMsgSender, shader_type: u32) -> Option> { - let (sender, receiver) = webrender_api::channel::msg_channel().unwrap(); - renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateShader(shader_type, sender))).unwrap(); + let (sender, receiver) = webgl_channel().unwrap(); + renderer.send(WebGLCommand::CreateShader(shader_type, sender)).unwrap(); let result = receiver.recv().unwrap(); result.map(|shader_id| WebGLShader::new(window, renderer, shader_id, shader_type)) } pub fn new(window: &Window, - renderer: IpcSender, + renderer: WebGLMsgSender, id: WebGLShaderId, shader_type: u32) -> Root { @@ -118,7 +115,7 @@ impl WebGLShader { // will succeed. // It could be interesting to retrieve the info log from the paint thread though let msg = WebGLCommand::CompileShader(self.id, translated_source); - self.renderer.send(CanvasMsg::WebGL(msg)).unwrap(); + self.renderer.send(msg).unwrap(); self.compilation_status.set(ShaderCompilationStatus::Succeeded); }, Err(error) => { @@ -142,7 +139,7 @@ impl WebGLShader { pub fn delete(&self) { if !self.is_deleted.get() { self.is_deleted.set(true); - let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteShader(self.id))); + let _ = self.renderer.send(WebGLCommand::DeleteShader(self.id)); } } @@ -170,8 +167,8 @@ impl WebGLShader { /// glGetParameter pub fn parameter(&self, param_id: u32) -> WebGLResult { - let (sender, receiver) = webrender_api::channel::msg_channel().unwrap(); - self.renderer.send(CanvasMsg::WebGL(WebGLCommand::GetShaderParameter(self.id, param_id, sender))).unwrap(); + let (sender, receiver) = webgl_channel().unwrap(); + self.renderer.send(WebGLCommand::GetShaderParameter(self.id, param_id, sender)).unwrap(); receiver.recv().unwrap() } -- 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/webglshader.rs | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index cf6fc55072d..edd9cf7bdb3 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -4,7 +4,7 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl use angle::hl::{BuiltInResources, Output, ShaderValidator}; -use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLMsgSender, WebGLParameter, WebGLResult, WebGLShaderId}; +use canvas_traits::CanvasMsg; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::WebGLShaderBinding; use dom::bindings::js::Root; @@ -13,8 +13,11 @@ use dom::bindings::str::DOMString; use dom::webglobject::WebGLObject; use dom::window::Window; use dom_struct::dom_struct; +use ipc_channel::ipc::IpcSender; use std::cell::Cell; use std::sync::{ONCE_INIT, Once}; +use webrender_api; +use webrender_api::{WebGLCommand, WebGLParameter, WebGLResult, WebGLShaderId}; #[derive(Clone, Copy, PartialEq, Debug, JSTraceable, HeapSizeOf)] pub enum ShaderCompilationStatus { @@ -34,7 +37,7 @@ pub struct WebGLShader { attached_counter: Cell, compilation_status: Cell, #[ignore_heap_size_of = "Defined in ipc-channel"] - renderer: WebGLMsgSender, + renderer: IpcSender, } #[cfg(not(target_os = "android"))] @@ -46,7 +49,7 @@ const SHADER_OUTPUT_FORMAT: Output = Output::Essl; static GLSLANG_INITIALIZATION: Once = ONCE_INIT; impl WebGLShader { - fn new_inherited(renderer: WebGLMsgSender, + fn new_inherited(renderer: IpcSender, id: WebGLShaderId, shader_type: u32) -> WebGLShader { @@ -65,18 +68,18 @@ impl WebGLShader { } pub fn maybe_new(window: &Window, - renderer: WebGLMsgSender, + renderer: IpcSender, shader_type: u32) -> Option> { - let (sender, receiver) = webgl_channel().unwrap(); - renderer.send(WebGLCommand::CreateShader(shader_type, sender)).unwrap(); + let (sender, receiver) = webrender_api::channel::msg_channel().unwrap(); + renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateShader(shader_type, sender))).unwrap(); let result = receiver.recv().unwrap(); result.map(|shader_id| WebGLShader::new(window, renderer, shader_id, shader_type)) } pub fn new(window: &Window, - renderer: WebGLMsgSender, + renderer: IpcSender, id: WebGLShaderId, shader_type: u32) -> Root { @@ -115,7 +118,7 @@ impl WebGLShader { // will succeed. // It could be interesting to retrieve the info log from the paint thread though let msg = WebGLCommand::CompileShader(self.id, translated_source); - self.renderer.send(msg).unwrap(); + self.renderer.send(CanvasMsg::WebGL(msg)).unwrap(); self.compilation_status.set(ShaderCompilationStatus::Succeeded); }, Err(error) => { @@ -139,7 +142,7 @@ impl WebGLShader { pub fn delete(&self) { if !self.is_deleted.get() { self.is_deleted.set(true); - let _ = self.renderer.send(WebGLCommand::DeleteShader(self.id)); + let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteShader(self.id))); } } @@ -167,8 +170,8 @@ impl WebGLShader { /// glGetParameter pub fn parameter(&self, param_id: u32) -> WebGLResult { - let (sender, receiver) = webgl_channel().unwrap(); - self.renderer.send(WebGLCommand::GetShaderParameter(self.id, param_id, sender)).unwrap(); + let (sender, receiver) = webrender_api::channel::msg_channel().unwrap(); + self.renderer.send(CanvasMsg::WebGL(WebGLCommand::GetShaderParameter(self.id, param_id, sender))).unwrap(); receiver.recv().unwrap() } -- 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/webglshader.rs | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index edd9cf7bdb3..cf6fc55072d 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -4,7 +4,7 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl use angle::hl::{BuiltInResources, Output, ShaderValidator}; -use canvas_traits::CanvasMsg; +use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLMsgSender, WebGLParameter, WebGLResult, WebGLShaderId}; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::WebGLShaderBinding; use dom::bindings::js::Root; @@ -13,11 +13,8 @@ use dom::bindings::str::DOMString; use dom::webglobject::WebGLObject; use dom::window::Window; use dom_struct::dom_struct; -use ipc_channel::ipc::IpcSender; use std::cell::Cell; use std::sync::{ONCE_INIT, Once}; -use webrender_api; -use webrender_api::{WebGLCommand, WebGLParameter, WebGLResult, WebGLShaderId}; #[derive(Clone, Copy, PartialEq, Debug, JSTraceable, HeapSizeOf)] pub enum ShaderCompilationStatus { @@ -37,7 +34,7 @@ pub struct WebGLShader { attached_counter: Cell, compilation_status: Cell, #[ignore_heap_size_of = "Defined in ipc-channel"] - renderer: IpcSender, + renderer: WebGLMsgSender, } #[cfg(not(target_os = "android"))] @@ -49,7 +46,7 @@ const SHADER_OUTPUT_FORMAT: Output = Output::Essl; static GLSLANG_INITIALIZATION: Once = ONCE_INIT; impl WebGLShader { - fn new_inherited(renderer: IpcSender, + fn new_inherited(renderer: WebGLMsgSender, id: WebGLShaderId, shader_type: u32) -> WebGLShader { @@ -68,18 +65,18 @@ impl WebGLShader { } pub fn maybe_new(window: &Window, - renderer: IpcSender, + renderer: WebGLMsgSender, shader_type: u32) -> Option> { - let (sender, receiver) = webrender_api::channel::msg_channel().unwrap(); - renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateShader(shader_type, sender))).unwrap(); + let (sender, receiver) = webgl_channel().unwrap(); + renderer.send(WebGLCommand::CreateShader(shader_type, sender)).unwrap(); let result = receiver.recv().unwrap(); result.map(|shader_id| WebGLShader::new(window, renderer, shader_id, shader_type)) } pub fn new(window: &Window, - renderer: IpcSender, + renderer: WebGLMsgSender, id: WebGLShaderId, shader_type: u32) -> Root { @@ -118,7 +115,7 @@ impl WebGLShader { // will succeed. // It could be interesting to retrieve the info log from the paint thread though let msg = WebGLCommand::CompileShader(self.id, translated_source); - self.renderer.send(CanvasMsg::WebGL(msg)).unwrap(); + self.renderer.send(msg).unwrap(); self.compilation_status.set(ShaderCompilationStatus::Succeeded); }, Err(error) => { @@ -142,7 +139,7 @@ impl WebGLShader { pub fn delete(&self) { if !self.is_deleted.get() { self.is_deleted.set(true); - let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteShader(self.id))); + let _ = self.renderer.send(WebGLCommand::DeleteShader(self.id)); } } @@ -170,8 +167,8 @@ impl WebGLShader { /// glGetParameter pub fn parameter(&self, param_id: u32) -> WebGLResult { - let (sender, receiver) = webrender_api::channel::msg_channel().unwrap(); - self.renderer.send(CanvasMsg::WebGL(WebGLCommand::GetShaderParameter(self.id, param_id, sender))).unwrap(); + let (sender, receiver) = webgl_channel().unwrap(); + self.renderer.send(WebGLCommand::GetShaderParameter(self.id, param_id, sender)).unwrap(); receiver.recv().unwrap() } -- cgit v1.2.3 From 1dd3899c370a9fe763b57f8dd9a0139fb09e7b7e Mon Sep 17 00:00:00 2001 From: Imanol Fernandez Date: Mon, 21 Aug 2017 22:37:19 +0200 Subject: Implement WebGL OES_standard_derivatives extension. --- components/script/dom/webglshader.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index cf6fc55072d..9bf76e91051 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -10,6 +10,8 @@ use dom::bindings::codegen::Bindings::WebGLShaderBinding; use dom::bindings::js::Root; use dom::bindings::reflector::reflect_dom_object; use dom::bindings::str::DOMString; +use dom::webgl_extensions::WebGLExtensions; +use dom::webgl_extensions::ext::oesstandardderivatives::OESStandardDerivatives; use dom::webglobject::WebGLObject; use dom::window::Window; use dom_struct::dom_struct; @@ -97,7 +99,7 @@ impl WebGLShader { } /// glCompileShader - pub fn compile(&self) { + pub fn compile(&self, ext: &WebGLExtensions) { if self.compilation_status.get() != ShaderCompilationStatus::NotCompiled { debug!("Compiling already compiled shader {}", self.id); } @@ -105,6 +107,7 @@ impl WebGLShader { if let Some(ref source) = *self.source.borrow() { let mut params = BuiltInResources::default(); params.FragmentPrecisionHigh = 1; + params.OES_standard_derivatives = ext.is_enabled::() as i32; let validator = ShaderValidator::for_webgl(self.gl_type, SHADER_OUTPUT_FORMAT, ¶ms).unwrap(); -- cgit v1.2.3 From c5fe2351124c673d1dc4d59355a03654b4fcc541 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20DAVID?= Date: Wed, 23 Aug 2017 14:10:08 +0200 Subject: order derivable traits lists Ignoring : - **generated**.rs - python/tidy/servo_tidy_tests/rust_tidy.rs --- components/script/dom/webglshader.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 9bf76e91051..cd33092f26e 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -18,7 +18,7 @@ use dom_struct::dom_struct; use std::cell::Cell; use std::sync::{ONCE_INIT, Once}; -#[derive(Clone, Copy, PartialEq, Debug, JSTraceable, HeapSizeOf)] +#[derive(Clone, Copy, Debug, HeapSizeOf, JSTraceable, PartialEq)] pub enum ShaderCompilationStatus { NotCompiled, Succeeded, -- 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/webglshader.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index cd33092f26e..8f9c0f78f3b 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -7,8 +7,8 @@ use angle::hl::{BuiltInResources, Output, ShaderValidator}; use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLMsgSender, WebGLParameter, WebGLResult, WebGLShaderId}; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::WebGLShaderBinding; -use dom::bindings::js::Root; use dom::bindings::reflector::reflect_dom_object; +use dom::bindings::root::Root; use dom::bindings::str::DOMString; use dom::webgl_extensions::WebGLExtensions; use dom::webgl_extensions::ext::oesstandardderivatives::OESStandardDerivatives; -- cgit v1.2.3 From 577370746e2ce3da7fa25a20b8e1bbeed319df65 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Tue, 26 Sep 2017 01:32:40 +0200 Subject: Rename DOMRefCell to DomRefCell I don't want to do such a gratuitous rename, but with all the other types now having "Dom" as part of their name, and especially with "DomOnceCell", I feel like the other cell type that we already have should also follow the convention. That argument loses weight though when we realise there is still DOMString and other things. --- components/script/dom/webglshader.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 8f9c0f78f3b..54f2a743446 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -5,7 +5,7 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl use angle::hl::{BuiltInResources, Output, ShaderValidator}; use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLMsgSender, WebGLParameter, WebGLResult, WebGLShaderId}; -use dom::bindings::cell::DOMRefCell; +use dom::bindings::cell::DomRefCell; use dom::bindings::codegen::Bindings::WebGLShaderBinding; use dom::bindings::reflector::reflect_dom_object; use dom::bindings::root::Root; @@ -30,8 +30,8 @@ pub struct WebGLShader { webgl_object: WebGLObject, id: WebGLShaderId, gl_type: u32, - source: DOMRefCell>, - info_log: DOMRefCell>, + source: DomRefCell>, + info_log: DomRefCell>, is_deleted: Cell, attached_counter: Cell, compilation_status: Cell, @@ -57,8 +57,8 @@ impl WebGLShader { webgl_object: WebGLObject::new_inherited(), id: id, gl_type: shader_type, - source: DOMRefCell::new(None), - info_log: DOMRefCell::new(None), + source: DomRefCell::new(None), + info_log: DomRefCell::new(None), is_deleted: Cell::new(false), attached_counter: Cell::new(0), compilation_status: Cell::new(ShaderCompilationStatus::NotCompiled), -- 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/webglshader.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 54f2a743446..2a48ca21e73 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -8,7 +8,7 @@ use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLMsgSender, WebGLPar use dom::bindings::cell::DomRefCell; use dom::bindings::codegen::Bindings::WebGLShaderBinding; use dom::bindings::reflector::reflect_dom_object; -use dom::bindings::root::Root; +use dom::bindings::root::DomRoot; use dom::bindings::str::DOMString; use dom::webgl_extensions::WebGLExtensions; use dom::webgl_extensions::ext::oesstandardderivatives::OESStandardDerivatives; @@ -69,7 +69,7 @@ impl WebGLShader { pub fn maybe_new(window: &Window, renderer: WebGLMsgSender, shader_type: u32) - -> Option> { + -> Option> { let (sender, receiver) = webgl_channel().unwrap(); renderer.send(WebGLCommand::CreateShader(shader_type, sender)).unwrap(); @@ -81,7 +81,7 @@ impl WebGLShader { renderer: WebGLMsgSender, id: WebGLShaderId, shader_type: u32) - -> Root { + -> DomRoot { reflect_dom_object(box WebGLShader::new_inherited(renderer, id, shader_type), window, WebGLShaderBinding::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/webglshader.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 2a48ca21e73..d2060b1756c 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -82,7 +82,7 @@ impl WebGLShader { id: WebGLShaderId, shader_type: u32) -> DomRoot { - reflect_dom_object(box WebGLShader::new_inherited(renderer, id, shader_type), + reflect_dom_object(Box::new(WebGLShader::new_inherited(renderer, id, shader_type)), window, WebGLShaderBinding::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/webglshader.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index d2060b1756c..781db93c8f2 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -18,7 +18,7 @@ use dom_struct::dom_struct; use std::cell::Cell; use std::sync::{ONCE_INIT, Once}; -#[derive(Clone, Copy, Debug, HeapSizeOf, JSTraceable, PartialEq)] +#[derive(Clone, Copy, Debug, JSTraceable, MallocSizeOf, PartialEq)] pub enum ShaderCompilationStatus { NotCompiled, Succeeded, @@ -35,7 +35,7 @@ pub struct WebGLShader { is_deleted: Cell, attached_counter: Cell, compilation_status: Cell, - #[ignore_heap_size_of = "Defined in ipc-channel"] + #[ignore_malloc_size_of = "Defined in ipc-channel"] renderer: WebGLMsgSender, } -- cgit v1.2.3 From ddd6c86e992a45d6490b8ec6eb2bf7b3ecce9a03 Mon Sep 17 00:00:00 2001 From: Imanol Fernandez Date: Thu, 26 Oct 2017 18:04:13 +0200 Subject: Kick off WebGL 2.0 implementation --- components/script/dom/webglshader.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 781db93c8f2..3ce6b93ad77 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -5,6 +5,7 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl use angle::hl::{BuiltInResources, Output, ShaderValidator}; use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLMsgSender, WebGLParameter, WebGLResult, WebGLShaderId}; +use canvas_traits::webgl::WebGLVersion; use dom::bindings::cell::DomRefCell; use dom::bindings::codegen::Bindings::WebGLShaderBinding; use dom::bindings::reflector::reflect_dom_object; @@ -99,7 +100,7 @@ impl WebGLShader { } /// glCompileShader - pub fn compile(&self, ext: &WebGLExtensions) { + pub fn compile(&self, version: WebGLVersion, ext: &WebGLExtensions) { if self.compilation_status.get() != ShaderCompilationStatus::NotCompiled { debug!("Compiling already compiled shader {}", self.id); } @@ -108,9 +109,19 @@ impl WebGLShader { let mut params = BuiltInResources::default(); params.FragmentPrecisionHigh = 1; params.OES_standard_derivatives = ext.is_enabled::() as i32; - let validator = ShaderValidator::for_webgl(self.gl_type, - SHADER_OUTPUT_FORMAT, - ¶ms).unwrap(); + let validator = match version { + WebGLVersion::WebGL1 => { + ShaderValidator::for_webgl(self.gl_type, + SHADER_OUTPUT_FORMAT, + ¶ms).unwrap() + }, + WebGLVersion::WebGL2 => { + ShaderValidator::for_webgl2(self.gl_type, + SHADER_OUTPUT_FORMAT, + ¶ms).unwrap() + }, + }; + match validator.compile_and_translate(&[source]) { Ok(translated_source) => { debug!("Shader translated: {}", translated_source); -- cgit v1.2.3 From c22674481b04a017576174376b4258edde1c4127 Mon Sep 17 00:00:00 2001 From: Imanol Fernandez Date: Mon, 13 Nov 2017 14:36:56 +0100 Subject: Set the correct Angle GLSL output when using WebGL 2 --- components/script/dom/webglshader.rs | 43 +++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 11 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 3ce6b93ad77..4a50a6d97f3 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -4,8 +4,8 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl use angle::hl::{BuiltInResources, Output, ShaderValidator}; +use canvas_traits::webgl::{WebGLSLVersion, WebGLVersion}; use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLMsgSender, WebGLParameter, WebGLResult, WebGLShaderId}; -use canvas_traits::webgl::WebGLVersion; use dom::bindings::cell::DomRefCell; use dom::bindings::codegen::Bindings::WebGLShaderBinding; use dom::bindings::reflector::reflect_dom_object; @@ -40,12 +40,6 @@ pub struct WebGLShader { renderer: WebGLMsgSender, } -#[cfg(not(target_os = "android"))] -const SHADER_OUTPUT_FORMAT: Output = Output::Glsl; - -#[cfg(target_os = "android")] -const SHADER_OUTPUT_FORMAT: Output = Output::Essl; - static GLSLANG_INITIALIZATION: Once = ONCE_INIT; impl WebGLShader { @@ -100,7 +94,12 @@ impl WebGLShader { } /// glCompileShader - pub fn compile(&self, version: WebGLVersion, ext: &WebGLExtensions) { + pub fn compile( + &self, + webgl_version: WebGLVersion, + glsl_version: WebGLSLVersion, + ext: &WebGLExtensions + ) { if self.compilation_status.get() != ShaderCompilationStatus::NotCompiled { debug!("Compiling already compiled shader {}", self.id); } @@ -109,15 +108,37 @@ impl WebGLShader { let mut params = BuiltInResources::default(); params.FragmentPrecisionHigh = 1; params.OES_standard_derivatives = ext.is_enabled::() as i32; - let validator = match version { + let validator = match webgl_version { WebGLVersion::WebGL1 => { + let output_format = if cfg!(any(target_os = "android", target_os = "ios")) { + Output::Essl + } else { + Output::Glsl + }; ShaderValidator::for_webgl(self.gl_type, - SHADER_OUTPUT_FORMAT, + output_format, ¶ms).unwrap() }, WebGLVersion::WebGL2 => { + let output_format = if cfg!(any(target_os = "android", target_os = "ios")) { + Output::Essl + } else { + match (glsl_version.major, glsl_version.minor) { + (1, 30) => Output::Glsl130, + (1, 40) => Output::Glsl140, + (1, 50) => Output::Glsl150Core, + (3, 30) => Output::Glsl330Core, + (4, 0) => Output::Glsl400Core, + (4, 10) => Output::Glsl410Core, + (4, 20) => Output::Glsl420Core, + (4, 30) => Output::Glsl430Core, + (4, 40) => Output::Glsl440Core, + (4, _) => Output::Glsl450Core, + _ => Output::Glsl140 + } + }; ShaderValidator::for_webgl2(self.gl_type, - SHADER_OUTPUT_FORMAT, + output_format, ¶ms).unwrap() }, }; -- cgit v1.2.3 From 15a1faff039915fd60694bf8db66e22964026691 Mon Sep 17 00:00:00 2001 From: CYBAI Date: Thu, 25 Jan 2018 23:50:30 +0800 Subject: Use specific assertion for DOM webgl shader --- components/script/dom/webglshader.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 4a50a6d97f3..7d69cb5d56c 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -224,7 +224,7 @@ impl WebGLShader { impl Drop for WebGLShader { fn drop(&mut self) { - assert!(self.attached_counter.get() == 0); + assert_eq!(self.attached_counter.get(), 0); self.delete(); } } -- cgit v1.2.3 From 67d983cb1256e76c42451460116bd98cb3f31db1 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Mon, 5 Mar 2018 16:48:01 +0100 Subject: Switch from servo/angle to the mozangle crate https://github.com/servo/mozangle --- components/script/dom/webglshader.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 7d69cb5d56c..2a6504be506 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -3,7 +3,6 @@ * 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 angle::hl::{BuiltInResources, Output, ShaderValidator}; use canvas_traits::webgl::{WebGLSLVersion, WebGLVersion}; use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLMsgSender, WebGLParameter, WebGLResult, WebGLShaderId}; use dom::bindings::cell::DomRefCell; @@ -16,6 +15,7 @@ use dom::webgl_extensions::ext::oesstandardderivatives::OESStandardDerivatives; use dom::webglobject::WebGLObject; use dom::window::Window; use dom_struct::dom_struct; +use mozangle::shaders::{BuiltInResources, Output, ShaderValidator}; use std::cell::Cell; use std::sync::{ONCE_INIT, Once}; @@ -47,7 +47,7 @@ impl WebGLShader { id: WebGLShaderId, shader_type: u32) -> WebGLShader { - GLSLANG_INITIALIZATION.call_once(|| ::angle::hl::initialize().unwrap()); + GLSLANG_INITIALIZATION.call_once(|| ::mozangle::shaders::initialize().unwrap()); WebGLShader { webgl_object: WebGLObject::new_inherited(), id: id, -- cgit v1.2.3 From 20a309f037236afa1287da36a035b2e4122ed63c Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sat, 24 Mar 2018 13:51:31 +0100 Subject: Implement missing WebGLShader checks Methods compileShader and getShaderParameter should emit an error when the shader has been deleted. --- components/script/dom/webglshader.rs | 143 +++++++++++++++++++---------------- 1 file changed, 78 insertions(+), 65 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 2a6504be506..0e965b01b3b 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -3,8 +3,9 @@ * 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::{WebGLSLVersion, WebGLVersion}; -use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLMsgSender, WebGLParameter, WebGLResult, WebGLShaderId}; +use canvas_traits::webgl::{WebGLCommand, WebGLError, WebGLMsgSender}; +use canvas_traits::webgl::{WebGLParameter, WebGLResult, WebGLSLVersion}; +use canvas_traits::webgl::{WebGLShaderId, WebGLVersion, webgl_channel}; use dom::bindings::cell::DomRefCell; use dom::bindings::codegen::Bindings::WebGLShaderBinding; use dom::bindings::reflector::reflect_dom_object; @@ -98,74 +99,83 @@ impl WebGLShader { &self, webgl_version: WebGLVersion, glsl_version: WebGLSLVersion, - ext: &WebGLExtensions - ) { + ext: &WebGLExtensions, + ) -> WebGLResult<()> { + if self.is_deleted.get() && !self.is_attached() { + return Err(WebGLError::InvalidValue); + } if self.compilation_status.get() != ShaderCompilationStatus::NotCompiled { debug!("Compiling already compiled shader {}", self.id); } - if let Some(ref source) = *self.source.borrow() { - let mut params = BuiltInResources::default(); - params.FragmentPrecisionHigh = 1; - params.OES_standard_derivatives = ext.is_enabled::() as i32; - let validator = match webgl_version { - WebGLVersion::WebGL1 => { - let output_format = if cfg!(any(target_os = "android", target_os = "ios")) { - Output::Essl - } else { - Output::Glsl - }; - ShaderValidator::for_webgl(self.gl_type, - output_format, - ¶ms).unwrap() - }, - WebGLVersion::WebGL2 => { - let output_format = if cfg!(any(target_os = "android", target_os = "ios")) { - Output::Essl - } else { - match (glsl_version.major, glsl_version.minor) { - (1, 30) => Output::Glsl130, - (1, 40) => Output::Glsl140, - (1, 50) => Output::Glsl150Core, - (3, 30) => Output::Glsl330Core, - (4, 0) => Output::Glsl400Core, - (4, 10) => Output::Glsl410Core, - (4, 20) => Output::Glsl420Core, - (4, 30) => Output::Glsl430Core, - (4, 40) => Output::Glsl440Core, - (4, _) => Output::Glsl450Core, - _ => Output::Glsl140 - } - }; - ShaderValidator::for_webgl2(self.gl_type, - output_format, - ¶ms).unwrap() - }, - }; - - match validator.compile_and_translate(&[source]) { - Ok(translated_source) => { - debug!("Shader translated: {}", translated_source); - // NOTE: At this point we should be pretty sure that the compilation in the paint thread - // will succeed. - // It could be interesting to retrieve the info log from the paint thread though - let msg = WebGLCommand::CompileShader(self.id, translated_source); - self.renderer.send(msg).unwrap(); - self.compilation_status.set(ShaderCompilationStatus::Succeeded); - }, - Err(error) => { - self.compilation_status.set(ShaderCompilationStatus::Failed); - debug!("Shader {} compilation failed: {}", self.id, error); - }, - } - - *self.info_log.borrow_mut() = Some(validator.info_log()); - // TODO(emilio): More data (like uniform data) should be collected - // here to properly validate uniforms. - // - // This requires a more complex interface with ANGLE, using C++ - // bindings and being extremely cautious about destructing things. + let source = self.source.borrow(); + let source = match source.as_ref() { + Some(source) => source, + None => return Ok(()), + }; + + let mut params = BuiltInResources::default(); + params.FragmentPrecisionHigh = 1; + params.OES_standard_derivatives = ext.is_enabled::() as i32; + let validator = match webgl_version { + WebGLVersion::WebGL1 => { + let output_format = if cfg!(any(target_os = "android", target_os = "ios")) { + Output::Essl + } else { + Output::Glsl + }; + ShaderValidator::for_webgl(self.gl_type, + output_format, + ¶ms).unwrap() + }, + WebGLVersion::WebGL2 => { + let output_format = if cfg!(any(target_os = "android", target_os = "ios")) { + Output::Essl + } else { + match (glsl_version.major, glsl_version.minor) { + (1, 30) => Output::Glsl130, + (1, 40) => Output::Glsl140, + (1, 50) => Output::Glsl150Core, + (3, 30) => Output::Glsl330Core, + (4, 0) => Output::Glsl400Core, + (4, 10) => Output::Glsl410Core, + (4, 20) => Output::Glsl420Core, + (4, 30) => Output::Glsl430Core, + (4, 40) => Output::Glsl440Core, + (4, _) => Output::Glsl450Core, + _ => Output::Glsl140 + } + }; + ShaderValidator::for_webgl2(self.gl_type, + output_format, + ¶ms).unwrap() + }, + }; + + match validator.compile_and_translate(&[source]) { + Ok(translated_source) => { + debug!("Shader translated: {}", translated_source); + // NOTE: At this point we should be pretty sure that the compilation in the paint thread + // will succeed. + // It could be interesting to retrieve the info log from the paint thread though + let msg = WebGLCommand::CompileShader(self.id, translated_source); + self.renderer.send(msg).unwrap(); + self.compilation_status.set(ShaderCompilationStatus::Succeeded); + }, + Err(error) => { + self.compilation_status.set(ShaderCompilationStatus::Failed); + debug!("Shader {} compilation failed: {}", self.id, error); + }, } + + *self.info_log.borrow_mut() = Some(validator.info_log()); + + // TODO(emilio): More data (like uniform data) should be collected + // here to properly validate uniforms. + // + // This requires a more complex interface with ANGLE, using C++ + // bindings and being extremely cautious about destructing things. + Ok(()) } /// Mark this shader as deleted (if it wasn't previously) @@ -202,6 +212,9 @@ impl WebGLShader { /// glGetParameter pub fn parameter(&self, param_id: u32) -> WebGLResult { + if self.is_deleted.get() && !self.is_attached() { + return Err(WebGLError::InvalidValue); + } let (sender, receiver) = webgl_channel().unwrap(); self.renderer.send(WebGLCommand::GetShaderParameter(self.id, param_id, sender)).unwrap(); receiver.recv().unwrap() -- cgit v1.2.3 From 0f917128009d09343a952ca31369537a6bbf907e Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Wed, 18 Apr 2018 16:21:42 +0200 Subject: Update to gleam 0.5 --- components/script/dom/webglshader.rs | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 0e965b01b3b..2fa975939c0 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -4,8 +4,8 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl use canvas_traits::webgl::{WebGLCommand, WebGLError, WebGLMsgSender}; -use canvas_traits::webgl::{WebGLParameter, WebGLResult, WebGLSLVersion}; -use canvas_traits::webgl::{WebGLShaderId, WebGLVersion, webgl_channel}; +use canvas_traits::webgl::{WebGLResult, WebGLSLVersion, WebGLShaderId}; +use canvas_traits::webgl::{WebGLVersion, webgl_channel}; use dom::bindings::cell::DomRefCell; use dom::bindings::codegen::Bindings::WebGLShaderBinding; use dom::bindings::reflector::reflect_dom_object; @@ -210,16 +210,6 @@ impl WebGLShader { self.info_log.borrow().clone() } - /// glGetParameter - pub fn parameter(&self, param_id: u32) -> WebGLResult { - if self.is_deleted.get() && !self.is_attached() { - return Err(WebGLError::InvalidValue); - } - let (sender, receiver) = webgl_channel().unwrap(); - self.renderer.send(WebGLCommand::GetShaderParameter(self.id, param_id, sender)).unwrap(); - receiver.recv().unwrap() - } - /// Get the shader source pub fn source(&self) -> Option { self.source.borrow().clone() -- cgit v1.2.3 From 124fe698188922949bafd4fcd2c95e6d9072c5f9 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Fri, 22 Jun 2018 12:12:45 +0200 Subject: Properly enable EXT_shader_texture_lod --- components/script/dom/webglshader.rs | 2 ++ 1 file changed, 2 insertions(+) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 2fa975939c0..0ec5c262803 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -12,6 +12,7 @@ use dom::bindings::reflector::reflect_dom_object; use dom::bindings::root::DomRoot; use dom::bindings::str::DOMString; use dom::webgl_extensions::WebGLExtensions; +use dom::webgl_extensions::ext::extshadertexturelod::EXTShaderTextureLod; use dom::webgl_extensions::ext::oesstandardderivatives::OESStandardDerivatives; use dom::webglobject::WebGLObject; use dom::window::Window; @@ -117,6 +118,7 @@ impl WebGLShader { let mut params = BuiltInResources::default(); params.FragmentPrecisionHigh = 1; params.OES_standard_derivatives = ext.is_enabled::() as i32; + params.EXT_shader_texture_lod = ext.is_enabled::() as i32; let validator = match webgl_version { WebGLVersion::WebGL1 => { let output_format = if cfg!(any(target_os = "android", target_os = "ios")) { -- cgit v1.2.3 From 0e93f06d8dcf04a50571c525aa2b6f767ef734ff Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sat, 7 Jul 2018 19:04:39 +0200 Subject: Pass more GL limits to the ANGLE shader compiler --- components/script/dom/webglshader.rs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 0ec5c262803..9b4827e5ce9 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -18,7 +18,9 @@ use dom::webglobject::WebGLObject; use dom::window::Window; use dom_struct::dom_struct; use mozangle::shaders::{BuiltInResources, Output, ShaderValidator}; +use offscreen_gl_context::GLLimits; use std::cell::Cell; +use std::os::raw::c_int; use std::sync::{ONCE_INIT, Once}; #[derive(Clone, Copy, Debug, JSTraceable, MallocSizeOf, PartialEq)] @@ -100,6 +102,7 @@ impl WebGLShader { &self, webgl_version: WebGLVersion, glsl_version: WebGLSLVersion, + limits: &GLLimits, ext: &WebGLExtensions, ) -> WebGLResult<()> { if self.is_deleted.get() && !self.is_attached() { @@ -115,10 +118,19 @@ impl WebGLShader { None => return Ok(()), }; - let mut params = BuiltInResources::default(); - params.FragmentPrecisionHigh = 1; - params.OES_standard_derivatives = ext.is_enabled::() as i32; - params.EXT_shader_texture_lod = ext.is_enabled::() as i32; + let params = BuiltInResources { + MaxVertexAttribs: limits.max_vertex_attribs as c_int, + MaxVertexUniformVectors: limits.max_vertex_uniform_vectors as c_int, + MaxVaryingVectors: limits.max_varying_vectors as c_int, + MaxVertexTextureImageUnits: limits.max_vertex_texture_image_units as c_int, + MaxCombinedTextureImageUnits: limits.max_combined_texture_image_units as c_int, + MaxTextureImageUnits: limits.max_texture_image_units as c_int, + MaxFragmentUniformVectors: limits.max_fragment_uniform_vectors as c_int, + OES_standard_derivatives: ext.is_enabled::() as c_int, + EXT_shader_texture_lod: ext.is_enabled::() as c_int, + FragmentPrecisionHigh: 1, + ..BuiltInResources::default() + }; let validator = match webgl_version { WebGLVersion::WebGL1 => { let output_format = if cfg!(any(target_os = "android", target_os = "ios")) { -- cgit v1.2.3 From 6996d1ce369f8335ffa9e303fbcf1c917fe7c3e9 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sat, 7 Jul 2018 21:52:10 +0200 Subject: Fix gl.getShaderSource and gl.getShaderInfoLog It only returns null if there was an error, and the only error isn't implemented yet. --- components/script/dom/webglshader.rs | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 9b4827e5ce9..1feb73d2d3a 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -35,8 +35,8 @@ pub struct WebGLShader { webgl_object: WebGLObject, id: WebGLShaderId, gl_type: u32, - source: DomRefCell>, - info_log: DomRefCell>, + source: DomRefCell, + info_log: DomRefCell, is_deleted: Cell, attached_counter: Cell, compilation_status: Cell, @@ -56,8 +56,8 @@ impl WebGLShader { webgl_object: WebGLObject::new_inherited(), id: id, gl_type: shader_type, - source: DomRefCell::new(None), - info_log: DomRefCell::new(None), + source: Default::default(), + info_log: Default::default(), is_deleted: Cell::new(false), attached_counter: Cell::new(0), compilation_status: Cell::new(ShaderCompilationStatus::NotCompiled), @@ -113,10 +113,6 @@ impl WebGLShader { } let source = self.source.borrow(); - let source = match source.as_ref() { - Some(source) => source, - None => return Ok(()), - }; let params = BuiltInResources { MaxVertexAttribs: limits.max_vertex_attribs as c_int, @@ -166,7 +162,7 @@ impl WebGLShader { }, }; - match validator.compile_and_translate(&[source]) { + match validator.compile_and_translate(&[&source]) { Ok(translated_source) => { debug!("Shader translated: {}", translated_source); // NOTE: At this point we should be pretty sure that the compilation in the paint thread @@ -182,7 +178,7 @@ impl WebGLShader { }, } - *self.info_log.borrow_mut() = Some(validator.info_log()); + *self.info_log.borrow_mut() = validator.info_log().into(); // TODO(emilio): More data (like uniform data) should be collected // here to properly validate uniforms. @@ -220,18 +216,18 @@ impl WebGLShader { } /// glGetShaderInfoLog - pub fn info_log(&self) -> Option { + pub fn info_log(&self) -> DOMString { self.info_log.borrow().clone() } /// Get the shader source - pub fn source(&self) -> Option { + pub fn source(&self) -> DOMString { self.source.borrow().clone() } /// glShaderSource pub fn set_source(&self, source: DOMString) { - *self.source.borrow_mut() = Some(source); + *self.source.borrow_mut() = source; } pub fn successfully_compiled(&self) -> bool { -- 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/webglshader.rs | 61 ++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 31 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 1feb73d2d3a..bac2f65d1e1 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -3,19 +3,20 @@ * 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, WebGLMsgSender}; +use canvas_traits::webgl::{WebGLCommand, WebGLError}; use canvas_traits::webgl::{WebGLResult, WebGLSLVersion, WebGLShaderId}; use canvas_traits::webgl::{WebGLVersion, webgl_channel}; use dom::bindings::cell::DomRefCell; use dom::bindings::codegen::Bindings::WebGLShaderBinding; -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::bindings::str::DOMString; use dom::webgl_extensions::WebGLExtensions; use dom::webgl_extensions::ext::extshadertexturelod::EXTShaderTextureLod; use dom::webgl_extensions::ext::oesstandardderivatives::OESStandardDerivatives; use dom::webglobject::WebGLObject; -use dom::window::Window; +use dom::webglrenderingcontext::WebGLRenderingContext; use dom_struct::dom_struct; use mozangle::shaders::{BuiltInResources, Output, ShaderValidator}; use offscreen_gl_context::GLLimits; @@ -40,20 +41,19 @@ pub struct WebGLShader { is_deleted: Cell, attached_counter: Cell, compilation_status: Cell, - #[ignore_malloc_size_of = "Defined in ipc-channel"] - renderer: WebGLMsgSender, } static GLSLANG_INITIALIZATION: Once = ONCE_INIT; impl WebGLShader { - fn new_inherited(renderer: WebGLMsgSender, - id: WebGLShaderId, - shader_type: u32) - -> WebGLShader { + fn new_inherited( + context: &WebGLRenderingContext, + id: WebGLShaderId, + shader_type: u32, + ) -> Self { GLSLANG_INITIALIZATION.call_once(|| ::mozangle::shaders::initialize().unwrap()); - WebGLShader { - webgl_object: WebGLObject::new_inherited(), + Self { + webgl_object: WebGLObject::new_inherited(context), id: id, gl_type: shader_type, source: Default::default(), @@ -61,29 +61,25 @@ impl WebGLShader { is_deleted: Cell::new(false), attached_counter: Cell::new(0), compilation_status: Cell::new(ShaderCompilationStatus::NotCompiled), - renderer: renderer, } } - pub fn maybe_new(window: &Window, - renderer: WebGLMsgSender, - shader_type: u32) - -> Option> { + pub fn maybe_new(context: &WebGLRenderingContext, shader_type: u32) -> Option> { let (sender, receiver) = webgl_channel().unwrap(); - renderer.send(WebGLCommand::CreateShader(shader_type, sender)).unwrap(); - - let result = receiver.recv().unwrap(); - result.map(|shader_id| WebGLShader::new(window, renderer, shader_id, shader_type)) + context.send_command(WebGLCommand::CreateShader(shader_type, sender)); + receiver.recv().unwrap().map(|id| WebGLShader::new(context, id, shader_type)) } - pub fn new(window: &Window, - renderer: WebGLMsgSender, - id: WebGLShaderId, - shader_type: u32) - -> DomRoot { - reflect_dom_object(Box::new(WebGLShader::new_inherited(renderer, id, shader_type)), - window, - WebGLShaderBinding::Wrap) + pub fn new( + context: &WebGLRenderingContext, + id: WebGLShaderId, + shader_type: u32, + ) -> DomRoot { + reflect_dom_object( + Box::new(WebGLShader::new_inherited(context, id, shader_type)), + &*context.global(), + WebGLShaderBinding::Wrap, + ) } } @@ -168,8 +164,9 @@ impl WebGLShader { // NOTE: At this point we should be pretty sure that the compilation in the paint thread // will succeed. // It could be interesting to retrieve the info log from the paint thread though - let msg = WebGLCommand::CompileShader(self.id, translated_source); - self.renderer.send(msg).unwrap(); + self.upcast::() + .context() + .send_command(WebGLCommand::CompileShader(self.id, translated_source)); self.compilation_status.set(ShaderCompilationStatus::Succeeded); }, Err(error) => { @@ -194,7 +191,9 @@ impl WebGLShader { pub fn delete(&self) { if !self.is_deleted.get() { self.is_deleted.set(true); - let _ = self.renderer.send(WebGLCommand::DeleteShader(self.id)); + self.upcast::() + .context() + .send_command(WebGLCommand::DeleteShader(self.id)); } } -- cgit v1.2.3 From 43463e80cbdff9ad05808c7f731cacbbf63016ab Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Mon, 30 Jul 2018 13:58:19 +0200 Subject: Remove an obsolete todo in gl.compileShader() We get the uniform data etc at link-time. --- components/script/dom/webglshader.rs | 5 ----- 1 file changed, 5 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index bac2f65d1e1..b85b2d93116 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -177,11 +177,6 @@ impl WebGLShader { *self.info_log.borrow_mut() = validator.info_log().into(); - // TODO(emilio): More data (like uniform data) should be collected - // here to properly validate uniforms. - // - // This requires a more complex interface with ANGLE, using C++ - // bindings and being extremely cautious about destructing things. Ok(()) } -- cgit v1.2.3 From a0fc4c98321be216dca4228b91baadc2cb0a9b2a Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Fri, 27 Jul 2018 13:12:25 +0200 Subject: Fix program and shader lifetime cycle --- components/script/dom/webglshader.rs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index b85b2d93116..558d43c220c 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -38,7 +38,7 @@ pub struct WebGLShader { gl_type: u32, source: DomRefCell, info_log: DomRefCell, - is_deleted: Cell, + marked_for_deletion: Cell, attached_counter: Cell, compilation_status: Cell, } @@ -58,7 +58,7 @@ impl WebGLShader { gl_type: shader_type, source: Default::default(), info_log: Default::default(), - is_deleted: Cell::new(false), + marked_for_deletion: Cell::new(false), attached_counter: Cell::new(0), compilation_status: Cell::new(ShaderCompilationStatus::NotCompiled), } @@ -101,7 +101,7 @@ impl WebGLShader { limits: &GLLimits, ext: &WebGLExtensions, ) -> WebGLResult<()> { - if self.is_deleted.get() && !self.is_attached() { + if self.marked_for_deletion.get() && !self.is_attached() { return Err(WebGLError::InvalidValue); } if self.compilation_status.get() != ShaderCompilationStatus::NotCompiled { @@ -183,9 +183,9 @@ impl WebGLShader { /// Mark this shader as deleted (if it wasn't previously) /// and delete it as if calling glDeleteShader. /// Currently does not check if shader is attached - pub fn delete(&self) { - if !self.is_deleted.get() { - self.is_deleted.set(true); + pub fn mark_for_deletion(&self) { + if !self.marked_for_deletion.get() { + self.marked_for_deletion.set(true); self.upcast::() .context() .send_command(WebGLCommand::DeleteShader(self.id)); @@ -193,7 +193,7 @@ impl WebGLShader { } pub fn is_deleted(&self) -> bool { - self.is_deleted.get() + self.marked_for_deletion.get() && !self.is_attached() } pub fn is_attached(&self) -> bool { @@ -231,7 +231,6 @@ impl WebGLShader { impl Drop for WebGLShader { fn drop(&mut self) { - assert_eq!(self.attached_counter.get(), 0); - self.delete(); + self.mark_for_deletion(); } } -- cgit v1.2.3 From 76f23f7d78b7d92f7a9c18ec873ac57e7b548dfa Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Mon, 30 Jul 2018 15:57:31 +0200 Subject: Simplify gl.getShaderParameter() (fixes #20562) The expectation change is due to the shader now using its DOM-side compile status. It is actually a bug for the shader to think it actually compiled successfully, but at least it does so consistently now. --- components/script/dom/webglshader.rs | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 558d43c220c..c3ca74fde1f 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -192,6 +192,10 @@ impl WebGLShader { } } + pub fn is_marked_for_deletion(&self) -> bool { + self.marked_for_deletion.get() + } + pub fn is_deleted(&self) -> bool { self.marked_for_deletion.get() && !self.is_attached() } -- 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/webglshader.rs | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index c3ca74fde1f..685ae99505a 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -46,11 +46,7 @@ pub struct WebGLShader { static GLSLANG_INITIALIZATION: Once = ONCE_INIT; impl WebGLShader { - fn new_inherited( - context: &WebGLRenderingContext, - id: WebGLShaderId, - shader_type: u32, - ) -> Self { + fn new_inherited(context: &WebGLRenderingContext, id: WebGLShaderId, shader_type: u32) -> Self { GLSLANG_INITIALIZATION.call_once(|| ::mozangle::shaders::initialize().unwrap()); Self { webgl_object: WebGLObject::new_inherited(context), @@ -67,7 +63,10 @@ impl WebGLShader { pub fn maybe_new(context: &WebGLRenderingContext, shader_type: u32) -> Option> { let (sender, receiver) = webgl_channel().unwrap(); context.send_command(WebGLCommand::CreateShader(shader_type, sender)); - receiver.recv().unwrap().map(|id| WebGLShader::new(context, id, shader_type)) + receiver + .recv() + .unwrap() + .map(|id| WebGLShader::new(context, id, shader_type)) } pub fn new( @@ -83,7 +82,6 @@ impl WebGLShader { } } - impl WebGLShader { pub fn id(&self) -> WebGLShaderId { self.id @@ -130,9 +128,7 @@ impl WebGLShader { } else { Output::Glsl }; - ShaderValidator::for_webgl(self.gl_type, - output_format, - ¶ms).unwrap() + ShaderValidator::for_webgl(self.gl_type, output_format, ¶ms).unwrap() }, WebGLVersion::WebGL2 => { let output_format = if cfg!(any(target_os = "android", target_os = "ios")) { @@ -149,12 +145,10 @@ impl WebGLShader { (4, 30) => Output::Glsl430Core, (4, 40) => Output::Glsl440Core, (4, _) => Output::Glsl450Core, - _ => Output::Glsl140 + _ => Output::Glsl140, } }; - ShaderValidator::for_webgl2(self.gl_type, - output_format, - ¶ms).unwrap() + ShaderValidator::for_webgl2(self.gl_type, output_format, ¶ms).unwrap() }, }; @@ -167,7 +161,8 @@ impl WebGLShader { self.upcast::() .context() .send_command(WebGLCommand::CompileShader(self.id, translated_source)); - self.compilation_status.set(ShaderCompilationStatus::Succeeded); + self.compilation_status + .set(ShaderCompilationStatus::Succeeded); }, Err(error) => { self.compilation_status.set(ShaderCompilationStatus::Failed); -- 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/webglshader.rs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 685ae99505a..9add3e686b5 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -6,17 +6,17 @@ use canvas_traits::webgl::{WebGLCommand, WebGLError}; use canvas_traits::webgl::{WebGLResult, WebGLSLVersion, WebGLShaderId}; use canvas_traits::webgl::{WebGLVersion, webgl_channel}; -use dom::bindings::cell::DomRefCell; -use dom::bindings::codegen::Bindings::WebGLShaderBinding; -use dom::bindings::inheritance::Castable; -use dom::bindings::reflector::{DomObject, reflect_dom_object}; -use dom::bindings::root::DomRoot; -use dom::bindings::str::DOMString; -use dom::webgl_extensions::WebGLExtensions; -use dom::webgl_extensions::ext::extshadertexturelod::EXTShaderTextureLod; -use dom::webgl_extensions::ext::oesstandardderivatives::OESStandardDerivatives; -use dom::webglobject::WebGLObject; -use dom::webglrenderingcontext::WebGLRenderingContext; +use crate::dom::bindings::cell::DomRefCell; +use crate::dom::bindings::codegen::Bindings::WebGLShaderBinding; +use crate::dom::bindings::inheritance::Castable; +use crate::dom::bindings::reflector::{DomObject, reflect_dom_object}; +use crate::dom::bindings::root::DomRoot; +use crate::dom::bindings::str::DOMString; +use crate::dom::webgl_extensions::WebGLExtensions; +use crate::dom::webgl_extensions::ext::extshadertexturelod::EXTShaderTextureLod; +use crate::dom::webgl_extensions::ext::oesstandardderivatives::OESStandardDerivatives; +use crate::dom::webglobject::WebGLObject; +use crate::dom::webglrenderingcontext::WebGLRenderingContext; use dom_struct::dom_struct; use mozangle::shaders::{BuiltInResources, Output, ShaderValidator}; use offscreen_gl_context::GLLimits; -- 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/webglshader.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 9add3e686b5..395bb9a9234 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -3,18 +3,18 @@ * 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, WebGLVersion}; use canvas_traits::webgl::{WebGLCommand, WebGLError}; use canvas_traits::webgl::{WebGLResult, WebGLSLVersion, WebGLShaderId}; -use canvas_traits::webgl::{WebGLVersion, webgl_channel}; use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::WebGLShaderBinding; 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::bindings::str::DOMString; -use crate::dom::webgl_extensions::WebGLExtensions; use crate::dom::webgl_extensions::ext::extshadertexturelod::EXTShaderTextureLod; use crate::dom::webgl_extensions::ext::oesstandardderivatives::OESStandardDerivatives; +use crate::dom::webgl_extensions::WebGLExtensions; use crate::dom::webglobject::WebGLObject; use crate::dom::webglrenderingcontext::WebGLRenderingContext; use dom_struct::dom_struct; @@ -22,7 +22,7 @@ use mozangle::shaders::{BuiltInResources, Output, ShaderValidator}; use offscreen_gl_context::GLLimits; use std::cell::Cell; use std::os::raw::c_int; -use std::sync::{ONCE_INIT, Once}; +use std::sync::{Once, ONCE_INIT}; #[derive(Clone, Copy, Debug, JSTraceable, MallocSizeOf, PartialEq)] pub enum ShaderCompilationStatus { -- 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/webglshader.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 395bb9a9234..0c17aa4e5d5 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.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::{webgl_channel, WebGLVersion}; -- 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/webglshader.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 0c17aa4e5d5..8f53267b50b 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.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::{webgl_channel, WebGLVersion}; -use canvas_traits::webgl::{WebGLCommand, WebGLError}; -use canvas_traits::webgl::{WebGLResult, WebGLSLVersion, WebGLShaderId}; use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::WebGLShaderBinding; use crate::dom::bindings::inheritance::Castable; @@ -17,6 +14,9 @@ use crate::dom::webgl_extensions::ext::oesstandardderivatives::OESStandardDeriva use crate::dom::webgl_extensions::WebGLExtensions; use crate::dom::webglobject::WebGLObject; use crate::dom::webglrenderingcontext::WebGLRenderingContext; +use canvas_traits::webgl::{webgl_channel, WebGLVersion}; +use canvas_traits::webgl::{WebGLCommand, WebGLError}; +use canvas_traits::webgl::{WebGLResult, WebGLSLVersion, WebGLShaderId}; use dom_struct::dom_struct; use mozangle::shaders::{BuiltInResources, Output, ShaderValidator}; use offscreen_gl_context::GLLimits; -- cgit v1.2.3 From 3121f42d52feeb17f911e29d8ef5dd31f9f2769c Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 14 Nov 2018 18:06:35 -0500 Subject: Remove offscreen_gl_context dependency from canvas_traits and script. --- components/script/dom/webglshader.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 8f53267b50b..9ee44bb8be9 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -15,11 +15,10 @@ use crate::dom::webgl_extensions::WebGLExtensions; use crate::dom::webglobject::WebGLObject; use crate::dom::webglrenderingcontext::WebGLRenderingContext; use canvas_traits::webgl::{webgl_channel, WebGLVersion}; -use canvas_traits::webgl::{WebGLCommand, WebGLError}; +use canvas_traits::webgl::{GLLimits, WebGLCommand, WebGLError}; use canvas_traits::webgl::{WebGLResult, WebGLSLVersion, WebGLShaderId}; use dom_struct::dom_struct; use mozangle::shaders::{BuiltInResources, Output, ShaderValidator}; -use offscreen_gl_context::GLLimits; use std::cell::Cell; use std::os::raw::c_int; use std::sync::{Once, ONCE_INIT}; -- 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/webglshader.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 9ee44bb8be9..bf63bdd3840 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -14,7 +14,7 @@ use crate::dom::webgl_extensions::ext::oesstandardderivatives::OESStandardDeriva use crate::dom::webgl_extensions::WebGLExtensions; use crate::dom::webglobject::WebGLObject; use crate::dom::webglrenderingcontext::WebGLRenderingContext; -use canvas_traits::webgl::{webgl_channel, WebGLVersion}; +use canvas_traits::webgl::{webgl_channel, GlType, WebGLVersion}; use canvas_traits::webgl::{GLLimits, WebGLCommand, WebGLError}; use canvas_traits::webgl::{WebGLResult, WebGLSLVersion, WebGLShaderId}; use dom_struct::dom_struct; @@ -93,6 +93,7 @@ impl WebGLShader { /// glCompileShader pub fn compile( &self, + api_type: GlType, webgl_version: WebGLVersion, glsl_version: WebGLSLVersion, limits: &GLLimits, @@ -122,7 +123,7 @@ impl WebGLShader { }; let validator = match webgl_version { WebGLVersion::WebGL1 => { - let output_format = if cfg!(any(target_os = "android", target_os = "ios")) { + let output_format = if api_type == GlType::Gles { Output::Essl } else { Output::Glsl @@ -130,7 +131,7 @@ impl WebGLShader { ShaderValidator::for_webgl(self.gl_type, output_format, ¶ms).unwrap() }, WebGLVersion::WebGL2 => { - let output_format = if cfg!(any(target_os = "android", target_os = "ios")) { + let output_format = if api_type == GlType::Gles { Output::Essl } else { match (glsl_version.major, glsl_version.minor) { -- cgit v1.2.3 From b6bd2d730207870e2ace19c018d0148315fbca7b Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Sat, 6 Jul 2019 23:07:45 +0200 Subject: Remove uses of mem::uninitialized --- components/script/dom/webglshader.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index bf63bdd3840..18ec81b1a98 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -21,7 +21,7 @@ use dom_struct::dom_struct; use mozangle::shaders::{BuiltInResources, Output, ShaderValidator}; use std::cell::Cell; use std::os::raw::c_int; -use std::sync::{Once, ONCE_INIT}; +use std::sync::Once; #[derive(Clone, Copy, Debug, JSTraceable, MallocSizeOf, PartialEq)] pub enum ShaderCompilationStatus { @@ -42,7 +42,7 @@ pub struct WebGLShader { compilation_status: Cell, } -static GLSLANG_INITIALIZATION: Once = ONCE_INIT; +static GLSLANG_INITIALIZATION: Once = Once::new(); impl WebGLShader { fn new_inherited(context: &WebGLRenderingContext, id: WebGLShaderId, shader_type: u32) -> Self { -- 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/webglshader.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 18ec81b1a98..eae89fe3dcb 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -178,12 +178,16 @@ impl WebGLShader { /// Mark this shader as deleted (if it wasn't previously) /// and delete it as if calling glDeleteShader. /// Currently does not check if shader is attached - pub fn mark_for_deletion(&self) { + pub fn mark_for_deletion(&self, fallible: bool) { if !self.marked_for_deletion.get() { self.marked_for_deletion.set(true); - self.upcast::() - .context() - .send_command(WebGLCommand::DeleteShader(self.id)); + let context = self.upcast::().context(); + let cmd = WebGLCommand::DeleteShader(self.id); + if fallible { + context.send_command_ignored(cmd); + } else { + context.send_command(cmd); + } } } @@ -230,6 +234,6 @@ impl WebGLShader { impl Drop for WebGLShader { fn drop(&mut self) { - self.mark_for_deletion(); + self.mark_for_deletion(true); } } -- cgit v1.2.3 From 156ad646a0ff9716c2d116f5b6e773d91fd226e0 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Thu, 19 Dec 2019 16:42:24 -0500 Subject: webgl: Set more ANGLE shader translation properties for WebGL 2. --- components/script/dom/webglshader.rs | 135 +++++++++++++++++++++++++++++++++-- 1 file changed, 131 insertions(+), 4 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index eae89fe3dcb..d8278b1ee5a 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -18,7 +18,7 @@ use canvas_traits::webgl::{webgl_channel, GlType, WebGLVersion}; use canvas_traits::webgl::{GLLimits, WebGLCommand, WebGLError}; use canvas_traits::webgl::{WebGLResult, WebGLSLVersion, WebGLShaderId}; use dom_struct::dom_struct; -use mozangle::shaders::{BuiltInResources, Output, ShaderValidator}; +use mozangle::shaders::{ffi, BuiltInResources, Output, ShaderValidator}; use std::cell::Cell; use std::os::raw::c_int; use std::sync::Once; @@ -81,6 +81,121 @@ impl WebGLShader { } } +// Based on https://searchfox.org/mozilla-central/rev/efdf9bb55789ea782ae3a431bda6be74a87b041e/gfx/angle/checkout/src/compiler/translator/ShaderLang.cpp#173 +fn default_validator() -> BuiltInResources { + BuiltInResources { + // Constants. + MaxVertexAttribs: 8, + MaxVertexUniformVectors: 128, + MaxVaryingVectors: 8, + MaxVertexTextureImageUnits: 0, + MaxCombinedTextureImageUnits: 8, + MaxTextureImageUnits: 8, + MaxFragmentUniformVectors: 16, + MaxDrawBuffers: 1, + + // Extensions. + OES_standard_derivatives: 0, + OES_EGL_image_external: 0, + OES_EGL_image_external_essl3: 0, + NV_EGL_stream_consumer_external: 0, + ARB_texture_rectangle: 0, + EXT_blend_func_extended: 0, + EXT_draw_buffers: 0, + EXT_frag_depth: 0, + EXT_shader_texture_lod: 0, + WEBGL_debug_shader_precision: 0, + EXT_shader_framebuffer_fetch: 0, + NV_shader_framebuffer_fetch: 0, + NV_draw_buffers: 0, + ARM_shader_framebuffer_fetch: 0, + //OVR_multiview: 0, + OVR_multiview2: 0, + EXT_YUV_target: 0, + EXT_geometry_shader: 0, + OES_texture_storage_multisample_2d_array: 0, + //OES_texture_3d: 0, + ANGLE_texture_multisample: 0, + ANGLE_multi_draw: 0, + + // Disable highp precision in fragment shader by default. + FragmentPrecisionHigh: 0, + + // GLSL ES 3.0 constants. + MaxVertexOutputVectors: 16, + MaxFragmentInputVectors: 15, + MinProgramTexelOffset: -8, + MaxProgramTexelOffset: 7, + + // Extension constants. + MaxDualSourceDrawBuffers: 0, + MaxViewsOVR: 4, + + // Disable name hashing by default. + HashFunction: None, + ArrayIndexClampingStrategy: + ffi::ShArrayIndexClampingStrategy::SH_CLAMP_WITH_CLAMP_INTRINSIC, + + MaxExpressionComplexity: 256, + MaxCallStackDepth: 256, + MaxFunctionParameters: 1024, + + // ES 3.1 Revision 4, 7.2 Built-in Constants + + // ES 3.1, Revision 4, 8.13 Texture minification + // "The value of MIN_PROGRAM_TEXTURE_GATHER_OFFSET must be less than or equal to the value of + // MIN_PROGRAM_TEXEL_OFFSET. The value of MAX_PROGRAM_TEXTURE_GATHER_OFFSET must be greater than + // or equal to the value of MAX_PROGRAM_TEXEL_OFFSET" + MinProgramTextureGatherOffset: -8, + MaxProgramTextureGatherOffset: 7, + + MaxImageUnits: 4, + MaxVertexImageUniforms: 0, + MaxFragmentImageUniforms: 0, + MaxComputeImageUniforms: 0, + MaxCombinedImageUniforms: 0, + + MaxUniformLocations: 1024, + + MaxCombinedShaderOutputResources: 4, + + MaxComputeWorkGroupCount: [65535, 65535, 65535], + MaxComputeWorkGroupSize: [128, 128, 64], + MaxComputeUniformComponents: 512, + MaxComputeTextureImageUnits: 16, + + MaxComputeAtomicCounters: 8, + MaxComputeAtomicCounterBuffers: 1, + + MaxVertexAtomicCounters: 0, + MaxFragmentAtomicCounters: 0, + MaxCombinedAtomicCounters: 8, + MaxAtomicCounterBindings: 1, + + MaxVertexAtomicCounterBuffers: 0, + MaxFragmentAtomicCounterBuffers: 0, + MaxCombinedAtomicCounterBuffers: 1, + MaxAtomicCounterBufferSize: 32, + + MaxUniformBufferBindings: 32, + MaxShaderStorageBufferBindings: 4, + MaxPointSize: 0.0, + + MaxGeometryUniformComponents: 1024, + MaxGeometryUniformBlocks: 12, + MaxGeometryInputComponents: 64, + MaxGeometryOutputComponents: 64, + MaxGeometryOutputVertices: 256, + MaxGeometryTotalOutputComponents: 1024, + MaxGeometryTextureImageUnits: 16, + MaxGeometryAtomicCounterBuffers: 0, + MaxGeometryAtomicCounters: 0, + MaxGeometryShaderStorageBlocks: 0, + MaxGeometryShaderInvocations: 32, + MaxGeometryImageUniforms: 0, + } +} + impl WebGLShader { pub fn id(&self) -> WebGLShaderId { self.id @@ -108,19 +223,31 @@ impl WebGLShader { let source = self.source.borrow(); - let params = BuiltInResources { + let mut params = BuiltInResources { MaxVertexAttribs: limits.max_vertex_attribs as c_int, MaxVertexUniformVectors: limits.max_vertex_uniform_vectors as c_int, - MaxVaryingVectors: limits.max_varying_vectors as c_int, MaxVertexTextureImageUnits: limits.max_vertex_texture_image_units as c_int, MaxCombinedTextureImageUnits: limits.max_combined_texture_image_units as c_int, MaxTextureImageUnits: limits.max_texture_image_units as c_int, MaxFragmentUniformVectors: limits.max_fragment_uniform_vectors as c_int, + + MaxVertexOutputVectors: limits.max_vertex_output_vectors as c_int, + MaxFragmentInputVectors: limits.max_fragment_input_vectors as c_int, + MaxVaryingVectors: limits.max_varying_vectors as c_int, + OES_standard_derivatives: ext.is_enabled::() as c_int, EXT_shader_texture_lod: ext.is_enabled::() as c_int, + FragmentPrecisionHigh: 1, - ..BuiltInResources::default() + ..default_validator() }; + + if webgl_version == WebGLVersion::WebGL2 { + params.MinProgramTexelOffset = limits.min_program_texel_offset as c_int; + params.MaxProgramTexelOffset = limits.max_program_texel_offset as c_int; + params.MaxDrawBuffers = limits.max_draw_buffers as c_int; + } + let validator = match webgl_version { WebGLVersion::WebGL1 => { let output_format = if api_type == GlType::Gles { -- 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/webglshader.rs | 2 -- 1 file changed, 2 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index d8278b1ee5a..5302c6c78ad 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -4,7 +4,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl use crate::dom::bindings::cell::DomRefCell; -use crate::dom::bindings::codegen::Bindings::WebGLShaderBinding; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; use crate::dom::bindings::root::DomRoot; @@ -76,7 +75,6 @@ impl WebGLShader { reflect_dom_object( Box::new(WebGLShader::new_inherited(context, id, shader_type)), &*context.global(), - WebGLShaderBinding::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/webglshader.rs | 45 ++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 5302c6c78ad..9be334f6595 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -277,8 +277,49 @@ impl WebGLShader { }, }; - match validator.compile_and_translate(&[&source]) { - Ok(translated_source) => { + // Replicating + // https://searchfox.org/mozilla-central/rev/c621276fbdd9591f52009042d959b9e19b66d49f/dom/canvas/WebGLShaderValidator.cpp#32 + let options = mozangle::shaders::ffi::SH_VARIABLES | + mozangle::shaders::ffi::SH_ENFORCE_PACKING_RESTRICTIONS | + mozangle::shaders::ffi::SH_OBJECT_CODE | + mozangle::shaders::ffi::SH_INIT_GL_POSITION | + mozangle::shaders::ffi::SH_INITIALIZE_UNINITIALIZED_LOCALS | + mozangle::shaders::ffi::SH_INIT_OUTPUT_VARIABLES | + mozangle::shaders::ffi::SH_LIMIT_EXPRESSION_COMPLEXITY | + mozangle::shaders::ffi::SH_LIMIT_CALL_STACK_DEPTH | + if cfg!(target_os = "macos") { + // Work around https://bugs.webkit.org/show_bug.cgi?id=124684, + // https://chromium.googlesource.com/angle/angle/+/5e70cf9d0b1bb + mozangle::shaders::ffi::SH_UNFOLD_SHORT_CIRCUIT | + // Work around that Mac drivers handle struct scopes incorrectly. + mozangle::shaders::ffi::SH_REGENERATE_STRUCT_NAMES | + // Work around that Intel drivers on Mac OSX handle for-loop incorrectly. + mozangle::shaders::ffi::SH_ADD_AND_TRUE_TO_LOOP_CONDITION + } else { + // We want to do this everywhere, but to do this on Mac, we need + // to do it only on Mac OSX > 10.6 as this causes the shader + // compiler in 10.6 to crash + mozangle::shaders::ffi::SH_CLAMP_INDIRECT_ARRAY_BOUNDS + }; + + // Replicating + // https://github.com/servo/mozangle/blob/706a9baaf8026c1a3cb6c67ba63aa5f4734264d0/src/shaders/mod.rs#L226 + let options = options | + mozangle::shaders::ffi::SH_VALIDATE | + mozangle::shaders::ffi::SH_OBJECT_CODE | + mozangle::shaders::ffi::SH_VARIABLES | // For uniform_name_map() + mozangle::shaders::ffi::SH_EMULATE_ABS_INT_FUNCTION | // To workaround drivers + mozangle::shaders::ffi::SH_EMULATE_ISNAN_FLOAT_FUNCTION | // To workaround drivers + mozangle::shaders::ffi::SH_EMULATE_ATAN2_FLOAT_FUNCTION | // To workaround drivers + mozangle::shaders::ffi::SH_CLAMP_INDIRECT_ARRAY_BOUNDS | + mozangle::shaders::ffi::SH_INIT_GL_POSITION | + mozangle::shaders::ffi::SH_ENFORCE_PACKING_RESTRICTIONS | + mozangle::shaders::ffi::SH_LIMIT_EXPRESSION_COMPLEXITY | + mozangle::shaders::ffi::SH_LIMIT_CALL_STACK_DEPTH; + + match validator.compile(&[&source], options) { + Ok(()) => { + let translated_source = validator.object_code(); debug!("Shader translated: {}", translated_source); // NOTE: At this point we should be pretty sure that the compilation in the paint thread // will succeed. -- 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/webglshader.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 9be334f6595..0e2a8253968 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -12,7 +12,7 @@ use crate::dom::webgl_extensions::ext::extshadertexturelod::EXTShaderTextureLod; use crate::dom::webgl_extensions::ext::oesstandardderivatives::OESStandardDerivatives; use crate::dom::webgl_extensions::WebGLExtensions; use crate::dom::webglobject::WebGLObject; -use crate::dom::webglrenderingcontext::WebGLRenderingContext; +use crate::dom::webglrenderingcontext::{Operation, WebGLRenderingContext}; use canvas_traits::webgl::{webgl_channel, GlType, WebGLVersion}; use canvas_traits::webgl::{GLLimits, WebGLCommand, WebGLError}; use canvas_traits::webgl::{WebGLResult, WebGLSLVersion, WebGLShaderId}; @@ -344,15 +344,14 @@ impl WebGLShader { /// Mark this shader as deleted (if it wasn't previously) /// and delete it as if calling glDeleteShader. /// Currently does not check if shader is attached - pub fn mark_for_deletion(&self, fallible: bool) { + pub fn mark_for_deletion(&self, operation_fallibility: Operation) { if !self.marked_for_deletion.get() { self.marked_for_deletion.set(true); let context = self.upcast::().context(); let cmd = WebGLCommand::DeleteShader(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), } } } @@ -400,6 +399,6 @@ impl WebGLShader { impl Drop for WebGLShader { fn drop(&mut self) { - self.mark_for_deletion(true); + self.mark_for_deletion(Operation::Fallible); } } -- cgit v1.2.3 From 50e15486b6632ba7ad39f259e02a94525363f7cb Mon Sep 17 00:00:00 2001 From: Alexandrov Sergey Date: Mon, 11 May 2020 10:43:33 +0300 Subject: Implement EXT_frag_depth --- components/script/dom/webglshader.rs | 2 ++ 1 file changed, 2 insertions(+) (limited to 'components/script/dom/webglshader.rs') diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 0e2a8253968..3f5f6c1cf43 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -8,6 +8,7 @@ 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::str::DOMString; +use crate::dom::webgl_extensions::ext::extfragdepth::EXTFragDepth; use crate::dom::webgl_extensions::ext::extshadertexturelod::EXTShaderTextureLod; use crate::dom::webgl_extensions::ext::oesstandardderivatives::OESStandardDerivatives; use crate::dom::webgl_extensions::WebGLExtensions; @@ -235,6 +236,7 @@ impl WebGLShader { OES_standard_derivatives: ext.is_enabled::() as c_int, EXT_shader_texture_lod: ext.is_enabled::() as c_int, + EXT_frag_depth: ext.is_enabled::() as c_int, FragmentPrecisionHigh: 1, ..default_validator() -- cgit v1.2.3