/// <summary> /// Creates DirectX9 Ex device in unmanaged code as MDX is not supporting DX9 Ex /// This device type is available only in Vista or later OS /// </summary> private void CreateDirectX9ExDevice(CreateFlags createFlags) { D3DPRESENT_PARAMETERS param = new D3DPRESENT_PARAMETERS(); param.Windowed = 0; if (presentParams.Windowed) { param.Windowed = 1; } param.AutoDepthStencilFormat = presentParams.AutoDepthStencilFormat; param.BackBufferCount = (uint)presentParams.BackBufferCount; param.BackBufferFormat = presentParams.BackBufferFormat; param.BackBufferHeight = (uint)presentParams.BackBufferHeight; param.BackBufferWidth = (uint)presentParams.BackBufferWidth; param.hDeviceWindow = presentParams.DeviceWindow.Handle; param.EnableAutoDepthStencil = 0; if (presentParams.EnableAutoDepthStencil) { param.EnableAutoDepthStencil = 1; } param.FullScreen_RefreshRateInHz = (uint)presentParams.FullScreenRefreshRateInHz; param.MultiSampleType = presentParams.MultiSample; param.MultiSampleQuality = presentParams.MultiSampleQuality; param.PresentationInterval = (uint)presentParams.PresentationInterval; param.SwapEffect = presentParams.SwapEffect; IDirect3D9Ex m_d3dEx; Direct3D.Direct3DCreate9Ex(32, out m_d3dEx); IntPtr d3dEx = Marshal.GetIUnknownForObject(m_d3dEx); Marshal.Release(d3dEx); D3DDISPLAYMODEEX displaymodeEx = new D3DDISPLAYMODEEX(); displaymodeEx.Size = (uint)Marshal.SizeOf(displaymodeEx); displaymodeEx.Width = param.BackBufferWidth; displaymodeEx.Height = param.BackBufferHeight; displaymodeEx.Format = param.BackBufferFormat; displaymodeEx.ScanLineOrdering = D3DSCANLINEORDERING.D3DSCANLINEORDERING_UNKNOWN; IntPtr dev; IntPtr prt = Marshal.AllocHGlobal(Marshal.SizeOf(displaymodeEx)); Marshal.StructureToPtr(displaymodeEx, prt, true); int hr = m_d3dEx.CreateDeviceEx(graphicsSettings.AdapterOrdinal, graphicsSettings.DevType, windowed ? ourRenderTarget.Handle : this.Handle, createFlags | CreateFlags.MultiThreaded | CreateFlags.FpuPreserve, ref param, windowed ? IntPtr.Zero : prt, out dev); GUIGraphicsContext.DX9Device = new Device(dev); // Reset must be done to get the MDX device internal state up to date GUIGraphicsContext.DX9Device.Reset(presentParams); }
/// <summary> /// Creates a DirectX9Ex Device /// </summary> private void CreateDirectX9ExDevice() { var param = new D3DPRESENT_PARAMETERS { BackBufferWidth = (uint)_presentParams.BackBufferWidth, BackBufferHeight = (uint)_presentParams.BackBufferHeight, BackBufferFormat = _presentParams.BackBufferFormat, BackBufferCount = (uint)_presentParams.BackBufferCount, MultiSampleType = _presentParams.MultiSample, MultiSampleQuality = _presentParams.MultiSampleQuality, SwapEffect = _presentParams.SwapEffect, hDeviceWindow = _presentParams.DeviceWindow.Handle, Windowed = _presentParams.Windowed ? 1 : 0, EnableAutoDepthStencil = _presentParams.EnableAutoDepthStencil ? 1 : 0, AutoDepthStencilFormat = _presentParams.AutoDepthStencilFormat, Flags = (int)_presentParams.PresentFlag, FullScreen_RefreshRateInHz = (uint)_presentParams.FullScreenRefreshRateInHz, PresentationInterval = (uint)_presentParams.PresentationInterval, }; IDirect3D9Ex direct3D9Ex; Direct3D.Direct3DCreate9Ex(32, out direct3D9Ex); IntPtr dev; var hr = direct3D9Ex.CreateDeviceEx(AdapterInfo.AdapterOrdinal, _deviceType, _renderTarget.Handle, _createFlags | CreateFlags.MultiThreaded | CreateFlags.FpuPreserve, ref param, IntPtr.Zero, out dev); if (hr == 0) { GUIGraphicsContext.DX9Device = new Device(dev); GUIGraphicsContext.DX9Device.Reset(_presentParams); } else { Log.Error("D3D: Could not create device"); // ReSharper disable LocalizableElement MessageBox.Show("Direct3D device could not be created.", "MediaPortal", MessageBoxButtons.OK, MessageBoxIcon.Error); // ReSharper restore LocalizableElement try { Close(); } // ReSharper disable EmptyGeneralCatchClause catch {} // ReSharper restore EmptyGeneralCatchClause } }
private void CreateDevice() { if (m_device != null) return; var param = new D3DPRESENT_PARAMETERS { Windowed = 1, Flags = ((short)D3DPRESENTFLAG.D3DPRESENTFLAG_VIDEO), BackBufferFormat = D3DFORMAT.D3DFMT_X8R8G8B8, SwapEffect = D3DSWAPEFFECT.D3DSWAPEFFECT_COPY }; /* The COM pointer to our D3D Device */ IntPtr dev; /* Windows Vista runs much more performant with the IDirect3DDevice9Ex */ if (IsVistaOrBetter) { m_d3dEx.CreateDeviceEx(0, D3DDEVTYPE.D3DDEVTYPE_HAL, m_hWnd, CreateFlags.D3DCREATE_SOFTWARE_VERTEXPROCESSING | CreateFlags.D3DCREATE_MULTITHREADED, ref param, IntPtr.Zero, out dev); } else/* Windows XP */ { m_d3d.CreateDevice(0, D3DDEVTYPE.D3DDEVTYPE_HAL, m_hWnd, CreateFlags.D3DCREATE_SOFTWARE_VERTEXPROCESSING | CreateFlags.D3DCREATE_MULTITHREADED, ref param, out dev); } m_device = (IDirect3DDevice9)Marshal.GetObjectForIUnknown(dev); Marshal.Release(dev); }