| 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. |