dd1b62bb2063f890129966fb3ab6ce656d63148d
[WebKit-https.git] / Source / WebCore / platform / graphics / surfaces / glx / GLXConfigSelector.h
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 #ifndef GLXConfigSelector_h
27 #define GLXConfigSelector_h
28
29 #include "X11WindowResources.h"
30
31 #if USE(ACCELERATED_COMPOSITING) && USE(GLX)
32
33 namespace WebCore {
34
35 class GLXConfigSelector {
36     WTF_MAKE_NONCOPYABLE(GLXConfigSelector);
37
38 public:
39     GLXConfigSelector(Display* xDisplay, bool supportsXRenderExtension)
40         : m_pbufferFBConfig(0)
41         , m_surfaceContextFBConfig(0)
42         , m_sharedDisplay(xDisplay)
43         , m_supportsXRenderExtension(supportsXRenderExtension)
44     {
45     }
46
47     virtual ~GLXConfigSelector()
48     {
49     }
50
51     XVisualInfo* visualInfo()
52     {
53         if (!surfaceContextConfig())
54             return 0;
55
56         return glXGetVisualFromFBConfig(m_sharedDisplay, m_surfaceContextFBConfig);
57     }
58
59     GLXFBConfig pBufferContextConfig()
60     {
61         if (!m_pbufferFBConfig) {
62             static const int attributes[] = {
63                 GLX_LEVEL, 0,
64                 GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT,
65                 GLX_RENDER_TYPE,   GLX_RGBA_BIT,
66                 GLX_RED_SIZE,      1,
67                 GLX_GREEN_SIZE,    1,
68                 GLX_BLUE_SIZE,     1,
69                 GLX_DOUBLEBUFFER,  GL_FALSE,
70                 None
71             };
72
73             int numAvailableConfigs;
74             OwnPtrX11<GLXFBConfig> temp(glXChooseFBConfig(m_sharedDisplay, DefaultScreen(m_sharedDisplay), attributes, &numAvailableConfigs));
75             if (numAvailableConfigs)
76                 m_pbufferFBConfig = temp[0];
77         }
78
79         return m_pbufferFBConfig;
80     }
81
82     GLXFBConfig surfaceContextConfig()
83     {
84         if (!m_surfaceContextFBConfig)
85             createSurfaceConfig();
86
87         return m_surfaceContextFBConfig;
88     }
89
90     void reset()
91     {
92         m_pbufferFBConfig = 0;
93         m_surfaceContextFBConfig = 0;
94     }
95
96 private:
97     void createSurfaceConfig()
98     {
99         static int attributes[] = {
100             GLX_LEVEL, 0,
101             GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
102             GLX_RENDER_TYPE,   GLX_RGBA_BIT,
103             GLX_RED_SIZE,      1,
104             GLX_GREEN_SIZE,    1,
105             GLX_BLUE_SIZE,     1,
106             GLX_ALPHA_SIZE,    1,
107             GLX_DEPTH_SIZE,    1,
108             GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR,
109             GLX_DOUBLEBUFFER,  True,
110             None
111         };
112
113         int numAvailableConfigs;
114         OwnPtrX11<GLXFBConfig> temp(glXChooseFBConfig(m_sharedDisplay, DefaultScreen(m_sharedDisplay), attributes, &numAvailableConfigs));
115
116         if (!numAvailableConfigs) {
117             m_surfaceContextFBConfig = 0;
118             return;
119         }
120
121         OwnPtrX11<XVisualInfo> scopedVisualInfo;
122         for (int i = 0; i < numAvailableConfigs; ++i) {
123             scopedVisualInfo = glXGetVisualFromFBConfig(m_sharedDisplay, temp[i]);
124             if (!scopedVisualInfo.get())
125                 continue;
126 #if USE(GRAPHICS_SURFACE)
127             if (m_supportsXRenderExtension) {
128                 XRenderPictFormat* format = XRenderFindVisualFormat(m_sharedDisplay, scopedVisualInfo->visual);
129                 if (format && format->direct.alphaMask > 0) {
130                     m_surfaceContextFBConfig = temp[i];
131                     break;
132                 }
133             }
134 #endif
135             if (!m_surfaceContextFBConfig && scopedVisualInfo->depth == 32) {
136                 m_surfaceContextFBConfig = temp[i];
137                 break;
138             }
139         }
140
141         // Did not find any visual supporting alpha, select the first available config.
142         if (!m_surfaceContextFBConfig)
143             m_surfaceContextFBConfig = temp[0];
144     }
145
146     GLXFBConfig m_pbufferFBConfig;
147     GLXFBConfig m_surfaceContextFBConfig;
148     Display* m_sharedDisplay;
149     bool m_supportsXRenderExtension;
150 };
151
152 }
153
154 #endif
155
156 #endif