Hey folks,
So as the title suggests I'm trying to handle the rendering of a C# Panel instance (in this case a Canvas) using C++ and DirectX - but I'm having trouble creating the device and swap chain instance on the C++ side of things.
The C# application has 'Canvas' instance in the XAML (I've also tried a Windows.Forms panel, as shown below):
<Grid Grid.Row="0"> <!-- <WindowsFormsHost Width="800" Height="600" x:Name="myEngineWindow"> <wf:Panel Width="800" Height="600" x:Name="myDXControl"/> </WindowsFormsHost> --> <Canvas Width="800" Height="600" x:Name="myDXControl" /> </Grid>
And in my application's 'Loaded' event callback I grad the window handle from the Canvas and send it through to my C++ renderer (SoundSynthesisInterface):
HwndSource hwndSource = (HwndSource)HwndSource.FromVisual(myDXControl); SoundSynthesisInterface.Instance.InitializeEngine(hwndSource.Handle, (int)myDXControl.Width, (int)myDXControl.Height);
The SoundSynthesisInterface is a managed C++ class, and converts the IntPtr supplied by C# to a HWND instance, and then uses that window handle to try and initialize the device context and swap chain:
bool SoundSynthesisInterface::InitializeEngine( IntPtr aWindowHandle, int aWindowWidth, int aWindowHeight ) { ... HWND windowHandle = (HWND)aWindowHandle.ToPointer(); ... InitializeRenderContext(windowHandle, aWindowWidth, aWindowHeight); }
The HWND instance that gets passed through to InitializeRenderContext is non-null, but when I call the following code to create the device & swap chain:
// create a structure to hold information about the swap chain DXGI_SWAP_CHAIN_DESC swapChainDescription; ZeroMemory( &swapChainDescription, sizeof(DXGI_SWAP_CHAIN_DESC) ); HRESULT result = S_OK; // fill in the swap chain structure swapChainDescription.BufferCount = 2; swapChainDescription.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; swapChainDescription.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDescription.OutputWindow = windowHandle; swapChainDescription.SampleDesc.Count = 8; swapChainDescription.SampleDesc.Quality = 1; swapChainDescription.Windowed = TRUE; swapChainDescription.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; // create the context result = D3D11CreateDeviceAndSwapChain( NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, NULL, NULL, NULL, D3D11_SDK_VERSION, &swapChainDescription, &m_swapChain, &m_device, NULL, &m_deviceContext );
I get the following error code:
0x80070057
Which I think means that one of the parameters I'm passing in to CreateDeviceAndSwapChain is invalid... but I'm not sure what I'm doing wrong here. Anyone have any bright ideas? m_swapChain, m_device & m_deviceContext are all initialized to 'nullptr' by the class constructor.
I'm currently running on Windows 7 with VS2015 and I'm linking to the 'Windows Kit v8.1' version of the DXSDK. Both the C# and C++ projects are complied using an x64 configuration, as are all DirectX libs I'm linking to.
Thanks for the help!