1/*
2 * Copyright (C) 2011, 2012, 2017 Igalia S.L.
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free
16 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301 USA
18 */
19
20#include "config.h"
21#include "TextureMapperGC3DPlatformLayer.h"
22
23#if ENABLE(GRAPHICS_CONTEXT_3D) && USE(TEXTURE_MAPPER) && !USE(NICOSIA)
24
25#include "BitmapTextureGL.h"
26#include "GLContext.h"
27#include "TextureMapperGLHeaders.h"
28#include "TextureMapperPlatformLayerBuffer.h"
29#include "TextureMapperPlatformLayerProxy.h"
30
31namespace WebCore {
32
33TextureMapperGC3DPlatformLayer::TextureMapperGC3DPlatformLayer(GraphicsContext3D& context, GraphicsContext3D::RenderStyle renderStyle)
34 : m_context(context)
35{
36 switch (renderStyle) {
37 case GraphicsContext3D::RenderOffscreen:
38 m_glContext = GLContext::createOffscreenContext(&PlatformDisplay::sharedDisplayForCompositing());
39 break;
40 case GraphicsContext3D::RenderDirectlyToHostWindow:
41 ASSERT_NOT_REACHED();
42 break;
43 }
44
45#if USE(COORDINATED_GRAPHICS)
46 m_platformLayerProxy = adoptRef(new TextureMapperPlatformLayerProxy());
47#endif
48}
49
50TextureMapperGC3DPlatformLayer::~TextureMapperGC3DPlatformLayer()
51{
52#if !USE(COORDINATED_GRAPHICS)
53 if (client())
54 client()->platformLayerWillBeDestroyed();
55#endif
56}
57
58bool TextureMapperGC3DPlatformLayer::makeContextCurrent()
59{
60 ASSERT(m_glContext);
61 return m_glContext->makeContextCurrent();
62}
63
64PlatformGraphicsContext3D TextureMapperGC3DPlatformLayer::platformContext()
65{
66 ASSERT(m_glContext);
67 return m_glContext->platformContext();
68}
69
70#if USE(COORDINATED_GRAPHICS)
71RefPtr<TextureMapperPlatformLayerProxy> TextureMapperGC3DPlatformLayer::proxy() const
72{
73 return m_platformLayerProxy.copyRef();
74}
75
76void TextureMapperGC3DPlatformLayer::swapBuffersIfNeeded()
77{
78 if (m_context.layerComposited())
79 return;
80
81 m_context.prepareTexture();
82 IntSize textureSize(m_context.m_currentWidth, m_context.m_currentHeight);
83 TextureMapperGL::Flags flags = TextureMapperGL::ShouldFlipTexture | (m_context.m_attrs.alpha ? TextureMapperGL::ShouldBlend : 0);
84
85 {
86 LockHolder holder(m_platformLayerProxy->lock());
87 m_platformLayerProxy->pushNextBuffer(std::make_unique<TextureMapperPlatformLayerBuffer>(m_context.m_compositorTexture, textureSize, flags, m_context.m_internalColorFormat));
88 }
89
90 m_context.markLayerComposited();
91}
92#else
93void TextureMapperGC3DPlatformLayer::paintToTextureMapper(TextureMapper& textureMapper, const FloatRect& targetRect, const TransformationMatrix& matrix, float opacity)
94{
95 ASSERT(m_glContext);
96
97 m_context.markLayerComposited();
98
99#if USE(TEXTURE_MAPPER_GL)
100 if (m_context.m_attrs.antialias && m_context.m_state.boundFBO == m_context.m_multisampleFBO) {
101 GLContext* previousActiveContext = GLContext::current();
102 if (previousActiveContext != m_glContext.get())
103 m_context.makeContextCurrent();
104
105 m_context.resolveMultisamplingIfNecessary();
106 ::glBindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_context.m_state.boundFBO);
107
108 if (previousActiveContext && previousActiveContext != m_glContext.get())
109 previousActiveContext->makeContextCurrent();
110 }
111
112 TextureMapperGL& texmapGL = static_cast<TextureMapperGL&>(textureMapper);
113 TextureMapperGL::Flags flags = TextureMapperGL::ShouldFlipTexture | (m_context.m_attrs.alpha ? TextureMapperGL::ShouldBlend : 0);
114 IntSize textureSize(m_context.m_currentWidth, m_context.m_currentHeight);
115 texmapGL.drawTexture(m_context.m_texture, flags, textureSize, targetRect, matrix, opacity);
116#endif // USE(TEXTURE_MAPPER_GL)
117}
118#endif // USE(COORDINATED_GRAPHICS)
119
120} // namespace WebCore
121
122#endif // ENABLE(GRAPHICS_CONTEXT_3D) && USE(TEXTURE_MAPPER)
123