[EFL][Qt][WebGL] Share the common code between GraphicsSurfaceGLX and X11WindowResources.
[WebKit-https.git] / Source / WebCore / platform / graphics / surfaces / glx / GLXSurface.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 "GLXSurface.h"
28
29 #if USE(ACCELERATED_COMPOSITING) && USE(GLX)
30
31 namespace WebCore {
32
33 static const int pbufferAttributes[] = { GLX_PBUFFER_WIDTH, 1, GLX_PBUFFER_HEIGHT, 1, 0 };
34
35 #if USE(GRAPHICS_SURFACE)
36 GLXTransportSurface::GLXTransportSurface()
37     : GLPlatformSurface()
38 {
39     m_sharedDisplay = X11Helper::nativeDisplay();
40     m_configSelector = adoptPtr(new GLXConfigSelector());
41     OwnPtrX11<XVisualInfo> visInfo(m_configSelector->visualInfo());
42
43     if (!visInfo.get()) {
44         destroy();
45         return;
46     }
47
48     X11Helper::createOffScreenWindow(&m_bufferHandle, *visInfo.get());
49
50     if (!m_bufferHandle) {
51         destroy();
52         return;
53     }
54
55     m_drawable = m_bufferHandle;
56 }
57
58 GLXTransportSurface::~GLXTransportSurface()
59 {
60 }
61
62 PlatformSurfaceConfig GLXTransportSurface::configuration()
63 {
64     return m_configSelector->surfaceContextConfig();
65 }
66
67 void GLXTransportSurface::setGeometry(const IntRect& newRect)
68 {
69     GLPlatformSurface::setGeometry(newRect);
70     X11Helper::resizeWindow(newRect, m_drawable);
71     // Force resize of GL surface after window resize.
72     glXSwapBuffers(sharedDisplay(), m_drawable);
73 }
74
75 void GLXTransportSurface::swapBuffers()
76 {
77     if (!m_drawable)
78         return;
79
80     if (m_restoreNeeded) {
81         GLint oldFBO;
82         glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFBO);
83         glBindFramebuffer(GL_FRAMEBUFFER, 0);
84         glXSwapBuffers(sharedDisplay(), m_drawable);
85         glBindFramebuffer(GL_FRAMEBUFFER, oldFBO);
86     } else
87         glXSwapBuffers(sharedDisplay(), m_drawable);
88 }
89
90 void GLXTransportSurface::destroy()
91 {
92     GLPlatformSurface::destroy();
93
94     if (m_bufferHandle) {
95         X11Helper::destroyWindow(m_bufferHandle);
96         m_bufferHandle = 0;
97         m_drawable = 0;
98     }
99
100     m_configSelector = nullptr;
101 }
102
103 #endif
104
105 GLXPBuffer::GLXPBuffer()
106     : GLPlatformSurface()
107 {
108     initialize();
109 }
110
111 GLXPBuffer::~GLXPBuffer()
112 {
113 }
114
115 void GLXPBuffer::initialize()
116 {
117     m_sharedDisplay = X11Helper::nativeDisplay();
118
119     m_configSelector = adoptPtr(new GLXConfigSelector());
120     GLXFBConfig config = m_configSelector->pBufferContextConfig();
121
122     if (!config) {
123         destroy();
124         return;
125     }
126
127     m_drawable = glXCreatePbuffer(m_sharedDisplay, config, pbufferAttributes);
128
129     if (!m_drawable) {
130         destroy();
131         return;
132     }
133
134     m_bufferHandle = m_drawable;
135 }
136
137 PlatformSurfaceConfig GLXPBuffer::configuration()
138 {
139     return m_configSelector->pBufferContextConfig();
140 }
141
142 void GLXPBuffer::destroy()
143 {
144     freeResources();
145 }
146
147 void GLXPBuffer::freeResources()
148 {
149     GLPlatformSurface::destroy();
150     Display* display = sharedDisplay();
151
152     if (m_drawable && display) {
153         glXDestroyPbuffer(display, m_drawable);
154         m_drawable = 0;
155         m_bufferHandle = 0;
156     }
157
158     m_configSelector = nullptr;
159 }
160
161 void GLXPBuffer::setGeometry(const IntRect& newRect)
162 {
163     GLPlatformSurface::setGeometry(newRect);
164 }
165
166 }
167
168 #endif