blob: 92626f3a19620e039ffe46863c6a028b6acbc5ad [file] [log] [blame]
José Fonseca43648602011-05-15 12:56:59 +01001##########################################################################
2#
3# Copyright 2011 VMware, Inc.
4# All Rights Reserved.
5#
6# Permission is hereby granted, free of charge, to any person obtaining a copy
7# of this software and associated documentation files (the "Software"), to deal
8# in the Software without restriction, including without limitation the rights
9# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10# copies of the Software, and to permit persons to whom the Software is
11# furnished to do so, subject to the following conditions:
12#
13# The above copyright notice and this permission notice shall be included in
14# all copies or substantial portions of the Software.
15#
16# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22# THE SOFTWARE.
23#
24##########################################################################/
25
26
27"""Cgl tracing generator."""
28
29
30from stdapi import API
31from glapi import glapi
32from cglapi import cglapi
33from gltrace import GlTracer
34
35
36class CglTracer(GlTracer):
37
38 def is_public_function(self, function):
39 # The symbols visible in libGL.dylib can vary, so expose them all
40 return True
41
42
43if __name__ == '__main__':
44 print
45 print '#include <stdlib.h>'
46 print '#include <string.h>'
José Fonseca3bcb33c2011-05-27 20:14:31 +010047 print '#include <unistd.h>'
José Fonseca43648602011-05-15 12:56:59 +010048 print
49 print '#ifndef _GNU_SOURCE'
50 print '#define _GNU_SOURCE // for dladdr'
51 print '#endif'
52 print '#include <dlfcn.h>'
53 print
José Fonseca9ed67222011-05-24 08:42:59 +010054 print '#include "trace_writer.hpp"'
José Fonseca43648602011-05-15 12:56:59 +010055 print
56 print '// To validate our prototypes'
57 print '#define GL_GLEXT_PROTOTYPES'
58 print
59 print '#include "glproc.hpp"'
60 print '#include "glsize.hpp"'
61 print
62
63 api = API()
64 api.add_api(cglapi)
65 api.add_api(glapi)
66 tracer = CglTracer()
67 tracer.trace_api(api)
68
69 print r'''
70
71
72/*
José Fonseca3bcb33c2011-05-27 20:14:31 +010073 * Path to the true OpenGL framework
74 */
75static const char *libgl_filename = "/System/Library/Frameworks/OpenGL.framework/OpenGL";
76
77
78/*
79 * Handle to the true OpenGL framework.
José Fonseca43648602011-05-15 12:56:59 +010080 */
81static void *libgl_handle = NULL;
82
83
84/*
85 * Lookup a libGL symbol
86 */
José Fonsecac7b1c2a2011-06-11 12:26:39 +010087void * __libgl_sym(const char *symbol)
José Fonseca43648602011-05-15 12:56:59 +010088{
89 void *result;
José Fonseca3bcb33c2011-05-27 20:14:31 +010090
José Fonseca43648602011-05-15 12:56:59 +010091 if (!libgl_handle) {
José Fonseca43648602011-05-15 12:56:59 +010092 /*
José Fonseca3bcb33c2011-05-27 20:14:31 +010093 * Unfortunately we can't just dlopen the true dynamic library because
94 * DYLD_LIBRARY_PATH/DYLD_FRAMEWORK_PATH take precedence, even for
95 * absolute paths. So we create a temporary symlink, and dlopen that
96 * instead.
José Fonseca43648602011-05-15 12:56:59 +010097 */
José Fonseca43648602011-05-15 12:56:59 +010098
José Fonseca3bcb33c2011-05-27 20:14:31 +010099 char temp_filename[] = "/tmp/tmp.XXXXXX";
100
101 if (mktemp(temp_filename) != NULL) {
102 if (symlink(libgl_filename, temp_filename) == 0) {
103 libgl_handle = dlopen(temp_filename, RTLD_LOCAL | RTLD_NOW | RTLD_FIRST);
104 remove(temp_filename);
105 }
106 }
107
José Fonseca43648602011-05-15 12:56:59 +0100108 if (!libgl_handle) {
José Fonsecacbd225f2011-06-09 00:07:18 +0100109 OS::DebugMessage("apitrace: error: couldn't load %s\n", libgl_filename);
José Fonseca3bcb33c2011-05-27 20:14:31 +0100110 OS::Abort();
José Fonseca43648602011-05-15 12:56:59 +0100111 return NULL;
112 }
113 }
114
115 result = dlsym(libgl_handle, symbol);
116
117 if (result == dlsym(RTLD_SELF, symbol)) {
José Fonsecacbd225f2011-06-09 00:07:18 +0100118 OS::DebugMessage("apitrace: error: symbol lookup recursion\n");
José Fonseca43648602011-05-15 12:56:59 +0100119 OS::Abort();
120 return NULL;
121 }
122
123 return result;
124}
125
126
127PUBLIC
128void * gll_noop = 0;
129
130'''