• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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