8ab7aa67a273435defba1961236d8536097aeb33
[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 GLXTransportSurface::GLXTransportSurface(SurfaceAttributes attributes)
36     : GLPlatformSurface(attributes)
37 {
38     m_sharedDisplay = X11Helper::nativeDisplay();
39     attributes |= GLPlatformSurface::DoubleBuffered;
40     m_configSelector = adoptPtr(new GLXConfigSelector(attributes));
41     OwnPtrX11<XVisualInfo> visInfo(m_configSelector->visualInfo(m_configSelector->surfaceContextConfig()));
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     glXSwapBuffers(sharedDisplay(), m_drawable);
81 }
82
83 void GLXTransportSurface::destroy()
84 {
85     GLPlatformSurface::destroy();
86
87     if (m_bufferHandle) {
88         X11Helper::destroyWindow(m_bufferHandle);
89         m_bufferHandle = 0;
90         m_drawable = 0;
91     }
92
93     m_configSelector = nullptr;
94 }
95
96 GLPlatformSurface::SurfaceAttributes GLXTransportSurface::attributes() const
97 {
98     return m_configSelector->attributes();
99 }
100
101 GLXOffScreenSurface::GLXOffScreenSurface(SurfaceAttributes surfaceAttributes)
102     : GLPlatformSurface(surfaceAttributes)
103     , m_pixmap(0)
104     , m_glxPixmap(0)
105 {
106     initialize(surfaceAttributes);
107 }
108
109 GLXOffScreenSurface::~GLXOffScreenSurface()
110 {
111 }
112
113 void GLXOffScreenSurface::initialize(SurfaceAttributes attributes)
114 {
115     m_sharedDisplay = X11Helper::nativeDisplay();
116
117     m_configSelector = adoptPtr(new GLXConfigSelector(attributes));
118
119     OwnPtrX11<XVisualInfo> visualInfo(m_configSelector->visualInfo(m_configSelector->pixmapContextConfig()));
120     X11Helper::createPixmap(&m_pixmap, *visualInfo.get());
121
122     if (!m_pixmap) {
123         destroy();
124         return;
125     }
126
127     m_glxPixmap = glXCreateGLXPixmap(m_sharedDisplay, visualInfo.get(), m_pixmap);
128
129     if (!m_glxPixmap) {
130         destroy();
131         return;
132     }
133
134     m_drawable = m_glxPixmap;
135 }
136
137 PlatformSurfaceConfig GLXOffScreenSurface::configuration()
138 {
139     return m_configSelector->pixmapContextConfig();
140 }
141
142 void GLXOffScreenSurface::destroy()
143 {
144     freeResources();
145 }
146
147 void GLXOffScreenSurface::freeResources()
148 {
149     GLPlatformSurface::destroy();
150     Display* display = sharedDisplay();
151
152     if (!display)
153         return;
154
155     if (m_glxPixmap) {
156         glXDestroyGLXPixmap(display, m_glxPixmap);
157         glXWaitGL();
158         m_glxPixmap = 0;
159     }
160
161     if (m_pixmap) {
162         X11Helper::destroyPixmap(m_pixmap);
163         m_pixmap = 0;
164     }
165
166     m_configSelector = nullptr;
167     m_drawable = 0;
168 }
169
170 }
171
172 #endif