nv50: expose two groups of compute-related MP perf counters
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Tue, 10 Nov 2015 00:40:00 +0000 (01:40 +0100)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 20 Nov 2015 20:03:14 +0000 (21:03 +0100)
This turns on GL_AMD_performance_monitor.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Acked-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/nouveau/nv50/nv50_query.c
src/gallium/drivers/nouveau/nv50/nv50_query.h
src/gallium/drivers/nouveau/nv50/nv50_query_hw_metric.c
src/gallium/drivers/nouveau/nv50/nv50_query_hw_sm.c
src/gallium/drivers/nouveau/nv50/nv50_screen.c
src/gallium/drivers/nouveau/nv50/nv50_screen.h

index 6b3e49a25a981b2cbdbdf31378238e90521644d0..4cd3b6156067703a212a8e83161cf7f93184eb01 100644 (file)
@@ -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;
+}
index d990285c857679caa27b7a1d02d22b41402fed35..bd4c0a386f6bde1b2412c2b37a690328eef9ef58 100644 (file)
@@ -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
index 13dad30f113ff7a5469a397032cdade1d9226bb3..d1bccb94193090b4c035409686622b3d34d0f10b 100644 (file)
@@ -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;
          }
       }
index e75b428fb12a0b07e73a256807f9888c0c04ac4b..8453ce7609571daa2ecd1d918e989a282a8c2e0e 100644 (file)
@@ -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;
          }
       }
index cc7984d307b16bf1551c37396d4af2f2c5839268..1e4b75f18e039b76d77211a7f6db90b344d2a596 100644 (file)
@@ -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);
 
index c2a16d8bd1d9723ea6adb299961892b6913d9c90..2a4983d102094fe0e5e114593f6ede27bb6599cc 100644 (file)
@@ -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 *);