2 * Copyright (C) 2012 Intel Corporation. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
27 #include "EGLSurface.h"
29 #if USE(EGL) && USE(GRAPHICS_SURFACE)
33 EGLWindowTransportSurface::EGLWindowTransportSurface()
36 m_nativeResource = adoptPtr(new NativeOffScreenWindow());
37 m_configSelector = adoptPtr(new EGLConfigSelector(m_nativeResource->nativeSharedDisplay()));
38 m_sharedDisplay = m_configSelector->display();
40 if (m_sharedDisplay == EGL_NO_DISPLAY) {
41 m_configSelector = nullptr;
42 m_nativeResource = nullptr;
46 EGLConfig config = m_configSelector->surfaceContextConfig();
53 EGLint visualId = m_configSelector->nativeVisualId(config);
60 m_nativeResource->createOffScreenWindow(&m_bufferHandle, visualId);
62 if (!m_bufferHandle) {
67 m_drawable = eglCreateWindowSurface(m_sharedDisplay, m_configSelector->surfaceContextConfig(), (EGLNativeWindowType)m_bufferHandle, 0);
69 if (m_drawable == EGL_NO_SURFACE) {
70 LOG_ERROR("Failed to create EGL surface(%d).", eglGetError());
75 EGLWindowTransportSurface::~EGLWindowTransportSurface()
79 PlatformSurfaceConfig EGLWindowTransportSurface::configuration()
81 return m_configSelector->surfaceContextConfig();
84 void EGLWindowTransportSurface::swapBuffers()
89 EGLBoolean success = eglBindAPI(eglAPIVersion);
91 if (success != EGL_TRUE) {
92 LOG_ERROR("Failed to set EGL API(%d).", eglGetError());
96 success = eglSwapBuffers(m_sharedDisplay, m_drawable);
98 if (success != EGL_TRUE) {
99 LOG_ERROR("Failed to SwapBuffers(%d).", eglGetError());
104 void EGLWindowTransportSurface::destroy()
106 GLPlatformSurface::destroy();
107 m_nativeResource->destroyWindow(m_bufferHandle);
112 void EGLWindowTransportSurface::freeEGLResources()
114 if (m_drawable == EGL_NO_SURFACE || m_sharedDisplay == EGL_NO_DISPLAY)
117 EGLBoolean eglResult = eglBindAPI(eglAPIVersion);
119 if (eglResult != EGL_TRUE) {
120 LOG_ERROR("Failed to set EGL API(%d).", eglGetError());
124 eglDestroySurface(m_sharedDisplay, m_drawable);
125 m_drawable = EGL_NO_SURFACE;
128 void EGLWindowTransportSurface::setGeometry(const IntRect& newRect)
130 GLPlatformSurface::setGeometry(newRect);
131 m_nativeResource->reSizeWindow(newRect, m_bufferHandle);