1/* //device/apps/Quake/quake/src/QW/client/main.c
2**
3** Copyright 2007, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9**     http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18#include <stdio.h>
19#include <assert.h>
20
21#define LOG_TAG "Quake"
22
23#include <GLES/gl.h>
24#include <utils/Log.h>
25#include <utils/Timers.h>
26
27#include <quakedef.h>
28
29// Timer utilities
30
31#define ENABLE_PMP
32#define USE_LOG
33
34#ifdef ENABLE_PMP
35
36static nsecs_t baseTime;
37static nsecs_t lastTime;
38static const unsigned int kStartTimeStackSize = 100;
39static nsecs_t startTimes[kStartTimeStackSize];
40static unsigned int startTimeStackPointer;
41
42static
43void PMP_Common(const char* fmt, va_list ap, char type)
44{
45	char buf[1024];
46	vsnprintf(buf, sizeof(buf), fmt, ap);
47	va_end(ap);
48
49	// Note: Timer acually has less than microsecond resolution, so track time in microseconds:
50
51	nsecs_t time = systemTime(SYSTEM_TIME_THREAD) / 1000;
52	if(baseTime == 0)
53	{
54		baseTime = time;
55	}
56	time -= baseTime;
57	switch(type)
58	{
59	case '<':
60		{
61			if(startTimeStackPointer < kStartTimeStackSize)
62			{
63				startTimes[startTimeStackPointer] = time;
64			}
65#ifdef USE_LOG
66			ALOGI("< %lld [%d] %s\n", time, startTimeStackPointer, buf);
67#else
68			fprintf(stderr, "Quake < %lld %d %s\n", time, startTimeStackPointer, buf);
69#endif
70			startTimeStackPointer++;
71		}
72		break;
73	case '>':
74		{
75			nsecs_t elapsed = 0;
76			if(startTimeStackPointer > 0)
77			{
78				--startTimeStackPointer;
79				if(startTimeStackPointer < kStartTimeStackSize)
80				{
81					elapsed = time - startTimes[startTimeStackPointer];
82				}
83			}
84#ifdef USE_LOG
85			ALOGI("> %lld [%d] %lld %s\n", time, startTimeStackPointer, elapsed, buf);
86#else
87			fprintf(stderr, "Quake > %lld [%d] %lld %s\n", time, startTimeStackPointer, elapsed, buf);
88#endif
89		}
90		break;
91	default:
92#ifdef USE_LOG
93		ALOGI("= %lld %lld %s\n", time, time - lastTime, buf);
94#else
95		fprintf(stderr, "Quake = %lld %s\n", time, buf);
96#endif
97		break;
98	}
99	lastTime = time;
100}
101
102void PMP_Begin(const char* fmt,...)
103{
104	va_list ap;
105	va_start(ap, fmt);
106	PMP_Common(fmt, ap, '<');
107}
108
109void PMP_Event(const char* fmt,...)
110{
111	va_list ap;
112	va_start(ap, fmt);
113	PMP_Common(fmt, ap, '=');
114}
115
116void PMP_End(const char* fmt,...)
117{
118	va_list ap;
119	va_start(ap, fmt);
120	PMP_Common(fmt, ap, '>');
121}
122
123#endif // ENABLE_PMP
124