1 //
2 // Copyright (c) 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 "libANGLE/Error.h"
13 
14 #include <EGL/egl.h>
15 #include <EGL/eglext.h>
16 
17 namespace gl
18 {
19 class Context;
20 }
21 
22 namespace egl
23 {
24 
25 class AttributeMap;
26 struct ClientExtensions;
27 struct Config;
28 class Device;
29 class Display;
30 class Image;
31 class Stream;
32 class Surface;
33 
34 // Object validation
35 Error ValidateDisplay(const Display *display);
36 Error ValidateSurface(const Display *display, const Surface *surface);
37 Error ValidateConfig(const Display *display, const Config *config);
38 Error ValidateContext(const Display *display, const gl::Context *context);
39 Error ValidateImage(const Display *display, const Image *image);
40 
41 // Entry point validation
42 Error ValidateCreateContext(Display *display, Config *configuration, gl::Context *shareContext,
43                             const AttributeMap& attributes);
44 
45 Error ValidateCreateWindowSurface(Display *display, Config *config, EGLNativeWindowType window,
46                                   const AttributeMap& attributes);
47 
48 Error ValidateCreatePbufferSurface(Display *display, Config *config, const AttributeMap& attributes);
49 Error ValidateCreatePbufferFromClientBuffer(Display *display, EGLenum buftype, EGLClientBuffer buffer,
50                                             Config *config, const AttributeMap& attributes);
51 
52 Error ValidateMakeCurrent(Display *display, EGLSurface draw, EGLSurface read, gl::Context *context);
53 
54 Error ValidateCreateImageKHR(const Display *display,
55                              gl::Context *context,
56                              EGLenum target,
57                              EGLClientBuffer buffer,
58                              const AttributeMap &attributes);
59 Error ValidateDestroyImageKHR(const Display *display, const Image *image);
60 
61 Error ValidateCreateDeviceANGLE(EGLint device_type,
62                                 void *native_device,
63                                 const EGLAttrib *attrib_list);
64 Error ValidateReleaseDeviceANGLE(Device *device);
65 
66 Error ValidateCreateStreamKHR(const Display *display, const AttributeMap &attributes);
67 Error ValidateDestroyStreamKHR(const Display *display, const Stream *stream);
68 Error ValidateStreamAttribKHR(const Display *display,
69                               const Stream *stream,
70                               EGLint attribute,
71                               EGLint value);
72 Error ValidateQueryStreamKHR(const Display *display,
73                              const Stream *stream,
74                              EGLenum attribute,
75                              EGLint *value);
76 Error ValidateQueryStreamu64KHR(const Display *display,
77                                 const Stream *stream,
78                                 EGLenum attribute,
79                                 EGLuint64KHR *value);
80 Error ValidateStreamConsumerGLTextureExternalKHR(const Display *display,
81                                                  gl::Context *context,
82                                                  const Stream *stream);
83 Error ValidateStreamConsumerAcquireKHR(const Display *display,
84                                        gl::Context *context,
85                                        const Stream *stream);
86 Error ValidateStreamConsumerReleaseKHR(const Display *display,
87                                        gl::Context *context,
88                                        const Stream *stream);
89 Error ValidateStreamConsumerGLTextureExternalAttribsNV(const Display *display,
90                                                        gl::Context *context,
91                                                        const Stream *stream,
92                                                        const AttributeMap &attribs);
93 Error ValidateCreateStreamProducerD3DTextureNV12ANGLE(const Display *display,
94                                                       const Stream *stream,
95                                                       const AttributeMap &attribs);
96 Error ValidateStreamPostD3DTextureNV12ANGLE(const Display *display,
97                                             const Stream *stream,
98                                             void *texture,
99                                             const AttributeMap &attribs);
100 
101 Error ValidateGetSyncValuesCHROMIUM(const Display *display,
102                                     const Surface *surface,
103                                     const EGLuint64KHR *ust,
104                                     const EGLuint64KHR *msc,
105                                     const EGLuint64KHR *sbc);
106 
107 Error ValidateSwapBuffersWithDamageEXT(const Display *display,
108                                        const Surface *surface,
109                                        EGLint *rects,
110                                        EGLint n_rects);
111 
112 Error ValidateGetConfigAttrib(const Display *display, const Config *config, EGLint attribute);
113 Error ValidateChooseConfig(const Display *display,
114                            const AttributeMap &attribs,
115                            EGLint configSize,
116                            EGLint *numConfig);
117 Error ValidateGetConfigs(const Display *display, EGLint configSize, EGLint *numConfig);
118 
119 // Other validation
120 Error ValidateCompatibleConfigs(const Display *display,
121                                 const Config *config1,
122                                 const Surface *surface,
123                                 const Config *config2,
124                                 EGLint surfaceType);
125 
126 Error ValidateGetPlatformDisplay(EGLenum platform,
127                                  void *native_display,
128                                  const EGLAttrib *attrib_list);
129 Error ValidateGetPlatformDisplayEXT(EGLenum platform,
130                                     void *native_display,
131                                     const EGLint *attrib_list);
132 
133 Error ValidateProgramCacheGetAttribANGLE(const Display *display, EGLenum attrib);
134 
135 Error ValidateProgramCacheQueryANGLE(const Display *display,
136                                      EGLint index,
137                                      void *key,
138                                      EGLint *keysize,
139                                      void *binary,
140                                      EGLint *binarysize);
141 
142 Error ValidateProgramCachePopulateANGLE(const Display *display,
143                                         const void *key,
144                                         EGLint keysize,
145                                         const void *binary,
146                                         EGLint binarysize);
147 
148 Error ValidateProgramCacheResizeANGLE(const Display *display, EGLint limit, EGLenum mode);
149 
150 Error ValidateSurfaceAttrib(const Display *display,
151                             const Surface *surface,
152                             EGLint attribute,
153                             EGLint value);
154 Error ValidateQuerySurface(const Display *display,
155                            const Surface *surface,
156                            EGLint attribute,
157                            EGLint *value);
158 Error ValidateQueryContext(const Display *display,
159                            const gl::Context *context,
160                            EGLint attribute,
161                            EGLint *value);
162 
163 }  // namespace egl
164 
165 #define ANGLE_EGL_TRY(THREAD, EXPR)                   \
166     {                                                 \
167         auto ANGLE_LOCAL_VAR = (EXPR);                \
168         if (ANGLE_LOCAL_VAR.isError())                \
169             return THREAD->setError(ANGLE_LOCAL_VAR); \
170     }
171 
172 #define ANGLE_EGL_TRY_RETURN(THREAD, EXPR, RETVAL) \
173     {                                              \
174         auto ANGLE_LOCAL_VAR = (EXPR);             \
175         if (ANGLE_LOCAL_VAR.isError())             \
176         {                                          \
177             THREAD->setError(ANGLE_LOCAL_VAR);     \
178             return RETVAL;                         \
179         }                                          \
180     }
181 
182 #endif // LIBANGLE_VALIDATIONEGL_H_
183