eglglobals.c revision 5e7dba541298a29f175f9d077bf6f63030465d94
1#include <stdio.h>
2#include <stdlib.h>
3#include "eglglobals.h"
4
5
6struct _egl_global _eglGlobal = { .Initialized = EGL_FALSE };
7
8
9/**
10 * Init the fields in the _eglGlobal struct
11 * May be safely called more than once.
12 */
13void
14_eglInitGlobals(void)
15{
16   if (!_eglGlobal.Initialized) {
17      _eglGlobal.Displays = _eglNewHashTable();
18      _eglGlobal.Surfaces = _eglNewHashTable();
19      _eglGlobal.FreeScreenHandle = 1;
20      _eglGlobal.Initialized = EGL_TRUE;
21
22      _eglGlobal.OpenGLESAPISupported = EGL_TRUE;
23      _eglGlobal.OpenVGAPISupported = EGL_FALSE;
24
25      /* XXX temporary */
26      _eglGlobal.ThreadInfo = _eglNewThreadInfo();
27   }
28}
29
30
31/**
32 * Should call this via an atexit handler.
33 */
34void
35_eglDestroyGlobals(void)
36{
37   /* XXX TODO walk over table entries, deleting each */
38   _eglDeleteHashTable(_eglGlobal.Displays);
39   _eglDeleteHashTable(_eglGlobal.Surfaces);
40}
41
42
43/**
44 * Allocate and init a new _EGLThreadInfo object.
45 */
46_EGLThreadInfo *
47_eglNewThreadInfo(void)
48{
49   _EGLThreadInfo *t = (_EGLThreadInfo *) calloc(1, sizeof(_EGLThreadInfo));
50   if (t) {
51      t->CurrentContext = EGL_NO_CONTEXT;
52      t->LastError = EGL_SUCCESS;
53      t->CurrentAPI = EGL_NONE;
54   }
55   return t;
56}
57
58
59/**
60 * Delete/free a _EGLThreadInfo object.
61 */
62void
63_eglDeleteThreadData(_EGLThreadInfo *t)
64{
65   free(t);
66}
67
68
69
70/**
71 * Return pointer to calling thread's _EGLThreadInfo object.
72 * Create a new one if needed.
73 * Should never return NULL.
74 */
75_EGLThreadInfo *
76_eglGetCurrentThread(void)
77{
78   _eglInitGlobals();
79
80   /* XXX temporary */
81   return _eglGlobal.ThreadInfo;
82}
83
84
85/**
86 * Record EGL error code.
87 */
88void
89_eglError(EGLint errCode, const char *msg)
90{
91   _EGLThreadInfo *t = _eglGetCurrentThread();
92   const char *s;
93
94   if (t->LastError == EGL_SUCCESS) {
95      t->LastError = errCode;
96
97      switch (errCode) {
98      case EGL_BAD_ACCESS:
99         s = "EGL_BAD_ACCESS";
100         break;
101      case EGL_BAD_ALLOC:
102         s = "EGL_BAD_ALLOC";
103         break;
104      case EGL_BAD_ATTRIBUTE:
105         s = "EGL_BAD_ATTRIBUTE";
106         break;
107      case EGL_BAD_CONFIG:
108         s = "EGL_BAD_CONFIG";
109         break;
110      case EGL_BAD_CONTEXT:
111         s = "EGL_BAD_CONTEXT";
112         break;
113      case EGL_BAD_CURRENT_SURFACE:
114         s = "EGL_BAD_CURRENT_SURFACE";
115         break;
116      case EGL_BAD_DISPLAY:
117         s = "EGL_BAD_DISPLAY";
118         break;
119      case EGL_BAD_MATCH:
120         s = "EGL_BAD_MATCH";
121         break;
122      case EGL_BAD_NATIVE_PIXMAP:
123         s = "EGL_BAD_NATIVE_PIXMAP";
124         break;
125      case EGL_BAD_NATIVE_WINDOW:
126         s = "EGL_BAD_NATIVE_WINDOW";
127         break;
128      case EGL_BAD_PARAMETER:
129         s = "EGL_BAD_PARAMETER";
130         break;
131      case EGL_BAD_SURFACE:
132         s = "EGL_BAD_SURFACE";
133         break;
134      case EGL_BAD_SCREEN_MESA:
135         s = "EGL_BAD_SCREEN_MESA";
136         break;
137      case EGL_BAD_MODE_MESA:
138         s = "EGL_BAD_MODE_MESA";
139         break;
140      default:
141         s = "other";
142      }
143      /* XXX temporary */
144      fprintf(stderr, "EGL user error 0x%x (%s) in %s\n", errCode, s, msg);
145   }
146}
147