mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 22:49:13 +02:00
egl: misc updates/fixes
Set surface size when created. Implement dri_find_dri_screen(). Look for "egl_xxx_dri.so" library before regular DRI driver.
This commit is contained in:
parent
93ff702b4f
commit
70b0a949b0
1 changed files with 76 additions and 17 deletions
|
|
@ -118,6 +118,10 @@ struct xdri_egl_config
|
|||
};
|
||||
|
||||
|
||||
/* XXX temp hack */
|
||||
static struct xdri_egl_driver *TheDriver = NULL;
|
||||
|
||||
|
||||
/** cast wrapper */
|
||||
static struct xdri_egl_driver *
|
||||
xdri_egl_driver(_EGLDriver *drv)
|
||||
|
|
@ -154,6 +158,21 @@ lookup_config(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config)
|
|||
|
||||
|
||||
|
||||
/** Get size of given window */
|
||||
static Status
|
||||
get_drawable_size(Display *dpy, Drawable d, uint *width, uint *height)
|
||||
{
|
||||
Window root;
|
||||
Status stat;
|
||||
int xpos, ypos;
|
||||
unsigned int w, h, bw, depth;
|
||||
stat = XGetGeometry(dpy, d, &root, &xpos, &ypos, &w, &h, &bw, &depth);
|
||||
*width = w;
|
||||
*height = h;
|
||||
return stat;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Produce a set of EGL configs.
|
||||
* Note that we get the list of GLcontextModes from the GLX library.
|
||||
|
|
@ -273,24 +292,25 @@ dri_context_modes_create(unsigned count, size_t minimum_size)
|
|||
static __DRIscreen *
|
||||
dri_find_dri_screen(__DRInativeDisplay *ndpy, int scrn)
|
||||
{
|
||||
/* unused? */
|
||||
return NULL;
|
||||
assert(TheDriver);
|
||||
|
||||
return &TheDriver->driScreen;
|
||||
}
|
||||
|
||||
|
||||
static GLboolean
|
||||
dri_window_exists(__DRInativeDisplay *dpy, __DRIid draw)
|
||||
dri_window_exists(__DRInativeDisplay *ndpy, __DRIid draw)
|
||||
{
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
static GLboolean
|
||||
dri_create_context(__DRInativeDisplay *dpy, int screenNum, int configID,
|
||||
dri_create_context(__DRInativeDisplay *ndpy, int screenNum, int configID,
|
||||
void * contextID, drm_context_t * hw_context)
|
||||
{
|
||||
assert(configID >= 0);
|
||||
return XF86DRICreateContextWithConfig(dpy, screenNum,
|
||||
return XF86DRICreateContextWithConfig(ndpy, screenNum,
|
||||
configID, contextID, hw_context);
|
||||
}
|
||||
|
||||
|
|
@ -325,7 +345,7 @@ dri_destroy_drawable(__DRInativeDisplay * ndpy, int screen, __DRIid drawable)
|
|||
|
||||
|
||||
static GLboolean
|
||||
dri_get_drawable_info(__DRInativeDisplay *dpy, int scrn,
|
||||
dri_get_drawable_info(__DRInativeDisplay *ndpy, int scrn,
|
||||
__DRIid draw, unsigned int * index, unsigned int * stamp,
|
||||
int * x, int * y, int * width, int * height,
|
||||
int * numClipRects, drm_clip_rect_t ** pClipRects,
|
||||
|
|
@ -335,7 +355,7 @@ dri_get_drawable_info(__DRInativeDisplay *dpy, int scrn,
|
|||
{
|
||||
_eglLog(_EGL_DEBUG, "XDRI: %s", __FUNCTION__);
|
||||
|
||||
if (!XF86DRIGetDrawableInfo(dpy, scrn, draw, index, stamp,
|
||||
if (!XF86DRIGetDrawableInfo(ndpy, scrn, draw, index, stamp,
|
||||
x, y, width, height,
|
||||
numClipRects, pClipRects,
|
||||
backX, backY,
|
||||
|
|
@ -570,17 +590,29 @@ load_dri_driver(struct xdri_egl_driver *xdri_drv)
|
|||
char filename[100];
|
||||
int flags = RTLD_NOW;
|
||||
|
||||
/* try "egl_xxx_dri.so" first */
|
||||
snprintf(filename, sizeof(filename), "egl_%s.so", xdri_drv->dri_driver_name);
|
||||
_eglLog(_EGL_DEBUG, "XDRI: dlopen(%s)", filename);
|
||||
xdri_drv->dri_driver_handle = dlopen(filename, flags);
|
||||
if (xdri_drv->dri_driver_handle) {
|
||||
_eglLog(_EGL_DEBUG, "XDRI: dlopen(%s) OK", filename);
|
||||
return EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
_eglLog(_EGL_DEBUG, "XDRI: dlopen(%s) fail (%s)", filename, dlerror());
|
||||
}
|
||||
|
||||
/* try regular "xxx_dri.so" next */
|
||||
snprintf(filename, sizeof(filename), "%s.so", xdri_drv->dri_driver_name);
|
||||
_eglLog(_EGL_DEBUG, "XDRI: dlopen(%s)", filename);
|
||||
|
||||
xdri_drv->dri_driver_handle = dlopen(filename, flags);
|
||||
if (!xdri_drv->dri_driver_handle) {
|
||||
_eglLog(_EGL_WARNING, "XDRI Could not open %s (%s)",
|
||||
filename, dlerror());
|
||||
|
||||
return EGL_FALSE;
|
||||
if (xdri_drv->dri_driver_handle) {
|
||||
_eglLog(_EGL_DEBUG, "XDRI: dlopen(%s) OK", filename);
|
||||
return EGL_TRUE;
|
||||
}
|
||||
return EGL_TRUE;
|
||||
|
||||
_eglLog(_EGL_WARNING, "XDRI Could not open %s (%s)", filename, dlerror());
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -646,6 +678,24 @@ xdri_eglTerminate(_EGLDriver *drv, EGLDisplay dpy)
|
|||
}
|
||||
|
||||
|
||||
static _EGLProc
|
||||
xdri_eglGetProcAddress(const char *procname)
|
||||
{
|
||||
#if 0
|
||||
_EGLDriver *drv = NULL;
|
||||
|
||||
struct xdri_egl_driver *xdri_drv = xdri_egl_driver(drv);
|
||||
/*_EGLDisplay *disp = _eglLookupDisplay(dpy);*/
|
||||
_EGLProc *proc = xdri_drv->driScreen.getProcAddress(procname);
|
||||
return proc;
|
||||
#elif 0
|
||||
return (_EGLProc) st_get_proc_address(procname);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Called via eglCreateContext(), drv->API.CreateContext().
|
||||
*/
|
||||
|
|
@ -724,6 +774,7 @@ xdri_eglCreateWindowSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config,
|
|||
_EGLDisplay *disp = _eglLookupDisplay(dpy);
|
||||
struct xdri_egl_surface *xdri_surf;
|
||||
int scrn = DefaultScreen(disp->Xdpy);
|
||||
uint width, height;
|
||||
|
||||
xdri_surf = CALLOC_STRUCT(xdri_egl_surface);
|
||||
if (!xdri_surf)
|
||||
|
|
@ -744,6 +795,10 @@ xdri_eglCreateWindowSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config,
|
|||
|
||||
_eglSaveSurface(&xdri_surf->Base);
|
||||
|
||||
get_drawable_size(disp->Xdpy, window, &width, &height);
|
||||
xdri_surf->Base.Width = width;
|
||||
xdri_surf->Base.Height = height;
|
||||
|
||||
_eglLog(_EGL_DEBUG,
|
||||
"XDRI: CreateWindowSurface win 0x%x handle %d hDrawable %d",
|
||||
(int) window, _eglGetSurfaceHandle(&xdri_surf->Base),
|
||||
|
|
@ -790,9 +845,8 @@ xdri_eglSwapBuffers(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw)
|
|||
|
||||
{
|
||||
struct xdri_egl_surface *xdri_surf = lookup_surface(draw);
|
||||
__GLXdisplayPrivate *priv = __glXInitialize(disp->Xdpy);
|
||||
__GLXscreenConfigs *scrn = priv->screenConfigs;
|
||||
__DRIscreen *psc = &scrn->driScreen;
|
||||
struct xdri_egl_driver *xdri_drv = xdri_egl_driver(drv);
|
||||
__DRIscreen *psc = &xdri_drv->driScreen;
|
||||
__DRIdrawable * const pdraw = psc->getDrawable(disp->Xdpy,
|
||||
xdri_surf->driDrawable,
|
||||
psc->private);
|
||||
|
|
@ -818,10 +872,15 @@ _eglMain(_EGLDisplay *disp, const char *args)
|
|||
if (!xdri_drv)
|
||||
return NULL;
|
||||
|
||||
/* XXX temp hack */
|
||||
TheDriver = xdri_drv;
|
||||
|
||||
_eglInitDriverFallbacks(&xdri_drv->Base);
|
||||
xdri_drv->Base.API.Initialize = xdri_eglInitialize;
|
||||
xdri_drv->Base.API.Terminate = xdri_eglTerminate;
|
||||
|
||||
xdri_drv->Base.API.GetProcAddress = xdri_eglGetProcAddress;
|
||||
|
||||
xdri_drv->Base.API.CreateContext = xdri_eglCreateContext;
|
||||
xdri_drv->Base.API.MakeCurrent = xdri_eglMakeCurrent;
|
||||
xdri_drv->Base.API.CreateWindowSurface = xdri_eglCreateWindowSurface;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue