Name

    NV_DX_interop2

Name Strings

    WGL_NV_DX_interop2

Contributors

    Nuno Subtil, NVIDIA
    Kedarnath Thangudu, NVIDIA

Contact

    Nuno Subtil, NVIDIA Corporation (nsubtil 'at' nvidia.com)

Status

    Complete. Shipping with NVIDIA release 275 drivers, June 2011.

Version

    Last Modified Date:   October 4, 2011
    Author Revision:      2

Number

    412

Dependencies

    OpenGL 2.1 is required.
    WGL_NV_DX_interop is required.
    Windows Display Driver Model (WDDM) capable operating system 
      (such as Vista or Windows 7) required.
    Direct3D 10-capable GPU required for ID3D10Device usage.
    Direct3D 11-capable GPU required for ID3D11Device usage.

Overview

    This extension expands on the specification of WGL_NV_DX_interop
    to add support for DirectX version 10, 10.1 and 11 resources.

New Procedures and Functions

    None

New Tokens

    None

Additions to the WGL Specification

    None

Additions to the WGL_NV_DX_interop specification

    Add to the description of wglDXSetResourceShareHandleNV:

    wglDXSetResourceShareHandle does not need to be called for DirectX
    version 10 and 11 resources. Calling this function for DirectX 10
    and 11 resources is not an error but has no effect.

    Modify the last paragraph in the description of
    wglDXRegisterObjectNV:
    
    If the application explicitly requests a share handle for a DirectX
    resource, results are undefined (and may include data corruption,
    incorrect DirectX operation or program termination) if
    wglDXRegisterObjectNV is called before calling
    wglDXSetResourceShareHandleNV for the same resource. This
    restriction does not apply to non-WDDM operating systems. This
    restriction also does not apply to DirectX version 10 and 11
    resources.
    
    Add the following supported devices to table wgl.devicetypes:

    -------------------------------------------------------------------------
    DirectX device type      Device Restrictions
    -------------------------------------------------------------------------
    ID3D10Device             can only be used on WDDM operating systems;
                             Must be multithreaded
    ID3D11Device             can only be used on WDDM operating systems;
                             XXX Must be multithreaded
    -------------------------------------------------------------------------
    Table wgl.devicetypes - Valid device types for the <dxDevice> parameter of
    wglDXOpenDeviceNV and associated restrictions.
    -------------------------------------------------------------------------

    Add the following resources to table wgl.objtypes:

    --------------------------------------------------------------------------
    <type>              type of <name>     Valid DirectX resource types
    --------------------------------------------------------------------------
    TEXTURE_1D          texture            ID3D10Texture1D
                                           ID3D11Texture1D
    TEXTURE_1D_ARRAY    texture            ID3D10Texture1D
                                           ID3D11Texture1D
    TEXTURE_2D          texture            ID3D10Texture2D
                                           ID3D11Texture2D
    TEXTURE_2D_ARRAY    texture            ID3D10Texture2D
                                           ID3D11Texture2D
    TEXTURE_3D          texture            ID3D10Texture3D
                                           ID3D11Texture3D
    TEXTURE_CUBE_MAP    texture            ID3D10Texture2D
                                           ID3D11Texture2D
    TEXTURE_RECTANGLE   texture            ID3D10Texture2D
                                           ID3D11Texture2D
    RENDERBUFFER        renderbuffer       ID3D10Texture2D
                                           ID3D11Texture2D
    NONE                buffer             ID3D10Buffer
                                           ID3D11Buffer
    --------------------------------------------------------------------------
    Table wgl.objtypes - Valid values for the <type> parameter of
    wglDXRegisterObjectNV, and associated object types for GL and
    DirectX.
    --------------------------------------------------------------------------

    Add the following resources to table wgl.restrictions:

    --------------------------------------------------------------------------
    Resource Type            Resource Restrictions
    --------------------------------------------------------------------------
    ID3D10Texture1D          Usage flags must be D3D10_USAGE_DEFAULT
    ID3D10Texture2D          Usage flags must be D3D10_USAGE_DEFAULT
    ID3D10Texture3D          Usage flags must be D3D10_USAGE_DEFAULT
    ID3D10Buffer             Usage flags must be D3D10_USAGE_DEFAULT
    ID3D11Texture1D          Usage flags must be D3D11_USAGE_DEFAULT
    ID3D11Texture2D          Usage flags must be D3D11_USAGE_DEFAULT
    ID3D11Texture3D          Usage flags must be D3D11_USAGE_DEFAULT
    ID3D11Buffer             Usage flags must be D3D11_USAGE_DEFAULT
    --------------------------------------------------------------------------
    Table wgl.restrictions - Restrictions on DirectX resources that can
    be registered via wglDXRegisterObjectNV
    --------------------------------------------------------------------------

Issues

    1) How do we share D3D "tbuffers" with OpenGL?
    
    RESOLUTION: D3D "tbuffers" are analogous to buffer textures in OpenGL
    and do not have their own resource type. The ID3D1xBuffer backing the
    "tbuffer" could be shared with OpenGL and attached to a buffer texture
    by passing the interop buffer ID to TexBuffer().


Sample Code
    Example: Render to Direct3D 11 backbuffer with openGL.
    
    // create D3D11 device, context and swap chain.
    ID3D11Device *device;
    ID3D11DeviceContext *devCtx;
    IDXGISwapChain *swapChain;
    
    DXGI_SWAP_CHAIN_DESC scd;
    
    <set appropriate swap chain parameters in scd>
    
    hr = D3D11CreateDeviceAndSwapChain(NULL,                        // pAdapter
                                       D3D_DRIVER_TYPE_HARDWARE,    // DriverType
                                       NULL,                        // Software
                                       0,                           // Flags (Do not set D3D11_CREATE_DEVICE_SINGLETHREADED)
                                       NULL,                        // pFeatureLevels
                                       0,                           // FeatureLevels
                                       D3D11_SDK_VERSION,           // SDKVersion
                                       &scd,                        // pSwapChainDesc
                                       &swapChain,                  // ppSwapChain
                                       &device,                     // ppDevice
                                       NULL,                        // pFeatureLevel
                                       &devCtx);                    // ppImmediateContext

    // Fetch the swapchain backbuffer
    ID3D11Texture2D *dxColorbuffer;
    swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID *)&dxColorbuffer);
    
    // Create depth stencil texture
    ID3D11Texture2D *dxDepthBuffer;
    D3D11_TEXTURE2D_DESC depthDesc;
    depthDesc.Usage = D3D11_USAGE_DEFAULT;
    <set other depthDesc parameters appropriately>
    
    // Create Views
    ID3D11RenderTargetView *colorBufferView;
    D3D11_RENDER_TARGET_VIEW_DESC rtd;
    <set rtd parameters appropriately>
    device->CreateRenderTargetView(dxColorbuffer, &rtd, &colorBufferView);
    
    ID3D11DepthStencilView *depthBufferView;
    D3D11_DEPTH_STENCIL_VIEW_DESC dsd;
    <set dsd parameters appropriately>
    device->CreateDepthStencilView(dxDepthBuffer, &dsd, &depthBufferView);
    
    // Attach back buffer and depth texture to redertarget for the device.
    devCtx->OMSetRenderTargets(1, &colorBufferView, depthBufferView);
    
    // Register D3D11 device with GL
    HANDLE gl_handleD3D;
    gl_handleD3D = wglDXOpenDeviceNV(device);

    // register the Direct3D color and depth/stencil buffers as
    // renderbuffers in opengl
    GLuint gl_names[2];
    HANDLE gl_handles[2];

    glGenRenderbuffers(2, gl_names);

    gl_handles[0] = wglDXRegisterObjectNV(gl_handleD3D, dxColorBuffer,
                                          gl_names[0],
                                          GL_RENDERBUFFER,
                                          WGL_ACCESS_READ_WRITE_NV);

    gl_handles[1] = wglDXRegisterObjectNV(gl_handleD3D, dxDepthBuffer,
                                          gl_names[1],
                                          GL_RENDERBUFFER,
                                          WGL_ACCESS_READ_WRITE_NV);

    // attach the Direct3D buffers to an FBO
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                              GL_RENDERBUFFER, gl_names[0]);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
                              GL_RENDERBUFFER, gl_names[1]);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
                              GL_RENDERBUFFER, gl_names[1]);

    while (!done) {
          <direct3d renders to the render targets>

          // lock the render targets for GL access
          wglDXLockObjectsNVX(handleD3D, 2, gl_handles);

          <opengl renders to the render targets>

          // unlock the render targets
          wglDXUnlockObjectsNVX(handleD3D, 2, gl_handles);

          <direct3d renders to the render targets and presents
           the results on the screen>
    }

Revision History

    Revision 1, 2009/06/13
     - Initial revision
    Revision 2, 2011/10/04
     - Updated supported DX10/11 resources types and their restrictions.
     - Updated the dependecies section.
     - Added an issue explaining DX "tbuffer" sharing.
     - Added sample code.
