OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 #include "gl/GLTestContext.h" | 8 #include "gl/GLTestContext.h" |
9 | 9 |
10 #include <X11/Xlib.h> | 10 #include <X11/Xlib.h> |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 } | 177 } |
178 } else { | 178 } else { |
179 //SkDebugf("Creating context.\n"); | 179 //SkDebugf("Creating context.\n"); |
180 PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB = | 180 PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB = |
181 (PFNGLXCREATECONTEXTATTRIBSARBPROC) glXGetProcAddressARB((GrGLubyte*
)"glXCreateContextAttribsARB"); | 181 (PFNGLXCREATECONTEXTATTRIBSARBPROC) glXGetProcAddressARB((GrGLubyte*
)"glXCreateContextAttribsARB"); |
182 | 182 |
183 if (kGLES_GrGLStandard == forcedGpuAPI) { | 183 if (kGLES_GrGLStandard == forcedGpuAPI) { |
184 if (gluCheckExtension( | 184 if (gluCheckExtension( |
185 reinterpret_cast<const GLubyte*>("GLX_EXT_create_context_es2
_profile"), | 185 reinterpret_cast<const GLubyte*>("GLX_EXT_create_context_es2
_profile"), |
186 reinterpret_cast<const GLubyte*>(glxExts))) { | 186 reinterpret_cast<const GLubyte*>(glxExts))) { |
187 static const int context_attribs_gles[] = { | 187 const int context_attribs_gles[] = { |
188 GLX_CONTEXT_MAJOR_VERSION_ARB, 3, | 188 GLX_CONTEXT_MAJOR_VERSION_ARB, 2, |
189 GLX_CONTEXT_MINOR_VERSION_ARB, 0, | 189 GLX_CONTEXT_MINOR_VERSION_ARB, 0, |
190 GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_ES2_PROFILE_BIT_EX
T, | 190 GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_ES2_PROFILE_BIT_EX
T, |
191 None | 191 None |
192 }; | 192 }; |
193 fContext = glXCreateContextAttribsARB(fDisplay, bestFbc, glxShar
eContext, True, | 193 fContext = glXCreateContextAttribsARB(fDisplay, bestFbc, glxShar
eContext, True, |
194 context_attribs_gles); | 194 context_attribs_gles); |
195 } | 195 } |
196 } else { | 196 } else { |
197 // Well, unfortunately GLX will not just give us the highest context
so instead we have | 197 // Well, unfortunately GLX will not just give us the highest context
so instead we have |
198 // to do this nastiness | 198 // to do this nastiness |
199 for (i = NUM_GL_VERSIONS - 2; i > 0 ; i--) { | 199 for (i = NUM_GL_VERSIONS - 2; i > 0 ; i--) { |
200 /* don't bother below GL 3.0 */ | 200 /* don't bother below GL 3.0 */ |
201 if (gl_versions[i].major == 3 && gl_versions[i].minor == 0) { | 201 if (gl_versions[i].major < 3) { |
202 break; | 202 break; |
203 } | 203 } |
204 // On Nvidia GPUs, to use Nv Path rendering we need a compatibil
ity profile for the | 204 // On Nvidia GPUs, to use Nv Path rendering we need a compatibil
ity profile for the |
205 // time being. | 205 // time being. |
206 // TODO when Nvidia implements NVPR on Core profiles, we should
start requesting | 206 // TODO when Nvidia implements NVPR on Core profiles, we should
start requesting |
207 // core here | 207 // core here |
208 static const int context_attribs_gl[] = { | 208 // Warning: This array should not be set to static. The |
| 209 // glXCreateContextAttribsARB call writes to it upon failure and |
| 210 // the next call would fail too. |
| 211 const int context_attribs_gl[] = { |
209 GLX_CONTEXT_MAJOR_VERSION_ARB, gl_versions[i].major, | 212 GLX_CONTEXT_MAJOR_VERSION_ARB, gl_versions[i].major, |
210 GLX_CONTEXT_MINOR_VERSION_ARB, gl_versions[i].minor, | 213 GLX_CONTEXT_MINOR_VERSION_ARB, gl_versions[i].minor, |
211 GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_COMPATIBILITY_PR
OFILE_BIT_ARB, | 214 GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_COMPATIBILITY_PR
OFILE_BIT_ARB, |
212 None | 215 None |
213 }; | 216 }; |
214 fContext = | 217 fContext = |
215 glXCreateContextAttribsARB(fDisplay, bestFbc, glxShareCo
ntext, True, | 218 glXCreateContextAttribsARB(fDisplay, bestFbc, glxShareCo
ntext, True, |
216 context_attribs_gl); | 219 context_attribs_gl); |
217 | 220 |
218 // Sync to ensure any errors generated are processed. | 221 // Sync to ensure any errors generated are processed. |
219 XSync(fDisplay, False); | 222 XSync(fDisplay, False); |
220 | 223 |
221 if (!ctxErrorOccurred && fContext) { | 224 if (!ctxErrorOccurred && fContext) { |
222 break; | 225 break; |
223 } | 226 } |
224 // try again | 227 // try again |
225 ctxErrorOccurred = false; | 228 ctxErrorOccurred = false; |
226 } | 229 } |
227 | 230 |
228 // Couldn't create GL 3.0 context. | 231 // Couldn't create GL 3.0 context. |
229 // Fall back to old-style 2.x context. | 232 // Fall back to old-style 2.x context. |
230 // When a context version below 3.0 is requested, | 233 // When a context version below 3.0 is requested, |
231 // implementations will return the newest context version | 234 // implementations will return the newest context version |
232 // compatible with OpenGL versions less than version 3.0. | 235 // compatible with OpenGL versions less than version 3.0. |
233 if (ctxErrorOccurred || !fContext) { | 236 if (ctxErrorOccurred || !fContext) { |
234 static const int context_attribs_gl_fallback[] = { | 237 const int context_attribs_gl_fallback[] = { |
235 GLX_CONTEXT_MAJOR_VERSION_ARB, 1, | 238 GLX_CONTEXT_MAJOR_VERSION_ARB, 1, |
236 GLX_CONTEXT_MINOR_VERSION_ARB, 0, | 239 GLX_CONTEXT_MINOR_VERSION_ARB, 0, |
237 None | 240 None |
238 }; | 241 }; |
239 | 242 |
240 ctxErrorOccurred = false; | 243 ctxErrorOccurred = false; |
241 | 244 |
242 fContext = glXCreateContextAttribsARB(fDisplay, bestFbc, glxShar
eContext, True, | 245 fContext = glXCreateContextAttribsARB(fDisplay, bestFbc, glxShar
eContext, True, |
243 context_attribs_gl_fallbac
k); | 246 context_attribs_gl_fallbac
k); |
244 } | 247 } |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 GLTestContext *shareContext) { | 341 GLTestContext *shareContext) { |
339 GLXGLTestContext *glxShareContext = reinterpret_cast<GLXGLTestContext *>(sha
reContext); | 342 GLXGLTestContext *glxShareContext = reinterpret_cast<GLXGLTestContext *>(sha
reContext); |
340 GLXGLTestContext *ctx = new GLXGLTestContext(forcedGpuAPI, glxShareContext); | 343 GLXGLTestContext *ctx = new GLXGLTestContext(forcedGpuAPI, glxShareContext); |
341 if (!ctx->isValid()) { | 344 if (!ctx->isValid()) { |
342 delete ctx; | 345 delete ctx; |
343 return nullptr; | 346 return nullptr; |
344 } | 347 } |
345 return ctx; | 348 return ctx; |
346 } | 349 } |
347 } // namespace sk_gpu_test | 350 } // namespace sk_gpu_test |
OLD | NEW |