def retraceFunctionBody(self, function): is_array_pointer = function.name in self.array_pointer_function_names is_draw_arrays = self.draw_arrays_function_regex.match( function.name) is not None is_draw_elements = self.draw_elements_function_regex.match( function.name) is not None is_draw_indirect = self.draw_indirect_function_regex.match( function.name) is not None is_misc_draw = self.misc_draw_function_regex.match(function.name) # For backwards compatibility with old traces where non VBO drawing was supported if (is_array_pointer or is_draw_arrays or is_draw_elements) and not is_draw_indirect: print ' if (retrace::parser.version < 1) {' if is_array_pointer or is_draw_arrays: print ' GLint _array_buffer = 0;' print ' glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &_array_buffer);' print ' if (!_array_buffer) {' self.failFunction(function) print ' }' if is_draw_elements: print ' GLint _element_array_buffer = 0;' print ' glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &_element_array_buffer);' print ' if (!_element_array_buffer) {' self.failFunction(function) print ' }' print ' }' # When no pack buffer object is bound, the pack functions are no-ops. if self.pack_function_regex.match(function.name): print ' GLint _pack_buffer = 0;' print ' glGetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &_pack_buffer);' print ' if (!_pack_buffer) {' print ' return;' print ' }' # Pre-snapshots if self.bind_framebuffer_function_regex.match(function.name): print ' assert(call.flags & trace::CALL_FLAG_SWAP_RENDERTARGET);' if function.name == 'glStringMarkerGREMEDY': return if function.name == 'glFrameTerminatorGREMEDY': print ' glretrace::frame_complete(call);' return Retracer.retraceFunctionBody(self, function) # Post-snapshots if function.name in ('glFlush', 'glFinish'): print ' if (!retrace::doubleBuffer) {' print ' glretrace::frame_complete(call);' print ' }' if is_draw_arrays or is_draw_elements or is_misc_draw: print ' assert(call.flags & trace::CALL_FLAG_RENDER);'
def retraceFunctionBody(self, function): is_array_pointer = function.name in self.array_pointer_function_names is_draw_arrays = self.draw_arrays_function_regex.match(function.name) is not None is_draw_elements = self.draw_elements_function_regex.match(function.name) is not None is_draw_indirect = self.draw_indirect_function_regex.match(function.name) is not None is_misc_draw = self.misc_draw_function_regex.match(function.name) # For backwards compatibility with old traces where non VBO drawing was supported if (is_array_pointer or is_draw_arrays or is_draw_elements) and not is_draw_indirect: print ' if (retrace::parser->getVersion() < 1) {' if is_array_pointer or is_draw_arrays: print ' GLint _array_buffer = 0;' print ' glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &_array_buffer);' print ' if (!_array_buffer) {' self.failFunction(function) print ' }' if is_draw_elements: print ' GLint _element_array_buffer = 0;' print ' glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &_element_array_buffer);' print ' if (!_element_array_buffer) {' self.failFunction(function) print ' }' print ' }' # When no pack buffer object is bound, the pack functions are no-ops. if self.pack_function_regex.match(function.name): print ' GLint _pack_buffer = 0;' print ' glGetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &_pack_buffer);' print ' if (!_pack_buffer) {' print ' return;' print ' }' # Pre-snapshots if self.bind_framebuffer_function_regex.match(function.name): print ' assert(call.flags & trace::CALL_FLAG_SWAP_RENDERTARGET);' if function.name == 'glStringMarkerGREMEDY': return if function.name == 'glFrameTerminatorGREMEDY': print ' glretrace::frame_complete(call);' return Retracer.retraceFunctionBody(self, function) # Post-snapshots if function.name in ('glFlush', 'glFinish'): print ' if (!retrace::doubleBuffer) {' print ' glretrace::frame_complete(call);' print ' }' if is_draw_arrays or is_draw_elements or is_misc_draw: print ' assert(call.flags & trace::CALL_FLAG_RENDER);'
def retraceFunctionBody(self, function): is_array_pointer = function.name in self.array_pointer_function_names is_draw_array = function.name in self.draw_array_function_names is_draw_elements = function.name in self.draw_elements_function_names is_misc_draw = function.name in self.misc_draw_function_names if is_array_pointer or is_draw_array or is_draw_elements: print ' if (retrace::parser.version < 1) {' if is_array_pointer or is_draw_array: print ' GLint _array_buffer = 0;' print ' glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &_array_buffer);' print ' if (!_array_buffer) {' self.failFunction(function) print ' }' if is_draw_elements: print ' GLint _element_array_buffer = 0;' print ' glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &_element_array_buffer);' print ' if (!_element_array_buffer) {' self.failFunction(function) print ' }' print ' }' # When no pack buffer object is bound, the pack functions are no-ops. if function.name in self.pack_function_names: print ' GLint _pack_buffer = 0;' print ' glGetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &_pack_buffer);' print ' if (!_pack_buffer) {' print ' return;' print ' }' # Pre-snapshots if function.name in self.bind_framebuffer_function_names: print ' assert(call.flags & trace::CALL_FLAG_SWAP_RENDERTARGET);' if function.name == 'glStringMarkerGREMEDY': return if function.name == 'glFrameTerminatorGREMEDY': print ' glretrace::frame_complete(call);' return Retracer.retraceFunctionBody(self, function) # Post-snapshots if function.name in ('glFlush', 'glFinish'): print ' if (!retrace::doubleBuffer) {' print ' glretrace::frame_complete(call);' print ' }' if is_draw_array or is_draw_elements or is_misc_draw: print ' assert(call.flags & trace::CALL_FLAG_RENDER);'
def retraceFunctionBody(self, function): is_array_pointer = function.name in self.array_pointer_function_names is_draw_array = function.name in self.draw_array_function_names is_draw_elements = function.name in self.draw_elements_function_names is_misc_draw = function.name in self.misc_draw_function_names if is_array_pointer or is_draw_array or is_draw_elements: print ' if (retrace::parser.version < 1) {' if is_array_pointer or is_draw_array: print ' GLint _array_buffer = 0;' print ' glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &_array_buffer);' print ' if (!_array_buffer) {' self.failFunction(function) print ' }' if is_draw_elements: print ' GLint _element_array_buffer = 0;' print ' glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &_element_array_buffer);' print ' if (!_element_array_buffer) {' self.failFunction(function) print ' }' print ' }' # When no pack buffer object is bound, the pack functions are no-ops. if function.name in self.pack_function_names: print ' GLint _pack_buffer = 0;' print ' glGetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &_pack_buffer);' print ' if (!_pack_buffer) {' print ' return;' print ' }' # Pre-snapshots if function.name in self.bind_framebuffer_function_names: print ' assert(call.flags & trace::CALL_FLAG_SWAP_RENDERTARGET);' if function.name == 'glStringMarkerGREMEDY': return if function.name == 'glFrameTerminatorGREMEDY': print ' glretrace::frame_complete(call);' return Retracer.retraceFunctionBody(self, function) # Post-snapshots if function.name in ('glFlush', 'glFinish'): print ' if (!retrace::doubleBuffer) {' print ' glretrace::frame_complete(call);' print ' }' if is_draw_array or is_draw_elements or is_misc_draw: print ' assert(call.flags & trace::CALL_FLAG_RENDER);'
def retraceFunctionBody(self, function): is_array_pointer = function.name in self.array_pointer_function_names is_draw_arrays = self.draw_arrays_function_regex.match( function.name) is not None is_draw_elements = self.draw_elements_function_regex.match( function.name) is not None is_draw_indirect = self.draw_indirect_function_regex.match( function.name) is not None is_misc_draw = self.misc_draw_function_regex.match(function.name) if function.name.startswith( 'gl') and not function.name.startswith('glX'): # The Windows OpenGL runtime will skip calls when there's no # context bound to the current context, but this might cause # crashes on other systems, particularly with NVIDIA Linux drivers. print r' glretrace::Context *currentContext = glretrace::getCurrentContext();' print r' if (!currentContext) {' print r' if (retrace::debug) {' print r' retrace::warning(call) << "no current context\n";' print r' }' print r'#ifndef _WIN32' print r' return;' print r'#endif' print r' }' print r' if (retrace::markers) {' print r' glretrace::insertCallMarker(call, currentContext);' print r' }' # For backwards compatibility with old traces where non VBO drawing was supported if (is_array_pointer or is_draw_arrays or is_draw_elements) and not is_draw_indirect: print ' if (retrace::parser->getVersion() < 1) {' if is_array_pointer or is_draw_arrays: print ' GLint _array_buffer = 0;' print ' glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &_array_buffer);' print ' if (!_array_buffer) {' self.failFunction(function) print ' }' if is_draw_elements: print ' GLint _element_array_buffer = 0;' print ' glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &_element_array_buffer);' print ' if (!_element_array_buffer) {' self.failFunction(function) print ' }' print ' }' # When no pack buffer object is bound, the pack functions are no-ops. if self.pack_function_regex.match(function.name): print r' GLint _pack_buffer = 0;' print r' if (currentContext->features().pixel_buffer_object) {' print r' glGetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &_pack_buffer);' print r' }' print r' if (!_pack_buffer) {' print r' return;' print r' }' # When no query buffer object is bound, glGetQueryObject is a no-op. if function.name.startswith('glGetQueryObject'): print r' GLint _query_buffer = 0;' print r' if (currentContext->features().query_buffer_object) {' print r' glGetIntegerv(GL_QUERY_BUFFER_BINDING, &_query_buffer);' print r' }' print r' if (!_query_buffer) {' print r' return;' print r' }' # Pre-snapshots if self.bind_framebuffer_function_regex.match(function.name): print ' assert(call.flags & trace::CALL_FLAG_SWAP_RENDERTARGET);' if function.name == 'glStringMarkerGREMEDY': return if function.name == 'glFrameTerminatorGREMEDY': print ' glretrace::frame_complete(call);' return Retracer.retraceFunctionBody(self, function) # Post-snapshots if function.name in ('glFlush', 'glFinish'): print ' if (!retrace::doubleBuffer) {' print ' glretrace::frame_complete(call);' print ' }' if is_draw_arrays or is_draw_elements or is_misc_draw: print ' assert(call.flags & trace::CALL_FLAG_RENDER);'
def retraceFunctionBody(self, function): is_array_pointer = function.name in self.array_pointer_function_names is_draw_arrays = self.draw_arrays_function_regex.match(function.name) is not None is_draw_elements = self.draw_elements_function_regex.match(function.name) is not None is_draw_indirect = self.draw_indirect_function_regex.match(function.name) is not None is_misc_draw = self.misc_draw_function_regex.match(function.name) if function.name.startswith('gl') and not function.name.startswith('glX'): # The Windows OpenGL runtime will skip calls when there's no # context bound to the current context, but this might cause # crashes on other systems, particularly with NVIDIA Linux drivers. print r' glretrace::Context *currentContext = glretrace::getCurrentContext();' print r' if (!currentContext) {' print r' if (retrace::debug) {' print r' retrace::warning(call) << "no current context\n";' print r' }' print r'#ifndef _WIN32' print r' return;' print r'#endif' print r' }' print r' if (retrace::markers) {' print r' glretrace::insertCallMarker(call, currentContext);' print r' }' # For backwards compatibility with old traces where non VBO drawing was supported if (is_array_pointer or is_draw_arrays or is_draw_elements) and not is_draw_indirect: print ' if (retrace::parser->getVersion() < 1) {' if is_array_pointer or is_draw_arrays: print ' GLint _array_buffer = 0;' print ' glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &_array_buffer);' print ' if (!_array_buffer) {' self.failFunction(function) print ' }' if is_draw_elements: print ' GLint _element_array_buffer = 0;' print ' glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &_element_array_buffer);' print ' if (!_element_array_buffer) {' self.failFunction(function) print ' }' print ' }' # When no pack buffer object is bound, the pack functions are no-ops. if self.pack_function_regex.match(function.name): print r' GLint _pack_buffer = 0;' print r' if (currentContext->features().pixel_buffer_object) {' print r' glGetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &_pack_buffer);' print r' }' print r' if (!_pack_buffer) {' print r' return;' print r' }' # When no query buffer object is bound, glGetQueryObject is a no-op. if function.name.startswith('glGetQueryObject'): print r' GLint _query_buffer = 0;' print r' if (currentContext->features().query_buffer_object) {' print r' glGetIntegerv(GL_QUERY_BUFFER_BINDING, &_query_buffer);' print r' }' print r' if (!_query_buffer) {' print r' return;' print r' }' # Pre-snapshots if self.bind_framebuffer_function_regex.match(function.name): print ' assert(call.flags & trace::CALL_FLAG_SWAP_RENDERTARGET);' if function.name == 'glStringMarkerGREMEDY': return if function.name == 'glFrameTerminatorGREMEDY': print ' glretrace::frame_complete(call);' return Retracer.retraceFunctionBody(self, function) # Post-snapshots if function.name in ('glFlush', 'glFinish'): print ' if (!retrace::doubleBuffer) {' print ' glretrace::frame_complete(call);' print ' }' if is_draw_arrays or is_draw_elements or is_misc_draw: print ' assert(call.flags & trace::CALL_FLAG_RENDER);'
def retraceFunctionBody(self, function): is_array_pointer = function.name in self.array_pointer_function_names is_draw_arrays = self.draw_arrays_function_regex.match( function.name) is not None is_draw_elements = self.draw_elements_function_regex.match( function.name) is not None is_draw_indirect = self.draw_indirect_function_regex.match( function.name) is not None is_misc_draw = self.misc_draw_function_regex.match(function.name) if function.name.startswith( 'gl') and not function.name.startswith('glX'): # The Windows OpenGL runtime will skip calls when there's no # context bound to the current context, but this might cause # crashes on other systems, particularly with NVIDIA Linux drivers. print( r' glretrace::Context *currentContext = glretrace::getCurrentContext();' ) print(r' if (!currentContext) {') print(r' if (retrace::debug > 0) {') print( r' retrace::warning(call) << "no current context\n";' ) print(r' }') print(r'#ifndef _WIN32') print(r' return;') print(r'#endif') print(r' }') print(r' if (retrace::markers) {') print( r' glretrace::insertCallMarker(call, currentContext);') print(r' }') # For backwards compatibility with old traces where non VBO drawing was supported if (is_array_pointer or is_draw_arrays or is_draw_elements) and not is_draw_indirect: print(' if (retrace::parser->getVersion() < 1) {') if is_array_pointer or is_draw_arrays: print(' GLint _array_buffer = 0;') print( ' glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &_array_buffer);' ) print(' if (!_array_buffer) {') self.failFunction(function) print(' }') if is_draw_elements: print(' GLint _element_array_buffer = 0;') print( ' glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &_element_array_buffer);' ) print(' if (!_element_array_buffer) {') self.failFunction(function) print(' }') print(' }') # When no pack buffer object is bound, the pack functions are no-ops. if self.pack_function_regex.match(function.name): print(r' GLint _pack_buffer = 0;') print( r' if (currentContext && currentContext->features().pixel_buffer_object) {' ) print( r' glGetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &_pack_buffer);' ) print(r' }') print(r' if (!_pack_buffer) {') print(r' return;') print(r' }') # When no query buffer object is bound, and we don't request that glGetQueryObject # is run than glGetQueryObject is a no-op. if function.name.startswith('glGetQueryObject'): print(r' GLint _query_buffer = 0;') print( r' if (currentContext && currentContext->features().query_buffer_object) {' ) print( r' glGetIntegerv(GL_QUERY_BUFFER_BINDING, &_query_buffer);' ) print(r' }') print( r' if (!_query_buffer && retrace::queryHandling == retrace::QUERY_SKIP) {' ) print(r' return;') print(r' }') print(r'wait_for_query_result:') # Pre-snapshots if self.bind_framebuffer_function_regex.match(function.name): print( ' assert(call.flags & trace::CALL_FLAG_SWAP_RENDERTARGET);') if function.name == 'glStringMarkerGREMEDY': return if function.name == 'glFrameTerminatorGREMEDY': print(' glretrace::frame_complete(call);') return Retracer.retraceFunctionBody(self, function) # If we have a query buffer or if we execute the query we have to loop until the # query result is actually available to get the proper result - for the following # execution if the query buffer is used or for the check to make sense, and if we # just want to execute the query for timing purpouses we also should wait # for the result. if function.name.startswith('glGetQueryObject'): print( r' if (!_query_buffer && retrace::queryHandling != retrace::QUERY_SKIP) {' ) print(r' auto query_result = call.arg(2).toArray();') print( r' assert(query_result && query_result->values.size() == 1);' ) print( r' auto expect = static_cast<decltype(retval)>(query_result->values[0]->toUInt());' ) print( r' if (call.arg(1).toUInt() == GL_QUERY_RESULT_AVAILABLE) {' ) print(r' if (expect == 1 && retval == 0)') print(r' goto wait_for_query_result;') print( r' } else if (retrace::queryHandling == retrace::QUERY_RUN_AND_CHECK_RESULT &&' ) print( r' abs(static_cast<int64_t>(expect) - static_cast<int64_t>(retval)) > retrace::queryTolerance) {' ) print( r' retrace::warning(call) << "Warning: query returned " << retval << " but trace contained " << expect' ) print( r' << " (tol = " << retrace::queryTolerance << ")\n";' ) print(r' }') print(r' }') # Post-snapshots if function.name in ('glFlush', 'glFinish'): print(' if (!retrace::doubleBuffer) {') print(' glretrace::frame_complete(call);') print(' }') if is_draw_arrays or is_draw_elements or is_misc_draw: print(' assert(call.flags & trace::CALL_FLAG_RENDER);')
def retraceFunctionBody(self, function): is_array_pointer = function.name in self.array_pointer_function_names is_draw_array = function.name in self.draw_array_function_names is_draw_elements = function.name in self.draw_elements_function_names is_misc_draw = function.name in self.misc_draw_function_names if is_array_pointer or is_draw_array or is_draw_elements: print ' if (retrace::parser.version < 1) {' if is_array_pointer or is_draw_array: print ' GLint _array_buffer = 0;' print ' glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &_array_buffer);' print ' if (!_array_buffer) {' self.failFunction(function) print ' }' if is_draw_elements: print ' GLint _element_array_buffer = 0;' print ' glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &_element_array_buffer);' print ' if (!_element_array_buffer) {' self.failFunction(function) print ' }' print ' }' if is_array_pointer: print ' GLint bRemoveVBO = false, uPrevVBO = 0;' print ' GLuint optr = (GLuint)retrace::toPointer(call.arg(call.args.size()-1),false);' print ' if(optr>16*1024*1024){' print ' glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &uPrevVBO);' print ' if(uPrevVBO){ bRemoveVBO = true; glBindBuffer(GL_ARRAY_BUFFER,0);' #print ' std::cout << "glretrace: temporarily unbinding VBO for glXYZPointer\\n"; print ' }' print ' }' # When no pack buffer object is bound, the pack functions are no-ops. if function.name in self.pack_function_names: print ' GLint _pack_buffer = 0;' print ' glGetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &_pack_buffer);' print ' if (!_pack_buffer) {' print ' return;' print ' }' # Pre-snapshots if function.name in self.bind_framebuffer_function_names: print ' assert(call.flags & trace::CALL_FLAG_SWAP_RENDERTARGET);' if function.name == 'glStringMarkerGREMEDY': return if function.name == 'glFrameTerminatorGREMEDY': print ' glretrace::frame_complete(call);' return Retracer.retraceFunctionBody(self, function) if is_array_pointer: print ' if(bRemoveVBO) glBindBuffer(GL_ARRAY_BUFFER,uPrevVBO);' # Post-snapshots if function.name in ('glFlush', 'glFinish'): print ' if (!retrace::doubleBuffer) {' print ' glretrace::frame_complete(call);' print ' }' if is_draw_array or is_draw_elements or is_misc_draw: print ' assert(call.flags & trace::CALL_FLAG_RENDER);'