406
void *glProxyGetExtProcAddr(const char *extension, const char *name)
408
if (!glProxyHasExtension(extension))
279
void *glProxyGetExtProcAddr(void *display, const char *extension, const char *name) {
280
if (!glProxyHasExtension(display, extension))
411
if (pfnProxyEGLGetProcAddress) {
412
return (*pfnProxyEGLGetProcAddress)(name);
414
else if (pfnProxyGLXGetProcAddress) {
415
return (*pfnProxyGLXGetProcAddress)((const GLubyte *)name);
417
else if (pfnProxyGLXGetProcAddressARB) {
418
return (*pfnProxyGLXGetProcAddressARB)((const GLubyte *)name);
283
if (pfnProxyEglGetProcAddress) {
284
return (*pfnProxyEglGetProcAddress)(name);
285
} else if (pfnProxyGLXGetProcAddress) {
286
return (*pfnProxyGLXGetProcAddress)((const GLubyte *) name);
287
} else if (pfnProxyGLXGetProcAddressARB) {
288
return (*pfnProxyGLXGetProcAddressARB)((const GLubyte *) name);
424
static const char *glProxyGetGLRenderer(Display *dpy)
428
const char *renderer = NULL;
434
XVisualInfo *visinfo = NULL;
436
scrnum = DefaultScreen(dpy);
437
root = RootWindow(dpy, scrnum);
439
visinfo = (*pfnProxyChooseVisual)(dpy, scrnum, attribs);
442
printf("failed to get visual\n");
446
glx_ctx = (*pfnProxyCreateContext)(dpy, visinfo, NULL, True);
448
printf("failed to create GLX context\n");
452
(*pfnProxyMakeCurrent)(dpy, root, glx_ctx);
454
renderer = (const char *)(*pfnProxyGetString)(GL_RENDERER);
456
(*pfnProxyMakeCurrent)(dpy, None, NULL);
458
(*pfnProxyDestroyContext)(dpy, glx_ctx);
465
294
static void glProxyBackendSelection(PROXY_BACKEND_OPTION *pProxyBackend, PROXY_CONTEXT *proxy_context)
467
PROXY_BACKEND_OPTION option = *pProxyBackend;
468
const char *gl_renderer = NULL;
469
const char *gles2_renderer = NULL;
471
if (OPENGL_BACKEND == option) {
472
if ((proxy_context->gl_handle = glProxyOpenLibrary(opengl_libraries[OPENGL_BACKEND]))) {
473
*pProxyBackend = OPENGL_BACKEND;
475
else if ((proxy_context->gles2_handle = glProxyOpenLibrary(opengl_libraries[OPENGL_ES20_BACKEND]))) {
476
*pProxyBackend = OPENGL_ES20_BACKEND;
479
*pProxyBackend = UNKNOWN_BACKEND;
481
} else if (OPENGL_ES20_BACKEND == option) {
482
if ((proxy_context->gles2_handle = glProxyOpenLibrary(opengl_libraries[OPENGL_ES20_BACKEND]))) {
483
*pProxyBackend = OPENGL_ES20_BACKEND;
485
else if ((proxy_context->gl_handle = glProxyOpenLibrary(opengl_libraries[OPENGL_BACKEND]))) {
486
*pProxyBackend = OPENGL_BACKEND;
489
*pProxyBackend = UNKNOWN_BACKEND;
492
/* Select backend automatically */
493
proxy_context->gles2_handle = glProxyOpenLibrary(opengl_libraries[OPENGL_ES20_BACKEND]);
494
proxy_context->egl_handle = glProxyOpenLibrary(LIBEGL_PATH);
495
proxy_context->gl_handle = glProxyOpenLibrary(opengl_libraries[OPENGL_BACKEND]);
498
/* There is a bug for mesa driver to get GL and GLES2 renderer info in one process
499
* https://bugs.freedesktop.org/show_bug.cgi?id=32285
502
Display *dpy = XOpenDisplay(NULL);
505
printf("failed to open display\n");
506
*pProxyBackend = UNKNOWN_BACKEND;
510
proxy_context->x_dpy = dpy;
512
/* Try to get the gles2 renderer info */
513
if (proxy_context->egl_handle && proxy_context->gles2_handle) {
514
/* Resolve EGL APIs for create rendering context to get GL_RENDERER */
515
pfnProxyEGLGetDisplay = dlsym(proxy_context->egl_handle, "eglGetDisplay");
516
pfnProxyEGLInitialize = dlsym(proxy_context->egl_handle, "eglInitialize");
517
pfnProxyEGLChooseConfig = dlsym(proxy_context->egl_handle, "eglChooseConfig");
518
pfnProxyEGLCreateContext = dlsym(proxy_context->egl_handle, "eglCreateContext");
519
pfnProxyEGLCreatePbufferSurface = dlsym(proxy_context->egl_handle, "eglCreatePbufferSurface");
520
pfnProxyEGLMakeCurrent = dlsym(proxy_context->egl_handle, "eglMakeCurrent");
521
pfnProxyEGLDestroyContext = dlsym(proxy_context->egl_handle, "eglDestroyContext");
522
pfnProxyEGLDestroySurface = dlsym(proxy_context->egl_handle, "eglDestroySurface");
523
pfnProxyEGLTerminate = dlsym(proxy_context->egl_handle, "eglTerminate");
525
/* Resolve glGetString */
526
pfnProxyGetString = dlsym(proxy_context->gles2_handle, "glGetString");
528
CreateEGLRenderingContext(dpy, proxy_context);
530
gles2_renderer = (const char *)pfnProxyGetString(GL_RENDERER);
532
/* Reset the function pointers */
533
pfnProxyGetString = NULL;
536
printf("OpenGL ES2.0 Renderer: %s\n", gles2_renderer ? gles2_renderer : "Not Available");
538
/* Try to get the opengl renderer info if available */
539
if (proxy_context->gl_handle) {
540
/* Resolve GLX APIs needed for create rendering context */
541
pfnProxyChooseVisual = dlsym(proxy_context->gl_handle, "glXChooseVisual");
542
pfnProxyCreateContext = dlsym(proxy_context->gl_handle, "glXCreateContext");
543
pfnProxyMakeCurrent = dlsym(proxy_context->gl_handle, "glXMakeCurrent");
544
pfnProxyDestroyContext = dlsym(proxy_context->gl_handle, "glXDestroyContext");
546
/* Resolve glGetString */
547
pfnProxyGetString = dlsym(proxy_context->gl_handle, "glGetString");
549
gl_renderer = glProxyGetGLRenderer(dpy);
551
/* Reset the function pointers */
552
pfnProxyGetString = NULL;
553
pfnProxyChooseVisual = NULL;
554
pfnProxyCreateContext = NULL;
555
pfnProxyMakeCurrent = NULL;
556
pfnProxyDestroyContext = NULL;
559
printf("OpenGL Renderer: %s\n", gl_renderer ? gl_renderer : "Not Available");
561
if (gles2_renderer && gl_renderer) {
562
if (strstr(gl_renderer, "Soft") || strstr(gl_renderer, "soft")) {
563
/* if OpenGL renderer is SW, use GLES2 renderer */
564
*pProxyBackend = OPENGL_ES20_BACKEND;
566
else if (strstr(gles2_renderer, "Soft") || strstr(gles2_renderer, "soft")) {
567
/* if OpenGL renderer is HW, GLES2 renderer is SW, use OpenGL renderer */
568
*pProxyBackend = OPENGL_BACKEND;
571
/* if both renderers are HW, use GLES2 renderer */
572
*pProxyBackend = OPENGL_ES20_BACKEND;
575
else if (gles2_renderer) {
576
*pProxyBackend = OPENGL_ES20_BACKEND;
578
else if (gl_renderer) {
579
*pProxyBackend = OPENGL_BACKEND;
582
*pProxyBackend = UNKNOWN_BACKEND;
585
if (proxy_context->gles2_handle) {
586
/* Use GLES2 by default if available */
587
*pProxyBackend = OPENGL_ES20_BACKEND;
589
else if (proxy_context->gl_handle) {
590
*pProxyBackend = OPENGL_BACKEND;
593
*pProxyBackend = UNKNOWN_BACKEND;
598
if (OPENGL_ES20_BACKEND == *pProxyBackend) {
599
if (proxy_context->gl_handle) {
600
glProxyCloseLibrary(proxy_context->gl_handle);
601
proxy_context->gl_handle = NULL;
604
else if (OPENGL_BACKEND == *pProxyBackend) {
605
if (proxy_context->egl_ctx) {
606
DestroyEGLRenderingContext(proxy_context);
607
pfnProxyEGLGetDisplay = NULL;
608
pfnProxyEGLInitialize = NULL;
609
pfnProxyEGLChooseConfig = NULL;
610
pfnProxyEGLCreateContext = NULL;
611
pfnProxyEGLCreatePbufferSurface = NULL;
612
pfnProxyEGLMakeCurrent = NULL;
613
pfnProxyEGLDestroyContext = NULL;
614
pfnProxyEGLDestroySurface = NULL;
615
pfnProxyEGLTerminate = NULL;
618
if (proxy_context->egl_handle) {
619
glProxyCloseLibrary(proxy_context->egl_handle);
620
proxy_context->egl_handle = NULL;
623
if (proxy_context->gles2_handle) {
624
glProxyCloseLibrary(proxy_context->gles2_handle);
625
proxy_context->gles2_handle = NULL;
630
proxy_context->current_backend = *pProxyBackend;
296
PROXY_BACKEND_OPTION option = *pProxyBackend;
298
if (OPENGL_BACKEND == option) {
299
if ((proxy_context->gl_handle = glProxyOpenLibrary(
300
opengl_libraries[OPENGL_BACKEND]))) {
301
*pProxyBackend = OPENGL_BACKEND;
302
} else if ((proxy_context->gles2_handle = glProxyOpenLibrary(
303
opengl_libraries[OPENGL_ES20_BACKEND]))) {
304
*pProxyBackend = OPENGL_ES20_BACKEND;
306
*pProxyBackend = UNKNOWN_BACKEND;
308
} else if (OPENGL_ES20_BACKEND == option) {
309
if ((proxy_context->gles2_handle = glProxyOpenLibrary(
310
opengl_libraries[OPENGL_ES20_BACKEND]))) {
311
*pProxyBackend = OPENGL_ES20_BACKEND;
312
} else if ((proxy_context->gl_handle = glProxyOpenLibrary(
313
opengl_libraries[OPENGL_BACKEND]))) {
314
*pProxyBackend = OPENGL_BACKEND;
316
*pProxyBackend = UNKNOWN_BACKEND;
319
/* Select backend automatically */
320
proxy_context->gles2_handle = glProxyOpenLibrary(
321
opengl_libraries[OPENGL_ES20_BACKEND]);
322
proxy_context->egl_handle = glProxyOpenLibrary(LIBEGL_PATH);
323
proxy_context->gl_handle = glProxyOpenLibrary(
324
opengl_libraries[OPENGL_BACKEND]);
326
if (proxy_context->gles2_handle) {
327
/* Use GLES2 by default if available */
328
*pProxyBackend = OPENGL_ES20_BACKEND;
329
} else if (proxy_context->gl_handle) {
330
*pProxyBackend = OPENGL_BACKEND;
332
*pProxyBackend = UNKNOWN_BACKEND;
335
if (OPENGL_ES20_BACKEND == *pProxyBackend) {
336
if (proxy_context->gl_handle) {
337
glProxyCloseLibrary(proxy_context->gl_handle);
338
proxy_context->gl_handle = NULL;
340
} else if (OPENGL_BACKEND == *pProxyBackend) {
341
if (proxy_context->egl_handle) {
342
glProxyCloseLibrary(proxy_context->egl_handle);
343
proxy_context->egl_handle = NULL;
346
if (proxy_context->gles2_handle) {
347
glProxyCloseLibrary(proxy_context->gles2_handle);
348
proxy_context->gles2_handle = NULL;
353
proxy_context->current_backend = *pProxyBackend;
633
356
static int glProxyCoreInit(void *handle)
635
358
if (NULL == handle) {
639
pfnProxyActiveTexture = glProxyGetProcAddr(handle, "glActiveTexture");
640
pfnProxyAttachShader = glProxyGetProcAddr(handle, "glAttachShader");
641
pfnProxyBindAttribLocation = glProxyGetProcAddr(handle, "glBindAttribLocation");
642
pfnProxyBindBuffer = glProxyGetProcAddr(handle, "glBindBuffer");
643
pfnProxyBindFramebuffer = glProxyGetProcAddr(handle, "glBindFramebuffer");
644
pfnProxyBindRenderbuffer = glProxyGetProcAddr(handle, "glBindRenderbuffer");
645
pfnProxyBindTexture = glProxyGetProcAddr(handle, "glBindTexture");
646
pfnProxyBlendColor = glProxyGetProcAddr(handle, "glBlendColor");
647
pfnProxyBlendEquation = glProxyGetProcAddr(handle, "glBlendEquation");
648
pfnProxyBlendEquationSeparate = glProxyGetProcAddr(handle, "glBlendEquationSeparate");
649
pfnProxyBlendFunc = glProxyGetProcAddr(handle, "glBlendFunc");
650
pfnProxyBlendFuncSeparate = glProxyGetProcAddr(handle, "glBlendFuncSeparate");
651
pfnProxyBufferData = glProxyGetProcAddr(handle, "glBufferData");
652
pfnProxyBufferSubData = glProxyGetProcAddr(handle, "glBufferSubData");
653
pfnProxyCheckFramebufferStatus = glProxyGetProcAddr(handle, "glCheckFramebufferStatus");
654
pfnProxyClear = glProxyGetProcAddr(handle, "glClear");
655
pfnProxyClearColor = glProxyGetProcAddr(handle, "glClearColor");
656
pfnProxyClearDepthf = glProxyGetProcAddr(handle, "glClearDepthf");
657
pfnProxyClearStencil = glProxyGetProcAddr(handle, "glClearStencil");
658
pfnProxyColorMask = glProxyGetProcAddr(handle, "glColorMask");
659
pfnProxyCompileShader = glProxyGetProcAddr(handle, "glCompileShader");
660
pfnProxyCompressedTexImage2D = glProxyGetProcAddr(handle, "glCompressedTexImage2D");
661
pfnProxyCompressedTexSubImage2D = glProxyGetProcAddr(handle, "glCompressedTexSubImage2D");
662
pfnProxyCopyTexImage2D = glProxyGetProcAddr(handle, "glCopyTexImage2D");
663
pfnProxyCopyTexSubImage2D = glProxyGetProcAddr(handle, "glCopyTexSubImage2D");
664
pfnProxyCreateProgram = glProxyGetProcAddr(handle, "glCreateProgram");
665
pfnProxyCreateShader = glProxyGetProcAddr(handle, "glCreateShader");
666
pfnProxyCullFace = glProxyGetProcAddr(handle, "glCullFace");
667
pfnProxyDeleteBuffers = glProxyGetProcAddr(handle, "glDeleteBuffers");
668
pfnProxyDeleteFramebuffers = glProxyGetProcAddr(handle, "glDeleteFramebuffers");
669
pfnProxyDeleteProgram = glProxyGetProcAddr(handle, "glDeleteProgram");
670
pfnProxyDeleteRenderbuffers = glProxyGetProcAddr(handle, "glDeleteRenderbuffers");
671
pfnProxyDeleteShader = glProxyGetProcAddr(handle, "glDeleteShader");
672
pfnProxyDeleteTextures = glProxyGetProcAddr(handle, "glDeleteTextures");
673
pfnProxyDepthFunc = glProxyGetProcAddr(handle, "glDepthFunc");
674
pfnProxyDepthMask = glProxyGetProcAddr(handle, "glDepthMask");
675
pfnProxyDepthRangef = glProxyGetProcAddr(handle, "glDepthRangef");
676
pfnProxyDetachShader = glProxyGetProcAddr(handle, "glDetachShader");
677
pfnProxyDisable = glProxyGetProcAddr(handle, "glDisable");
678
pfnProxyDisableVertexAttribArray = glProxyGetProcAddr(handle, "glDisableVertexAttribArray");
679
pfnProxyDrawArrays = glProxyGetProcAddr(handle, "glDrawArrays");
680
pfnProxyDrawElements = glProxyGetProcAddr(handle, "glDrawElements");
681
pfnProxyEnable = glProxyGetProcAddr(handle, "glEnable");
682
pfnProxyEnableVertexAttribArray = glProxyGetProcAddr(handle, "glEnableVertexAttribArray");
683
pfnProxyFinish = glProxyGetProcAddr(handle, "glFinish");
684
pfnProxyFlush = glProxyGetProcAddr(handle, "glFlush");
685
pfnProxyFramebufferRenderbuffer = glProxyGetProcAddr(handle, "glFramebufferRenderbuffer");
686
pfnProxyFramebufferTexture2D = glProxyGetProcAddr(handle, "glFramebufferTexture2D");
687
pfnProxyFrontFace = glProxyGetProcAddr(handle, "glFrontFace");
688
pfnProxyGenBuffers = glProxyGetProcAddr(handle, "glGenBuffers");
689
pfnProxyGenerateMipmap = glProxyGetProcAddr(handle, "glGenerateMipmap");
690
pfnProxyGenFramebuffers = glProxyGetProcAddr(handle, "glGenFramebuffers");
691
pfnProxyGenRenderbuffers = glProxyGetProcAddr(handle, "glGenRenderbuffers");
692
pfnProxyGenTextures = glProxyGetProcAddr(handle, "glGenTextures");
693
pfnProxyGetActiveAttrib = glProxyGetProcAddr(handle, "glGetActiveAttrib");
694
pfnProxyGetActiveUniform = glProxyGetProcAddr(handle, "glGetActiveUniform");
695
pfnProxyGetAttachedShaders = glProxyGetProcAddr(handle, "glGetAttachedShaders");
696
pfnProxyGetAttribLocation = glProxyGetProcAddr(handle, "glGetAttribLocation");
697
pfnProxyGetBooleanv = glProxyGetProcAddr(handle, "glGetBooleanv");
698
pfnProxyGetBufferParameteriv = glProxyGetProcAddr(handle, "glGetBufferParameteriv");
699
pfnProxyGetError = glProxyGetProcAddr(handle, "glGetError");
700
pfnProxyGetFloatv = glProxyGetProcAddr(handle, "glGetFloatv");
701
pfnProxyGetFramebufferAttachmentParameteriv = glProxyGetProcAddr(handle, "glGetFramebufferAttachmentParameteriv");
702
pfnProxyGetIntegerv = glProxyGetProcAddr(handle, "glGetIntegerv");
703
pfnProxyGetProgramiv = glProxyGetProcAddr(handle, "glGetProgramiv");
704
pfnProxyGetProgramInfoLog = glProxyGetProcAddr(handle, "glGetProgramInfoLog");
705
pfnProxyGetRenderbufferParameteriv = glProxyGetProcAddr(handle, "glGetRenderbufferParameteriv");
706
pfnProxyGetShaderiv = glProxyGetProcAddr(handle, "glGetShaderiv");
707
pfnProxyGetShaderInfoLog = glProxyGetProcAddr(handle, "glGetShaderInfoLog");
708
pfnProxyGetShaderPrecisionFormat = glProxyGetProcAddr(handle, "glGetShaderPrecisionFormat");
709
pfnProxyGetShaderSource = glProxyGetProcAddr(handle, "glGetShaderSource");
710
pfnProxyGetString = glProxyGetProcAddr(handle, "glGetString");
711
pfnProxyGetTexParameterfv = glProxyGetProcAddr(handle, "glGetTexParameterfv");
712
pfnProxyGetTexParameteriv = glProxyGetProcAddr(handle, "glGetTexParameteriv");
713
pfnProxyGetUniformfv = glProxyGetProcAddr(handle, "glGetUniformfv");
714
pfnProxyGetUniformiv = glProxyGetProcAddr(handle, "glGetUniformiv");
715
pfnProxyGetUniformLocation = glProxyGetProcAddr(handle, "glGetUniformLocation");
716
pfnProxyGetVertexAttribfv = glProxyGetProcAddr(handle, "glGetVertexAttribfv");
717
pfnProxyGetVertexAttribiv = glProxyGetProcAddr(handle, "glGetVertexAttribiv");
718
pfnProxyGetVertexAttribPointerv = glProxyGetProcAddr(handle, "glGetVertexAttribPointerv");
719
pfnProxyHint = glProxyGetProcAddr(handle, "glHint");
720
pfnProxyIsBuffer = glProxyGetProcAddr(handle, "glIsBuffer");
721
pfnProxyIsEnabled = glProxyGetProcAddr(handle, "glIsEnabled");
722
pfnProxyIsFramebuffer = glProxyGetProcAddr(handle, "glIsFramebuffer");
723
pfnProxyIsProgram = glProxyGetProcAddr(handle, "glIsProgram");
724
pfnProxyIsRenderbuffer = glProxyGetProcAddr(handle, "glIsRenderbuffer");
725
pfnProxyIsShader = glProxyGetProcAddr(handle, "glIsShader");
726
pfnProxyIsTexture = glProxyGetProcAddr(handle, "glIsTexture");
727
pfnProxyLineWidth = glProxyGetProcAddr(handle, "glLineWidth");
728
pfnProxyLinkProgram = glProxyGetProcAddr(handle, "glLinkProgram");
729
pfnProxyPixelStorei = glProxyGetProcAddr(handle, "glPixelStorei");
730
pfnProxyPolygonOffset = glProxyGetProcAddr(handle, "glPolygonOffset");
731
pfnProxyReadPixels = glProxyGetProcAddr(handle, "glReadPixels");
732
pfnProxyReleaseShaderCompiler = glProxyGetProcAddr(handle, "glReleaseShaderCompiler");
733
pfnProxyRenderbufferStorage = glProxyGetProcAddr(handle, "glRenderbufferStorage");
734
pfnProxySampleCoverage = glProxyGetProcAddr(handle, "glSampleCoverage");
735
pfnProxyScissor = glProxyGetProcAddr(handle, "glScissor");
736
pfnProxyShaderBinary = glProxyGetProcAddr(handle, "glShaderBinary");
737
pfnProxyShaderSource = glProxyGetProcAddr(handle, "glShaderSource");
738
pfnProxyStencilFunc = glProxyGetProcAddr(handle, "glStencilFunc");
739
pfnProxyStencilFuncSeparate = glProxyGetProcAddr(handle, "glStencilFuncSeparate");
740
pfnProxyStencilMask = glProxyGetProcAddr(handle, "glStencilMask");
741
pfnProxyStencilMaskSeparate = glProxyGetProcAddr(handle, "glStencilMaskSeparate");
742
pfnProxyStencilOp = glProxyGetProcAddr(handle, "glStencilOp");
743
pfnProxyStencilOpSeparate = glProxyGetProcAddr(handle, "glStencilOpSeparate");
744
pfnProxyTexImage2D = glProxyGetProcAddr(handle, "glTexImage2D");
745
pfnProxyTexParameterf = glProxyGetProcAddr(handle, "glTexParameterf");
746
pfnProxyTexParameterfv = glProxyGetProcAddr(handle, "glTexParameterfv");
747
pfnProxyTexParameteri = glProxyGetProcAddr(handle, "glTexParameteri");
748
pfnProxyTexParameteriv = glProxyGetProcAddr(handle, "glTexParameteriv");
749
pfnProxyTexSubImage2D = glProxyGetProcAddr(handle, "glTexSubImage2D");
750
pfnProxyUniform1f = glProxyGetProcAddr(handle, "glUniform1f");
751
pfnProxyUniform1fv = glProxyGetProcAddr(handle, "glUniform1fv");
752
pfnProxyUniform1i = glProxyGetProcAddr(handle, "glUniform1i");
753
pfnProxyUniform1iv = glProxyGetProcAddr(handle, "glUniform1iv");
754
pfnProxyUniform2f = glProxyGetProcAddr(handle, "glUniform2f");
755
pfnProxyUniform2fv = glProxyGetProcAddr(handle, "glUniform2fv");
756
pfnProxyUniform2i = glProxyGetProcAddr(handle, "glUniform2i");
757
pfnProxyUniform2iv = glProxyGetProcAddr(handle, "glUniform2iv");
758
pfnProxyUniform3f = glProxyGetProcAddr(handle, "glUniform3f");
759
pfnProxyUniform3fv = glProxyGetProcAddr(handle, "glUniform3fv");
760
pfnProxyUniform3i = glProxyGetProcAddr(handle, "glUniform3i");
761
pfnProxyUniform3iv = glProxyGetProcAddr(handle, "glUniform3iv");
762
pfnProxyUniform4f = glProxyGetProcAddr(handle, "glUniform4f");
763
pfnProxyUniform4fv = glProxyGetProcAddr(handle, "glUniform4fv");
764
pfnProxyUniform4i = glProxyGetProcAddr(handle, "glUniform4i");
765
pfnProxyUniform4iv = glProxyGetProcAddr(handle, "glUniform4iv");
766
pfnProxyUniformMatrix2fv = glProxyGetProcAddr(handle, "glUniformMatrix2fv");
767
pfnProxyUniformMatrix3fv = glProxyGetProcAddr(handle, "glUniformMatrix3fv");
768
pfnProxyUniformMatrix4fv = glProxyGetProcAddr(handle, "glUniformMatrix4fv");
769
pfnProxyUseProgram = glProxyGetProcAddr(handle, "glUseProgram");
770
pfnProxyValidateProgram = glProxyGetProcAddr(handle, "glValidateProgram");
771
pfnProxyVertexAttrib1f = glProxyGetProcAddr(handle, "glVertexAttrib1f");
772
pfnProxyVertexAttrib1fv = glProxyGetProcAddr(handle, "glVertexAttrib1fv");
773
pfnProxyVertexAttrib2f = glProxyGetProcAddr(handle, "glVertexAttrib2f");
774
pfnProxyVertexAttrib2fv = glProxyGetProcAddr(handle, "glVertexAttrib2fv");
775
pfnProxyVertexAttrib3f = glProxyGetProcAddr(handle, "glVertexAttrib3f");
776
pfnProxyVertexAttrib3fv = glProxyGetProcAddr(handle, "glVertexAttrib3fv");
777
pfnProxyVertexAttrib4f = glProxyGetProcAddr(handle, "glVertexAttrib4f");
778
pfnProxyVertexAttrib4fv = glProxyGetProcAddr(handle, "glVertexAttrib4fv");
779
pfnProxyVertexAttribPointer = glProxyGetProcAddr(handle, "glVertexAttribPointer");
780
pfnProxyViewport = glProxyGetProcAddr(handle, "glViewport");
362
pfnProxyActiveTexture = glProxyGetProcAddr(handle, "glActiveTexture");
363
pfnProxyAttachShader = glProxyGetProcAddr(handle, "glAttachShader");
364
pfnProxyBindAttribLocation = glProxyGetProcAddr(handle,
365
"glBindAttribLocation");
366
pfnProxyBindBuffer = glProxyGetProcAddr(handle, "glBindBuffer");
367
pfnProxyBindFramebuffer = glProxyGetProcAddr(handle, "glBindFramebuffer");
368
pfnProxyBindRenderbuffer = glProxyGetProcAddr(handle, "glBindRenderbuffer");
369
pfnProxyBindTexture = glProxyGetProcAddr(handle, "glBindTexture");
370
pfnProxyBlendColor = glProxyGetProcAddr(handle, "glBlendColor");
371
pfnProxyBlendEquation = glProxyGetProcAddr(handle, "glBlendEquation");
372
pfnProxyBlendEquationSeparate = glProxyGetProcAddr(handle,
373
"glBlendEquationSeparate");
374
pfnProxyBlendFunc = glProxyGetProcAddr(handle, "glBlendFunc");
375
pfnProxyBlendFuncSeparate = glProxyGetProcAddr(handle,
376
"glBlendFuncSeparate");
377
pfnProxyBufferData = glProxyGetProcAddr(handle, "glBufferData");
378
pfnProxyBufferSubData = glProxyGetProcAddr(handle, "glBufferSubData");
379
pfnProxyCheckFramebufferStatus = glProxyGetProcAddr(handle,
380
"glCheckFramebufferStatus");
381
pfnProxyClear = glProxyGetProcAddr(handle, "glClear");
382
pfnProxyClearColor = glProxyGetProcAddr(handle, "glClearColor");
383
pfnProxyClearDepthf = glProxyGetProcAddr(handle, "glClearDepthf");
384
pfnProxyClearStencil = glProxyGetProcAddr(handle, "glClearStencil");
385
pfnProxyColorMask = glProxyGetProcAddr(handle, "glColorMask");
386
pfnProxyCompileShader = glProxyGetProcAddr(handle, "glCompileShader");
387
pfnProxyCompressedTexImage2D = glProxyGetProcAddr(handle,
388
"glCompressedTexImage2D");
389
pfnProxyCompressedTexSubImage2D = glProxyGetProcAddr(handle,
390
"glCompressedTexSubImage2D");
391
pfnProxyCopyTexImage2D = glProxyGetProcAddr(handle, "glCopyTexImage2D");
392
pfnProxyCopyTexSubImage2D = glProxyGetProcAddr(handle,
393
"glCopyTexSubImage2D");
394
pfnProxyCreateProgram = glProxyGetProcAddr(handle, "glCreateProgram");
395
pfnProxyCreateShader = glProxyGetProcAddr(handle, "glCreateShader");
396
pfnProxyCullFace = glProxyGetProcAddr(handle, "glCullFace");
397
pfnProxyDeleteBuffers = glProxyGetProcAddr(handle, "glDeleteBuffers");
398
pfnProxyDeleteFramebuffers = glProxyGetProcAddr(handle,
399
"glDeleteFramebuffers");
400
pfnProxyDeleteProgram = glProxyGetProcAddr(handle, "glDeleteProgram");
401
pfnProxyDeleteRenderbuffers = glProxyGetProcAddr(handle,
402
"glDeleteRenderbuffers");
403
pfnProxyDeleteShader = glProxyGetProcAddr(handle, "glDeleteShader");
404
pfnProxyDeleteTextures = glProxyGetProcAddr(handle, "glDeleteTextures");
405
pfnProxyDepthFunc = glProxyGetProcAddr(handle, "glDepthFunc");
406
pfnProxyDepthMask = glProxyGetProcAddr(handle, "glDepthMask");
407
pfnProxyDepthRangef = glProxyGetProcAddr(handle, "glDepthRangef");
408
pfnProxyDetachShader = glProxyGetProcAddr(handle, "glDetachShader");
409
pfnProxyDisable = glProxyGetProcAddr(handle, "glDisable");
410
pfnProxyDisableVertexAttribArray = glProxyGetProcAddr(handle,
411
"glDisableVertexAttribArray");
412
pfnProxyDrawArrays = glProxyGetProcAddr(handle, "glDrawArrays");
413
pfnProxyDrawElements = glProxyGetProcAddr(handle, "glDrawElements");
414
pfnProxyEnable = glProxyGetProcAddr(handle, "glEnable");
415
pfnProxyEnableVertexAttribArray = glProxyGetProcAddr(handle,
416
"glEnableVertexAttribArray");
417
pfnProxyFinish = glProxyGetProcAddr(handle, "glFinish");
418
pfnProxyFlush = glProxyGetProcAddr(handle, "glFlush");
419
pfnProxyFramebufferRenderbuffer = glProxyGetProcAddr(handle,
420
"glFramebufferRenderbuffer");
421
pfnProxyFramebufferTexture2D = glProxyGetProcAddr(handle,
422
"glFramebufferTexture2D");
423
pfnProxyFrontFace = glProxyGetProcAddr(handle, "glFrontFace");
424
pfnProxyGenBuffers = glProxyGetProcAddr(handle, "glGenBuffers");
425
pfnProxyGenerateMipmap = glProxyGetProcAddr(handle, "glGenerateMipmap");
426
pfnProxyGenFramebuffers = glProxyGetProcAddr(handle, "glGenFramebuffers");
427
pfnProxyGenRenderbuffers = glProxyGetProcAddr(handle, "glGenRenderbuffers");
428
pfnProxyGenTextures = glProxyGetProcAddr(handle, "glGenTextures");
429
pfnProxyGetActiveAttrib = glProxyGetProcAddr(handle, "glGetActiveAttrib");
430
pfnProxyGetActiveUniform = glProxyGetProcAddr(handle, "glGetActiveUniform");
431
pfnProxyGetAttachedShaders = glProxyGetProcAddr(handle,
432
"glGetAttachedShaders");
433
pfnProxyGetAttribLocation = glProxyGetProcAddr(handle,
434
"glGetAttribLocation");
435
pfnProxyGetBooleanv = glProxyGetProcAddr(handle, "glGetBooleanv");
436
pfnProxyGetBufferParameteriv = glProxyGetProcAddr(handle,
437
"glGetBufferParameteriv");
438
pfnProxyGetError = glProxyGetProcAddr(handle, "glGetError");
439
pfnProxyGetFloatv = glProxyGetProcAddr(handle, "glGetFloatv");
440
pfnProxyGetFramebufferAttachmentParameteriv = glProxyGetProcAddr(handle,
441
"glGetFramebufferAttachmentParameteriv");
442
pfnProxyGetIntegerv = glProxyGetProcAddr(handle, "glGetIntegerv");
443
pfnProxyGetProgramiv = glProxyGetProcAddr(handle, "glGetProgramiv");
444
pfnProxyGetProgramInfoLog = glProxyGetProcAddr(handle,
445
"glGetProgramInfoLog");
446
pfnProxyGetRenderbufferParameteriv = glProxyGetProcAddr(handle,
447
"glGetRenderbufferParameteriv");
448
pfnProxyGetShaderiv = glProxyGetProcAddr(handle, "glGetShaderiv");
449
pfnProxyGetShaderInfoLog = glProxyGetProcAddr(handle, "glGetShaderInfoLog");
450
pfnProxyGetShaderPrecisionFormat = glProxyGetProcAddr(handle,
451
"glGetShaderPrecisionFormat");
452
pfnProxyGetShaderSource = glProxyGetProcAddr(handle, "glGetShaderSource");
453
pfnProxyGetString = glProxyGetProcAddr(handle, "glGetString");
454
pfnProxyGetTexParameterfv = glProxyGetProcAddr(handle,
455
"glGetTexParameterfv");
456
pfnProxyGetTexParameteriv = glProxyGetProcAddr(handle,
457
"glGetTexParameteriv");
458
pfnProxyGetUniformfv = glProxyGetProcAddr(handle, "glGetUniformfv");
459
pfnProxyGetUniformiv = glProxyGetProcAddr(handle, "glGetUniformiv");
460
pfnProxyGetUniformLocation = glProxyGetProcAddr(handle,
461
"glGetUniformLocation");
462
pfnProxyGetVertexAttribfv = glProxyGetProcAddr(handle,
463
"glGetVertexAttribfv");
464
pfnProxyGetVertexAttribiv = glProxyGetProcAddr(handle,
465
"glGetVertexAttribiv");
466
pfnProxyGetVertexAttribPointerv = glProxyGetProcAddr(handle,
467
"glGetVertexAttribPointerv");
468
pfnProxyHint = glProxyGetProcAddr(handle, "glHint");
469
pfnProxyIsBuffer = glProxyGetProcAddr(handle, "glIsBuffer");
470
pfnProxyIsEnabled = glProxyGetProcAddr(handle, "glIsEnabled");
471
pfnProxyIsFramebuffer = glProxyGetProcAddr(handle, "glIsFramebuffer");
472
pfnProxyIsProgram = glProxyGetProcAddr(handle, "glIsProgram");
473
pfnProxyIsRenderbuffer = glProxyGetProcAddr(handle, "glIsRenderbuffer");
474
pfnProxyIsShader = glProxyGetProcAddr(handle, "glIsShader");
475
pfnProxyIsTexture = glProxyGetProcAddr(handle, "glIsTexture");
476
pfnProxyLineWidth = glProxyGetProcAddr(handle, "glLineWidth");
477
pfnProxyLinkProgram = glProxyGetProcAddr(handle, "glLinkProgram");
478
pfnProxyPixelStorei = glProxyGetProcAddr(handle, "glPixelStorei");
479
pfnProxyPolygonOffset = glProxyGetProcAddr(handle, "glPolygonOffset");
480
pfnProxyReadPixels = glProxyGetProcAddr(handle, "glReadPixels");
481
pfnProxyReleaseShaderCompiler = glProxyGetProcAddr(handle,
482
"glReleaseShaderCompiler");
483
pfnProxyRenderbufferStorage = glProxyGetProcAddr(handle,
484
"glRenderbufferStorage");
485
pfnProxySampleCoverage = glProxyGetProcAddr(handle, "glSampleCoverage");
486
pfnProxyScissor = glProxyGetProcAddr(handle, "glScissor");
487
pfnProxyShaderBinary = glProxyGetProcAddr(handle, "glShaderBinary");
488
pfnProxyShaderSource = glProxyGetProcAddr(handle, "glShaderSource");
489
pfnProxyStencilFunc = glProxyGetProcAddr(handle, "glStencilFunc");
490
pfnProxyStencilFuncSeparate = glProxyGetProcAddr(handle,
491
"glStencilFuncSeparate");
492
pfnProxyStencilMask = glProxyGetProcAddr(handle, "glStencilMask");
493
pfnProxyStencilMaskSeparate = glProxyGetProcAddr(handle,
494
"glStencilMaskSeparate");
495
pfnProxyStencilOp = glProxyGetProcAddr(handle, "glStencilOp");
496
pfnProxyStencilOpSeparate = glProxyGetProcAddr(handle,
497
"glStencilOpSeparate");
498
pfnProxyTexImage2D = glProxyGetProcAddr(handle, "glTexImage2D");
499
pfnProxyTexParameterf = glProxyGetProcAddr(handle, "glTexParameterf");
500
pfnProxyTexParameterfv = glProxyGetProcAddr(handle, "glTexParameterfv");
501
pfnProxyTexParameteri = glProxyGetProcAddr(handle, "glTexParameteri");
502
pfnProxyTexParameteriv = glProxyGetProcAddr(handle, "glTexParameteriv");
503
pfnProxyTexSubImage2D = glProxyGetProcAddr(handle, "glTexSubImage2D");
504
pfnProxyUniform1f = glProxyGetProcAddr(handle, "glUniform1f");
505
pfnProxyUniform1fv = glProxyGetProcAddr(handle, "glUniform1fv");
506
pfnProxyUniform1i = glProxyGetProcAddr(handle, "glUniform1i");
507
pfnProxyUniform1iv = glProxyGetProcAddr(handle, "glUniform1iv");
508
pfnProxyUniform2f = glProxyGetProcAddr(handle, "glUniform2f");
509
pfnProxyUniform2fv = glProxyGetProcAddr(handle, "glUniform2fv");
510
pfnProxyUniform2i = glProxyGetProcAddr(handle, "glUniform2i");
511
pfnProxyUniform2iv = glProxyGetProcAddr(handle, "glUniform2iv");
512
pfnProxyUniform3f = glProxyGetProcAddr(handle, "glUniform3f");
513
pfnProxyUniform3fv = glProxyGetProcAddr(handle, "glUniform3fv");
514
pfnProxyUniform3i = glProxyGetProcAddr(handle, "glUniform3i");
515
pfnProxyUniform3iv = glProxyGetProcAddr(handle, "glUniform3iv");
516
pfnProxyUniform4f = glProxyGetProcAddr(handle, "glUniform4f");
517
pfnProxyUniform4fv = glProxyGetProcAddr(handle, "glUniform4fv");
518
pfnProxyUniform4i = glProxyGetProcAddr(handle, "glUniform4i");
519
pfnProxyUniform4iv = glProxyGetProcAddr(handle, "glUniform4iv");
520
pfnProxyUniformMatrix2fv = glProxyGetProcAddr(handle, "glUniformMatrix2fv");
521
pfnProxyUniformMatrix3fv = glProxyGetProcAddr(handle, "glUniformMatrix3fv");
522
pfnProxyUniformMatrix4fv = glProxyGetProcAddr(handle, "glUniformMatrix4fv");
523
pfnProxyUseProgram = glProxyGetProcAddr(handle, "glUseProgram");
524
pfnProxyValidateProgram = glProxyGetProcAddr(handle, "glValidateProgram");
525
pfnProxyVertexAttrib1f = glProxyGetProcAddr(handle, "glVertexAttrib1f");
526
pfnProxyVertexAttrib1fv = glProxyGetProcAddr(handle, "glVertexAttrib1fv");
527
pfnProxyVertexAttrib2f = glProxyGetProcAddr(handle, "glVertexAttrib2f");
528
pfnProxyVertexAttrib2fv = glProxyGetProcAddr(handle, "glVertexAttrib2fv");
529
pfnProxyVertexAttrib3f = glProxyGetProcAddr(handle, "glVertexAttrib3f");
530
pfnProxyVertexAttrib3fv = glProxyGetProcAddr(handle, "glVertexAttrib3fv");
531
pfnProxyVertexAttrib4f = glProxyGetProcAddr(handle, "glVertexAttrib4f");
532
pfnProxyVertexAttrib4fv = glProxyGetProcAddr(handle, "glVertexAttrib4fv");
533
pfnProxyVertexAttribPointer = glProxyGetProcAddr(handle,
534
"glVertexAttribPointer");
535
pfnProxyViewport = glProxyGetProcAddr(handle, "glViewport");
785
540
extern int glxProxyInit(void *handle);
541
extern int eglProxyInit(void *handle);
787
543
int glProxyInit(PROXY_BACKEND_OPTION *pProxyBackend)
789
545
global_proxy_context.current_backend = UNKNOWN_BACKEND;
790
global_proxy_context.x_dpy = NULL;
792
/* Select backend first */
793
glProxyBackendSelection(pProxyBackend, &global_proxy_context);
795
if (UNKNOWN_BACKEND == global_proxy_context.current_backend) {
796
printf("Error: No OpenGL or OpenGL ES2.0 renderer available\n");
800
printf("%s backend is selected for rendering\n", (global_proxy_context.current_backend == OPENGL_BACKEND) ? "OpenGL" : "OpenGL ES2.0");
802
/* Load selected backend, and resolve glXGetProcAddress/eglGetProcAddress */
803
if (glProxyEarlyResolve(&global_proxy_context) < 0)
806
/* Resolve symbols */
807
if (OPENGL_BACKEND == global_proxy_context.current_backend) {
808
glProxyCoreInit(global_proxy_context.gl_handle);
809
glxProxyInit(global_proxy_context.gl_handle);
811
else if (OPENGL_ES20_BACKEND == global_proxy_context.current_backend) {
812
glProxyCoreInit(global_proxy_context.gles2_handle);
815
/* should not get here */
547
/* Select backend first */
548
glProxyBackendSelection(pProxyBackend, &global_proxy_context);
550
if (UNKNOWN_BACKEND == global_proxy_context.current_backend) {
551
printf("Error: No OpenGL or OpenGL ES2.0 renderer available\n");
555
printf("%s backend is selected for rendering\n",
556
(global_proxy_context.current_backend == OPENGL_BACKEND) ? "OpenGL"
559
/* Load selected backend, and resolve glXGetProcAddress/eglGetProcAddress */
560
if (glProxyEarlyResolve(&global_proxy_context) < 0)
563
/* Resolve symbols */
564
if (OPENGL_BACKEND == global_proxy_context.current_backend) {
565
glProxyCoreInit(global_proxy_context.gl_handle);
566
glxProxyInit(global_proxy_context.gl_handle);
567
} else if (OPENGL_ES20_BACKEND == global_proxy_context.current_backend) {
568
glProxyCoreInit(global_proxy_context.gles2_handle);
569
eglProxyInit(global_proxy_context.egl_handle);
571
/* should not get here */
822
578
int glProxyClose(void)
824
if (OPENGL_ES20_BACKEND == global_proxy_context.current_backend)
825
DestroyEGLRenderingContext(&global_proxy_context);
827
if (global_proxy_context.x_dpy) {
828
XCloseDisplay(global_proxy_context.x_dpy);
829
global_proxy_context.x_dpy = NULL;
832
if (global_proxy_context.gl_handle) {
833
glProxyCloseLibrary(global_proxy_context.gl_handle);
834
global_proxy_context.gl_handle = NULL;
837
if (global_proxy_context.gles2_handle) {
838
glProxyCloseLibrary(global_proxy_context.gles2_handle);
839
global_proxy_context.gles2_handle = NULL;
842
if (global_proxy_context.egl_handle) {
843
glProxyCloseLibrary(global_proxy_context.egl_handle);
844
global_proxy_context.egl_handle = NULL;
847
global_proxy_context.current_backend = UNKNOWN_BACKEND;
580
if (global_proxy_context.gl_handle) {
581
glProxyCloseLibrary(global_proxy_context.gl_handle);
582
global_proxy_context.gl_handle = NULL;
585
if (global_proxy_context.gles2_handle) {
586
glProxyCloseLibrary(global_proxy_context.gles2_handle);
587
global_proxy_context.gles2_handle = NULL;
590
if (global_proxy_context.egl_handle) {
591
glProxyCloseLibrary(global_proxy_context.egl_handle);
592
global_proxy_context.egl_handle = NULL;
595
global_proxy_context.current_backend = UNKNOWN_BACKEND;