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 "eglsurface.h"
22 #include "eglscreen.h"
26 #ifdef EGL_MESA_screen_surface
29 /* ugh, no atomic op? */
30 static _EGL_DECLARE_MUTEX(_eglNextScreenHandleMutex
);
31 static EGLScreenMESA _eglNextScreenHandle
= 1;
35 * Return a new screen handle/ID.
36 * NOTE: we never reuse these!
39 _eglAllocScreenHandle(void)
43 _eglLockMutex(&_eglNextScreenHandleMutex
);
44 s
= _eglNextScreenHandle
;
45 _eglNextScreenHandle
+= _EGL_SCREEN_MAX_MODES
;
46 _eglUnlockMutex(&_eglNextScreenHandleMutex
);
53 * Initialize an _EGLScreen object to default values.
56 _eglInitScreen(_EGLScreen
*screen
, _EGLDisplay
*dpy
, EGLint num_modes
)
58 memset(screen
, 0, sizeof(_EGLScreen
));
60 screen
->Display
= dpy
;
61 screen
->NumModes
= num_modes
;
65 if (num_modes
> _EGL_SCREEN_MAX_MODES
)
66 num_modes
= _EGL_SCREEN_MAX_MODES
;
67 screen
->Modes
= (_EGLMode
*) calloc(num_modes
, sizeof(*screen
->Modes
));
68 screen
->NumModes
= (screen
->Modes
) ? num_modes
: 0;
73 * Link a screen to its display and return the handle of the link.
74 * The handle can be passed to client directly.
77 _eglLinkScreen(_EGLScreen
*screen
)
82 assert(screen
&& screen
->Display
);
83 display
= screen
->Display
;
85 if (!display
->Screens
) {
86 display
->Screens
= _eglCreateArray("Screen", 4);
87 if (!display
->Screens
)
88 return (EGLScreenMESA
) 0;
91 screen
->Handle
= _eglAllocScreenHandle();
92 for (i
= 0; i
< screen
->NumModes
; i
++)
93 screen
->Modes
[i
].Handle
= screen
->Handle
+ i
;
95 _eglAppendArray(display
->Screens
, (void *) screen
);
97 return screen
->Handle
;
102 * Lookup a handle to find the linked config.
103 * Return NULL if the handle has no corresponding linked config.
106 _eglLookupScreen(EGLScreenMESA screen
, _EGLDisplay
*display
)
110 if (!display
|| !display
->Screens
)
113 for (i
= 0; i
< display
->Screens
->Size
; i
++) {
114 _EGLScreen
*scr
= (_EGLScreen
*) display
->Screens
->Elements
[i
];
115 if (scr
->Handle
== screen
) {
116 assert(scr
->Display
== display
);
125 _eglFlattenScreen(void *elem
, void *buffer
)
127 _EGLScreen
*scr
= (_EGLScreen
*) elem
;
128 EGLScreenMESA
*handle
= (EGLScreenMESA
*) buffer
;
129 *handle
= _eglGetScreenHandle(scr
);
135 _eglGetScreensMESA(_EGLDriver
*drv
, _EGLDisplay
*display
, EGLScreenMESA
*screens
,
136 EGLint max_screens
, EGLint
*num_screens
)
138 *num_screens
= _eglFlattenArray(display
->Screens
, (void *) screens
,
139 sizeof(screens
[0]), max_screens
, _eglFlattenScreen
);
146 * Set a screen's surface origin.
149 _eglScreenPositionMESA(_EGLDriver
*drv
, _EGLDisplay
*dpy
,
150 _EGLScreen
*scrn
, EGLint x
, EGLint y
)
160 * Query a screen's current surface.
163 _eglQueryScreenSurfaceMESA(_EGLDriver
*drv
, _EGLDisplay
*dpy
,
164 _EGLScreen
*scrn
, _EGLSurface
**surf
)
166 *surf
= scrn
->CurrentSurface
;
172 * Query a screen's current mode.
175 _eglQueryScreenModeMESA(_EGLDriver
*drv
, _EGLDisplay
*dpy
, _EGLScreen
*scrn
,
178 *m
= scrn
->CurrentMode
;
184 _eglQueryScreenMESA(_EGLDriver
*drv
, _EGLDisplay
*dpy
, _EGLScreen
*scrn
,
185 EGLint attribute
, EGLint
*value
)
188 case EGL_SCREEN_POSITION_MESA
:
189 value
[0] = scrn
->OriginX
;
190 value
[1] = scrn
->OriginY
;
192 case EGL_SCREEN_POSITION_GRANULARITY_MESA
:
193 value
[0] = scrn
->StepX
;
194 value
[1] = scrn
->StepY
;
197 _eglError(EGL_BAD_ATTRIBUTE
, "eglQueryScreenMESA");
205 #endif /* EGL_MESA_screen_surface */