/**************************************************************************
*
* Copyright 2011-2012 Jose Fonseca
+ * Copyright (C) 2013 Intel Corporation. All rights reversed.
+ * Author: Shuang He <shuang.he@intel.com>
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
#include <assert.h>
#include <string.h>
-#include <stdint.h>
#include <list>
#include <map>
#include "trace_model.hpp"
#include "trace_parser.hpp"
+#include "trace_profiler.hpp"
+
+#include "scoped_allocator.hpp"
namespace image {
extern trace::Parser parser;
+extern trace::Profiler profiler;
-/**
- * Handle map.
- *
- * It is just like a regular std::map<T, T> 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 T>
-class map
-{
-private:
- typedef std::map<T, T> 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<uintptr_t *>(malloc(sizeof(uintptr_t) + size));
- if (!buf) {
- return NULL;
- }
-
- *buf = next;
- next = reinterpret_cast<uintptr_t>(buf);
- assert((next & 1) == 0);
-
- return static_cast<void *>(&buf[1]);
- }
-
- template< class T >
- inline T *
- alloc(size_t n = 1) {
- return static_cast<T *>(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) {
+ inline void *
+ alloc(const trace::Value *value, size_t size) {
const trace::Array *array = dynamic_cast<const trace::Array *>(value);
if (array) {
- return alloc<T>(array->size());
+ return ::ScopedAllocator::alloc(array->size() * size);
}
const trace::Null *null = dynamic_cast<const trace::Null *>(value);
if (null) {
return NULL;
}
- /**
- * Prevent this pointer from being automatically freed.
- */
- template< class T >
- inline void
- bind(T *ptr) {
- if (ptr) {
- reinterpret_cast<uintptr_t *>(ptr)[-1] |= 1;
- }
- }
-
- inline
- ~ScopedAllocator() {
- while (next) {
- uintptr_t temp = *reinterpret_cast<uintptr_t *>(next);
-
- bool bind = temp & 1;
- temp &= ~1;
-
- if (!bind) {
- free(reinterpret_cast<void *>(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.
*/
* 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;
+
std::ostream &warning(trace::Call &call);
};
+class Dumper
+{
+public:
+ virtual image::Image *
+ getSnapshot(void) {
+ return NULL;
+ }
+
+ virtual bool
+ dumpState(std::ostream &os) {
+ return false;
+ }
+};
+
+
+extern Dumper *dumper;
+
+
void
setUp(void);
void
frameComplete(trace::Call &call);
-image::Image *
-getSnapshot(void);
-bool
-dumpState(std::ostream &os);
void
flushRendering(void);