<!--Copyright (c) 2019 The Khronos Group Inc.Use of this source code is governed by an MIT-style license that can befound in the LICENSE.txt file.--><!DOCTYPE html><html><head><metacharset="utf-8"><linkrel="stylesheet"href="../../resources/js-test-style.css"/><scriptsrc="../../js/js-test-pre.js"></script><scriptsrc="../../js/webgl-test-utils.js"></script></head><body><canvasid="testbed"width="40"height="40"style="width: 40px; height: 40px;"></canvas><divid="description"></div><divid="console"></div><script>"use strict";varwtu=WebGLTestUtils;description('Verify multisampled renderbuffers are initialized to 0 before being read in WebGL');vargl=wtu.create3DContext("testbed",null,2);if(!gl){testFailed('canvas.getContext() failed');}else{// Set the clear color to green. It should never show up.gl.clearColor(0,1,0,1);letc=gl.canvas;varmaxSamples=gl.getInternalformatParameter(gl.RENDERBUFFER,gl.RGBA8,gl.SAMPLES)[0];for(leti=0;i<2;++i){runTest(gl,{alloc1:{w:c.width,h:c.height,s:maxSamples},alloc2:null});runTest(gl,{alloc1:null,alloc2:{w:c.width,h:c.height,s:maxSamples}});// Tests for initially allocating at the wrong size.// This is caused by a Qualcomm driver bug: http://crbug.com/696126runTest(gl,{alloc1:{w:5,h:5,s:maxSamples},alloc2:{w:c.width,h:c.height,s:maxSamples}});runTest(gl,{alloc1:{w:5,h:5,s:maxSamples},alloc2:{w:c.width,h:c.height,s:0}});runTest(gl,{alloc1:{w:5,h:5,s:0},alloc2:{w:c.width,h:c.height,s:maxSamples}});}// Testing buffer clearing won't change the clear values.varclearColor=gl.getParameter(gl.COLOR_CLEAR_VALUE);shouldBe("clearColor","[0, 1, 0, 1]");wtu.glErrorShouldBe(gl,gl.NO_ERROR,'should be no errors');}functionrunTest(gl,params){debug("Test for color buffer: "+JSON.stringify(params));letresolve=params.alloc2?params.alloc2:params.alloc1;wtu.checkCanvasRect(gl,0,0,resolve.w,resolve.h,[0,0,0,0],"internal buffers have been initialized to 0");// fill the back buffer so we know that reading below happens from// the renderbuffer.gl.clear(gl.COLOR_BUFFER_BIT);// Set up non-multisampled buffer to blit to and read back from.varfbo=gl.createFramebuffer();gl.bindFramebuffer(gl.FRAMEBUFFER,fbo);varbuffer=gl.createRenderbuffer();gl.bindRenderbuffer(gl.RENDERBUFFER,buffer);gl.renderbufferStorage(gl.RENDERBUFFER,gl.RGBA8,resolve.w,resolve.h);attachBuffer(buffer);shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)","gl.FRAMEBUFFER_COMPLETE");wtu.glErrorShouldBe(gl,gl.NO_ERROR,'should be no errors');gl.clear(gl.COLOR_BUFFER_BIT);wtu.checkCanvasRect(gl,0,0,resolve.w,resolve.h,[0,255,0,255],"user buffer has been cleared to green");// Set up multisampled buffer to test.varfbo_m=gl.createFramebuffer();gl.bindFramebuffer(gl.FRAMEBUFFER,fbo_m);varbuffer_m=gl.createRenderbuffer();gl.bindRenderbuffer(gl.RENDERBUFFER,buffer_m);if(params.alloc1){allocStorage(params.alloc1.w,params.alloc1.h,params.alloc1.s);}attachBuffer(buffer_m);if(params.alloc2){if(params.alloc1){// Clear the FBO in order to make sure framebufferRenderbuffer is// committed. (In Firefox, framebufferRenderbuffer is deferred, so// this is needed to trigger the bug.)gl.clear(gl.COLOR_BUFFER_BIT);}allocStorage(params.alloc2.w,params.alloc2.h,params.alloc2.s);}functionallocStorage(width,height,samples){gl.renderbufferStorageMultisample(gl.RENDERBUFFER,samples,gl.RGBA8,width,height);wtu.glErrorShouldBe(gl,gl.NO_ERROR,"should be no error after renderbufferStorageMultisample(RGBA8).");}functionattachBuffer(buffer){gl.framebufferRenderbuffer(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.RENDERBUFFER,buffer);wtu.glErrorShouldBe(gl,gl.NO_ERROR,"should be no error after framebufferRenderbuffer.");}shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)","gl.FRAMEBUFFER_COMPLETE");wtu.glErrorShouldBe(gl,gl.NO_ERROR,'should be no errors');// Blit from multisampled buffer to non-multisampled buffer.gl.bindFramebuffer(gl.READ_FRAMEBUFFER,fbo_m);gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER,fbo);// Blit color from fbo_m (should be black) to fbo (should be green)gl.blitFramebuffer(0,0,resolve.w,resolve.h,0,0,resolve.w,resolve.h,gl.COLOR_BUFFER_BIT,gl.NEAREST);wtu.glErrorShouldBe(gl,gl.NO_ERROR,'should be no errors');gl.bindFramebuffer(gl.FRAMEBUFFER,fbo);wtu.checkCanvasRect(gl,0,0,resolve.w,resolve.h,[0,0,0,0],"user buffer has been initialized to 0");gl.deleteFramebuffer(fbo_m);gl.deleteRenderbuffer(buffer_m);gl.deleteFramebuffer(fbo);gl.deleteRenderbuffer(buffer);// this clear should not matter we are about to resizegl.clear(gl.COLOR_BUFFER_BIT);gl.canvas.width+=1;gl.canvas.height+=1;wtu.glErrorShouldBe(gl,gl.NO_ERROR,'should be no errors');debug('');}varsuccessfullyParsed=true;</script><scriptsrc="../../js/js-test-post.js"></script></body></html>