2 * Ideas for screen management extension to EGL.
4 * Each EGLDisplay has one or more screens (CRTs, Flat Panels, etc).
5 * The screens' handles can be obtained with eglGetScreensMESA().
7 * A new kind of EGLSurface is possible- one which can be directly scanned
8 * out on a screen. Such a surface is created with eglCreateScreenSurface().
10 * To actually display a screen surface on a screen, the eglShowSurface()
18 #include "egldisplay.h"
19 #include "eglcurrent.h"
21 #include "eglconfig.h"
22 #include "eglsurface.h"
23 #include "eglscreen.h"
27 #ifdef EGL_MESA_screen_surface
30 /* ugh, no atomic op? */
31 static _EGL_DECLARE_MUTEX(_eglNextScreenHandleMutex
);
32 static EGLScreenMESA _eglNextScreenHandle
= 1;
36 * Return a new screen handle/ID.
37 * NOTE: we never reuse these!
40 _eglAllocScreenHandle(void)
44 _eglLockMutex(&_eglNextScreenHandleMutex
);
45 s
= _eglNextScreenHandle
++;
46 _eglUnlockMutex(&_eglNextScreenHandleMutex
);
53 * Initialize an _EGLScreen object to default values.
56 _eglInitScreen(_EGLScreen
*screen
, _EGLDisplay
*dpy
)
58 memset(screen
, 0, sizeof(_EGLScreen
));
59 screen
->Display
= dpy
;
66 * Link a screen to its display and return the handle of the link.
67 * The handle can be passed to client directly.
70 _eglLinkScreen(_EGLScreen
*screen
)
74 assert(screen
&& screen
->Display
);
75 display
= screen
->Display
;
77 if (!display
->Screens
) {
78 display
->Screens
= _eglCreateArray("Screen", 4);
79 if (!display
->Screens
)
80 return (EGLScreenMESA
) 0;
82 screen
->Handle
= _eglAllocScreenHandle();
83 _eglAppendArray(display
->Screens
, (void *) screen
);
85 return screen
->Handle
;
90 * Lookup a handle to find the linked config.
91 * Return NULL if the handle has no corresponding linked config.
94 _eglLookupScreen(EGLScreenMESA screen
, _EGLDisplay
*display
)
98 if (!display
|| !display
->Screens
)
101 for (i
= 0; i
< display
->Screens
->Size
; i
++) {
102 _EGLScreen
*scr
= (_EGLScreen
*) display
->Screens
->Elements
[i
];
103 if (scr
->Handle
== screen
) {
104 assert(scr
->Display
== display
);
113 _eglFlattenScreen(void *elem
, void *buffer
)
115 _EGLScreen
*scr
= (_EGLScreen
*) elem
;
116 EGLScreenMESA
*handle
= (EGLScreenMESA
*) buffer
;
117 *handle
= _eglGetScreenHandle(scr
);
123 _eglGetScreensMESA(_EGLDriver
*drv
, _EGLDisplay
*display
, EGLScreenMESA
*screens
,
124 EGLint max_screens
, EGLint
*num_screens
)
126 *num_screens
= _eglFlattenArray(display
->Screens
, (void *) screens
,
127 sizeof(screens
[0]), max_screens
, _eglFlattenScreen
);
134 * Set a screen's surface origin.
137 _eglScreenPositionMESA(_EGLDriver
*drv
, _EGLDisplay
*dpy
,
138 _EGLScreen
*scrn
, EGLint x
, EGLint y
)
148 * Query a screen's current surface.
151 _eglQueryScreenSurfaceMESA(_EGLDriver
*drv
, _EGLDisplay
*dpy
,
152 _EGLScreen
*scrn
, _EGLSurface
**surf
)
154 *surf
= scrn
->CurrentSurface
;
160 * Query a screen's current mode.
163 _eglQueryScreenModeMESA(_EGLDriver
*drv
, _EGLDisplay
*dpy
, _EGLScreen
*scrn
,
166 *m
= scrn
->CurrentMode
;
172 _eglQueryScreenMESA(_EGLDriver
*drv
, _EGLDisplay
*dpy
, _EGLScreen
*scrn
,
173 EGLint attribute
, EGLint
*value
)
176 case EGL_SCREEN_POSITION_MESA
:
177 value
[0] = scrn
->OriginX
;
178 value
[1] = scrn
->OriginY
;
180 case EGL_SCREEN_POSITION_GRANULARITY_MESA
:
181 value
[0] = scrn
->StepX
;
182 value
[1] = scrn
->StepY
;
185 _eglError(EGL_BAD_ATTRIBUTE
, "eglQueryScreenMESA");
193 #endif /* EGL_MESA_screen_surface */