public ShaderResourceView CreateTexture(int width, int height, FillColor fill)
        {
            var texture = new Texture2D(Device, new Texture2DDescription {
                SampleDescription = new SampleDescription(1, 0),
                Width             = width,
                Height            = height,
                MipLevels         = 1,
                ArraySize         = 1,
                Format            = Format.R8G8B8A8_UNorm,
                Usage             = ResourceUsage.Dynamic,
                BindFlags         = BindFlags.ShaderResource,
                CpuAccessFlags    = CpuAccessFlags.Write
            });

            var rect = DeviceContext.MapSubresource(texture, 0, MapMode.WriteDiscard, MapFlags.None);

            if (rect.Data.CanWrite)
            {
                for (var y = 0; y < width; y++)
                {
                    var rowStart = y * rect.RowPitch;
                    rect.Data.Seek(rowStart, System.IO.SeekOrigin.Begin);
                    for (var x = 0; x < width; x++)
                    {
                        var c = fill.Invoke(x, y);
                        rect.Data.WriteByte(c.R);
                        rect.Data.WriteByte(c.G);
                        rect.Data.WriteByte(c.B);
                        rect.Data.WriteByte(c.A);
                    }
                }
            }

            DeviceContext.UnmapSubresource(texture, 0);

            var view = new ShaderResourceView(Device, texture, new ShaderResourceViewDescription {
                Format          = texture.Description.Format,
                Dimension       = ShaderResourceViewDimension.Texture2D,
                MostDetailedMip = 0,
                MipLevels       = 1
            });

            texture.Dispose();
            return(view);
        }