55ddbff87705fd28ec9c26a06c51a60a12347312
[WebKit-https.git] / Source / WebCore / platform / graphics / opengl / GLPlatformSurface.cpp
1 /*
2  * Copyright (C) 2012 Intel Corporation. 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 INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "GLPlatformSurface.h"
28
29 #if USE(ACCELERATED_COMPOSITING)
30
31 #if HAVE(GLX)
32 #include "GLXSurface.h"
33 #endif
34
35 #if USE(EGL)
36 #include "EGLSurface.h"
37 #endif
38
39 #include "NotImplemented.h"
40
41 namespace WebCore {
42
43 PassOwnPtr<GLPlatformSurface> GLPlatformSurface::createOffScreenSurface(SurfaceAttributes attributes)
44 {
45 #if USE(GLX)
46     OwnPtr<GLPlatformSurface> surface = adoptPtr(new GLXOffScreenSurface(attributes));
47
48     if (surface->drawable())
49         return surface.release();
50 #else
51     UNUSED_PARAM(attributes);
52 #endif
53
54     return nullptr;
55 }
56
57 PassOwnPtr<GLPlatformSurface> GLPlatformSurface::createTransportSurface(SurfaceAttributes attributes)
58 {
59 #if USE(GLX)
60     OwnPtr<GLPlatformSurface> surface = adoptPtr(new GLXTransportSurface(attributes));
61 #elif USE(EGL)
62     OwnPtr<GLPlatformSurface> surface = adoptPtr(new EGLWindowTransportSurface(attributes));
63 #endif
64
65     if (surface && surface->handle() && surface->drawable())
66         return surface.release();
67
68     return nullptr;
69 }
70
71 GLPlatformSurface::GLPlatformSurface(SurfaceAttributes)
72     : m_fboId(0)
73     , m_sharedDisplay(0)
74     , m_drawable(0)
75     , m_bufferHandle(0)
76 {
77 }
78
79 GLPlatformSurface::~GLPlatformSurface()
80 {
81 }
82
83 PlatformBufferHandle GLPlatformSurface::handle() const
84 {
85     return m_bufferHandle;
86 }
87
88 PlatformDrawable GLPlatformSurface::drawable() const
89 {
90     return m_drawable;
91 }
92
93 const IntRect& GLPlatformSurface::geometry() const
94 {
95     return m_rect;
96 }
97
98 PlatformDisplay GLPlatformSurface::sharedDisplay() const
99 {
100     return m_sharedDisplay;
101 }
102
103 PlatformSurfaceConfig GLPlatformSurface::configuration()
104 {
105     return 0;
106 }
107
108 void GLPlatformSurface::swapBuffers()
109 {
110     notImplemented();
111 }
112
113 void GLPlatformSurface::updateContents(const uint32_t texture)
114 {
115     if (!m_fboId)
116         glGenFramebuffers(1, &m_fboId);
117
118     int x = 0;
119     int y = 0;
120     int width = m_rect.width();
121     int height = m_rect.height();
122
123     glBindFramebuffer(GL_READ_FRAMEBUFFER, m_fboId);
124     glBindTexture(GL_TEXTURE_2D, texture);
125     glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
126     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
127     // Use NEAREST as no scale is performed during the blit.
128     glBlitFramebuffer(x, y, width, height, x, y, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
129     swapBuffers();
130 }
131
132 void GLPlatformSurface::setGeometry(const IntRect& newRect)
133 {
134     m_rect = newRect;
135 }
136
137 void GLPlatformSurface::destroy()
138 {
139     m_rect = IntRect();
140
141     if (m_fboId) {
142         glBindFramebuffer(GL_FRAMEBUFFER, 0);
143         glBindTexture(GL_TEXTURE_2D, 0);
144         glDeleteFramebuffers(1, &m_fboId);
145         m_fboId = 0;
146     }
147 }
148
149 GLPlatformSurface::SurfaceAttributes GLPlatformSurface::attributes() const
150 {
151     return GLPlatformSurface::Default;
152 }
153
154 }
155
156 #endif