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 parameter of wglDXOpenDeviceNV and associated restrictions. ------------------------------------------------------------------------- Add the following resources to table wgl.objtypes: -------------------------------------------------------------------------- type of 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 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; 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; // Create Views ID3D11RenderTargetView *colorBufferView; D3D11_RENDER_TARGET_VIEW_DESC rtd; device->CreateRenderTargetView(dxColorbuffer, &rtd, &colorBufferView); ID3D11DepthStencilView *depthBufferView; D3D11_DEPTH_STENCIL_VIEW_DESC dsd; 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) { // lock the render targets for GL access wglDXLockObjectsNVX(handleD3D, 2, gl_handles); // unlock the render targets wglDXUnlockObjectsNVX(handleD3D, 2, gl_handles); } 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.