zenilib  0.5.3.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
SDL_DirectFB_opengl.c
Go to the documentation of this file.
1 /*
2  Simple DirectMedia Layer
3  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
4 
5  This software is provided 'as-is', without any express or implied
6  warranty. In no event will the authors be held liable for any damages
7  arising from the use of this software.
8 
9  Permission is granted to anyone to use this software for any purpose,
10  including commercial applications, and to alter it and redistribute it
11  freely, subject to the following restrictions:
12 
13  1. The origin of this software must not be misrepresented; you must not
14  claim that you wrote the original software. If you use this software
15  in a product, an acknowledgment in the product documentation would be
16  appreciated but is not required.
17  2. Altered source versions must be plainly marked as such, and must not be
18  misrepresented as being the original software.
19  3. This notice may not be removed or altered from any source distribution.
20 */
21 #include "SDL_config.h"
22 
23 #if SDL_VIDEO_DRIVER_DIRECTFB
24 
25 #include "SDL_DirectFB_video.h"
26 
27 #if SDL_DIRECTFB_OPENGL
28 
29 #include "SDL_DirectFB_opengl.h"
30 #include "SDL_DirectFB_window.h"
31 
32 #include <directfbgl.h>
33 #include "SDL_loadso.h"
34 #endif
35 
36 #if SDL_DIRECTFB_OPENGL
37 
38 struct SDL_GLDriverData
39 {
40  int gl_active; /* to stop switching drivers while we have a valid context */
41  int initialized;
42  DirectFB_GLContext *firstgl; /* linked list */
43 
44  /* OpenGL */
45  void (*glFinish) (void);
46  void (*glFlush) (void);
47 };
48 
49 #define OPENGL_REQUIRS_DLOPEN
50 #if defined(OPENGL_REQUIRS_DLOPEN) && defined(SDL_LOADSO_DLOPEN)
51 #include <dlfcn.h>
52 #define GL_LoadObject(X) dlopen(X, (RTLD_NOW|RTLD_GLOBAL))
53 #define GL_LoadFunction dlsym
54 #define GL_UnloadObject dlclose
55 #else
56 #define GL_LoadObject SDL_LoadObject
57 #define GL_LoadFunction SDL_LoadFunction
58 #define GL_UnloadObject SDL_UnloadObject
59 #endif
60 
61 static void DirectFB_GL_UnloadLibrary(_THIS);
62 
63 int
64 DirectFB_GL_Initialize(_THIS)
65 {
66  if (_this->gl_data) {
67  return 0;
68  }
69 
70  _this->gl_data =
71  (struct SDL_GLDriverData *) SDL_calloc(1,
72  sizeof(struct
74  if (!_this->gl_data) {
75  return SDL_OutOfMemory();
76  }
77  _this->gl_data->initialized = 0;
78 
79  ++_this->gl_data->initialized;
80  _this->gl_data->firstgl = NULL;
81 
82  if (DirectFB_GL_LoadLibrary(_this, NULL) < 0) {
83  return -1;
84  }
85 
86  /* Initialize extensions */
87  /* FIXME needed?
88  * X11_GL_InitExtensions(_this);
89  */
90 
91  return 0;
92 }
93 
94 void
95 DirectFB_GL_Shutdown(_THIS)
96 {
97  if (!_this->gl_data || (--_this->gl_data->initialized > 0)) {
98  return;
99  }
100 
101  DirectFB_GL_UnloadLibrary(_this);
102 
104  _this->gl_data = NULL;
105 }
106 
107 int
108 DirectFB_GL_LoadLibrary(_THIS, const char *path)
109 {
110  void *handle = NULL;
111 
112  SDL_DFB_DEBUG("Loadlibrary : %s\n", path);
113 
114  if (_this->gl_data->gl_active) {
115  return SDL_SetError("OpenGL context already created");
116  }
117 
118 
119  if (path == NULL) {
120  path = SDL_getenv("SDL_VIDEO_GL_DRIVER");
121  if (path == NULL) {
122  path = "libGL.so";
123  }
124  }
125 
126  handle = GL_LoadObject(path);
127  if (handle == NULL) {
128  SDL_DFB_ERR("Library not found: %s\n", path);
129  /* SDL_LoadObject() will call SDL_SetError() for us. */
130  return -1;
131  }
132 
133  SDL_DFB_DEBUG("Loaded library: %s\n", path);
134 
137  if (path) {
140  } else {
141  *_this->gl_config.driver_path = '\0';
142  }
143 
144  _this->gl_data->glFinish = DirectFB_GL_GetProcAddress(_this, "glFinish");
145  _this->gl_data->glFlush = DirectFB_GL_GetProcAddress(_this, "glFlush");
146 
147  return 0;
148 }
149 
150 static void
151 DirectFB_GL_UnloadLibrary(_THIS)
152 {
153  #if 0
154  int ret;
155 
157 
158  ret = GL_UnloadObject(_this->gl_config.dll_handle);
159  if (ret)
160  SDL_DFB_ERR("Error #%d trying to unload library.\n", ret);
163  }
164 #endif
165  /* Free OpenGL memory */
167  _this->gl_data = NULL;
168 }
169 
170 void *
171 DirectFB_GL_GetProcAddress(_THIS, const char *proc)
172 {
173  void *handle;
174 
175  handle = _this->gl_config.dll_handle;
176  return GL_LoadFunction(handle, proc);
177 }
178 
180 DirectFB_GL_CreateContext(_THIS, SDL_Window * window)
181 {
182  SDL_DFB_WINDOWDATA(window);
183  DirectFB_GLContext *context;
184 
185  SDL_DFB_ALLOC_CLEAR(context, sizeof(DirectFB_GLContext));
186 
187  SDL_DFB_CHECKERR(windata->surface->GetGL(windata->surface,
188  &context->context));
189 
190  if (!context->context)
191  return NULL;
192 
193  context->is_locked = 0;
194  context->sdl_window = window;
195 
196  context->next = _this->gl_data->firstgl;
197  _this->gl_data->firstgl = context;
198 
199  SDL_DFB_CHECK(context->context->Unlock(context->context));
200 
201  if (DirectFB_GL_MakeCurrent(_this, window, context) < 0) {
202  DirectFB_GL_DeleteContext(_this, context);
203  return NULL;
204  }
205 
206  return context;
207 
208  error:
209  return NULL;
210 }
211 
212 int
213 DirectFB_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context)
214 {
215  DirectFB_GLContext *ctx = (DirectFB_GLContext *) context;
216  DirectFB_GLContext *p;
217 
218  for (p = _this->gl_data->firstgl; p; p = p->next)
219  {
220  if (p->is_locked) {
221  SDL_DFB_CHECKERR(p->context->Unlock(p->context));
222  p->is_locked = 0;
223  }
224 
225  }
226 
227  if (ctx != NULL) {
228  SDL_DFB_CHECKERR(ctx->context->Lock(ctx->context));
229  ctx->is_locked = 1;
230  }
231 
232  return 0;
233  error:
234  return -1;
235 }
236 
237 int
238 DirectFB_GL_SetSwapInterval(_THIS, int interval)
239 {
240  return SDL_Unsupported();
241 }
242 
243 int
244 DirectFB_GL_GetSwapInterval(_THIS)
245 {
246  return 0;
247 }
248 
249 void
250 DirectFB_GL_SwapWindow(_THIS, SDL_Window * window)
251 {
252  SDL_DFB_WINDOWDATA(window);
253  DFBRegion region;
254  DirectFB_GLContext *p;
255 
256  region.x1 = 0;
257  region.y1 = 0;
258  region.x2 = window->w;
259  region.y2 = window->h;
260 
261 #if 0
262  if (devdata->glFinish)
263  devdata->glFinish();
264  else if (devdata->glFlush)
265  devdata->glFlush();
266 #endif
267 
268  for (p = _this->gl_data->firstgl; p != NULL; p = p->next)
269  if (p->sdl_window == window && p->is_locked)
270  {
271  SDL_DFB_CHECKERR(p->context->Unlock(p->context));
272  p->is_locked = 0;
273  }
274 
275  SDL_DFB_CHECKERR(windata->window_surface->Flip(windata->window_surface,NULL, DSFLIP_PIPELINE |DSFLIP_BLIT | DSFLIP_ONSYNC ));
276  return;
277  error:
278  return;
279 }
280 
281 void
282 DirectFB_GL_DeleteContext(_THIS, SDL_GLContext context)
283 {
284  DirectFB_GLContext *ctx = (DirectFB_GLContext *) context;
285  DirectFB_GLContext *p;
286 
287  if (ctx->is_locked)
288  SDL_DFB_CHECK(ctx->context->Unlock(ctx->context));
289  SDL_DFB_RELEASE(ctx->context);
290 
291  for (p = _this->gl_data->firstgl; p && p->next != ctx; p = p->next)
292  ;
293  if (p)
294  p->next = ctx->next;
295  else
296  _this->gl_data->firstgl = ctx->next;
297 
298  SDL_DFB_FREE(ctx);
299 }
300 
301 void
302 DirectFB_GL_FreeWindowContexts(_THIS, SDL_Window * window)
303 {
304  DirectFB_GLContext *p;
305 
306  for (p = _this->gl_data->firstgl; p != NULL; p = p->next)
307  if (p->sdl_window == window)
308  {
309  if (p->is_locked)
310  SDL_DFB_CHECK(p->context->Unlock(p->context));
311  SDL_DFB_RELEASE(p->context);
312  }
313 }
314 
315 void
316 DirectFB_GL_ReAllocWindowContexts(_THIS, SDL_Window * window)
317 {
318  DirectFB_GLContext *p;
319 
320  for (p = _this->gl_data->firstgl; p != NULL; p = p->next)
321  if (p->sdl_window == window)
322  {
323  SDL_DFB_WINDOWDATA(window);
324  SDL_DFB_CHECK(windata->surface->GetGL(windata->surface,
325  &p->context));
326  if (p->is_locked)
327  SDL_DFB_CHECK(p->context->Lock(p->context));
328  }
329 }
330 
331 void
332 DirectFB_GL_DestroyWindowContexts(_THIS, SDL_Window * window)
333 {
334  DirectFB_GLContext *p;
335 
336  for (p = _this->gl_data->firstgl; p != NULL; p = p->next)
337  if (p->sdl_window == window)
338  DirectFB_GL_DeleteContext(_this, p);
339 }
340 
341 #endif
342 
343 #endif /* SDL_VIDEO_DRIVER_DIRECTFB */
344 
345 /* vi: set ts=4 sw=4 expandtab: */
SDL_Window * next
Definition: SDL_sysvideo.h:102
#define SDL_DFB_FREE(x)
GLvoid **typedef void(GLAPIENTRY *PFNGLGETVERTEXATTRIBDVPROC)(GLuint
Definition: glew.h:1824
DECLSPEC void *SDLCALL SDL_calloc(size_t nmemb, size_t size)
#define NULL
Definition: ftobjs.h:61
DECLSPEC void SDLCALL SDL_free(void *mem)
void * SDL_GLContext
An opaque handle to an OpenGL context.
Definition: SDL_video.h:161
GLsizei const GLchar *const * path
Definition: glew.h:5828
ret
Definition: glew_str_glx.c:2
#define SDL_DFB_RELEASE(x)
struct SDL_GLDriverData * gl_data
Definition: SDL_sysvideo.h:315
#define glFlush
Definition: gl_mangle.h:485
static SDL_VideoDevice * _this
Definition: SDL_video.c:92
#define glFinish
Definition: gl_mangle.h:482
FT_Error error
Definition: cffdrivr.c:407
#define _THIS
GLfloat GLfloat p
Definition: glew.h:14938
DECLSPEC size_t SDLCALL SDL_strlcpy(char *dst, const char *src, size_t maxlen)
Definition: SDL_string.c:448
char driver_path[256]
Definition: SDL_sysvideo.h:298
DECLSPEC int SDLCALL SDL_SetError(const char *fmt,...)
Definition: SDL_error.c:53
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
#define SDL_DFB_ALLOC_CLEAR(r, s)
#define SDL_DFB_ERR(x...)
#define SDL_DFB_CHECKERR(x...)
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:83
#define SDL_DFB_WINDOWDATA(win)
#define SDL_DFB_CHECK(x...)
#define SDL_DFB_DEBUG(x...)
DECLSPEC char *SDLCALL SDL_getenv(const char *name)
Definition: SDL_getenv.c:179
EGLImageKHR EGLint EGLint * handle
Definition: eglext.h:284
TParseContext * context
struct SDL_VideoDevice::@87 gl_config
#define SDL_Unsupported()
Definition: SDL_error.h:53
EGLContext ctx
Definition: eglext.h:87