1 /*---------------------------------------------------------------------------*
2 
3   Copyright (C) Nintendo.  All rights reserved.
4 
5   These coded instructions, statements, and computer programs contain
6   proprietary information of Nintendo of America Inc. and/or Nintendo
7   Company Ltd., and are protected by Federal copyright law.  They may
8   not be disclosed to third parties or copied or duplicated in any form,
9   in whole or in part, without the prior written consent of Nintendo.
10 
11  *---------------------------------------------------------------------------*/
12 
13 // gx2Perf.h
14 //
15 // Declares GPU performance APIs for gx2 library.
16 
17 #ifndef _CAFE_GX2_PERF2_H_
18 #define _CAFE_GX2_PERF2_H_
19 
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23 
24 #include <cafe/mem.h>
25 
26 #define GX2_PERF_DATA_RESERVED_SIZE 0x8a0
27 
28 /// @addtogroup GX2PerfHighStructGroup
29 /// @{
30 
31 /// \brief Function to convert tag id to string
32 ///
33 typedef u32 GX2PerfTag;
34 
35 typedef const char* (*GX2PerfTag2StringFunc)(GX2PerfTag tag);
36 
37 /// \brief Metric result used to return values from result query calls
38 ///
39 typedef union _GX2MetricResult
40 {
41     f32 f32Result;      /// < f32 result
42     u64 u64Result;      /// < u64 result
43 } GX2MetricResult;
44 
45 
46 /// \brief Perf data collection.
47 ///
48 typedef struct _GX2PerfData
49 {
50     u8 reserved[GX2_PERF_DATA_RESERVED_SIZE];
51 } GX2PerfData;
52 
53 #define GX2_INVALID_METRIC_NAME  "invalid_metric_specified"
54 
55 /// \brief Indicates the perf metric type.
56 ///
57 typedef enum _GX2PerfMetricType
58 {
59     GX2_PERF_METRICTYPE_U64,
60     GX2_PERF_METRICTYPE_F32
61 } GX2PerfMetricType;
62 
63 /// @}
64 /// @addtogroup GX2PerfHighResultsGroup
65 /// @{
66 
67 /// \brief This function returns a string with the name of a specified GX2 perf metric.
68 ///
69 /// \donotcall \threadsafe \devonly \enddonotcall
70 ///
GX2GetPerfMetricName(GX2PerfMetric metric)71 GX2_INLINE const char* GX2GetPerfMetricName(GX2PerfMetric metric)
72 {
73     ASSERT(metric <= GX2_PERF_LAST);
74 
75     switch(metric)
76     {
77     case GX2_PERF_U64_TIME:                       return "GX2_PERF_U64_TIME";                     //  0
78     case GX2_PERF_U64_GPU_TIME:                   return "GX2_PERF_U64_GPU_TIME";                 //  1
79     case GX2_PERF_F32_GPU_BUSY:                   return "GX2_PERF_F32_GPU_BUSY";                 //  2
80     case GX2_PERF_F32_SHADER_BUSY:                return "GX2_PERF_F32_SHADER_BUSY";              //  3
81     case GX2_PERF_U64_REUSED_INDICES_VS:          return "GX2_PERF_U64_REUSED_INDICES_VS";        //  4
82     case GX2_PERF_F32_SHADER_BUSY_VS:             return "GX2_PERF_F32_SHADER_BUSY_VS";           //  5
83     case GX2_PERF_F32_SHADER_BUSY_GS:             return "GX2_PERF_F32_SHADER_BUSY_GS";           //  6
84     case GX2_PERF_F32_SHADER_BUSY_PS:             return "GX2_PERF_F32_SHADER_BUSY_PS";           //  7
85     case GX2_PERF_F32_ALU_BUSY:                   return "GX2_PERF_F32_ALU_BUSY";                 //  8
86     case GX2_PERF_F32_TEX_BUSY:                   return "GX2_PERF_F32_TEX_BUSY";                 //  9
87     case GX2_PERF_U64_VS_VERTICES_IN:             return "GX2_PERF_U64_VS_VERTICES_IN";           // 10
88     case GX2_PERF_F32_VS_TEX_INST_COUNT:          return "GX2_PERF_F32_VS_TEX_INST_COUNT";        // 11
89     case GX2_PERF_F32_VS_TEX_BUSY:                return "GX2_PERF_F32_VS_TEX_BUSY";              // 12
90     case GX2_PERF_F32_VS_ALU_INST_COUNT:          return "GX2_PERF_F32_VS_ALU_INST_COUNT";        // 13
91     case GX2_PERF_F32_VS_ALU_BUSY:                return "GX2_PERF_F32_VS_ALU_BUSY";              // 14
92     case GX2_PERF_F32_VS_ALU_EFFICIENCY:          return "GX2_PERF_F32_VS_ALU_EFFICIENCY";        // 15
93     case GX2_PERF_F32_VS_ALU_TEX_RATIO:           return "GX2_PERF_F32_VS_ALU_TEX_RATIO";         // 16
94     case GX2_PERF_F32_GS_TEX_INST_COUNT:          return "GX2_PERF_F32_GS_TEX_INST_COUNT";        // 17
95     case GX2_PERF_F32_GS_TEX_BUSY:                return "GX2_PERF_F32_GS_TEX_BUSY";              // 18
96     case GX2_PERF_F32_GS_ALU_INST_COUNT:          return "GX2_PERF_F32_GS_ALU_INST_COUNT";        // 19
97     case GX2_PERF_F32_GS_ALU_BUSY:                return "GX2_PERF_F32_GS_ALU_BUSY";              // 20
98     case GX2_PERF_F32_GS_ALU_EFFICIENCY:          return "GX2_PERF_F32_GS_ALU_EFFICIENCY";        // 21
99     case GX2_PERF_F32_GS_ALU_TEX_RATIO:           return "GX2_PERF_F32_GS_ALU_TEX_RATIO";         // 22
100     case GX2_PERF_F32_PRIMITIVE_ASSEMBLY_BUSY:    return "GX2_PERF_F32_PRIMITIVE_ASSEMBLY_BUSY";  // 23
101     case GX2_PERF_U64_PRIMITIVES_IN:              return "GX2_PERF_U64_PRIMITIVES_IN";            // 24
102     case GX2_PERF_F32_PA_STALLED_ON_RASTERIZER:   return "GX2_PERF_F32_PA_STALLED_ON_RASTERIZER"; // 25
103     case GX2_PERF_F32_INTERP_BUSY:                return "GX2_PERF_F32_INTERP_BUSY";              // 26
104     case GX2_PERF_U64_PS_PIXELS_IN:               return "GX2_PERF_U64_PS_PIXELS_IN";             // 27
105     case GX2_PERF_F32_PS_TEX_INST_COUNT:          return "GX2_PERF_F32_PS_TEX_INST_COUNT";        // 28
106     case GX2_PERF_F32_PS_TEX_BUSY:                return "GX2_PERF_F32_PS_TEX_BUSY";              // 29
107     case GX2_PERF_F32_PS_ALU_INST_COUNT:          return "GX2_PERF_F32_PS_ALU_INST_COUNT";        // 30
108     case GX2_PERF_F32_PS_ALU_BUSY:                return "GX2_PERF_F32_PS_ALU_BUSY";              // 31
109     case GX2_PERF_F32_PS_ALU_EFFICIENCY:          return "GX2_PERF_F32_PS_ALU_EFFICIENCY";        // 32
110     case GX2_PERF_F32_PS_ALU_TEX_RATIO:           return "GX2_PERF_F32_PS_ALU_TEX_RATIO";         // 33
111     case GX2_PERF_U64_PS_PIXELS_OUT:              return "GX2_PERF_U64_PS_PIXELS_OUT";            // 34
112     case GX2_PERF_F32_PS_EXPORT_STALLS:           return "GX2_PERF_F32_PS_EXPORT_STALLS";         // 35
113     case GX2_PERF_F32_TEX_UNIT_BUSY:              return "GX2_PERF_F32_TEX_UNIT_BUSY";            // 36
114     case GX2_PERF_U64_TEXEL_FETCH_COUNT:          return "GX2_PERF_U64_TEXEL_FETCH_COUNT";        // 37
115     case GX2_PERF_F32_TEX_CACHE_STALLED:          return "GX2_PERF_F32_TEX_CACHE_STALLED";        // 38
116     case GX2_PERF_F32_TEX_MISS_RATE:              return "GX2_PERF_F32_TEX_MISS_RATE";            // 39
117     case GX2_PERF_U64_TEX_MEM_BYTES_READ:         return "GX2_PERF_U64_TEX_MEM_BYTES_READ";       // 40
118     case GX2_PERF_F32_DEPTH_STENCIL_TEST_BUSY:    return "GX2_PERF_F32_DEPTH_STENCIL_TEST_BUSY";  // 41
119     case GX2_PERF_F32_HIZ_TRIVIAL_ACCEPT:         return "GX2_PERF_F32_HIZ_TRIVIAL_ACCEPT";       // 42
120     case GX2_PERF_F32_HIZ_REJECT:                 return "GX2_PERF_F32_HIZ_REJECT";               // 43
121     case GX2_PERF_U64_PRE_Z_SAMPLES_PASSING:      return "GX2_PERF_U64_PRE_Z_SAMPLES_PASSING";    // 44
122     case GX2_PERF_U64_PRE_Z_SAMPLES_FAILING_S:    return "GX2_PERF_U64_PRE_Z_SAMPLES_FAILING_S";  // 45
123     case GX2_PERF_U64_PRE_Z_SAMPLES_FAILING_Z:    return "GX2_PERF_U64_PRE_Z_SAMPLES_FAILING_Z";  // 46
124     case GX2_PERF_U64_POST_Z_SAMPLES_PASSING:     return "GX2_PERF_U64_POST_Z_SAMPLES_PASSING";   // 47
125     case GX2_PERF_U64_POST_Z_SAMPLES_FAILING_S:   return "GX2_PERF_U64_POST_Z_SAMPLES_FAILING_S"; // 48
126     case GX2_PERF_U64_POST_Z_SAMPLES_FAILING_Z:   return "GX2_PERF_U64_POST_Z_SAMPLES_FAILING_Z"; // 49
127     case GX2_PERF_F32_Z_UNIT_STALLED:             return "GX2_PERF_F32_Z_UNIT_STALLED";           // 50
128     case GX2_PERF_U64_PIXELS_AT_CB:               return "GX2_PERF_U64_PIXELS_AT_CB";             // 51
129     case GX2_PERF_U64_PIXELS_CB_MEM_WRITTEN:      return "GX2_PERF_U64_PIXELS_CB_MEM_WRITTEN";    // 52
130     case GX2_PERF_U64_IA_VERTICES:                return "GX2_PERF_U64_IA_VERTICES";              // 53
131     case GX2_PERF_U64_IA_PRIMITIVES:              return "GX2_PERF_U64_IA_PRIMITIVES";            // 54
132     case GX2_PERF_U64_VS_INVOCATIONS:             return "GX2_PERF_U64_VS_INVOCATIONS";           // 55
133     case GX2_PERF_U64_GS_INVOCATIONS:             return "GX2_PERF_U64_GS_INVOCATIONS";           // 56
134     case GX2_PERF_U64_GS_PRIMITIVES:              return "GX2_PERF_U64_GS_PRIMITIVES";            // 57
135     case GX2_PERF_U64_C_INVOCATIONS:              return "GX2_PERF_U64_C_INVOCATIONS";            // 58
136     case GX2_PERF_U64_C_PRIMITIVES:               return "GX2_PERF_U64_C_PRIMITIVES";             // 59
137     case GX2_PERF_U64_PS_INVOCATIONS:             return "GX2_PERF_U64_PS_INVOCATIONS";           // 60
138     case GX2_PERF_U64_PA_INPUT_PRIM:              return "GX2_PERF_U64_PA_INPUT_PRIM";            // 61
139     default:
140         ASSERT(!"GX2 perf table is out of sync" );
141         return GX2_INVALID_METRIC_NAME;
142     }
143 }
144 
145 /// \brief Returns the PerfMetric type given the PerfMetric
146 /// \param metric Metric ID
147 ///
148 /// \return  metric type
149 ///
150 /// \donotcall \threadsafe \devonly \enddonotcall
151 ///
152 GX2PerfMetricType GX2API GX2GetPerfMetricType(GX2PerfMetric metric);
153 
154 /// \brief (deprecated) GX2 Temp API has been renamed. Use GX2GetPerfMetricType instead
155 ///
156 /// GX2TempGetPerfMetricType will be removed completely in a later SDK
157 ///
158 /// \donotcall \threadsafe \devonly \enddonotcall
159 ///
160 #define GX2TempGetPerfMetricType GX2GetPerfMetricType
161 
162 /// @}
163 /// @addtogroup GX2PerfHighSetupGroup
164 /// @{
165 
166 #ifndef GX2_PERFORMANCE_DISABLED
167 /// \brief Initialize a perf collection
168 ///
169 /// \param perfData Perf collection data
170 /// \param maxTags Maximum number of tags in tag list
171 /// \param pAllocator Allocation routines
172 ///
173 /// \donotcall \gx2_typical \userheap \enddonotcall
174 ///
175 void GX2API GX2PerfInit(GX2PerfData *perfData, u32 maxTags, MEMAllocator *pAllocator);
176 
177 /// \brief Free all memory used by the collection (incl. tag list)
178 ///
179 /// \note You must call GX2PerfInit again after making this call
180 /// \param perfData Perf collection data
181 ///
182 /// \donotcall \gx2_typical \userheap \enddonotcall
183 ///
184 void GX2API GX2PerfFree(GX2PerfData *perfData);
185 
186 /// \brief Specify how tag results are collected
187 ///
188 /// \param perfData Perf collection data
189 /// \param method Collection method
190 ///
191 /// \donotcall \threadsafe \devonly \enddonotcall
192 ///
193 void GX2API GX2PerfSetCollectionMethod(GX2PerfData *perfData, GX2PerfCollectionMethod method);
194 
195 /// \brief Get current collection method
196 ///
197 /// \param perfData Perf collection data
198 /// \return Currently set collection method
199 ///
200 /// \donotcall \threadsafe \devonly \enddonotcall
201 ///
202 GX2PerfCollectionMethod GX2API GX2PerfGetCollectionMethod(GX2PerfData *perfData);
203 
204 /// \brief Clear all metrics from the perf collection
205 ///
206 /// \param perfData Perf collection data
207 ///
208 /// \donotcall \threadsafe \devonly \enddonotcall
209 ///
210 void GX2API GX2PerfMetricsClear(GX2PerfData *perfData);
211 
212 /// \brief Enable a desired metric
213 ///
214 /// \param perfData Perf collection data
215 /// \param type Perf type - tells api how to interpret the 'id' parameter
216 /// \param id a GX2PerfMetric if type is GX2_PERF_TYPE_GPU_METRIC or _GX2StatId if type is GX2_PERF_TYPE_GPU_STAT
217 ///
218 /// \return Returns false if metric could not be enabled when there are no available counter slots
219 ///
220 /// \donotcall \threadsafe \devonly \enddonotcall
221 ///
222 GX2Boolean GX2API GX2PerfMetricEnable(GX2PerfData *perfData, GX2PerfType type, u32 id);
223 
224 /// \brief Check if a specific metric/stat is enabled
225 ///
226 /// \param perfData Perf collection data
227 /// \param type Metric type
228 /// \param metricId Metric ID
229 ///
230 /// \donotcall \threadsafe \devonly \enddonotcall
231 ///
232 GX2Boolean GX2API GX2PerfMetricIsEnabled(GX2PerfData *perfData, GX2PerfType type, u32 metricId);
233 
234 /// \brief Iterate through enabled metrics
235 ///
236 /// \param perfData Perf collection data
237 /// \param index Index of the desired metric
238 /// \param type Metric type
239 /// \param metricId Metric information
240 ///
241 /// \note To iterate through all metrics, start with index zero and increment
242 /// index until the function returns GX2_FALSE
243 ///
244 /// \return Returns true if metric does not exceed number of metrics enabled
245 ///
246 /// \donotcall \threadsafe \devonly \enddonotcall
247 ///
248 GX2Boolean GX2API GX2PerfMetricGetEnabled(GX2PerfData *perfData, u32 index, GX2PerfType *type, u32 *metricId);
249 
250 // -----------------
251 // Tag Initialization
252 
253 /// \brief Enable a tag in the tag list
254 ///
255 /// \param perfData Perf collection data
256 /// \param tag Tag to enable
257 /// \param enable GX2_TRUE to enable, GX2_FALSE to disable
258 ///
259 /// \donotcall \threadsafe \devonly \enddonotcall
260 ///
261 void GX2API GX2PerfTagEnable(GX2PerfData *perfData, GX2PerfTag tag, GX2Boolean enable);
262 
263 /// \brief Enable all tags in the tag list
264 ///
265 /// \param perfData Perf collection data
266 ///
267 /// \donotcall \threadsafe \devonly \enddonotcall
268 ///
269 void GX2API GX2PerfTagEnableAll(GX2PerfData *perfData);
270 
271 /// \brief Disable all tags in the tag list
272 ///
273 /// \param perfData Perf collection data
274 ///
275 /// \donotcall \threadsafe \devonly \enddonotcall
276 ///
277 void GX2API GX2PerfTagDisableAll(GX2PerfData *perfData);
278 
279 /// \brief Check if a tag is enabled in a tag list
280 ///
281 /// \param perfData Perf collection data
282 /// \param tag Tag to check
283 ///
284 /// \donotcall \threadsafe \devonly \enddonotcall
285 ///
286 GX2Boolean GX2API GX2PerfTagIsEnabled(GX2PerfData *perfData, GX2PerfTag tag);
287 
288 /// @}
289 /// @addtogroup GX2PerfHighCaptureGroup
290 /// @{
291 
292 // -----------------
293 // Run-time Frame Captures
294 
295 /// \brief Identify beginning of frame
296 ///
297 /// \note Once you call GX2PerfFrameStart, then you cannot change
298 /// the enabled metrics or stats until after you call GX2PerfFrameEnd.
299 /// Otherwise, the result size and offsets will not make any sense with the results.
300 ///
301 /// \param perfData Perf collection data
302 ///
303 /// \donotcall \gx2_typical \userheap \enddonotcall
304 ///
305 void GX2API GX2PerfFrameStart(GX2PerfData *perfData);
306 
307 /// \brief Identify end of frame
308 ///
309 /// \param perfData Perf collection data
310 ///
311 /// \donotcall \threadsafe \devonly \enddonotcall
312 ///
313 void GX2API GX2PerfFrameEnd(GX2PerfData *perfData);
314 
315 /// \brief Get the number of passes needed based on the metrics which are enabled
316 ///
317 /// \param perfData Perf collection data
318 ///
319 /// \return Number of passes needed
320 ///
321 /// \donotcall \threadsafe \devonly \enddonotcall
322 ///
323 u32 GX2API GX2PerfGetNumPasses(GX2PerfData *perfData);
324 
325 /// \brief Configure counters for the current pass
326 ///
327 /// \param perfData Perf collection data
328 ///
329 /// \donotcall \gx2_typical \enddonotcall
330 ///
331 /// \writesgpu
332 /// \alwayswritesgpu
333 ///
334 void GX2API GX2PerfPassStart(GX2PerfData *perfData);
335 
336 /// \brief Needs to be called at the end of a pass
337 ///
338 /// \param perfData Perf collection data
339 ///
340 ///
341 /// \donotcall \gx2_typical \userheap \enddonotcall
342 ///
343 void GX2API GX2PerfPassEnd(GX2PerfData *perfData);
344 
345 /// \brief Mark the start of a user-defined section
346 ///
347 /// \param perfData Perf collection data
348 /// \param tag Section tag
349 ///
350 /// \donotcall \gx2_typical \userheap \enddonotcall
351 ///
352 /// \writesgpu
353 /// \alwayswritesgpu
354 ///
355 void GX2API GX2PerfTagStart(GX2PerfData *perfData, GX2PerfTag tag);
356 
357 /// \brief Mark the end of a user-defined section
358 ///
359 /// \param perfData Perf collection data
360 /// \param tag Section tag
361 ///
362 /// \donotcall \gx2_typical \userheap \enddonotcall
363 ///
364 /// \writesgpu
365 /// \alwayswritesgpu
366 ///
367 void GX2API GX2PerfTagEnd(GX2PerfData *perfData, GX2PerfTag tag);
368 
369 /// @}
370 /// @addtogroup GX2PerfHighResultsGroup
371 /// @{
372 
373 // -----------------
374 // Results
375 ///
376 /// \brief Get a single per-frame metric result
377 ///
378 /// \param perfData Perf collection data
379 /// \param type  type of id (stat or metric)
380 /// \param id Metric or Stat id
381 /// \param pResult result
382 ///
383 /// \return Returns false if that metric was not enabled
384 ///
385 /// \donotcall \threadsafe \devonly \enddonotcall
386 ///
387 GX2Boolean GX2API GX2PerfGetResultByFrame(GX2PerfData *perfData, GX2PerfType type, u32 id, GX2MetricResult *pResult);
388 
389 ///
390 /// \brief Get a single per-tag metric result, by specifying the tag info.
391 ///
392 /// \param perfData Perf collection data
393 /// \param type Metric type
394 /// \param id Metric id
395 /// \param tag Tag id
396 /// \param number Number of tag occurrence
397 /// \param pResult Results
398 ///
399 /// \return Returns false if that metric was not enabled
400 ///
401 /// \donotcall \threadsafe \devonly \enddonotcall
402 ///
403 GX2Boolean GX2API GX2PerfGetResultByTagId(GX2PerfData *perfData, GX2PerfType type, u32 id,
404                                             u32 tag, u32 number, GX2MetricResult *pResult);
405 
406 ///
407 /// \brief Get a single per-tag metric result, by specifying the sequence #.
408 ///
409 /// \param perfData Perf collection data
410 /// \param type Metric type
411 /// \param id Metric id
412 /// \param sequence Sequence number (0 = first tag result, 1 = second, and so on)
413 /// \param tag Tag id
414 /// \param number Number of metric
415 /// \param depth Depth
416 /// \param pResult Results
417 ///
418 /// \return Returns false if that metric was not enabled or if sequence # is beyond max
419 ///
420 /// \donotcall \threadsafe \devonly \enddonotcall
421 ///
422 GX2Boolean GX2API GX2PerfGetResultByTagSequence(GX2PerfData *perfData, GX2PerfType type, u32 id,
423                                          u32 sequence,  u32 *tag, u32 *number, u32 *depth, GX2MetricResult *pResult);
424 
425 /// \brief Convenience function to print results by frame
426 ///
427 /// \param perfData Perf collection data
428 ///
429 /// \donotcall \threadsafe \devonly \enddonotcall
430 ///
431 void GX2API GX2PerfPrintFrameResults(GX2PerfData *perfData);
432 
433 /// \brief Convenience function to print results by tags
434 ///
435 /// \param perfData Perf collection data
436 /// \param func Pointer to function that will convert tags to strings
437 /// If func==NULL, just print tag numbers
438 ///
439 /// \donotcall \threadsafe \devonly \enddonotcall
440 ///
441 void GX2API GX2PerfPrintTagResults(GX2PerfData *perfData, GX2PerfTag2StringFunc func);
442 
443 /// \brief Enable or disable the pass coherency checking. By default, pass coherency checking
444 ///  is disabled.
445 ///
446 /// \param perfData Perf collection data
447 /// \param enable GX2_TRUE to enable, GX2_FALSE to disable
448 ///
449 /// \donotcall \threadsafe \devonly \enddonotcall
450 ///
451 void GX2API GX2PerfSetPassCoherEnable(GX2PerfData *perfData, GX2Boolean enable);
452 
453 /// \brief Get the state of pass coherency checking
454 ///
455 /// \param perfData Perf collection data
456 ///
457 /// \return GX2_TRUE is enabled, GX2_FALSE if disabled
458 ///
459 /// \donotcall \threadsafe \devonly \enddonotcall
460 ///
461 GX2Boolean GX2API GX2PerfGetPassCoherEnable(GX2PerfData *perfData);
462 #else
GX2PerfInit(GX2PerfData * perfData,u32 maxTags,MEMAllocator * pAllocator)463 GX2_INLINE void GX2PerfInit(GX2PerfData *perfData, u32 maxTags, MEMAllocator *pAllocator){ return; }
GX2PerfFree(GX2PerfData * perfData)464 GX2_INLINE void GX2PerfFree(GX2PerfData *perfData){ return; }
GX2PerfSetCollectionMethod(GX2PerfData * perfData,GX2PerfCollectionMethod method)465 GX2_INLINE void GX2PerfSetCollectionMethod(GX2PerfData *perfData, GX2PerfCollectionMethod method){ return; }
GX2PerfGetCollectionMethod(GX2PerfData * perfData)466 GX2_INLINE GX2PerfCollectionMethod GX2PerfGetCollectionMethod(GX2PerfData *perfData){ return GX2_PERF_COLLECT_NONE; }
GX2PerfMetricsClear(GX2PerfData * perfData)467 GX2_INLINE void GX2PerfMetricsClear(GX2PerfData *perfData){ return; }
GX2PerfMetricEnable(GX2PerfData * perfData,GX2PerfType type,u32 id)468 GX2_INLINE GX2Boolean GX2PerfMetricEnable(GX2PerfData *perfData, GX2PerfType type, u32 id){ return GX2_TRUE; }
GX2PerfMetricIsEnabled(GX2PerfData * perfData,GX2PerfType type,u32 metricId)469 GX2_INLINE GX2Boolean GX2PerfMetricIsEnabled(GX2PerfData *perfData, GX2PerfType type, u32 metricId){ return GX2_FALSE; }
GX2PerfMetricGetEnabled(GX2PerfData * perfData,u32 index,GX2PerfType * type,u32 * metricId)470 GX2_INLINE GX2Boolean GX2PerfMetricGetEnabled(GX2PerfData *perfData, u32 index, GX2PerfType *type, u32 *metricId){ return GX2_FALSE; }
GX2PerfTagEnable(GX2PerfData * perfData,GX2PerfTag tag,GX2Boolean enable)471 GX2_INLINE void GX2PerfTagEnable(GX2PerfData *perfData, GX2PerfTag tag, GX2Boolean enable){ return; }
GX2PerfTagEnableAll(GX2PerfData * perfData)472 GX2_INLINE void GX2PerfTagEnableAll(GX2PerfData *perfData){ return; }
GX2PerfTagDisableAll(GX2PerfData * perfData)473 GX2_INLINE void GX2PerfTagDisableAll(GX2PerfData *perfData){ return; }
GX2PerfTagIsEnabled(GX2PerfData * perfData,GX2PerfTag tag)474 GX2_INLINE GX2Boolean GX2PerfTagIsEnabled(GX2PerfData *perfData, GX2PerfTag tag){ return GX2_FALSE; }
GX2PerfFrameStart(GX2PerfData * perfData)475 GX2_INLINE void GX2PerfFrameStart(GX2PerfData *perfData){ return; }
GX2PerfFrameEnd(GX2PerfData * perfData)476 GX2_INLINE void GX2PerfFrameEnd(GX2PerfData *perfData){ return; }
GX2PerfGetNumPasses(GX2PerfData * perfData)477 GX2_INLINE u32 GX2PerfGetNumPasses(GX2PerfData *perfData){ return 0; }
GX2PerfPassStart(GX2PerfData * perfData)478 GX2_INLINE void GX2PerfPassStart(GX2PerfData *perfData){ return; }
GX2PerfPassEnd(GX2PerfData * perfData)479 GX2_INLINE void GX2PerfPassEnd(GX2PerfData *perfData){ return; }
GX2PerfTagStart(GX2PerfData * perfData,GX2PerfTag tag)480 GX2_INLINE void GX2PerfTagStart(GX2PerfData *perfData, GX2PerfTag tag){ return; }
GX2PerfTagEnd(GX2PerfData * perfData,GX2PerfTag tag)481 GX2_INLINE void GX2PerfTagEnd(GX2PerfData *perfData, GX2PerfTag tag){ return; }
GX2PerfGetResultByFrame(GX2PerfData * perfData,GX2PerfType type,u32 id,GX2MetricResult * pResult)482 GX2_INLINE GX2Boolean GX2PerfGetResultByFrame(GX2PerfData *perfData, GX2PerfType type, u32 id, GX2MetricResult *pResult){ return GX2_FALSE; }
GX2PerfGetResultByTagId(GX2PerfData * perfData,GX2PerfType type,u32 id,u32 tag,u32 number,GX2MetricResult * pResult)483 GX2_INLINE GX2Boolean GX2PerfGetResultByTagId(GX2PerfData *perfData, GX2PerfType type, u32 id, u32 tag, u32 number, GX2MetricResult *pResult){ return GX2_FALSE; }
GX2PerfGetResultByTagSequence(GX2PerfData * perfData,GX2PerfType type,u32 id,u32 sequence,u32 * tag,u32 * number,u32 * depth,GX2MetricResult * pResult)484 GX2_INLINE GX2Boolean GX2PerfGetResultByTagSequence(GX2PerfData *perfData, GX2PerfType type, u32 id, u32 sequence,  u32 *tag, u32 *number, u32 *depth, GX2MetricResult *pResult){ return GX2_FALSE; }
GX2PerfPrintFrameResults(GX2PerfData * perfData)485 GX2_INLINE void GX2PerfPrintFrameResults(GX2PerfData *perfData){ return; }
GX2PerfPrintTagResults(GX2PerfData * perfData,GX2PerfTag2StringFunc func)486 GX2_INLINE void GX2PerfPrintTagResults(GX2PerfData *perfData, GX2PerfTag2StringFunc func){ return; }
GX2PerfSetPassCoherEnable(GX2PerfData * perfData,GX2Boolean enable)487 GX2_INLINE void GX2PerfSetPassCoherEnable(GX2PerfData *perfData, GX2Boolean enable){ return; }
GX2PerfGetPassCoherEnable(GX2PerfData * perfData)488 GX2_INLINE GX2Boolean GX2PerfGetPassCoherEnable(GX2PerfData *perfData) { return GX2_FALSE; }
489 #endif
490 /// @}
491 
492 #ifdef __cplusplus
493 }
494 #endif
495 
496 #endif /// _CAFE_GX2_PERF2_H_
497