private void CreateSwapChain(IntPtr windowHandle, PresentationParameters presentParams)
        {
            DXGI.Format surfaceFormat = D3D10Helper.ToD3DSurfaceFormat(presentParams.BackBufferFormat);

            switch (presentParams.PresentInterval)
            {
            case PresentInterval.Immediate:
                _interval = 0;
                break;

            case PresentInterval.One:
                _interval = 1;
                break;

            case PresentInterval.Two:
                _interval = 2;
                break;
            }

            DXGI.SampleDescription sampleDesc = new DXGI.SampleDescription(1, 0);
            bool msEnabled = false;

            if (presentParams.MultiSampleCount > 1)
            {
                sampleDesc.Count = presentParams.MultiSampleCount;
                int q = _graphicsDevice.CheckMultisampleQualityLevels(surfaceFormat, presentParams.MultiSampleCount);
                if (presentParams.MultiSampleQuality < q)
                {
                    sampleDesc.Quality = presentParams.MultiSampleQuality;
                }
                else
                {
                    sampleDesc.Quality = q - 1;
                }
                msEnabled = true;
            }

            DXGI.SwapEffect swap;
            if (presentParams.RenderTargetUsage == RenderTargetUsage.PlatformDefault)
            {
                if (msEnabled)
                {
                    swap = DXGI.SwapEffect.Discard;
                }
                else
                {
                    swap = DXGI.SwapEffect.Sequential;
                }
            }
            else if (presentParams.RenderTargetUsage == RenderTargetUsage.DiscardContents)
            {
                swap = DXGI.SwapEffect.Discard;
            }
            else
            {
                swap = DXGI.SwapEffect.Sequential;
            }
            DXGI.ModeDescription modeDesc = new DXGI.ModeDescription(presentParams.BackBufferWidth, presentParams.BackBufferHeight, new SDX.Rational(60, 1), surfaceFormat);
            modeDesc.Scaling = DXGI.DisplayModeScaling.Stretched;
            _swapChain       = new DXGI.SwapChain(_factory, _graphicsDevice, new DXGI.SwapChainDescription {
                BufferCount       = 1,
                Flags             = DXGI.SwapChainFlags.AllowModeSwitch,
                IsWindowed        = true,
                ModeDescription   = modeDesc,
                OutputHandle      = windowHandle,
                SampleDescription = sampleDesc,
                SwapEffect        = swap,
                Usage             = DXGI.Usage.RenderTargetOutput
            });

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

            _factory.SetWindowAssociation(windowHandle, DXGI.WindowAssociationFlags.IgnoreAll | DXGI.WindowAssociationFlags.IgnoreAltEnter);
        }
Example #2
0
        /// <summary>
        /// Creates a new instance of <see cref="D3D10TextureCubeImplementation"/>.
        /// </summary>
        /// <param name="renderer">D3D10 renderer</param>
        /// <param name="size">The size (width/height) of each cube face.</param>
        /// <param name="genMipMaps">True if mip levels should be generated.</param>
        /// <param name="format">The surface format.</param>
        /// <param name="data">The initial data for the first mip level.</param>
        /// <exception cref="System.ArgumentException">Thrown if the data buffery array does not correspond to a valid cube map (6 faces, all the same size)</exception>
        /// <exception cref="Tesla.Core.TeslaException">Thrown if there was an error writing to the texture.</exception>
        internal D3D10TextureCubeImplementation(D3D10Renderer renderer, int size, bool genMipMaps, SurfaceFormat format, DataBuffer[] data)
            : base(size, format)
        {
            //Set the common properties
            _renderer       = renderer;
            _graphicsDevice = _renderer.GraphicsDevice;

            //Do we want to generate mip maps, and do we have the data to do so? (if not, cancel mip map generation)
            bool canGenMipmaps = (genMipMaps && (data != null));

            //Setup texture description
            D3D.Texture2DDescription descTex = new D3D.Texture2DDescription();
            descTex.ArraySize         = 6;
            descTex.Width             = size;
            descTex.Height            = size;
            descTex.Usage             = _usage = D3D.ResourceUsage.Default;
            descTex.CpuAccessFlags    = D3D.CpuAccessFlags.None;
            descTex.Format            = D3D10Helper.ToD3DSurfaceFormat(format);
            descTex.SampleDescription = new DXGI.SampleDescription(1, 0);
            descTex.MipLevels         = (genMipMaps) ? 0 : 1;

            //Set mip map generation params
            if (canGenMipmaps)
            {
                descTex.BindFlags   = D3D.BindFlags.ShaderResource | D3D.BindFlags.RenderTarget;
                descTex.OptionFlags = D3D.ResourceOptionFlags.GenerateMipMaps | D3D.ResourceOptionFlags.TextureCube;
            }
            else
            {
                descTex.BindFlags   = D3D.BindFlags.ShaderResource;
                descTex.OptionFlags = D3D.ResourceOptionFlags.TextureCube;
            }

            //Create the texture and shader view
            _texture2D          = new D3D.Texture2D(_graphicsDevice, descTex);
            _shaderResourceView = new D3D.ShaderResourceView(_graphicsDevice, _texture2D);

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

            //Set the final mip count
            _mipCount = _texture2D.Description.MipLevels;

            //Now set the initial data if its present
            if (data != null)
            {
                if (data.Length != 6)
                {
                    Dispose();
                    throw new ArgumentException("Initial data array must have six data buffers, one for each cube face.");
                }

                int num = data[0].Length;

                for (int i = 1; i < 6; i++)
                {
                    if (data[i].Length != num)
                    {
                        Dispose();
                        throw new ArgumentException("All data buffers must be of same length");
                    }
                }

                try {
                    for (int i = 0; i < 6; i++)
                    {
                        DataBuffer db = data[i];
                        this.SetData <byte>((CubeMapFace)i, db.ByteDataCopy, 0, null, 0, db.ElementSizeInBytes * db.Length);
                    }

                    if (genMipMaps)
                    {
                        _graphicsDevice.GenerateMips(_shaderResourceView);
                    }

                    //Dispose of the staging texture
                    if (_staging != null)
                    {
                        _staging.Dispose();
                        _staging = null;
                    }
                } catch (Exception e) {
                    Dispose();
                    throw new TeslaException("Error setting Texture data.", e);
                }
            }
        }
Example #3
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);
                }
            }
        }
        /// <summary>
        /// Creates a new instance of <see cref="D3D10Texture1DImplementation"/>.
        /// </summary>
        /// <param name="renderer">The D3D10 renderer.</param>
        /// <param name="width">The width of the texture.</param>
        /// <param name="genMipMaps">True if mip maps should be generated.</param>
        /// <param name="format">The surface format.</param>
        /// <param name="data">The initial data.</param>
        internal D3D10Texture1DImplementation(D3D10Renderer renderer, int width, bool genMipMaps, SurfaceFormat format, DataBuffer data)
            : base(width, format)
        {
            //Set common properties
            _renderer       = renderer;
            _graphicsDevice = _renderer.GraphicsDevice;

            //Do we want to generate mip maps, and do we have the data to do so? (if not, cancel mip map generation)
            bool canGenMipmaps = (genMipMaps && (data != null));

            D3D.Texture1DDescription descTex = new D3D.Texture1DDescription();
            descTex.ArraySize      = 1;
            descTex.Width          = width;
            descTex.Usage          = _usage = D3D.ResourceUsage.Default;
            descTex.CpuAccessFlags = D3D.CpuAccessFlags.None;
            descTex.Format         = D3D10Helper.ToD3DSurfaceFormat(format);
            descTex.MipLevels      = (genMipMaps) ? 0 : 1;

            //Set mip map generation params
            if (canGenMipmaps)
            {
                descTex.BindFlags   = D3D.BindFlags.ShaderResource | D3D.BindFlags.RenderTarget;
                descTex.OptionFlags = D3D.ResourceOptionFlags.GenerateMipMaps;
            }
            else
            {
                descTex.BindFlags   = D3D.BindFlags.ShaderResource;
                descTex.OptionFlags = D3D.ResourceOptionFlags.None;
            }

            //Create the texture and shader view
            _texture1D          = new D3D.Texture1D(_graphicsDevice, descTex);
            _shaderResourceView = new D3D.ShaderResourceView(_graphicsDevice, _texture1D);

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

            //Set the final mip count
            _mipCount = _texture1D.Description.MipLevels;

            //Now set the initial data if its present
            if (data != null)
            {
                try {
                    this.SetData <byte>(data.ByteDataCopy, 0, 0, width, 0, data.ElementSizeInBytes * data.Length);

                    if (genMipMaps)
                    {
                        _graphicsDevice.GenerateMips(_shaderResourceView);
                    }

                    //Dispose of the staging texture
                    if (_staging != null)
                    {
                        _staging.Dispose();
                        _staging = null;
                    }
                } catch (Exception e) {
                    Dispose();
                    throw new TeslaException("Error setting Texture data.", e);
                }
            }
        }