80fc262c114ae05314cc390112c499b66850d751
[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_nativeResource = adoptPtr(new X11OffScreenWindow());
40     m_sharedDisplay = m_nativeResource->nativeSharedDisplay();
41
42     if (!m_sharedDisplay) {
43         m_nativeResource = nullptr;
44         return;
45     }
46
47     m_configSelector = adoptPtr(new GLXConfigSelector(m_sharedDisplay, m_nativeResource->isXRenderExtensionSupported()));
48     OwnPtrX11<XVisualInfo> visInfo(m_configSelector->visualInfo());
49
50     if (!visInfo.get()) {
51         destroy();
52         return;
53     }
54
55     m_nativeResource->createOffScreenWindow(&m_bufferHandle, *visInfo.get());
56
57     if (!m_bufferHandle) {
58         destroy();
59         return;
60     }
61
62     m_drawable = m_bufferHandle;
63 }
64
65 GLXTransportSurface::~GLXTransportSurface()
66 {
67 }
68
69 PlatformSurfaceConfig GLXTransportSurface::configuration()
70 {
71     return m_configSelector->surfaceContextConfig();
72 }
73
74 void GLXTransportSurface::setGeometry(const IntRect& newRect)
75 {
76     GLPlatformSurface::setGeometry(newRect);
77     m_nativeResource->reSizeWindow(newRect, m_drawable);
78     // Force resize of GL surface after window resize.
79     glXSwapBuffers(sharedDisplay(), m_drawable);
80 }
81
82 void GLXTransportSurface::swapBuffers()
83 {
84     if (!m_drawable)
85         return;
86
87     if (m_restoreNeeded) {
88         GLint oldFBO;
89         glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFBO);
90         glBindFramebuffer(GL_FRAMEBUFFER, 0);
91         glXSwapBuffers(sharedDisplay(), m_drawable);
92         glBindFramebuffer(GL_FRAMEBUFFER, oldFBO);
93     } else
94         glXSwapBuffers(sharedDisplay(), m_drawable);
95 }
96
97 void GLXTransportSurface::destroy()
98 {
99     GLPlatformSurface::destroy();
100
101     if (m_bufferHandle) {
102         m_nativeResource->destroyWindow(m_bufferHandle);
103         m_bufferHandle = 0;
104         m_drawable = 0;
105     }
106
107     m_configSelector = nullptr;
108 }
109
110 #endif
111
112 GLXPBuffer::GLXPBuffer()
113     : GLPlatformSurface()
114 {
115     initialize();
116 }
117
118 GLXPBuffer::~GLXPBuffer()
119 {
120 }
121
122 void GLXPBuffer::initialize()
123 {
124     m_nativeResource = adoptPtr(new X11OffScreenWindow());
125     m_sharedDisplay = m_nativeResource->nativeSharedDisplay();
126
127     if (!m_sharedDisplay) {
128         m_nativeResource = nullptr;
129         return;
130     }
131
132     m_configSelector = adoptPtr(new GLXConfigSelector(m_sharedDisplay, m_nativeResource->isXRenderExtensionSupported()));
133     GLXFBConfig config = m_configSelector->pBufferContextConfig();
134
135     if (!config) {
136         destroy();
137         return;
138     }
139
140     m_drawable = glXCreatePbuffer(m_sharedDisplay, config, pbufferAttributes);
141
142     if (!m_drawable) {
143         destroy();
144         return;
145     }
146
147     m_bufferHandle = m_drawable;
148 }
149
150 PlatformSurfaceConfig GLXPBuffer::configuration()
151 {
152     return m_configSelector->pBufferContextConfig();
153 }
154
155 void GLXPBuffer::destroy()
156 {
157     freeResources();
158 }
159
160 void GLXPBuffer::freeResources()
161 {
162     GLPlatformSurface::destroy();
163     Display* display = sharedDisplay();
164
165     if (m_drawable && display) {
166         glXDestroyPbuffer(display, m_drawable);
167         m_drawable = 0;
168         m_bufferHandle = 0;
169     }
170
171     m_configSelector = nullptr;
172 }
173
174 void GLXPBuffer::setGeometry(const IntRect& newRect)
175 {
176     GLPlatformSurface::setGeometry(newRect);
177 }
178
179 }
180
181 #endif