6 #include "eglcontext.h"
7 #include "egldisplay.h"
9 #include "eglglobals.h"
11 #include "eglsurface.h"
14 const char *DefaultDriverName
= "demo";
18 * Choose and open/init the hardware driver for the given EGLDisplay.
19 * Previously, the EGLDisplay was created with _eglNewDisplay() where
20 * we recorded the user's NativeDisplayType parameter.
22 * Now we'll use the NativeDisplayType value.
24 * Currently, the native display value is treated as a string.
25 * If the first character is ':' we interpret it as a screen or card index
26 * number (i.e. ":0" or ":1", etc)
27 * Else if the first character is '!' we interpret it as specific driver name
28 * (i.e. "!r200" or "!i830".
31 _eglChooseDriver(EGLDisplay display
)
33 _EGLDisplay
*dpy
= _eglLookupDisplay(display
);
35 const char *driverName
= DefaultDriverName
;
44 else if (name
[0] == ':' && (name
[1] >= '0' && name
[1] <= '9') && !name
[2]) {
45 printf("EGL: Use driver for screen: %s\n", name
);
46 /* XXX probe hardware here to determine which driver to open */
47 /* driverName = "something"; */
49 else if (name
[0] == '!') {
50 /* use specified driver name */
51 driverName
= name
+ 1;
52 printf("EGL: Use driver named %s\n", driverName
);
55 /* Maybe display was returned by XOpenDisplay? */
56 printf("EGL: can't parse display pointer\n");
59 drv
= _eglOpenDriver(dpy
, driverName
);
67 * Open/load the named driver and call its bootstrap function: _eglMain().
68 * \return new _EGLDriver object.
71 _eglOpenDriver(_EGLDisplay
*dpy
, const char *driverName
)
74 char driverFilename
[1000];
76 /* XXX also prepend a directory path??? */
77 sprintf(driverFilename
, "%sdriver.so", driverName
);
80 lib
= dlopen(driverFilename
, RTLD_NOW
);
85 mainFunc
= (_EGLMain_t
) dlsym(lib
, "_eglMain");
87 fprintf(stderr
, "_eglMain not found in %s", (char *) driverFilename
);
103 fprintf(stderr
, "EGLdebug: Error opening %s: %s\n",
104 driverFilename
, dlerror());
108 /* use built-in driver */
109 return _eglDefaultMain(d
);
115 _eglCloseDriver(_EGLDriver
*drv
, EGLDisplay dpy
)
117 void *handle
= drv
->LibHandle
;
119 fprintf(stderr
, "EGL debug: Closing driver\n");
122 * XXX check for currently bound context/surfaces and delete them?
125 b
= drv
->Terminate(drv
, dpy
);
132 * Given a display handle, return the _EGLDriver for that display.
135 _eglLookupDriver(EGLDisplay dpy
)
137 _EGLDisplay
*d
= _eglLookupDisplay(dpy
);
146 * Plug all the available fallback routines into the given driver's
150 _eglInitDriverFallbacks(_EGLDriver
*drv
)
152 /* If a pointer is set to NULL, then the device driver _really_ has
155 drv
->Initialize
= NULL
;
156 drv
->Terminate
= NULL
;
158 drv
->GetConfigs
= _eglGetConfigs
;
159 drv
->ChooseConfig
= _eglChooseConfig
;
160 drv
->GetConfigAttrib
= _eglGetConfigAttrib
;
162 drv
->CreateContext
= _eglCreateContext
;
163 drv
->DestroyContext
= _eglDestroyContext
;
164 drv
->MakeCurrent
= _eglMakeCurrent
;
165 drv
->QueryContext
= _eglQueryContext
;
167 drv
->CreateWindowSurface
= _eglCreateWindowSurface
;
168 drv
->CreatePixmapSurface
= _eglCreatePixmapSurface
;
169 drv
->CreatePbufferSurface
= _eglCreatePbufferSurface
;
170 drv
->DestroySurface
= _eglDestroySurface
;
171 drv
->QuerySurface
= _eglQuerySurface
;
172 drv
->SurfaceAttrib
= _eglSurfaceAttrib
;
173 drv
->BindTexImage
= _eglBindTexImage
;
174 drv
->ReleaseTexImage
= _eglReleaseTexImage
;
175 drv
->SwapInterval
= _eglSwapInterval
;
176 drv
->SwapBuffers
= _eglSwapBuffers
;
177 drv
->CopyBuffers
= _eglCopyBuffers
;
179 drv
->QueryString
= _eglQueryString
;
180 drv
->WaitGL
= _eglWaitGL
;
181 drv
->WaitNative
= _eglWaitNative
;
183 /* EGL_MESA_screen */
184 drv
->GetModesMESA
= _eglGetModesMESA
;
185 drv
->GetModeAttribMESA
= _eglGetModeAttribMESA
;
190 _eglQueryString(_EGLDriver
*drv
, EGLDisplay dpy
, EGLint name
)
196 return "Mesa Project";
202 _eglError(EGL_BAD_PARAMETER
, "eglQueryString");
209 _eglWaitGL(_EGLDriver
*drv
, EGLDisplay dpy
)
211 /* just a placeholder */
219 _eglWaitNative(_EGLDriver
*drv
, EGLDisplay dpy
, EGLint engine
)
221 /* just a placeholder */