18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2009 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "config.h" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WEBGL) 29231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 30643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebGLFramebuffer.h" 31dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 32643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebGLRenderingContext.h" 33231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 34231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blocknamespace WebCore { 3528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 3628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhunamespace { 3728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 3828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // This function is only for depth/stencil/depth_stencil attachment. 3928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // Currently we assume these attachments are all renderbuffers. 4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch GC3Denum getInternalFormat(WebGLObject* buffer) 4128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu { 4228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu ASSERT(buffer && buffer->isRenderbuffer()); 4328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return (reinterpret_cast<WebGLRenderbuffer*>(buffer))->getInternalFormat(); 4428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 4528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 4628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu bool isUninitialized(WebGLObject* attachedObject) 4728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu { 4828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (attachedObject && attachedObject->object() && attachedObject->isRenderbuffer() 4928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu && !(reinterpret_cast<WebGLRenderbuffer*>(attachedObject))->isInitialized()) 5028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return true; 5128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return false; 5228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 5328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 5428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu void setInitialized(WebGLObject* attachedObject) 5528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu { 5628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (attachedObject && attachedObject->object() && attachedObject->isRenderbuffer()) 5728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu (reinterpret_cast<WebGLRenderbuffer*>(attachedObject))->setInitialized(); 5828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 5928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 6028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu bool isValid(WebGLObject* attachedObject) 6128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu { 6228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (attachedObject && attachedObject->object() && attachedObject->isRenderbuffer()) { 6328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (!(reinterpret_cast<WebGLRenderbuffer*>(attachedObject))->isValid()) 6428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return false; 6528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 6628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return true; 6728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 6828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 6928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} // anonymous namespace 7028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 71643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockPassRefPtr<WebGLFramebuffer> WebGLFramebuffer::create(WebGLRenderingContext* ctx) 72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 73643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return adoptRef(new WebGLFramebuffer(ctx)); 74231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 75231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 76643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebGLFramebuffer::WebGLFramebuffer(WebGLRenderingContext* ctx) 77dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch : WebGLObject(ctx) 784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang , m_hasEverBeenBound(false) 79cad810f21b803229eb11403f9209855525a25d57Steve Block , m_texTarget(0) 80cad810f21b803229eb11403f9209855525a25d57Steve Block , m_texLevel(-1) 81231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 82231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block setObject(context()->graphicsContext3D()->createFramebuffer()); 83231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 84231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebGLFramebuffer::setAttachment(GC3Denum attachment, GC3Denum texTarget, WebGLTexture* texture, GC3Dint level) 86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 875af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (!object()) 885af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return; 89cad810f21b803229eb11403f9209855525a25d57Steve Block if (texture && !texture->object()) 90cad810f21b803229eb11403f9209855525a25d57Steve Block texture = 0; 91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block switch (attachment) { 925af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke case GraphicsContext3D::COLOR_ATTACHMENT0: 93cad810f21b803229eb11403f9209855525a25d57Steve Block m_colorAttachment = texture; 94cad810f21b803229eb11403f9209855525a25d57Steve Block if (texture) { 95cad810f21b803229eb11403f9209855525a25d57Steve Block m_texTarget = texTarget; 96cad810f21b803229eb11403f9209855525a25d57Steve Block m_texLevel = level; 97cad810f21b803229eb11403f9209855525a25d57Steve Block } 985af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke break; 99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case GraphicsContext3D::DEPTH_ATTACHMENT: 100cad810f21b803229eb11403f9209855525a25d57Steve Block m_depthAttachment = texture; 101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block break; 102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case GraphicsContext3D::STENCIL_ATTACHMENT: 103cad810f21b803229eb11403f9209855525a25d57Steve Block m_stencilAttachment = texture; 104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block break; 105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT: 106cad810f21b803229eb11403f9209855525a25d57Steve Block m_depthStencilAttachment = texture; 107cad810f21b803229eb11403f9209855525a25d57Steve Block break; 108cad810f21b803229eb11403f9209855525a25d57Steve Block default: 109cad810f21b803229eb11403f9209855525a25d57Steve Block return; 110cad810f21b803229eb11403f9209855525a25d57Steve Block } 111cad810f21b803229eb11403f9209855525a25d57Steve Block} 112cad810f21b803229eb11403f9209855525a25d57Steve Block 11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebGLFramebuffer::setAttachment(GC3Denum attachment, WebGLRenderbuffer* renderbuffer) 114cad810f21b803229eb11403f9209855525a25d57Steve Block{ 115cad810f21b803229eb11403f9209855525a25d57Steve Block if (!object()) 116cad810f21b803229eb11403f9209855525a25d57Steve Block return; 117cad810f21b803229eb11403f9209855525a25d57Steve Block if (renderbuffer && !renderbuffer->object()) 118cad810f21b803229eb11403f9209855525a25d57Steve Block renderbuffer = 0; 119cad810f21b803229eb11403f9209855525a25d57Steve Block switch (attachment) { 120cad810f21b803229eb11403f9209855525a25d57Steve Block case GraphicsContext3D::COLOR_ATTACHMENT0: 121cad810f21b803229eb11403f9209855525a25d57Steve Block m_colorAttachment = renderbuffer; 122cad810f21b803229eb11403f9209855525a25d57Steve Block break; 123cad810f21b803229eb11403f9209855525a25d57Steve Block case GraphicsContext3D::DEPTH_ATTACHMENT: 124cad810f21b803229eb11403f9209855525a25d57Steve Block m_depthAttachment = renderbuffer; 125cad810f21b803229eb11403f9209855525a25d57Steve Block break; 126cad810f21b803229eb11403f9209855525a25d57Steve Block case GraphicsContext3D::STENCIL_ATTACHMENT: 127cad810f21b803229eb11403f9209855525a25d57Steve Block m_stencilAttachment = renderbuffer; 128cad810f21b803229eb11403f9209855525a25d57Steve Block break; 129cad810f21b803229eb11403f9209855525a25d57Steve Block case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT: 130cad810f21b803229eb11403f9209855525a25d57Steve Block m_depthStencilAttachment = renderbuffer; 131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block break; 1325af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke default: 1335af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return; 134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 13528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 13628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebGLObject* WebGLFramebuffer::getAttachment(GC3Denum attachment) const 13828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 13928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (!object()) 14028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return 0; 14128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu switch (attachment) { 14228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu case GraphicsContext3D::COLOR_ATTACHMENT0: 14328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return m_colorAttachment.get(); 14428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu case GraphicsContext3D::DEPTH_ATTACHMENT: 14528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return m_depthAttachment.get(); 14628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu case GraphicsContext3D::STENCIL_ATTACHMENT: 14728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return m_stencilAttachment.get(); 14828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT: 14928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return m_depthStencilAttachment.get(); 15028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu default: 15128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return 0; 15228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 1535af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} 1545af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 155bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid WebGLFramebuffer::removeAttachment(WebGLObject* attachment) 156bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 157bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (!object()) 158bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return; 159bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (attachment == m_colorAttachment.get()) 160bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_colorAttachment = 0; 161bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen else if (attachment == m_depthAttachment.get()) 162bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_depthAttachment = 0; 163bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen else if (attachment == m_stencilAttachment.get()) 164bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_stencilAttachment = 0; 165bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen else if (attachment == m_depthStencilAttachment.get()) 166bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_depthStencilAttachment = 0; 167bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen else 168bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return; 1695af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} 1705af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochGC3Dsizei WebGLFramebuffer::getWidth() const 172cad810f21b803229eb11403f9209855525a25d57Steve Block{ 173cad810f21b803229eb11403f9209855525a25d57Steve Block if (!object() || !isColorAttached()) 174cad810f21b803229eb11403f9209855525a25d57Steve Block return 0; 175cad810f21b803229eb11403f9209855525a25d57Steve Block if (m_colorAttachment->isRenderbuffer()) 176cad810f21b803229eb11403f9209855525a25d57Steve Block return (reinterpret_cast<WebGLRenderbuffer*>(m_colorAttachment.get()))->getWidth(); 177cad810f21b803229eb11403f9209855525a25d57Steve Block if (m_colorAttachment->isTexture()) 178cad810f21b803229eb11403f9209855525a25d57Steve Block return (reinterpret_cast<WebGLTexture*>(m_colorAttachment.get()))->getWidth(m_texTarget, m_texLevel); 179cad810f21b803229eb11403f9209855525a25d57Steve Block ASSERT_NOT_REACHED(); 180cad810f21b803229eb11403f9209855525a25d57Steve Block return 0; 181cad810f21b803229eb11403f9209855525a25d57Steve Block} 182cad810f21b803229eb11403f9209855525a25d57Steve Block 18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochGC3Dsizei WebGLFramebuffer::getHeight() const 184cad810f21b803229eb11403f9209855525a25d57Steve Block{ 185cad810f21b803229eb11403f9209855525a25d57Steve Block if (!object() || !isColorAttached()) 186cad810f21b803229eb11403f9209855525a25d57Steve Block return 0; 187cad810f21b803229eb11403f9209855525a25d57Steve Block if (m_colorAttachment->isRenderbuffer()) 188cad810f21b803229eb11403f9209855525a25d57Steve Block return (reinterpret_cast<WebGLRenderbuffer*>(m_colorAttachment.get()))->getHeight(); 189cad810f21b803229eb11403f9209855525a25d57Steve Block if (m_colorAttachment->isTexture()) 190cad810f21b803229eb11403f9209855525a25d57Steve Block return (reinterpret_cast<WebGLTexture*>(m_colorAttachment.get()))->getHeight(m_texTarget, m_texLevel); 191cad810f21b803229eb11403f9209855525a25d57Steve Block ASSERT_NOT_REACHED(); 192cad810f21b803229eb11403f9209855525a25d57Steve Block return 0; 193cad810f21b803229eb11403f9209855525a25d57Steve Block} 194cad810f21b803229eb11403f9209855525a25d57Steve Block 19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochGC3Denum WebGLFramebuffer::getColorBufferFormat() const 196545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{ 197cad810f21b803229eb11403f9209855525a25d57Steve Block if (!object() || !isColorAttached()) 198cad810f21b803229eb11403f9209855525a25d57Steve Block return 0; 199cad810f21b803229eb11403f9209855525a25d57Steve Block if (m_colorAttachment->isRenderbuffer()) { 200cad810f21b803229eb11403f9209855525a25d57Steve Block unsigned long format = (reinterpret_cast<WebGLRenderbuffer*>(m_colorAttachment.get()))->getInternalFormat(); 201cad810f21b803229eb11403f9209855525a25d57Steve Block switch (format) { 202cad810f21b803229eb11403f9209855525a25d57Steve Block case GraphicsContext3D::RGBA4: 203cad810f21b803229eb11403f9209855525a25d57Steve Block case GraphicsContext3D::RGB5_A1: 204cad810f21b803229eb11403f9209855525a25d57Steve Block return GraphicsContext3D::RGBA; 205cad810f21b803229eb11403f9209855525a25d57Steve Block case GraphicsContext3D::RGB565: 206cad810f21b803229eb11403f9209855525a25d57Steve Block return GraphicsContext3D::RGB; 207cad810f21b803229eb11403f9209855525a25d57Steve Block } 208cad810f21b803229eb11403f9209855525a25d57Steve Block return 0; 209545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch } 210cad810f21b803229eb11403f9209855525a25d57Steve Block if (m_colorAttachment->isTexture()) 211cad810f21b803229eb11403f9209855525a25d57Steve Block return (reinterpret_cast<WebGLTexture*>(m_colorAttachment.get()))->getInternalFormat(m_texTarget, m_texLevel); 212cad810f21b803229eb11403f9209855525a25d57Steve Block ASSERT_NOT_REACHED(); 213545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return 0; 214545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch} 215545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch 21628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhubool WebGLFramebuffer::isIncomplete(bool checkInternalFormat) const 21728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 21828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu unsigned int count = 0; 21928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (isDepthAttached()) { 22028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (checkInternalFormat && getInternalFormat(m_depthAttachment.get()) != GraphicsContext3D::DEPTH_COMPONENT16) 22128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return true; 22228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu count++; 22328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 22428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (isStencilAttached()) { 22528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (checkInternalFormat && getInternalFormat(m_stencilAttachment.get()) != GraphicsContext3D::STENCIL_INDEX8) 22628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return true; 22728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu count++; 22828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 22928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (isDepthStencilAttached()) { 23028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (checkInternalFormat && getInternalFormat(m_depthStencilAttachment.get()) != GraphicsContext3D::DEPTH_STENCIL) 23128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return true; 23228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (!isValid(m_depthStencilAttachment.get())) 23328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return true; 23428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu count++; 23528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 23628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (count > 1) 23728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return true; 23828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return false; 23928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 24028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 241f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool WebGLFramebuffer::onAccess(bool needToInitializeRenderbuffers) 24228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 24328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (isIncomplete(true)) 24428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return false; 245f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (needToInitializeRenderbuffers) 246f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return initializeRenderbuffers(); 247f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return true; 24828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 24928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 250dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid WebGLFramebuffer::deleteObjectImpl(Platform3DObject object) 251231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 252f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch context()->graphicsContext3D()->deleteFramebuffer(object); 253bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_colorAttachment = 0; 254bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_depthAttachment = 0; 255bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_stencilAttachment = 0; 256bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_depthStencilAttachment = 0; 257231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhubool WebGLFramebuffer::initializeRenderbuffers() 2605af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{ 26128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu ASSERT(object()); 2625af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke bool initColor = false, initDepth = false, initStencil = false; 26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch GC3Dbitfield mask = 0; 264bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (isUninitialized(m_colorAttachment.get())) { 2655af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke initColor = true; 2665af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke mask |= GraphicsContext3D::COLOR_BUFFER_BIT; 2675af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 268bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (isUninitialized(m_depthAttachment.get())) { 2695af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke initDepth = true; 2705af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke mask |= GraphicsContext3D::DEPTH_BUFFER_BIT; 2715af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 272bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (isUninitialized(m_stencilAttachment.get())) { 2735af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke initStencil = true; 2745af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke mask |= GraphicsContext3D::STENCIL_BUFFER_BIT; 2755af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 276bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (isUninitialized(m_depthStencilAttachment.get())) { 2775af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke initDepth = true; 2785af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke initStencil = true; 2795af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke mask |= (GraphicsContext3D::DEPTH_BUFFER_BIT | GraphicsContext3D::STENCIL_BUFFER_BIT); 2805af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 2815af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (!initColor && !initDepth && !initStencil) 28228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return true; 2835af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 2845af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke // We only clear un-initialized renderbuffers when they are ready to be 2855af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke // read, i.e., when the framebuffer is complete. 2865af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke GraphicsContext3D* g3d = context()->graphicsContext3D(); 2875af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (g3d->checkFramebufferStatus(GraphicsContext3D::FRAMEBUFFER) != GraphicsContext3D::FRAMEBUFFER_COMPLETE) 28828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return false; 2895af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch GC3Dfloat colorClearValue[] = {0, 0, 0, 0}, depthClearValue = 0; 29165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch GC3Dint stencilClearValue = 0; 29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch GC3Dboolean colorMask[] = {0, 0, 0, 0}, depthMask = 0; 29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch GC3Duint stencilMask = 0xffffffff; 29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch GC3Dboolean isScissorEnabled = 0; 29565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch GC3Dboolean isDitherEnabled = 0; 2965af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (initColor) { 2975af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->getFloatv(GraphicsContext3D::COLOR_CLEAR_VALUE, colorClearValue); 2985af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->getBooleanv(GraphicsContext3D::COLOR_WRITEMASK, colorMask); 2995af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->clearColor(0, 0, 0, 0); 3005af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->colorMask(true, true, true, true); 3015af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 3025af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (initDepth) { 3035af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->getFloatv(GraphicsContext3D::DEPTH_CLEAR_VALUE, &depthClearValue); 3045af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->getBooleanv(GraphicsContext3D::DEPTH_WRITEMASK, &depthMask); 3055af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->clearDepth(0); 3065af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->depthMask(true); 3075af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 3085af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (initStencil) { 3095af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->getIntegerv(GraphicsContext3D::STENCIL_CLEAR_VALUE, &stencilClearValue); 31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch g3d->getIntegerv(GraphicsContext3D::STENCIL_WRITEMASK, reinterpret_cast<GC3Dint*>(&stencilMask)); 3115af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->clearStencil(0); 312e14391e94c850b8bd03680c23b38978db68687a8John Reck g3d->stencilMask(0xffffffff); 3135af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 3145af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke isScissorEnabled = g3d->isEnabled(GraphicsContext3D::SCISSOR_TEST); 3155af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->disable(GraphicsContext3D::SCISSOR_TEST); 3165af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke isDitherEnabled = g3d->isEnabled(GraphicsContext3D::DITHER); 3175af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->disable(GraphicsContext3D::DITHER); 3185af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 3195af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->clear(mask); 3205af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 3215af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (initColor) { 3225af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->clearColor(colorClearValue[0], colorClearValue[1], colorClearValue[2], colorClearValue[3]); 3235af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->colorMask(colorMask[0], colorMask[1], colorMask[2], colorMask[3]); 3245af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 3255af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (initDepth) { 3265af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->clearDepth(depthClearValue); 3275af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->depthMask(depthMask); 3285af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 3295af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (initStencil) { 3305af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->clearStencil(stencilClearValue); 3315af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->stencilMask(stencilMask); 3325af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 3335af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (isScissorEnabled) 3345af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->enable(GraphicsContext3D::SCISSOR_TEST); 3355af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke else 3365af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->disable(GraphicsContext3D::SCISSOR_TEST); 3375af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (isDitherEnabled) 3385af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->enable(GraphicsContext3D::DITHER); 3395af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke else 3405af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g3d->disable(GraphicsContext3D::DITHER); 3415af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 3425af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (initColor) 343bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen setInitialized(m_colorAttachment.get()); 3445af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (initDepth && initStencil && m_depthStencilAttachment) 345bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen setInitialized(m_depthStencilAttachment.get()); 3465af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke else { 3475af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (initDepth) 348bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen setInitialized(m_depthAttachment.get()); 3495af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (initStencil) 350bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen setInitialized(m_stencilAttachment.get()); 3515af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 35228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return true; 3535af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} 3545af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 356231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 3572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // ENABLE(WEBGL) 358