]> git.cworth.org Git - apitrace/blob - wrappers/egltrace.py
Trivial formatting / consistency fixes.
[apitrace] / wrappers / egltrace.py
1 ##########################################################################
2 #
3 # Copyright 2011 LunarG, Inc.
4 # All Rights Reserved.
5 #
6 # Based on glxtrace.py, which has
7 #
8 #   Copyright 2011 Jose Fonseca
9 #   Copyright 2008-2010 VMware, Inc.
10 #
11 # Permission is hereby granted, free of charge, to any person obtaining a copy
12 # of this software and associated documentation files (the "Software"), to deal
13 # in the Software without restriction, including without limitation the rights
14 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 # copies of the Software, and to permit persons to whom the Software is
16 # furnished to do so, subject to the following conditions:
17 #
18 # The above copyright notice and this permission notice shall be included in
19 # all copies or substantial portions of the Software.
20 #
21 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27 # THE SOFTWARE.
28 #
29 ##########################################################################/
30
31
32 """EGL tracing generator."""
33
34
35 from gltrace import GlTracer
36 from specs.stdapi import Module, API
37 from specs.glapi import glapi
38 from specs.eglapi import eglapi
39 from specs.glesapi import glesapi
40
41
42 class EglTracer(GlTracer):
43
44     def isFunctionPublic(self, function):
45         # The symbols visible in libEGL.so can vary, so expose them all
46         return True
47
48     getProcAddressFunctionNames = [
49         "eglGetProcAddress",
50     ]
51
52     def traceFunctionImplBody(self, function):
53         GlTracer.traceFunctionImplBody(self, function)
54
55         if function.name == 'eglCreateContext':
56             print '    if (_result != EGL_NO_CONTEXT)'
57             print '        gltrace::createContext((uintptr_t)_result);'
58
59         if function.name == 'eglMakeCurrent':
60             print '    if (_result) {'
61             print '        // update the profile'
62             print '        if (ctx != EGL_NO_CONTEXT) {'
63             print '            EGLint api = EGL_OPENGL_ES_API, version = 1;'
64             print '            gltrace::setContext((uintptr_t)ctx);'
65             print '            gltrace::Context *tr = gltrace::getContext();'
66             print '            _eglQueryContext(dpy, ctx, EGL_CONTEXT_CLIENT_TYPE, &api);'
67             print '            _eglQueryContext(dpy, ctx, EGL_CONTEXT_CLIENT_VERSION, &version);'
68             print '            if (api == EGL_OPENGL_API)'
69             print '                tr->profile = gltrace::PROFILE_COMPAT;'
70             print '            else if (version == 1)'
71             print '                tr->profile = gltrace::PROFILE_ES1;'
72             print '            else'
73             print '                tr->profile = gltrace::PROFILE_ES2;'
74             print '        } else {'
75             print '            gltrace::clearContext();'
76             print '        }'
77             print '    }'
78
79         if function.name == 'eglDestroyContext':
80             print '    if (_result) {'
81             print '        gltrace::releaseContext((uintptr_t)ctx);'
82             print '    }'
83
84         if function.name == 'glEGLImageTargetTexture2DOES':
85             print '    image_info *info = _EGLImageKHR_get_image_info(target, image);'
86             print '    if (info) {'
87             print '        GLint level = 0;'
88             print '        GLint internalformat = info->internalformat;'
89             print '        GLsizei width = info->width;'
90             print '        GLsizei height = info->height;'
91             print '        GLint border = 0;'
92             print '        GLenum format = info->format;'
93             print '        GLenum type = info->type;'
94             print '        const GLvoid * pixels = info->pixels;'
95             self.emitFakeTexture2D()
96             print '        _EGLImageKHR_free_image_info(info);'
97             print '    }'
98
99
100 if __name__ == '__main__':
101     print '#include <stdlib.h>'
102     print '#include <string.h>'
103     print
104     print '#include "trace_writer_local.hpp"'
105     print
106     print '// To validate our prototypes'
107     print '#define GL_GLEXT_PROTOTYPES'
108     print '#define EGL_EGLEXT_PROTOTYPES'
109     print
110     print '#include "dlopen.hpp"'
111     print '#include "glproc.hpp"'
112     print '#include "glsize.hpp"'
113     print '#include "eglsize.hpp"'
114     print
115     
116     module = Module()
117     module.mergeModule(eglapi)
118     module.mergeModule(glapi)
119     module.mergeModule(glesapi)
120     api = API()
121     api.addModule(module)
122     tracer = EglTracer()
123     tracer.traceApi(api)
124
125     print r'''
126
127
128
129 /*
130  * Several applications, such as Quake3, use dlopen("libGL.so.1"), but
131  * LD_PRELOAD does not intercept symbols obtained via dlopen/dlsym, therefore
132  * we need to intercept the dlopen() call here, and redirect to our wrapper
133  * shared object.
134  */
135 extern "C" PUBLIC
136 void * dlopen(const char *filename, int flag)
137 {
138     bool intercept = false;
139
140     if (filename && trace::isTracingEnabled()) {
141         intercept =
142             strcmp(filename, "libEGL.so") == 0 ||
143             strcmp(filename, "libEGL.so.1") == 0 ||
144             strcmp(filename, "libGLESv1_CM.so") == 0 ||
145             strcmp(filename, "libGLESv1_CM.so.1") == 0 ||
146             strcmp(filename, "libGLESv2.so") == 0 ||
147             strcmp(filename, "libGLESv2.so.2") == 0 ||
148             strcmp(filename, "libGL.so") == 0 ||
149             strcmp(filename, "libGL.so.1") == 0;
150
151         if (intercept) {
152             os::log("apitrace: redirecting dlopen(\"%s\", 0x%x)\n", filename, flag);
153
154             /* The current dispatch implementation relies on core entry-points to be globally available, so force this.
155              *
156              * TODO: A better approach would be note down the entry points here and
157              * use them latter. Another alternative would be to reopen the library
158              * with RTLD_NOLOAD | RTLD_GLOBAL.
159              */
160             flag &= ~RTLD_LOCAL;
161             flag |= RTLD_GLOBAL;
162         }
163     }
164
165     void *handle = _dlopen(filename, flag);
166
167     if (intercept) {
168         // Get the file path for our shared object, and use it instead
169         static int dummy = 0xdeedbeef;
170         Dl_info info;
171         if (dladdr(&dummy, &info)) {
172             handle = _dlopen(info.dli_fname, flag);
173         } else {
174             os::log("apitrace: warning: dladdr() failed\n");
175         }
176     }
177
178     return handle;
179 }
180
181
182 #if defined(ANDROID)
183
184 /*
185  * Undocumented Android extensions used by Dalvik which have bound information
186  * passed to it, but is currently ignored, so probably unreliable.
187  *
188  * See:
189  * https://github.com/android/platform_frameworks_base/blob/master/opengl/libs/GLES_CM/gl.cpp
190  */
191
192 extern "C" PUBLIC
193 void APIENTRY glColorPointerBounds(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer, GLsizei count) {
194     (void)count;
195     glColorPointer(size, type, stride, pointer);
196 }
197
198 extern "C" PUBLIC
199 void APIENTRY glNormalPointerBounds(GLenum type, GLsizei stride, const GLvoid * pointer, GLsizei count) {
200     (void)count;
201     glNormalPointer(type, stride, pointer);
202 }
203
204 extern "C" PUBLIC
205 void APIENTRY glTexCoordPointerBounds(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer, GLsizei count) {
206     (void)count;
207     glTexCoordPointer(size, type, stride, pointer);
208 }
209
210 extern "C" PUBLIC
211 void APIENTRY glVertexPointerBounds(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer, GLsizei count) {
212     (void)count;
213     glVertexPointer(size, type, stride, pointer);
214 }
215
216 extern "C" PUBLIC
217 void GL_APIENTRY glPointSizePointerOESBounds(GLenum type, GLsizei stride, const GLvoid *pointer, GLsizei count) {
218     (void)count;
219     glPointSizePointerOES(type, stride, pointer);
220 }
221
222 extern "C" PUBLIC
223 void APIENTRY glMatrixIndexPointerOESBounds(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer, GLsizei count) {
224     (void)count;
225     glMatrixIndexPointerOES(size, type, stride, pointer);
226 }
227
228 extern "C" PUBLIC
229 void APIENTRY glWeightPointerOESBounds(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer, GLsizei count) {
230     (void)count;
231     glWeightPointerOES(size, type, stride, pointer);
232 }
233
234 /*
235  * There is also a glVertexAttribPointerBounds in
236  * https://github.com/android/platform_frameworks_base/blob/master/opengl/tools/glgen/stubs/gles11/GLES20cHeader.cpp
237  * but is it not exported.
238  */
239
240 #endif /* ANDROID */
241
242
243 '''