Home | History | Annotate | Download | only in core
      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     FEProcessStoreTiles,
     65     FEProcessInvalidateTiles,
     66     WorkerWorkOnFifoBE,
     67     WorkerFoundWork,
     68     BELoadTiles,
     69     BEDispatch,
     70     BEClear,
     71     BERasterizeLine,
     72     BERasterizeTriangle,
     73     BETriangleSetup,
     74     BEStepSetup,
     75     BECullZeroArea,
     76     BEEmptyTriangle,
     77     BETrivialAccept,
     78     BETrivialReject,
     79     BERasterizePartial,
     80     BEPixelBackend,
     81     BESetup,
     82     BEBarycentric,
     83     BEEarlyDepthTest,
     84     BEPixelShader,
     85     BESingleSampleBackend,
     86     BEPixelRateBackend,
     87     BESampleRateBackend,
     88     BENullBackend,
     89     BELateDepthTest,
     90     BEOutputMerger,
     91     BEStoreTiles,
     92     BEEndTile,
     93 
     94     NumBuckets
     95 };
     96 
     97 void rdtscReset();
     98 void rdtscInit(int threadId);
     99 void rdtscStart(uint32_t bucketId);
    100 void rdtscStop(uint32_t bucketId, uint32_t count, uint64_t drawId);
    101 void rdtscEvent(uint32_t bucketId, uint32_t count1, uint32_t count2);
    102 void rdtscEndFrame();
    103 
    104 #ifdef KNOB_ENABLE_RDTSC
    105 #define RDTSC_RESET() rdtscReset()
    106 #define RDTSC_INIT(threadId) rdtscInit(threadId)
    107 #define RDTSC_START(bucket) rdtscStart(bucket)
    108 #define RDTSC_STOP(bucket, count, draw) rdtscStop(bucket, count, draw)
    109 #define RDTSC_EVENT(bucket, count1, count2) rdtscEvent(bucket, count1, count2)
    110 #define RDTSC_ENDFRAME() rdtscEndFrame()
    111 #else
    112 #define RDTSC_RESET()
    113 #define RDTSC_INIT(threadId)
    114 #define RDTSC_START(bucket)
    115 #define RDTSC_STOP(bucket, count, draw)
    116 #define RDTSC_EVENT(bucket, count1, count2)
    117 #define RDTSC_ENDFRAME()
    118 #endif
    119 
    120 extern std::vector<uint32_t> gBucketMap;
    121 extern BucketManager gBucketMgr;
    122 extern BUCKET_DESC gCoreBuckets[];
    123 extern uint32_t gCurrentFrame;
    124 extern bool gBucketsInitialized;
    125 
    126 INLINE void rdtscReset()
    127 {
    128     gCurrentFrame = 0;
    129     gBucketMgr.ClearThreads();
    130 }
    131 
    132 INLINE void rdtscInit(int threadId)
    133 {
    134     // register all the buckets once
    135     if (!gBucketsInitialized && (threadId == 0))
    136     {
    137         gBucketMap.resize(NumBuckets);
    138         for (uint32_t i = 0; i < NumBuckets; ++i)
    139         {
    140             gBucketMap[i] = gBucketMgr.RegisterBucket(gCoreBuckets[i]);
    141         }
    142         gBucketsInitialized = true;
    143     }
    144 
    145     std::string name = threadId == 0 ? "API" : "WORKER";
    146     gBucketMgr.RegisterThread(name);
    147 }
    148 
    149 INLINE void rdtscStart(uint32_t bucketId)
    150 {
    151     uint32_t id = gBucketMap[bucketId];
    152     gBucketMgr.StartBucket(id);
    153 }
    154 
    155 INLINE void rdtscStop(uint32_t bucketId, uint32_t count, uint64_t drawId)
    156 {
    157     uint32_t id = gBucketMap[bucketId];
    158     gBucketMgr.StopBucket(id);
    159 }
    160 
    161 INLINE void rdtscEvent(uint32_t bucketId, uint32_t count1, uint32_t count2)
    162 {
    163     uint32_t id = gBucketMap[bucketId];
    164     gBucketMgr.AddEvent(id, count1);
    165 }
    166 
    167 INLINE void rdtscEndFrame()
    168 {
    169     gCurrentFrame++;
    170 
    171     if (gCurrentFrame == KNOB_BUCKETS_START_FRAME && KNOB_BUCKETS_START_FRAME < KNOB_BUCKETS_END_FRAME)
    172     {
    173         gBucketMgr.StartCapture();
    174     }
    175 
    176     if (gCurrentFrame == KNOB_BUCKETS_END_FRAME && KNOB_BUCKETS_START_FRAME < KNOB_BUCKETS_END_FRAME)
    177     {
    178         gBucketMgr.StopCapture();
    179         gBucketMgr.PrintReport("rdtsc.txt");
    180     }
    181 }
    182