OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 | 8 |
9 #include "gl/GrGLInterface.h" | 9 #include "gl/GrGLInterface.h" |
10 #include "gl/GrGLExtensions.h" | 10 #include "gl/GrGLExtensions.h" |
(...skipping 21 matching lines...) Expand all Loading... |
32 newInterface->fFunctions.fPushGroupMarker = pushGroupMarkerFn; | 32 newInterface->fFunctions.fPushGroupMarker = pushGroupMarkerFn; |
33 newInterface->fFunctions.fPopGroupMarker = popGroupMarkerFn; | 33 newInterface->fFunctions.fPopGroupMarker = popGroupMarkerFn; |
34 | 34 |
35 return newInterface; | 35 return newInterface; |
36 } | 36 } |
37 | 37 |
38 const GrGLInterface* GrGLInterfaceRemoveNVPR(const GrGLInterface* interface) { | 38 const GrGLInterface* GrGLInterfaceRemoveNVPR(const GrGLInterface* interface) { |
39 GrGLInterface* newInterface = GrGLInterface::NewClone(interface); | 39 GrGLInterface* newInterface = GrGLInterface::NewClone(interface); |
40 | 40 |
41 newInterface->fExtensions.remove("GL_NV_path_rendering"); | 41 newInterface->fExtensions.remove("GL_NV_path_rendering"); |
42 newInterface->fFunctions.fPathCommands = NULL; | 42 newInterface->fFunctions.fPathCommands = nullptr; |
43 newInterface->fFunctions.fPathParameteri = NULL; | 43 newInterface->fFunctions.fPathParameteri = nullptr; |
44 newInterface->fFunctions.fPathParameterf = NULL; | 44 newInterface->fFunctions.fPathParameterf = nullptr; |
45 newInterface->fFunctions.fGenPaths = NULL; | 45 newInterface->fFunctions.fGenPaths = nullptr; |
46 newInterface->fFunctions.fDeletePaths = NULL; | 46 newInterface->fFunctions.fDeletePaths = nullptr; |
47 newInterface->fFunctions.fIsPath = NULL; | 47 newInterface->fFunctions.fIsPath = nullptr; |
48 newInterface->fFunctions.fPathStencilFunc = NULL; | 48 newInterface->fFunctions.fPathStencilFunc = nullptr; |
49 newInterface->fFunctions.fStencilFillPath = NULL; | 49 newInterface->fFunctions.fStencilFillPath = nullptr; |
50 newInterface->fFunctions.fStencilStrokePath = NULL; | 50 newInterface->fFunctions.fStencilStrokePath = nullptr; |
51 newInterface->fFunctions.fStencilFillPathInstanced = NULL; | 51 newInterface->fFunctions.fStencilFillPathInstanced = nullptr; |
52 newInterface->fFunctions.fStencilStrokePathInstanced = NULL; | 52 newInterface->fFunctions.fStencilStrokePathInstanced = nullptr; |
53 newInterface->fFunctions.fCoverFillPath = NULL; | 53 newInterface->fFunctions.fCoverFillPath = nullptr; |
54 newInterface->fFunctions.fCoverStrokePath = NULL; | 54 newInterface->fFunctions.fCoverStrokePath = nullptr; |
55 newInterface->fFunctions.fCoverFillPathInstanced = NULL; | 55 newInterface->fFunctions.fCoverFillPathInstanced = nullptr; |
56 newInterface->fFunctions.fCoverStrokePathInstanced = NULL; | 56 newInterface->fFunctions.fCoverStrokePathInstanced = nullptr; |
57 newInterface->fFunctions.fStencilThenCoverFillPath = NULL; | 57 newInterface->fFunctions.fStencilThenCoverFillPath = nullptr; |
58 newInterface->fFunctions.fStencilThenCoverStrokePath = NULL; | 58 newInterface->fFunctions.fStencilThenCoverStrokePath = nullptr; |
59 newInterface->fFunctions.fStencilThenCoverFillPathInstanced = NULL; | 59 newInterface->fFunctions.fStencilThenCoverFillPathInstanced = nullptr; |
60 newInterface->fFunctions.fStencilThenCoverStrokePathInstanced = NULL; | 60 newInterface->fFunctions.fStencilThenCoverStrokePathInstanced = nullptr; |
61 newInterface->fFunctions.fProgramPathFragmentInputGen = NULL; | 61 newInterface->fFunctions.fProgramPathFragmentInputGen = nullptr; |
62 newInterface->fFunctions.fBindFragmentInputLocation = NULL; | 62 newInterface->fFunctions.fBindFragmentInputLocation = nullptr; |
63 return newInterface; | 63 return newInterface; |
64 } | 64 } |
65 | 65 |
66 GrGLInterface::GrGLInterface() { | 66 GrGLInterface::GrGLInterface() { |
67 fStandard = kNone_GrGLStandard; | 67 fStandard = kNone_GrGLStandard; |
68 | 68 |
69 #if GR_GL_PER_GL_FUNC_CALLBACK | 69 #if GR_GL_PER_GL_FUNC_CALLBACK |
70 fCallback = GrGLDefaultInterfaceCallback; | 70 fCallback = GrGLDefaultInterfaceCallback; |
71 fCallbackData = 0; | 71 fCallbackData = 0; |
72 #endif | 72 #endif |
(...skipping 27 matching lines...) Expand all Loading... |
100 | 100 |
101 if (kNone_GrGLStandard == fStandard) { | 101 if (kNone_GrGLStandard == fStandard) { |
102 RETURN_FALSE_INTERFACE | 102 RETURN_FALSE_INTERFACE |
103 } | 103 } |
104 | 104 |
105 if (!fExtensions.isInitialized()) { | 105 if (!fExtensions.isInitialized()) { |
106 RETURN_FALSE_INTERFACE | 106 RETURN_FALSE_INTERFACE |
107 } | 107 } |
108 | 108 |
109 // functions that are always required | 109 // functions that are always required |
110 if (NULL == fFunctions.fActiveTexture || | 110 if (nullptr == fFunctions.fActiveTexture || |
111 NULL == fFunctions.fAttachShader || | 111 nullptr == fFunctions.fAttachShader || |
112 NULL == fFunctions.fBindAttribLocation || | 112 nullptr == fFunctions.fBindAttribLocation || |
113 NULL == fFunctions.fBindBuffer || | 113 nullptr == fFunctions.fBindBuffer || |
114 NULL == fFunctions.fBindTexture || | 114 nullptr == fFunctions.fBindTexture || |
115 NULL == fFunctions.fBlendColor || // -> GL >= 1.4 or extension, ES
>= 2.0 | 115 nullptr == fFunctions.fBlendColor || // -> GL >= 1.4 or extension,
ES >= 2.0 |
116 NULL == fFunctions.fBlendEquation || // -> GL >= 1.4 or extension, ES
>= 2.0 | 116 nullptr == fFunctions.fBlendEquation || // -> GL >= 1.4 or extension,
ES >= 2.0 |
117 NULL == fFunctions.fBlendFunc || | 117 nullptr == fFunctions.fBlendFunc || |
118 NULL == fFunctions.fBufferData || | 118 nullptr == fFunctions.fBufferData || |
119 NULL == fFunctions.fBufferSubData || | 119 nullptr == fFunctions.fBufferSubData || |
120 NULL == fFunctions.fClear || | 120 nullptr == fFunctions.fClear || |
121 NULL == fFunctions.fClearColor || | 121 nullptr == fFunctions.fClearColor || |
122 NULL == fFunctions.fClearStencil || | 122 nullptr == fFunctions.fClearStencil || |
123 NULL == fFunctions.fColorMask || | 123 nullptr == fFunctions.fColorMask || |
124 NULL == fFunctions.fCompileShader || | 124 nullptr == fFunctions.fCompileShader || |
125 NULL == fFunctions.fCopyTexSubImage2D || | 125 nullptr == fFunctions.fCopyTexSubImage2D || |
126 NULL == fFunctions.fCreateProgram || | 126 nullptr == fFunctions.fCreateProgram || |
127 NULL == fFunctions.fCreateShader || | 127 nullptr == fFunctions.fCreateShader || |
128 NULL == fFunctions.fCullFace || | 128 nullptr == fFunctions.fCullFace || |
129 NULL == fFunctions.fDeleteBuffers || | 129 nullptr == fFunctions.fDeleteBuffers || |
130 NULL == fFunctions.fDeleteProgram || | 130 nullptr == fFunctions.fDeleteProgram || |
131 NULL == fFunctions.fDeleteShader || | 131 nullptr == fFunctions.fDeleteShader || |
132 NULL == fFunctions.fDeleteTextures || | 132 nullptr == fFunctions.fDeleteTextures || |
133 NULL == fFunctions.fDepthMask || | 133 nullptr == fFunctions.fDepthMask || |
134 NULL == fFunctions.fDisable || | 134 nullptr == fFunctions.fDisable || |
135 NULL == fFunctions.fDisableVertexAttribArray || | 135 nullptr == fFunctions.fDisableVertexAttribArray || |
136 NULL == fFunctions.fDrawArrays || | 136 nullptr == fFunctions.fDrawArrays || |
137 NULL == fFunctions.fDrawElements || | 137 nullptr == fFunctions.fDrawElements || |
138 NULL == fFunctions.fEnable || | 138 nullptr == fFunctions.fEnable || |
139 NULL == fFunctions.fEnableVertexAttribArray || | 139 nullptr == fFunctions.fEnableVertexAttribArray || |
140 NULL == fFunctions.fFrontFace || | 140 nullptr == fFunctions.fFrontFace || |
141 NULL == fFunctions.fGenBuffers || | 141 nullptr == fFunctions.fGenBuffers || |
142 NULL == fFunctions.fGenTextures || | 142 nullptr == fFunctions.fGenTextures || |
143 NULL == fFunctions.fGetBufferParameteriv || | 143 nullptr == fFunctions.fGetBufferParameteriv || |
144 NULL == fFunctions.fGenerateMipmap || | 144 nullptr == fFunctions.fGenerateMipmap || |
145 NULL == fFunctions.fGetError || | 145 nullptr == fFunctions.fGetError || |
146 NULL == fFunctions.fGetIntegerv || | 146 nullptr == fFunctions.fGetIntegerv || |
147 NULL == fFunctions.fGetProgramInfoLog || | 147 nullptr == fFunctions.fGetProgramInfoLog || |
148 NULL == fFunctions.fGetProgramiv || | 148 nullptr == fFunctions.fGetProgramiv || |
149 NULL == fFunctions.fGetShaderInfoLog || | 149 nullptr == fFunctions.fGetShaderInfoLog || |
150 NULL == fFunctions.fGetShaderiv || | 150 nullptr == fFunctions.fGetShaderiv || |
151 NULL == fFunctions.fGetString || | 151 nullptr == fFunctions.fGetString || |
152 NULL == fFunctions.fGetUniformLocation || | 152 nullptr == fFunctions.fGetUniformLocation || |
153 #if 0 // Not included in Chrome yet | 153 #if 0 // Not included in Chrome yet |
154 NULL == fFunctions.fIsTexture || | 154 nullptr == fFunctions.fIsTexture || |
155 #endif | 155 #endif |
156 NULL == fFunctions.fLinkProgram || | 156 nullptr == fFunctions.fLinkProgram || |
157 NULL == fFunctions.fLineWidth || | 157 nullptr == fFunctions.fLineWidth || |
158 NULL == fFunctions.fPixelStorei || | 158 nullptr == fFunctions.fPixelStorei || |
159 NULL == fFunctions.fReadPixels || | 159 nullptr == fFunctions.fReadPixels || |
160 NULL == fFunctions.fScissor || | 160 nullptr == fFunctions.fScissor || |
161 NULL == fFunctions.fShaderSource || | 161 nullptr == fFunctions.fShaderSource || |
162 NULL == fFunctions.fStencilFunc || | 162 nullptr == fFunctions.fStencilFunc || |
163 NULL == fFunctions.fStencilMask || | 163 nullptr == fFunctions.fStencilMask || |
164 NULL == fFunctions.fStencilOp || | 164 nullptr == fFunctions.fStencilOp || |
165 NULL == fFunctions.fTexImage2D || | 165 nullptr == fFunctions.fTexImage2D || |
166 NULL == fFunctions.fTexParameteri || | 166 nullptr == fFunctions.fTexParameteri || |
167 NULL == fFunctions.fTexParameteriv || | 167 nullptr == fFunctions.fTexParameteriv || |
168 NULL == fFunctions.fTexSubImage2D || | 168 nullptr == fFunctions.fTexSubImage2D || |
169 NULL == fFunctions.fUniform1f || | 169 nullptr == fFunctions.fUniform1f || |
170 NULL == fFunctions.fUniform1i || | 170 nullptr == fFunctions.fUniform1i || |
171 NULL == fFunctions.fUniform1fv || | 171 nullptr == fFunctions.fUniform1fv || |
172 NULL == fFunctions.fUniform1iv || | 172 nullptr == fFunctions.fUniform1iv || |
173 NULL == fFunctions.fUniform2f || | 173 nullptr == fFunctions.fUniform2f || |
174 NULL == fFunctions.fUniform2i || | 174 nullptr == fFunctions.fUniform2i || |
175 NULL == fFunctions.fUniform2fv || | 175 nullptr == fFunctions.fUniform2fv || |
176 NULL == fFunctions.fUniform2iv || | 176 nullptr == fFunctions.fUniform2iv || |
177 NULL == fFunctions.fUniform3f || | 177 nullptr == fFunctions.fUniform3f || |
178 NULL == fFunctions.fUniform3i || | 178 nullptr == fFunctions.fUniform3i || |
179 NULL == fFunctions.fUniform3fv || | 179 nullptr == fFunctions.fUniform3fv || |
180 NULL == fFunctions.fUniform3iv || | 180 nullptr == fFunctions.fUniform3iv || |
181 NULL == fFunctions.fUniform4f || | 181 nullptr == fFunctions.fUniform4f || |
182 NULL == fFunctions.fUniform4i || | 182 nullptr == fFunctions.fUniform4i || |
183 NULL == fFunctions.fUniform4fv || | 183 nullptr == fFunctions.fUniform4fv || |
184 NULL == fFunctions.fUniform4iv || | 184 nullptr == fFunctions.fUniform4iv || |
185 NULL == fFunctions.fUniformMatrix2fv || | 185 nullptr == fFunctions.fUniformMatrix2fv || |
186 NULL == fFunctions.fUniformMatrix3fv || | 186 nullptr == fFunctions.fUniformMatrix3fv || |
187 NULL == fFunctions.fUniformMatrix4fv || | 187 nullptr == fFunctions.fUniformMatrix4fv || |
188 NULL == fFunctions.fUseProgram || | 188 nullptr == fFunctions.fUseProgram || |
189 NULL == fFunctions.fVertexAttrib1f || | 189 nullptr == fFunctions.fVertexAttrib1f || |
190 NULL == fFunctions.fVertexAttrib2fv || | 190 nullptr == fFunctions.fVertexAttrib2fv || |
191 NULL == fFunctions.fVertexAttrib3fv || | 191 nullptr == fFunctions.fVertexAttrib3fv || |
192 NULL == fFunctions.fVertexAttrib4fv || | 192 nullptr == fFunctions.fVertexAttrib4fv || |
193 NULL == fFunctions.fVertexAttribPointer || | 193 nullptr == fFunctions.fVertexAttribPointer || |
194 NULL == fFunctions.fViewport || | 194 nullptr == fFunctions.fViewport || |
195 NULL == fFunctions.fBindFramebuffer || | 195 nullptr == fFunctions.fBindFramebuffer || |
196 NULL == fFunctions.fBindRenderbuffer || | 196 nullptr == fFunctions.fBindRenderbuffer || |
197 NULL == fFunctions.fCheckFramebufferStatus || | 197 nullptr == fFunctions.fCheckFramebufferStatus || |
198 NULL == fFunctions.fDeleteFramebuffers || | 198 nullptr == fFunctions.fDeleteFramebuffers || |
199 NULL == fFunctions.fDeleteRenderbuffers || | 199 nullptr == fFunctions.fDeleteRenderbuffers || |
200 NULL == fFunctions.fFinish || | 200 nullptr == fFunctions.fFinish || |
201 NULL == fFunctions.fFlush || | 201 nullptr == fFunctions.fFlush || |
202 NULL == fFunctions.fFramebufferRenderbuffer || | 202 nullptr == fFunctions.fFramebufferRenderbuffer || |
203 NULL == fFunctions.fFramebufferTexture2D || | 203 nullptr == fFunctions.fFramebufferTexture2D || |
204 NULL == fFunctions.fGetFramebufferAttachmentParameteriv || | 204 nullptr == fFunctions.fGetFramebufferAttachmentParameteriv || |
205 NULL == fFunctions.fGetRenderbufferParameteriv || | 205 nullptr == fFunctions.fGetRenderbufferParameteriv || |
206 NULL == fFunctions.fGenFramebuffers || | 206 nullptr == fFunctions.fGenFramebuffers || |
207 NULL == fFunctions.fGenRenderbuffers || | 207 nullptr == fFunctions.fGenRenderbuffers || |
208 NULL == fFunctions.fRenderbufferStorage) { | 208 nullptr == fFunctions.fRenderbufferStorage) { |
209 RETURN_FALSE_INTERFACE | 209 RETURN_FALSE_INTERFACE |
210 } | 210 } |
211 | 211 |
212 GrGLVersion glVer = GrGLGetVersion(this); | 212 GrGLVersion glVer = GrGLGetVersion(this); |
213 if (GR_GL_INVALID_VER == glVer) { | 213 if (GR_GL_INVALID_VER == glVer) { |
214 RETURN_FALSE_INTERFACE | 214 RETURN_FALSE_INTERFACE |
215 } | 215 } |
216 | 216 |
217 // Now check that baseline ES/Desktop fns not covered above are present | 217 // Now check that baseline ES/Desktop fns not covered above are present |
218 // and that we have fn pointers for any advertised fExtensions that we will | 218 // and that we have fn pointers for any advertised fExtensions that we will |
219 // try to use. | 219 // try to use. |
220 | 220 |
221 // these functions are part of ES2, we assume they are available | 221 // these functions are part of ES2, we assume they are available |
222 // On the desktop we assume they are available if the extension | 222 // On the desktop we assume they are available if the extension |
223 // is present or GL version is high enough. | 223 // is present or GL version is high enough. |
224 if (kGLES_GrGLStandard == fStandard) { | 224 if (kGLES_GrGLStandard == fStandard) { |
225 if (NULL == fFunctions.fStencilFuncSeparate || | 225 if (nullptr == fFunctions.fStencilFuncSeparate || |
226 NULL == fFunctions.fStencilMaskSeparate || | 226 nullptr == fFunctions.fStencilMaskSeparate || |
227 NULL == fFunctions.fStencilOpSeparate) { | 227 nullptr == fFunctions.fStencilOpSeparate) { |
228 RETURN_FALSE_INTERFACE | 228 RETURN_FALSE_INTERFACE |
229 } | 229 } |
230 } else if (kGL_GrGLStandard == fStandard) { | 230 } else if (kGL_GrGLStandard == fStandard) { |
231 | 231 |
232 if (glVer >= GR_GL_VER(2,0)) { | 232 if (glVer >= GR_GL_VER(2,0)) { |
233 if (NULL == fFunctions.fStencilFuncSeparate || | 233 if (nullptr == fFunctions.fStencilFuncSeparate || |
234 NULL == fFunctions.fStencilMaskSeparate || | 234 nullptr == fFunctions.fStencilMaskSeparate || |
235 NULL == fFunctions.fStencilOpSeparate) { | 235 nullptr == fFunctions.fStencilOpSeparate) { |
236 RETURN_FALSE_INTERFACE | 236 RETURN_FALSE_INTERFACE |
237 } | 237 } |
238 } | 238 } |
239 if (glVer >= GR_GL_VER(3,0) && NULL == fFunctions.fBindFragDataLocation)
{ | 239 if (glVer >= GR_GL_VER(3,0) && nullptr == fFunctions.fBindFragDataLocati
on) { |
240 RETURN_FALSE_INTERFACE | 240 RETURN_FALSE_INTERFACE |
241 } | 241 } |
242 if (glVer >= GR_GL_VER(2,0) || fExtensions.has("GL_ARB_draw_buffers")) { | 242 if (glVer >= GR_GL_VER(2,0) || fExtensions.has("GL_ARB_draw_buffers")) { |
243 if (NULL == fFunctions.fDrawBuffers) { | 243 if (nullptr == fFunctions.fDrawBuffers) { |
244 RETURN_FALSE_INTERFACE | 244 RETURN_FALSE_INTERFACE |
245 } | 245 } |
246 } | 246 } |
247 | 247 |
248 if (glVer >= GR_GL_VER(1,5) || fExtensions.has("GL_ARB_occlusion_query")
) { | 248 if (glVer >= GR_GL_VER(1,5) || fExtensions.has("GL_ARB_occlusion_query")
) { |
249 if (NULL == fFunctions.fGenQueries || | 249 if (nullptr == fFunctions.fGenQueries || |
250 NULL == fFunctions.fDeleteQueries || | 250 nullptr == fFunctions.fDeleteQueries || |
251 NULL == fFunctions.fBeginQuery || | 251 nullptr == fFunctions.fBeginQuery || |
252 NULL == fFunctions.fEndQuery || | 252 nullptr == fFunctions.fEndQuery || |
253 NULL == fFunctions.fGetQueryiv || | 253 nullptr == fFunctions.fGetQueryiv || |
254 NULL == fFunctions.fGetQueryObjectiv || | 254 nullptr == fFunctions.fGetQueryObjectiv || |
255 NULL == fFunctions.fGetQueryObjectuiv) { | 255 nullptr == fFunctions.fGetQueryObjectuiv) { |
256 RETURN_FALSE_INTERFACE | 256 RETURN_FALSE_INTERFACE |
257 } | 257 } |
258 } | 258 } |
259 if (glVer >= GR_GL_VER(3,3) || | 259 if (glVer >= GR_GL_VER(3,3) || |
260 fExtensions.has("GL_ARB_timer_query") || | 260 fExtensions.has("GL_ARB_timer_query") || |
261 fExtensions.has("GL_EXT_timer_query")) { | 261 fExtensions.has("GL_EXT_timer_query")) { |
262 if (NULL == fFunctions.fGetQueryObjecti64v || | 262 if (nullptr == fFunctions.fGetQueryObjecti64v || |
263 NULL == fFunctions.fGetQueryObjectui64v) { | 263 nullptr == fFunctions.fGetQueryObjectui64v) { |
264 RETURN_FALSE_INTERFACE | 264 RETURN_FALSE_INTERFACE |
265 } | 265 } |
266 } | 266 } |
267 if (glVer >= GR_GL_VER(3,3) || fExtensions.has("GL_ARB_timer_query")) { | 267 if (glVer >= GR_GL_VER(3,3) || fExtensions.has("GL_ARB_timer_query")) { |
268 if (NULL == fFunctions.fQueryCounter) { | 268 if (nullptr == fFunctions.fQueryCounter) { |
269 RETURN_FALSE_INTERFACE | 269 RETURN_FALSE_INTERFACE |
270 } | 270 } |
271 } | 271 } |
272 } | 272 } |
273 | 273 |
274 // optional function on desktop before 1.3 | 274 // optional function on desktop before 1.3 |
275 if (kGL_GrGLStandard != fStandard || | 275 if (kGL_GrGLStandard != fStandard || |
276 (glVer >= GR_GL_VER(1,3)) || | 276 (glVer >= GR_GL_VER(1,3)) || |
277 fExtensions.has("GL_ARB_texture_compression")) { | 277 fExtensions.has("GL_ARB_texture_compression")) { |
278 if (NULL == fFunctions.fCompressedTexImage2D | 278 if (nullptr == fFunctions.fCompressedTexImage2D |
279 #if 0 | 279 #if 0 |
280 || NULL == fFunctions.fCompressedTexSubImage2D | 280 || nullptr == fFunctions.fCompressedTexSubImage2D |
281 #endif | 281 #endif |
282 ) { | 282 ) { |
283 RETURN_FALSE_INTERFACE | 283 RETURN_FALSE_INTERFACE |
284 } | 284 } |
285 } | 285 } |
286 | 286 |
287 // part of desktop GL, but not ES | 287 // part of desktop GL, but not ES |
288 if (kGL_GrGLStandard == fStandard && | 288 if (kGL_GrGLStandard == fStandard && |
289 (NULL == fFunctions.fGetTexLevelParameteriv || | 289 (nullptr == fFunctions.fGetTexLevelParameteriv || |
290 NULL == fFunctions.fDrawBuffer || | 290 nullptr == fFunctions.fDrawBuffer || |
291 NULL == fFunctions.fReadBuffer)) { | 291 nullptr == fFunctions.fReadBuffer)) { |
292 RETURN_FALSE_INTERFACE | 292 RETURN_FALSE_INTERFACE |
293 } | 293 } |
294 | 294 |
295 // GL_EXT_texture_storage is part of desktop 4.2 | 295 // GL_EXT_texture_storage is part of desktop 4.2 |
296 // There is a desktop ARB extension and an ES+desktop EXT extension | 296 // There is a desktop ARB extension and an ES+desktop EXT extension |
297 if (kGL_GrGLStandard == fStandard) { | 297 if (kGL_GrGLStandard == fStandard) { |
298 if (glVer >= GR_GL_VER(4,2) || | 298 if (glVer >= GR_GL_VER(4,2) || |
299 fExtensions.has("GL_ARB_texture_storage") || | 299 fExtensions.has("GL_ARB_texture_storage") || |
300 fExtensions.has("GL_EXT_texture_storage")) { | 300 fExtensions.has("GL_EXT_texture_storage")) { |
301 if (NULL == fFunctions.fTexStorage2D) { | 301 if (nullptr == fFunctions.fTexStorage2D) { |
302 RETURN_FALSE_INTERFACE | 302 RETURN_FALSE_INTERFACE |
303 } | 303 } |
304 } | 304 } |
305 } else if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_EXT_texture_storag
e")) { | 305 } else if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_EXT_texture_storag
e")) { |
306 if (NULL == fFunctions.fTexStorage2D) { | 306 if (nullptr == fFunctions.fTexStorage2D) { |
307 RETURN_FALSE_INTERFACE | 307 RETURN_FALSE_INTERFACE |
308 } | 308 } |
309 } | 309 } |
310 | 310 |
311 // glTextureBarrier is part of desktop 4.5. There are also ARB and NV extens
ions. | 311 // glTextureBarrier is part of desktop 4.5. There are also ARB and NV extens
ions. |
312 if (kGL_GrGLStandard == fStandard) { | 312 if (kGL_GrGLStandard == fStandard) { |
313 if (glVer >= GR_GL_VER(4,5) || | 313 if (glVer >= GR_GL_VER(4,5) || |
314 fExtensions.has("GL_ARB_texture_barrier") || | 314 fExtensions.has("GL_ARB_texture_barrier") || |
315 fExtensions.has("GL_NV_texture_barrier")) { | 315 fExtensions.has("GL_NV_texture_barrier")) { |
316 if (NULL == fFunctions.fTextureBarrier) { | 316 if (nullptr == fFunctions.fTextureBarrier) { |
317 RETURN_FALSE_INTERFACE | 317 RETURN_FALSE_INTERFACE |
318 } | 318 } |
319 } | 319 } |
320 } else if (fExtensions.has("GL_NV_texture_barrier")) { | 320 } else if (fExtensions.has("GL_NV_texture_barrier")) { |
321 if (NULL == fFunctions.fTextureBarrier) { | 321 if (nullptr == fFunctions.fTextureBarrier) { |
322 RETURN_FALSE_INTERFACE | 322 RETURN_FALSE_INTERFACE |
323 } | 323 } |
324 } | 324 } |
325 | 325 |
326 if (fExtensions.has("GL_KHR_blend_equation_advanced") || | 326 if (fExtensions.has("GL_KHR_blend_equation_advanced") || |
327 fExtensions.has("GL_NV_blend_equation_advanced")) { | 327 fExtensions.has("GL_NV_blend_equation_advanced")) { |
328 if (NULL == fFunctions.fBlendBarrier) { | 328 if (nullptr == fFunctions.fBlendBarrier) { |
329 RETURN_FALSE_INTERFACE | 329 RETURN_FALSE_INTERFACE |
330 } | 330 } |
331 } | 331 } |
332 | 332 |
333 if (fExtensions.has("GL_EXT_discard_framebuffer")) { | 333 if (fExtensions.has("GL_EXT_discard_framebuffer")) { |
334 // FIXME: Remove this once Chromium is updated to provide this function | 334 // FIXME: Remove this once Chromium is updated to provide this function |
335 #if 0 | 335 #if 0 |
336 if (NULL == fFunctions.fDiscardFramebuffer) { | 336 if (nullptr == fFunctions.fDiscardFramebuffer) { |
337 RETURN_FALSE_INTERFACE | 337 RETURN_FALSE_INTERFACE |
338 } | 338 } |
339 #endif | 339 #endif |
340 } | 340 } |
341 | 341 |
342 // FBO MSAA | 342 // FBO MSAA |
343 if (kGL_GrGLStandard == fStandard) { | 343 if (kGL_GrGLStandard == fStandard) { |
344 // GL 3.0 and the ARB extension have multisample + blit | 344 // GL 3.0 and the ARB extension have multisample + blit |
345 if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_ARB_framebuffer_objec
t")) { | 345 if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_ARB_framebuffer_objec
t")) { |
346 if (NULL == fFunctions.fRenderbufferStorageMultisample || | 346 if (nullptr == fFunctions.fRenderbufferStorageMultisample || |
347 NULL == fFunctions.fBlitFramebuffer) { | 347 nullptr == fFunctions.fBlitFramebuffer) { |
348 RETURN_FALSE_INTERFACE | 348 RETURN_FALSE_INTERFACE |
349 } | 349 } |
350 } else { | 350 } else { |
351 if (fExtensions.has("GL_EXT_framebuffer_blit") && | 351 if (fExtensions.has("GL_EXT_framebuffer_blit") && |
352 NULL == fFunctions.fBlitFramebuffer) { | 352 nullptr == fFunctions.fBlitFramebuffer) { |
353 RETURN_FALSE_INTERFACE | 353 RETURN_FALSE_INTERFACE |
354 } | 354 } |
355 if (fExtensions.has("GL_EXT_framebuffer_multisample") && | 355 if (fExtensions.has("GL_EXT_framebuffer_multisample") && |
356 NULL == fFunctions.fRenderbufferStorageMultisample) { | 356 nullptr == fFunctions.fRenderbufferStorageMultisample) { |
357 RETURN_FALSE_INTERFACE | 357 RETURN_FALSE_INTERFACE |
358 } | 358 } |
359 } | 359 } |
360 } else { | 360 } else { |
361 if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_CHROMIUM_framebuffer_
multisample")) { | 361 if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_CHROMIUM_framebuffer_
multisample")) { |
362 if (NULL == fFunctions.fRenderbufferStorageMultisample || | 362 if (nullptr == fFunctions.fRenderbufferStorageMultisample || |
363 NULL == fFunctions.fBlitFramebuffer) { | 363 nullptr == fFunctions.fBlitFramebuffer) { |
364 RETURN_FALSE_INTERFACE | 364 RETURN_FALSE_INTERFACE |
365 } | 365 } |
366 } | 366 } |
367 if (fExtensions.has("GL_APPLE_framebuffer_multisample")) { | 367 if (fExtensions.has("GL_APPLE_framebuffer_multisample")) { |
368 if (NULL == fFunctions.fRenderbufferStorageMultisampleES2APPLE || | 368 if (nullptr == fFunctions.fRenderbufferStorageMultisampleES2APPLE || |
369 NULL == fFunctions.fResolveMultisampleFramebuffer) { | 369 nullptr == fFunctions.fResolveMultisampleFramebuffer) { |
370 RETURN_FALSE_INTERFACE | 370 RETURN_FALSE_INTERFACE |
371 } | 371 } |
372 } | 372 } |
373 if (fExtensions.has("GL_IMG_multisampled_render_to_texture") || | 373 if (fExtensions.has("GL_IMG_multisampled_render_to_texture") || |
374 fExtensions.has("GL_EXT_multisampled_render_to_texture")) { | 374 fExtensions.has("GL_EXT_multisampled_render_to_texture")) { |
375 if (NULL == fFunctions.fRenderbufferStorageMultisampleES2EXT || | 375 if (nullptr == fFunctions.fRenderbufferStorageMultisampleES2EXT || |
376 NULL == fFunctions.fFramebufferTexture2DMultisample) { | 376 nullptr == fFunctions.fFramebufferTexture2DMultisample) { |
377 RETURN_FALSE_INTERFACE | 377 RETURN_FALSE_INTERFACE |
378 } | 378 } |
379 } | 379 } |
380 } | 380 } |
381 | 381 |
382 // On ES buffer mapping is an extension. On Desktop | 382 // On ES buffer mapping is an extension. On Desktop |
383 // buffer mapping was part of original VBO extension | 383 // buffer mapping was part of original VBO extension |
384 // which we require. | 384 // which we require. |
385 if (kGL_GrGLStandard == fStandard || fExtensions.has("GL_OES_mapbuffer")) { | 385 if (kGL_GrGLStandard == fStandard || fExtensions.has("GL_OES_mapbuffer")) { |
386 if (NULL == fFunctions.fMapBuffer || | 386 if (nullptr == fFunctions.fMapBuffer || |
387 NULL == fFunctions.fUnmapBuffer) { | 387 nullptr == fFunctions.fUnmapBuffer) { |
388 RETURN_FALSE_INTERFACE | 388 RETURN_FALSE_INTERFACE |
389 } | 389 } |
390 } | 390 } |
391 | 391 |
392 // Dual source blending | 392 // Dual source blending |
393 if (kGL_GrGLStandard == fStandard) { | 393 if (kGL_GrGLStandard == fStandard) { |
394 if (glVer >= GR_GL_VER(3,3) || fExtensions.has("GL_ARB_blend_func_extend
ed")) { | 394 if (glVer >= GR_GL_VER(3,3) || fExtensions.has("GL_ARB_blend_func_extend
ed")) { |
395 if (NULL == fFunctions.fBindFragDataLocationIndexed) { | 395 if (nullptr == fFunctions.fBindFragDataLocationIndexed) { |
396 RETURN_FALSE_INTERFACE | 396 RETURN_FALSE_INTERFACE |
397 } | 397 } |
398 } | 398 } |
399 } else { | 399 } else { |
400 if (glVer >= GR_GL_VER(3,0) && fExtensions.has("GL_EXT_blend_func_extend
ed")) { | 400 if (glVer >= GR_GL_VER(3,0) && fExtensions.has("GL_EXT_blend_func_extend
ed")) { |
401 if (NULL == fFunctions.fBindFragDataLocation || | 401 if (nullptr == fFunctions.fBindFragDataLocation || |
402 NULL == fFunctions.fBindFragDataLocationIndexed) { | 402 nullptr == fFunctions.fBindFragDataLocationIndexed) { |
403 RETURN_FALSE_INTERFACE | 403 RETURN_FALSE_INTERFACE |
404 } | 404 } |
405 } | 405 } |
406 } | 406 } |
407 | 407 |
408 | 408 |
409 // glGetStringi was added in version 3.0 of both desktop and ES. | 409 // glGetStringi was added in version 3.0 of both desktop and ES. |
410 if (glVer >= GR_GL_VER(3, 0)) { | 410 if (glVer >= GR_GL_VER(3, 0)) { |
411 if (NULL == fFunctions.fGetStringi) { | 411 if (nullptr == fFunctions.fGetStringi) { |
412 RETURN_FALSE_INTERFACE | 412 RETURN_FALSE_INTERFACE |
413 } | 413 } |
414 } | 414 } |
415 | 415 |
416 if (kGL_GrGLStandard == fStandard) { | 416 if (kGL_GrGLStandard == fStandard) { |
417 if (glVer >= GR_GL_VER(3, 0) || fExtensions.has("GL_ARB_vertex_array_obj
ect")) { | 417 if (glVer >= GR_GL_VER(3, 0) || fExtensions.has("GL_ARB_vertex_array_obj
ect")) { |
418 if (NULL == fFunctions.fBindVertexArray || | 418 if (nullptr == fFunctions.fBindVertexArray || |
419 NULL == fFunctions.fDeleteVertexArrays || | 419 nullptr == fFunctions.fDeleteVertexArrays || |
420 NULL == fFunctions.fGenVertexArrays) { | 420 nullptr == fFunctions.fGenVertexArrays) { |
421 RETURN_FALSE_INTERFACE | 421 RETURN_FALSE_INTERFACE |
422 } | 422 } |
423 } | 423 } |
424 } else { | 424 } else { |
425 if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_OES_vertex_array_obje
ct")) { | 425 if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_OES_vertex_array_obje
ct")) { |
426 if (NULL == fFunctions.fBindVertexArray || | 426 if (nullptr == fFunctions.fBindVertexArray || |
427 NULL == fFunctions.fDeleteVertexArrays || | 427 nullptr == fFunctions.fDeleteVertexArrays || |
428 NULL == fFunctions.fGenVertexArrays) { | 428 nullptr == fFunctions.fGenVertexArrays) { |
429 RETURN_FALSE_INTERFACE | 429 RETURN_FALSE_INTERFACE |
430 } | 430 } |
431 } | 431 } |
432 } | 432 } |
433 | 433 |
434 if (fExtensions.has("GL_EXT_debug_marker")) { | 434 if (fExtensions.has("GL_EXT_debug_marker")) { |
435 if (NULL == fFunctions.fInsertEventMarker || | 435 if (nullptr == fFunctions.fInsertEventMarker || |
436 NULL == fFunctions.fPushGroupMarker || | 436 nullptr == fFunctions.fPushGroupMarker || |
437 NULL == fFunctions.fPopGroupMarker) { | 437 nullptr == fFunctions.fPopGroupMarker) { |
438 RETURN_FALSE_INTERFACE | 438 RETURN_FALSE_INTERFACE |
439 } | 439 } |
440 } | 440 } |
441 | 441 |
442 if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(4,3)) || | 442 if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(4,3)) || |
443 fExtensions.has("GL_ARB_invalidate_subdata")) { | 443 fExtensions.has("GL_ARB_invalidate_subdata")) { |
444 if (NULL == fFunctions.fInvalidateBufferData || | 444 if (nullptr == fFunctions.fInvalidateBufferData || |
445 NULL == fFunctions.fInvalidateBufferSubData || | 445 nullptr == fFunctions.fInvalidateBufferSubData || |
446 NULL == fFunctions.fInvalidateFramebuffer || | 446 nullptr == fFunctions.fInvalidateFramebuffer || |
447 NULL == fFunctions.fInvalidateSubFramebuffer || | 447 nullptr == fFunctions.fInvalidateSubFramebuffer || |
448 NULL == fFunctions.fInvalidateTexImage || | 448 nullptr == fFunctions.fInvalidateTexImage || |
449 NULL == fFunctions.fInvalidateTexSubImage) { | 449 nullptr == fFunctions.fInvalidateTexSubImage) { |
450 RETURN_FALSE_INTERFACE; | 450 RETURN_FALSE_INTERFACE; |
451 } | 451 } |
452 } else if (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,0)) { | 452 } else if (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,0)) { |
453 // ES 3.0 adds the framebuffer functions but not the others. | 453 // ES 3.0 adds the framebuffer functions but not the others. |
454 if (NULL == fFunctions.fInvalidateFramebuffer || | 454 if (nullptr == fFunctions.fInvalidateFramebuffer || |
455 NULL == fFunctions.fInvalidateSubFramebuffer) { | 455 nullptr == fFunctions.fInvalidateSubFramebuffer) { |
456 RETURN_FALSE_INTERFACE; | 456 RETURN_FALSE_INTERFACE; |
457 } | 457 } |
458 } | 458 } |
459 | 459 |
460 if (kGLES_GrGLStandard == fStandard && fExtensions.has("GL_CHROMIUM_map_sub"
)) { | 460 if (kGLES_GrGLStandard == fStandard && fExtensions.has("GL_CHROMIUM_map_sub"
)) { |
461 if (NULL == fFunctions.fMapBufferSubData || | 461 if (nullptr == fFunctions.fMapBufferSubData || |
462 NULL == fFunctions.fMapTexSubImage2D || | 462 nullptr == fFunctions.fMapTexSubImage2D || |
463 NULL == fFunctions.fUnmapBufferSubData || | 463 nullptr == fFunctions.fUnmapBufferSubData || |
464 NULL == fFunctions.fUnmapTexSubImage2D) { | 464 nullptr == fFunctions.fUnmapTexSubImage2D) { |
465 RETURN_FALSE_INTERFACE; | 465 RETURN_FALSE_INTERFACE; |
466 } | 466 } |
467 } | 467 } |
468 | 468 |
469 // These functions are added to the 3.0 version of both GLES and GL. | 469 // These functions are added to the 3.0 version of both GLES and GL. |
470 if (glVer >= GR_GL_VER(3,0) || | 470 if (glVer >= GR_GL_VER(3,0) || |
471 (kGLES_GrGLStandard == fStandard && fExtensions.has("GL_EXT_map_buffer_r
ange")) || | 471 (kGLES_GrGLStandard == fStandard && fExtensions.has("GL_EXT_map_buffer_r
ange")) || |
472 (kGL_GrGLStandard == fStandard && fExtensions.has("GL_ARB_map_buffer_ran
ge"))) { | 472 (kGL_GrGLStandard == fStandard && fExtensions.has("GL_ARB_map_buffer_ran
ge"))) { |
473 if (NULL == fFunctions.fMapBufferRange || | 473 if (nullptr == fFunctions.fMapBufferRange || |
474 NULL == fFunctions.fFlushMappedBufferRange) { | 474 nullptr == fFunctions.fFlushMappedBufferRange) { |
475 RETURN_FALSE_INTERFACE; | 475 RETURN_FALSE_INTERFACE; |
476 } | 476 } |
477 } | 477 } |
478 | 478 |
479 if ((kGL_GrGLStandard == fStandard && | 479 if ((kGL_GrGLStandard == fStandard && |
480 (glVer >= GR_GL_VER(4,3) || fExtensions.has("GL_ARB_program_interface_q
uery"))) || | 480 (glVer >= GR_GL_VER(4,3) || fExtensions.has("GL_ARB_program_interface_q
uery"))) || |
481 (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,1))) { | 481 (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,1))) { |
482 if (NULL == fFunctions.fGetProgramResourceLocation) { | 482 if (nullptr == fFunctions.fGetProgramResourceLocation) { |
483 RETURN_FALSE_INTERFACE | 483 RETURN_FALSE_INTERFACE |
484 } | 484 } |
485 } | 485 } |
486 | 486 |
487 if (kGLES_GrGLStandard == fStandard || glVer >= GR_GL_VER(4,1) || | 487 if (kGLES_GrGLStandard == fStandard || glVer >= GR_GL_VER(4,1) || |
488 fExtensions.has("GL_ARB_ES2_compatibility")) { | 488 fExtensions.has("GL_ARB_ES2_compatibility")) { |
489 #if 0 // Enable this once Chrome gives us the function ptr | 489 #if 0 // Enable this once Chrome gives us the function ptr |
490 if (NULL == fFunctions.fGetShaderPrecisionFormat) { | 490 if (nullptr == fFunctions.fGetShaderPrecisionFormat) { |
491 RETURN_FALSE_INTERFACE | 491 RETURN_FALSE_INTERFACE |
492 } | 492 } |
493 #endif | 493 #endif |
494 } | 494 } |
495 | 495 |
496 if (fExtensions.has("GL_NV_path_rendering") || fExtensions.has("GL_CHROMIUM_
path_rendering")) { | 496 if (fExtensions.has("GL_NV_path_rendering") || fExtensions.has("GL_CHROMIUM_
path_rendering")) { |
497 if (NULL == fFunctions.fMatrixLoadf || | 497 if (nullptr == fFunctions.fMatrixLoadf || |
498 NULL == fFunctions.fMatrixLoadIdentity || | 498 nullptr == fFunctions.fMatrixLoadIdentity || |
499 NULL == fFunctions.fPathCommands || | 499 nullptr == fFunctions.fPathCommands || |
500 NULL == fFunctions.fPathParameteri || | 500 nullptr == fFunctions.fPathParameteri || |
501 NULL == fFunctions.fPathParameterf || | 501 nullptr == fFunctions.fPathParameterf || |
502 NULL == fFunctions.fGenPaths || | 502 nullptr == fFunctions.fGenPaths || |
503 NULL == fFunctions.fDeletePaths || | 503 nullptr == fFunctions.fDeletePaths || |
504 NULL == fFunctions.fIsPath || | 504 nullptr == fFunctions.fIsPath || |
505 NULL == fFunctions.fPathStencilFunc || | 505 nullptr == fFunctions.fPathStencilFunc || |
506 NULL == fFunctions.fStencilFillPath || | 506 nullptr == fFunctions.fStencilFillPath || |
507 NULL == fFunctions.fStencilStrokePath || | 507 nullptr == fFunctions.fStencilStrokePath || |
508 NULL == fFunctions.fStencilFillPathInstanced || | 508 nullptr == fFunctions.fStencilFillPathInstanced || |
509 NULL == fFunctions.fStencilStrokePathInstanced || | 509 nullptr == fFunctions.fStencilStrokePathInstanced || |
510 NULL == fFunctions.fCoverFillPath || | 510 nullptr == fFunctions.fCoverFillPath || |
511 NULL == fFunctions.fCoverStrokePath || | 511 nullptr == fFunctions.fCoverStrokePath || |
512 NULL == fFunctions.fCoverFillPathInstanced || | 512 nullptr == fFunctions.fCoverFillPathInstanced || |
513 NULL == fFunctions.fCoverStrokePathInstanced | 513 nullptr == fFunctions.fCoverStrokePathInstanced |
514 #if 0 | 514 #if 0 |
515 // List of functions that Skia uses, but which have been added since
the initial release | 515 // List of functions that Skia uses, but which have been added since
the initial release |
516 // of NV_path_rendering driver. We do not want to fail interface val
idation due to | 516 // of NV_path_rendering driver. We do not want to fail interface val
idation due to |
517 // missing features, we will just not use the extension. | 517 // missing features, we will just not use the extension. |
518 // Update this list -> update GrGLCaps::hasPathRenderingSupport too. | 518 // Update this list -> update GrGLCaps::hasPathRenderingSupport too. |
519 || NULL == fFunctions.fStencilThenCoverFillPath || | 519 || nullptr == fFunctions.fStencilThenCoverFillPath || |
520 NULL == fFunctions.fStencilThenCoverStrokePath || | 520 nullptr == fFunctions.fStencilThenCoverStrokePath || |
521 NULL == fFunctions.fStencilThenCoverFillPathInstanced || | 521 nullptr == fFunctions.fStencilThenCoverFillPathInstanced || |
522 NULL == fFunctions.fStencilThenCoverStrokePathInstanced || | 522 nullptr == fFunctions.fStencilThenCoverStrokePathInstanced || |
523 NULL == fFunctions.fProgramPathFragmentInputGen | 523 nullptr == fFunctions.fProgramPathFragmentInputGen |
524 #endif | 524 #endif |
525 ) { | 525 ) { |
526 RETURN_FALSE_INTERFACE | 526 RETURN_FALSE_INTERFACE |
527 } | 527 } |
528 if (fExtensions.has("GL_CHROMIUM_path_rendering")) { | 528 if (fExtensions.has("GL_CHROMIUM_path_rendering")) { |
529 if (NULL == fFunctions.fBindFragmentInputLocation) { | 529 if (nullptr == fFunctions.fBindFragmentInputLocation) { |
530 RETURN_FALSE_INTERFACE | 530 RETURN_FALSE_INTERFACE |
531 } | 531 } |
532 } | 532 } |
533 } | 533 } |
534 | 534 |
535 if (fExtensions.has("GL_EXT_raster_multisample")) { | 535 if (fExtensions.has("GL_EXT_raster_multisample")) { |
536 if (NULL == fFunctions.fRasterSamples) { | 536 if (nullptr == fFunctions.fRasterSamples) { |
537 RETURN_FALSE_INTERFACE | 537 RETURN_FALSE_INTERFACE |
538 } | 538 } |
539 } | 539 } |
540 | 540 |
541 if (fExtensions.has("GL_NV_framebuffer_mixed_samples")) { | 541 if (fExtensions.has("GL_NV_framebuffer_mixed_samples")) { |
542 if (NULL == fFunctions.fCoverageModulation) { | 542 if (nullptr == fFunctions.fCoverageModulation) { |
543 RETURN_FALSE_INTERFACE | 543 RETURN_FALSE_INTERFACE |
544 } | 544 } |
545 } | 545 } |
546 | 546 |
547 if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,1)) || | 547 if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,1)) || |
548 (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,0)) || | 548 (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,0)) || |
549 fExtensions.has("GL_ARB_draw_instanced") || | 549 fExtensions.has("GL_ARB_draw_instanced") || |
550 fExtensions.has("GL_EXT_draw_instanced")) { | 550 fExtensions.has("GL_EXT_draw_instanced")) { |
551 if (NULL == fFunctions.fDrawArraysInstanced || | 551 if (nullptr == fFunctions.fDrawArraysInstanced || |
552 NULL == fFunctions.fDrawElementsInstanced) { | 552 nullptr == fFunctions.fDrawElementsInstanced) { |
553 RETURN_FALSE_INTERFACE | 553 RETURN_FALSE_INTERFACE |
554 } | 554 } |
555 } | 555 } |
556 | 556 |
557 if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,2)) || | 557 if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,2)) || |
558 (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,0)) || | 558 (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,0)) || |
559 fExtensions.has("GL_ARB_instanced_arrays") || | 559 fExtensions.has("GL_ARB_instanced_arrays") || |
560 fExtensions.has("GL_EXT_instanced_arrays")) { | 560 fExtensions.has("GL_EXT_instanced_arrays")) { |
561 if (NULL == fFunctions.fVertexAttribDivisor) { | 561 if (nullptr == fFunctions.fVertexAttribDivisor) { |
562 RETURN_FALSE_INTERFACE | 562 RETURN_FALSE_INTERFACE |
563 } | 563 } |
564 } | 564 } |
565 | 565 |
566 if (fExtensions.has("GL_NV_bindless_texture")) { | 566 if (fExtensions.has("GL_NV_bindless_texture")) { |
567 if (NULL == fFunctions.fGetTextureHandle || | 567 if (nullptr == fFunctions.fGetTextureHandle || |
568 NULL == fFunctions.fGetTextureSamplerHandle || | 568 nullptr == fFunctions.fGetTextureSamplerHandle || |
569 NULL == fFunctions.fMakeTextureHandleResident || | 569 nullptr == fFunctions.fMakeTextureHandleResident || |
570 NULL == fFunctions.fMakeTextureHandleNonResident || | 570 nullptr == fFunctions.fMakeTextureHandleNonResident || |
571 NULL == fFunctions.fGetImageHandle || | 571 nullptr == fFunctions.fGetImageHandle || |
572 NULL == fFunctions.fMakeImageHandleResident || | 572 nullptr == fFunctions.fMakeImageHandleResident || |
573 NULL == fFunctions.fMakeImageHandleNonResident || | 573 nullptr == fFunctions.fMakeImageHandleNonResident || |
574 NULL == fFunctions.fIsTextureHandleResident || | 574 nullptr == fFunctions.fIsTextureHandleResident || |
575 NULL == fFunctions.fIsImageHandleResident || | 575 nullptr == fFunctions.fIsImageHandleResident || |
576 NULL == fFunctions.fUniformHandleui64 || | 576 nullptr == fFunctions.fUniformHandleui64 || |
577 NULL == fFunctions.fUniformHandleui64v || | 577 nullptr == fFunctions.fUniformHandleui64v || |
578 NULL == fFunctions.fProgramUniformHandleui64 || | 578 nullptr == fFunctions.fProgramUniformHandleui64 || |
579 NULL == fFunctions.fProgramUniformHandleui64v) { | 579 nullptr == fFunctions.fProgramUniformHandleui64v) { |
580 RETURN_FALSE_INTERFACE | 580 RETURN_FALSE_INTERFACE |
581 } | 581 } |
582 } | 582 } |
583 | 583 |
584 if (kGL_GrGLStandard == fStandard && fExtensions.has("GL_EXT_direct_state_ac
cess")) { | 584 if (kGL_GrGLStandard == fStandard && fExtensions.has("GL_EXT_direct_state_ac
cess")) { |
585 if (NULL == fFunctions.fTextureParameteri || | 585 if (nullptr == fFunctions.fTextureParameteri || |
586 NULL == fFunctions.fTextureParameteriv || | 586 nullptr == fFunctions.fTextureParameteriv || |
587 NULL == fFunctions.fTextureParameterf || | 587 nullptr == fFunctions.fTextureParameterf || |
588 NULL == fFunctions.fTextureParameterfv || | 588 nullptr == fFunctions.fTextureParameterfv || |
589 NULL == fFunctions.fTextureImage1D || | 589 nullptr == fFunctions.fTextureImage1D || |
590 NULL == fFunctions.fTextureImage2D || | 590 nullptr == fFunctions.fTextureImage2D || |
591 NULL == fFunctions.fTextureSubImage1D || | 591 nullptr == fFunctions.fTextureSubImage1D || |
592 NULL == fFunctions.fTextureSubImage2D || | 592 nullptr == fFunctions.fTextureSubImage2D || |
593 NULL == fFunctions.fCopyTextureImage1D || | 593 nullptr == fFunctions.fCopyTextureImage1D || |
594 NULL == fFunctions.fCopyTextureImage2D || | 594 nullptr == fFunctions.fCopyTextureImage2D || |
595 NULL == fFunctions.fCopyTextureSubImage1D || | 595 nullptr == fFunctions.fCopyTextureSubImage1D || |
596 NULL == fFunctions.fCopyTextureSubImage2D || | 596 nullptr == fFunctions.fCopyTextureSubImage2D || |
597 NULL == fFunctions.fGetTextureImage || | 597 nullptr == fFunctions.fGetTextureImage || |
598 NULL == fFunctions.fGetTextureParameterfv || | 598 nullptr == fFunctions.fGetTextureParameterfv || |
599 NULL == fFunctions.fGetTextureParameteriv || | 599 nullptr == fFunctions.fGetTextureParameteriv || |
600 NULL == fFunctions.fGetTextureLevelParameterfv || | 600 nullptr == fFunctions.fGetTextureLevelParameterfv || |
601 NULL == fFunctions.fGetTextureLevelParameteriv) { | 601 nullptr == fFunctions.fGetTextureLevelParameteriv) { |
602 RETURN_FALSE_INTERFACE | 602 RETURN_FALSE_INTERFACE |
603 } | 603 } |
604 if (glVer >= GR_GL_VER(1,2)) { | 604 if (glVer >= GR_GL_VER(1,2)) { |
605 if (NULL == fFunctions.fTextureImage3D || | 605 if (nullptr == fFunctions.fTextureImage3D || |
606 NULL == fFunctions.fTextureSubImage3D || | 606 nullptr == fFunctions.fTextureSubImage3D || |
607 NULL == fFunctions.fCopyTextureSubImage3D || | 607 nullptr == fFunctions.fCopyTextureSubImage3D || |
608 NULL == fFunctions.fCompressedTextureImage3D || | 608 nullptr == fFunctions.fCompressedTextureImage3D || |
609 NULL == fFunctions.fCompressedTextureImage2D || | 609 nullptr == fFunctions.fCompressedTextureImage2D || |
610 NULL == fFunctions.fCompressedTextureImage1D || | 610 nullptr == fFunctions.fCompressedTextureImage1D || |
611 NULL == fFunctions.fCompressedTextureSubImage3D || | 611 nullptr == fFunctions.fCompressedTextureSubImage3D || |
612 NULL == fFunctions.fCompressedTextureSubImage2D || | 612 nullptr == fFunctions.fCompressedTextureSubImage2D || |
613 NULL == fFunctions.fCompressedTextureSubImage1D || | 613 nullptr == fFunctions.fCompressedTextureSubImage1D || |
614 NULL == fFunctions.fGetCompressedTextureImage) { | 614 nullptr == fFunctions.fGetCompressedTextureImage) { |
615 RETURN_FALSE_INTERFACE | 615 RETURN_FALSE_INTERFACE |
616 } | 616 } |
617 } | 617 } |
618 if (glVer >= GR_GL_VER(1,5)) { | 618 if (glVer >= GR_GL_VER(1,5)) { |
619 if (NULL == fFunctions.fNamedBufferData || | 619 if (nullptr == fFunctions.fNamedBufferData || |
620 NULL == fFunctions.fNamedBufferSubData || | 620 nullptr == fFunctions.fNamedBufferSubData || |
621 NULL == fFunctions.fMapNamedBuffer || | 621 nullptr == fFunctions.fMapNamedBuffer || |
622 NULL == fFunctions.fUnmapNamedBuffer || | 622 nullptr == fFunctions.fUnmapNamedBuffer || |
623 NULL == fFunctions.fGetNamedBufferParameteriv || | 623 nullptr == fFunctions.fGetNamedBufferParameteriv || |
624 NULL == fFunctions.fGetNamedBufferPointerv || | 624 nullptr == fFunctions.fGetNamedBufferPointerv || |
625 NULL == fFunctions.fGetNamedBufferSubData) { | 625 nullptr == fFunctions.fGetNamedBufferSubData) { |
626 RETURN_FALSE_INTERFACE | 626 RETURN_FALSE_INTERFACE |
627 } | 627 } |
628 } | 628 } |
629 if (glVer >= GR_GL_VER(2,0)) { | 629 if (glVer >= GR_GL_VER(2,0)) { |
630 if (NULL == fFunctions.fProgramUniform1f || | 630 if (nullptr == fFunctions.fProgramUniform1f || |
631 NULL == fFunctions.fProgramUniform2f || | 631 nullptr == fFunctions.fProgramUniform2f || |
632 NULL == fFunctions.fProgramUniform3f || | 632 nullptr == fFunctions.fProgramUniform3f || |
633 NULL == fFunctions.fProgramUniform4f || | 633 nullptr == fFunctions.fProgramUniform4f || |
634 NULL == fFunctions.fProgramUniform1i || | 634 nullptr == fFunctions.fProgramUniform1i || |
635 NULL == fFunctions.fProgramUniform2i || | 635 nullptr == fFunctions.fProgramUniform2i || |
636 NULL == fFunctions.fProgramUniform3i || | 636 nullptr == fFunctions.fProgramUniform3i || |
637 NULL == fFunctions.fProgramUniform4i || | 637 nullptr == fFunctions.fProgramUniform4i || |
638 NULL == fFunctions.fProgramUniform1fv || | 638 nullptr == fFunctions.fProgramUniform1fv || |
639 NULL == fFunctions.fProgramUniform2fv || | 639 nullptr == fFunctions.fProgramUniform2fv || |
640 NULL == fFunctions.fProgramUniform3fv || | 640 nullptr == fFunctions.fProgramUniform3fv || |
641 NULL == fFunctions.fProgramUniform4fv || | 641 nullptr == fFunctions.fProgramUniform4fv || |
642 NULL == fFunctions.fProgramUniform1iv || | 642 nullptr == fFunctions.fProgramUniform1iv || |
643 NULL == fFunctions.fProgramUniform2iv || | 643 nullptr == fFunctions.fProgramUniform2iv || |
644 NULL == fFunctions.fProgramUniform3iv || | 644 nullptr == fFunctions.fProgramUniform3iv || |
645 NULL == fFunctions.fProgramUniform4iv || | 645 nullptr == fFunctions.fProgramUniform4iv || |
646 NULL == fFunctions.fProgramUniformMatrix2fv || | 646 nullptr == fFunctions.fProgramUniformMatrix2fv || |
647 NULL == fFunctions.fProgramUniformMatrix3fv || | 647 nullptr == fFunctions.fProgramUniformMatrix3fv || |
648 NULL == fFunctions.fProgramUniformMatrix4fv) { | 648 nullptr == fFunctions.fProgramUniformMatrix4fv) { |
649 RETURN_FALSE_INTERFACE | 649 RETURN_FALSE_INTERFACE |
650 } | 650 } |
651 } | 651 } |
652 if (glVer >= GR_GL_VER(2,1)) { | 652 if (glVer >= GR_GL_VER(2,1)) { |
653 if (NULL == fFunctions.fProgramUniformMatrix2x3fv || | 653 if (nullptr == fFunctions.fProgramUniformMatrix2x3fv || |
654 NULL == fFunctions.fProgramUniformMatrix3x2fv || | 654 nullptr == fFunctions.fProgramUniformMatrix3x2fv || |
655 NULL == fFunctions.fProgramUniformMatrix2x4fv || | 655 nullptr == fFunctions.fProgramUniformMatrix2x4fv || |
656 NULL == fFunctions.fProgramUniformMatrix4x2fv || | 656 nullptr == fFunctions.fProgramUniformMatrix4x2fv || |
657 NULL == fFunctions.fProgramUniformMatrix3x4fv || | 657 nullptr == fFunctions.fProgramUniformMatrix3x4fv || |
658 NULL == fFunctions.fProgramUniformMatrix4x3fv) { | 658 nullptr == fFunctions.fProgramUniformMatrix4x3fv) { |
659 RETURN_FALSE_INTERFACE | 659 RETURN_FALSE_INTERFACE |
660 } | 660 } |
661 } | 661 } |
662 if (glVer >= GR_GL_VER(3,0)) { | 662 if (glVer >= GR_GL_VER(3,0)) { |
663 if (NULL == fFunctions.fNamedRenderbufferStorage || | 663 if (nullptr == fFunctions.fNamedRenderbufferStorage || |
664 NULL == fFunctions.fGetNamedRenderbufferParameteriv || | 664 nullptr == fFunctions.fGetNamedRenderbufferParameteriv || |
665 NULL == fFunctions.fNamedRenderbufferStorageMultisample || | 665 nullptr == fFunctions.fNamedRenderbufferStorageMultisample || |
666 NULL == fFunctions.fCheckNamedFramebufferStatus || | 666 nullptr == fFunctions.fCheckNamedFramebufferStatus || |
667 NULL == fFunctions.fNamedFramebufferTexture1D || | 667 nullptr == fFunctions.fNamedFramebufferTexture1D || |
668 NULL == fFunctions.fNamedFramebufferTexture2D || | 668 nullptr == fFunctions.fNamedFramebufferTexture2D || |
669 NULL == fFunctions.fNamedFramebufferTexture3D || | 669 nullptr == fFunctions.fNamedFramebufferTexture3D || |
670 NULL == fFunctions.fNamedFramebufferRenderbuffer || | 670 nullptr == fFunctions.fNamedFramebufferRenderbuffer || |
671 NULL == fFunctions.fGetNamedFramebufferAttachmentParameteriv || | 671 nullptr == fFunctions.fGetNamedFramebufferAttachmentParameteriv
|| |
672 NULL == fFunctions.fGenerateTextureMipmap || | 672 nullptr == fFunctions.fGenerateTextureMipmap || |
673 NULL == fFunctions.fFramebufferDrawBuffer || | 673 nullptr == fFunctions.fFramebufferDrawBuffer || |
674 NULL == fFunctions.fFramebufferDrawBuffers || | 674 nullptr == fFunctions.fFramebufferDrawBuffers || |
675 NULL == fFunctions.fFramebufferReadBuffer || | 675 nullptr == fFunctions.fFramebufferReadBuffer || |
676 NULL == fFunctions.fGetFramebufferParameteriv || | 676 nullptr == fFunctions.fGetFramebufferParameteriv || |
677 NULL == fFunctions.fNamedCopyBufferSubData || | 677 nullptr == fFunctions.fNamedCopyBufferSubData || |
678 NULL == fFunctions.fVertexArrayVertexOffset || | 678 nullptr == fFunctions.fVertexArrayVertexOffset || |
679 NULL == fFunctions.fVertexArrayColorOffset || | 679 nullptr == fFunctions.fVertexArrayColorOffset || |
680 NULL == fFunctions.fVertexArrayEdgeFlagOffset || | 680 nullptr == fFunctions.fVertexArrayEdgeFlagOffset || |
681 NULL == fFunctions.fVertexArrayIndexOffset || | 681 nullptr == fFunctions.fVertexArrayIndexOffset || |
682 NULL == fFunctions.fVertexArrayNormalOffset || | 682 nullptr == fFunctions.fVertexArrayNormalOffset || |
683 NULL == fFunctions.fVertexArrayTexCoordOffset || | 683 nullptr == fFunctions.fVertexArrayTexCoordOffset || |
684 NULL == fFunctions.fVertexArrayMultiTexCoordOffset || | 684 nullptr == fFunctions.fVertexArrayMultiTexCoordOffset || |
685 NULL == fFunctions.fVertexArrayFogCoordOffset || | 685 nullptr == fFunctions.fVertexArrayFogCoordOffset || |
686 NULL == fFunctions.fVertexArraySecondaryColorOffset || | 686 nullptr == fFunctions.fVertexArraySecondaryColorOffset || |
687 NULL == fFunctions.fVertexArrayVertexAttribOffset || | 687 nullptr == fFunctions.fVertexArrayVertexAttribOffset || |
688 NULL == fFunctions.fVertexArrayVertexAttribIOffset || | 688 nullptr == fFunctions.fVertexArrayVertexAttribIOffset || |
689 NULL == fFunctions.fEnableVertexArray || | 689 nullptr == fFunctions.fEnableVertexArray || |
690 NULL == fFunctions.fDisableVertexArray || | 690 nullptr == fFunctions.fDisableVertexArray || |
691 NULL == fFunctions.fEnableVertexArrayAttrib || | 691 nullptr == fFunctions.fEnableVertexArrayAttrib || |
692 NULL == fFunctions.fDisableVertexArrayAttrib || | 692 nullptr == fFunctions.fDisableVertexArrayAttrib || |
693 NULL == fFunctions.fGetVertexArrayIntegerv || | 693 nullptr == fFunctions.fGetVertexArrayIntegerv || |
694 NULL == fFunctions.fGetVertexArrayPointerv || | 694 nullptr == fFunctions.fGetVertexArrayPointerv || |
695 NULL == fFunctions.fGetVertexArrayIntegeri_v || | 695 nullptr == fFunctions.fGetVertexArrayIntegeri_v || |
696 NULL == fFunctions.fGetVertexArrayPointeri_v || | 696 nullptr == fFunctions.fGetVertexArrayPointeri_v || |
697 NULL == fFunctions.fMapNamedBufferRange || | 697 nullptr == fFunctions.fMapNamedBufferRange || |
698 NULL == fFunctions.fFlushMappedNamedBufferRange) { | 698 nullptr == fFunctions.fFlushMappedNamedBufferRange) { |
699 RETURN_FALSE_INTERFACE | 699 RETURN_FALSE_INTERFACE |
700 } | 700 } |
701 } | 701 } |
702 } | 702 } |
703 | 703 |
704 if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(4,3)) || | 704 if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(4,3)) || |
705 fExtensions.has("GL_KHR_debug")) { | 705 fExtensions.has("GL_KHR_debug")) { |
706 if (NULL == fFunctions.fDebugMessageControl || | 706 if (nullptr == fFunctions.fDebugMessageControl || |
707 NULL == fFunctions.fDebugMessageInsert || | 707 nullptr == fFunctions.fDebugMessageInsert || |
708 NULL == fFunctions.fDebugMessageCallback || | 708 nullptr == fFunctions.fDebugMessageCallback || |
709 NULL == fFunctions.fGetDebugMessageLog || | 709 nullptr == fFunctions.fGetDebugMessageLog || |
710 NULL == fFunctions.fPushDebugGroup || | 710 nullptr == fFunctions.fPushDebugGroup || |
711 NULL == fFunctions.fPopDebugGroup || | 711 nullptr == fFunctions.fPopDebugGroup || |
712 NULL == fFunctions.fObjectLabel) { | 712 nullptr == fFunctions.fObjectLabel) { |
713 RETURN_FALSE_INTERFACE | 713 RETURN_FALSE_INTERFACE |
714 } | 714 } |
715 } | 715 } |
716 | 716 |
717 return true; | 717 return true; |
718 } | 718 } |
OLD | NEW |