1 // 2 // Copyright 2015 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 // validationEGL.h: Validation functions for generic EGL entry point parameters 8 9 #ifndef LIBANGLE_VALIDATIONEGL_H_ 10 #define LIBANGLE_VALIDATIONEGL_H_ 11 12 #include "common/PackedEnums.h" 13 #include "libANGLE/Error.h" 14 #include "libANGLE/Texture.h" 15 16 #include <EGL/egl.h> 17 #include <EGL/eglext.h> 18 19 namespace gl 20 { 21 class Context; 22 } 23 24 namespace egl 25 { 26 27 class AttributeMap; 28 struct ClientExtensions; 29 struct Config; 30 class Device; 31 class Display; 32 class Image; 33 class Stream; 34 class Surface; 35 class Sync; 36 class Thread; 37 class LabeledObject; 38 39 // Object validation 40 Error ValidateDisplay(const Display *display); 41 Error ValidateSurface(const Display *display, const Surface *surface); 42 Error ValidateConfig(const Display *display, const Config *config); 43 Error ValidateContext(const Display *display, const gl::Context *context); 44 Error ValidateImage(const Display *display, const Image *image); 45 Error ValidateDevice(const Device *device); 46 Error ValidateSync(const Display *display, const Sync *sync); 47 48 // Return the requested object only if it is valid (otherwise nullptr) 49 const Thread *GetThreadIfValid(const Thread *thread); 50 const Display *GetDisplayIfValid(const Display *display); 51 const Surface *GetSurfaceIfValid(const Display *display, const Surface *surface); 52 const Image *GetImageIfValid(const Display *display, const Image *image); 53 const Stream *GetStreamIfValid(const Display *display, const Stream *stream); 54 const gl::Context *GetContextIfValid(const Display *display, const gl::Context *context); 55 const Device *GetDeviceIfValid(const Device *device); 56 const Sync *GetSyncIfValid(const Display *display, const Sync *sync); 57 LabeledObject *GetLabeledObjectIfValid(Thread *thread, 58 const Display *display, 59 ObjectType objectType, 60 EGLObjectKHR object); 61 62 // Entry point validation 63 Error ValidateInitialize(const Display *display); 64 65 Error ValidateTerminate(const Display *display); 66 67 Error ValidateCreateContext(Display *display, 68 Config *configuration, 69 gl::Context *shareContext, 70 const AttributeMap &attributes); 71 72 Error ValidateCreateWindowSurface(Display *display, 73 Config *config, 74 EGLNativeWindowType window, 75 const AttributeMap &attributes); 76 77 Error ValidateCreatePbufferSurface(Display *display, 78 Config *config, 79 const AttributeMap &attributes); 80 Error ValidateCreatePbufferFromClientBuffer(Display *display, 81 EGLenum buftype, 82 EGLClientBuffer buffer, 83 Config *config, 84 const AttributeMap &attributes); 85 86 Error ValidateMakeCurrent(Display *display, Surface *draw, Surface *read, gl::Context *context); 87 88 Error ValidateCreateImage(const Display *display, 89 gl::Context *context, 90 EGLenum target, 91 EGLClientBuffer buffer, 92 const AttributeMap &attributes); 93 Error ValidateDestroyImage(const Display *display, const Image *image); 94 Error ValidateCreateImageKHR(const Display *display, 95 gl::Context *context, 96 EGLenum target, 97 EGLClientBuffer buffer, 98 const AttributeMap &attributes); 99 Error ValidateDestroyImageKHR(const Display *display, const Image *image); 100 101 Error ValidateCreateDeviceANGLE(EGLint device_type, 102 void *native_device, 103 const EGLAttrib *attrib_list); 104 Error ValidateReleaseDeviceANGLE(Device *device); 105 106 Error ValidateCreateSyncBase(const Display *display, 107 EGLenum type, 108 const AttributeMap &attribs, 109 const Display *currentDisplay, 110 const gl::Context *currentContext, 111 bool isExt); 112 Error ValidateGetSyncAttribBase(const Display *display, const Sync *sync, EGLint attribute); 113 114 Error ValidateCreateSyncKHR(const Display *display, 115 EGLenum type, 116 const AttributeMap &attribs, 117 const Display *currentDisplay, 118 const gl::Context *currentContext); 119 Error ValidateCreateSync(const Display *display, 120 EGLenum type, 121 const AttributeMap &attribs, 122 const Display *currentDisplay, 123 const gl::Context *currentContext); 124 Error ValidateDestroySync(const Display *display, const Sync *sync); 125 Error ValidateClientWaitSync(const Display *display, 126 const Sync *sync, 127 EGLint flags, 128 EGLTime timeout); 129 Error ValidateWaitSync(const Display *display, 130 const gl::Context *context, 131 const Sync *sync, 132 EGLint flags); 133 Error ValidateGetSyncAttribKHR(const Display *display, 134 const Sync *sync, 135 EGLint attribute, 136 EGLint *value); 137 Error ValidateGetSyncAttrib(const Display *display, 138 const Sync *sync, 139 EGLint attribute, 140 EGLAttrib *value); 141 142 Error ValidateCreateStreamKHR(const Display *display, const AttributeMap &attributes); 143 Error ValidateDestroyStreamKHR(const Display *display, const Stream *stream); 144 Error ValidateStreamAttribKHR(const Display *display, 145 const Stream *stream, 146 EGLint attribute, 147 EGLint value); 148 Error ValidateQueryStreamKHR(const Display *display, 149 const Stream *stream, 150 EGLenum attribute, 151 EGLint *value); 152 Error ValidateQueryStreamu64KHR(const Display *display, 153 const Stream *stream, 154 EGLenum attribute, 155 EGLuint64KHR *value); 156 Error ValidateStreamConsumerGLTextureExternalKHR(const Display *display, 157 gl::Context *context, 158 const Stream *stream); 159 Error ValidateStreamConsumerAcquireKHR(const Display *display, 160 gl::Context *context, 161 const Stream *stream); 162 Error ValidateStreamConsumerReleaseKHR(const Display *display, 163 gl::Context *context, 164 const Stream *stream); 165 Error ValidateStreamConsumerGLTextureExternalAttribsNV(const Display *display, 166 gl::Context *context, 167 const Stream *stream, 168 const AttributeMap &attribs); 169 Error ValidateCreateStreamProducerD3DTextureANGLE(const Display *display, 170 const Stream *stream, 171 const AttributeMap &attribs); 172 Error ValidateStreamPostD3DTextureANGLE(const Display *display, 173 const Stream *stream, 174 void *texture, 175 const AttributeMap &attribs); 176 177 Error ValidateGetMscRateANGLE(const Display *display, 178 const Surface *surface, 179 const EGLint *numerator, 180 const EGLint *denominator); 181 Error ValidateGetSyncValuesCHROMIUM(const Display *display, 182 const Surface *surface, 183 const EGLuint64KHR *ust, 184 const EGLuint64KHR *msc, 185 const EGLuint64KHR *sbc); 186 187 Error ValidateDestroySurface(const Display *display, 188 const Surface *surface, 189 const EGLSurface eglSurface); 190 191 Error ValidateDestroyContext(const Display *display, 192 const gl::Context *glCtx, 193 const EGLContext eglCtx); 194 195 Error ValidateSwapBuffers(Thread *thread, const Display *display, const Surface *surface); 196 197 Error ValidateWaitNative(const Display *display, const EGLint engine); 198 199 Error ValidateCopyBuffers(Display *display, const Surface *surface); 200 201 Error ValidateSwapBuffersWithDamageKHR(const Display *display, 202 const Surface *surface, 203 EGLint *rects, 204 EGLint n_rects); 205 206 Error ValidateBindTexImage(const Display *display, 207 const Surface *surface, 208 const EGLSurface eglSurface, 209 const EGLint buffer, 210 const gl::Context *context, 211 gl::Texture **textureObject); 212 213 Error ValidateReleaseTexImage(const Display *display, 214 const Surface *surface, 215 const EGLSurface eglSurface, 216 const EGLint buffer); 217 218 Error ValidateSwapInterval(const Display *display, 219 const Surface *draw_surface, 220 const gl::Context *context); 221 222 Error ValidateBindAPI(const EGLenum api); 223 224 Error ValidatePresentationTimeANDROID(const Display *display, 225 const Surface *surface, 226 EGLnsecsANDROID time); 227 228 Error ValidateSetBlobCacheANDROID(const Display *display, 229 EGLSetBlobFuncANDROID set, 230 EGLGetBlobFuncANDROID get); 231 232 Error ValidateGetConfigAttrib(const Display *display, const Config *config, EGLint attribute); 233 Error ValidateChooseConfig(const Display *display, 234 const AttributeMap &attribs, 235 EGLint configSize, 236 EGLint *numConfig); 237 Error ValidateGetConfigs(const Display *display, EGLint configSize, EGLint *numConfig); 238 239 // Other validation 240 Error ValidateCompatibleSurface(const Display *display, 241 gl::Context *context, 242 const Surface *surface); 243 244 Error ValidateGetPlatformDisplay(EGLenum platform, 245 void *native_display, 246 const EGLAttrib *attrib_list); 247 Error ValidateGetPlatformDisplayEXT(EGLenum platform, 248 void *native_display, 249 const EGLint *attrib_list); 250 Error ValidateCreatePlatformWindowSurfaceEXT(const Display *display, 251 const Config *configuration, 252 void *nativeWindow, 253 const AttributeMap &attributes); 254 Error ValidateCreatePlatformPixmapSurfaceEXT(const Display *display, 255 const Config *configuration, 256 void *nativePixmap, 257 const AttributeMap &attributes); 258 259 Error ValidateProgramCacheGetAttribANGLE(const Display *display, EGLenum attrib); 260 261 Error ValidateProgramCacheQueryANGLE(const Display *display, 262 EGLint index, 263 void *key, 264 EGLint *keysize, 265 void *binary, 266 EGLint *binarysize); 267 268 Error ValidateProgramCachePopulateANGLE(const Display *display, 269 const void *key, 270 EGLint keysize, 271 const void *binary, 272 EGLint binarysize); 273 274 Error ValidateProgramCacheResizeANGLE(const Display *display, EGLint limit, EGLenum mode); 275 276 Error ValidateSurfaceAttrib(const Display *display, 277 const Surface *surface, 278 EGLint attribute, 279 EGLint value); 280 Error ValidateQuerySurface(const Display *display, 281 const Surface *surface, 282 EGLint attribute, 283 EGLint *value); 284 Error ValidateQueryContext(const Display *display, 285 const gl::Context *context, 286 EGLint attribute, 287 EGLint *value); 288 289 // EGL_KHR_debug 290 Error ValidateDebugMessageControlKHR(EGLDEBUGPROCKHR callback, const AttributeMap &attribs); 291 292 Error ValidateQueryDebugKHR(EGLint attribute, EGLAttrib *value); 293 294 Error ValidateLabelObjectKHR(Thread *thread, 295 const Display *display, 296 ObjectType objectType, 297 EGLObjectKHR object, 298 EGLLabelKHR label); 299 300 // ANDROID_get_frame_timestamps 301 Error ValidateGetCompositorTimingSupportedANDROID(const Display *display, 302 const Surface *surface, 303 CompositorTiming name); 304 305 Error ValidateGetCompositorTimingANDROID(const Display *display, 306 const Surface *surface, 307 EGLint numTimestamps, 308 const EGLint *names, 309 EGLnsecsANDROID *values); 310 311 Error ValidateGetNextFrameIdANDROID(const Display *display, 312 const Surface *surface, 313 EGLuint64KHR *frameId); 314 315 Error ValidateGetFrameTimestampSupportedANDROID(const Display *display, 316 const Surface *surface, 317 Timestamp timestamp); 318 319 Error ValidateGetFrameTimestampsANDROID(const Display *display, 320 const Surface *surface, 321 EGLuint64KHR frameId, 322 EGLint numTimestamps, 323 const EGLint *timestamps, 324 EGLnsecsANDROID *values); 325 326 Error ValidateQueryStringiANGLE(const Display *display, EGLint name, EGLint index); 327 328 Error ValidateQueryDisplayAttribEXT(const Display *display, const EGLint attribute); 329 Error ValidateQueryDisplayAttribANGLE(const Display *display, const EGLint attribute); 330 331 // EGL_ANDROID_get_native_client_buffer 332 Error ValidateGetNativeClientBufferANDROID(const struct AHardwareBuffer *buffer); 333 334 // EGL_ANDROID_native_fence_sync 335 Error ValidateDupNativeFenceFDANDROID(const Display *display, const Sync *sync); 336 337 // EGL_ANGLE_swap_with_frame_token 338 Error ValidateSwapBuffersWithFrameTokenANGLE(const Display *display, 339 const Surface *surface, 340 EGLFrameTokenANGLE frametoken); 341 342 } // namespace egl 343 344 #define ANGLE_EGL_TRY(THREAD, EXPR, FUNCNAME, LABELOBJECT) \ 345 do \ 346 { \ 347 auto ANGLE_LOCAL_VAR = (EXPR); \ 348 if (ANGLE_LOCAL_VAR.isError()) \ 349 return THREAD->setError(ANGLE_LOCAL_VAR, GetDebug(), FUNCNAME, LABELOBJECT); \ 350 } while (0) 351 352 #define ANGLE_EGL_TRY_RETURN(THREAD, EXPR, FUNCNAME, LABELOBJECT, RETVAL) \ 353 do \ 354 { \ 355 auto ANGLE_LOCAL_VAR = (EXPR); \ 356 if (ANGLE_LOCAL_VAR.isError()) \ 357 { \ 358 THREAD->setError(ANGLE_LOCAL_VAR, GetDebug(), FUNCNAME, LABELOBJECT); \ 359 return RETVAL; \ 360 } \ 361 } while (0) 362 363 #endif // LIBANGLE_VALIDATIONEGL_H_ 364