Skip to content
  • Kenneth Graunke's avatar
    gallium: Add the ability to query a single pipeline statistics counter · d644698b
    Kenneth Graunke authored
    
    
    Gallium historically has treated pipeline statistics queries as a single
    query, PIPE_QUERY_PIPELINE_STATISTICS, which returns a block of 11
    values.  This was originally patterned after the D3D1x API.  Much later,
    Brian introduced an OpenGL extension that exposed these counters - but
    it exposes 11 separate queries, each of which returns a single value.
    
    Today, st/mesa simply queries all 11 values, and returns a single value.
    While pipeline statistics counters aren't typically performance
    critical, this is still not a great fit.  A D3D1x->GL translator might
    request all 11 counters by creating 11 separate GL queries...which
    Gallium would map to reads of all 11 values each time, resulting in a
    total 121 counter reads.  That's not ideal.
    
    This patch adds a new cap, PIPE_CAP_QUERY_PIPELINE_STATISTICS_SINGLE,
    and corresponding query type PIPE_QUERY_PIPELINE_STATISTICS_SINGLE.
    When calling create_query(), q->index should be set to one of the
    PIPE_STAT_QUERY_* enums to select a counter.  Unlike the block query,
    this returns the value in pipe_query_result::u64 (as it's a single
    value) instead of the pipe_query_data_pipeline_statistics group.
    
    We update st/mesa to expose ARB_pipeline_statistics_query if either
    capability is set, preferring the new SINGLE variant when available.
    
    Thanks to Roland, Ilia, and Marek for helping me sort this out.
    
    Reviewed-by: default avatarMarek Olšák <marek.olsak@amd.com>
    Reviewed-by: default avatarTapani Pälli <tapani.palli@intel.com>
    d644698b