mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-16 02:10:25 +01:00
EGL_i915: Make struct drm_device per display.
This is to allow a driver to drive multiple displays. Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
This commit is contained in:
parent
74b55970dc
commit
49f245ea6b
4 changed files with 53 additions and 41 deletions
|
|
@ -86,7 +86,7 @@ const struct dri_extension card_extensions[] = {
|
|||
_EGLContext *
|
||||
drm_create_context(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, _EGLContext *share_list, const EGLint *attrib_list)
|
||||
{
|
||||
struct drm_device *dev = (struct drm_device *)drv;
|
||||
struct drm_device *dev = lookup_drm_device(dpy);
|
||||
struct drm_context *ctx;
|
||||
struct drm_context *share = NULL;
|
||||
struct st_context *st_share = NULL;
|
||||
|
|
|
|||
|
|
@ -67,11 +67,11 @@ drm_create_framebuffer(const __GLcontextModes *visual,
|
|||
}
|
||||
|
||||
static void
|
||||
drm_create_texture(_EGLDriver *drv,
|
||||
drm_create_texture(_EGLDisplay *dpy,
|
||||
struct drm_screen *scrn,
|
||||
unsigned w, unsigned h)
|
||||
{
|
||||
struct drm_device *dev = (struct drm_device *)drv;
|
||||
struct drm_device *dev = lookup_drm_device(dpy);
|
||||
struct pipe_screen *screen = dev->screen;
|
||||
struct pipe_surface *surface;
|
||||
struct pipe_texture *texture;
|
||||
|
|
@ -137,9 +137,9 @@ err_tex:
|
|||
*/
|
||||
|
||||
void
|
||||
drm_takedown_shown_screen(_EGLDriver *drv, struct drm_screen *screen)
|
||||
drm_takedown_shown_screen(_EGLDisplay *dpy, struct drm_screen *screen)
|
||||
{
|
||||
struct drm_device *dev = (struct drm_device *)drv;
|
||||
struct drm_device *dev = lookup_drm_device(dpy);
|
||||
|
||||
screen->surf = NULL;
|
||||
|
||||
|
|
@ -244,17 +244,17 @@ drm_show_screen_surface_mesa(_EGLDriver *drv, _EGLDisplay *dpy,
|
|||
_EGLScreen *screen,
|
||||
_EGLSurface *surface, _EGLMode *mode)
|
||||
{
|
||||
struct drm_device *dev = (struct drm_device *)drv;
|
||||
struct drm_device *dev = lookup_drm_device(dpy);
|
||||
struct drm_surface *surf = lookup_drm_surface(surface);
|
||||
struct drm_screen *scrn = lookup_drm_screen(screen);
|
||||
int ret;
|
||||
unsigned int i, k;
|
||||
|
||||
if (scrn->shown)
|
||||
drm_takedown_shown_screen(drv, scrn);
|
||||
drm_takedown_shown_screen(dpy, scrn);
|
||||
|
||||
|
||||
drm_create_texture(drv, scrn, mode->Width, mode->Height);
|
||||
drm_create_texture(dpy, scrn, mode->Width, mode->Height);
|
||||
if (!scrn->buffer)
|
||||
return EGL_FALSE;
|
||||
|
||||
|
|
@ -341,7 +341,7 @@ drm_destroy_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surface)
|
|||
struct drm_surface *surf = lookup_drm_surface(surface);
|
||||
if (!_eglIsSurfaceBound(&surf->base)) {
|
||||
if (surf->screen)
|
||||
drm_takedown_shown_screen(drv, surf->screen);
|
||||
drm_takedown_shown_screen(dpy, surf->screen);
|
||||
st_unreference_framebuffer(surf->stfb);
|
||||
free(surf);
|
||||
}
|
||||
|
|
@ -351,7 +351,7 @@ drm_destroy_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surface)
|
|||
EGLBoolean
|
||||
drm_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *draw)
|
||||
{
|
||||
struct drm_device *dev = (struct drm_device *)drv;
|
||||
struct drm_device *dev = lookup_drm_device(dpy);
|
||||
struct drm_surface *surf = lookup_drm_surface(draw);
|
||||
struct pipe_surface *back_surf;
|
||||
|
||||
|
|
|
|||
|
|
@ -26,9 +26,7 @@ extern const struct dri_extension card_extensions[];
|
|||
static void
|
||||
drm_unload(_EGLDriver *drv)
|
||||
{
|
||||
struct drm_device *dev = (struct drm_device *)drv;
|
||||
dev->api->destroy(dev->api);
|
||||
free(dev);
|
||||
free(drv);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -38,35 +36,33 @@ drm_unload(_EGLDriver *drv)
|
|||
_EGLDriver *
|
||||
_eglMain(const char *args)
|
||||
{
|
||||
struct drm_device *drm;
|
||||
_EGLDriver *drv;
|
||||
|
||||
drm = (struct drm_device *) calloc(1, sizeof(struct drm_device));
|
||||
if (!drm) {
|
||||
drv = (_EGLDriver *) calloc(1, sizeof(_EGLDriver));
|
||||
if (!drv) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
drm->api = drm_api_create();
|
||||
|
||||
/* First fill in the dispatch table with defaults */
|
||||
_eglInitDriverFallbacks(&drm->base);
|
||||
_eglInitDriverFallbacks(drv);
|
||||
/* then plug in our Drm-specific functions */
|
||||
drm->base.API.Initialize = drm_initialize;
|
||||
drm->base.API.Terminate = drm_terminate;
|
||||
drm->base.API.CreateContext = drm_create_context;
|
||||
drm->base.API.MakeCurrent = drm_make_current;
|
||||
drm->base.API.CreateWindowSurface = drm_create_window_surface;
|
||||
drm->base.API.CreatePixmapSurface = drm_create_pixmap_surface;
|
||||
drm->base.API.CreatePbufferSurface = drm_create_pbuffer_surface;
|
||||
drm->base.API.DestroySurface = drm_destroy_surface;
|
||||
drm->base.API.DestroyContext = drm_destroy_context;
|
||||
drm->base.API.CreateScreenSurfaceMESA = drm_create_screen_surface_mesa;
|
||||
drm->base.API.ShowScreenSurfaceMESA = drm_show_screen_surface_mesa;
|
||||
drm->base.API.SwapBuffers = drm_swap_buffers;
|
||||
drv->API.Initialize = drm_initialize;
|
||||
drv->API.Terminate = drm_terminate;
|
||||
drv->API.CreateContext = drm_create_context;
|
||||
drv->API.MakeCurrent = drm_make_current;
|
||||
drv->API.CreateWindowSurface = drm_create_window_surface;
|
||||
drv->API.CreatePixmapSurface = drm_create_pixmap_surface;
|
||||
drv->API.CreatePbufferSurface = drm_create_pbuffer_surface;
|
||||
drv->API.DestroySurface = drm_destroy_surface;
|
||||
drv->API.DestroyContext = drm_destroy_context;
|
||||
drv->API.CreateScreenSurfaceMESA = drm_create_screen_surface_mesa;
|
||||
drv->API.ShowScreenSurfaceMESA = drm_show_screen_surface_mesa;
|
||||
drv->API.SwapBuffers = drm_swap_buffers;
|
||||
|
||||
drm->base.Name = "DRM/Gallium/Win";
|
||||
drm->base.Unload = drm_unload;
|
||||
drv->Name = "DRM/Gallium/Win";
|
||||
drv->Unload = drm_unload;
|
||||
|
||||
return &drm->base;
|
||||
return drv;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -145,7 +141,7 @@ static int drm_open_minor(int minor)
|
|||
EGLBoolean
|
||||
drm_initialize(_EGLDriver *drv, _EGLDisplay *disp, EGLint *major, EGLint *minor)
|
||||
{
|
||||
struct drm_device *dev = (struct drm_device *)drv;
|
||||
struct drm_device *dev;
|
||||
struct drm_screen *screen = NULL;
|
||||
drmModeConnectorPtr connector = NULL;
|
||||
drmModeResPtr res = NULL;
|
||||
|
|
@ -154,6 +150,11 @@ drm_initialize(_EGLDriver *drv, _EGLDisplay *disp, EGLint *major, EGLint *minor)
|
|||
EGLint i;
|
||||
int fd;
|
||||
|
||||
dev = (struct drm_device *) calloc(1, sizeof(struct drm_device));
|
||||
if (!dev)
|
||||
return EGL_FALSE;
|
||||
dev->api = drm_api_create();
|
||||
|
||||
/* try the first node */
|
||||
fd = drm_open_minor(0);
|
||||
if (fd < 0)
|
||||
|
|
@ -200,6 +201,8 @@ drm_initialize(_EGLDriver *drv, _EGLDisplay *disp, EGLint *major, EGLint *minor)
|
|||
}
|
||||
dev->count_screens = num_screens;
|
||||
|
||||
disp->DriverData = dev;
|
||||
|
||||
/* for now we only have one config */
|
||||
_EGLConfig *config = calloc(1, sizeof(*config));
|
||||
memset(config, 1, sizeof(*config));
|
||||
|
|
@ -227,17 +230,19 @@ drm_initialize(_EGLDriver *drv, _EGLDisplay *disp, EGLint *major, EGLint *minor)
|
|||
err_screen:
|
||||
drmClose(fd);
|
||||
err_fd:
|
||||
free(dev);
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
EGLBoolean
|
||||
drm_terminate(_EGLDriver *drv, _EGLDisplay *dpy)
|
||||
{
|
||||
struct drm_device *dev = (struct drm_device *)drv;
|
||||
struct drm_device *dev = lookup_drm_device(dpy);
|
||||
struct drm_screen *screen;
|
||||
int i = 0;
|
||||
|
||||
_eglReleaseDisplayResources(drv, dpy);
|
||||
_eglCleanupDisplay(dpy);
|
||||
|
||||
drmFreeVersion(dev->version);
|
||||
|
||||
|
|
@ -245,7 +250,7 @@ drm_terminate(_EGLDriver *drv, _EGLDisplay *dpy)
|
|||
screen = dev->screens[i];
|
||||
|
||||
if (screen->shown)
|
||||
drm_takedown_shown_screen(drv, screen);
|
||||
drm_takedown_shown_screen(dpy, screen);
|
||||
|
||||
drmModeFreeProperty(screen->dpms);
|
||||
drmModeFreeConnector(screen->connector);
|
||||
|
|
@ -258,7 +263,9 @@ drm_terminate(_EGLDriver *drv, _EGLDisplay *dpy)
|
|||
|
||||
drmClose(dev->drmFD);
|
||||
|
||||
_eglCleanupDisplay(dpy);
|
||||
dev->api->destroy(dev->api);
|
||||
free(dev);
|
||||
dpy->DriverData = NULL;
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,8 +32,6 @@ struct drm_context;
|
|||
|
||||
struct drm_device
|
||||
{
|
||||
_EGLDriver base; /* base class/object */
|
||||
|
||||
/*
|
||||
* pipe
|
||||
*/
|
||||
|
|
@ -136,6 +134,13 @@ struct drm_screen
|
|||
};
|
||||
|
||||
|
||||
static INLINE struct drm_device *
|
||||
lookup_drm_device(_EGLDisplay *d)
|
||||
{
|
||||
return (struct drm_device *) d->DriverData;
|
||||
}
|
||||
|
||||
|
||||
static INLINE struct drm_context *
|
||||
lookup_drm_context(_EGLContext *c)
|
||||
{
|
||||
|
|
@ -168,7 +173,7 @@ __GLcontextModes* drm_visual_from_config(_EGLConfig *conf);
|
|||
* egl_surface.h
|
||||
*/
|
||||
/*@{*/
|
||||
void drm_takedown_shown_screen(_EGLDriver *drv, struct drm_screen *screen);
|
||||
void drm_takedown_shown_screen(_EGLDisplay *dpy, struct drm_screen *screen);
|
||||
/*@}*/
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue