eglsurface.h revision ecb3b3102a3022e31cf9d75ae099eddbe298517f
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 */
12struct _egl_surface
13{
14   /* A surface is a display resource */
15   _EGLResource Resource;
16
17   /* The bound status of the surface */
18   _EGLContext *Binding;
19   EGLBoolean BoundToTexture;
20
21   _EGLConfig *Config;
22
23   EGLint Type; /* one of EGL_WINDOW_BIT, EGL_PIXMAP_BIT or EGL_PBUFFER_BIT */
24   EGLint Width, Height;
25   EGLint TextureFormat, TextureTarget;
26   EGLint MipmapTexture, MipmapLevel;
27   EGLint SwapInterval;
28
29   /* If type == EGL_SCREEN_BIT: */
30   EGLint VisibleRefCount; /* number of screens I'm displayed on */
31
32#ifdef EGL_VERSION_1_2
33   EGLint SwapBehavior; /* one of EGL_BUFFER_PRESERVED/DESTROYED */
34   EGLint HorizontalResolution, VerticalResolution;
35   EGLint AspectRatio;
36   EGLint RenderBuffer; /* EGL_BACK_BUFFER or EGL_SINGLE_BUFFER */
37   EGLint AlphaFormat; /* EGL_ALPHA_FORMAT_NONPRE or EGL_ALPHA_FORMAT_PRE */
38   EGLint Colorspace; /* EGL_COLORSPACE_sRGB or EGL_COLORSPACE_LINEAR */
39#endif /* EGL_VERSION_1_2 */
40};
41
42
43PUBLIC EGLBoolean
44_eglInitSurface(_EGLDriver *drv, _EGLSurface *surf, EGLint type,
45                _EGLConfig *config, const EGLint *attrib_list);
46
47
48extern EGLBoolean
49_eglSwapBuffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf);
50
51
52extern EGLBoolean
53_eglCopyBuffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, NativePixmapType target);
54
55
56extern EGLBoolean
57_eglQuerySurface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint attribute, EGLint *value);
58
59
60extern _EGLSurface *
61_eglCreateWindowSurface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, NativeWindowType window, const EGLint *attrib_list);
62
63
64extern _EGLSurface *
65_eglCreatePixmapSurface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, NativePixmapType pixmap, const EGLint *attrib_list);
66
67
68extern _EGLSurface *
69_eglCreatePbufferSurface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, const EGLint *attrib_list);
70
71
72extern EGLBoolean
73_eglDestroySurface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf);
74
75
76extern EGLBoolean
77_eglSurfaceAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint attribute, EGLint value);
78
79
80extern EGLBoolean
81_eglBindTexImage(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint buffer);
82
83
84extern EGLBoolean
85_eglReleaseTexImage(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint buffer);
86
87
88extern EGLBoolean
89_eglSwapInterval(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint interval);
90
91
92#ifdef EGL_VERSION_1_2
93
94extern _EGLSurface *
95_eglCreatePbufferFromClientBuffer(_EGLDriver *drv, _EGLDisplay *dpy,
96                                  EGLenum buftype, EGLClientBuffer buffer,
97                                  _EGLConfig *conf, const EGLint *attrib_list);
98
99#endif /* EGL_VERSION_1_2 */
100
101
102/**
103 * Return true if the surface is bound to a thread.
104 * A surface bound to a texutre is not considered bound by
105 * this function.
106 */
107static INLINE EGLBoolean
108_eglIsSurfaceBound(_EGLSurface *surf)
109{
110   return (surf->Binding != NULL);
111}
112
113
114/**
115 * Link a surface to a display and return the handle of the link.
116 * The handle can be passed to client directly.
117 */
118static INLINE EGLSurface
119_eglLinkSurface(_EGLSurface *surf, _EGLDisplay *dpy)
120{
121   _eglLinkResource(&surf->Resource, _EGL_RESOURCE_SURFACE, dpy);
122   return (EGLSurface) surf;
123}
124
125
126/**
127 * Unlink a linked surface from its display.
128 * Accessing an unlinked surface should generate EGL_BAD_SURFACE error.
129 */
130static INLINE void
131_eglUnlinkSurface(_EGLSurface *surf)
132{
133   _eglUnlinkResource(&surf->Resource, _EGL_RESOURCE_SURFACE);
134}
135
136
137/**
138 * Lookup a handle to find the linked surface.
139 * Return NULL if the handle has no corresponding linked surface.
140 */
141static INLINE _EGLSurface *
142_eglLookupSurface(EGLSurface surface, _EGLDisplay *dpy)
143{
144   _EGLResource *res = (_EGLResource *) surface;
145   _EGLSurface *surf = (_EGLSurface *) surface;
146   if (!res || !dpy || !_eglCheckResource(res, _EGL_RESOURCE_SURFACE, dpy))
147      surf = NULL;
148   return surf;
149}
150
151
152/**
153 * Return the handle of a linked surface, or EGL_NO_SURFACE.
154 */
155static INLINE EGLSurface
156_eglGetSurfaceHandle(_EGLSurface *surf)
157{
158   _EGLResource *res = (_EGLResource *) surf;
159   return (res && _eglIsResourceLinked(res)) ?
160      (EGLSurface) surf : EGL_NO_SURFACE;
161}
162
163
164/**
165 * Return true if the surface is linked to a display.
166 */
167static INLINE EGLBoolean
168_eglIsSurfaceLinked(_EGLSurface *surf)
169{
170   _EGLResource *res = (_EGLResource *) surf;
171   return (res && _eglIsResourceLinked(res));
172}
173
174
175#endif /* EGLSURFACE_INCLUDED */
176