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