diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/gfx/gl/generate_bindings.py | 126 | ||||
-rw-r--r-- | app/gfx/gl/gl_bindings.h | 9 | ||||
-rw-r--r-- | app/gfx/gl/gl_implementation.h | 3 | ||||
-rw-r--r-- | app/gfx/gl/gl_implementation_linux.cc | 7 | ||||
-rw-r--r-- | app/gfx/gl/gl_implementation_mac.cc | 5 | ||||
-rw-r--r-- | app/gfx/gl/gl_implementation_win.cc | 7 |
6 files changed, 122 insertions, 35 deletions
diff --git a/app/gfx/gl/generate_bindings.py b/app/gfx/gl/generate_bindings.py index 8208cd9..f63293d 100644 --- a/app/gfx/gl/generate_bindings.py +++ b/app/gfx/gl/generate_bindings.py @@ -424,7 +424,7 @@ FUNCTION_SETS = [ [GLX_FUNCTIONS, 'glx'], ] -def GenerateHeader(file, functions, setName): +def GenerateHeader(file, functions, set_name): """Generates gl_binding_autogen_x.h""" # Write file header. @@ -434,26 +434,27 @@ def GenerateHeader(file, functions, setName): file.write('\n') file.write('// This file is automatically generated.\n') file.write('\n') - file.write('#ifndef APP_GFX_GL_GL_BINDINGS_AUTOGEN_%s_H_\n' % setName.upper()) - file.write('#define APP_GFX_GL_GL_BINDINGS_AUTOGEN_%s_H_\n' % setName.upper()) + file.write('#ifndef APP_GFX_GL_GL_BINDINGS_AUTOGEN_%s_H_\n' % set_name.upper()) + file.write('#define APP_GFX_GL_GL_BINDINGS_AUTOGEN_%s_H_\n' % set_name.upper()) # Write prototype for initialization function. file.write('\n') file.write('namespace gfx {\n') file.write('\n') - file.write('void InitializeGLBindings%s();\n' % setName.upper()) + file.write('void InitializeGLBindings%s();\n' % set_name.upper()) + file.write('void InitializeDebugGLBindings%s();\n' % set_name.upper()) # Write typedefs for function pointer types. Always use the GL name for the # typedef. file.write('\n') - for [returnType, names, arguments] in functions: + for [return_type, names, arguments] in functions: file.write('typedef %s (GL_BINDING_CALL *%sProc)(%s);\n' % - (returnType, names[0], arguments)) + (return_type, names[0], arguments)) # Write declarations for function pointers. Always use the GL name for the # declaration. file.write('\n') - for [returnType, names, arguments] in functions: + for [return_type, names, arguments] in functions: file.write('extern %sProc g_%s;\n' % (names[0], names[0])) file.write('\n') file.write( '} // namespace gfx\n') @@ -461,15 +462,16 @@ def GenerateHeader(file, functions, setName): # Write macros to invoke function pointers. Always use the GL name for the # macro. file.write('\n') - for [returnType, names, arguments] in functions: + for [return_type, names, arguments] in functions: file.write('#define %s ::gfx::g_%s\n' % (names[0], names[0])) file.write('\n') file.write('#endif // APP_GFX_GL_GL_BINDINGS_AUTOGEN_%s_H_\n' % - setName.upper()) + set_name.upper()) -def GenerateSource(file, functions, setName): + +def GenerateSource(file, functions, set_name): """Generates gl_binding_autogen_x.cc""" # Write file header. @@ -486,13 +488,17 @@ def GenerateSource(file, functions, setName): file.write('\n') file.write('namespace gfx {\n') file.write('\n') - for [returnType, names, arguments] in functions: + for [return_type, names, arguments] in functions: file.write('%sProc g_%s;\n' % (names[0], names[0])) + file.write('\n') + for [return_type, names, arguments] in functions: + file.write('static %sProc g_debug_%s;\n' % (names[0], names[0])) + # Write function to initialize the function pointers. file.write('\n') - file.write('void InitializeGLBindings%s() {\n' % setName.upper()) - for [returnType, names, arguments] in functions: + file.write('void InitializeGLBindings%s() {\n' % set_name.upper()) + for [return_type, names, arguments] in functions: for name in names: file.write(' if (!g_%s)\n' % names[0]) file.write( @@ -500,8 +506,56 @@ def GenerateSource(file, functions, setName): (names[0], names[0], name)) file.write('}\n') file.write('\n') + + # Write logging wrappers for each function. + file.write('extern "C" {\n') + for [return_type, names, arguments] in functions: + file.write('\n') + file.write('static %s GL_BINDING_CALL Debug_%s(%s) {\n' % + (return_type, names[0], arguments)) + argument_names = re.sub(r'(const )?[a-zA-Z0-9]+\** ([a-zA-Z0-9]+)', r'\2', + arguments) + argument_names = re.sub(r'(const )?[a-zA-Z0-9]+\** ([a-zA-Z0-9]+)', r'\2', + argument_names) + log_argument_names = argument_names.replace(',', ' << ", " <<'); + if argument_names == 'void' or argument_names == '': + argument_names = '' + log_argument_names = '' + else: + log_argument_names = " << " + log_argument_names + function_name = names[0] + if return_type == 'void': + file.write(' GL_SERVICE_LOG("%s" << "(" %s << ")");\n' % + (function_name, log_argument_names)) + file.write(' g_debug_%s(%s);\n' % + (function_name, argument_names)) + else: + file.write(' GL_SERVICE_LOG("%s" << "(" %s << ")");\n' % + (function_name, log_argument_names)) + file.write(' %s result = g_debug_%s(%s);\n' % + (return_type, function_name, argument_names)) + file.write(' GL_SERVICE_LOG("GL_RESULT: " << result);\n'); + file.write(' return result;\n') + file.write('}\n') + file.write('} // extern "C"\n') + + # Write function to initialize the function pointers. + file.write('\n') + file.write('void InitializeDebugGLBindings%s() {\n' % set_name.upper()) + for [return_type, names, arguments] in functions: + for name in names: + file.write(' if (!g_debug_%s) {\n' % names[0]) + file.write(' g_debug_%s = g_%s;\n' % (names[0], names[0])) + #file.write(' g_%s = reinterpret_cast<%sProc>(Debug_%s);\n' % + # (names[0], names[0], names[0])) + file.write(' g_%s = Debug_%s;\n' % (names[0], names[0])) + file.write(' }\n') + file.write('}\n') + file.write('\n') + file.write( '} // namespace gfx\n') + def GenerateMockSource(file, functions): """Generates functions that invoke a mock GLInterface""" @@ -519,27 +573,27 @@ def GenerateMockSource(file, functions): file.write('namespace gfx {\n') # Write function that trampoline into the GLInterface. - for [returnType, names, arguments] in functions: + for [return_type, names, arguments] in functions: file.write('\n') file.write('%s GL_BINDING_CALL Mock_%s(%s) {\n' % - (returnType, names[0], arguments)) - argumentNames = re.sub(r'(const )?[a-zA-Z0-9]+\** ([a-zA-Z0-9]+)', r'\2', + (return_type, names[0], arguments)) + argument_names = re.sub(r'(const )?[a-zA-Z0-9]+\** ([a-zA-Z0-9]+)', r'\2', arguments) - if argumentNames == 'void': - argumentNames = '' - functionName = names[0][2:] - if returnType == 'void': + if argument_names == 'void': + argument_names = '' + function_name = names[0][2:] + if return_type == 'void': file.write(' GLInterface::GetGLInterface()->%s(%s);\n' % - (functionName, argumentNames)) + (function_name, argument_names)) else: file.write(' return GLInterface::GetGLInterface()->%s(%s);\n' % - (functionName, argumentNames)) + (function_name, argument_names)) file.write('}\n') # Write a function to lookup a mock GL function based on its name. file.write('\n') file.write('void* GL_BINDING_CALL GetMockGLProcAddress(const char* name) {\n') - for [returnType, names, arguments] in functions: + for [return_type, names, arguments] in functions: file.write(' if (strcmp(name, "%s") == 0)\n' % names[0]) file.write(' return reinterpret_cast<void*>(Mock_%s);\n' % names[0]) file.write(' return NULL;\n') @@ -548,6 +602,7 @@ def GenerateMockSource(file, functions): file.write('\n') file.write('} // namespace gfx\n') + def main(argv): """This is the main function.""" @@ -556,20 +611,21 @@ def main(argv): else: dir = '.' - for [functions, setName] in FUNCTION_SETS: - headerFile = open( - os.path.join(dir, 'gl_bindings_autogen_%s.h' % setName), 'wb') - GenerateHeader(headerFile, functions, setName) - headerFile.close() + for [functions, set_name] in FUNCTION_SETS: + header_file = open( + os.path.join(dir, 'gl_bindings_autogen_%s.h' % set_name), 'wb') + GenerateHeader(header_file, functions, set_name) + header_file.close() + + source_file = open( + os.path.join(dir, 'gl_bindings_autogen_%s.cc' % set_name), 'wb') + GenerateSource(source_file, functions, set_name) + source_file.close() - sourceFile = open( - os.path.join(dir, 'gl_bindings_autogen_%s.cc' % setName), 'wb') - GenerateSource(sourceFile, functions, setName) - sourceFile.close() + source_file = open(os.path.join(dir, 'gl_bindings_autogen_mock.cc'), 'wb') + GenerateMockSource(source_file, GL_FUNCTIONS) + source_file.close() - sourceFile = open(os.path.join(dir, 'gl_bindings_autogen_mock.cc'), 'wb') - GenerateMockSource(sourceFile, GL_FUNCTIONS) - sourceFile.close() if __name__ == '__main__': main(sys.argv[1:]) diff --git a/app/gfx/gl/gl_bindings.h b/app/gfx/gl/gl_bindings.h index 6f37a42..6b1d22c 100644 --- a/app/gfx/gl/gl_bindings.h +++ b/app/gfx/gl/gl_bindings.h @@ -15,6 +15,9 @@ #include <GL/glext.h> #include "build/build_config.h" +#if defined(OS_WIN) +#include "base/logging.h" +#endif // The standard OpenGL native extension headers are also included. #if defined(OS_WIN) @@ -39,6 +42,12 @@ #define GL_BINDING_CALL #endif +#if defined(OS_WIN) +#define GL_SERVICE_LOG(args) DLOG(INFO) << args; +#else +#define GL_SERVICE_LOG(args) +#endif + // Forward declare OSMesa types. typedef struct osmesa_context *OSMesaContext; typedef void (*OSMESAproc)(); diff --git a/app/gfx/gl/gl_implementation.h b/app/gfx/gl/gl_implementation.h index 91dd617..dba4277 100644 --- a/app/gfx/gl/gl_implementation.h +++ b/app/gfx/gl/gl_implementation.h @@ -37,6 +37,9 @@ typedef void* (*GLGetProcAddressProc)(const char* name); // Initialize a particular GL implementation. bool InitializeGLBindings(GLImplementation implementation); +// Initialize a particular GL implementation. +void InitializeDebugGLBindings(); + // Set the current GL implementation. void SetGLImplementation(GLImplementation implementation); diff --git a/app/gfx/gl/gl_implementation_linux.cc b/app/gfx/gl/gl_implementation_linux.cc index 09e0c71..74fd21e 100644 --- a/app/gfx/gl/gl_implementation_linux.cc +++ b/app/gfx/gl/gl_implementation_linux.cc @@ -151,4 +151,11 @@ bool InitializeGLBindings(GLImplementation implementation) { return true; } +void InitializeDebugGLBindings() { + InitializeDebugGLBindingsEGL(); + InitializeDebugGLBindingsGL(); + InitializeDebugGLBindingsGLX(); + InitializeDebugGLBindingsOSMESA(); +} + } // namespace gfx diff --git a/app/gfx/gl/gl_implementation_mac.cc b/app/gfx/gl/gl_implementation_mac.cc index 66562ca..0a1d5a5 100644 --- a/app/gfx/gl/gl_implementation_mac.cc +++ b/app/gfx/gl/gl_implementation_mac.cc @@ -84,4 +84,9 @@ bool InitializeGLBindings(GLImplementation implementation) { return true; } +void InitializeDebugGLBindings() { + InitializeDebugGLBindingsGL(); + InitializeDebugGLBindingsOSMESA(); +} + } // namespace gfx diff --git a/app/gfx/gl/gl_implementation_win.cc b/app/gfx/gl/gl_implementation_win.cc index 42cd9eb..c3869b1 100644 --- a/app/gfx/gl/gl_implementation_win.cc +++ b/app/gfx/gl/gl_implementation_win.cc @@ -158,4 +158,11 @@ bool InitializeGLBindings(GLImplementation implementation) { return true; } +void InitializeDebugGLBindings() { + InitializeDebugGLBindingsEGL(); + InitializeDebugGLBindingsGL(); + InitializeDebugGLBindingsOSMESA(); + InitializeDebugGLBindingsWGL(); +} + } // namespace gfx |