egl: Clarify IsLinked and IsBound.
[mesa.git] / src / egl / main / eglsurface.h
1 #ifndef EGLSURFACE_INCLUDED
2 #define EGLSURFACE_INCLUDED
3
4
5 #include "egltypedefs.h"
6 #include "egldisplay.h"
7
8
9 /**
10 * "Base" class for device driver surfaces.
11 */
12 struct _egl_surface
13 {
14 /* A surface is a display resource */
15 _EGLResource Resource;
16
17 /* The context that is currently bound to the surface */
18 _EGLContext *CurrentContext;
19
20 _EGLConfig *Config;
21
22 EGLint Type; /* one of EGL_WINDOW_BIT, EGL_PIXMAP_BIT or EGL_PBUFFER_BIT */
23
24 /* attributes set by attribute list */
25 EGLint Width, Height;
26 EGLenum TextureFormat;
27 EGLenum TextureTarget;
28 EGLBoolean MipmapTexture;
29 EGLBoolean LargestPbuffer;
30 EGLenum RenderBuffer;
31 EGLenum VGAlphaFormat;
32 EGLenum VGColorspace;
33
34 /* attributes set by eglSurfaceAttrib */
35 EGLint MipmapLevel;
36 EGLenum MultisampleResolve;
37 EGLenum SwapBehavior;
38
39 EGLint HorizontalResolution, VerticalResolution;
40 EGLint AspectRatio;
41
42 EGLint SwapInterval;
43
44 /* True if the surface is bound to an OpenGL ES texture */
45 EGLBoolean BoundToTexture;
46 };
47
48
49 PUBLIC EGLBoolean
50 _eglInitSurface(_EGLSurface *surf, _EGLDisplay *dpy, EGLint type,
51 _EGLConfig *config, const EGLint *attrib_list);
52
53
54 extern EGLBoolean
55 _eglSwapBuffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf);
56
57
58 extern EGLBoolean
59 _eglCopyBuffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLNativePixmapType target);
60
61
62 extern EGLBoolean
63 _eglQuerySurface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint attribute, EGLint *value);
64
65
66 extern _EGLSurface *
67 _eglCreateWindowSurface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, EGLNativeWindowType window, const EGLint *attrib_list);
68
69
70 extern _EGLSurface *
71 _eglCreatePixmapSurface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, EGLNativePixmapType pixmap, const EGLint *attrib_list);
72
73
74 extern _EGLSurface *
75 _eglCreatePbufferSurface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, const EGLint *attrib_list);
76
77
78 extern EGLBoolean
79 _eglDestroySurface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf);
80
81
82 extern EGLBoolean
83 _eglSurfaceAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint attribute, EGLint value);
84
85
86 extern EGLBoolean
87 _eglBindTexImage(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint buffer);
88
89
90 extern EGLBoolean
91 _eglReleaseTexImage(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint buffer);
92
93
94 extern EGLBoolean
95 _eglSwapInterval(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint interval);
96
97
98 #ifdef EGL_VERSION_1_2
99
100 extern _EGLSurface *
101 _eglCreatePbufferFromClientBuffer(_EGLDriver *drv, _EGLDisplay *dpy,
102 EGLenum buftype, EGLClientBuffer buffer,
103 _EGLConfig *conf, const EGLint *attrib_list);
104
105 #endif /* EGL_VERSION_1_2 */
106
107
108 /**
109 * Return true if there is a context bound to the surface.
110 *
111 * The binding is considered a reference to the surface. Drivers should not
112 * destroy a surface when it is bound.
113 */
114 static INLINE EGLBoolean
115 _eglIsSurfaceBound(_EGLSurface *surf)
116 {
117 return (surf->CurrentContext != NULL);
118 }
119
120
121 /**
122 * Link a surface to a display and return the handle of the link.
123 * The handle can be passed to client directly.
124 */
125 static INLINE EGLSurface
126 _eglLinkSurface(_EGLSurface *surf, _EGLDisplay *dpy)
127 {
128 _eglLinkResource(&surf->Resource, _EGL_RESOURCE_SURFACE, dpy);
129 return (EGLSurface) surf;
130 }
131
132
133 /**
134 * Unlink a linked surface from its display.
135 * Accessing an unlinked surface should generate EGL_BAD_SURFACE error.
136 */
137 static INLINE void
138 _eglUnlinkSurface(_EGLSurface *surf)
139 {
140 _eglUnlinkResource(&surf->Resource, _EGL_RESOURCE_SURFACE);
141 }
142
143
144 /**
145 * Lookup a handle to find the linked surface.
146 * Return NULL if the handle has no corresponding linked surface.
147 */
148 static INLINE _EGLSurface *
149 _eglLookupSurface(EGLSurface surface, _EGLDisplay *dpy)
150 {
151 _EGLSurface *surf = (_EGLSurface *) surface;
152 if (!dpy || !_eglCheckResource((void *) surf, _EGL_RESOURCE_SURFACE, dpy))
153 surf = NULL;
154 return surf;
155 }
156
157
158 /**
159 * Return the handle of a linked surface, or EGL_NO_SURFACE.
160 */
161 static INLINE EGLSurface
162 _eglGetSurfaceHandle(_EGLSurface *surf)
163 {
164 _EGLResource *res = (_EGLResource *) surf;
165 return (res && _eglIsResourceLinked(res)) ?
166 (EGLSurface) surf : EGL_NO_SURFACE;
167 }
168
169
170 /**
171 * Return true if the surface is linked to a display.
172 *
173 * The link is considered a reference to the surface (the display is owning the
174 * surface). Drivers should not destroy a surface when it is linked.
175 */
176 static INLINE EGLBoolean
177 _eglIsSurfaceLinked(_EGLSurface *surf)
178 {
179 _EGLResource *res = (_EGLResource *) surf;
180 return (res && _eglIsResourceLinked(res));
181 }
182
183
184 #endif /* EGLSURFACE_INCLUDED */