X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fretrace.hpp;h=6e6bf131c6dc82eed5710db6df6b5e8fb0328633;hb=52398312caaba3e1bc0613016d5bf3507d1e242a;hp=2f75dbe6f5285cea539f22123e0d8523fa9d8d35;hpb=06555614b7385c49964d27aaeec68dec6ff31744;p=apitrace diff --git a/retrace/retrace.hpp b/retrace/retrace.hpp index 2f75dbe..6e6bf13 100644 --- a/retrace/retrace.hpp +++ b/retrace/retrace.hpp @@ -1,6 +1,8 @@ /************************************************************************** * * Copyright 2011-2012 Jose Fonseca + * Copyright (C) 2013 Intel Corporation. All rights reversed. + * Author: Shuang He * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -28,7 +30,6 @@ #include #include -#include #include #include @@ -36,6 +37,10 @@ #include "trace_model.hpp" #include "trace_parser.hpp" +#include "trace_profiler.hpp" +#include "trace_dump.hpp" + +#include "scoped_allocator.hpp" namespace image { @@ -47,97 +52,22 @@ namespace retrace { extern trace::Parser parser; +extern trace::Profiler profiler; -/** - * Handle map. - * - * It is just like a regular std::map container, but lookups of missing - * keys return the key instead of default constructor. - * - * This is necessary for several GL named objects, where one can either request - * the implementation to generate an unique name, or pick a value never used - * before. - * - * XXX: In some cases, instead of returning the key, it would make more sense - * to return an unused data value (e.g., container count). - */ -template -class map -{ -private: - typedef std::map base_type; - base_type base; - -public: - - T & operator[] (const T &key) { - typename base_type::iterator it; - it = base.find(key); - if (it == base.end()) { - return (base[key] = key); - } - return it->second; - } - - const T & operator[] (const T &key) const { - typename base_type::const_iterator it; - it = base.find(key); - if (it == base.end()) { - return (base[key] = key); - } - return it->second; - } -}; - - -/** - * Similar to alloca(), but implemented with malloc. - */ -class ScopedAllocator +class ScopedAllocator : public ::ScopedAllocator { -private: - uintptr_t next; - public: - ScopedAllocator() : - next(0) { - } - - inline void * - alloc(size_t size) { - /* Always return valid address, even when size is zero */ - size = std::max(size, sizeof(uintptr_t)); - - uintptr_t * buf = static_cast(malloc(sizeof(uintptr_t) + size)); - if (!buf) { - return NULL; - } - - *buf = next; - next = reinterpret_cast(buf); - assert((next & 1) == 0); - - return static_cast(&buf[1]); - } - - template< class T > - inline T * - alloc(size_t n = 1) { - return static_cast(alloc(sizeof(T) * n)); - } - /** * Allocate an array with the same dimensions as the specified value. */ - template< class T > - inline T * - alloc(const trace::Value *value) { - const trace::Array *array = dynamic_cast(value); + inline void * + alloc(const trace::Value *value, size_t size) { + const trace::Array *array = value->toArray(); if (array) { - return alloc(array->size()); + return ::ScopedAllocator::alloc(array->size() * size); } - const trace::Null *null = dynamic_cast(value); + const trace::Null *null = value->toNull(); if (null) { return NULL; } @@ -145,45 +75,9 @@ public: return NULL; } - /** - * Prevent this pointer from being automatically freed. - */ - template< class T > - inline void - bind(T *ptr) { - if (ptr) { - reinterpret_cast(ptr)[-1] |= 1; - } - } - - inline - ~ScopedAllocator() { - while (next) { - uintptr_t temp = *reinterpret_cast(next); - - bool bind = temp & 1; - temp &= ~1; - - if (!bind) { - free(reinterpret_cast(next)); - } - - next = temp; - } - } }; -void -addRegion(unsigned long long address, void *buffer, unsigned long long size); - -void -delRegionByPointer(void *ptr); - -void * -toPointer(trace::Value &value, bool bind = false); - - /** * Output verbosity when retracing files. */ @@ -198,11 +92,36 @@ extern bool debug; * Add profiling data to the dump when retracing. */ extern bool profiling; +extern bool profilingCpuTimes; +extern bool profilingGpuTimes; +extern bool profilingPixelsDrawn; +extern bool profilingMemoryUsage; +/** + * State dumping. + */ +extern bool dumpingState; + + +enum Driver { + DRIVER_DEFAULT, + DRIVER_HARDWARE, // force hardware + DRIVER_SOFTWARE, + DRIVER_REFERENCE, + DRIVER_NULL, + DRIVER_MODULE, +}; + +extern Driver driver; +extern const char *driverModule; extern bool doubleBuffer; extern bool coreProfile; +extern unsigned frameNo; +extern unsigned callNo; + +extern trace::DumpFlags dumpFlags; std::ostream &warning(trace::Call &call); @@ -250,6 +169,24 @@ public: }; +class Dumper +{ +public: + virtual image::Image * + getSnapshot(void) { + return NULL; + } + + virtual bool + dumpState(std::ostream &os) { + return false; + } +}; + + +extern Dumper *dumper; + + void setUp(void); @@ -259,11 +196,7 @@ addCallbacks(retrace::Retracer &retracer); void frameComplete(trace::Call &call); -image::Image * -getSnapshot(void); -bool -dumpState(std::ostream &os); void flushRendering(void);