mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-03 15:50:17 +01:00
egl: Store screens in a dynamic array.
This commit is contained in:
parent
6717a313f2
commit
8b0c6c4a8d
4 changed files with 41 additions and 37 deletions
|
|
@ -90,9 +90,7 @@ struct _egl_display
|
|||
|
||||
_EGLExtensions Extensions;
|
||||
|
||||
EGLint NumScreens;
|
||||
_EGLScreen **Screens; /* array [NumScreens] */
|
||||
|
||||
_EGLArray *Screens;
|
||||
_EGLArray *Configs;
|
||||
|
||||
/* lists of resources */
|
||||
|
|
|
|||
|
|
@ -22,9 +22,12 @@ _eglLookupMode(EGLModeMESA mode, _EGLDisplay *disp)
|
|||
{
|
||||
EGLint scrnum;
|
||||
|
||||
if (!disp->Screens)
|
||||
return NULL;
|
||||
|
||||
/* loop over all screens on the display */
|
||||
for (scrnum = 0; scrnum < disp->NumScreens; scrnum++) {
|
||||
const _EGLScreen *scrn = disp->Screens[scrnum];
|
||||
for (scrnum = 0; scrnum < disp->Screens->Size; scrnum++) {
|
||||
const _EGLScreen *scrn = disp->Screens->Elements[scrnum];
|
||||
EGLint i;
|
||||
/* search list of modes for handle */
|
||||
for (i = 0; i < scrn->NumModes; i++) {
|
||||
|
|
|
|||
|
|
@ -62,9 +62,13 @@ _eglLookupScreen(EGLScreenMESA screen, _EGLDisplay *display)
|
|||
{
|
||||
EGLint i;
|
||||
|
||||
for (i = 0; i < display->NumScreens; i++) {
|
||||
if (display->Screens[i]->Handle == screen)
|
||||
return display->Screens[i];
|
||||
if (!display->Screens)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < display->Screens->Size; i++) {
|
||||
_EGLScreen *scr = (_EGLScreen *) display->Screens->Elements[i];
|
||||
if (scr->Handle == screen)
|
||||
return scr;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -76,40 +80,36 @@ _eglLookupScreen(EGLScreenMESA screen, _EGLDisplay *display)
|
|||
void
|
||||
_eglAddScreen(_EGLDisplay *display, _EGLScreen *screen)
|
||||
{
|
||||
EGLint n;
|
||||
|
||||
assert(display);
|
||||
assert(screen);
|
||||
|
||||
if (!display->Screens) {
|
||||
display->Screens = _eglCreateArray("Screen", 4);
|
||||
if (!display->Screens)
|
||||
return;
|
||||
}
|
||||
screen->Handle = _eglAllocScreenHandle();
|
||||
n = display->NumScreens;
|
||||
display->Screens = realloc(display->Screens, (n+1) * sizeof(_EGLScreen *));
|
||||
display->Screens[n] = screen;
|
||||
display->NumScreens++;
|
||||
_eglAppendArray(display->Screens, (void *) screen);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static EGLBoolean
|
||||
_eglFlattenScreen(void *elem, void *buffer)
|
||||
{
|
||||
_EGLScreen *scr = (_EGLScreen *) elem;
|
||||
EGLScreenMESA *handle = (EGLScreenMESA *) buffer;
|
||||
*handle = scr->Handle;
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean
|
||||
_eglGetScreensMESA(_EGLDriver *drv, _EGLDisplay *display, EGLScreenMESA *screens,
|
||||
EGLint max_screens, EGLint *num_screens)
|
||||
{
|
||||
EGLint n;
|
||||
|
||||
if (display->NumScreens > max_screens) {
|
||||
n = max_screens;
|
||||
}
|
||||
else {
|
||||
n = display->NumScreens;
|
||||
}
|
||||
|
||||
if (screens) {
|
||||
EGLint i;
|
||||
for (i = 0; i < n; i++)
|
||||
screens[i] = display->Screens[i]->Handle;
|
||||
}
|
||||
if (num_screens)
|
||||
*num_screens = n;
|
||||
*num_screens = _eglFlattenArray(display->Screens, (void *) screens,
|
||||
sizeof(screens[0]), max_screens, _eglFlattenScreen);
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -424,11 +424,18 @@ static struct native_event_handler egl_g3d_native_event_handler = {
|
|||
egl_g3d_new_sw_screen
|
||||
};
|
||||
|
||||
static void
|
||||
egl_g3d_free_screen(void *scr)
|
||||
{
|
||||
struct egl_g3d_screen *gscr = egl_g3d_screen((_EGLScreen *) scr);
|
||||
FREE(gscr->native_modes);
|
||||
FREE(gscr);
|
||||
}
|
||||
|
||||
static EGLBoolean
|
||||
egl_g3d_terminate(_EGLDriver *drv, _EGLDisplay *dpy)
|
||||
{
|
||||
struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
|
||||
EGLint i;
|
||||
|
||||
_eglReleaseDisplayResources(drv, dpy);
|
||||
_eglCleanupDisplay(dpy);
|
||||
|
|
@ -437,12 +444,8 @@ egl_g3d_terminate(_EGLDriver *drv, _EGLDisplay *dpy)
|
|||
gdpy->pipe->destroy(gdpy->pipe);
|
||||
|
||||
if (dpy->Screens) {
|
||||
for (i = 0; i < dpy->NumScreens; i++) {
|
||||
struct egl_g3d_screen *gscr = egl_g3d_screen(dpy->Screens[i]);
|
||||
FREE(gscr->native_modes);
|
||||
FREE(gscr);
|
||||
}
|
||||
FREE(dpy->Screens);
|
||||
_eglDestroyArray(dpy->Screens, egl_g3d_free_screen);
|
||||
dpy->Screens = NULL;
|
||||
}
|
||||
|
||||
if (gdpy->smapi)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue