blob: e1d335e75365957a409950decfc64b1b26740e51 [file] [log] [blame]
Chia-I Wuf2001df2011-07-02 17:57:30 +09001/**************************************************************************
2 *
José Fonseca87712852014-01-17 16:27:50 +00003 * Copyright 2008 VMware, Inc.
Chia-I Wuf2001df2011-07-02 17:57:30 +09004 * Copyright 2009-2010 Chia-I Wu <olvaffe@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
Brian Pauladbff7e2005-04-22 21:09:39 +000031#ifndef EGLCONTEXT_INCLUDED
32#define EGLCONTEXT_INCLUDED
33
Emil Velikov7bd16932015-02-28 16:35:22 +000034#include "c99_compat.h"
Brian Pauladbff7e2005-04-22 21:09:39 +000035
36#include "egltypedefs.h"
Chia-I Wuecb3b312010-01-24 20:32:34 +080037#include "egldisplay.h"
Brian Pauladbff7e2005-04-22 21:09:39 +000038
39
Alexander von Gluck IV83620682015-05-13 17:13:37 -050040#ifdef __cplusplus
41extern "C" {
42#endif
43
Brian Pauladbff7e2005-04-22 21:09:39 +000044/**
45 * "Base" class for device driver contexts.
46 */
47struct _egl_context
48{
Chia-I Wuecb3b312010-01-24 20:32:34 +080049 /* A context is a display resource */
50 _EGLResource Resource;
Brian Pauladbff7e2005-04-22 21:09:39 +000051
Chia-I Wu07ee0132009-08-03 11:34:37 -060052 /* The bound status of the context */
53 _EGLThreadInfo *Binding;
Brian Pauladbff7e2005-04-22 21:09:39 +000054 _EGLSurface *DrawSurface;
55 _EGLSurface *ReadSurface;
56
Chia-I Wu07ee0132009-08-03 11:34:37 -060057 _EGLConfig *Config;
Brian Pauld5078b92008-05-30 13:45:40 -060058
59 EGLint ClientAPI; /**< EGL_OPENGL_ES_API, EGL_OPENGL_API, EGL_OPENVG_API */
Ian Romanick3fd79dd2012-07-18 15:59:15 -070060 EGLint ClientMajorVersion;
61 EGLint ClientMinorVersion;
Ian Romanick63beb3d2012-07-19 11:10:15 -070062 EGLint Flags;
63 EGLint Profile;
64 EGLint ResetNotificationStrategy;
Chris Wilson95ecf3d2016-10-27 19:34:46 +010065 EGLint ContextPriority;
Grigori Goronzy49095192017-06-29 02:44:03 +020066 EGLBoolean NoError;
Adam Jacksonc0be3aa2016-09-22 03:47:55 -040067 EGLint ReleaseBehavior;
Brian Pauladbff7e2005-04-22 21:09:39 +000068};
69
70
Emil Velikovdd438ae2015-02-28 17:20:01 +000071extern EGLBoolean
Eric Engestrom54fa5ec2019-02-02 11:38:45 +000072_eglInitContext(_EGLContext *ctx, _EGLDisplay *disp,
Chia-I Wucca31342009-07-17 11:53:03 -060073 _EGLConfig *config, const EGLint *attrib_list);
Brian Pauladbff7e2005-04-22 21:09:39 +000074
75
Brian Pauladbff7e2005-04-22 21:09:39 +000076extern EGLBoolean
Eric Engestrom9c6fa942020-07-31 01:38:41 +020077_eglQueryContext(const _EGLDriver *drv, _EGLDisplay *disp, _EGLContext *ctx, EGLint attribute, EGLint *value);
Brian Pauladbff7e2005-04-22 21:09:39 +000078
79
Emil Velikovdd438ae2015-02-28 17:20:01 +000080extern EGLBoolean
Chia-I Wud19afc52010-10-23 12:52:26 +080081_eglBindContext(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read,
82 _EGLContext **old_ctx,
83 _EGLSurface **old_draw, _EGLSurface **old_read);
Chia-I Wu959481a2010-01-27 23:31:20 +080084
Eric Anholt3b7b6ad2012-12-27 17:39:37 -080085extern _EGLContext *
86_eglBindContextToThread(_EGLContext *ctx, _EGLThreadInfo *t);
87
Chia-I Wu959481a2010-01-27 23:31:20 +080088
Chia-I Wu07ee0132009-08-03 11:34:37 -060089/**
Chia-I Wudc4f8452010-10-23 11:59:03 +080090 * Increment reference count for the context.
91 */
Emil Velikov7bd16932015-02-28 16:35:22 +000092static inline _EGLContext *
Chia-I Wudc4f8452010-10-23 11:59:03 +080093_eglGetContext(_EGLContext *ctx)
94{
95 if (ctx)
96 _eglGetResource(&ctx->Resource);
97 return ctx;
98}
99
100
101/**
102 * Decrement reference count for the context.
103 */
Emil Velikov7bd16932015-02-28 16:35:22 +0000104static inline EGLBoolean
Chia-I Wudc4f8452010-10-23 11:59:03 +0800105_eglPutContext(_EGLContext *ctx)
106{
107 return (ctx) ? _eglPutResource(&ctx->Resource) : EGL_FALSE;
108}
109
110
111/**
Chia-I Wu4ce33ec2010-10-23 00:37:19 +0800112 * Link a context to its display and return the handle of the link.
Chia-I Wuecb3b312010-01-24 20:32:34 +0800113 * The handle can be passed to client directly.
114 */
Emil Velikov7bd16932015-02-28 16:35:22 +0000115static inline EGLContext
Chia-I Wu4ce33ec2010-10-23 00:37:19 +0800116_eglLinkContext(_EGLContext *ctx)
Chia-I Wu5e66d182010-01-23 22:53:59 +0800117{
Chia-I Wu4ce33ec2010-10-23 00:37:19 +0800118 _eglLinkResource(&ctx->Resource, _EGL_RESOURCE_CONTEXT);
Chia-I Wuecb3b312010-01-24 20:32:34 +0800119 return (EGLContext) ctx;
Chia-I Wu5e66d182010-01-23 22:53:59 +0800120}
121
122
Chia-I Wuecb3b312010-01-24 20:32:34 +0800123/**
124 * Unlink a linked context from its display.
125 * Accessing an unlinked context should generate EGL_BAD_CONTEXT error.
126 */
Emil Velikov7bd16932015-02-28 16:35:22 +0000127static inline void
Chia-I Wuecb3b312010-01-24 20:32:34 +0800128_eglUnlinkContext(_EGLContext *ctx)
129{
130 _eglUnlinkResource(&ctx->Resource, _EGL_RESOURCE_CONTEXT);
131}
Chia-I Wu5e66d182010-01-23 22:53:59 +0800132
133
134/**
135 * Lookup a handle to find the linked context.
136 * Return NULL if the handle has no corresponding linked context.
137 */
Emil Velikov7bd16932015-02-28 16:35:22 +0000138static inline _EGLContext *
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000139_eglLookupContext(EGLContext context, _EGLDisplay *disp)
Chia-I Wu5e66d182010-01-23 22:53:59 +0800140{
141 _EGLContext *ctx = (_EGLContext *) context;
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000142 if (!disp || !_eglCheckResource((void *) ctx, _EGL_RESOURCE_CONTEXT, disp))
Chia-I Wu5e66d182010-01-23 22:53:59 +0800143 ctx = NULL;
144 return ctx;
145}
146
147
148/**
149 * Return the handle of a linked context, or EGL_NO_CONTEXT.
150 */
Emil Velikov7bd16932015-02-28 16:35:22 +0000151static inline EGLContext
Chia-I Wu5e66d182010-01-23 22:53:59 +0800152_eglGetContextHandle(_EGLContext *ctx)
153{
Chia-I Wuecb3b312010-01-24 20:32:34 +0800154 _EGLResource *res = (_EGLResource *) ctx;
155 return (res && _eglIsResourceLinked(res)) ?
156 (EGLContext) ctx : EGL_NO_CONTEXT;
Chia-I Wu5e66d182010-01-23 22:53:59 +0800157}
158
159
Alexander von Gluck IV83620682015-05-13 17:13:37 -0500160#ifdef __cplusplus
161}
162#endif
163
Brian Pauladbff7e2005-04-22 21:09:39 +0000164#endif /* EGLCONTEXT_INCLUDED */