4
* An object oriented GL/GLES Abstraction/Utility Layer
6
* Copyright (C) 2011 Intel Corporation.
8
* This library is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU Lesser General Public
10
* License as published by the Free Software Foundation; either
11
* version 2 of the License, or (at your option) any later version.
13
* This library is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* Lesser General Public License for more details.
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with this library. If not, see
20
* <http://www.gnu.org/licenses/>.
24
* Robert Bragg <robert@linux.intel.com>
25
* Neil Roberts <neil@linux.intel.com>
32
#include "cogl-winsys-egl-null-private.h"
33
#include "cogl-winsys-egl-private.h"
34
#include "cogl-renderer-private.h"
35
#include "cogl-framebuffer-private.h"
36
#include "cogl-onscreen-private.h"
38
static const CoglWinsysEGLVtable _cogl_winsys_egl_vtable;
40
typedef struct _CoglDisplayNull
42
int egl_surface_width;
43
int egl_surface_height;
44
gboolean have_onscreen;
48
_cogl_winsys_renderer_disconnect (CoglRenderer *renderer)
50
CoglRendererEGL *egl_renderer = renderer->winsys;
52
eglTerminate (egl_renderer->edpy);
54
g_slice_free (CoglRendererEGL, egl_renderer);
58
_cogl_winsys_renderer_connect (CoglRenderer *renderer,
61
CoglRendererEGL *egl_renderer;
63
renderer->winsys = g_slice_new0 (CoglRendererEGL);
64
egl_renderer = renderer->winsys;
66
egl_renderer->platform_vtable = &_cogl_winsys_egl_vtable;
68
egl_renderer->edpy = eglGetDisplay (EGL_DEFAULT_DISPLAY);
70
if (!_cogl_winsys_egl_renderer_connect_common (renderer, error))
76
_cogl_winsys_renderer_disconnect (renderer);
81
_cogl_winsys_egl_context_created (CoglDisplay *display,
84
CoglRenderer *renderer = display->renderer;
85
CoglRendererEGL *egl_renderer = renderer->winsys;
86
CoglDisplayEGL *egl_display = display->winsys;
87
CoglDisplayNull *null_display = egl_display->platform;
88
const char *error_message;
90
egl_display->egl_surface =
91
eglCreateWindowSurface (egl_renderer->edpy,
92
egl_display->egl_config,
93
(NativeWindowType) NULL,
95
if (egl_display->egl_surface == EGL_NO_SURFACE)
97
error_message = "Unable to create EGL window surface";
101
if (!eglMakeCurrent (egl_renderer->edpy,
102
egl_display->egl_surface,
103
egl_display->egl_surface,
104
egl_display->egl_context))
106
error_message = "Unable to eglMakeCurrent with egl surface";
110
eglQuerySurface (egl_renderer->edpy,
111
egl_display->egl_surface,
113
&null_display->egl_surface_width);
115
eglQuerySurface (egl_renderer->edpy,
116
egl_display->egl_surface,
118
&null_display->egl_surface_height);
123
g_set_error (error, COGL_WINSYS_ERROR,
124
COGL_WINSYS_ERROR_CREATE_CONTEXT,
125
"%s", error_message);
130
_cogl_winsys_egl_display_setup (CoglDisplay *display,
133
CoglDisplayEGL *egl_display = display->winsys;
134
CoglDisplayNull *null_display;
136
null_display = g_slice_new0 (CoglDisplayNull);
137
egl_display->platform = null_display;
143
_cogl_winsys_egl_display_destroy (CoglDisplay *display)
145
CoglDisplayEGL *egl_display = display->winsys;
147
g_slice_free (CoglDisplayNull, egl_display->platform);
151
_cogl_winsys_egl_cleanup_context (CoglDisplay *display)
153
CoglRenderer *renderer = display->renderer;
154
CoglRendererEGL *egl_renderer = renderer->winsys;
155
CoglDisplayEGL *egl_display = display->winsys;
157
if (egl_display->egl_surface != EGL_NO_SURFACE)
159
eglDestroySurface (egl_renderer->edpy, egl_display->egl_surface);
160
egl_display->egl_surface = EGL_NO_SURFACE;
165
_cogl_winsys_egl_onscreen_init (CoglOnscreen *onscreen,
166
EGLConfig egl_config,
169
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
170
CoglContext *context = framebuffer->context;
171
CoglDisplay *display = context->display;
172
CoglDisplayEGL *egl_display = display->winsys;
173
CoglDisplayNull *null_display = egl_display->platform;
174
CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
176
if (null_display->have_onscreen)
178
g_set_error (error, COGL_WINSYS_ERROR,
179
COGL_WINSYS_ERROR_CREATE_ONSCREEN,
180
"EGL platform only supports a single onscreen window");
184
egl_onscreen->egl_surface = egl_display->egl_surface;
186
_cogl_framebuffer_winsys_update_size (framebuffer,
187
null_display->egl_surface_width,
188
null_display->egl_surface_height);
189
null_display->have_onscreen = TRUE;
195
_cogl_winsys_egl_onscreen_deinit (CoglOnscreen *onscreen)
197
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
198
CoglContext *context = framebuffer->context;
199
CoglDisplay *display = context->display;
200
CoglDisplayEGL *egl_display = display->winsys;
201
CoglDisplayNull *null_display = egl_display->platform;
203
null_display->have_onscreen = FALSE;
206
static const CoglWinsysEGLVtable
207
_cogl_winsys_egl_vtable =
209
.display_setup = _cogl_winsys_egl_display_setup,
210
.display_destroy = _cogl_winsys_egl_display_destroy,
211
.context_created = _cogl_winsys_egl_context_created,
212
.cleanup_context = _cogl_winsys_egl_cleanup_context,
213
.onscreen_init = _cogl_winsys_egl_onscreen_init,
214
.onscreen_deinit = _cogl_winsys_egl_onscreen_deinit
217
const CoglWinsysVtable *
218
_cogl_winsys_egl_null_get_vtable (void)
220
static gboolean vtable_inited = FALSE;
221
static CoglWinsysVtable vtable;
225
/* The EGL_NULL winsys is a subclass of the EGL winsys so we
226
start by copying its vtable */
228
vtable = *_cogl_winsys_egl_get_vtable ();
230
vtable.id = COGL_WINSYS_ID_EGL_NULL;
231
vtable.name = "EGL_NULL";
233
vtable.renderer_connect = _cogl_winsys_renderer_connect;
234
vtable.renderer_disconnect = _cogl_winsys_renderer_disconnect;
236
vtable_inited = TRUE;