Add WebGLContextGroup as step toward sharing WebGL resources
[WebKit-https.git] / Source / WebCore / html / canvas / WebGLFramebuffer.h
1 /*
2  * Copyright (C) 2009 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef WebGLFramebuffer_h
27 #define WebGLFramebuffer_h
28
29 #include "WebGLContextObject.h"
30 #include "WebGLSharedObject.h"
31
32 #include <wtf/PassRefPtr.h>
33 #include <wtf/RefCounted.h>
34
35 namespace WebCore {
36
37 class WebGLRenderbuffer;
38 class WebGLTexture;
39
40 class WebGLFramebuffer : public WebGLContextObject {
41 public:
42     virtual ~WebGLFramebuffer();
43
44     static PassRefPtr<WebGLFramebuffer> create(WebGLRenderingContext*);
45
46     void setAttachmentForBoundFramebuffer(GC3Denum attachment, GC3Denum texTarget, WebGLTexture*, GC3Dint level);
47     void setAttachmentForBoundFramebuffer(GC3Denum attachment, WebGLRenderbuffer*);
48     // If an object is attached to the currently bound framebuffer, remove it.
49     void removeAttachmentFromBoundFramebuffer(WebGLSharedObject*);
50     // If a given attachment point for the currently bound framebuffer is not null, remove the attached object.
51     void removeAttachmentFromBoundFramebuffer(GC3Denum);
52     WebGLSharedObject* getAttachment(GC3Denum) const;
53
54     GC3Denum getColorBufferFormat() const;
55     GC3Dsizei getColorBufferWidth() const;
56     GC3Dsizei getColorBufferHeight() const;
57
58     // This should always be called before drawArray, drawElements, clear,
59     // readPixels, copyTexImage2D, copyTexSubImage2D if this framebuffer is
60     // currently bound.
61     // Return false if the framebuffer is incomplete; otherwise initialize
62     // the buffers if they haven't been initialized and
63     // needToInitializeRenderbuffers is true.
64     bool onAccess(GraphicsContext3D*, bool needToInitializeRenderbuffers);
65
66     // Software version of glCheckFramebufferStatus(), except that when
67     // FRAMEBUFFER_COMPLETE is returned, it is still possible for
68     // glCheckFramebufferStatus() to return FRAMEBUFFER_UNSUPPORTED,
69     // depending on hardware implementation.
70     GC3Denum checkStatus() const;
71
72     bool hasEverBeenBound() const { return object() && m_hasEverBeenBound; }
73
74     void setHasEverBeenBound() { m_hasEverBeenBound = true; }
75
76 protected:
77     WebGLFramebuffer(WebGLRenderingContext*);
78
79     virtual void deleteObjectImpl(GraphicsContext3D*, Platform3DObject);
80
81 private:
82     virtual bool isFramebuffer() const { return true; }
83
84     // Return false if framebuffer is incomplete.
85     bool initializeRenderbuffers(GraphicsContext3D*);
86
87     // Check if the framebuffer is currently bound.
88     bool isBound() const;
89
90     bool isColorAttached() const { return (m_colorAttachment && m_colorAttachment->object()); }
91     bool isDepthAttached() const { return (m_depthAttachment && m_depthAttachment->object()); }
92     bool isStencilAttached() const { return (m_stencilAttachment && m_stencilAttachment->object()); }
93     bool isDepthStencilAttached() const { return (m_depthStencilAttachment && m_depthStencilAttachment->object()); }
94
95     RefPtr<WebGLSharedObject> m_colorAttachment;
96     RefPtr<WebGLSharedObject> m_depthAttachment;
97     RefPtr<WebGLSharedObject> m_stencilAttachment;
98     RefPtr<WebGLSharedObject> m_depthStencilAttachment;
99
100     bool m_hasEverBeenBound;
101
102     GC3Denum m_texTarget;
103     GC3Dint m_texLevel;
104 };
105
106 } // namespace WebCore
107
108 #endif // WebGLFramebuffer_h