Name

    NV_query_resource_tag

Name Strings

    GL_NV_query_resource_tag

Contact

    Kevin Lefebvre, NVIDIA (klefebvre 'at' nvidia.com)

Contributors

Status

    Under review.  Target release in NVIDIA 387.00 drivers.
    NVIDIA's Tegra drivers will not expose this extensions.

Version

    Last Modified Date: May 4, 2017
    Author Revision: 0.2

Number

     OpenGL Extension #512

Dependencies

    OpenGL 2.0 is required.
    GL_NV_query_resource is required.
    The extension is written against the OpenGL 2.0 Specification.

Overview
    
    This extension adds the capability to associate a tag with one or more
    memory resource allocations. This tag can be reported back during
    queryResource operations and also be used to limit resource reporting to
    only those allocations with the specified tag. A tag is a previously
    reserved id and an optional text string.

New Procedures and Functions

    GenQueryResourceTagNV(GLsizei n, GLuint *tagIds)
    DeleteQueryResourceTagNV(GLsizei n, const GLuint *tagIds)
    QueryResourceTagNV(GLuint tagId, const GLchar *tagString)

New Tokens
    
    none

Additions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL Operation)

    none

Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization)

    none

Additions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment
Operations and the Frame Buffer)

    none

Additions to Chapter 5 of the OpenGL 2.0 Specification (Special Functions)

    none

Additions to Chapter 6 of the OpenGL 2.0 Specification (State and
State Requests)

  After the third paragraph of the "Section 6.1.x GPU Query Resource" of the
  GL_NV_query_resource extension add the following:

    The <tagId> parameter determines how the query handles memory allocation
    tagged information. A value of 0 causes the query to not report any tag
    information. A positive value will cause the query to return all memory
    allocations associated with that tag (assuming the tag is valid, an
    invalid tag results in the query responding as if the tagId value was 0).
    A value of -1 will cause the query to return allocations for all tags.
    In addition to the tagId being returned for an allocation the associated
    tag text string will be returned if it exists.

    The bufSize parameter indicates the size of the application provided buffer
    in ints where the query results are returned. The buffer parameter points
    to this return buffer. The commands return value is the number of ints
    written in the return buffer. If the return value is negative then the
    buffer is too small to hold the returned data. If the buffer pointer is
    NULL then the return value specifies the size of buffer needed to hold the
    results from the query call.

  At the end of the "Section 6.1.x GPU Query Resource" of the 
  GL_NV_query_resource extension add the following:
  
    The command GenQueryResourceTagNV returns <n> previously unused query
    resource tag object names in the buffer <tagIds>.  These names are reserved
    as used for the purposes of GenQueryResourceTagNV only, but they acquire
    state only when they are first used by QueryResourceTagNV described below.

    The tag objects are deleted by calling DeleteQueryResourceTagNV where
    <tagIds> contains <n> names of tag objects to be deleted. After a state
    object is deleted it has no contents. Whether the released TagId's will be
    reused is implementation dependent. Unused names in <states> are silently
    ignored, as is the value zero. If a tag object is deleted there may still
    be memory allocations associated with the tagId but queries based on the
    tagId will not report any information.

    The command QueryResourceTagNV creates a query resource tag object
    associated with the name <tagId>. If the <tagString> is non-null then the
    null terminated string will be saved in the tag object (and will be
    reported on a query). If the tagId aready has an associated object with
    it then the new <tagString> will replace the exisiting string. To disable
    tagging (ie. the creating of new objects without a tag) set the <tagId>
    parameter to 0.

Replace the format descriptor in this section with:

    fixedHeader
        fixedBlkSize - size of fixed header
        version - data stream version number (version = 1 at this time)
        devCount - count of devices
    deviceBlk[i] (i from 0 to devCount - 1)
        summaryBlk
            devBlkSize - size of per device info including detail blocks
            summaryBlkSize - summary block size
            numAllocs - number of GL object allocations
            vidmem - size of vidmem in use by GL objects
            vidmemFree - size of vidmem allocated but not in use
            detailCount - number of detail blocks
        detailBlk[j] (j from 0 to detailCount - 1)
            detailBlkSize - size of single detail block
            memType - only vidmem at this time
            objType - GL object type
            numAllocs - number of objects of this objType
            vidmem - amount of memory used for this objType
    tagCount
    tagRecord[k] (k from 0 to tagCount - 1)
        size - size of this tag record entry
        tagId - tag id
        devId - device id this tag resides on
        numAllocs - number of allocations with this tagId
        vidmem - size of vidmem in use by objects with this tagId
        strlen - length of optional tag string (in int's, 0 if no string)
        str - optional null terminated tag string

    note: sizes are in int's

    Stepping through the buffer can be accomplished by:
    
        fixedHeader addr = address of buffer

        deviceBlk[0] addr = fixedHeader addr + fixedBlkSize
          summaryBlk addr = deviceBlk[0] addr
          detailBlk[0] addr = summaryBlk addr + summaryBlkSize
          detailBlk[1] addr = detailBlk[0] addr + detailBlkSize

        deviceBlk[1] addr = deviceBlk[0] addr + devBlockSize

        tagCount addr = deviceBlk[devCount] addr
        tagRecond[0] addr = tagCount + 1

    The intent of the sizes embedded in the stream is to enable backward
    comaptibility. In future extension additions new state added to a block
    will be added at he end. Exisiting buffer decoders wil continue to decode
    the original data and ignore new data by using the sizes to step through
    the buffer.

Errors

    None

New State

    None

Issue:
    1) After a DeleteQueryResourceTag inaddition to deleting the tagString
       and marking the tagId as unused should the tagId be purged from the
       memory allocations. This could be a potentially expensive operation,
       the memory allocation structures need to be walked for every tagId
       in the list while a log is taken. 

       PROPOSED RESOLUTION: Mark the tagId as invalid, ignore invalid tags in
       the QueryResource command, not hand it out in future GenQueryResourceTag
       calls.

Revision History

    Rev.    Date    Author     Changes
    ----  -------- ---------  ------------------------------------------------
    0.1   05/04/17 klefebvre  First draft
    0.2   07/07/17 klefebvre  add tag disable
