Example #1
0
        /// <summary>
        /// Releases unmanaged and - optionally - managed resources
        /// </summary>
        /// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
        protected override void Dispose(bool disposing)
        {
            if (!IsDisposed)
            {
                //Dispose of managed resources
                if (disposing)
                {
                    if (_shaderResourceView != null)
                    {
                        if (_renderer != null)
                        {
                            _renderer.Resources.RemoveTrackedObject(_shaderResourceView.ComPointer);
                        }
                        _shaderResourceView.Dispose();
                        _shaderResourceView = null;
                    }

                    if (_renderTargetView != null)
                    {
                        if (_renderer != null)
                        {
                            _renderer.Resources.RemoveTrackedObject(_renderTargetView.ComPointer);
                        }
                        _renderTargetView.Dispose();
                        _renderTargetView = null;
                    }

                    if (_depthStencilView != null)
                    {
                        if (_renderer != null)
                        {
                            _renderer.Resources.RemoveTrackedObject(_depthStencilView.ComPointer);
                        }
                        _depthStencilView.Dispose();
                        _depthStencilView = null;
                    }

                    if (_texture2D != null)
                    {
                        if (_renderer != null)
                        {
                            _renderer.Resources.RemoveTrackedObject(_texture2D.ComPointer);
                        }
                        _texture2D.Dispose();
                        _texture2D = null;
                    }

                    if (_staging != null)
                    {
                        if (_renderer != null)
                        {
                            _renderer.Resources.RemoveTrackedObject(_staging.ComPointer);
                        }
                        _staging.Dispose();
                        _staging = null;
                    }
                }
                base.Dispose(disposing);
            }
        }
        private void CreateViews()
        {
            _backBuffer       = D3D.Resource.FromSwapChain <D3D.Texture2D>(_swapChain, 0);
            _renderTargetView = new D3D.RenderTargetView(_graphicsDevice, _backBuffer);

            //Add resources to tracker
            _renderer.Resources.AddTrackedObject(_backBuffer.ComPointer, this);
            _renderer.Resources.AddTrackedObject(_renderTargetView.ComPointer, this);

            if (_presentParams.DepthStencilFormat != DepthFormat.None)
            {
                D3D.Texture2DDescription depthBufferDesc = new D3D.Texture2DDescription {
                    ArraySize         = 1,
                    BindFlags         = D3D.BindFlags.DepthStencil,
                    CpuAccessFlags    = D3D.CpuAccessFlags.None,
                    Format            = D3D10Helper.ToD3DDepthFormat(_presentParams.DepthStencilFormat),
                    Height            = _presentParams.BackBufferHeight,
                    Width             = _presentParams.BackBufferWidth,
                    MipLevels         = 1,
                    OptionFlags       = D3D.ResourceOptionFlags.None,
                    SampleDescription = _backBuffer.Description.SampleDescription,
                    Usage             = D3D.ResourceUsage.Default
                };

                using (var depthBuffer = new D3D.Texture2D(_graphicsDevice, depthBufferDesc)) {
                    _depthStencilView = new D3D.DepthStencilView(_graphicsDevice, depthBuffer);

                    //Add resource to tracker
                    _renderer.Resources.AddTrackedObject(_depthStencilView.ComPointer, this);
                }
            }
        }
Example #3
0
        /// <summary>
        /// Releases unmanaged and - optionally - managed resources
        /// </summary>
        /// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
        protected override void Dispose(bool disposing)
        {
            if (!IsDisposed)
            {
                //Dispose of managed resources
                if (disposing)
                {
                    if (_shaderResourceView != null)
                    {
                        if (_renderer != null)
                        {
                            _renderer.Resources.RemoveTrackedObject(_shaderResourceView.ComPointer);
                        }
                        _shaderResourceView.Dispose();
                        _shaderResourceView = null;
                    }

                    if (_renderTargetView != null)
                    {
                        for (int i = 0; i < 6; i++)
                        {
                            D3D.RenderTargetView rt = _renderTargetView[i];
                            if (_renderer != null)
                            {
                                _renderer.Resources.RemoveTrackedObject(rt.ComPointer);
                            }
                            rt.Dispose();
                            _renderTargetView[i] = null;
                        }
                    }

                    if (_depthStencilView != null)
                    {
                        if (_renderer != null)
                        {
                            _renderer.Resources.RemoveTrackedObject(_depthStencilView.ComPointer);
                        }
                        _depthStencilView.Dispose();
                        _depthStencilView = null;
                    }

                    if (_texture2D != null)
                    {
                        if (_renderer != null)
                        {
                            _renderer.Resources.RemoveTrackedObject(_texture2D.ComPointer);
                        }
                        _texture2D.Dispose();
                        _texture2D = null;
                    }
                }
                base.Dispose(disposing);
            }
        }
        private void DestroyViews()
        {
            if (_renderTargetView != null)
            {
                if (_renderer != null)
                {
                    _renderer.Resources.RemoveTrackedObject(_renderTargetView.ComPointer);
                }
                _renderTargetView.Dispose();
                _renderTargetView = null;
            }

            if (_backBuffer != null)
            {
                if (_renderer != null)
                {
                    _renderer.Resources.RemoveTrackedObject(_backBuffer.ComPointer);
                }
                _backBuffer.Dispose();
                _backBuffer = null;
            }

            if (_staging != null)
            {
                if (_renderer != null)
                {
                    _renderer.Resources.RemoveTrackedObject(_staging.ComPointer);
                }
                _staging.Dispose();
                _staging = null;
            }

            if (_depthStencilView != null)
            {
                if (_renderer != null)
                {
                    _renderer.Resources.RemoveTrackedObject(_depthStencilView.ComPointer);
                }
                _depthStencilView.Dispose();
                _depthStencilView = null;
            }
        }
Example #5
0
        private void SetBackBufferTargets()
        {
            if (_activeBackBuffer != null)
            {
                D3D10Helper.CheckDisposed(_activeBackBuffer);
                D3D.RenderTargetView rtv = _activeBackBuffer.D3D10RenderTargetView;
                D3D.DepthStencilView dsv = _activeBackBuffer.D3D10DepthStencilView;

                if (rtv != null)
                {
                    if (dsv != null)
                    {
                        _graphicsDevice.OutputMerger.SetTargets(dsv, rtv);
                    }
                    else
                    {
                        _graphicsDevice.OutputMerger.SetTargets(rtv);
                    }
                }
            }
        }
Example #6
0
        public DepthBuffer( D3D10.Device device, int width, int height, DXGI.Format format )
        {
            this.device = device;

            D3D10.Texture2DDescription desc = new D3D10.Texture2DDescription();

            desc.Width  = width;
            desc.Height = height;

            desc.ArraySize = 1;
            desc.BindFlags = D3D10.BindFlags.DepthStencil;
            desc.CpuAccessFlags = D3D10.CpuAccessFlags.None;
            desc.Format = format;
            desc.MipLevels = 1;
            desc.OptionFlags = D3D10.ResourceOptionFlags.None;
            desc.SampleDescription = new SlimDX.DXGI.SampleDescription( 1, 0 );
            desc.Usage = D3D10.ResourceUsage.Default;

            Resource = new D3D10.Texture2D( device, desc );
            View = new D3D10.DepthStencilView( device, Resource );
        }
Example #7
0
        /// <summary>
        /// Creates a new instance of <see cref="D3D10Texture2DImplementation"/>, for RenderTarget2D.
        /// </summary>
        /// <param name="renderer">The D3D10 renderer.</param>
        /// <param name="width">The texture width in pixels.</param>
        /// <param name="height">The texture height in pixels.</param>
        /// <param name="genMipMaps">True if a mipmap chain should be generated or not.</param>
        /// <param name="format">The surface format.</param>
        /// <param name="depthFormat">The depth-stencil format.</param>
        /// <param name="multiSampleCount">The multisample count.</param>
        /// <param name="usage">The target usage.</param>
        /// <exception cref="System.ArgumentException">Thrown if the formats are invalid to be used in a render target.</exception>
        internal D3D10Texture2DImplementation(D3D10Renderer renderer, int width, int height, bool genMipMaps, SurfaceFormat format, DepthFormat depthFormat, int multiSampleCount, RenderTargetUsage usage)
            : base(width, height, format, depthFormat, multiSampleCount, usage)
        {
            _renderer       = renderer;
            _graphicsDevice = _renderer.GraphicsDevice;

            if (!renderer.Adapter.QueryRenderTargetFormat(format, depthFormat, multiSampleCount))
            {
                throw new ArgumentException("Format combination not supported.");
            }

            D3D.Texture2DDescription desc2D = new D3D.Texture2DDescription();
            desc2D.ArraySize      = 1;
            desc2D.BindFlags      = D3D.BindFlags.ShaderResource | D3D.BindFlags.RenderTarget;
            desc2D.CpuAccessFlags = D3D.CpuAccessFlags.None;
            desc2D.Format         = D3D10Helper.ToD3DSurfaceFormat(format);
            desc2D.Height         = height;
            desc2D.Width          = width;
            desc2D.Usage          = _usage = D3D.ResourceUsage.Default;
            if (genMipMaps)
            {
                desc2D.OptionFlags = D3D.ResourceOptionFlags.GenerateMipMaps;
            }
            else
            {
                desc2D.OptionFlags = D3D.ResourceOptionFlags.None;
            }
            desc2D.MipLevels = (genMipMaps) ? 0 : 1;
            if (multiSampleCount > 1)
            {
                desc2D.SampleDescription = new SlimDX.DXGI.SampleDescription(multiSampleCount, 0);
            }
            else
            {
                desc2D.SampleDescription = new DXGI.SampleDescription(1, 0);
            }

            _texture2D          = new D3D.Texture2D(_graphicsDevice, desc2D);
            _shaderResourceView = new D3D.ShaderResourceView(_graphicsDevice, _texture2D);
            _renderTargetView   = new D3D.RenderTargetView(_graphicsDevice, _texture2D);
            _graphicsDevice.ClearRenderTargetView(_renderTargetView, new SDX.Color4(1.0f, 0, 0, 0));

            //Add to tracker
            _renderer.Resources.AddTrackedObject(_texture2D.ComPointer, this);
            _renderer.Resources.AddTrackedObject(_shaderResourceView.ComPointer, this);
            _renderer.Resources.AddTrackedObject(_renderTargetView.ComPointer, this);

            _mipCount = _texture2D.Description.MipLevels;

            if (depthFormat != DepthFormat.None)
            {
                D3D.Texture2DDescription dbdesc = new D3D.Texture2DDescription();
                dbdesc.ArraySize      = 1;
                dbdesc.BindFlags      = D3D.BindFlags.DepthStencil;
                dbdesc.CpuAccessFlags = D3D.CpuAccessFlags.None;
                dbdesc.Format         = D3D10Helper.ToD3DDepthFormat(depthFormat);
                dbdesc.Height         = height;
                dbdesc.Width          = width;
                dbdesc.Usage          = D3D.ResourceUsage.Default;
                dbdesc.OptionFlags    = D3D.ResourceOptionFlags.None;
                dbdesc.MipLevels      = 1;
                if (multiSampleCount > 1)
                {
                    dbdesc.SampleDescription = new SlimDX.DXGI.SampleDescription(multiSampleCount, 0);
                }
                else
                {
                    dbdesc.SampleDescription = new SlimDX.DXGI.SampleDescription(1, 0);
                }

                using (D3D.Texture2D depthBuffer = new D3D.Texture2D(_graphicsDevice, dbdesc)) {
                    _depthStencilView = new D3D.DepthStencilView(_graphicsDevice, depthBuffer);
                    if (depthFormat == Tesla.Graphics.DepthFormat.Depth24Stencil8)
                    {
                        _graphicsDevice.ClearDepthStencilView(_depthStencilView, D3D.DepthStencilClearFlags.Depth | D3D.DepthStencilClearFlags.Stencil, 1.0f, 0);
                    }
                    else
                    {
                        _graphicsDevice.ClearDepthStencilView(_depthStencilView, D3D.DepthStencilClearFlags.Depth, 1.0f, 0);
                    }

                    //Add to tracker
                    _renderer.Resources.AddTrackedObject(_depthStencilView.ComPointer, this);
                }
            }
        }
Example #8
0
        /// <summary>
        /// Creates a new instance of <see cref="D3D10TextureCubeImplementation"/>.
        /// </summary>
        /// <param name="renderer">The D3D10 renderer.</param>
        /// <param name="size">The size (width/height) of each cube face.</param>
        /// <param name="genMipMaps">True if a mipmap chain should be generated or not.</param>
        /// <param name="format">The surface  format.</param>
        /// <param name="depthFormat">The depth-stencil format.</param>
        /// <param name="multiSampleCount">The number of sample locations for multisampling</param>
        /// <param name="usage">Sets the render target's behavior.</param>
        internal D3D10TextureCubeImplementation(D3D10Renderer renderer, int size, bool genMipMaps, SurfaceFormat format, DepthFormat depthFormat, int multiSampleCount, RenderTargetUsage usage)
            : base(size, format, depthFormat, multiSampleCount, usage)
        {
            _renderer       = renderer;
            _graphicsDevice = _renderer.GraphicsDevice;

            if (!renderer.Adapter.QueryRenderTargetFormat(format, depthFormat, multiSampleCount))
            {
                throw new ArgumentException("Format combination not supported.");
            }

            D3D.Texture2DDescription desc2D = new D3D.Texture2DDescription();
            desc2D.ArraySize      = 6;
            desc2D.BindFlags      = D3D.BindFlags.ShaderResource | D3D.BindFlags.RenderTarget;
            desc2D.CpuAccessFlags = D3D.CpuAccessFlags.None;
            desc2D.Format         = D3D10Helper.ToD3DSurfaceFormat(format);
            desc2D.Height         = size;
            desc2D.Width          = size;
            desc2D.Usage          = D3D.ResourceUsage.Default;
            if (genMipMaps)
            {
                desc2D.OptionFlags = D3D.ResourceOptionFlags.GenerateMipMaps | D3D.ResourceOptionFlags.TextureCube;
            }
            else
            {
                desc2D.OptionFlags = D3D.ResourceOptionFlags.TextureCube;
            }
            desc2D.MipLevels = (genMipMaps) ? 0 : 1;
            if (multiSampleCount > 1)
            {
                desc2D.SampleDescription = new SlimDX.DXGI.SampleDescription(multiSampleCount, 0);
            }
            else
            {
                desc2D.SampleDescription = new DXGI.SampleDescription(1, 0);
            }

            //Create the resources
            _texture2D          = new D3D.Texture2D(_graphicsDevice, desc2D);
            _shaderResourceView = new D3D.ShaderResourceView(_graphicsDevice, _texture2D);
            _renderTargetView   = new D3D.RenderTargetView[6];

            //Add to tracker
            _renderer.Resources.AddTrackedObject(_texture2D.ComPointer, this);
            _renderer.Resources.AddTrackedObject(_shaderResourceView.ComPointer, this);

            //Setup each render target view for each face
            for (int i = 0; i < 6; i++)
            {
                D3D.RenderTargetViewDescription rtDesc = new D3D.RenderTargetViewDescription();
                rtDesc.ArraySize       = 1;
                rtDesc.FirstArraySlice = i;
                if (multiSampleCount > 1)
                {
                    rtDesc.Dimension = D3D.RenderTargetViewDimension.Texture2DMultisampledArray;
                }
                else
                {
                    rtDesc.Dimension = D3D.RenderTargetViewDimension.Texture2DArray;
                }
                rtDesc.Format        = desc2D.Format;
                _renderTargetView[i] = new D3D.RenderTargetView(_graphicsDevice, _texture2D, rtDesc);
                _graphicsDevice.ClearRenderTargetView(_renderTargetView[i], new SDX.Color4(1.0f, 0, 0, 0));
                _renderer.Resources.AddTrackedObject(_renderTargetView[i].ComPointer, this);
            }

            _mipCount = _texture2D.Description.MipLevels;

            if (depthFormat != DepthFormat.None)
            {
                D3D.Texture2DDescription dbdesc = new D3D.Texture2DDescription();
                dbdesc.ArraySize      = 6;
                dbdesc.BindFlags      = D3D.BindFlags.DepthStencil;
                dbdesc.CpuAccessFlags = D3D.CpuAccessFlags.None;
                dbdesc.Format         = D3D10Helper.ToD3DDepthFormat(depthFormat);
                dbdesc.Height         = size;
                dbdesc.Width          = size;
                dbdesc.Usage          = D3D.ResourceUsage.Default;
                dbdesc.OptionFlags    = D3D.ResourceOptionFlags.None;
                dbdesc.MipLevels      = 1;
                if (multiSampleCount > 1)
                {
                    dbdesc.SampleDescription = new SlimDX.DXGI.SampleDescription(multiSampleCount, 0);
                }
                else
                {
                    dbdesc.SampleDescription = new SlimDX.DXGI.SampleDescription(1, 0);
                }

                using (D3D.Texture2D depthBuffer = new D3D.Texture2D(_graphicsDevice, dbdesc)) {
                    _depthStencilView = new D3D.DepthStencilView(_graphicsDevice, depthBuffer);
                    if (depthFormat == Tesla.Graphics.DepthFormat.Depth24Stencil8)
                    {
                        _graphicsDevice.ClearDepthStencilView(_depthStencilView, D3D.DepthStencilClearFlags.Depth | D3D.DepthStencilClearFlags.Stencil, 1.0f, 0);
                    }
                    else
                    {
                        _graphicsDevice.ClearDepthStencilView(_depthStencilView, D3D.DepthStencilClearFlags.Depth, 1.0f, 0);
                    }
                    //Add to tracker
                    _renderer.Resources.AddTrackedObject(_depthStencilView.ComPointer, this);
                }
            }
        }
Example #9
0
        private void CreateDepthStencil()
        {
            DXGI.SampleDescription sampleDesc = new SlimDX.DXGI.SampleDescription();
            sampleDesc.Count = 1;
            sampleDesc.Quality = 0;

            D3D10.Texture2DDescription texDesc = new SlimDX.Direct3D10.Texture2DDescription();
            texDesc.Width = width;
            texDesc.Height = height;
            texDesc.MipLevels = 1;
            texDesc.ArraySize = 1;
            texDesc.BindFlags = D3D10.BindFlags.DepthStencil;
            texDesc.CpuAccessFlags = D3D10.CpuAccessFlags.None;
            texDesc.Format = DXGI.Format.D32_Float;
            texDesc.SampleDescription = sampleDesc;
            texDesc.Usage = D3D10.ResourceUsage.Default;
            texDesc.OptionFlags = D3D10.ResourceOptionFlags.None;

            D3D10.DepthStencilViewDescription stencilViewDesc = new SlimDX.Direct3D10.DepthStencilViewDescription();

            stencilViewDesc.Dimension = D3D10.DepthStencilViewDimension.Texture2D;
            stencilViewDesc.Format = texDesc.Format;
            stencilViewDesc.MipSlice = 0;
            stencilViewDesc.FirstArraySlice = 0;
            stencilViewDesc.ArraySize = 1;

            using (D3D10.Texture2D stencilTex = new SlimDX.Direct3D10.Texture2D(device, texDesc))
            {
                depthStencilView = new SlimDX.Direct3D10.DepthStencilView(device, stencilTex,stencilViewDesc);
            }
        }
Example #10
0
        public void SetRenderTargets(RenderTargetBinding[] targets)
        {
            D3D10Helper.CheckDisposed(_graphicsDevice);

            if (targets == null || targets.Length == 0)
            {
                //Clear targets
                ClearTargets();

                //Set the swapchain's targets to the device, unbinding the current ones
                SetBackBufferTargets();

                //Generate mip maps of previously bounded targets
                GenerateTargetMips();
            }
            else
            {
                //If we have a larger array than the max targets possible, throw an exception
                if (targets.Length > _currentRenderTargets.Length)
                {
                    throw new ArgumentOutOfRangeException("Cannot bind more than 8 targets at a time.");
                }

                //Clear targets
                ClearTargets();

                D3D.RenderTargetView rtv;
                D3D.DepthStencilView dsv         = null;
                DepthFormat          depthFormat = DepthFormat.None;
                int width      = 0;
                int height     = 0;
                int samples    = 0;
                int pixelDepth = 0;
                for (int i = 0; i < targets.Length; i++)
                {
                    RenderTargetBinding binding = targets[i];
                    RenderTargetUsage   usage   = RenderTargetUsage.DiscardContents;
                    if (binding.IsRenderTargetCube)
                    {
                        D3D10TextureCubeImplementation cubeImpl = binding.RenderTargetCube.Implementation as D3D10TextureCubeImplementation;
                        D3D10Helper.CheckDisposed(cubeImpl);
                        rtv   = cubeImpl.GetRenderTargetView(binding.CubeMapFace);
                        usage = cubeImpl.TargetUsage;
                        if (i == 0)
                        {
                            width       = cubeImpl.Size;
                            height      = cubeImpl.Size;
                            dsv         = cubeImpl.D3D10DepthStencilView;
                            depthFormat = cubeImpl.DepthFormat;
                            samples     = cubeImpl.MultiSampleCount;
                            pixelDepth  = D3D10Helper.FormatSize(cubeImpl.Format);
                        }
                        else
                        {
                            if (cubeImpl.Size != width || cubeImpl.Size != height || cubeImpl.MultiSampleCount != samples ||
                                D3D10Helper.FormatSize(cubeImpl.Format) != pixelDepth)
                            {
                                throw new ArgumentException("All render target dimensions must match.");
                            }
                        }
                    }
                    else
                    {
                        D3D10Texture2DImplementation texImpl = binding.RenderTarget2D.Implementation as D3D10Texture2DImplementation;
                        D3D10Helper.CheckDisposed(texImpl);
                        rtv   = texImpl.D3D10RenderTargetVew;
                        usage = texImpl.TargetUsage;
                        if (i == 0)
                        {
                            width       = texImpl.Width;
                            height      = texImpl.Height;
                            dsv         = texImpl.D3D10DepthStencilView;
                            depthFormat = texImpl.DepthFormat;
                            samples     = texImpl.MultiSampleCount;
                            pixelDepth  = D3D10Helper.FormatSize(texImpl.Format);
                        }
                        else
                        {
                            if (texImpl.Width != width || texImpl.Height != height || texImpl.MultiSampleCount != samples ||
                                D3D10Helper.FormatSize(texImpl.Format) != pixelDepth)
                            {
                                throw new ArgumentException("All render target dimensions, sample count, and bit depth must match.");
                            }
                        }
                    }

                    //Set the targets to the arrays, after we're done processing we set them all at once
                    _currentRenderTargets[i] = binding;
                    _views[i] = rtv;
                    _currentRenderTargetCount++;

                    //Check usage, if we're using a target that isn't preserve contents,
                    //then we clear the target.
                    if (usage != RenderTargetUsage.PreserveContents)
                    {
                        _graphicsDevice.ClearRenderTargetView(rtv, new SlimDX.Color4(1.0f, 0, 0, 0));
                        if (i == 0 && dsv != null)
                        {
                            D3D.DepthStencilClearFlags flags = D3D.DepthStencilClearFlags.Depth;
                            if (depthFormat == DepthFormat.Depth24Stencil8)
                            {
                                flags |= D3D.DepthStencilClearFlags.Stencil;
                            }
                            _graphicsDevice.ClearDepthStencilView(dsv, flags, 1.0f, 0);
                        }
                    }
                }

                //Bind targets
                if (dsv != null)
                {
                    _graphicsDevice.OutputMerger.SetTargets(dsv, _views);
                }
                else
                {
                    _graphicsDevice.OutputMerger.SetTargets(_views);
                }

                //Generate mip maps of previously bounded targets
                GenerateTargetMips();

                //Note: What if a user binds a target here that was previously bound,
                //is generating mip maps on a bound target ok? I don't know if
                //a user would even want to do that...
            }
        }
Example #11
0
        /// <summary>
        /// Clears the active targets, or back buffer if there are none.
        /// </summary>
        /// <param name="options"></param>
        /// <param name="color"></param>
        /// <param name="depth"></param>
        /// <param name="stencil"></param>
        public void ClearTargets(ClearOptions options, Color color, float depth, int stencil)
        {
            D3D10Helper.CheckDisposed(_graphicsDevice);
            SlimDX.Color4 sc;
            D3D10Helper.Convert(ref color, out sc);
            if (_currentRenderTargetCount == 0 && _activeBackBuffer != null)
            {
                D3D10Helper.CheckDisposed(_activeBackBuffer);
                if (_activeBackBuffer.D3D10DepthStencilView != null)
                {
                    if (((options & ClearOptions.Depth) == ClearOptions.Depth) && ((options & ClearOptions.Stencil) == ClearOptions.Stencil))
                    {
                        _graphicsDevice.ClearDepthStencilView(_activeBackBuffer.D3D10DepthStencilView, D3D.DepthStencilClearFlags.Depth | D3D.DepthStencilClearFlags.Stencil, depth, (byte)stencil);
                    }
                    else if ((options & ClearOptions.Depth) == ClearOptions.Depth)
                    {
                        _graphicsDevice.ClearDepthStencilView(_activeBackBuffer.D3D10DepthStencilView, D3D.DepthStencilClearFlags.Depth, depth, (byte)stencil);
                    }
                    else if ((options & ClearOptions.Stencil) == ClearOptions.Stencil)
                    {
                        _graphicsDevice.ClearDepthStencilView(_activeBackBuffer.D3D10DepthStencilView, D3D.DepthStencilClearFlags.Stencil, depth, (byte)stencil);
                    }
                }
                if ((_activeBackBuffer.D3D10RenderTargetView != null) && ((options & ClearOptions.Target) == ClearOptions.Target))
                {
                    _graphicsDevice.ClearRenderTargetView(_activeBackBuffer.D3D10RenderTargetView, sc);
                }
            }
            else
            {
                for (int i = 0; i < _currentRenderTargetCount; i++)
                {
                    RenderTargetBinding  binding = _currentRenderTargets[i];
                    D3D.DepthStencilView dsv     = null;
                    D3D.RenderTargetView rtv     = null;

                    if (!binding.IsRenderTargetCube)
                    {
                        D3D10Texture2DImplementation impl2D = binding.RenderTarget2D.Implementation as D3D10Texture2DImplementation;
                        D3D10Helper.CheckDisposed(impl2D);
                        dsv = impl2D.D3D10DepthStencilView;
                        rtv = impl2D.D3D10RenderTargetVew;
                    }
                    else
                    {
                        D3D10TextureCubeImplementation implcube = binding.RenderTargetCube.Implementation as D3D10TextureCubeImplementation;
                        D3D10Helper.CheckDisposed(implcube);
                        dsv = implcube.D3D10DepthStencilView;
                        rtv = implcube.GetRenderTargetView(binding.CubeMapFace);
                    }

                    if (dsv != null)
                    {
                        if (((options & ClearOptions.Depth) == ClearOptions.Depth) && ((options & ClearOptions.Stencil) == ClearOptions.Stencil))
                        {
                            _graphicsDevice.ClearDepthStencilView(dsv, D3D.DepthStencilClearFlags.Depth | D3D.DepthStencilClearFlags.Stencil, depth, (byte)stencil);
                        }
                        else if ((options & ClearOptions.Depth) == ClearOptions.Depth)
                        {
                            _graphicsDevice.ClearDepthStencilView(dsv, D3D.DepthStencilClearFlags.Depth, depth, (byte)stencil);
                        }
                        else if ((options & ClearOptions.Stencil) == ClearOptions.Stencil)
                        {
                            _graphicsDevice.ClearDepthStencilView(dsv, D3D.DepthStencilClearFlags.Stencil, depth, (byte)stencil);
                        }
                    }

                    if ((rtv != null) && ((options & ClearOptions.Target) == ClearOptions.Target))
                    {
                        _graphicsDevice.ClearRenderTargetView(rtv, sc);
                    }
                }
            }
        }
Example #12
0
        public void SetSize(int width, int height)
        {
            if (DepthBuffer != null) DepthBuffer.Dispose();
            if (DepthBufferView != null) DepthBufferView.Dispose();
            if (RenderTarget != null) RenderTarget.Dispose();

            SwapChain.ResizeBuffers(1, width, height, DXGI.Format.R8G8B8A8_UNorm, DXGI.SwapChainFlags.None);

            RenderTarget = new Texturing.RenderTarget(this, width, height);

            D3D.Texture2DDescription depthbufferdesc = new D3D.Texture2DDescription()
            {
                Width = width,
                Height = height,
                MipLevels = 1,
                ArraySize = 1,
                Format = SlimDX.DXGI.Format.D24_UNorm_S8_UInt,
                SampleDescription = new SlimDX.DXGI.SampleDescription(1, 0),
                Usage = D3D.ResourceUsage.Default,
                BindFlags = D3D.BindFlags.DepthStencil,
                CpuAccessFlags = D3D.CpuAccessFlags.None,
                OptionFlags = D3D.ResourceOptionFlags.None
            };

            DepthBuffer = new D3D.Texture2D(Device, depthbufferdesc);
            DepthBufferView = new D3D.DepthStencilView(Device, DepthBuffer);

            Viewport = new D3D.Viewport()
            {
                X = 0,
                Y = 0,
                Width = width,
                Height = height,
                MinZ = 0.0f,
                MaxZ = 1.0f
            };
            Device.Rasterizer.SetViewports(Viewport);
            SetOutputTargets();
        }