1 /************************************************************************** 2 * 3 * Copyright 2009-2010 Chia-I Wu <olvaffe (at) gmail.com> 4 * Copyright 2010-2011 LunarG, Inc. 5 * All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the 9 * "Software"), to deal in the Software without restriction, including 10 * without limitation the rights to use, copy, modify, merge, publish, 11 * distribute, sub license, and/or sell copies of the Software, and to 12 * permit persons to whom the Software is furnished to do so, subject to 13 * the following conditions: 14 * 15 * The above copyright notice and this permission notice (including the 16 * next paragraph) shall be included in all copies or substantial portions 17 * of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 25 * DEALINGS IN THE SOFTWARE. 26 * 27 **************************************************************************/ 28 29 30 #ifndef EGLIMAGE_INCLUDED 31 #define EGLIMAGE_INCLUDED 32 33 34 #include "egltypedefs.h" 35 #include "egldisplay.h" 36 37 38 struct _egl_image_attribs 39 { 40 /* EGL_KHR_image_base */ 41 EGLBoolean ImagePreserved; 42 43 /* EGL_KHR_gl_image */ 44 EGLint GLTextureLevel; 45 EGLint GLTextureZOffset; 46 47 /* EGL_MESA_drm_image */ 48 EGLint Width; 49 EGLint Height; 50 EGLint DRMBufferFormatMESA; 51 EGLint DRMBufferUseMESA; 52 EGLint DRMBufferStrideMESA; 53 54 /* EGL_WL_bind_wayland_display */ 55 EGLint PlaneWL; 56 }; 57 58 /** 59 * "Base" class for device driver images. 60 */ 61 struct _egl_image 62 { 63 /* An image is a display resource */ 64 _EGLResource Resource; 65 }; 66 67 68 PUBLIC EGLint 69 _eglParseImageAttribList(_EGLImageAttribs *attrs, _EGLDisplay *dpy, 70 const EGLint *attrib_list); 71 72 73 PUBLIC EGLBoolean 74 _eglInitImage(_EGLImage *img, _EGLDisplay *dpy); 75 76 77 /** 78 * Increment reference count for the image. 79 */ 80 static INLINE _EGLImage * 81 _eglGetImage(_EGLImage *img) 82 { 83 if (img) 84 _eglGetResource(&img->Resource); 85 return img; 86 } 87 88 89 /** 90 * Decrement reference count for the image. 91 */ 92 static INLINE EGLBoolean 93 _eglPutImage(_EGLImage *img) 94 { 95 return (img) ? _eglPutResource(&img->Resource) : EGL_FALSE; 96 } 97 98 99 /** 100 * Link an image to its display and return the handle of the link. 101 * The handle can be passed to client directly. 102 */ 103 static INLINE EGLImageKHR 104 _eglLinkImage(_EGLImage *img) 105 { 106 _eglLinkResource(&img->Resource, _EGL_RESOURCE_IMAGE); 107 return (EGLImageKHR) img; 108 } 109 110 111 /** 112 * Unlink a linked image from its display. 113 * Accessing an unlinked image should generate EGL_BAD_PARAMETER error. 114 */ 115 static INLINE void 116 _eglUnlinkImage(_EGLImage *img) 117 { 118 _eglUnlinkResource(&img->Resource, _EGL_RESOURCE_IMAGE); 119 } 120 121 122 /** 123 * Lookup a handle to find the linked image. 124 * Return NULL if the handle has no corresponding linked image. 125 */ 126 static INLINE _EGLImage * 127 _eglLookupImage(EGLImageKHR image, _EGLDisplay *dpy) 128 { 129 _EGLImage *img = (_EGLImage *) image; 130 if (!dpy || !_eglCheckResource((void *) img, _EGL_RESOURCE_IMAGE, dpy)) 131 img = NULL; 132 return img; 133 } 134 135 136 /** 137 * Return the handle of a linked image, or EGL_NO_IMAGE_KHR. 138 */ 139 static INLINE EGLImageKHR 140 _eglGetImageHandle(_EGLImage *img) 141 { 142 _EGLResource *res = (_EGLResource *) img; 143 return (res && _eglIsResourceLinked(res)) ? 144 (EGLImageKHR) img : EGL_NO_IMAGE_KHR; 145 } 146 147 148 #endif /* EGLIMAGE_INCLUDED */ 149