c53108c00a11d760c51226ee9d75d8e2e57bab2e
[WebKit-https.git] / Source / WebCore / platform / graphics / blackberry / DrawingBufferBlackBerry.cpp
1 /*
2  * Copyright (c) 2010, Google Inc. All rights reserved.
3  * Copyright (C) 2011, 2012 Research In Motion Limited. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met:
8  *
9  *     * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *     * Redistributions in binary form must reproduce the above
12  * copyright notice, this list of conditions and the following disclaimer
13  * in the documentation and/or other materials provided with the
14  * distribution.
15  *     * Neither the name of Google Inc. nor the names of its
16  * contributors may be used to endorse or promote products derived from
17  * this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #include "config.h"
33 #include "DrawingBuffer.h"
34
35 #include "GraphicsContext3D.h"
36
37 #if USE(ACCELERATED_COMPOSITING)
38 #include "LayerWebKitThread.h"
39 #endif
40
41 namespace WebCore {
42
43 struct DrawingBufferInternal {
44     unsigned offscreenColorTexture;
45 #if USE(ACCELERATED_COMPOSITING)
46     RefPtr<LayerWebKitThread> platformLayer;
47 #endif
48 };
49
50 static unsigned generateColorTexture(GraphicsContext3D* context, const IntSize& size)
51 {
52     unsigned offscreenColorTexture = context->createTexture();
53     if (!offscreenColorTexture)
54         return 0;
55
56     context->bindTexture(GraphicsContext3D::TEXTURE_2D, offscreenColorTexture);
57     context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::NEAREST);
58     context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::NEAREST);
59     context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_S, GraphicsContext3D::CLAMP_TO_EDGE);
60     context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_T, GraphicsContext3D::CLAMP_TO_EDGE);
61     context->texImage2D(GraphicsContext3D::TEXTURE_2D, 0, GraphicsContext3D::RGBA, size.width(), size.height(), 0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, 0);
62     context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, offscreenColorTexture, 0);
63     return offscreenColorTexture;
64 }
65
66 DrawingBuffer::DrawingBuffer(GraphicsContext3D* context, const IntSize& size)
67     : m_context(context)
68     , m_size(size)
69     , m_fbo(context->createFramebuffer())
70 {
71     m_internal = adoptPtr(new DrawingBufferInternal);
72
73     context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_fbo);
74     m_internal->offscreenColorTexture = generateColorTexture(context, size);
75 }
76
77 DrawingBuffer::~DrawingBuffer()
78 {
79     if (!m_context)
80         return;
81
82     m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_fbo);
83     m_context->deleteTexture(m_internal->offscreenColorTexture);
84
85     clear();
86 }
87
88 #if USE(ACCELERATED_COMPOSITING)
89 void DrawingBuffer::publishToPlatformLayer()
90 {
91     if (!m_context)
92         return;
93
94     if (m_callback)
95         m_callback->willPublish();
96
97     // FIXME: We do the copy in the canvas' (child) context so that it executes in the correct order relative to
98     // other commands in the child context. This ensures that the parent texture always contains a complete
99     // frame and not some intermediate result. However, there is no synchronization to ensure that this copy
100     // happens before the compositor draws. This means we might draw stale frames sometimes. Ideally this
101     // would insert a fence into the child command stream that the compositor could wait for.
102     m_context->makeContextCurrent();
103     m_context->flush();
104 }
105 #endif
106
107 bool DrawingBuffer::reset(const IntSize& newSize)
108 {
109     if (!m_context)
110         return false;
111
112     if (m_size == newSize)
113         return false;
114
115     m_size = newSize;
116
117     m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_internal->offscreenColorTexture);
118     m_context->texImage2D(GraphicsContext3D::TEXTURE_2D, 0, GraphicsContext3D::RGBA, m_size.width(), m_size.height(), 0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, 0);
119
120     return true;
121 }
122
123 #if USE(ACCELERATED_COMPOSITING)
124 PlatformLayer* DrawingBuffer::platformLayer()
125 {
126     return m_internal->platformLayer.get();
127 }
128 #endif
129
130 } // namespace WebCore