Пример #1
0
        public override void Swap()
        {
            SharpDX.Direct3D12.ResourceBarrier barrier = new SharpDX.Direct3D12.ResourceBarrier();
            barrier.Type  = SharpDX.Direct3D12.ResourceBarrierType.Transition;
            barrier.Flags = SharpDX.Direct3D12.ResourceBarrierFlags.None;

            if (_sampleDesc.Count > 1)
            {
                barrier.Transition = new SharpDX.Direct3D12.ResourceTransitionBarrier(_backBuffersAA[_frameIndex],
                                                                                      SharpDX.Direct3D12.ResourceStates.RenderTarget,
                                                                                      SharpDX.Direct3D12.ResourceStates.ResolveSource)
                {
                    Subresource = 0
                };

                _commands.ResourceBarrier(barrier);

                barrier.Transition = new SharpDX.Direct3D12.ResourceTransitionBarrier(_backBuffers[_frameIndex],
                                                                                      SharpDX.Direct3D12.ResourceStates.Present,
                                                                                      SharpDX.Direct3D12.ResourceStates.ResolveDestination)
                {
                    Subresource = 0
                };

                _commands.ResourceBarrier(barrier);

                _commands.ResolveSubresource(_backBuffers[_frameIndex], 0, _backBuffersAA[_frameIndex], 0, _format);

                barrier.Transition = new SharpDX.Direct3D12.ResourceTransitionBarrier(_backBuffers[_frameIndex],
                                                                                      SharpDX.Direct3D12.ResourceStates.ResolveDestination,
                                                                                      SharpDX.Direct3D12.ResourceStates.Present)
                {
                    Subresource = 0
                };

                _commands.ResourceBarrier(barrier);
            }
            else
            {
                barrier.Transition = new SharpDX.Direct3D12.ResourceTransitionBarrier(_backBuffers[_frameIndex],
                                                                                      SharpDX.Direct3D12.ResourceStates.RenderTarget,
                                                                                      SharpDX.Direct3D12.ResourceStates.Present)
                {
                    Subresource = 0
                };

                _commands.ResourceBarrier(barrier);
            }

            // TODO: transition video textures

            _commands.Close();
            _queue.ExecuteCommandList(_commands);

            _fenceValue++;
            _queue.Signal(_fence, _fenceValue);
            _frameFenceValues[_frameIndex] = _fenceValue;

            _swapChain.Present(_syncInterval, _presentFlags);
            _frameIndex = _swapChain.CurrentBackBufferIndex;
        }