Home | History | Annotate | Download | only in main
      1 /**************************************************************************
      2  *
      3  * Copyright 2008 VMware, Inc.
      4  * Copyright 2009-2010 Chia-I Wu <olvaffe (at) gmail.com>
      5  * Copyright 2010-2011 LunarG, Inc.
      6  * All Rights Reserved.
      7  *
      8  * Permission is hereby granted, free of charge, to any person obtaining a
      9  * copy of this software and associated documentation files (the
     10  * "Software"), to deal in the Software without restriction, including
     11  * without limitation the rights to use, copy, modify, merge, publish,
     12  * distribute, sub license, and/or sell copies of the Software, and to
     13  * permit persons to whom the Software is furnished to do so, subject to
     14  * the following conditions:
     15  *
     16  * The above copyright notice and this permission notice (including the
     17  * next paragraph) shall be included in all copies or substantial portions
     18  * of the Software.
     19  *
     20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     21  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     22  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     23  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     24  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     25  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     26  * DEALINGS IN THE SOFTWARE.
     27  *
     28  **************************************************************************/
     29 
     30 
     31 #ifndef EGLCONTEXT_INCLUDED
     32 #define EGLCONTEXT_INCLUDED
     33 
     34 #include "c99_compat.h"
     35 
     36 #include "egltypedefs.h"
     37 #include "egldisplay.h"
     38 
     39 
     40 #ifdef __cplusplus
     41 extern "C" {
     42 #endif
     43 
     44 /**
     45  * "Base" class for device driver contexts.
     46  */
     47 struct _egl_context
     48 {
     49    /* A context is a display resource */
     50    _EGLResource Resource;
     51 
     52    /* The bound status of the context */
     53    _EGLThreadInfo *Binding;
     54    _EGLSurface *DrawSurface;
     55    _EGLSurface *ReadSurface;
     56 
     57    _EGLConfig *Config;
     58 
     59    EGLint ClientAPI; /**< EGL_OPENGL_ES_API, EGL_OPENGL_API, EGL_OPENVG_API */
     60    EGLint ClientMajorVersion;
     61    EGLint ClientMinorVersion;
     62    EGLint Flags;
     63    EGLint Profile;
     64    EGLint ResetNotificationStrategy;
     65 
     66    /* The real render buffer when a window surface is bound */
     67    EGLint WindowRenderBuffer;
     68 };
     69 
     70 
     71 extern EGLBoolean
     72 _eglInitContext(_EGLContext *ctx, _EGLDisplay *dpy,
     73                 _EGLConfig *config, const EGLint *attrib_list);
     74 
     75 
     76 extern EGLBoolean
     77 _eglQueryContext(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx, EGLint attribute, EGLint *value);
     78 
     79 
     80 extern EGLBoolean
     81 _eglBindContext(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read,
     82                 _EGLContext **old_ctx,
     83                 _EGLSurface **old_draw, _EGLSurface **old_read);
     84 
     85 
     86 /**
     87  * Increment reference count for the context.
     88  */
     89 static inline _EGLContext *
     90 _eglGetContext(_EGLContext *ctx)
     91 {
     92    if (ctx)
     93       _eglGetResource(&ctx->Resource);
     94    return ctx;
     95 }
     96 
     97 
     98 /**
     99  * Decrement reference count for the context.
    100  */
    101 static inline EGLBoolean
    102 _eglPutContext(_EGLContext *ctx)
    103 {
    104    return (ctx) ? _eglPutResource(&ctx->Resource) : EGL_FALSE;
    105 }
    106 
    107 
    108 /**
    109  * Link a context to its display and return the handle of the link.
    110  * The handle can be passed to client directly.
    111  */
    112 static inline EGLContext
    113 _eglLinkContext(_EGLContext *ctx)
    114 {
    115    _eglLinkResource(&ctx->Resource, _EGL_RESOURCE_CONTEXT);
    116    return (EGLContext) ctx;
    117 }
    118 
    119 
    120 /**
    121  * Unlink a linked context from its display.
    122  * Accessing an unlinked context should generate EGL_BAD_CONTEXT error.
    123  */
    124 static inline void
    125 _eglUnlinkContext(_EGLContext *ctx)
    126 {
    127    _eglUnlinkResource(&ctx->Resource, _EGL_RESOURCE_CONTEXT);
    128 }
    129 
    130 
    131 /**
    132  * Lookup a handle to find the linked context.
    133  * Return NULL if the handle has no corresponding linked context.
    134  */
    135 static inline _EGLContext *
    136 _eglLookupContext(EGLContext context, _EGLDisplay *dpy)
    137 {
    138    _EGLContext *ctx = (_EGLContext *) context;
    139    if (!dpy || !_eglCheckResource((void *) ctx, _EGL_RESOURCE_CONTEXT, dpy))
    140       ctx = NULL;
    141    return ctx;
    142 }
    143 
    144 
    145 /**
    146  * Return the handle of a linked context, or EGL_NO_CONTEXT.
    147  */
    148 static inline EGLContext
    149 _eglGetContextHandle(_EGLContext *ctx)
    150 {
    151    _EGLResource *res = (_EGLResource *) ctx;
    152    return (res && _eglIsResourceLinked(res)) ?
    153       (EGLContext) ctx : EGL_NO_CONTEXT;
    154 }
    155 
    156 
    157 #ifdef __cplusplus
    158 }
    159 #endif
    160 
    161 #endif /* EGLCONTEXT_INCLUDED */
    162