69eef6efcfa65100f6c43dde21187db4397cb5fe
[WebKit-https.git] / Source / WebCore / platform / graphics / cairo / GraphicsContext3DPrivate.cpp
1 /*
2  * Copyright (C) 2011, 2012 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 "GraphicsContext3DPrivate.h"
22
23 #if ENABLE(WEBGL)
24
25 #include "HostWindow.h"
26 #include "NotImplemented.h"
27
28 #if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER) && USE(TEXTURE_MAPPER_GL)
29 #include <texmap/TextureMapperGL.h>
30 #endif
31
32 namespace WebCore {
33
34 PassOwnPtr<GraphicsContext3DPrivate> GraphicsContext3DPrivate::create(GraphicsContext3D* context, HostWindow* window)
35 {
36     return adoptPtr(new GraphicsContext3DPrivate(context, window));
37 }
38
39 GraphicsContext3DPrivate::GraphicsContext3DPrivate(GraphicsContext3D* context, HostWindow* window)
40     : m_context(context)
41     , m_window(window)
42 #if PLATFORM(GTK)
43     , m_glContext(GLContext::createSharingContext(GLContext::getContextForWidget(m_window->platformPageClient())))
44 #else
45     , m_glContext(GLContext::createContext(0, 0))
46 #endif
47 {
48 }
49
50 GraphicsContext3DPrivate::~GraphicsContext3DPrivate()
51 {
52     GLContext::removeActiveContext(m_glContext);
53 }
54
55 bool GraphicsContext3DPrivate::makeContextCurrent()
56 {
57     return m_glContext ? m_glContext->makeContextCurrent() : false;
58 }
59
60 PlatformGraphicsContext3D GraphicsContext3DPrivate::platformContext()
61 {
62     return m_glContext ? m_glContext->platformContext() : 0;
63 }
64
65 #if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER)
66 void GraphicsContext3DPrivate::paintToTextureMapper(TextureMapper* textureMapper, const FloatRect& targetRect, const TransformationMatrix& matrix, float opacity, BitmapTexture* mask)
67 {
68     if (!m_glContext)
69         return;
70
71     if (textureMapper->accelerationMode() != TextureMapper::OpenGLMode) {
72         notImplemented();
73         return;
74     }
75
76     if (m_context->m_attrs.antialias && m_context->m_boundFBO == m_context->m_multisampleFBO) {
77         GLContext* previousActiveContext = GLContext::getCurrent();
78
79         if (previousActiveContext != m_glContext)
80             m_context->makeContextCurrent();
81
82         m_context->resolveMultisamplingIfNecessary();
83
84         if (previousActiveContext && previousActiveContext != m_glContext)
85             previousActiveContext->makeContextCurrent();
86     }
87
88     TextureMapperGL* texmapGL = static_cast<TextureMapperGL*>(textureMapper);
89     TextureMapperGL::Flags flags = TextureMapperGL::ShouldFlipTexture | (m_context->m_attrs.alpha ? TextureMapperGL::SupportsBlending : 0);
90     texmapGL->drawTexture(m_context->m_texture, flags, FloatSize(1, 1), targetRect, matrix, opacity, mask);
91 }
92 #endif // USE(ACCELERATED_COMPOSITING)
93
94 } // namespace WebCore
95
96 #endif // ENABLE_WEBGL