[Mesa-dev] [PATCH 1/2] nv50: expose two groups of compute-related MP perf counters

Ilia Mirkin imirkin at alum.mit.edu
Fri Nov 20 11:33:00 PST 2015


Series is Acked-by: Ilia Mirkin <imirkin at alum.mit.edu> . TBH I haven't
spent the time to figure out what all this stuff is, but these changes
appear to be internally consistent :)

On Fri, Nov 20, 2015 at 2:28 PM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
> This turns on GL_AMD_performance_monitor.
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
>  src/gallium/drivers/nouveau/nv50/nv50_query.c      | 52 ++++++++++++++++++++++
>  src/gallium/drivers/nouveau/nv50/nv50_query.h      |  6 +++
>  .../drivers/nouveau/nv50/nv50_query_hw_metric.c    |  2 +-
>  .../drivers/nouveau/nv50/nv50_query_hw_sm.c        |  2 +-
>  src/gallium/drivers/nouveau/nv50/nv50_screen.c     |  1 +
>  src/gallium/drivers/nouveau/nv50/nv50_screen.h     |  2 +
>  6 files changed, 63 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_query.c b/src/gallium/drivers/nouveau/nv50/nv50_query.c
> index 6b3e49a..4cd3b61 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_query.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_query.c
> @@ -27,6 +27,8 @@
>  #include "nv50/nv50_context.h"
>  #include "nv50/nv50_query.h"
>  #include "nv50/nv50_query_hw.h"
> +#include "nv50/nv50_query_hw_metric.h"
> +#include "nv50/nv50_query_hw_sm.h"
>
>  static struct pipe_query *
>  nv50_create_query(struct pipe_context *pipe, unsigned type, unsigned index)
> @@ -178,3 +180,53 @@ nv50_screen_get_driver_query_info(struct pipe_screen *pscreen,
>
>     return nv50_hw_get_driver_query_info(screen, id, info);
>  }
> +
> +int
> +nv50_screen_get_driver_query_group_info(struct pipe_screen *pscreen,
> +                                        unsigned id,
> +                                        struct pipe_driver_query_group_info *info)
> +{
> +   struct nv50_screen *screen = nv50_screen(pscreen);
> +   int count = 0;
> +
> +   if (screen->compute)
> +      if (screen->base.class_3d >= NV84_3D_CLASS)
> +         count += 2;
> +
> +   if (!info)
> +      return count;
> +
> +   if (id == NV50_HW_SM_QUERY_GROUP) {
> +      if (screen->compute) {
> +         if (screen->base.class_3d >= NV84_3D_CLASS) {
> +            info->name = "MP counters";
> +
> +            /* Because we can't expose the number of hardware counters needed
> +             * for each different query, we don't want to allow more than one
> +             * active query simultaneously to avoid failure when the maximum
> +             * number of counters is reached. Note that these groups of GPU
> +             * counters are currently only used by AMD_performance_monitor.
> +             */
> +            info->max_active_queries = 1;
> +            info->num_queries = NV50_HW_SM_QUERY_COUNT;
> +            return 1;
> +         }
> +      }
> +   } else
> +   if (id == NV50_HW_METRIC_QUERY_GROUP) {
> +      if (screen->compute) {
> +         if (screen->base.class_3d >= NV84_3D_CLASS) {
> +            info->name = "Performance metrics";
> +            info->max_active_queries = 1;
> +            info->num_queries = NV50_HW_METRIC_QUERY_COUNT;
> +            return 1;
> +         }
> +      }
> +   }
> +
> +   /* user asked for info about non-existing query group */
> +   info->name = "this_is_not_the_query_group_you_are_looking_for";
> +   info->max_active_queries = 0;
> +   info->num_queries = 0;
> +   return 0;
> +}
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_query.h b/src/gallium/drivers/nouveau/nv50/nv50_query.h
> index d990285..bd4c0a3 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_query.h
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_query.h
> @@ -28,6 +28,12 @@ nv50_query(struct pipe_query *pipe)
>     return (struct nv50_query *)pipe;
>  }
>
> +/*
> + * Driver queries groups:
> + */
> +#define NV50_HW_SM_QUERY_GROUP       0
> +#define NV50_HW_METRIC_QUERY_GROUP   1
> +
>  void nv50_init_query_functions(struct nv50_context *);
>
>  #endif
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_query_hw_metric.c b/src/gallium/drivers/nouveau/nv50/nv50_query_hw_metric.c
> index 13dad30..d1bccb9 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_query_hw_metric.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_query_hw_metric.c
> @@ -198,7 +198,7 @@ nv50_hw_metric_get_driver_query_info(struct nv50_screen *screen, unsigned id,
>           if (screen->base.class_3d >= NV84_3D_CLASS) {
>              info->name = nv50_hw_metric_names[id];
>              info->query_type = NV50_HW_METRIC_QUERY(id);
> -            info->group_id = -1;
> +            info->group_id = NV50_HW_METRIC_QUERY_GROUP;
>              return 1;
>           }
>        }
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_query_hw_sm.c b/src/gallium/drivers/nouveau/nv50/nv50_query_hw_sm.c
> index e75b428..8453ce7 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_query_hw_sm.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_query_hw_sm.c
> @@ -408,7 +408,7 @@ nv50_hw_sm_get_driver_query_info(struct nv50_screen *screen, unsigned id,
>           if (screen->base.class_3d >= NV84_3D_CLASS) {
>              info->name = nv50_hw_sm_query_names[id];
>              info->query_type = NV50_HW_SM_QUERY(id);
> -            info->group_id = -1;
> +            info->group_id = NV50_HW_SM_QUERY_GROUP;
>              return 1;
>           }
>        }
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> index cc7984d..1e4b75f 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> @@ -790,6 +790,7 @@ nv50_screen_create(struct nouveau_device *dev)
>     pscreen->get_paramf = nv50_screen_get_paramf;
>     pscreen->get_compute_param = nv50_screen_get_compute_param;
>     pscreen->get_driver_query_info = nv50_screen_get_driver_query_info;
> +   pscreen->get_driver_query_group_info = nv50_screen_get_driver_query_group_info;
>
>     nv50_screen_init_resource_functions(pscreen);
>
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.h b/src/gallium/drivers/nouveau/nv50/nv50_screen.h
> index c2a16d8..2a4983d 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.h
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.h
> @@ -117,6 +117,8 @@ nv50_screen(struct pipe_screen *screen)
>
>  int nv50_screen_get_driver_query_info(struct pipe_screen *, unsigned,
>                                        struct pipe_driver_query_info *);
> +int nv50_screen_get_driver_query_group_info(struct pipe_screen *, unsigned,
> +                                            struct pipe_driver_query_group_info *);
>
>  bool nv50_blitter_create(struct nv50_screen *);
>  void nv50_blitter_destroy(struct nv50_screen *);
> --
> 2.5.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list