private void CreateStaging() { if (_staging == null) { D3D.Texture1DDescription desc = new D3D.Texture1DDescription(); desc.ArraySize = 1; desc.BindFlags = D3D.BindFlags.None; desc.CpuAccessFlags = D3D.CpuAccessFlags.Write | D3D.CpuAccessFlags.Read; desc.Format = D3D10Helper.ToD3DSurfaceFormat(base.Format); desc.Width = base.Width; desc.MipLevels = _mipCount; desc.Usage = D3D.ResourceUsage.Staging; _staging = new D3D.Texture1D(_graphicsDevice, desc); //Add to tracker _renderer.Resources.AddTrackedObject(_staging.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); } } }