Name

    NV_occlusion_query

Name Strings

    GL_NV_occlusion_query

Contact

    Matt Craighead, NVIDIA Corporation (mcraighead 'at' nvidia.com)

Notice

    Copyright NVIDIA Corporation, 2001, 2002.

IP Status

    NVIDIA Proprietary.

Status

    Shipping (version 1.0)

Version

    NVIDIA Date: February 6, 2002 (version 1.0)
    $Date: 2005/06/02 18:11:48 $ $Revision: 1.1 $
    $Id: occlusion_query.txt,v 1.1 2005/06/02 18:11:48 nightspawn Exp $

Number

    261

Dependencies

    Written based on the wording of the OpenGL 1.3 specification.

    Requires support for the HP_occlusion_test extension.

Overview

    The HP_occlusion_test extension defines a mechanism whereby an
    application can query the visibility of an object, where "visible"
    means that at least one pixel passes the depth and stencil tests.

    The HP extension has two major shortcomings.

    - It returns the result as a simple GL_TRUE/GL_FALSE result, when in
      fact it is often useful to know exactly how many pixels passed.
    - It provides only a simple "stop-and-wait" model for using multiple
      queries.  The application begins an occlusion test and ends it;
      then, at some later point, it asks for the result, at which point
      the driver must stop and wait until the result from the previous
      test is back before the application can even begin the next one.
      This is a very simple model, but its performance is mediocre when
      an application wishes to perform many queries, and it eliminates
      most of the opportunites for parallelism between the CPU and GPU.

    This extension solves both of those problems.  It returns as its
    result the number of pixels that pass, and it provides an interface
    conceptually similar to that of NV_fence that allows applications to
    issue many occlusion queries before asking for the result of any one.
    As a result, they can overlap the time it takes for the occlusion
    query results to be returned with other, more useful work, such as
    rendering other parts of the scene or performing other computations
    on the CPU.

    There are many situations where a pixel count, rather than a boolean
    result, is useful.

    - If the visibility test is an object bounding box being used to
      decide whether to skip the object, sometimes it can be acceptable,
      and beneficial to performance, to skip an object if less than some
      threshold number of pixels could be visible.
    - Knowing the number of pixels visible in the bounding box may also
      help decide what level of detail a model should be drawn with.  If
      only a few pixels are visible, a low-detail model may be
      acceptable.  In general, this allows level-of-detail mechanisms to
      be slightly less ad hoc.
    - "Depth peeling" techniques, such as order-independent transparency,
      would typically like to know when to stop rendering more layers; it
      is difficult to come up with a way to determine a priori how many
      layers to use.  A boolean count allows applications to stop when
      more layers will not affect the image at all, but this will likely
      be unacceptable for performance, with minimal gains to image
      quality.  Instead, it makes more sense to stop rendering when the
      number of pixels goes below a threshold; this should provide better
      results than any of these other algorithms.
    - Occlusion queries can be used as a replacement for glReadPixels of
      the depth buffer to determine whether, say, a light source is
      visible for the purposes of a lens flare effect or a halo to
      simulate glare.  Pixel counts allow you to compute the percentage
      of the light source that is visible, and the brightness of these
      effects can be modulated accordingly.

Issues

    *   Should we use an object-based interface?

        RESOLVED: Yes, this makes the interface much simpler, and it is
        friendly for indirect rendering.

    *   Should we offer an entry point analogous to glTestFenceNV?

        RESOLVED: No, it is sufficient to have glGetOcclusionQueryivNV
        provide a query for whether the occlusion query result is back
        yet.  Whereas it is interesting to poll fence objects, it is
        relatively less interesting to poll occlusion queries.

    *   Is glGetOcclusionQueryuivNV necessary?

        RESOLVED: Yes, it makes using a 32-bit pixel count less painful.

    *   Should there be a limit on how many queries can be outstanding?

        RESOLVED: No.  This would make the extension much more
        difficult to spec and use.  Allowing this does not add any
        significant implementation burden; and even if drivers have some
        internal limit on the number of outstanding queries, it is not
        expected that applications will need to know this to achieve
        optimal or near-optimal performance.

    *   What happens if glBeginOcclusionQueryNV is called when an
        occlusion query is already outstanding for a different object?

        RESOLVED: This is a GL_INVALID_OPERATION error.

    *   What happens if HP_occlusion_test and NV_occlusion_query usage is
        overlapped?

        RESOLVED: The two can be overlapped safely.  Counting is enabled
        if we are _either_ inside a glBeginOcclusionQueryNV or if
        if GL_OCCLUSION_TEST_HP is enabled.  The alternative (producing
        an error) does not work -- it would require that glPopAttrib be
        capable of producing an error, which would be rather problematic.

        Note that glBeginOcclusionQueryNV, not glEndOcclusionQueryNV,
        resets the pixel counter and occlusion test result.  This can
        avoid certain types of strange behavior where an occlusion
        query's pixel count does not always correspond to the pixels
        rendered during the occlusion query.  The spec would make sense
        the other way, but the behavior would be strange.

    *   Does EndOcclusionQuery need to take any parameters?

        RESOLVED: No.  Giving it, for example, an "id" parameter would
        be redundant -- adding complexity for no benefit.  Only one query
        can be active at a time.

    *   How many bits should we require the pixel counter to be, at
        minimum?

        RESOLVED: 24.  24 is enough to handle 8.7 full overdraws of a
        1600x1200 window.  That seems quite sufficient.

    *   What should we do about overflows?

        RESOLVED: Overflows leave the pixel count undefined.  Saturating
        is recommended but not required.

        The ideal behavior really is to saturate.  This ensures that you
        always get a "large" result when you render many pixels.  It also
        ensures that apps which want a boolean test can do one on their
        own, and not worry about the rare case where the result ends up
        exactly at zero from wrapping.

        That being said, with 24 bits of pixel count required, it's not
        clear that this really matters.  It's better to be a bit
        permissive here.  In addition, even if saturation was required,
        the goal of having strictly defined behavior is still not really
        met.

        Applications don't (or at least shouldn't) check for some _exact_
        number of bits.  Imagine if a multitextured app had been written
        that required that the number of texture units supported be
        _exactly_ two!  Implementors of OpenGL would be greatly annoyed
        to find that the app did not run on, say, three-texture or four-
        texture hardware.

        So, we expect apps here to always be doing a "greater than or
        equal to" check.  An app might check for, say, at least 28 bits.
        This doesn't ensure defined behavior -- it only ensures that once
        an overflow occurs (which may happen at any power of two), that
        overflow will be handled with saturation.  This behavior still
        remains sufficiently unpredictable that the reasons for defining
        behavior in even rarely-used cases (preventing compatibility
        problems, for example) are unsatisfied.

        All that having been said, saturation is still explicitly
        recommended in the spec language.

    *   What is the interaction with multisample, which was not defined
        in the original spec?

        RESOLVED: The pixel count is the number of samples that pass, not
        the number of pixels.  This is true even if GL_MULTISAMPLE is
        disabled but GL_SAMPLE_BUFFERS is 1.  Note that the depth/stencil
        test optimization whereby implementations may choose to depth
        test at only one of the samples when GL_MULTISAMPLE is disabled
        does not cause this to become ill-specified, because we are
        counting the number of samples that are still alive _after_ the
        depth test stage.  The mechanism used to decide whether to kill
        or keep those samples is not relevant.

    *   Exactly what stage are we counting at?  The original spec said
        depth test; what does stencil test do?

        RESOLVED: We are counting immediately after _both_ the depth and
        stencil tests, i.e., pixels that pass both.  This was the
        original spec's intent.  Note that the depth test comes after the
        stencil test, so to say that it is the number that pass the depth
        test is reasonable; though it is often helpful to think of the
        depth and stencil tests as being combined, because the depth test
        result impacts the stencil operation used.

    *   Is it guaranteed that occlusion queries return in order?

        RESOLVED: Yes.  It makes sense to do this.  If occlusion test X
        occurred before occlusion query Y, and the driver informs the app
        that occlusion query Y is done, the app can infer that occlusion
        query X is also done.  For applications that do poll, this allows
        them to do so with less effort.

    *   Will polling an occlusion query without a glFlush possibly cause
        an infinite loop?

        RESOLVED: Yes, this is a risk.  If you ask for the result,
        however, any flush required will be done automatically.  It is
        only when you are polling that this is a problem because there is
        no guarantee that a flush has occured in the time since
        glEndOcclusionQueryNV, and the spec is written to say that the
        result is only "available" if the value could be returned
        _instantaneously_.

        This is different from NV_fence, where FinishFenceNV can cause an
        app hang, and where TestFenceNV was also not guaranteed to ever
        finish.

        There need not be any spec language to describe this behavior
        because it is implied by what is already said.

        In short, if you use GL_PIXEL_COUNT_AVAILABLE_NV, you _must_ use
        glFlush, or your app may hang.

    *   The HP_occlusion_test specs did not contain the spec edits that
        explain the exact way the extension works.  Should this spec fill
        in those details?

        RESOLVED: Yes.  These two extensions are intertwined in so many
        important ways that doing so is not optional.

    *   Should there be a "target" parameter to BeginOcclusionQuery?

        RESOLVED: No.  We're not trying to solve the problem of "query
        anything" here.

    *   What might an application that uses this extension look like?

        Here is some rough sample code:

        GLuint occlusionQueries[N];
        GLuint pixelCount;

        glGenOcclusionQueriesNV(N, occlusionQueries);
        ...
        // before this point, render major occluders
        glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
        glDepthMask(GL_FALSE);
        // also disable texturing and any fancy shading features
        for (i = 0; i < N; i++) {
            glBeginOcclusionQueryNV(occlusionQueries[i]);
            // render bounding box for object i
            glEndOcclusionQueryNV();
        }
        // at this point, if possible, go and do some other computation
        glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
        glDepthMask(GL_TRUE);
        // reenable other state
        for (i = 0; i < N; i++) {
            glGetOcclusionQueryuivNV(occlusionQueries[i], GL_PIXEL_COUNT_NV,
                                     &pixelCount);
            if (pixelCount > 0) {
                // render object i
            }
        }

    *   Is this extension useful for saving geometry, fill rate, or both?

        It is expected that it will be most useful for saving geometry
        work, because for the cost of rendering a bounding box you can
        save rendering a normal object.

        It is possible for this extension to help in fill-limited
        situations, but using it may also hurt performance in such
        situations, because rendering the pixels of a bounding box is
        hardly free.  In most situations a bounding box will probably
        have more pixels than the original object.

        One exception is that for objects rendered with multiple passes,
        the first pass can be wrapped with an occlusion query almost for
        free.  That is, render the first pass for all objects in the
        scene, and get the number of pixels rendered on each object.  If
        zero pixels were rendered for an object, you can skip subsequent
        rendering passes.  This trick can be very useful in many cases.

    *   What can be said about guaranteeing correctness when using
        occlusion queries, especially as it relates to invariance?

        Invariance is critical to guarantee the correctness of occlusion
        queries.  If occlusion queries go through a different code path
        than standard rendering, the pixels rendered may be different.

        However, the invariance issues are difficult at best to solve.
        Because of the vagaries of floating-point precision, it is
        difficult to guarantee that rendering a bounding box will render
        at least as many pixels with equal or smaller Z values than the
        object itself would have rendered.

        Likewise, many other aspects of rendering state tend to be
        different when performing an occlusion query.  Color and depth
        writes are typically disabled, as are texturing, vertex programs,
        and any fancy per-pixel math.  So unless all these features have
        guarantees of invariance themselves (unlikely at best), requiring
        invariance for NV_occlusion_query would be futile.

        For what it's worth, NVIDIA's implementation is fully invariant
        with respect to whether an occlusion query is active; that is, it
        does not affect the operation of any other stage of the pipeline.
        (When occlusion queries are being emulated on hardware that does
        not support them, via the emulation registry keys, using an
        occlusion query produces a software rasteriation fallback, and in
        such cases invariance cannot be guaranteed.)

        Another problem that can threaten correctness is near and far
        clipping.  If the bounding box penetrates the near clip plane,
        for example, it may be clipped away, reducing the number of
        pixels counted, when in fact the original object may have stayed
        entirely beyond the near clip plane.  Whenever you design an
        algorithm using occlusion queries, it is best to be careful about
        the near and far clip planes.

    *   How can frame-to-frame coherency help applications using this
        extension get even higher performance?

        Usually, if an object is visible one frame, it will be visible
        the next frame, and if it is not visible, it will not be visible
        the next frame.

        Of course, for most applications, "usually" isn't good enough.
        It is undesirable, but acceptable, to render an object that
        wasn't visible, because that only costs performance.  It is
        generally unacceptable to not render an object that was visible.

        The simplest approach is that visible objects should be checked
        every N frames (where, say, N=5) to see if they have become
        occluded, while objects that were occluded last frame must be
        rechecked again in the current frame to guarantee that they are
        still occluded.  This will reduce the number of wasteful
        occlusion queries by a factor of almost N.

        It may also pay to do a raycast on the CPU in order to try to
        prove that an object is visible.  After all, occlusion queries
        are only one of many items in your bag of tricks to decide
        whether objects are visible or invisible.  They are not an excuse
        to skip frustum culling, or precomputing visibility using portals
        for static environments, or other standard visibility techniques.

        In general, though, taking advantage of frame-to-frame coherency
        in your occlusion query code is absolutely essential to getting
        the best possible performance.

New Procedures and Functions

    void GenOcclusionQueriesNV(sizei n, uint *ids);
    void DeleteOcclusionQueriesNV(sizei n, const uint *ids);
    boolean IsOcclusionQueryNV(uint id);
    void BeginOcclusionQueryNV(uint id);
    void EndOcclusionQueryNV(void);
    void GetOcclusionQueryivNV(uint id, enum pname, int *params);
    void GetOcclusionQueryuivNV(uint id, enum pname, uint *params);

New Tokens

    Accepted by the <cap> parameter of Enable, Disable, and IsEnabled,
    and by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv,
    and GetDoublev:

        OCCLUSION_TEST_HP                              0x8165

    Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
    GetFloatv, and GetDoublev:

        OCCLUSION_TEST_RESULT_HP                       0x8166
        PIXEL_COUNTER_BITS_NV                          0x8864
        CURRENT_OCCLUSION_QUERY_ID_NV                  0x8865

    Accepted by the <pname> parameter of GetOcclusionQueryivNV and
    GetOcclusionQueryuivNV:

        PIXEL_COUNT_NV                                 0x8866
        PIXEL_COUNT_AVAILABLE_NV                       0x8867

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

    None.

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

    None.

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

    Add a new section "Occlusion Tests and Queries" between sections
    4.1.6 and 4.1.7:

    "4.1.6A  Occlusion Tests and Queries

    Occlusion testing keeps track of whether any pixels have passed the
    depth test.  Such testing is enabled or disabled with the generic
    Enable and Disable commands using the symbolic constant
    OCCLUSION_TEST_HP.  The occlusion test result is initially FALSE.

    Occlusion queries can be used to track the exact number of fragments
    that pass the depth test.  Occlusion queries are associated with
    occlusion query objects.  The command

      void GenOcclusionQueriesNV(sizei n, uint *ids);

    returns n previously unused occlusion query names in ids.  These
    names are marked as used, but no object is associated with them until
    the first time BeginOcclusionQueryNV is called on them.  Occlusion
    queries contain one piece of state, a pixel count result.  This pixel
    count result is initialized to zero when the object is created.

    Occlusion queries are deleted by calling

      void DeleteOcclusionQueriesNV(sizei n, const uint *ids);

    ids contains n names of occlusion queries to be deleted.  After an
    occlusion query is deleted, its name is again unused.  Unused names
    in ids are silently ignored.

    An occlusion query can be started and finished by calling

      void BeginOcclusionQueryNV(uint id);
      void EndOcclusionQueryNV(void);

    If BeginOcclusionQueryNV is called with an unused id, that id is
    marked as used and associated with a new occlusion query object.  If
    it is called while another occlusion query is active, an
    INVALID_OPERATION error is generated.  If EndOcclusionQueryNV is
    called while no occlusion query is active, an INVALID_OPERATION error
    is generated.  Calling either GenOCclusionQueriesNV or
    DeleteOcclusionQueriesNV while an occlusion query is active causes an
    INVALID_OPERATION error to be generated.

    When EndOcclusionQueryNV is called, the current pixel counter is
    copied into the active occlusion query object's pixel count result.
    BeginOcclusionQueryNV resets the pixel counter to zero and the
    occlusion test result to FALSE.

    Whenever a fragment reaches this stage and OCCLUSION_TEST_HP is
    enabled or an occlusion query is active, the occlusion test result is
    set to TRUE and the pixel counter is incremented.  If the value of
    SAMPLE_BUFFERS is 1, then the pixel counter is incremented by the
    number of samples whose coverage bit is set; otherwise, it is always
    incremented by one.  If it the pixel counter overflows, i.e., exceeds
    the value 2^PIXEL_COUNTER_BITS_NV-1, its value becomes undefined.
    It is recommended, but not required, that implementations handle this
    overflow case by saturating at 2^PIXEL_COUNTER_BITS_NV-1 and
    incrementing no further.

    The necessary state is a single bit indicating whether the occlusion
    test is enabled, a single bit indicating whether an occlusion query
    is active, the identifier of the currently active occlusion query, a
    counter of no smaller than 24 bits keeping track of the pixel count,
    and a single bit indicating the occlusion test result."

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

    Add to the end of Section 5.4 "Display Lists":

    "DeleteOcclusionQueriesNV, GenOcclusionQueriesNV, IsOcclusionQueryNV,
    GetOcclusionQueryivNV, and GetOcclusionQueryuivNV are not complied
    into display lists but are executed immediately."

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

    Add a new section 6.1.13 "Occlusion Test and Occlusion Queries":

    "The occlusion test result can be queried using GetBooleanv,
    GetIntegerv, GetFloatv, or GetDoublev with a <pname> of
    OCCLUSION_TEST_RESULT_HP.  Whenever such a query is performed, the
    occlusion test result is reset to FALSE and the pixel counter is
    reset to zero as a side effect.

    Which occlusion query is active can be queried using GetBooleanv,
    GetIntegerv, GetFloatv, or GetDoublev with a <pname> of
    CURRENT_OCCLUSION_QUERY_ID_NV.  This query returns the name of the
    currently active occlusion query if one is active, and zero
    otherwise.

    The state of an occlusion query can be queried with the commands

      void GetOcclusionQueryivNV(uint id, enum pname, int *params);
      void GetOcclusionQueryuivNV(uint id, enum pname, uint *params);

    If the occlusion query object named by id is currently active, then
    an INVALID_OPERATION error is generated.

    If <pname> is PIXEL_COUNT_NV, then the occlusion query's pixel count
    result is placed in params.

    Often, occlusion query results will be returned asychronously with
    respect to the host processor's operation.  As a result, sometimes,
    if a pixel count is queried, the host must wait until the result is
    back.  If <pname> is PIXEL_COUNT_AVAILABLE_NV, the value placed in
    params indicates whether or not such a wait would occur if the pixel
    count for that occlusion query were to be queried presently.  A
    result of TRUE means no wait would be required; a result of FALSE
    means that some wait would occur.  The length of this wait is
    potentially unbounded.  It must always be true that if the result for
    one occlusion query is available, the result for all previous
    occlusion queries must also be available at that point in time."

GLX Protocol

    Seven new GL commands are added.

    The following two rendering commands are sent to the server as part
    of a glXRender request:

        BeginOcclusionQueryNV
            2           8               rendering command length
            2           ????            rendering command opcode
            4           CARD32          id

        EndOcclusionQueryNV
            2           4               rendering command length
            2           ????            rendering command opcode

    The remaining fivecommands are non-rendering commands.  These
    commands are sent separately (i.e., not as part of a glXRender or
    glXRenderLarge request), using the glXVendorPrivateWithReply
    request:

        DeleteOcclusionQueriesNV
            1           CARD8           opcode (X assigned)
            1           17              GLX opcode (glXVendorPrivateWithReply)
            2           4+n             request length
            4           ????            vendor specific opcode
            4           GLX_CONTEXT_TAG context tag
            4           INT32           n
            n*4         LISTofCARD32    ids

        GenOcclusionQueriesNV
            1           CARD8           opcode (X assigned)
            1           17              GLX opcode (glXVendorPrivateWithReply)
            2           4               request length
            4           ????            vendor specific opcode
            4           GLX_CONTEXT_TAG context tag
            4           INT32           n
          =>
            1           1               reply
            1                           unused
            2           CARD16          sequence number
            4           n               reply length
            24                          unused
            n*4         LISTofCARD322   queries

        IsOcclusionQueryNV
            1           CARD8           opcode (X assigned)
            1           17              GLX opcode (glXVendorPrivateWithReply)
            2           4               request length
            4           ????            vendor specific opcode
            4           GLX_CONTEXT_TAG context tag
            4           CARD32          id
          =>
            1           1               reply
            1                           unused
            2           CARD16          sequence number
            4           0               reply length
            4           BOOL32          return value
            20                          unused
            1           1               reply

        GetOcclusionQueryivNV
            1           CARD8           opcode (X assigned)
            1           17              GLX opcode (glXVendorPrivateWithReply)
            2           5               request length
            4           ????            vendor specific opcode
            4           GLX_CONTEXT_TAG context tag
            4           CARD32          id
            4           ENUM            pname
          =>
            1           1               reply
            1                           unused
            2           CARD16          sequence number
            4           m               reply length, m=(n==1?0:n)
            4                           unused
            4           CARD32          n

            if (n=1) this follows:

            4           INT32           params
            12                          unused

            otherwise this follows:

            16                          unused
            n*4         LISTofINT32     params

        GetOcclusionQueryuivNV
            1           CARD8           opcode (X assigned)
            1           17              GLX opcode (glXVendorPrivateWithReply)
            2           5               request length
            4           ????            vendor specific opcode
            4           GLX_CONTEXT_TAG context tag
            4           CARD32          id
            4           ENUM            pname
          =>
            1           1               reply
            1                           unused
            2           CARD16          sequence number
            4           m               reply length, m=(n==1?0:n)
            4                           unused
            4           CARD32          n

            if (n=1) this follows:

            4           CARD32          params
            12                          unused

            otherwise this follows:

            16                          unused
            n*4         LISTofCARD32    params

Errors

    The error INVALID_VALUE is generated if GenOcclusionQueriesNV is
    called where n is negative.

    The error INVALID_VALUE is generated if DeleteOcclusionQueriesNV is
    called where n is negative.

    The error INVALID_OPERATION is generated if GenOcclusionQueriesNV or
    DeleteOcclusionQueriesNV is called when an occlusion query is active.

    The error INVALID_OPERATION is generated if BeginOcclusionQueryNV is
    called when an occlusion query is already active.

    The error INVALID_OPERATION is generated if EndOcclusionQueryNV is
    called when an occlusion query is not active.

    The error INVALID_OPERATION is generated if GetOcclusionQueryivNV or
    GetOcclusionQueryuivNV is called where id is not the name of an
    occlusion query.

    The error INVALID_OPERATION is generated if GetOcclusionQueryivNV or
    GetOcclusionQueryuivNV is called where id is the name of the
    currently active occlusion query.

    The error INVALID_ENUM is generated if GetOcclusionQueryivNV or
    GetOcclusionQueryuivNV is called where pname is not either
    PIXEL_COUNT_NV or PIXEL_COUNT_AVAILABLE_NV.

    The error INVALID_OPERATION is generated if any of the commands
    defined in this extension is executed between the execution of Begin
    and the corresponding execution of End.

New State

(table 6.18, p. 226)

    Get Value                      Type    Get Command     Initial Value   Description              Sec     Attribute
    ---------                      ----    -----------     -------------   -----------              ------  ---------
    OCCLUSION_TEST_HP              B       IsEnabled       FALSE           occlusion test enable    4.1.6A  enable
    OCCLUSION_TEST_RESULT_HP       B       GetBooleanv     FALSE           occlusion test result    4.1.6A  -
    -                              B       GetBooleanv     FALSE           occlusion query active   4.1.6A  -
    CURRENT_OCCLUSION_QUERY_ID_NV  Z+      GetIntegerv     0               occlusion query ID       4.1.6A  -
    -                              Z+      -               0               pixel counter            4.1.6A  -

New Implementation Dependent State

(table 6.29, p. 237) Add the following entry:

    Get Value                    Type    Get Command   Minimum Value   Description         Sec     Attribute
    --------------------------   ----    -----------   -------------   ----------------    ------  --------------
    PIXEL_COUNTER_BITS_NV        Z+      GetIntegerv   24              Number of bits in   6.1.13  -
                                                                       pixel counters

Revision History

    none yet
