6 #include "eglcontext.h"
7 #include "egldisplay.h"
9 #include "eglglobals.h"
11 #include "eglscreen.h"
12 #include "eglsurface.h"
15 const char *DefaultDriverName = "demodriver";
19 * Choose and open/init the hardware driver for the given EGLDisplay.
20 * Previously, the EGLDisplay was created with _eglNewDisplay() where
21 * we recorded the user's NativeDisplayType parameter.
23 * Now we'll use the NativeDisplayType value.
25 * Currently, the native display value is treated as a string.
26 * If the first character is ':' we interpret it as a screen or card index
27 * number (i.e. ":0" or ":1", etc)
28 * Else if the first character is '!' we interpret it as specific driver name
29 * (i.e. "!r200" or "!i830".
32 _eglChooseDriver(EGLDisplay display)
34 _EGLDisplay *dpy = _eglLookupDisplay(display);
36 const char *driverName = DefaultDriverName;
45 else if (name[0] == ':' && (name[1] >= '0' && name[1] <= '9') && !name[2]) {
46 printf("EGL: Use driver for screen: %s\n", name);
47 /* XXX probe hardware here to determine which driver to open */
48 /* driverName = "something"; */
50 else if (name[0] == '!') {
51 /* use specified driver name */
52 driverName = name + 1;
53 printf("EGL: Use driver named %s\n", driverName);
56 /* Maybe display was returned by XOpenDisplay? */
57 printf("EGL: can't parse display pointer\n");
60 drv = _eglOpenDriver(dpy, driverName);
68 * Open/load the named driver and call its bootstrap function: _eglMain().
69 * \return new _EGLDriver object.
72 _eglOpenDriver(_EGLDisplay *dpy, const char *driverName)
75 char driverFilename[1000];
77 /* XXX also prepend a directory path??? */
78 sprintf(driverFilename, "%s.so", driverName);
81 lib = dlopen(driverFilename, RTLD_NOW);
86 mainFunc = (_EGLMain_t) dlsym(lib, "_eglMain");
88 fprintf(stderr, "_eglMain not found in %s", (char *) driverFilename);
104 fprintf(stderr, "EGLdebug: Error opening %s: %s\n",
105 driverFilename, dlerror());
109 /* use built-in driver */
110 return _eglDefaultMain(d);
116 _eglCloseDriver(_EGLDriver *drv, EGLDisplay dpy)
118 void *handle = drv->LibHandle;
120 fprintf(stderr, "EGL debug: Closing driver\n");
123 * XXX check for currently bound context/surfaces and delete them?
126 b = drv->Terminate(drv, dpy);
133 * Given a display handle, return the _EGLDriver for that display.
136 _eglLookupDriver(EGLDisplay dpy)
138 _EGLDisplay *d = _eglLookupDisplay(dpy);
147 * Plug all the available fallback routines into the given driver's
151 _eglInitDriverFallbacks(_EGLDriver *drv)
153 /* If a pointer is set to NULL, then the device driver _really_ has
156 drv->Initialize = NULL;
157 drv->Terminate = NULL;
159 drv->GetConfigs = _eglGetConfigs;
160 drv->ChooseConfig = _eglChooseConfig;
161 drv->GetConfigAttrib = _eglGetConfigAttrib;
163 drv->CreateContext = _eglCreateContext;
164 drv->DestroyContext = _eglDestroyContext;
165 drv->MakeCurrent = _eglMakeCurrent;
166 drv->QueryContext = _eglQueryContext;
168 drv->CreateWindowSurface = _eglCreateWindowSurface;
169 drv->CreatePixmapSurface = _eglCreatePixmapSurface;
170 drv->CreatePbufferSurface = _eglCreatePbufferSurface;
171 drv->DestroySurface = _eglDestroySurface;
172 drv->QuerySurface = _eglQuerySurface;
173 drv->SurfaceAttrib = _eglSurfaceAttrib;
174 drv->BindTexImage = _eglBindTexImage;
175 drv->ReleaseTexImage = _eglReleaseTexImage;
176 drv->SwapInterval = _eglSwapInterval;
177 drv->SwapBuffers = _eglSwapBuffers;
178 drv->CopyBuffers = _eglCopyBuffers;
180 drv->QueryString = _eglQueryString;
181 drv->WaitGL = _eglWaitGL;
182 drv->WaitNative = _eglWaitNative;
184 /* EGL_MESA_screen */
185 drv->ChooseModeMESA = _eglChooseModeMESA;
186 drv->GetModesMESA = _eglGetModesMESA;
187 drv->GetModeAttribMESA = _eglGetModeAttribMESA;
188 drv->GetScreensMESA = _eglGetScreensMESA;
189 drv->CreateScreenSurfaceMESA = _eglCreateScreenSurfaceMESA;
190 drv->ShowSurfaceMESA = _eglShowSurfaceMESA;
191 drv->ScreenPositionMESA = _eglScreenPositionMESA;
192 drv->QueryScreenMESA = _eglQueryScreenMESA;
193 drv->QueryScreenSurfaceMESA = _eglQueryScreenSurfaceMESA;
194 drv->QueryScreenModeMESA = _eglQueryScreenModeMESA;
195 drv->QueryModeStringMESA = _eglQueryModeStringMESA;
200 * Examine the individual extension enable/disable flags and recompute
201 * the driver's Extensions string.
204 UpdateExtensionsString(_EGLDriver *drv)
206 drv->Extensions[0] = 0;
208 if (drv->MESA_screen_surface)
209 strcat(drv->Extensions, "EGL_MESA_screen_surface ");
210 if (drv->MESA_copy_context)
211 strcat(drv->Extensions, "EGL_MESA_copy_context ");
212 assert(strlen(drv->Extensions) < MAX_EXTENSIONS_LEN);
218 _eglQueryString(_EGLDriver *drv, EGLDisplay dpy, EGLint name)
224 return "Mesa Project";
228 UpdateExtensionsString(drv);
229 return drv->Extensions;
231 _eglError(EGL_BAD_PARAMETER, "eglQueryString");
238 _eglWaitGL(_EGLDriver *drv, EGLDisplay dpy)
240 /* just a placeholder */
248 _eglWaitNative(_EGLDriver *drv, EGLDisplay dpy, EGLint engine)
250 /* just a placeholder */