Example #1
0
    /// <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);
    }
Example #2
0
    /// <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
      }
    }
Example #3
0
        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);
        }