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

Reply via email to