23 #include "precompiled.h"
161 const double RESYNC_PERIOD = 1.0;
165 if (
m_Frames.empty() || now >
m_Frames.back().syncTimeStart + RESYNC_PERIOD)
167 PROFILE2(
"profile timestamp resync");
201 event.isEnter = isEnter;
206 frame.events.push_back(event);
229 pglGetQueryObjectivARB(frame.
events.back().query, GL_QUERY_RESULT_AVAILABLE, &available);
236 for (
size_t i = 0; i < frame.
events.size(); ++i)
239 pglGetQueryObjectui64v(frame.
events[i].query, GL_QUERY_RESULT, &queryTimestamp);
250 if (frame.
events[i].isEnter)
268 for (
size_t i = 0; i < frame.events.size(); ++i)
354 if (!frame.events.empty())
363 event.isEnter = isEnter;
368 frame.events.push_back(event);
390 pglGetQueryObjectivARB(frame.
events.back().query, GL_QUERY_RESULT_AVAILABLE, &available);
400 for (
size_t i = 0; i < frame.
events.size(); ++i)
402 if (frame.
events[i].isEnter)
413 pglGetQueryObjectui64vEXT(frame.
events[i].query, GL_QUERY_RESULT, &queryElapsed);
416 t += (double)queryElapsed / 1e9;
427 for (
size_t i = 0; i < frame.events.size(); ++i)
491 #define INTEL_PERFQUERIES_NONBLOCK 0x83FA
492 #define INTEL_PERFQUERIES_BLOCK 0x83FB
493 #define INTEL_PERFQUERIES_TYPE_UNSIGNED_INT 0x9402
494 #define INTEL_PERFQUERIES_TYPE_UNSIGNED_INT64 0x9403
495 #define INTEL_PERFQUERIES_TYPE_FLOAT 0x9404
496 #define INTEL_PERFQUERIES_TYPE_BOOL 0x9406
517 for (
size_t j = 0; j <
m_QueryTypes[i].freeQueries.size(); ++j)
518 pglDeletePerfQueryINTEL(
m_QueryTypes[i].freeQueries[j]);
548 event.isEnter =
true;
553 pglBeginPerfQueryINTEL(
id);
555 event.queries.push_back(
id);
558 frame.activeRegions.push_back(frame.events.size());
560 frame.events.push_back(event);
568 ENSURE(!frame.activeRegions.empty());
569 SEvent& activeEvent = frame.events[frame.activeRegions.back()];
573 pglEndPerfQueryINTEL(activeEvent.queries[i]);
577 frame.activeRegions.pop_back();
581 event.isEnter =
false;
582 frame.events.push_back(event);
593 pglCreatePerfQueryINTEL(
m_QueryTypes[queryIdx].queryTypeId, &
id);
616 for (
size_t i = 0; i < frame.
events.size(); ++i)
618 if (!frame.
events[i].isEnter)
630 std::stack<double> endTimes;
634 for (
size_t i = 0; i < frame.
events.size(); ++i)
636 if (frame.
events[i].isEnter)
643 double elapsed = 0.0;
648 char* buf =
new char[
m_QueryTypes[j].counterBufferSize];
651 ENSURE(length == m_QueryTypes[j].counterBufferSize);
655 for (
size_t k = 0; k < m_QueryTypes[j].counters.size(); ++k)
663 memcpy(&value, buf + counter.
offset, counter.
size);
670 memcpy(&value, buf + counter.
offset, counter.
size);
673 if (counter.
name ==
"TotalTime")
674 elapsed = (double)value / 1e6;
680 memcpy(&value, buf + counter.
offset, counter.
size);
687 memcpy(&value, buf + counter.
offset, counter.
size);
688 ENSURE(value == 0 || value == 1);
693 debug_warn(L
"unrecognised Intel performance counter type");
700 endTimes.push(lastTime + elapsed);
704 lastTime = endTimes.top();
718 for (
size_t i = 0; i < frame.events.size(); ++i)
719 if (frame.events[i].isEnter)
721 m_QueryTypes[j].freeQueries.push_back(frame.events[i].queries[j]);
728 pglGetFirstPerfQueryIdINTEL(&queryTypeId);
733 GLuint counterBufferSize, numCounters, maxQueries, unknown;
734 pglGetPerfQueryInfoINTEL(queryTypeId,
ARRAY_SIZE(queryName), queryName, &counterBufferSize, &numCounters, &maxQueries, &unknown);
740 query.
name = queryName;
743 for (GLuint counterId = 1; counterId <= numCounters; ++counterId)
745 char counterName[256];
746 char counterDesc[2048];
747 GLuint counterOffset, counterSize, counterUsage, counterType;
749 pglGetPerfCounterInfoINTEL(queryTypeId, counterId,
ARRAY_SIZE(counterName), counterName,
ARRAY_SIZE(counterDesc), counterDesc, &counterOffset, &counterSize, &counterUsage, &counterType, &unknown2);
751 ENSURE(unknown2 == 0 || unknown2 == 1);
754 counter.
name = counterName;
755 counter.
desc = counterDesc;
756 counter.
offset = counterOffset;
757 counter.
size = counterSize;
758 counter.
type = counterType;
764 pglGetNextPerfQueryIdINTEL(queryTypeId, &queryTypeId);
767 }
while (queryTypeId);
774 m_Profiler(profiler), m_ProfilerARB(NULL), m_ProfilerEXT(NULL), m_ProfilerINTEL(NULL)
776 bool enabledARB =
false;
777 bool enabledEXT =
false;
778 bool enabledINTEL =
false;
779 CFG_GET_VAL(
"profiler2.gpu.arb.enable", Bool, enabledARB);
780 CFG_GET_VAL(
"profiler2.gpu.ext.enable", Bool, enabledEXT);
781 CFG_GET_VAL(
"profiler2.gpu.intel.enable", Bool, enabledINTEL);
860 #else // CONFIG2_GLES
863 m_Profiler(profiler), m_ProfilerARB(NULL), m_ProfilerEXT(NULL), m_ProfilerINTEL(NULL)
CProfiler2GPU(CProfiler2 &profiler)
std::vector< GLuint > m_FreeQueries
CProfiler2GPU_ARB_timer_query * m_ProfilerARB
std::deque< SFrame > m_Frames
void RegionLeave(const char *id)
#define UNUSED(param)
mark a function parameter as unused and avoid the corresponding compiler warning. ...
CProfiler2::ThreadStorage m_Storage
#define INTEL_PERFQUERIES_TYPE_FLOAT
void RegionEnter(const char *id)
void AddThreadStorage(ThreadStorage *storage)
static ICounter * counter
CProfiler2GPU_base(CProfiler2 &profiler, const char *name)
#define INTEL_PERFQUERIES_TYPE_BOOL
#define CFG_GET_VAL(name, type, destination)
NONCOPYABLE(CProfiler2GPU_base)
static bool IsSupported()
std::vector< SEvent > events
void RegionLeave(const char *id)
~CProfiler2GPU_ARB_timer_query()
void RecordAttributePrintf(const char *fmt,...) PRINTF_ARGS(2)
static bool IsSupported()
~CProfiler2GPU_timer_query()
#define INTEL_PERFQUERIES_TYPE_UNSIGNED_INT
~CProfiler2GPU_EXT_timer_query()
#define ENSURE(expr)
ensure the expression <expr> evaluates to non-zero.
#define PROFILE2(region)
Starts timing from now until the end of the current scope.
void RecordSyncMarker(double t)
GLint64 syncTimestampStart
New profiler (complementing the older CProfileManager)
CProfiler2GPU_ARB_timer_query(CProfiler2 &profiler)
std::vector< SEvent > events
#define INTEL_PERFQUERIES_TYPE_UNSIGNED_INT64
std::deque< SFrame > m_Frames
#define SAFE_DELETE(p)
delete memory ensuing from new and set the pointer to zero (thus making double-frees safe / a no-op) ...
CProfiler2GPU_timer_query(CProfiler2 &profiler, const char *name)
void RecordRegion(const char *id, bool isEnter)
void Record(EItem type, double t, const char *id)
CProfiler2GPU_INTEL_performance_queries * m_ProfilerINTEL
void RegionEnter(const char *id)
#define INTEL_PERFQUERIES_NONBLOCK
bool ogl_HaveExtension(const char *ext)
check if an extension is supported by the OpenGL implementation.
void RemoveThreadStorage(ThreadStorage *storage)
void RegionLeave(const char *id)
void RecordRegion(const char *id, bool isEnter)
void ogl_WarnIfError()
raise a warning (break into the debugger) if an OpenGL error is pending.
#define debug_warn(expr)
display the error dialog with the given text.
void RegionEnter(const char *id)
CProfiler2GPU_EXT_timer_query(CProfiler2 &profiler)
CProfiler2GPU_EXT_timer_query * m_ProfilerEXT
Class instantiated in every registered thread.
#define INTEL_PERFQUERIES_BLOCK
void RecordFrameStart(double t)