X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glretrace.py;h=0267d1e4a28c75c03f7d20d640552f352819647c;hb=f30a755cb307a58320f155e3decff0429b6f6fbe;hp=e1bd4a595e92c2a29f7608fdab3d11369fd269b8;hpb=3a84b684f0c5c1aeff57dff7bc355fc14115d11b;p=apitrace diff --git a/glretrace.py b/glretrace.py index e1bd4a5..0267d1e 100644 --- a/glretrace.py +++ b/glretrace.py @@ -125,21 +125,28 @@ class GlRetracer(Retracer): Retracer.retrace_function_body(self, function) + if function.name in ('glFlush', 'glFinish'): + print ' if (!glretrace::double_buffer) {' + print ' glretrace::frame_complete(call.no);' + print ' }' + + if function.name == 'glReadPixels': + print ' glFinish();' + print ' glretrace::snapshot(call.no);' + def call_function(self, function): if function.name == "glViewport": - print ' bool reshape_window = false;' - print ' if (x + width > glretrace::window_width) {' - print ' glretrace::window_width = x + width;' - print ' reshape_window = true;' - print ' }' - print ' if (y + height > glretrace::window_height) {' - print ' glretrace::window_height = y + height;' - print ' reshape_window = true;' - print ' }' - print ' if (reshape_window) {' - print ' // XXX: does not always work' - print ' glretrace::drawable->resize(glretrace::window_width, glretrace::window_height);' - print ' reshape_window = false;' + print ' if (glretrace::drawable) {' + print ' int drawable_width = x + width;' + print ' int drawable_height = y + height;' + print ' if (drawable_width > (int)glretrace::drawable->width ||' + print ' drawable_height > (int)glretrace::drawable->height) {' + print ' glretrace::drawable->resize(drawable_width, drawable_height);' + print ' if (!glretrace::drawable->visible) {' + print ' glretrace::drawable->show();' + print ' }' + print ' glScissor(0, 0, drawable_width, drawable_height);' + print ' }' print ' }' if function.name == "glEnd": @@ -147,24 +154,73 @@ class GlRetracer(Retracer): Retracer.call_function(self, function) + # Error checking if function.name == "glBegin": print ' glretrace::insideGlBeginEnd = true;' elif function.name.startswith('gl'): # glGetError is not allowed inside glBegin/glEnd - print ' glretrace::checkGlError(call);' - - if function.name == 'glFlush': - print ' if (!glretrace::double_buffer) {' - print ' glretrace::frame_complete(call.no);' + print ' if (!glretrace::benchmark && !glretrace::insideGlBeginEnd) {' + print ' glretrace::checkGlError(call);' + if function.name in ('glProgramStringARB', 'glProgramStringNV'): + print r' GLint error_position = -1;' + print r' glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &error_position);' + print r' if (error_position != -1) {' + print r' const char *error_string = (const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB);' + print r' std::cerr << call.no << ": warning: " << error_string << "\n";' + print r' }' + if function.name == 'glCompileShader': + print r' GLint compile_status = 0;' + print r' glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);' + print r' if (!compile_status) {' + print r' GLint info_log_length = 0;' + print r' glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_log_length);' + print r' GLchar *infoLog = new GLchar[info_log_length];' + print r' glGetShaderInfoLog(shader, info_log_length, NULL, infoLog);' + print r' std::cerr << call.no << ": warning: " << infoLog << "\n";' + print r' delete [] infoLog;' + print r' }' + if function.name == 'glLinkProgram': + print r' GLint link_status = 0;' + print r' glGetProgramiv(program, GL_LINK_STATUS, &link_status);' + print r' if (!link_status) {' + print r' GLint info_log_length = 0;' + print r' glGetProgramiv(program, GL_INFO_LOG_LENGTH, &info_log_length);' + print r' GLchar *infoLog = new GLchar[info_log_length];' + print r' glGetProgramInfoLog(program, info_log_length, NULL, infoLog);' + print r' std::cerr << call.no << ": warning: " << infoLog << "\n";' + print r' delete [] infoLog;' + print r' }' + if function.name == 'glCompileShaderARB': + print r' GLint compile_status = 0;' + print r' glGetObjectParameterivARB(shaderObj, GL_OBJECT_COMPILE_STATUS_ARB, &compile_status);' + print r' if (!compile_status) {' + print r' GLint info_log_length = 0;' + print r' glGetObjectParameterivARB(shaderObj, GL_OBJECT_INFO_LOG_LENGTH_ARB, &info_log_length);' + print r' GLchar *infoLog = new GLchar[info_log_length];' + print r' glGetInfoLogARB(shaderObj, info_log_length, NULL, infoLog);' + print r' std::cerr << call.no << ": warning: " << infoLog << "\n";' + print r' delete [] infoLog;' + print r' }' + if function.name == 'glLinkProgramARB': + print r' GLint link_status = 0;' + print r' glGetObjectParameterivARB(programObj, GL_OBJECT_LINK_STATUS_ARB, &link_status);' + print r' if (!link_status) {' + print r' GLint info_log_length = 0;' + print r' glGetObjectParameterivARB(programObj, GL_OBJECT_INFO_LOG_LENGTH_ARB, &info_log_length);' + print r' GLchar *infoLog = new GLchar[info_log_length];' + print r' glGetInfoLogARB(programObj, info_log_length, NULL, infoLog);' + print r' std::cerr << call.no << ": warning: " << infoLog << "\n";' + print r' delete [] infoLog;' + print r' }' print ' }' def extract_arg(self, function, arg, arg_type, lvalue, rvalue): if function.name in self.array_pointer_function_names and arg.name == 'pointer': - print ' %s = static_cast<%s>(%s.blob());' % (lvalue, arg_type, rvalue) + print ' %s = static_cast<%s>(%s.toPointer());' % (lvalue, arg_type, rvalue) return if function.name in self.draw_elements_function_names and arg.name == 'indices': - print ' %s = %s.blob();' % (lvalue, rvalue) + print ' %s = %s.toPointer();' % (lvalue, rvalue) return if arg.type is glapi.GLlocation \