• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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