1 /****************************************************************************
2 * Copyright (C) 2014-2015 Intel Corporation. All Rights Reserved.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 ****************************************************************************/
23
24 #pragma once
25 #include "knobs.h"
26
27 #include "common/os.h"
28 #include "common/rdtsc_buckets.h"
29
30 #include <vector>
31
32 enum CORE_BUCKETS
33 {
34 APIClearRenderTarget,
35 APIDraw,
36 APIDrawWakeAllThreads,
37 APIDrawIndexed,
38 APIDispatch,
39 APIStoreTiles,
40 APIGetDrawContext,
41 APISync,
42 APIWaitForIdle,
43 FEProcessDraw,
44 FEProcessDrawIndexed,
45 FEFetchShader,
46 FEVertexShader,
47 FEHullShader,
48 FETessellation,
49 FEDomainShader,
50 FEGeometryShader,
51 FEStreamout,
52 FEPAAssemble,
53 FEBinPoints,
54 FEBinLines,
55 FEBinTriangles,
56 FETriangleSetup,
57 FEViewportCull,
58 FEGuardbandClip,
59 FEClipPoints,
60 FEClipLines,
61 FEClipTriangles,
62 FECullZeroAreaAndBackface,
63 FECullBetweenCenters,
64 FEEarlyRastEnter,
65 FEEarlyRastExit,
66 FEProcessStoreTiles,
67 FEProcessInvalidateTiles,
68 WorkerWorkOnFifoBE,
69 WorkerFoundWork,
70 BELoadTiles,
71 BEDispatch,
72 BEClear,
73 BERasterizeLine,
74 BERasterizeTriangle,
75 BETriangleSetup,
76 BEStepSetup,
77 BECullZeroArea,
78 BEEmptyTriangle,
79 BETrivialAccept,
80 BETrivialReject,
81 BERasterizePartial,
82 BEPixelBackend,
83 BESetup,
84 BEBarycentric,
85 BEEarlyDepthTest,
86 BEPixelShader,
87 BESingleSampleBackend,
88 BEPixelRateBackend,
89 BESampleRateBackend,
90 BENullBackend,
91 BELateDepthTest,
92 BEOutputMerger,
93 BEStoreTiles,
94 BEEndTile,
95
96 NumBuckets
97 };
98
99 void rdtscReset();
100 void rdtscInit(int threadId);
101 void rdtscStart(uint32_t bucketId);
102 void rdtscStop(uint32_t bucketId, uint32_t count, uint64_t drawId);
103 void rdtscEvent(uint32_t bucketId, uint32_t count1, uint32_t count2);
104 void rdtscEndFrame();
105
106 #ifdef KNOB_ENABLE_RDTSC
107 #define RDTSC_RESET() rdtscReset()
108 #define RDTSC_INIT(threadId) rdtscInit(threadId)
109 #define RDTSC_START(bucket) rdtscStart(bucket)
110 #define RDTSC_STOP(bucket, count, draw) rdtscStop(bucket, count, draw)
111 #define RDTSC_EVENT(bucket, count1, count2) rdtscEvent(bucket, count1, count2)
112 #define RDTSC_ENDFRAME() rdtscEndFrame()
113 #else
114 #define RDTSC_RESET()
115 #define RDTSC_INIT(threadId)
116 #define RDTSC_START(bucket)
117 #define RDTSC_STOP(bucket, count, draw)
118 #define RDTSC_EVENT(bucket, count1, count2)
119 #define RDTSC_ENDFRAME()
120 #endif
121
122 extern std::vector<uint32_t> gBucketMap;
123 extern BucketManager gBucketMgr;
124 extern BUCKET_DESC gCoreBuckets[];
125 extern uint32_t gCurrentFrame;
126 extern bool gBucketsInitialized;
127
rdtscReset()128 INLINE void rdtscReset()
129 {
130 gCurrentFrame = 0;
131 gBucketMgr.ClearThreads();
132 }
133
rdtscInit(int threadId)134 INLINE void rdtscInit(int threadId)
135 {
136 // register all the buckets once
137 if (!gBucketsInitialized && (threadId == 0))
138 {
139 gBucketMap.resize(NumBuckets);
140 for (uint32_t i = 0; i < NumBuckets; ++i)
141 {
142 gBucketMap[i] = gBucketMgr.RegisterBucket(gCoreBuckets[i]);
143 }
144 gBucketsInitialized = true;
145 }
146
147 std::string name = threadId == 0 ? "API" : "WORKER";
148 gBucketMgr.RegisterThread(name);
149 }
150
rdtscStart(uint32_t bucketId)151 INLINE void rdtscStart(uint32_t bucketId)
152 {
153 uint32_t id = gBucketMap[bucketId];
154 gBucketMgr.StartBucket(id);
155 }
156
rdtscStop(uint32_t bucketId,uint32_t count,uint64_t drawId)157 INLINE void rdtscStop(uint32_t bucketId, uint32_t count, uint64_t drawId)
158 {
159 uint32_t id = gBucketMap[bucketId];
160 gBucketMgr.StopBucket(id);
161 }
162
rdtscEvent(uint32_t bucketId,uint32_t count1,uint32_t count2)163 INLINE void rdtscEvent(uint32_t bucketId, uint32_t count1, uint32_t count2)
164 {
165 uint32_t id = gBucketMap[bucketId];
166 gBucketMgr.AddEvent(id, count1);
167 }
168
rdtscEndFrame()169 INLINE void rdtscEndFrame()
170 {
171 gCurrentFrame++;
172
173 if (gCurrentFrame == KNOB_BUCKETS_START_FRAME && KNOB_BUCKETS_START_FRAME < KNOB_BUCKETS_END_FRAME)
174 {
175 gBucketMgr.StartCapture();
176 }
177
178 if (gCurrentFrame == KNOB_BUCKETS_END_FRAME && KNOB_BUCKETS_START_FRAME < KNOB_BUCKETS_END_FRAME)
179 {
180 gBucketMgr.StopCapture();
181 gBucketMgr.PrintReport("rdtsc.txt");
182 }
183 }
184