X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fegl%2Fmain%2Feglsurface.h;h=903957a6eb307c0cc9661f753674131b74fdaf33;hb=7d5a13ebf31edab412a06c075b847fc9f0137da1;hp=a9541239701b77e4c5468af4a73051cf96f707c2;hpb=877128505431adaf817dc8069172ebe4a1cdf5d8;p=mesa.git diff --git a/src/egl/main/eglsurface.h b/src/egl/main/eglsurface.h index a9541239701..903957a6eb3 100644 --- a/src/egl/main/eglsurface.h +++ b/src/egl/main/eglsurface.h @@ -31,11 +31,34 @@ #ifndef EGLSURFACE_INCLUDED #define EGLSURFACE_INCLUDED +#include "c99_compat.h" #include "egltypedefs.h" #include "egldisplay.h" +#ifdef __cplusplus +extern "C" { +#endif + +struct _egl_xy +{ + EGLint x; + EGLint y; +}; + +struct _egl_hdr_metadata +{ + struct _egl_xy display_primary_r; + struct _egl_xy display_primary_g; + struct _egl_xy display_primary_b; + struct _egl_xy white_point; + EGLint max_luminance; + EGLint min_luminance; + EGLint max_cll; + EGLint max_fall; +}; + /** * "Base" class for device driver surfaces. */ @@ -51,15 +74,73 @@ struct _egl_surface EGLint Type; /* one of EGL_WINDOW_BIT, EGL_PIXMAP_BIT or EGL_PBUFFER_BIT */ + /* The native surface is lost. The EGL spec requires certain functions + * to generate EGL_BAD_NATIVE_WINDOW when given this surface. + */ + EGLBoolean Lost; + /* attributes set by attribute list */ EGLint Width, Height; EGLenum TextureFormat; EGLenum TextureTarget; EGLBoolean MipmapTexture; EGLBoolean LargestPbuffer; - EGLenum RenderBuffer; + + /** + * Value of EGL_RENDER_BUFFER selected at creation. + * + * The user may select, for window surfaces, the EGL_RENDER_BUFFER through + * the attribute list of eglCreateWindowSurface(). The EGL spec allows the + * implementation to ignore request, though; hence why we maintain both + * RequestedRenderBuffer and ActiveRenderBuffer. For pbuffer and pixmap + * surfaces, the EGL spec hard-codes the EGL_RENDER_BUFFER value and the + * user must not provide it in the attribute list. + * + * Normally, the attribute is immutable and after surface creation. + * However, EGL_KHR_mutable_render_buffer allows the user to change it in + * window surfaces via eglSurfaceAttrib, in which case + * eglQuerySurface(EGL_RENDER_BUFFER) will immediately afterwards return + * the requested value but the actual render buffer used by the context + * does not change until completion of the next eglSwapBuffers call. + * + * From the EGL_KHR_mutable_render_buffer spec (v12): + * + * Querying EGL_RENDER_BUFFER returns the buffer which client API + * rendering is requested to use. For a window surface, this is the + * attribute value specified when the surface was created or last set + * via eglSurfaceAttrib. + * + * eglQueryContext(EGL_RENDER_BUFFER) ignores this. + */ + EGLenum RequestedRenderBuffer; + + /** + * The EGL_RENDER_BUFFER in use by the context. + * + * This is valid only when bound as the draw surface. This may differ from + * the RequestedRenderBuffer. + * + * Refer to eglQueryContext(EGL_RENDER_BUFFER) in the EGL spec. + * eglQuerySurface(EGL_RENDER_BUFFER) ignores this. + * + * If a window surface is bound as the draw surface and has a pending, + * user-requested change to EGL_RENDER_BUFFER, then the next eglSwapBuffers + * will flush the pending change. (The flush of EGL_RENDER_BUFFER state may + * occur without the implicit glFlush induced by eglSwapBuffers). The spec + * requires that the flush occur at that time and nowhere else. During the + * state-flush, we copy RequestedRenderBuffer to ActiveRenderBuffer. + * + * From the EGL_KHR_mutable_render_buffer spec (v12): + * + * If [...] there is a pending change to the EGL_RENDER_BUFFER + * attribute, eglSwapBuffers performs an implicit flush operation on the + * context and effects the attribute change. + */ + EGLenum ActiveRenderBuffer; + EGLenum VGAlphaFormat; EGLenum VGColorspace; + EGLenum GLColorspace; /* attributes set by eglSurfaceAttrib */ EGLint MipmapLevel; @@ -71,38 +152,63 @@ struct _egl_surface EGLint SwapInterval; + /* EGL_KHR_partial_update + * True if the damage region is already set + * between frame boundaries. + */ + EGLBoolean SetDamageRegionCalled; + + /* EGL_KHR_partial_update + * True if the buffer age is read by the client + * between frame boundaries. + */ + EGLBoolean BufferAgeRead; + /* True if the surface is bound to an OpenGL ES texture */ EGLBoolean BoundToTexture; EGLBoolean PostSubBufferSupportedNV; + + struct _egl_hdr_metadata HdrMetadata; + + void *NativeSurface; }; -PUBLIC EGLBoolean -_eglInitSurface(_EGLSurface *surf, _EGLDisplay *dpy, EGLint type, - _EGLConfig *config, const EGLint *attrib_list); +extern EGLBoolean +_eglInitSurface(_EGLSurface *surf, _EGLDisplay *disp, EGLint type, + _EGLConfig *config, const EGLint *attrib_list, + void *native_surface); extern EGLBoolean -_eglQuerySurface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint attribute, EGLint *value); +_eglQuerySurface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf, EGLint attribute, EGLint *value); extern EGLBoolean -_eglSurfaceAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint attribute, EGLint value); +_eglSurfaceAttrib(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf, EGLint attribute, EGLint value); -PUBLIC extern EGLBoolean -_eglBindTexImage(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint buffer); +extern EGLBoolean +_eglBindTexImage(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf, EGLint buffer); + +extern EGLBoolean +_eglReleaseTexImage(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf, EGLint buffer); extern EGLBoolean -_eglSwapInterval(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint interval); +_eglSwapInterval(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf, EGLint interval); +extern EGLBoolean +_eglSurfaceHasMutableRenderBuffer(_EGLSurface *surf); + +extern EGLBoolean +_eglSurfaceInSharedBufferMode(_EGLSurface *surf); /** * Increment reference count for the surface. */ -static INLINE _EGLSurface * +static inline _EGLSurface * _eglGetSurface(_EGLSurface *surf) { if (surf) @@ -114,7 +220,7 @@ _eglGetSurface(_EGLSurface *surf) /** * Decrement reference count for the surface. */ -static INLINE EGLBoolean +static inline EGLBoolean _eglPutSurface(_EGLSurface *surf) { return (surf) ? _eglPutResource(&surf->Resource) : EGL_FALSE; @@ -125,7 +231,7 @@ _eglPutSurface(_EGLSurface *surf) * Link a surface to its display and return the handle of the link. * The handle can be passed to client directly. */ -static INLINE EGLSurface +static inline EGLSurface _eglLinkSurface(_EGLSurface *surf) { _eglLinkResource(&surf->Resource, _EGL_RESOURCE_SURFACE); @@ -137,7 +243,7 @@ _eglLinkSurface(_EGLSurface *surf) * Unlink a linked surface from its display. * Accessing an unlinked surface should generate EGL_BAD_SURFACE error. */ -static INLINE void +static inline void _eglUnlinkSurface(_EGLSurface *surf) { _eglUnlinkResource(&surf->Resource, _EGL_RESOURCE_SURFACE); @@ -148,11 +254,11 @@ _eglUnlinkSurface(_EGLSurface *surf) * Lookup a handle to find the linked surface. * Return NULL if the handle has no corresponding linked surface. */ -static INLINE _EGLSurface * -_eglLookupSurface(EGLSurface surface, _EGLDisplay *dpy) +static inline _EGLSurface * +_eglLookupSurface(EGLSurface surface, _EGLDisplay *disp) { _EGLSurface *surf = (_EGLSurface *) surface; - if (!dpy || !_eglCheckResource((void *) surf, _EGL_RESOURCE_SURFACE, dpy)) + if (!disp || !_eglCheckResource((void *) surf, _EGL_RESOURCE_SURFACE, disp)) surf = NULL; return surf; } @@ -161,7 +267,7 @@ _eglLookupSurface(EGLSurface surface, _EGLDisplay *dpy) /** * Return the handle of a linked surface, or EGL_NO_SURFACE. */ -static INLINE EGLSurface +static inline EGLSurface _eglGetSurfaceHandle(_EGLSurface *surf) { _EGLResource *res = (_EGLResource *) surf; @@ -170,4 +276,8 @@ _eglGetSurfaceHandle(_EGLSurface *surf) } +#ifdef __cplusplus +} +#endif + #endif /* EGLSURFACE_INCLUDED */