[Mesa-dev] [PATCH v2 7/7] nv50: enable GL_AMD_performance_monitor

Samuel Pitoiset samuel.pitoiset at gmail.com
Thu Jul 23 08:26:17 PDT 2015



On 07/23/2015 12:14 AM, Martin Peres wrote:
> On 01/07/15 01:01, Samuel Pitoiset wrote:
>> This exposes a group of global performance counters that enables
>> GL_AMD_performance_monitor. All piglit tests are okay.
>>
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> ---
>>   src/gallium/drivers/nouveau/nv50/nv50_query.c  | 35 
>> ++++++++++++++++++++++++++
>>   src/gallium/drivers/nouveau/nv50/nv50_screen.c |  1 +
>>   src/gallium/drivers/nouveau/nv50/nv50_screen.h |  6 +++++
>>   3 files changed, 42 insertions(+)
>>
>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_query.c 
>> b/src/gallium/drivers/nouveau/nv50/nv50_query.c
>> index 7dadb77..6d57305 100644
>> --- a/src/gallium/drivers/nouveau/nv50/nv50_query.c
>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_query.c
>> @@ -1563,6 +1563,7 @@ nv50_screen_get_driver_query_info(struct 
>> pipe_screen *pscreen,
>>              info->name = cfg->event->name;
>>            info->query_type = NV50_HW_PM_QUERY(id);
>> +         info->group_id = NV50_HW_PM_QUERY_GROUP;
>>            info->max_value.u64 =
>>               (cfg->event->display == NV50_HW_PM_EVENT_DISPLAY_RATIO) 
>> ? 100 : 0;
>>            return 1;
>> @@ -1573,6 +1574,40 @@ nv50_screen_get_driver_query_info(struct 
>> pipe_screen *pscreen,
>>      return 0;
>>   }
>>   +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;
>> +
>> +   // TODO: Check DRM version when nvif will be merged in libdrm!
>> +   if (screen->base.perfmon) {
>> +      count++; /* NV50_HW_PM_QUERY_GROUP */
>> +   }
>> +
>> +   if (!info)
>> +      return count;
>> +
>> +   if (id == NV50_HW_PM_QUERY_GROUP) {
>> +      if (screen->base.perfmon) {
>> +         info->name = "Global performance counters";
>> +         info->type = PIPE_DRIVER_QUERY_GROUP_TYPE_GPU;
>> +         info->num_queries = NV50_HW_PM_QUERY_COUNT;
>> +         info->max_active_queries = 1; /* TODO: get rid of this 
>> limitation! */
>> +         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;
>> +   info->type = 0;
>> +   return 0;
>> +}
>> +
>>   void
>>   nv50_init_query_functions(struct nv50_context *nv50)
>>   {
>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c 
>> b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>> index ac1acd1..05f921d 100644
>> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>> @@ -749,6 +749,7 @@ nv50_screen_create(struct nouveau_device *dev)
>>      pscreen->get_shader_param = nv50_screen_get_shader_param;
>>      pscreen->get_paramf = nv50_screen_get_paramf;
>>      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 69127c0..807ae0e 100644
>> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.h
>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.h
>> @@ -114,6 +114,9 @@ nv50_screen(struct pipe_screen *screen)
>>      return (struct nv50_screen *)screen;
>>   }
>>   +/* Hardware global performance counters groups. */
>> +#define NV50_HW_PM_QUERY_GROUP 0
>> +
>>   /* Hardware global performance counters. */
>>   #define NV50_HW_PM_QUERY_COUNT  24
>>   #define NV50_HW_PM_QUERY(i)    (PIPE_QUERY_DRIVER_SPECIFIC + (i))
>> @@ -146,6 +149,9 @@ 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 *);
>> +
>>   boolean nv50_blitter_create(struct nv50_screen *);
>>   void nv50_blitter_destroy(struct nv50_screen *);
> Everything looks good to me! Excellent work Samuel!
>
> Reviewed-by: Martin Peres <martin.peres at free.fr>

Thanks for reviewing all the series martin.

>
> IIRC, the kernel patches were supposed to land in 4.2 as there was no 
> pull request from Ben, it will likely end up in 4.3. As for the libdrm 
> patches, did you review them? Looking forward to seeing this series 
> merged!

Yeah, I hope they will be merged in 4.3. Anyway, Ben still have to 
review the software methods interface and to add support of nvif in libdrm.
I'll ping him in the next few days. :)

>
> It would also be nice to start a discussion to rework the Gallium HUD 
> to avoid the stupid problem that we have where we can only monitor one 
> signal at a time!

Yeah, this is going to be a bit hard to rework but that's required to 
monitor more than only one hardware global performance counters.

>
> Congrats again Samuel!



More information about the mesa-dev mailing list