egl: Move fallback routines to eglfallbacks.c.
[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 _eglQuerySurface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint attribute, EGLint *value);
56
57
58 extern EGLBoolean
59 _eglSurfaceAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint attribute, EGLint value);
60
61
62 PUBLIC extern EGLBoolean
63 _eglBindTexImage(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint buffer);
64
65
66 extern EGLBoolean
67 _eglSwapInterval(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint interval);
68
69
70 /**
71 * Return true if there is a context bound to the surface.
72 *
73 * The binding is considered a reference to the surface. Drivers should not
74 * destroy a surface when it is bound.
75 */
76 static INLINE EGLBoolean
77 _eglIsSurfaceBound(_EGLSurface *surf)
78 {
79 return (surf->CurrentContext != NULL);
80 }
81
82
83 /**
84 * Link a surface to a display and return the handle of the link.
85 * The handle can be passed to client directly.
86 */
87 static INLINE EGLSurface
88 _eglLinkSurface(_EGLSurface *surf, _EGLDisplay *dpy)
89 {
90 _eglLinkResource(&surf->Resource, _EGL_RESOURCE_SURFACE, dpy);
91 return (EGLSurface) surf;
92 }
93
94
95 /**
96 * Unlink a linked surface from its display.
97 * Accessing an unlinked surface should generate EGL_BAD_SURFACE error.
98 */
99 static INLINE void
100 _eglUnlinkSurface(_EGLSurface *surf)
101 {
102 _eglUnlinkResource(&surf->Resource, _EGL_RESOURCE_SURFACE);
103 }
104
105
106 /**
107 * Lookup a handle to find the linked surface.
108 * Return NULL if the handle has no corresponding linked surface.
109 */
110 static INLINE _EGLSurface *
111 _eglLookupSurface(EGLSurface surface, _EGLDisplay *dpy)
112 {
113 _EGLSurface *surf = (_EGLSurface *) surface;
114 if (!dpy || !_eglCheckResource((void *) surf, _EGL_RESOURCE_SURFACE, dpy))
115 surf = NULL;
116 return surf;
117 }
118
119
120 /**
121 * Return the handle of a linked surface, or EGL_NO_SURFACE.
122 */
123 static INLINE EGLSurface
124 _eglGetSurfaceHandle(_EGLSurface *surf)
125 {
126 _EGLResource *res = (_EGLResource *) surf;
127 return (res && _eglIsResourceLinked(res)) ?
128 (EGLSurface) surf : EGL_NO_SURFACE;
129 }
130
131
132 /**
133 * Return true if the surface is linked to a display.
134 *
135 * The link is considered a reference to the surface (the display is owning the
136 * surface). Drivers should not destroy a surface when it is linked.
137 */
138 static INLINE EGLBoolean
139 _eglIsSurfaceLinked(_EGLSurface *surf)
140 {
141 _EGLResource *res = (_EGLResource *) surf;
142 return (res && _eglIsResourceLinked(res));
143 }
144
145
146 #endif /* EGLSURFACE_INCLUDED */