Merge commit 'origin/master' into gallium-0.2
[mesa.git] / src / egl / main / eglglobals.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "eglglobals.h"
4
5 struct _egl_global _eglGlobal =
6 {
7 EGL_FALSE
8 };
9
10 /**
11 * Init the fields in the _eglGlobal struct
12 * May be safely called more than once.
13 */
14 void
15 _eglInitGlobals(void)
16 {
17 if (!_eglGlobal.Initialized) {
18 _eglGlobal.Displays = _eglNewHashTable();
19 _eglGlobal.Surfaces = _eglNewHashTable();
20 _eglGlobal.FreeScreenHandle = 1;
21 _eglGlobal.Initialized = EGL_TRUE;
22
23 _eglGlobal.ClientAPIsMask = 0x0;
24
25 /* XXX temporary */
26 _eglGlobal.ThreadInfo = _eglNewThreadInfo();
27 }
28 }
29
30
31 /**
32 * Should call this via an atexit handler.
33 */
34 void
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_OPENGL_ES_API; /* default, per EGL spec */
54 }
55 return t;
56 }
57
58
59 /**
60 * Delete/free a _EGLThreadInfo object.
61 */
62 void
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 */
88 void
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 }