Ejemplo n.º 1
0
        private void Initialize()
        {
            factory2d = new Factory2D(SharpDX.Direct2D1.FactoryType.MultiThreaded, DebugLevel.Information);

            HookControl         = Control.FromHandle(HookHandle);
            HookControl.Resize += HookResized;

            var desc = new SwapChainDescription()
            {
                BufferCount       = 1,
                ModeDescription   = new ModeDescription(0, 0, new Rational(0, 0), Format.B8G8R8A8_UNorm),   // BGRA | Required for Direct2D/DirectWrite (<Win8)
                IsWindowed        = true,
                OutputHandle      = HookHandle,
                SampleDescription = new SampleDescription(1, 0),
                SwapEffect        = SwapEffect.Discard,
                Usage             = Usage.RenderTargetOutput
            };

            /* [Enable Debug Layer]
             * https://docs.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-devices-layers
             * https://docs.microsoft.com/en-us/windows/win32/direct3d11/using-the-debug-layer-to-test-apps
             *
             * For Windows 7 with Platform Update for Windows 7 (KB2670838) or Windows 8.x, to create a device that supports the debug layer, install the Windows Software Development Kit (SDK) for Windows 8.x to get D3D11_1SDKLayers.dll
             * For Windows 10, to create a device that supports the debug layer, enable the "Graphics Tools" optional feature. Go to the Settings panel, under System, Apps & features, Manage optional Features, Add a feature, and then look for "Graphics Tools".
             *
             */

            // Enable on-demand to avoid "Failed to create device issue"
            //#if DEBUG
            //Device.CreateWithSwapChain(SharpDX.Direct3D.DriverType.Hardware, DeviceCreationFlags.VideoSupport | DeviceCreationFlags.Debug | DeviceCreationFlags.BgraSupport, desc, out device, out swapChain);
            //#else
            Device.CreateWithSwapChain(SharpDX.Direct3D.DriverType.Hardware, DeviceCreationFlags.VideoSupport | DeviceCreationFlags.BgraSupport, desc, out device, out swapChain);
            //#endif

            var factory = swapChain.GetParent <FactoryDX>();

            factory.MakeWindowAssociation(HookHandle, WindowAssociationFlags.IgnoreAll);

            backBuffer = Texture2D.FromSwapChain <Texture2D>(swapChain, 0);
            rtv        = new RenderTargetView(device, backBuffer);
            context    = device.ImmediateContext;

            factoryWrite   = new FactoryDW();
            surface        = backBuffer.QueryInterface <Surface>();
            rtv2d          = new RenderTarget(factory2d, surface, new RenderTargetProperties(new PixelFormat(Format.Unknown, SharpDX.Direct2D1.AlphaMode.Premultiplied)));
            brush2d        = new SolidColorBrush(rtv2d, Color.White);
            brush2dOutline = new SolidColorBrush(rtv2d, outlineColor);

            outlineRenderer.renderer = this;

            string vertexProfile = "vs_5_0";
            string pixelProfile  = "ps_5_0";

            if (device.FeatureLevel == SharpDX.Direct3D.FeatureLevel.Level_9_1 ||
                device.FeatureLevel == SharpDX.Direct3D.FeatureLevel.Level_9_2 ||
                device.FeatureLevel == SharpDX.Direct3D.FeatureLevel.Level_9_3 ||
                device.FeatureLevel == SharpDX.Direct3D.FeatureLevel.Level_10_0 ||
                device.FeatureLevel == SharpDX.Direct3D.FeatureLevel.Level_10_1)
            {
                vertexProfile = "vs_4_0_level_9_1";
                pixelProfile  = "ps_4_0_level_9_1";
            }

            var VertexShaderByteCode = ShaderBytecode.Compile(Properties.Resources.VertexShader, "main", vertexProfile, ShaderFlags.Debug);

            vertexLayout = new InputLayout(device, VertexShaderByteCode, new[]
            {
                new InputElement("POSITION", 0, Format.R32G32B32_Float, 0, 0, InputClassification.PerVertexData, 0),
                new InputElement("TEXCOORD", 0, Format.R32G32_Float, 12, 0, InputClassification.PerVertexData, 0),
            });
            vertexShader = new VertexShader(device, VertexShaderByteCode);

            var PixelShaderByteCode = ShaderBytecode.Compile(Properties.Resources.PixelShader, "main", pixelProfile, ShaderFlags.Debug);

            pixelShader = new PixelShader(device, PixelShaderByteCode);

            var PixelShaderByteCodeYUV = ShaderBytecode.Compile(Properties.Resources.PixelShader_YUV, "main", pixelProfile, ShaderFlags.Debug);

            pixelShaderYUV = new PixelShader(device, PixelShaderByteCodeYUV);

            vertexBuffer = Buffer.Create(device, BindFlags.VertexBuffer, new[]
            {
                -1.0f, -1.0f, 0, 0.0f, 1.0f,
                -1.0f, 1.0f, 0, 0.0f, 0.0f,
                1.0f, -1.0f, 0, 1.0f, 1.0f,

                1.0f, -1.0f, 0, 1.0f, 1.0f,
                -1.0f, 1.0f, 0, 0.0f, 0.0f,
                1.0f, 1.0f, 0, 1.0f, 0.0f
            });

            SamplerState textureSampler = new SamplerState(device, new SamplerStateDescription()
            {
                AddressU           = TextureAddressMode.Clamp,
                AddressV           = TextureAddressMode.Clamp,
                AddressW           = TextureAddressMode.Clamp,
                ComparisonFunction = Comparison.Never,
                Filter             = Filter.MinMagMipLinear,
                MaximumAnisotropy  = 1,
                MaximumLod         = float.MaxValue,
                MinimumLod         = 0,
                MipLodBias         = 0.0f
            });

            context.InputAssembler.InputLayout       = vertexLayout;
            context.InputAssembler.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.TriangleList;
            context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertexBuffer, Utilities.SizeOf <float>() * 5, 0));

            context.VertexShader.Set(vertexShader);
            context.PixelShader.SetSampler(0, textureSampler);

            textureRGB = new Texture2D(device, new Texture2DDescription()
            {
                Usage  = ResourceUsage.Default,
                Format = Format.R8G8B8A8_UNorm,

                Width  = HookControl.Width,
                Height = HookControl.Height,

                BindFlags      = BindFlags.ShaderResource | BindFlags.RenderTarget,
                CpuAccessFlags = CpuAccessFlags.None,
                OptionFlags    = ResourceOptionFlags.None,

                SampleDescription = new SampleDescription(1, 0),
                ArraySize         = 1,
                MipLevels         = 1
            });

            srvDescYUV           = new ShaderResourceViewDescription();
            srvDescYUV.Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.Texture2D;
            srvDescYUV.Format    = Format.R8_UNorm;
            srvDescYUV.Texture2D.MostDetailedMip = 0;
            srvDescYUV.Texture2D.MipLevels       = 1;

            // Falling back from videoDevice1/videoContext1 to videoDevice/videoContext to ensure backwards compatibility
            videoDevice1  = device.QueryInterfaceOrNull <VideoDevice>();
            videoContext1 = context.QueryInterfaceOrNull <VideoContext>();

            if (videoDevice1 == null || videoContext1 == null)
            {
                SetViewport(); return;
            }

            vpcd = new VideoProcessorContentDescription()
            {
                Usage            = VideoUsage.PlaybackNormal,
                InputFrameFormat = VideoFrameFormat.Progressive,
                InputFrameRate   = new Rational(1, 1),
                OutputFrameRate  = new Rational(1, 1),
                InputWidth       = 1,
                OutputWidth      = 1,
                InputHeight      = 1,
                OutputHeight     = 1
            };
            videoDevice1.CreateVideoProcessorEnumerator(ref vpcd, out vpe);
            videoDevice1.CreateVideoProcessor(vpe, 0, out videoProcessor);

            vpivd = new VideoProcessorInputViewDescription()
            {
                FourCC    = 0,
                Dimension = VpivDimension.Texture2D,
                Texture2D = new Texture2DVpiv()
                {
                    MipSlice = 0, ArraySlice = 0
                }
            };
            vpovd = new VideoProcessorOutputViewDescription()
            {
                Dimension = VpovDimension.Texture2D
            };
            vpsa = new VideoProcessorStream[1];

            SetViewport();
        }