nv50: expose two groups of compute-related MP perf counters
This turns on GL_AMD_performance_monitor. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Acked-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
@@ -27,6 +27,8 @@
|
|||||||
#include "nv50/nv50_context.h"
|
#include "nv50/nv50_context.h"
|
||||||
#include "nv50/nv50_query.h"
|
#include "nv50/nv50_query.h"
|
||||||
#include "nv50/nv50_query_hw.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 *
|
static struct pipe_query *
|
||||||
nv50_create_query(struct pipe_context *pipe, unsigned type, unsigned index)
|
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);
|
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;
|
||||||
|
}
|
||||||
|
@@ -28,6 +28,12 @@ nv50_query(struct pipe_query *pipe)
|
|||||||
return (struct nv50_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 *);
|
void nv50_init_query_functions(struct nv50_context *);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -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) {
|
if (screen->base.class_3d >= NV84_3D_CLASS) {
|
||||||
info->name = nv50_hw_metric_names[id];
|
info->name = nv50_hw_metric_names[id];
|
||||||
info->query_type = NV50_HW_METRIC_QUERY(id);
|
info->query_type = NV50_HW_METRIC_QUERY(id);
|
||||||
info->group_id = -1;
|
info->group_id = NV50_HW_METRIC_QUERY_GROUP;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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) {
|
if (screen->base.class_3d >= NV84_3D_CLASS) {
|
||||||
info->name = nv50_hw_sm_query_names[id];
|
info->name = nv50_hw_sm_query_names[id];
|
||||||
info->query_type = NV50_HW_SM_QUERY(id);
|
info->query_type = NV50_HW_SM_QUERY(id);
|
||||||
info->group_id = -1;
|
info->group_id = NV50_HW_SM_QUERY_GROUP;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -790,6 +790,7 @@ nv50_screen_create(struct nouveau_device *dev)
|
|||||||
pscreen->get_paramf = nv50_screen_get_paramf;
|
pscreen->get_paramf = nv50_screen_get_paramf;
|
||||||
pscreen->get_compute_param = nv50_screen_get_compute_param;
|
pscreen->get_compute_param = nv50_screen_get_compute_param;
|
||||||
pscreen->get_driver_query_info = nv50_screen_get_driver_query_info;
|
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);
|
nv50_screen_init_resource_functions(pscreen);
|
||||||
|
|
||||||
|
@@ -117,6 +117,8 @@ nv50_screen(struct pipe_screen *screen)
|
|||||||
|
|
||||||
int nv50_screen_get_driver_query_info(struct pipe_screen *, unsigned,
|
int nv50_screen_get_driver_query_info(struct pipe_screen *, unsigned,
|
||||||
struct pipe_driver_query_info *);
|
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 *);
|
bool nv50_blitter_create(struct nv50_screen *);
|
||||||
void nv50_blitter_destroy(struct nv50_screen *);
|
void nv50_blitter_destroy(struct nv50_screen *);
|
||||||
|
Reference in New Issue
Block a user