Class SystemMetricsMali
System Metrics Mali class provides access to a wide variety of GPU performance Profiler Counters related to various aspects of device performance. You can use exposed ProfilerRecorderHandle to create relevant ProfilerRecorder to access collected performance data.
Namespace: Unity.Profiling.SystemMetrics
Assembly: Unity.Profiling.SystemMetrics.Mali.dll
Syntax
public class SystemMetricsMaliProperties
Active
Returns true if System Metrics Mali was initialized successfully, false otherwise. This means that System Metrics Mali runs on a device that supports hardware counters.
Declaration
public bool Active { get; }Property Value
| Type | Description | 
|---|---|
| bool | True when System Metrics Mali is available, false otherwise. | 
Category
Returns the ProfilerCategory for all System Metrics Mali counters
Declaration
public ProfilerCategory Category { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerCategory | The ProfilerCategory that all Mali counters belong to. | 
GpuCacheReadLookups
Returns Cache Read Lookups performance counter handler (Mali counter: MaliL2CacheRdLookup).
Declaration
public ProfilerRecorderHandle GpuCacheReadLookups { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
L2 cache read lookup activity. High values relative to external memory reads indicate good cache efficiency. Low cache hit rates may indicate poor data locality or working sets larger than cache capacity.
GpuCacheWriteLookups
Returns Cache Write Lookups performance counter handler (Mali counter: MaliL2CacheWrLookup).
Declaration
public ProfilerRecorderHandle GpuCacheWriteLookups { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
L2 cache write lookup activity. High values relative to external memory writes indicate good cache efficiency. Monitors effectiveness of write combining and cache utilization for output data.
GpuClippedPrimitives
Returns Facing/XY Plane Culled Primitives performance counter handler (Mali counter: MaliGeomFaceXYPlaneCullPrim).
Declaration
public ProfilerRecorderHandle GpuClippedPrimitives { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Primitives culled by facing and XY plane tests (back-facing or out-of-frustum in XY axis). More than 50% culled may indicate out-of-frustum geometry - optimize with better software culling or batching granularity.
GpuClippedPrimitivesPercentage
Returns % Clipped Primitives performance counter handler (Mali counter: MaliGeomFaceXYPlaneCullRate)
Declaration
public ProfilerRecorderHandle GpuClippedPrimitivesPercentage { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
GpuComputeQueueActiveCycles
Returns Compute Queue Cycles performance counter handler (Mali counter: MaliCompQueueActiveCy).
Declaration
public ProfilerRecorderHandle GpuComputeQueueActiveCycles { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Number of cycles the compute processing queue has any workload present, including compute shaders. This provides granular analysis of compute shader workloads separate from vertex processing, enabling targeted optimization of compute-heavy applications.
GpuComputeQueueUtilization
Returns Compute Queue Utilization performance counter handler (Mali counter: MaliCompQueueUtil).
Declaration
public ProfilerRecorderHandle GpuComputeQueueUtilization { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Compute queue utilization as percentage of GPU active time, measuring compute shader processing pressure. This enables analysis of compute-specific bottlenecks separate from vertex shader workloads. High utilization indicates compute-bound performance.
GpuCulledPrimitives
Returns Z Plane Culled Primitives performance counter handler (Mali counter: MaliGeomZPlaneCullPrim).
Declaration
public ProfilerRecorderHandle GpuCulledPrimitives { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Primitives culled by Z plane test (closer than near clip or further than far clip). Significant culling at this stage indicates insufficient application software culling - optimize view frustum culling.
GpuCulledPrimitivesPercentage
Returns % Culled Primitives performance counter handler (Mali counter: MaliGeomZPlaneCullRate)
Declaration
public ProfilerRecorderHandle GpuCulledPrimitivesPercentage { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
GpuCycles
Returns GPU Active Cycles performance counter handler (Mali counter: MaliGPUActiveCy).
Declaration
public ProfilerRecorderHandle GpuCycles { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Shows overall GPU processing load. High values indicate GPU-bound content. If high but individual queues are low, may indicate serialization or dependency issues preventing parallel processing.
GpuCyclesPerPixels
Returns Cycles Per Pixel performance counter handler (Mali counter: MaliGPUCyPerPix)
Declaration
public ProfilerRecorderHandle GpuCyclesPerPixels { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
GpuDivergedInstructions
Returns Diverged Instructions performance counter handler (Mali counter: MaliEngDivergedInstr)
Declaration
public ProfilerRecorderHandle GpuDivergedInstructions { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
GpuEarlyZKills
Returns Early Z Kills performance counter handler (Mali counter: MaliFragEZSKillQd).
Declaration
public ProfilerRecorderHandle GpuEarlyZKills { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Fragment quads killed by early depth/stencil testing before shading. High percentage is generally good as it avoids redundant processing. May indicate opportunity for software culling (portal/occlusion culling) to avoid submitting occluded geometry.
GpuEarlyZTests
Returns Early Z Tests performance counter handler (Mali counter: MaliFragEZSTestQd).
Declaration
public ProfilerRecorderHandle GpuEarlyZTests { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Fragment quads subjected to early depth/stencil testing. High early test rates are efficient as they remove redundant work before shading. Enable depth testing and avoid modifiable coverage for better early test rates.
GpuFragmentCycles
Returns Fragment Queue Cycles performance counter handler (Mali counter: MaliFragQueueActiveCy).
Declaration
public ProfilerRecorderHandle GpuFragmentCycles { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Indicates fragment workload pressure. For good parallelism, should be similar to GPU active cycles. Low values with high GPU cycles may indicate vertex/compute bottleneck. Includes stall time waiting for external memory.
GpuFragmentFPKActiveCycles
Returns Fragment FPK Active Cycles performance counter handler (Mali counter: MaliFragFPKActiveCy)
Declaration
public ProfilerRecorderHandle GpuFragmentFPKActiveCycles { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
GpuFragmentJobs
Returns Fragment Jobs performance counter handler (Mali counter: MaliFragThread).
Declaration
public ProfilerRecorderHandle GpuFragmentJobs { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Fragment shader tasks executed by GPU. High counts indicate fragment processing bottleneck. Optimize with simplified fragment shaders, reduced overdraw, better early-Z utilization, or precision lowering (mediump/lowp).
GpuFragmentUtilization
Returns Fragment Queue Utilization performance counter handler (Mali counter: MaliFragQueueUtil).
Declaration
public ProfilerRecorderHandle GpuFragmentUtilization { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Fragment queue utilization as percentage of GPU active time. For GPU-bound content, the dominant queue should be close to 100%. Low utilization may indicate dependency problems or insufficient fragment work.
GpuInputPrimitives
Returns Input Primitives performance counter handler (Mali counter: MaliGeomTotalPrim).
Declaration
public ProfilerRecorderHandle GpuInputPrimitives { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Total number of input primitives to rendering process. High complexity geometry is expensive as vertices are larger than compressed texels (~32 bytes each). Use dynamic LOD and normal maps to reduce primitive count.
GpuInstructions
Returns Instructions performance counter handler (Mali counter: MaliEngInstr)
Declaration
public ProfilerRecorderHandle GpuInstructions { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
GpuInterruptCycles
Returns GPU Interrupt Cycles performance counter handler (Mali counter: MaliGPUIRQActiveCy).
Declaration
public ProfilerRecorderHandle GpuInterruptCycles { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Cycles when GPU has interrupt pending, waiting for CPU processing. High percentage of GPU active cycles may indicate system integration issues preventing efficient CPU interrupt handling (not typically application-resolvable).
GpuLateZKills
Returns Late Z Kills performance counter handler (Mali counter: MaliFragLZSKillTd).
Declaration
public ProfilerRecorderHandle GpuLateZKills { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Fragment tiles killed by late depth/stencil testing after running some fragment program. High percentage indicates redundant processing. Avoid modifiable coverage and shader depth writes. Always start from cleared values when possible.
GpuLateZTests
Returns Late Z Tests performance counter handler (Mali counter: MaliFragLZSTestTd).
Declaration
public ProfilerRecorderHandle GpuLateZTests { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Fragment tiles tested by late depth/stencil testing. High percentage can cause slow performance as younger fragments can't complete early ZS until older fragments complete late ZS. Avoid modifiable coverage and shader depth writes.
GpuMemoryReadAccesses
Returns Memory Read Accesses performance counter handler (Mali counter: MaliExtBusRd)
Declaration
public ProfilerRecorderHandle GpuMemoryReadAccesses { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
GpuMemoryReadBytes
Returns Memory Read Bytes performance counter handler (Mali counter: MaliExtBusRdBt).
Declaration
public ProfilerRecorderHandle GpuMemoryReadBytes { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
External memory read bandwidth usage. High values indicate memory bandwidth bottleneck. On mobile, ~100MB per frame at 60FPS is sustainable. Reduce texture sizes, buffer sizes, or use compression to optimize.
GpuMemoryReadStallRate
Returns % Memory Read Stalled performance counter handler (Mali counter: MaliExtBusRdStallRate).
Declaration
public ProfilerRecorderHandle GpuMemoryReadStallRate { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Percentage of GPU cycles stalled on external read transactions. High stall rates indicate content requesting more data than memory system can provide. Reduce by minimizing data resource sizes (buffers, textures).
GpuMemoryReadStalledCycles
Returns Memory Read Stalled Cycles performance counter handler (Mali counter: MaliExtBusRdStallCy)
Declaration
public ProfilerRecorderHandle GpuMemoryReadStalledCycles { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
GpuMemoryWriteAccesses
Returns Memory Write Accesses performance counter handler (Mali counter: MaliExtBusWr)
Declaration
public ProfilerRecorderHandle GpuMemoryWriteAccesses { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
GpuMemoryWriteBytes
Returns Memory Write Bytes performance counter handler (Mali counter: MaliExtBusWrBt).
Declaration
public ProfilerRecorderHandle GpuMemoryWriteBytes { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
External memory write bandwidth usage. High values indicate memory bandwidth bottleneck. Accessing external DRAM costs 80-100mW per GB/s. Reduce framebuffer sizes or geometry complexity to optimize.
GpuMemoryWriteStallRate
Returns % Memory Write Stalled performance counter handler (Mali counter: MaliExtBusWrStallRate).
Declaration
public ProfilerRecorderHandle GpuMemoryWriteStallRate { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Percentage of GPU cycles stalled on external write transactions. High stall rates indicate memory bandwidth bottleneck. Reduce by minimizing geometry complexity or framebuffer sizes in memory.
GpuMemoryWriteStalledCycles
Returns Memory Write Stalled Cycles performance counter handler (Mali counter: MaliExtBusWrStallCy)
Declaration
public ProfilerRecorderHandle GpuMemoryWriteStalledCycles { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
GpuPixels
Returns Pixels performance counter handler (Mali counter: MaliGPUPix)
Declaration
public ProfilerRecorderHandle GpuPixels { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
GpuShaderArithmeticCycles
Returns Shader Arithmetic Cycles performance counter handler (Mali counter: MaliALUIssueCy).
Declaration
public ProfilerRecorderHandle GpuShaderArithmeticCycles { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Shader core cycles used on arithmetic operations (ALU). High usage indicates compute-bound shaders. Optimize by reducing complex calculations, using precision lowering (mediump/lowp), or moving computations to vertex stage when possible.
GpuShaderArithmeticUtilization
Returns Shader Arithmetic Utilization performance counter handler (Mali counter: MaliALUUtil).
Declaration
public ProfilerRecorderHandle GpuShaderArithmeticUtilization { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Percentage of shader core cycles spent on arithmetic operations. High utilization indicates compute-bound shaders. Low utilization suggests stalls from memory access or texture sampling. Balance workload distribution and optimize shader complexity.
GpuShaderComputeCycles
Returns Shader Vertex And Compute Cycles performance counter handler (Mali counter: MaliNonFragActiveCy).
Declaration
public ProfilerRecorderHandle GpuShaderComputeCycles { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Number of cycles the compute pipeline is active processing vertex shaders, tessellation, geometry shaders, fixed-function tiling, and compute shaders. This counter includes any cycle where compute work runs in the fixed-function front-end or programmable core. High values indicate vertex/compute-bound workload. For vertex/compute-bound content, should be similar to GPU active cycles.
GpuShaderComputeUtilization
Returns Shader Vertex And Compute Utilization performance counter handler (Mali counter: MaliNonFragUtil).
Declaration
public ProfilerRecorderHandle GpuShaderComputeUtilization { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Percentage of time the compute pipeline is active processing vertex and compute workloads. This counter indicates overall utilization of the compute shader pipeline including vertex shaders, tessellation, geometry shaders, fixed-function tiling, and compute shaders. For vertex/compute-bound content, should approach 100%. Low utilization may indicate insufficient vertex/compute work or dependency issues.
GpuShaderCoreCycles
Returns Shader Core Cycles performance counter handler (Mali counter: MaliCoreActiveCy)
Declaration
public ProfilerRecorderHandle GpuShaderCoreCycles { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
GpuShaderCoreUtilization
Returns Shader Core Utilization performance counter handler (Mali counter: MaliCoreUtil).
Declaration
public ProfilerRecorderHandle GpuShaderCoreUtilization { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Percentage of time any shader core is executing instructions. Lower values indicate GPU utilization bottlenecks - check for CPU serialization, bandwidth limits, texture cache pressure. Higher values suggest compute efficiency.
GpuShaderFragmentCycles
Returns Shader Fragment Cycles performance counter handler (Mali counter: MaliFragActiveCy).
Declaration
public ProfilerRecorderHandle GpuShaderFragmentCycles { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Number of cycles the fragment pipeline is active processing fragment workloads. This counter includes all cycles when at least one fragment task is active anywhere inside the shader core, including the fixed-function fragment frontend, programmable tripipe, or fixed-function fragment backend. For most content, fragments outnumber vertices by orders of magnitude, making this typically the highest processing load.
GpuShaderFragmentUtilization
Returns Shader Fragment Utilization performance counter handler (Mali counter: MaliFragUtil).
Declaration
public ProfilerRecorderHandle GpuShaderFragmentUtilization { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Percentage of time the fragment pipeline is active processing fragment shaders. This counter indicates overall utilization of the fragment pipeline including the fixed-function fragment frontend, programmable tripipe, and fixed-function fragment backend. High utilization indicates fragment-bound performance. For GPU-bound content, the dominant queue should approach 100%. Low utilization may suggest vertex/compute bottleneck.
GpuShaderLoadStoreCycles
Returns Shader Load/Store Cycles performance counter handler (Mali counter: MaliLSIssueCy).
Declaration
public ProfilerRecorderHandle GpuShaderLoadStoreCycles { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Shader core cycles used on memory access (varying/uniform/image/storage buffer operations). High usage suggests memory access bottleneck. Optimize with better data locality, reduced varying count, or cached uniform buffers.
GpuShaderLoadStoreUtilization
Returns Shader Load/Store Utilization performance counter handler (Mali counter: MaliLSUtil).
Declaration
public ProfilerRecorderHandle GpuShaderLoadStoreUtilization { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Percentage of shader core cycles spent on memory load/store operations. High utilization indicates memory access bottleneck. Optimize with reduced varying interpolation, cached uniform buffers, better data locality, or simplified memory access patterns.
GpuShaderTextureCycles
Returns Shader Texture Cycles performance counter handler (Mali counter: MaliTexIssueCy).
Declaration
public ProfilerRecorderHandle GpuShaderTextureCycles { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Shader core cycles used on texture filtering workloads. High usage suggests texture bandwidth bottleneck. Consider reducing texture resolution, using compressed formats, optimizing cache efficiency with texture atlases or tiled rendering.
GpuShaderTextureUtilization
Returns Shader Texture Unit Utilization performance counter handler (Mali counter: MaliTexUtil).
Declaration
public ProfilerRecorderHandle GpuShaderTextureUtilization { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Percentage of shader core cycles spent on texture filtering operations. High utilization indicates texture bandwidth bottleneck. Optimize with compressed texture formats, reduced resolution, better cache locality, or simplified filtering requirements.
GpuTilerCycles
Returns Tiler Cycles performance counter handler (Mali counter: MaliTilerActiveCy).
Declaration
public ProfilerRecorderHandle GpuTilerCycles { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Tiler coordinates geometry processing and provides fixed-function tiling for tile-based rendering. High cycle count doesn't necessarily indicate bottleneck unless non-fragment shader core cycles are comparatively low.
GpuTilerUtilization
Returns Tiler Utilization performance counter handler (Mali counter: MaliTilerUtil).
Declaration
public ProfilerRecorderHandle GpuTilerUtilization { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Tiler utilization as percentage of GPU active time. Measures overall tiler geometry pipeline processing time including aspects of vertex shading and fixed-function tiling. High values may indicate geometry complexity issues.
GpuTiles
Returns Tiles performance counter handler (Mali counter: MaliFragTile)
Declaration
public ProfilerRecorderHandle GpuTiles { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
GpuUnchangedEliminatedTiles
Returns Unchanged Eliminated Tiles performance counter handler (Mali counter: MaliFragTileKill)
Declaration
public ProfilerRecorderHandle GpuUnchangedEliminatedTiles { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
GpuVertexAndComputeCycles
Returns Non Fragment Queue Cycles performance counter handler (Mali counter: MaliNonFragQueueActiveCy).
Declaration
public ProfilerRecorderHandle GpuVertexAndComputeCycles { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Indicates vertex/compute workload pressure. Used for vertex shaders, tessellation, geometry shaders, tiling, and compute shaders. For good parallelism, should be similar to GPU active cycles when vertex/compute bound.
GpuVertexAndComputeUtilization
Returns Non Fragment Queue Utilization performance counter handler (Mali counter: MaliNonFragQueueUtil).
Declaration
public ProfilerRecorderHandle GpuVertexAndComputeUtilization { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Non-fragment queue utilization as percentage of GPU active time. For vertex/compute-bound content, should be close to 100%. Low utilization may indicate insufficient vertex/compute work or dependency issues.
GpuVertexComputeJobs
Returns Vertex And Compute Jobs performance counter handler (Mali counter: MaliNonFragThread).
Declaration
public ProfilerRecorderHandle GpuVertexComputeJobs { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Vertex and compute shader tasks executed by GPU. High counts may indicate vertex processing bottleneck. Optimize with reduced vertex complexity, better LOD systems, or moving calculations to fragment stage when appropriate.
GpuVertexQueueActiveCycles
Returns Vertex Queue Cycles performance counter handler (Mali counter: MaliVertQueueActiveCy).
Declaration
public ProfilerRecorderHandle GpuVertexQueueActiveCycles { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Number of cycles the vertex processing queue has any workload present, including vertex shaders, tessellation, and geometry shaders. This provides more granular analysis than the combined non-fragment queue metrics, allowing separation of vertex and compute workloads.
GpuVertexQueueUtilization
Returns Vertex Queue Utilization performance counter handler (Mali counter: MaliVertQueueUtil).
Declaration
public ProfilerRecorderHandle GpuVertexQueueUtilization { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Vertex queue utilization as percentage of GPU active time, measuring vertex processing pressure. This enables analysis of vertex-specific bottlenecks separate from compute shader workloads. High utilization indicates vertex-bound performance.
GpuVisiblePrimitives
Returns Visible Primitives performance counter handler (Mali counter: MaliGeomVisiblePrim).
Declaration
public ProfilerRecorderHandle GpuVisiblePrimitives { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Primitives surviving all culling stages. All fragments might still be occluded by closer primitives. For efficient 3D content, expect ~50% visibility due to back-face culling. Much higher may indicate disabled facing test.
GpuVisiblePrimitivesPercentage
Returns % Visible Primitives performance counter handler (Mali counter: MaliGeomVisibleRate).
Declaration
public ProfilerRecorderHandle GpuVisiblePrimitivesPercentage { get; }Property Value
| Type | Description | 
|---|---|
| ProfilerRecorderHandle | Use ProfilerRecorderHandle to access counter data with ProfilerRecorder and Valid to check if counter is supported. | 
Remarks
Percentage of primitives visible after culling. Efficient 3D content expects ~50% due to back-face culling. Significantly higher rates may indicate disabled facing test. Lower rates suggest optimization opportunities with better software culling.
Instance
Global SystemMetricsMali class instance to access hardware counters.
Declaration
public static SystemMetricsMali Instance { get; }Property Value
| Type | Description | 
|---|---|
| SystemMetricsMali | 
Methods
GetAvailableCounters(List<ProfilerRecorderHandle>)
Gets all available Mali performance counters on this device.
Declaration
public void GetAvailableCounters(List<ProfilerRecorderHandle> handles)Parameters
| Type | Name | Description | 
|---|---|---|
| List<ProfilerRecorderHandle> | handles | The list to be filled with ProfilerRecorderHandle instances representing available Mali hardware counters. |