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