1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Copyright (c) 2008 Apple Inc.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Permission is hereby granted, free of charge, to any person
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org obtaining a copy of this software and associated documentation files
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (the "Software"), to deal in the Software without restriction,
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org including without limitation the rights to use, copy, modify, merge,
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org publish, distribute, sublicense, and/or sell copies of the Software,
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org and to permit persons to whom the Software is furnished to do so,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org subject to the following conditions:
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org The above copyright notice and this permission notice shall be
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org included in all copies or substantial portions of the Software.
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NONINFRINGEMENT.  IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DEALINGS IN THE SOFTWARE.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Except as contained in this notice, the name(s) of the above
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org copyright holders shall not be used in advertising or otherwise to
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org promote the sale, use or other dealings in this Software without
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prior written authorization.
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdbool.h>
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdio.h>
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdlib.h>
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <dlfcn.h>
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "apple_cgl.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "apple_glx.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef OPENGL_FRAMEWORK_PATH
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define OPENGL_FRAMEWORK_PATH "/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *dl_handle = NULL;
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct apple_cgl_api apple_cgl;
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool initialized = false;
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsym(void *h, const char *name)
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *s;
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   s = dlsym(h, name);
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (NULL == s) {
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "error: %s\n", dlerror());
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      abort();
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return s;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgapple_cgl_init(void)
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *h;
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *opengl_framework_path;
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (initialized)
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   opengl_framework_path = getenv("OPENGL_FRAMEWORK_PATH");
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!opengl_framework_path) {
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      opengl_framework_path = OPENGL_FRAMEWORK_PATH;
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dlerror();            /*drain dlerror */
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   h = dlopen(opengl_framework_path, RTLD_NOW);
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (NULL == h) {
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "error: unable to dlopen %s : %s\n",
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              opengl_framework_path, dlerror());
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      abort();
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dl_handle = h;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   apple_cgl.get_version = sym(h, "CGLGetVersion");
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   apple_cgl.get_version(&apple_cgl.version_major, &apple_cgl.version_minor);
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   apple_glx_diagnostic("CGL major %d minor %d\n", apple_cgl.version_major, apple_cgl.version_minor);
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (1 != apple_cgl.version_major) {
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "WARNING: the CGL major version has changed!\n"
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              "libGL may be incompatible!\n");
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   apple_cgl.choose_pixel_format = sym(h, "CGLChoosePixelFormat");
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   apple_cgl.destroy_pixel_format = sym(h, "CGLDestroyPixelFormat");
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   apple_cgl.clear_drawable = sym(h, "CGLClearDrawable");
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   apple_cgl.flush_drawable = sym(h, "CGLFlushDrawable");
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   apple_cgl.create_context = sym(h, "CGLCreateContext");
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   apple_cgl.destroy_context = sym(h, "CGLDestroyContext");
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   apple_cgl.set_current_context = sym(h, "CGLSetCurrentContext");
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   apple_cgl.get_current_context = sym(h, "CGLGetCurrentContext");
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   apple_cgl.error_string = sym(h, "CGLErrorString");
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   apple_cgl.set_off_screen = sym(h, "CGLSetOffScreen");
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   apple_cgl.copy_context = sym(h, "CGLCopyContext");
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   apple_cgl.create_pbuffer = sym(h, "CGLCreatePBuffer");
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   apple_cgl.destroy_pbuffer = sym(h, "CGLDestroyPBuffer");
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   apple_cgl.set_pbuffer = sym(h, "CGLSetPBuffer");
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   initialized = true;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid *
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgapple_cgl_get_dl_handle(void)
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return dl_handle;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
128