From 9ce84d94dea493404d0133a82adc564ce9f2b232 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 29 Apr 2020 14:29:53 -0400 Subject: [PATCH] webgl: Return TEXTURE_IMMUTABLE_FORMAT as a boolean; don't panic on macOS for TEXTURE_IMMUTABLE_LEVELS. --- components/canvas/webgl_thread.rs | 5 ++++ components/canvas_traits/webgl.rs | 5 +++- components/compositing/.#compositor.rs | 1 + .../script/dom/webglrenderingcontext.rs | 14 ++++++++++ components/script/dom/webgltexture.rs | 28 +++++++++++++++---- 5 files changed, 47 insertions(+), 6 deletions(-) create mode 120000 components/compositing/.#compositor.rs diff --git a/components/canvas/webgl_thread.rs b/components/canvas/webgl_thread.rs index 0b72cc7d37b..a8abd36a3c9 100644 --- a/components/canvas/webgl_thread.rs +++ b/components/canvas/webgl_thread.rs @@ -1839,6 +1839,11 @@ impl WebGLImpl { .send(gl.get_tex_parameter_iv(target, param as u32)) .unwrap(); }, + WebGLCommand::GetTexParameterBool(target, param, ref sender) => { + sender + .send(gl.get_tex_parameter_iv(target, param as u32) != 0) + .unwrap(); + }, WebGLCommand::GetInternalFormatIntVec(target, internal_format, param, ref sender) => { match param { InternalFormatIntVec::Samples => { diff --git a/components/canvas_traits/webgl.rs b/components/canvas_traits/webgl.rs index b063db966b6..9ba78046aad 100644 --- a/components/canvas_traits/webgl.rs +++ b/components/canvas_traits/webgl.rs @@ -449,6 +449,7 @@ pub enum WebGLCommand { GetCurrentVertexAttrib(u32, WebGLSender<[f32; 4]>), GetTexParameterFloat(u32, TexParameterFloat, WebGLSender), GetTexParameterInt(u32, TexParameterInt, WebGLSender), + GetTexParameterBool(u32, TexParameterBool, WebGLSender), GetInternalFormatIntVec(u32, u32, InternalFormatIntVec, WebGLSender>), TexParameteri(u32, u32, i32), TexParameterf(u32, u32, f32), @@ -886,9 +887,11 @@ parameters! { TextureMaxLevel = gl::TEXTURE_MAX_LEVEL, TextureCompareFunc = gl::TEXTURE_COMPARE_FUNC, TextureCompareMode = gl::TEXTURE_COMPARE_MODE, - TextureImmutableFormat = gl::TEXTURE_IMMUTABLE_FORMAT, TextureImmutableLevels = gl::TEXTURE_IMMUTABLE_LEVELS, }), + Bool(TexParameterBool { + TextureImmutableFormat = gl::TEXTURE_IMMUTABLE_FORMAT, + }), } } diff --git a/components/compositing/.#compositor.rs b/components/compositing/.#compositor.rs new file mode 120000 index 00000000000..063c4ebfa1a --- /dev/null +++ b/components/compositing/.#compositor.rs @@ -0,0 +1 @@ +joshmatthews@joshmatthews-fcmd6r.1071 \ No newline at end of file diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 11df0b01903..40b60dd063d 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -2236,6 +2236,15 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { self.webgl_error(InvalidEnum); return NullValue(); } + + if let Some(value) = texture.maybe_get_tex_parameter(texparam) { + match value { + TexParameterValue::Float(v) => return DoubleValue(v as f64), + TexParameterValue::Int(v) => return Int32Value(v), + TexParameterValue::Bool(v) => return BooleanValue(v), + } + } + match texparam { TexParameter::Float(param) => { let (sender, receiver) = webgl_channel().unwrap(); @@ -2247,6 +2256,11 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { self.send_command(WebGLCommand::GetTexParameterInt(target, param, sender)); Int32Value(receiver.recv().unwrap()) }, + TexParameter::Bool(param) => { + let (sender, receiver) = webgl_channel().unwrap(); + self.send_command(WebGLCommand::GetTexParameterBool(target, param, sender)); + BooleanValue(receiver.recv().unwrap()) + }, } } diff --git a/components/script/dom/webgltexture.rs b/components/script/dom/webgltexture.rs index a9c37110c2e..2f46bb47198 100644 --- a/components/script/dom/webgltexture.rs +++ b/components/script/dom/webgltexture.rs @@ -14,7 +14,10 @@ use crate::dom::webgl_validations::types::TexImageTarget; use crate::dom::webglframebuffer::WebGLFramebuffer; use crate::dom::webglobject::WebGLObject; use crate::dom::webglrenderingcontext::{Operation, WebGLRenderingContext}; -use canvas_traits::webgl::{webgl_channel, TexDataType, TexFormat, WebGLResult, WebGLTextureId}; +use canvas_traits::webgl::{ + webgl_channel, TexDataType, TexFormat, TexParameter, TexParameterBool, TexParameterInt, + WebGLResult, WebGLTextureId, +}; use canvas_traits::webgl::{DOMToTextureCommand, WebGLCommand, WebGLError}; use dom_struct::dom_struct; use std::cell::Cell; @@ -23,6 +26,7 @@ use std::cmp; pub enum TexParameterValue { Float(f32), Int(i32), + Bool(bool), } const MAX_LEVEL_COUNT: usize = 31; @@ -37,7 +41,6 @@ pub struct WebGLTexture { /// The target to which this texture was bound the first time target: Cell>, is_deleted: Cell, - is_immutable: Cell, /// Stores information about mipmap levels and cubemap faces. #[ignore_malloc_size_of = "Arrays are cumbersome"] image_info_array: DomRefCell<[Option; MAX_LEVEL_COUNT * MAX_FACE_COUNT]>, @@ -51,6 +54,8 @@ pub struct WebGLTexture { attached_to_dom: Cell, /// Framebuffer that this texture is attached to. attached_framebuffer: MutNullableDom, + /// Number of immutable levels. + immutable_levels: Cell>, } impl WebGLTexture { @@ -60,7 +65,7 @@ impl WebGLTexture { id: id, target: Cell::new(None), is_deleted: Cell::new(false), - is_immutable: Cell::new(false), + immutable_levels: Cell::new(None), face_count: Cell::new(0), base_mipmap_level: 0, min_filter: Cell::new(constants::NEAREST_MIPMAP_LINEAR), @@ -224,13 +229,25 @@ impl WebGLTexture { } pub fn is_immutable(&self) -> bool { - self.is_immutable.get() + self.immutable_levels.get().is_some() } pub fn target(&self) -> Option { self.target.get() } + pub fn maybe_get_tex_parameter(&self, param: TexParameter) -> Option { + match param { + TexParameter::Int(TexParameterInt::TextureImmutableLevels) => Some( + TexParameterValue::Int(self.immutable_levels.get().unwrap_or(0) as i32), + ), + TexParameter::Bool(TexParameterBool::TextureImmutableFormat) => { + Some(TexParameterValue::Bool(self.is_immutable())) + }, + _ => None, + } + } + /// We have to follow the conversion rules for GLES 2.0. See: /// https://www.khronos.org/webgl/public-mailing-list/archives/1008/msg00014.html /// @@ -240,6 +257,7 @@ impl WebGLTexture { let (int_value, float_value) = match value { TexParameterValue::Int(int_value) => (int_value, int_value as f32), TexParameterValue::Float(float_value) => (float_value as i32, float_value), + TexParameterValue::Bool(_) => unreachable!("no settable tex params should be booleans"), }; let update_filter = |filter: &Cell| { @@ -465,7 +483,7 @@ impl WebGLTexture { depth = cmp::max(1, depth / 2); } - self.is_immutable.set(true); + self.immutable_levels.set(Some(levels)); if let Some(fb) = self.attached_framebuffer.get() { fb.update_status();