Name

    NV_vdpau_interop2

Name Strings

    GL_NV_vdpau_interop2

Contributors

    Manoj Gupta Bonda, NVIDIA
    James Jones, NVIDIA

Contact

    Manoj Gupta Bonda, NVIDIA (mbonda 'at' nvidia.com)

Status

    Complete

Version

    1 (2 Oct 2018)

Number

    OpenGL Extension #593

Dependencies

    This extension is written against the OpenGL 4.6 Specification
    (Compatibility Profile), dated July 30, 2017.
    but can apply to OpenGL 1.1 and up.

    OpenGL 1.1 is required.
    GL_NV_vdpau_interop is required.
    GL_EXT_framebuffer_object affects the definition of this extension.
    GL_ARB_texture_rectangle affects the definition of this extension.
    GL_ARB_texture_non_power_of_two affects the definition of this
    extension.

Overview

    This extension allows VDPAU video surfaces to be used
    either with frame or field structures for texturing and rendering.

IP Status

    There are no known IP issues. 

New Types

    None

New Procedures and Functions


    vdpauSurfaceNV VDPAURegisterVideoSurfaceWithPictureStructureNV (const void *vdpSurface,
                                                                    enum       target,
                                                                    sizei      numTextureNames,
                                                                    const uint *textureNames,
                                                                    boolean    isFrameStructure);

New Tokens

    None

Additions to Chapter 8 of the OpenGL 4.6 (unabridged) Specification
(Textures and Samplers)
    
    Replace the paragraph that begins with 'The command 
    vdpauSurfaceNV VDPAURegisterVideoSurfaceNV' and the following two paragraphs,
    including table 3.8.3.1, with the following:

    The commands
    
        vdpauSurfaceNV VDPAURegisterVideoSurfaceNV (const void *vdpSurface,
                                                    enum       target,
                                                    sizei      numTextureNames,
                                                    const uint *textureNames);

        vdpauSurfaceNV VDPAURegisterVideoSurfaceWithPictureStructureNV (const void *vdpSurface,
                                                                        enum       target,
                                                                        sizei      numTextureNames,
                                                                        const uint *textureNames,
                                                                        boolean    isFrameStructure);

    defines a set of two-dimensional textures, where the image data may
    be taken from the VdpVideoSurface <vdpSurface>. <target> must be
    one of TEXTURE_2D or TEXTURE_RECTANGLE. <numTextureNames>
    determines how many textures are defined. <textureNames> contains
    the names of the textures that are defined. The surface is
    transitioned into the registered state.
    
    VDPAURegisterVideoSurfaceNV is equivalent to calling 
    VDPAURegisterVideoSurfaceWithPictureStructureNV with <isFrameStructure> 
    set to FALSE.

    Legal values for <numTextureNames>,<isFrameStructure> are derived from the
    VdpChromaType of <vdpSurface>, as defined in table 8.7.1.

                                                                                          Internal
      VdpChromaType              numTextureNames  isFrameStructure      Index  Size       Format    Content
      -------------              ---------------  ----------------      -----  ----       --------  -------------------
      VDP_CHROMA_TYPE_420        4                        0             0      w   x h/2  R8        Top-field luma
                                                                        1      w   x h/2  R8        Bottom-field luma
                                                                        2      w/2 x h/4  R8G8      Top-field chroma
                                                                        3      w/2 x h/4  R8G8      Bottom-field chroma
      VDP_CHROMA_TYPE_422        4                        0             0      w   x h/2  R8        Top-field luma
                                                                        1      w   x h/2  R8        Bottom-field luma
                                                                        2      w/2 x h/2  R8G8      Top-field chroma
                                                                        3      w/2 x h/2  R8G8      Bottom-field chroma
      VDP_CHROMA_TYPE_444        4                        0             0      w   x h/2  R8        Top-field luma
                                                                        1      w   x h/2  R8        Bottom-field luma
                                                                        2      w   x h/2  R8G8      Top-field chroma
                                                                        3      w   x h/2  R8G8      Bottom-field chroma
      VDP_CHROMA_TYPE_420        2                        1             0      w   x h    R8        Luma
                                                                        1      w/2 x h/2  R8G8      Chroma
      VDP_CHROMA_TYPE_422        2                        1             0      w   x h    R8        Luma
                                                                        1      w/2 x h    R8G8      Chroma
      VDP_CHROMA_TYPE_444        2                        1             0      w   x h    R8        Luma
                                                                        1      w   x h    R8G8      Chroma
      VDP_CHROMA_TYPE_420_FIELD  4                        0             0      w   x h/2  R8        Top-field luma
                                                                        1      w   x h/2  R8        Bottom-field luma
                                                                        2      w/2 x h/4  R8G8      Top-field chroma
                                                                        3      w/2 x h/4  R8G8      Bottom-field chroma
      VDP_CHROMA_TYPE_422_FIELD  4                        0             0      w   x h/2  R8        Top-field luma
                                                                        1      w   x h/2  R8        Bottom-field luma
                                                                        2      w/2 x h/2  R8G8      Top-field chroma
                                                                        3      w/2 x h/2  R8G8      Bottom-field chroma
      VDP_CHROMA_TYPE_444_FIELD  4                        0             0      w   x h/2  R8        Top-field luma
                                                                        1      w   x h/2  R8        Bottom-field luma
                                                                        2      w   x h/2  R8G8      Top-field chroma
                                                                        3      w   x h/2  R8G8      Bottom-field chroma
      VDP_CHROMA_TYPE_420_FRAME  2                        1             0      w   x h    R8        Luma
                                                                        1      w/2 x h/2  R8G8      Chroma
      VDP_CHROMA_TYPE_422_FRAME  2                        1             0      w   x h    R8        Luma
                                                                        1      w/2 x h    R8G8      Chroma
      VDP_CHROMA_TYPE_444_FRAME  2                        1             0      w   x h    R8        Luma
                                                                        1      w   x h    R8G8      Chroma

      Table 8.7.1: Supported VdpChromaType values, and derived values
      of <numTextureNames>,<isFrameStructure> and texture parameters for 
      each texture.

    VDPAURegisterVideoSurfaceWithPictureStructureNV's return value is a handle 
    used by various other commands detailed in NV_vdpau_interop.


Additions to the AGL/GLX/WGL Specifications

    None

Additions to the OpenGL Shading Language

    None

GLX Protocol

    VDPAU implementations currently only support direct-rendering.
    Consequently, no GLX protocol is currently defined for this
    extension.

Dependencies on GL_ARB_texture_rectangle

    If GL_ARB_texture_rectangle is not supported, TEXTURE_RECTANGLE may
    not be used as target for VDPAURegisterVideoSurfaceWithPictureStructureNV.

Dependencies on GL_ARB_texture_non_power_of_two

    If GL_ARB_texture_non_power_of_two is not supported, only VDPAU
    surfaces with power-of-two size may be used with target TEXTURE_2D.

Errors

    INVALID_OPERATION is generated by 
    VDPAURegisterVideoSurfaceWithPictureStructureNV if the VDPAU driver
    refuses the request for some reason.

    INVALID_OPERATION is generated if any texture named by an entry
    within the <textureNames> parameter of 
    VDPAURegisterVideoSurfaceWithPictureStructureNV is marked as immutable.

    INVALID_VALUE is generated if the VDPAU surface named by the
    <vdpSurface> parameter of VDPAURegisterVideoSurfaceWithPictureStructureNV
    does not have a supported format;
    see table 8.7.1.

New State

    None

New Implementation State

    None

Issues


Revision History

    1. 02 Oct 2018 - Manoj Bonda
        Initial version

    2. 21 Nov 2018 - Manoj Bonda
        Changed status to complete.

