static void render(SwapChainPanel swapChainPanel)
        {
            ICommandListFactory commandListFactory = GetCommandListFactory(swapChainPanel);

            if (commandListFactory == null)
            {
                return;
            }

            RenderData _renderData = RenderData.Find(swapChainPanel, false);

            if (_renderData == null)
            {
                return;
            }

            Debug.WriteLine($"{nameof(SwapChainPanelPainter)}.{nameof(render)} _renderData={_renderData}");

            GraphicsDevice _graphicsDevice = _renderData.graphicsDevice;

            if (_graphicsDevice == null)
            {
                return;
            }

            Veldrid.Swapchain _swapchain = _renderData.swapchain;
            if (_swapchain == null)
            {
                return;
            }

            Framebuffer _framebuffer = _renderData.framebuffer;

            if (_framebuffer == null)
            {
                return;
            }

            {
                Veldrid.CommandList _commandList = null;
                try
                {
                    _commandList = commandListFactory.BuildCommandList(_graphicsDevice, _framebuffer);
                    if (_commandList == null)
                    {
                        return;
                    }

                    _graphicsDevice.SubmitCommands(_commandList);
                    _graphicsDevice.SwapBuffers(_swapchain);
                }
                catch (Exception E)
                {
                }
                finally
                {
                    _commandList?.Dispose();
                }
            }
        }
        private static void SwapChainPanel_Loaded(object sender, RoutedEventArgs e)
        {
            SwapChainPanel swapChainPanel = sender as SwapChainPanel;

            if (swapChainPanel == null)
            {
                return;
            }

            RenderData _renderData = RenderData.Find(swapChainPanel, false);

            Debug.WriteLine($"{nameof(SwapChainPanelPainter)}.{nameof(SwapChainPanel_Loaded)} _renderData={_renderData}");
            if (_renderData == null)
            {
                return;
            }

            _renderData.Loaded = true;

            render(swapChainPanel);
        }
        private static void SwapChainPanel_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            SwapChainPanel swapChainPanel = sender as SwapChainPanel;

            if (swapChainPanel == null)
            {
                return;
            }

            Debug.WriteLine($"{nameof(SwapChainPanelPainter)}.{nameof(SwapChainPanel_SizeChanged)} swapChainPanel={swapChainPanel}");

            RenderData _renderData = RenderData.Find(swapChainPanel, false);

            if (_renderData == null)
            {
                return;
            }

            // _renderData.Reset_swapchain();

            render(swapChainPanel);
        }
        static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            Debug.WriteLine($"{nameof(SwapChainPanelPainter)}.{nameof(PropertyChangedCallback)} d={d} e.OldValue={e.OldValue} e.NewValue={e.NewValue}");

            SwapChainPanel swapChainPanel = d as SwapChainPanel;

            if (swapChainPanel == null)
            {
                return;
            }

            ICommandListFactory commandListFactory = e.NewValue as ICommandListFactory;

            if (commandListFactory == null)
            {
                // 'déconnexion de swapChainPanel'
                bool _ok = RenderData.Dispose(swapChainPanel);
                if (_ok)
                {
                    // events
                    swapChainPanel.Loaded                  -= SwapChainPanel_Loaded;
                    swapChainPanel.Unloaded                -= SwapChainPanel_Unloaded;
                    swapChainPanel.SizeChanged             -= SwapChainPanel_SizeChanged;
                    swapChainPanel.CompositionScaleChanged -= SwapChainPanel_CompositionScaleChanged;
                }
            }
            else
            {
                RenderData _renderData = RenderData.Find(swapChainPanel, false);
                if (_renderData == null)
                {
                    _renderData = RenderData.Find(swapChainPanel, true);
                    if (_renderData == null)
                    {
                        return;
                    }

                    bool _ok = false;
                    try
                    {
                        GraphicsDevice _graphicsDevice = _renderData.graphicsDevice;
                        if (_graphicsDevice == null)
                        {
                            return;
                        }

                        // events
                        swapChainPanel.Loaded                  += SwapChainPanel_Loaded;
                        swapChainPanel.Unloaded                += SwapChainPanel_Unloaded;
                        swapChainPanel.SizeChanged             += SwapChainPanel_SizeChanged;
                        swapChainPanel.CompositionScaleChanged += SwapChainPanel_CompositionScaleChanged;

                        _ok = true;
                    }
                    finally
                    {
                        if (_ok == false)
                        {
                            RenderData.Dispose(swapChainPanel);
                        }
                    }
                }
            }
        }
Exemple #5
0
        static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            D3D11Image d3D11Image = d as D3D11Image;

            if (d3D11Image == null)
            {
                return;
            }

            d3D11Image.OnRender = null;

            ICommandListFactory commandListFactory = e.NewValue as ICommandListFactory;

            if (commandListFactory == null)
            {
                return;
            }

            RenderData _renderData = RenderData.Find(d3D11Image, true);

            if (_renderData == null)
            {
                return;
            }

            GraphicsDevice _graphicsDevice = _renderData.graphicsDevice;

            if (_graphicsDevice == null)
            {
                return;
            }

            SharpDX.Direct3D11.Device _device = _renderData.device;
            if (_device == null)
            {
                return;
            }

            d3D11Image.OnRender = (IntPtr surface, bool isNewSurface) =>
            {
                #region --- OnRender
                Framebuffer _framebuffer = _renderData.FrameBuffer(surface, isNewSurface);
                if (_framebuffer == null)
                {
                    return;
                }

                Veldrid.CommandList commandList = null;
                try
                {
                    commandList = commandListFactory.BuildCommandList(_graphicsDevice, _framebuffer);
                    if (commandList == null)
                    {
                        return;
                    }
                    _graphicsDevice.SubmitCommands(commandList);
                }
                finally
                {
                    commandList?.Dispose();
                }

                _device.ImmediateContext.Flush();
                #endregion
            };
        }