blob: 3eb1ddced230eaef121871e87c1d7e00420d64c0 [file] [log] [blame]
/**************************************************************************
*
* 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
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
**************************************************************************/
#pragma once
#include <assert.h>
#include <string.h>
#include <list>
#include <map>
#include <ostream>
#ifdef _WIN32
#include <windows.h>
#endif
#include "trace_model.hpp"
#include "trace_parser.hpp"
#include "trace_profiler.hpp"
#include "trace_dump.hpp"
#include "scoped_allocator.hpp"
namespace image {
class Image;
}
class StateWriter;
namespace retrace {
extern trace::AbstractParser *parser;
extern trace::Profiler profiler;
class ScopedAllocator : public ::ScopedAllocator
{
public:
/**
* Allocate an array with the same dimensions as the specified value.
*/
inline void *
allocArray(const trace::Value *value, size_t elemSize) {
const trace::Array *array = value->toArray();
if (array) {
size_t numElems = array->size();
size_t size = numElems * elemSize;
void *ptr = ::ScopedAllocator::alloc(size);
if (ptr) {
memset(ptr, 0, size);
}
return ptr;
}
const trace::Null *null = value->toNull();
if (null) {
return NULL;
}
assert(0);
return NULL;
}
/**
* XXX: We must not compute sizeof(T) inside the function body! d3d8.h and
* d3d9.h have declarations of D3DPRESENT_PARAMETERS and D3DVOLUME_DESC
* structures with different size sizes. Multiple specializations of these
* will be produced (on debug builds, as on release builds the whole body
* is inlined.), and the linker will pick up one, leading to wrong results
* if the smallest specialization is picked.
*/
template< class T >
inline T *
allocArray(const trace::Value *value, size_t sizeof_T = sizeof(T)) {
return static_cast<T *>(allocArray(value, sizeof_T));
}
};
/**
* Output verbosity when retracing files.
*/
extern int verbosity;
/**
* Debugging checks.
*/
extern int debug;
/**
* Call no markers.
*/
extern bool markers;
/**
* Snapshot all render targets plus depth/stencil.
*/
extern bool snapshotMRT;
/**
* Whether to include alpha in snapshots.
*/
extern bool snapshotAlpha;
/**
* Whether to force windowed. Recommeded, as there is no guarantee that the
* original display mode is available.
*/
extern bool forceWindowed;
/**
* Whether to ignore the call's recorded return value. For a call like
* glx/wglMakeCurrent() it means that if the call failed during recording and
* returned FALSE, we ignore that at replay time and try to execute the
* glx/wglMakeCurrent() normally (instead of no-oping it).
*/
extern bool ignoreRetvals;
extern bool contextCheck;
/**
* Add profiling data to the dump when retracing.
*/
extern unsigned curPass;
extern unsigned numPasses;
extern bool profilingWithBackends;
extern char* profilingCallsMetricsString;
extern char* profilingFramesMetricsString;
extern char* profilingDrawCallsMetricsString;
extern bool profilingListMetrics;
extern bool profilingNumPasses;
extern bool profiling;
extern bool profilingCpuTimes;
extern bool profilingGpuTimes;
extern bool profilingPixelsDrawn;
extern bool profilingMemoryUsage;
/**
* State dumping.
*/
extern bool dumpingState;
extern bool dumpingSnapshots;
enum Driver {
DRIVER_DEFAULT,
DRIVER_HARDWARE, // force hardware
DRIVER_DISCRETE, // force discrete GPU
DRIVER_INTEGRATED, // force integrated GPU
DRIVER_SOFTWARE,
DRIVER_REFERENCE,
DRIVER_NULL,
DRIVER_MODULE,
};
extern Driver driver;
extern const char *driverModule;
extern bool doubleBuffer;
extern unsigned samples;
extern unsigned frameNo;
extern unsigned callNo;
extern trace::DumpFlags dumpFlags;
std::ostream &warning(trace::Call &call);
#ifdef _WIN32
void failed(trace::Call &call, HRESULT hr);
#endif
void checkMismatch(trace::Call &call, const char *expr, trace::Value *traceValue, long actualValue);
void ignore(trace::Call &call);
void unsupported(trace::Call &call);
typedef void (*Callback)(trace::Call &call);
struct Entry {
const char *name;
Callback callback;
};
struct stringComparer {
bool operator() (const char *a, const char *b) const {
return strcmp(a, b) < 0;
}
};
extern const Entry stdc_callbacks[];
class Retracer
{
typedef std::map<const char *, Callback, stringComparer> Map;
Map map;
std::vector<Callback> callbacks;
public:
Retracer() {
addCallbacks(stdc_callbacks);
}
virtual ~Retracer() {}
void addCallback(const Entry *entry);
void addCallbacks(const Entry *entries);
void retrace(trace::Call &call);
};
class Dumper
{
public:
virtual int
getSnapshotCount(void) = 0;
virtual image::Image *
getSnapshot(int n) = 0;
virtual bool
canDump(void) = 0;
virtual void
dumpState(StateWriter &) = 0;
};
extern Dumper *dumper;
void
setFeatureLevel(const char *featureLevel);
void
setUp(void);
void
addCallbacks(retrace::Retracer &retracer);
void
frameComplete(trace::Call &call);
/**
* Flush rendering (called when switching threads).
*/
void
flushRendering(void);
/**
* Finish rendering (called before exiting.)
*/
void
finishRendering(void);
void
waitForInput(void);
void
cleanUp(void);
} /* namespace retrace */