[Mesa-dev] [PATCH 2/5] mesa: implement GL_NVX_gpu_memory_info

Marek Olšák maraeo at gmail.com
Tue Feb 2 19:33:48 UTC 2016


On Tue, Feb 2, 2016 at 3:36 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> On Tue, Feb 2, 2016 at 8:45 AM, Marek Olšák <maraeo at gmail.com> wrote:
>> From: Marek Olšák <marek.olsak at amd.com>
>>
>> ---
>>  src/mapi/glapi/gen/gl_API.xml    |  8 ++++++++
>>  src/mesa/main/dd.h               | 10 ++++++++++
>>  src/mesa/main/extensions_table.h |  1 +
>>  src/mesa/main/get.c              | 30 ++++++++++++++++++++++++++++++
>>  src/mesa/main/get_hash_params.py |  7 +++++++
>>  src/mesa/main/mtypes.h           |  1 +
>>  6 files changed, 57 insertions(+)
>>
>> diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml
>> index d7ab3bf..09dda19 100644
>> --- a/src/mapi/glapi/gen/gl_API.xml
>> +++ b/src/mapi/glapi/gen/gl_API.xml
>> @@ -12714,6 +12714,14 @@
>>      <enum name="EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD"   value="0x9160"/>
>>  </category>
>>
>> +<category name="GL_NVX_gpu_memory_info" number="438">
>> +    <enum name="GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX"         value="0x9047" />
>> +    <enum name="GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX"   value="0x9048" />
>> +    <enum name="GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX" value="0x9049" />
>> +    <enum name="GPU_MEMORY_INFO_EVICTION_COUNT_NVX"           value="0x904A" />
>> +    <enum name="GPU_MEMORY_INFO_EVICTED_MEMORY_NVX"           value="0x904B" />
>> +</category>
>> +
>>  <xi:include href="INTEL_performance_query.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
>>
>>  <category name="GL_EXT_polygon_offset_clamp" number="460">
>> diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
>> index d4378e5..d34e610 100644
>> --- a/src/mesa/main/dd.h
>> +++ b/src/mesa/main/dd.h
>> @@ -939,6 +939,16 @@ struct dd_function_table {
>>     void (*DispatchCompute)(struct gl_context *ctx, const GLuint *num_groups);
>>     void (*DispatchComputeIndirect)(struct gl_context *ctx, GLintptr indirect);
>>     /*@}*/
>> +
>> +   /**
>> +    * Query information about memory. Device memory is e.g. VRAM. Staging
>> +    * memory is e.g. GART. All sizes are in kilobytes.
>> +    */
>> +   void (*QueryMemoryInfo)(struct gl_context *ctx,
>> +                           unsigned *total_device_memory,
>> +                           unsigned *avail_device_memory,
>> +                           unsigned *total_staging_memory,
>> +                           unsigned *avail_staging_memory);
>>  };
>>
>>
>> diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h
>> index ad5dc60..dfccb73 100644
>> --- a/src/mesa/main/extensions_table.h
>> +++ b/src/mesa/main/extensions_table.h
>> @@ -291,6 +291,7 @@ EXT(NV_texture_barrier                      , NV_texture_barrier
>>  EXT(NV_texture_env_combine4                 , NV_texture_env_combine4                , GLL,  x ,  x ,  x , 1999)
>>  EXT(NV_texture_rectangle                    , NV_texture_rectangle                   , GLL,  x ,  x ,  x , 2000)
>>  EXT(NV_vdpau_interop                        , NV_vdpau_interop                       , GLL, GLC,  x ,  x , 2010)
>> +EXT(NVX_gpu_memory_info                     , NVX_gpu_memory_info                    , GLL, GLC,  x ,  x , 2013)
>
> More like 2009, or even earlier... 2013 is the last modified date, not
> the creation date. Not sure where to get the creation date though.

If you know the exact date, feel free to tell me. Otherwise, I don't
think it's important.

>
>>
>>  EXT(OES_EGL_image                           , OES_EGL_image                          , GLL, GLC, ES1, ES2, 2006) /* FIXME: Mesa expects GL_OES_EGL_image to be available in OpenGL contexts. */
>>  EXT(OES_EGL_image_external                  , OES_EGL_image_external                 ,  x ,  x , ES1, ES2, 2010)
>> diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
>> index 0434836..dbc8605 100644
>> --- a/src/mesa/main/get.c
>> +++ b/src/mesa/main/get.c
>> @@ -449,6 +449,7 @@ EXTRA_EXT(ARB_tessellation_shader);
>>  EXTRA_EXT(ARB_shader_subroutine);
>>  EXTRA_EXT(ARB_shader_storage_buffer_object);
>>  EXTRA_EXT(ARB_indirect_parameters);
>> +EXTRA_EXT(NVX_gpu_memory_info);
>>
>>  static const int
>>  extra_ARB_color_buffer_float_or_glcore[] = {
>> @@ -1080,6 +1081,35 @@ find_custom_value(struct gl_context *ctx, const struct value_desc *d, union valu
>>     case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
>>        v->value_int = ctx->DispatchIndirectBuffer->Name;
>>        break;
>> +   /* GL_NVX_gpu_memory_info */
>> +   case GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX:
>> +   case GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX:
>> +   case GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX:
>> +      {
>> +         unsigned total_device_memory;
>> +         unsigned avail_device_memory;
>> +         unsigned total_staging_memory;
>> +         unsigned avail_staging_memory;
>> +
>> +         ctx->Driver.QueryMemoryInfo(ctx,
>> +                                     &total_device_memory,
>> +                                     &avail_device_memory,
>> +                                     &total_staging_memory,
>> +                                     &avail_staging_memory);
>> +
>> +         if (d->pname == GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX)
>> +            v->value_int = total_device_memory;
>> +         else if (d->pname == GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX)
>> +            v->value_int = total_device_memory + total_staging_memory;
>
> Total memory is unlikely to change at runtime. Should these be ctx->Const.foo?
>
>> +         else if (d->pname == GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX)
>> +            v->value_int = avail_device_memory;
>
> and then this becomes the only thing you need to query?

The current design simplifies the implementation for both extensions.
Since the query is almost free and a one-time thing, I'm not concerned
about performance.

Marek


More information about the mesa-dev mailing list