egl: Add reference count for resources.
[mesa.git] / src / egl / main / eglcontext.h
1 #ifndef EGLCONTEXT_INCLUDED
2 #define EGLCONTEXT_INCLUDED
3
4
5 #include "egltypedefs.h"
6 #include "egldisplay.h"
7
8
9 /**
10 * "Base" class for device driver contexts.
11 */
12 struct _egl_context
13 {
14 /* A context is a display resource */
15 _EGLResource Resource;
16
17 /* The bound status of the context */
18 _EGLThreadInfo *Binding;
19 _EGLSurface *DrawSurface;
20 _EGLSurface *ReadSurface;
21
22 _EGLConfig *Config;
23
24 EGLint ClientAPI; /**< EGL_OPENGL_ES_API, EGL_OPENGL_API, EGL_OPENVG_API */
25 EGLint ClientVersion; /**< 1 = OpenGLES 1.x, 2 = OpenGLES 2.x */
26
27 /* The real render buffer when a window surface is bound */
28 EGLint WindowRenderBuffer;
29 };
30
31
32 PUBLIC EGLBoolean
33 _eglInitContext(_EGLContext *ctx, _EGLDisplay *dpy,
34 _EGLConfig *config, const EGLint *attrib_list);
35
36
37 extern EGLBoolean
38 _eglQueryContext(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx, EGLint attribute, EGLint *value);
39
40
41 PUBLIC EGLBoolean
42 _eglBindContext(_EGLContext **ctx, _EGLSurface **draw, _EGLSurface **read);
43
44
45 /**
46 * Increment reference count for the context.
47 */
48 static INLINE _EGLContext *
49 _eglGetContext(_EGLContext *ctx)
50 {
51 if (ctx)
52 _eglGetResource(&ctx->Resource);
53 return ctx;
54 }
55
56
57 /**
58 * Decrement reference count for the context.
59 */
60 static INLINE EGLBoolean
61 _eglPutContext(_EGLContext *ctx)
62 {
63 return (ctx) ? _eglPutResource(&ctx->Resource) : EGL_FALSE;
64 }
65
66
67 /**
68 * Return true if the context is bound to a thread.
69 *
70 * The binding is considered a reference to the context. Drivers should not
71 * destroy a context when it is bound.
72 */
73 static INLINE EGLBoolean
74 _eglIsContextBound(_EGLContext *ctx)
75 {
76 return (ctx->Binding != NULL);
77 }
78
79
80 /**
81 * Link a context to its display and return the handle of the link.
82 * The handle can be passed to client directly.
83 */
84 static INLINE EGLContext
85 _eglLinkContext(_EGLContext *ctx)
86 {
87 _eglLinkResource(&ctx->Resource, _EGL_RESOURCE_CONTEXT);
88 return (EGLContext) ctx;
89 }
90
91
92 /**
93 * Unlink a linked context from its display.
94 * Accessing an unlinked context should generate EGL_BAD_CONTEXT error.
95 */
96 static INLINE void
97 _eglUnlinkContext(_EGLContext *ctx)
98 {
99 _eglUnlinkResource(&ctx->Resource, _EGL_RESOURCE_CONTEXT);
100 }
101
102
103 /**
104 * Lookup a handle to find the linked context.
105 * Return NULL if the handle has no corresponding linked context.
106 */
107 static INLINE _EGLContext *
108 _eglLookupContext(EGLContext context, _EGLDisplay *dpy)
109 {
110 _EGLContext *ctx = (_EGLContext *) context;
111 if (!dpy || !_eglCheckResource((void *) ctx, _EGL_RESOURCE_CONTEXT, dpy))
112 ctx = NULL;
113 return ctx;
114 }
115
116
117 /**
118 * Return the handle of a linked context, or EGL_NO_CONTEXT.
119 */
120 static INLINE EGLContext
121 _eglGetContextHandle(_EGLContext *ctx)
122 {
123 _EGLResource *res = (_EGLResource *) ctx;
124 return (res && _eglIsResourceLinked(res)) ?
125 (EGLContext) ctx : EGL_NO_CONTEXT;
126 }
127
128
129 /**
130 * Return true if the context is linked to a display.
131 *
132 * The link is considered a reference to the context (the display is owning the
133 * context). Drivers should not destroy a context when it is linked.
134 */
135 static INLINE EGLBoolean
136 _eglIsContextLinked(_EGLContext *ctx)
137 {
138 _EGLResource *res = (_EGLResource *) ctx;
139 return (res && _eglIsResourceLinked(res));
140 }
141
142
143 #endif /* EGLCONTEXT_INCLUDED */