/// <summary>
        /// Initializes the capture monitors.
        /// </summary>
        private void InitializeCaptureMonitors()
        {
            var factory = new Factory1();

            for (int i = 0; i < factory.GetAdapterCount(); i++)
            {
                for (int j = 0; j < factory.GetAdapter(i).GetOutputCount(); j++)
                {
                    var output = factory.GetAdapter(i).GetOutput(j);

                    CaptureSettings settings = new CaptureSettings();
                    settings.m_Adapter = i;
                    settings.m_Output  = j;
                    settings.m_Rect    = new DsRect(
                        output.Description.DesktopBounds.Left,
                        output.Description.DesktopBounds.Top,
                        output.Description.DesktopBounds.Right,
                        output.Description.DesktopBounds.Bottom
                        );

                    CaptureItem captureItem = new CaptureItem(output.Description.DeviceName, settings);
                    captureMethodCombo.Items.Add(captureItem);
                }
            }
        }
Пример #2
0
        public RenderContainer(SwapChainDescription swapChainDescription, RenderControl control)
        {
            try
            {
                _swapChainDescription = swapChainDescription;

                using (Factory1 factory = new Factory1())
                    using (Adapter adapter = factory.GetAdapter(0))
                    {
                        Device11 = new Dx11ChainedDevice(adapter, _swapChainDescription);
                        Device10 = new Dx10Device(adapter);
                    }

                GraphicsDevice = new GenericGraphicsDevice(Device11.Device);
                SpriteBatch    = new SpriteBatch(GraphicsDevice);

                Reset(control.Width, control.Height);

                control.Resize += OnRenderControlResize;
            }
            catch
            {
                Dispose();
                throw;
            }
        }
Пример #3
0
        public override void Hook()
        {
            DebugMessage("Hook: Begin");

            // Determine method addresses in Direct3D10.Device, and DXGI.SwapChain
            if (_d3d10_1VTblAddresses == null)
            {
                _d3d10_1VTblAddresses       = new List <IntPtr>();
                _dxgiSwapChainVTblAddresses = new List <IntPtr>();
                DebugMessage("Hook: Before device creation");
                using (var factory = new Factory1())
                {
                    using (
                        var device = new Device1(factory.GetAdapter(0), DeviceCreationFlags.None,
                                                 FeatureLevel.Level_10_1))
                    {
                        DebugMessage("Hook: Device created");
                        _d3d10_1VTblAddresses.AddRange(GetVTblAddresses(device.NativePointer,
                                                                        D3D10_1_DEVICE_METHOD_COUNT));

                        using (var renderForm = new RenderForm())
                        {
                            using (
                                var sc = new SwapChain(factory, device,
                                                       DXGI.CreateSwapChainDescription(renderForm.Handle)))
                            {
                                _dxgiSwapChainVTblAddresses.AddRange(GetVTblAddresses(sc.NativePointer,
                                                                                      DXGI.DXGI_SWAPCHAIN_METHOD_COUNT));
                            }
                        }
                    }
                }
            }

            // We will capture the backbuffer here
            DXGISwapChain_PresentHook = new Hook <DXGISwapChain_PresentDelegate>(
                _dxgiSwapChainVTblAddresses[(int)DXGI.DXGISwapChainVTbl.Present],
                new DXGISwapChain_PresentDelegate(PresentHook),
                this);

            // We will capture target/window resizes here
            DXGISwapChain_ResizeTargetHook = new Hook <DXGISwapChain_ResizeTargetDelegate>(
                _dxgiSwapChainVTblAddresses[(int)DXGI.DXGISwapChainVTbl.ResizeTarget],
                new DXGISwapChain_ResizeTargetDelegate(ResizeTargetHook),
                this);

            /*
             * Don't forget that all hooks will start deactivated...
             * The following ensures that all threads are intercepted:
             * Note: you must do this for each hook.
             */
            DXGISwapChain_PresentHook.Activate();

            DXGISwapChain_ResizeTargetHook.Activate();

            Hooks.Add(DXGISwapChain_PresentHook);
            Hooks.Add(DXGISwapChain_ResizeTargetHook);
        }
Пример #4
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="dg"></param>
 /// <returns></returns>
 public static IEnumerable <Adapter> GetAdapters(DisposeGroup dg)
 {
     // NOTE: SharpDX 1.3 requires explicit Dispose() of everything
     // hence the DisposeGroup, to enforce it
     using (var f = new Factory1())
     {
         int n = AdapterCount;
         for (int i = 0; i < n; i++)
         {
             yield return(dg.Add(f.GetAdapter(i)));
         }
     }
 }
Пример #5
0
        public void CreateDeviceTest()
        {
            Adapter adapter;

            using (var factory = new Factory1())
            {
                adapter = factory.GetAdapter(0);
            }

            using (var device = new SharpDX.Direct3D11.Device(adapter, SharpDX.Direct3D11.DeviceCreationFlags.BgraSupport, FeatureLevel.Level_10_0))
            {
                Console.WriteLine(adapter.Description.Description);
                Console.WriteLine(device.FeatureLevel);
            }
        }
Пример #6
0
        public DeviceContext10_1(DeviceSettings10_1 settings)
        {
            m_settings = settings;

            Direct3DFactory = new Factory1();
         
            /* Create a Direct3D device using our passed settings */
            Device = new SlimDX.Direct3D10_1.Device1(Direct3DFactory.GetAdapter(m_settings.AdapterOrdinal),
                                                       DriverType.Hardware,
                                                       settings.CreationFlags,
                                                       FeatureLevel.Level_10_0);

            /* Create a Direct2D factory while we are at it...*/
            Direct2DFactory = new SlimDX.Direct2D.Factory(FactoryType.Multithreaded);

            MakeBothSidesRendered();
        }
Пример #7
0
        static void Main(string[] args)
        {
            var factory = new Factory1();

            for (var i = 0; i < factory.GetAdapterCount(); i++)
            {
                var adapter = factory.GetAdapter(i);
                Console.WriteLine(adapter.Description.Description.Trim('\0') + ":");
                for (var j = 0; j < adapter.Outputs.Length; j++)
                {
                    var output = adapter.Outputs[j];
                    Console.WriteLine(output.Description.DeviceName);
                    Console.WriteLine("Desktop: " + output.Description.IsAttachedToDesktop);
                    Console.WriteLine("Bounds: " + output.Description.DesktopBounds.Right);
                }
                Console.WriteLine();
            }

            var wnd = new AdapterConfig();

            wnd.ShowDialog();
        }
Пример #8
0
        public override void Hook()
        {
            this.DebugMessage("Hook: Begin");

            // Determine method addresses in Direct3D10.Device, and DXGI.SwapChain
            if (_d3d10_1VTblAddresses == null)
            {
                _d3d10_1VTblAddresses = new List<IntPtr>();
                _dxgiSwapChainVTblAddresses = new List<IntPtr>();
                this.DebugMessage("Hook: Before device creation");
                using (Factory1 factory = new Factory1())
                {
                    using (var device = new SlimDX.Direct3D10_1.Device1(factory.GetAdapter(0), DriverType.Hardware, SlimDX.Direct3D10.DeviceCreationFlags.None, FeatureLevel.Level_10_1))
                    {
                        this.DebugMessage("Hook: Device created");
                        _d3d10_1VTblAddresses.AddRange(GetVTblAddresses(device.ComPointer, D3D10_1_DEVICE_METHOD_COUNT));

                        using (var renderForm = new SlimDX.Windows.RenderForm())
                        {
                            using (var sc = new SwapChain(factory, device, DXGI.CreateSwapChainDescription(renderForm.Handle)))
                            {
                                _dxgiSwapChainVTblAddresses.AddRange(GetVTblAddresses(sc.ComPointer, DXGI.DXGI_SWAPCHAIN_METHOD_COUNT));
                            }
                        }
                    }
                }
            }
            
            // We will capture the backbuffer here
            DXGISwapChain_PresentHook = LocalHook.Create(
                _dxgiSwapChainVTblAddresses[(int)DXGI.DXGISwapChainVTbl.Present],
                new DXGISwapChain_PresentDelegate(PresentHook),
                this);

            // We will capture target/window resizes here
            DXGISwapChain_ResizeTargetHook = LocalHook.Create(
                _dxgiSwapChainVTblAddresses[(int)DXGI.DXGISwapChainVTbl.ResizeTarget],
                new DXGISwapChain_ResizeTargetDelegate(ResizeTargetHook),
                this);

            /*
             * Don't forget that all hooks will start deactivated...
             * The following ensures that all threads are intercepted:
             * Note: you must do this for each hook.
             */
            DXGISwapChain_PresentHook.ThreadACL.SetExclusiveACL(new Int32[1]);

            DXGISwapChain_ResizeTargetHook.ThreadACL.SetExclusiveACL(new Int32[1]);
        }
Пример #9
0
        public GraphicsManager(Form win)
        {
            if (GraphicsManager._instance == null)
            {
                GraphicsManager._instance = this;
            }
            _win = win;

            // Check for available settings
            Factory1 fac     = new Factory1();
            Adapter  adapter = fac.GetAdapter(0);
            Output   mon     = adapter.GetOutput(0);

            ModeDescription[] modeList = mon.GetDisplayModeList(Format.B8G8R8A8_UNorm, DisplayModeEnumerationFlags.Interlaced);
            Rational          rational = new Rational(0, 1);

            foreach (ModeDescription mode in modeList)
            {
                if (mode.Width == win.ClientSize.Width)
                {
                    rational = new Rational(mode.RefreshRate.Numerator, mode.RefreshRate.Numerator);
                }
            }

            /*
             * SwapChainDescription1 scd1 = new SwapChainDescription1
             * {
             * BufferCount = 2,
             *      Flags = SwapChainFlags.None,
             *      SampleDescription = new SampleDescription(1, 0),
             *      SwapEffect = SwapEffect.Discard
             * };
             */


            // Create swap chain descirpiom object
            SwapChainDescription scd = new SwapChainDescription
            {
                BufferCount       = 2,
                Flags             = SwapChainFlags.None,
                IsWindowed        = true,
                ModeDescription   = new ModeDescription(win.ClientSize.Width, win.ClientSize.Height, rational, Format.R8G8B8A8_UNorm),
                OutputHandle      = win.Handle,
                SampleDescription = new SampleDescription(1, 0),
                SwapEffect        = SwapEffect.FlipSequential,
                Usage             = Usage.RenderTargetOutput
            };

            /* Reference
             * https://stackoverflow.com/questions/26220964/sharpdxhow-to-place-sharpdx-window-in-winforms-window
             * https://github.com/sharpdx/SharpDX-Samples/blob/master/Desktop/Direct2D1/MiniRect/Program.cs
             * https://github.com/r2d2rigo/MyFirstDirect2D-SharpDX/blob/master/MyFirstDirect2D/MyViewProvider.cs
             */
            try
            {
                // Create our DirectX 11 device object and swap chain
                SharpDX.Direct3D11.Device.CreateWithSwapChain(
                    SharpDX.Direct3D.DriverType.Hardware,
                    DeviceCreationFlags.Debug | DeviceCreationFlags.BgraSupport,
                    scd,
                    out d3dDevice, out swapChain);
            }catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                return;
            }
            // Get access to the DirectX 11 context
            d3dContext = d3dDevice.ImmediateContext;

            // Create the Direct2D factory object, used in building a render target
            d2dFactory = new SharpDX.Direct2D1.Factory();
            dwFactory  = new SharpDX.DirectWrite.Factory();

            // Create a texture target
            target     = Texture2D.FromSwapChain <Texture2D>(swapChain, 0);
            targetView = new RenderTargetView(d3dDevice, target);

            // Create a surface from target
            surface = target.QueryInterface <Surface>();

            // Finally create the important Direct2D render target
            d2dRenderTarget = new SharpDX.Direct2D1.RenderTarget(d2dFactory, surface, new SharpDX.Direct2D1.RenderTargetProperties(
                                                                     new SharpDX.Direct2D1.PixelFormat(scd.ModeDescription.Format, SharpDX.Direct2D1.AlphaMode.Premultiplied)
                                                                     ));

            // Initiallize the Graphic Manager internal parameters
            _inRender = false;
            _lock     = new Object();
            // Set initial tranformation of graphics system
            d2dRenderTarget.Transform = Identity;
        }
Пример #10
0
 public static Dx11Device CreateDefaultAdapter()
 {
     using (Factory1 factory = new Factory1())
         using (Adapter adapter = factory.GetAdapter(0))
             return(new Dx11Device(adapter));
 }