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