From 03eb7e4dd2c36265319440db38100ba9aa92e182 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 1 Aug 2018 15:40:53 -0400 Subject: [PATCH] webgl: Emulate some renderbuffer formats in non-GLES. --- .../ext/extshadertexturelod.rs | 7 +- .../ext/oeselementindexuint.rs | 7 +- .../ext/oesstandardderivatives.rs | 7 +- components/script/dom/webglrenderbuffer.rs | 33 +++++-- .../script/dom/webglrenderingcontext.rs | 19 +++- .../ext-color-buffer-float.html.ini | 24 ----- .../read-pixels-from-fbo-test.html.ini | 97 ++++++++++++++++++- ...ead-pixels-from-rgb8-into-pbo-bug.html.ini | 7 +- ...mpled-renderbuffer-initialization.html.ini | 14 ++- .../clear-srgb-color-buffer.html.ini | 11 ++- ...amebuffer-completeness-unaffected.html.ini | 3 + 11 files changed, 176 insertions(+), 53 deletions(-) diff --git a/components/script/dom/webgl_extensions/ext/extshadertexturelod.rs b/components/script/dom/webgl_extensions/ext/extshadertexturelod.rs index ce3200db18b..f31a40fd29f 100644 --- a/components/script/dom/webgl_extensions/ext/extshadertexturelod.rs +++ b/components/script/dom/webgl_extensions/ext/extshadertexturelod.rs @@ -6,7 +6,7 @@ use canvas_traits::webgl::WebGLVersion; use dom::bindings::codegen::Bindings::EXTShaderTextureLodBinding; use dom::bindings::reflector::{DomObject, Reflector, reflect_dom_object}; use dom::bindings::root::DomRoot; -use dom::webglrenderingcontext::WebGLRenderingContext; +use dom::webglrenderingcontext::{WebGLRenderingContext, is_gles}; use dom_struct::dom_struct; use super::{WebGLExtension, WebGLExtensions, WebGLExtensionSpec}; @@ -37,11 +37,8 @@ impl WebGLExtension for EXTShaderTextureLod { } fn is_supported(ext: &WebGLExtensions) -> bool { - if cfg!(any(target_os = "android", target_os = "ios")) { - return ext.supports_gl_extension("GL_EXT_shader_texture_lod"); - } // This extension is always available on desktop GL. - true + !is_gles() || ext.supports_gl_extension("GL_EXT_shader_texture_lod") } fn enable(_ext: &WebGLExtensions) {} diff --git a/components/script/dom/webgl_extensions/ext/oeselementindexuint.rs b/components/script/dom/webgl_extensions/ext/oeselementindexuint.rs index 0e5ad367547..2868ab0c41d 100644 --- a/components/script/dom/webgl_extensions/ext/oeselementindexuint.rs +++ b/components/script/dom/webgl_extensions/ext/oeselementindexuint.rs @@ -6,7 +6,7 @@ use canvas_traits::webgl::WebGLVersion; use dom::bindings::codegen::Bindings::OESElementIndexUintBinding; use dom::bindings::reflector::{DomObject, Reflector, reflect_dom_object}; use dom::bindings::root::DomRoot; -use dom::webglrenderingcontext::WebGLRenderingContext; +use dom::webglrenderingcontext::{WebGLRenderingContext, is_gles}; use dom_struct::dom_struct; use super::{WebGLExtension, WebGLExtensions, WebGLExtensionSpec}; @@ -37,11 +37,8 @@ impl WebGLExtension for OESElementIndexUint { } fn is_supported(ext: &WebGLExtensions) -> bool { - if cfg!(any(target_os = "android", target_os = "ios")) { - return ext.supports_gl_extension("GL_OES_element_index_uint"); - } // This extension is always available in desktop OpenGL. - true + !is_gles() || ext.supports_gl_extension("GL_OES_element_index_uint") } fn enable(ext: &WebGLExtensions) { diff --git a/components/script/dom/webgl_extensions/ext/oesstandardderivatives.rs b/components/script/dom/webgl_extensions/ext/oesstandardderivatives.rs index 70de0f0dada..36fb84124a5 100644 --- a/components/script/dom/webgl_extensions/ext/oesstandardderivatives.rs +++ b/components/script/dom/webgl_extensions/ext/oesstandardderivatives.rs @@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::OESStandardDerivativesBinding; use dom::bindings::codegen::Bindings::OESStandardDerivativesBinding::OESStandardDerivativesConstants; use dom::bindings::reflector::{DomObject, Reflector, reflect_dom_object}; use dom::bindings::root::DomRoot; -use dom::webglrenderingcontext::WebGLRenderingContext; +use dom::webglrenderingcontext::{WebGLRenderingContext, is_gles}; use dom_struct::dom_struct; use super::{WebGLExtension, WebGLExtensions, WebGLExtensionSpec}; @@ -37,11 +37,8 @@ impl WebGLExtension for OESStandardDerivatives { } fn is_supported(ext: &WebGLExtensions) -> bool { - if cfg!(any(target_os = "android", target_os = "ios")) { - return ext.supports_any_gl_extension(&["GL_OES_standard_derivatives"]); - } // The standard derivatives are always available in desktop OpenGL. - true + !is_gles() || ext.supports_any_gl_extension(&["GL_OES_standard_derivatives"]) } fn enable(ext: &WebGLExtensions) { 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, ) diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index ec0d5238555..fbb4929a809 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -70,6 +70,12 @@ use std::cmp; use std::ptr::{self, NonNull}; use webrender_api; +pub fn is_gles() -> bool { + // TODO: align this with the actual kind of graphics context in use, rather than + // making assumptions based on platform + cfg!(any(target_os = "android", target_os = "ios")) +} + type ImagePixelResult = Result<(Vec, Size2D, bool), ()>; pub const MAX_UNIFORM_AND_ATTRIBUTE_LEN: usize = 256; @@ -2673,10 +2679,17 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { return NullValue(); } - let (sender, receiver) = webgl_channel().unwrap(); - self.send_command(WebGLCommand::GetRenderbufferParameter(target, pname, sender)); + let result = if pname == constants::RENDERBUFFER_INTERNAL_FORMAT { + let rb = self.bound_renderbuffer.get().unwrap(); + rb.internal_format() as i32 + } else { + let (sender, receiver) = webgl_channel().unwrap(); + self.send_command(WebGLCommand::GetRenderbufferParameter(target, pname, sender)); + receiver.recv().unwrap() + }; - Int32Value(receiver.recv().unwrap()) + + Int32Value(result) } // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 diff --git a/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/extensions/ext-color-buffer-float.html.ini b/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/extensions/ext-color-buffer-float.html.ini index 361c04ec19a..5dae9ee86da 100644 --- a/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/extensions/ext-color-buffer-float.html.ini +++ b/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/extensions/ext-color-buffer-float.html.ini @@ -2,48 +2,24 @@ [WebGL test #2: getError expected: NO_ERROR. Was INVALID_ENUM : floating-point texture allocation should succeed] expected: FAIL - [WebGL test #3: floating-point R16F render target should not be supported without enabling EXT_color_buffer_float] - expected: FAIL - [WebGL test #5: getError expected: NO_ERROR. Was INVALID_ENUM : floating-point texture allocation should succeed] expected: FAIL - [WebGL test #6: floating-point RG16F render target should not be supported without enabling EXT_color_buffer_float] - expected: FAIL - [WebGL test #8: getError expected: NO_ERROR. Was INVALID_ENUM : floating-point texture allocation should succeed] expected: FAIL - [WebGL test #9: floating-point RGBA16F render target should not be supported without enabling EXT_color_buffer_float] - expected: FAIL - [WebGL test #11: getError expected: NO_ERROR. Was INVALID_ENUM : floating-point texture allocation should succeed] expected: FAIL - [WebGL test #12: floating-point R32F render target should not be supported without enabling EXT_color_buffer_float] - expected: FAIL - [WebGL test #14: getError expected: NO_ERROR. Was INVALID_ENUM : floating-point texture allocation should succeed] expected: FAIL - [WebGL test #15: floating-point RG32F render target should not be supported without enabling EXT_color_buffer_float] - expected: FAIL - [WebGL test #17: getError expected: NO_ERROR. Was INVALID_ENUM : floating-point texture allocation should succeed] expected: FAIL - [WebGL test #18: floating-point RGBA32F render target should not be supported without enabling EXT_color_buffer_float] - expected: FAIL - [WebGL test #20: getError expected: NO_ERROR. Was INVALID_ENUM : floating-point texture allocation should succeed] expected: FAIL - [WebGL test #21: floating-point R11F_G11F_B10F render target should not be supported without enabling EXT_color_buffer_float] - expected: FAIL - [WebGL test #30: getError expected: NO_ERROR. Was INVALID_ENUM : RGB16F texture allocation should succeed] expected: FAIL - [WebGL test #31: RGB16F render target should not be supported with or without enabling EXT_color_buffer_float] - expected: FAIL - diff --git a/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/reading/read-pixels-from-fbo-test.html.ini b/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/reading/read-pixels-from-fbo-test.html.ini index dc6bbc19715..088b1abbf13 100644 --- a/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/reading/read-pixels-from-fbo-test.html.ini +++ b/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/reading/read-pixels-from-fbo-test.html.ini @@ -1,2 +1,97 @@ [read-pixels-from-fbo-test.html] - expected: CRASH + [WebGL test #0: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #1: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #2: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #3: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #4: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #5: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #6: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #7: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #8: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #9: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #10: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #11: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #12: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #13: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #14: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #15: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #16: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #17: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #18: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #19: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #20: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #21: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #22: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #23: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #24: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #25: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #26: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #27: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #28: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #29: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #30: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + + [WebGL test #31: getError expected: NO_ERROR. Was INVALID_ENUM : Setting up fbo should generate no error] + expected: FAIL + diff --git a/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/reading/read-pixels-from-rgb8-into-pbo-bug.html.ini b/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/reading/read-pixels-from-rgb8-into-pbo-bug.html.ini index 670b8868b30..f428e055d34 100644 --- a/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/reading/read-pixels-from-rgb8-into-pbo-bug.html.ini +++ b/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/reading/read-pixels-from-rgb8-into-pbo-bug.html.ini @@ -1,2 +1,7 @@ [read-pixels-from-rgb8-into-pbo-bug.html] - expected: CRASH + [WebGL test #1: framebuffer with RGB8 color buffer is incomplete] + expected: FAIL + + [WebGL test #2: getError expected: NO_ERROR. Was INVALID_ENUM : Tests should complete without gl errors] + expected: FAIL + diff --git a/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/renderbuffers/multisampled-renderbuffer-initialization.html.ini b/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/renderbuffers/multisampled-renderbuffer-initialization.html.ini index cb498b9cbf8..f83f2f3eebb 100644 --- a/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/renderbuffers/multisampled-renderbuffer-initialization.html.ini +++ b/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/renderbuffers/multisampled-renderbuffer-initialization.html.ini @@ -1,2 +1,14 @@ [multisampled-renderbuffer-initialization.html] - expected: CRASH + expected: ERROR + [WebGL test #1: gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be 36053. Was 36054.] + expected: FAIL + + [WebGL test #2: getError expected: NO_ERROR. Was INVALID_ENUM : should be no errors] + expected: FAIL + + [WebGL test #3: user buffer has been cleared to green\nat (0, 0) expected: 0,255,0,255 was 0,0,0,0] + expected: FAIL + + [WebGL test #4: successfullyParsed should be true (of type boolean). Was undefined (of type undefined).] + expected: FAIL + diff --git a/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/rendering/clear-srgb-color-buffer.html.ini b/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/rendering/clear-srgb-color-buffer.html.ini index 3c99ca18172..a442fbba644 100644 --- a/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/rendering/clear-srgb-color-buffer.html.ini +++ b/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/rendering/clear-srgb-color-buffer.html.ini @@ -1,2 +1,11 @@ [clear-srgb-color-buffer.html] - expected: CRASH + expected: ERROR + [WebGL test #1: Framebuffer incomplete.] + expected: FAIL + + [WebGL test #2: should be 124,193,222,255\nat (0, 0) expected: 124,193,222,255 was 0,0,0,0] + expected: FAIL + + [WebGL test #3: successfullyParsed should be true (of type boolean). Was undefined (of type undefined).] + expected: FAIL + diff --git a/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/rendering/framebuffer-completeness-unaffected.html.ini b/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/rendering/framebuffer-completeness-unaffected.html.ini index 31e5e1e855c..cc4d5756d31 100644 --- a/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/rendering/framebuffer-completeness-unaffected.html.ini +++ b/tests/wpt/mozilla/meta/webgl/conformance-2.0.0/conformance2/rendering/framebuffer-completeness-unaffected.html.ini @@ -3,3 +3,6 @@ [WebGL test #2: successfullyParsed should be true (of type boolean). Was undefined (of type undefined).] expected: FAIL + [WebGL test #1: gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be 36053. Was 36054.] + expected: FAIL +