Chia-I Wu wrote:
> EGL contexts and surfaces are resources of displays. They should be
> managed by displays. This commit adds a bunch of functions to
> egldisplay.c to help establish the links between contexts/surfaces and
> displays. How links are established is considered opaque outside
> display. Functions like _eglGetSurfaceHandle or _eglLookupSurface are
> therefore moved to egldisplay.c, with some small modifications.
>
> The idea is also extended to display. That is, displays need to link to
> themselves to be looked up.
>
> This commit only adds the functions. A commit to use them should
> follow.
>
> Signed-off-by: Chia-I Wu <[email protected]>
> ---
> src/egl/main/eglapi.c | 2 +
> src/egl/main/eglcontext.c | 25 -------
> src/egl/main/eglcontext.h | 12 +---
> src/egl/main/egldisplay.c | 173
> ++++++++++++++++++++++++++++++++++++++++-----
> src/egl/main/egldisplay.h | 43 ++++++++++--
> src/egl/main/eglsurface.c | 29 +-------
> src/egl/main/eglsurface.h | 14 ++---
> 7 files changed, 203 insertions(+), 95 deletions(-)
>
> diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
> index ca7208b..71fa43e 100644
> --- a/src/egl/main/eglapi.c
> +++ b/src/egl/main/eglapi.c
> @@ -52,6 +52,8 @@ eglGetDisplay(NativeDisplayType nativeDisplay)
> _EGLDisplay *dpy;
> _eglInitGlobals();
> dpy = _eglNewDisplay(nativeDisplay);
> + if (dpy)
> + _eglLinkDisplay(dpy);
> return _eglGetDisplayHandle(dpy);
> }
>
> diff --git a/src/egl/main/eglcontext.c b/src/egl/main/eglcontext.c
> index 79f65a8..32a4f1f 100644
> --- a/src/egl/main/eglcontext.c
> +++ b/src/egl/main/eglcontext.c
> @@ -84,31 +84,6 @@ _eglRemoveContext(_EGLContext *ctx)
>
>
> /**
> - * Return the public handle for the given private context ptr.
> - * This is the inverse of _eglLookupContext().
> - */
> -EGLContext
> -_eglGetContextHandle(_EGLContext *ctx)
> -{
> - /* just a cast! */
> - return (EGLContext) ctx;
> -}
> -
> -
> -/**
> - * Return the _EGLContext object that corresponds to the given
> - * EGLContext handle.
> - * This is the inverse of _eglGetContextHandle().
> - */
> -_EGLContext *
> -_eglLookupContext(EGLContext ctx)
> -{
> - /* just a cast since EGLContext is just a void ptr */
> - return (_EGLContext *) ctx;
> -}
> -
> -
> -/**
> * Just a placeholder/demo function. Real driver will never use this!
> */
> EGLContext
> diff --git a/src/egl/main/eglcontext.h b/src/egl/main/eglcontext.h
> index 5c84031..6e418df 100644
> --- a/src/egl/main/eglcontext.h
> +++ b/src/egl/main/eglcontext.h
> @@ -11,7 +11,9 @@
> */
> struct _egl_context
> {
> - _EGLDisplay *Display; /* who do I belong to? */
> + /* Managed by EGLDisplay for linking */
> + _EGLDisplay *Display;
> + _EGLContext *Next;
>
> _EGLConfig *Config;
>
> @@ -40,14 +42,6 @@ _eglRemoveContext(_EGLContext *ctx);
>
>
> extern EGLContext
> -_eglGetContextHandle(_EGLContext *ctx);
> -
> -
> -extern _EGLContext *
> -_eglLookupContext(EGLContext ctx);
> -
> -
> -extern EGLContext
> _eglCreateContext(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config,
> EGLContext share_list, const EGLint *attrib_list);
>
>
> diff --git a/src/egl/main/egldisplay.c b/src/egl/main/egldisplay.c
> index 01f67f6..943912d 100644
> --- a/src/egl/main/egldisplay.c
> +++ b/src/egl/main/egldisplay.c
> @@ -7,6 +7,7 @@
> #include <stdlib.h>
> #include <string.h>
> #include "eglcontext.h"
> +#include "eglsurface.h"
> #include "egldisplay.h"
> #include "egldriver.h"
> #include "eglglobals.h"
> @@ -25,11 +26,6 @@ _eglNewDisplay(NativeDisplayType nativeDisplay)
> {
> _EGLDisplay *dpy = (_EGLDisplay *) calloc(1, sizeof(_EGLDisplay));
> if (dpy) {
> - EGLuint key = _eglHashGenKey(_eglGlobal.Displays);
> -
> - dpy->Handle = (EGLDisplay) key;
> - _eglHashInsert(_eglGlobal.Displays, key, dpy);
> -
> dpy->NativeDisplay = nativeDisplay;
> #if defined(_EGL_PLATFORM_X)
> dpy->Xdpy = (Display *) nativeDisplay;
> @@ -45,6 +41,27 @@ _eglNewDisplay(NativeDisplayType nativeDisplay)
> }
>
>
> +EGLDisplay
> +_eglLinkDisplay(_EGLDisplay *dpy)
> +{
> + EGLuint key;
> + key = _eglHashGenKey(_eglGlobal.Displays);
> + assert(key);
> + _eglHashInsert(_eglGlobal.Displays, key, dpy);
> + dpy->Handle = (EGLDisplay) key;
> +
> + return dpy->Handle;
> +}
These functions need comments to explain exactly what they do.
> +
> +
> +void
> +_eglUnlinkDisplay(_EGLDisplay *dpy)
> +{
> + _eglHashRemove(_eglGlobal.Displays, (EGLuint) dpy->Handle);
> + dpy->Handle = EGL_NO_DISPLAY;
> +}
> +
> +
> /**
> * Return the public handle for an internal _EGLDisplay.
> * This is the inverse of _eglLookupDisplay().
> @@ -68,24 +85,10 @@ _EGLDisplay *
> _eglLookupDisplay(EGLDisplay dpy)
> {
> EGLuint key = (EGLuint) dpy;
> - if (!_eglGlobal.Displays)
> - return NULL;
> return (_EGLDisplay *) _eglHashLookup(_eglGlobal.Displays, key);
> }
>
>
> -void
> -_eglSaveDisplay(_EGLDisplay *dpy)
> -{
> - EGLuint key = _eglHashGenKey(_eglGlobal.Displays);
> - assert(dpy);
> - assert(!dpy->Handle);
> - dpy->Handle = (EGLDisplay) key;
> - assert(dpy->Handle);
> - _eglHashInsert(_eglGlobal.Displays, key, dpy);
> -}
> -
> -
> /**
> * Free all the data hanging of an _EGLDisplay object, but not
> * the object itself.
> @@ -108,3 +111,135 @@ _eglCleanupDisplay(_EGLDisplay *disp)
>
> /* driver deletes the _EGLDisplay object */
> }
> +
> +
> +EGLContext
> +_eglLinkContext(_EGLContext *ctx, _EGLDisplay *dpy)
> +{
> + ctx->Display = dpy;
> + ctx->Next = dpy->ContextList;
> + dpy->ContextList = ctx;
> + return (EGLContext) ctx;
> +}
> +
> +
> +void
> +_eglUnlinkContext(_EGLContext *ctx)
> +{
> + _EGLContext *prev;
> +
> + prev = ctx->Display->ContextList;
> + if (prev != ctx) {
> + while (prev) {
> + if (prev->Next == ctx)
> + break;
> + prev = prev->Next;
> + }
> + assert(prev);
> + prev->Next = ctx->Next;
> + }
> + else {
> + ctx->Display->ContextList = ctx->Next;
> + }
> +
> + ctx->Next = NULL;
> + ctx->Display = NULL;
> +}
Need function comments again.
> +/**
> + * Return the public handle for the given private context ptr.
> + * This is the inverse of _eglLookupContext().
> + */
> +EGLContext
> +_eglGetContextHandle(_EGLContext *ctx)
> +{
> + return (EGLContext) (ctx && ctx->Display) ? ctx : EGL_NO_CONTEXT;
> +}
> +
> +
> +/**
> + * Return the _EGLContext object that corresponds to the given
> + * EGLContext handle.
> + * This is the inverse of _eglGetContextHandle().
> + */
> +_EGLContext *
> +_eglLookupContext(EGLContext ctx)
> +{
> + _EGLContext *context = (_EGLContext *) ctx;
> + return (context && context->Display) ? context : NULL;
> +}
> +
> +
> +EGLSurface
> +_eglLinkSurface(_EGLSurface *surf, _EGLDisplay *dpy)
> +{
> + EGLuint key;
> +
> + surf->Display = dpy;
> + surf->Next = dpy->SurfaceList;
> + dpy->SurfaceList = surf;
> +
> + key = _eglHashGenKey(_eglGlobal.Surfaces);
> + assert(key);
> + _eglHashInsert(_eglGlobal.Surfaces, key, surf);
> +
> + surf->Handle = (EGLSurface) key;
> + return surf->Handle;
> +}
> +
> +
> +void
> +_eglUnlinkSurface(_EGLSurface *surf)
> +{
> + _EGLSurface *prev;
> +
> + _eglHashRemove(_eglGlobal.Surfaces, (EGLuint) surf->Handle);
> + surf->Handle = EGL_NO_SURFACE;
> +
> + prev = surf->Display->SurfaceList;
> + if (prev != surf) {
> + while (prev) {
> + if (prev->Next == surf)
> + break;
> + prev = prev->Next;
> + }
> + assert(prev);
> + prev->Next = surf->Next;
> + }
> + else {
> + prev = NULL;
> + surf->Display->SurfaceList = surf->Next;
> + }
> +
> + surf->Next = NULL;
> + surf->Display = NULL;
> +}
> +
> +
> +/**
> + * Return the public handle for an internal _EGLSurface.
> + * This is the inverse of _eglLookupSurface().
> + */
> +EGLSurface
> +_eglGetSurfaceHandle(_EGLSurface *surface)
> +{
> + if (surface)
> + return surface->Handle;
> + else
> + return EGL_NO_SURFACE;
> +}
> +
> +
> +/**
> + * Return the private _EGLSurface which corresponds to a public EGLSurface
> + * handle.
> + * This is the inverse of _eglGetSurfaceHandle().
> + */
> +_EGLSurface *
> +_eglLookupSurface(EGLSurface surf)
> +{
> + _EGLSurface *c = (_EGLSurface *) _eglHashLookup(_eglGlobal.Surfaces,
> + (EGLuint) surf);
> + return c;
> +}
> diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h
> index 69f0d13..c907df5 100644
> --- a/src/egl/main/egldisplay.h
> +++ b/src/egl/main/egldisplay.h
> @@ -23,6 +23,8 @@ struct _egl_display
> EGLint NumConfigs;
> _EGLConfig **Configs; /* array [NumConfigs] of ptr to _EGLConfig */
>
> + _EGLContext *ContextList;
> + _EGLSurface *SurfaceList;
> #ifdef _EGL_PLATFORM_X
> Display *Xdpy;
> #endif
> @@ -33,7 +35,15 @@ extern _EGLDisplay *
> _eglNewDisplay(NativeDisplayType displayName);
>
>
> -EGLDisplay
> +extern EGLDisplay
> +_eglLinkDisplay(_EGLDisplay *dpy);
> +
> +
> +extern void
> +_eglUnlinkDisplay(_EGLDisplay *dpy);
> +
> +
> +extern EGLDisplay
> _eglGetDisplayHandle(_EGLDisplay *display);
>
>
> @@ -42,16 +52,39 @@ _eglLookupDisplay(EGLDisplay dpy);
>
>
> extern void
> -_eglSaveDisplay(_EGLDisplay *dpy);
> +_eglCleanupDisplay(_EGLDisplay *disp);
> +
> +
> +extern EGLContext
> +_eglLinkContext(_EGLContext *ctx, _EGLDisplay *dpy);
>
>
> extern void
> -_eglCleanupDisplay(_EGLDisplay *disp);
> +_eglUnlinkContext(_EGLContext *ctx);
> +
> +
> +extern EGLContext
> +_eglGetContextHandle(_EGLContext *ctx);
> +
> +
> +extern _EGLContext *
> +_eglLookupContext(EGLContext ctx);
> +
> +
> +extern EGLSurface
> +_eglLinkSurface(_EGLSurface *surf, _EGLDisplay *dpy);
> +
> +
> +extern void
> +_eglUnlinkSurface(_EGLSurface *surf);
>
>
> -extern EGLBoolean
> -_eglQueryDisplayMESA(_EGLDriver *drv, EGLDisplay dpy, EGLint attrib, EGLint
> *value);
> +extern EGLSurface
> +_eglGetSurfaceHandle(_EGLSurface *surface);
>
>
> +extern _EGLSurface *
> +_eglLookupSurface(EGLSurface surf);
> +
>
> #endif /* EGLDISPLAY_INCLUDED */
> diff --git a/src/egl/main/eglsurface.c b/src/egl/main/eglsurface.c
> index 964288a..854f499 100644
> --- a/src/egl/main/eglsurface.c
> +++ b/src/egl/main/eglsurface.c
> @@ -6,6 +6,7 @@
> #include <assert.h>
> #include <stdlib.h>
> #include <string.h>
> +#include "egldisplay.h"
> #include "eglcontext.h"
> #include "eglconfig.h"
> #include "egldriver.h"
> @@ -231,34 +232,6 @@ _eglRemoveSurface(_EGLSurface *surf)
>
>
>
> -/**
> - * Return the public handle for an internal _EGLSurface.
> - * This is the inverse of _eglLookupSurface().
> - */
> -EGLSurface
> -_eglGetSurfaceHandle(_EGLSurface *surface)
> -{
> - if (surface)
> - return surface->Handle;
> - else
> - return EGL_NO_SURFACE;
> -}
> -
> -
> -/**
> - * Return the private _EGLSurface which corresponds to a public EGLSurface
> - * handle.
> - * This is the inverse of _eglGetSurfaceHandle().
> - */
> -_EGLSurface *
> -_eglLookupSurface(EGLSurface surf)
> -{
> - _EGLSurface *c = (_EGLSurface *) _eglHashLookup(_eglGlobal.Surfaces,
> - (EGLuint) surf);
> - return c;
> -}
> -
> -
> EGLBoolean
> _eglSwapBuffers(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw)
> {
> diff --git a/src/egl/main/eglsurface.h b/src/egl/main/eglsurface.h
> index 3b54221..dc53669 100644
> --- a/src/egl/main/eglsurface.h
> +++ b/src/egl/main/eglsurface.h
> @@ -10,7 +10,11 @@
> */
> struct _egl_surface
> {
> - EGLSurface Handle; /* The public/opaque handle which names this object */
> + /* Managed by EGLDisplay for linking */
> + _EGLDisplay *Display;
> + _EGLSurface *Next;
> + EGLSurface Handle;
> +
> _EGLConfig *Config;
>
> /* May need reference counting here */
> @@ -52,14 +56,6 @@ extern void
> _eglRemoveSurface(_EGLSurface *surf);
>
>
> -extern EGLSurface
> -_eglGetSurfaceHandle(_EGLSurface *surface);
> -
> -
> -extern _EGLSurface *
> -_eglLookupSurface(EGLSurface surf);
> -
> -
> extern EGLBoolean
> _eglSwapBuffers(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw);
>
> --
> 1.6.2.4
>
>
> ------------------------------------------------------------------------------
> Enter the BlackBerry Developer Challenge
> This is your chance to win up to $100,000 in prizes! For a limited time,
> vendors submitting new applications to BlackBerry App World(TM) will have
> the opportunity to enter the BlackBerry Developer Challenge. See full prize
> details at: http://p.sf.net/sfu/Challenge
> _______________________________________________
> Mesa3d-dev mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/mesa3d-dev
> .
>
------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge
This is your chance to win up to $100,000 in prizes! For a limited time,
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
Mesa3d-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev