Esempio n. 1
0
    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);'
Esempio n. 2
0
    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);'
Esempio n. 3
0
    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);'
Esempio n. 4
0
    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);'
Esempio n. 5
0
    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);'
Esempio n. 6
0
    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);'
Esempio n. 7
0
    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);')
Esempio n. 8
0
    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);'