From d179435eabbcb2038a8c1c33f86465c10334eebc Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 15 Aug 2018 13:27:44 -0400 Subject: [PATCH] webgl: Ensure that framebuffers have a color attachment before reading or writing. --- components/script/dom/webglframebuffer.rs | 10 +++ .../script/dom/webglrenderingcontext.rs | 2 +- .../framebuffer-object-attachment.html.ini | 90 ++++++++++++++++++- .../framebuffer-object-attachment.html.ini | 31 ++++++- 4 files changed, 129 insertions(+), 4 deletions(-) diff --git a/components/script/dom/webglframebuffer.rs b/components/script/dom/webglframebuffer.rs index c2798ba4620..53d72857b54 100644 --- a/components/script/dom/webglframebuffer.rs +++ b/components/script/dom/webglframebuffer.rs @@ -203,6 +203,16 @@ impl WebGLFramebuffer { return self.status.get(); } + pub fn check_status_for_rendering(&self) -> u32 { + let result = self.check_status(); + if result == constants::FRAMEBUFFER_COMPLETE { + if self.color.borrow().is_none() { + return constants::FRAMEBUFFER_INCOMPLETE_ATTACHMENT; + } + } + result + } + pub fn renderbuffer(&self, attachment: u32, rb: Option<&WebGLRenderbuffer>) -> WebGLResult<()> { let binding = match attachment { constants::COLOR_ATTACHMENT0 => &self.color, diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index d227af7ea1a..c4ea4667cbd 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -339,7 +339,7 @@ impl WebGLRenderingContext { // this: clear() and getParameter(IMPLEMENTATION_COLOR_READ_*). fn validate_framebuffer(&self) -> WebGLResult<()> { match self.bound_framebuffer.get() { - Some(ref fb) if fb.check_status() != constants::FRAMEBUFFER_COMPLETE => { + Some(ref fb) if fb.check_status_for_rendering() != constants::FRAMEBUFFER_COMPLETE => { Err(InvalidFramebufferOperation) }, _ => Ok(()), diff --git a/tests/wpt/webgl/meta/conformance/renderbuffers/framebuffer-object-attachment.html.ini b/tests/wpt/webgl/meta/conformance/renderbuffers/framebuffer-object-attachment.html.ini index 13211175427..c887d27d401 100644 --- a/tests/wpt/webgl/meta/conformance/renderbuffers/framebuffer-object-attachment.html.ini +++ b/tests/wpt/webgl/meta/conformance/renderbuffers/framebuffer-object-attachment.html.ini @@ -1,5 +1,91 @@ [framebuffer-object-attachment.html] - expected: CRASH - [WebGL test #1: successfullyParsed should be true (of type boolean). Was undefined (of type undefined).] + [WebGL test #474: at (0, 0) expected: 0,255,0,255 was 0,0,0,0] + expected: FAIL + + [WebGL test #475: gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be 36053. Was 36054.] + expected: FAIL + + [WebGL test #465: gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be 36053. Was 36054.] + expected: FAIL + + [WebGL test #547: getError expected: INVALID_OPERATION. Was INVALID_FRAMEBUFFER_OPERATION : After CopyTexSubImage2D from missing attachment] + expected: FAIL + + [WebGL test #463: gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be 36053. Was 36054.] + expected: FAIL + + [WebGL test #478: gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be 36053. Was 36054.] + expected: FAIL + + [WebGL test #470: gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be 36053. Was 36054.] + expected: FAIL + + [WebGL test #1: gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054] + expected: FAIL + + [WebGL test #543: getError expected: INVALID_OPERATION. Was INVALID_FRAMEBUFFER_OPERATION : After ReadPixels from missing attachment] + expected: FAIL + + [WebGL test #2: gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054] + expected: FAIL + + [WebGL test #469: at (0, 0) expected: 0,255,0,255 was 0,0,0,0] + expected: FAIL + + [WebGL test #483: getError expected: NO_ERROR. Was INVALID_FRAMEBUFFER_OPERATION : ] + expected: FAIL + + [WebGL test #477: at (0, 0) expected: 0,255,0,255 was 0,0,0,0] + expected: FAIL + + [WebGL test #476: getError expected: NO_ERROR. Was INVALID_FRAMEBUFFER_OPERATION : ] + expected: FAIL + + [WebGL test #473: gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be 36053. Was 36054.] + expected: FAIL + + [WebGL test #467: at (0, 0) expected: 0,255,0,255 was 0,0,0,0] + expected: FAIL + + [WebGL test #468: gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be 36053. Was 36054.] + expected: FAIL + + [WebGL test #3: gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054] + expected: FAIL + + [WebGL test #466: getError expected: NO_ERROR. Was INVALID_FRAMEBUFFER_OPERATION : ] + expected: FAIL + + [WebGL test #471: getError expected: NO_ERROR. Was INVALID_FRAMEBUFFER_OPERATION : ] + expected: FAIL + + [WebGL test #545: getError expected: INVALID_OPERATION. Was INVALID_FRAMEBUFFER_OPERATION : After CopyTexImage2D from missing attachment] + expected: FAIL + + [WebGL test #481: getError expected: NO_ERROR. Was INVALID_FRAMEBUFFER_OPERATION : ] + expected: FAIL + + [WebGL test #507: gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT was FRAMEBUFFER_UNSUPPORTED or FRAMEBUFFER_UNSUPPORTED] + expected: FAIL + + [WebGL test #482: at (0, 0) expected: 0,255,0,255 was 0,0,0,0] + expected: FAIL + + [WebGL test #510: gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT was FRAMEBUFFER_UNSUPPORTED or FRAMEBUFFER_UNSUPPORTED] + expected: FAIL + + [WebGL test #480: gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be 36053. Was 36054.] + expected: FAIL + + [WebGL test #472: at (0, 0) expected: 0,255,0,255 was 0,0,0,0] + expected: FAIL + + [WebGL test #479: at (0, 0) expected: 0,255,0,255 was 0,0,0,0] + expected: FAIL + + [WebGL test #464: at (0, 0) expected: 0,255,0,255 was 0,0,0,0] + expected: FAIL + + [WebGL test #525: gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT was FRAMEBUFFER_UNSUPPORTED or FRAMEBUFFER_UNSUPPORTED] expected: FAIL diff --git a/tests/wpt/webgl/meta/conformance2/renderbuffers/framebuffer-object-attachment.html.ini b/tests/wpt/webgl/meta/conformance2/renderbuffers/framebuffer-object-attachment.html.ini index 28519ac2e8b..256dc0faeea 100644 --- a/tests/wpt/webgl/meta/conformance2/renderbuffers/framebuffer-object-attachment.html.ini +++ b/tests/wpt/webgl/meta/conformance2/renderbuffers/framebuffer-object-attachment.html.ini @@ -1,2 +1,31 @@ [framebuffer-object-attachment.html] - expected: CRASH + [WebGL test #13: checkFramebufferStatus expects [FRAMEBUFFER_COMPLETE\], was FRAMEBUFFER_INCOMPLETE_ATTACHMENT] + expected: FAIL + + [WebGL test #20: checkFramebufferStatus expects [FRAMEBUFFER_COMPLETE\], was FRAMEBUFFER_INCOMPLETE_ATTACHMENT] + expected: FAIL + + [WebGL test #30: getError expected: NO_ERROR. Was INVALID_ENUM : ] + expected: FAIL + + [WebGL test #21: checkFramebufferStatus expects [FRAMEBUFFER_COMPLETE\], was FRAMEBUFFER_UNSUPPORTED] + expected: FAIL + + [WebGL test #25: checkFramebufferStatus expects [FRAMEBUFFER_COMPLETE\], was FRAMEBUFFER_UNSUPPORTED] + expected: FAIL + + [WebGL test #23: checkFramebufferStatus expects [FRAMEBUFFER_COMPLETE\], was FRAMEBUFFER_UNSUPPORTED] + expected: FAIL + + [WebGL test #24: checkFramebufferStatus expects [FRAMEBUFFER_COMPLETE\], was FRAMEBUFFER_UNSUPPORTED] + expected: FAIL + + [WebGL test #22: checkFramebufferStatus expects [FRAMEBUFFER_COMPLETE\], was FRAMEBUFFER_UNSUPPORTED] + expected: FAIL + + [WebGL test #14: getError expected: NO_ERROR. Was INVALID_ENUM : ] + expected: FAIL + + [WebGL test #16: gl.getParameter(gl.RED_BITS) + gl.getParameter(gl.GREEN_BITS) + gl.getParameter(gl.BLUE_BITS) + gl.getParameter(gl.ALPHA_BITS) >= 16 should be true. Was false.] + expected: FAIL +