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