public void Allocate_UploadTexture3D_Copy_Full(Device device)
        {
            using UploadTexture3D <int> uploadTexture3D = device.Get().AllocateUploadTexture3D <int>(256, 256, 16);

            for (int i = 0; i < uploadTexture3D.Depth; i++)
            {
                for (int j = 0; j < uploadTexture3D.Height; j++)
                {
                    new Random(i * 5381 + j).NextBytes(uploadTexture3D.View.GetRowSpan(j, i).AsBytes());
                }
            }

            using ReadOnlyTexture3D <int> readOnlyTexture3D = device.Get().AllocateReadOnlyTexture3D <int>(uploadTexture3D.Width, uploadTexture3D.Height, uploadTexture3D.Depth);

            uploadTexture3D.CopyTo(readOnlyTexture3D);

            int[,,] result = readOnlyTexture3D.ToArray();

            Assert.AreEqual(uploadTexture3D.Width, result.GetLength(2));
            Assert.AreEqual(uploadTexture3D.Height, result.GetLength(1));
            Assert.AreEqual(uploadTexture3D.Depth, result.GetLength(0));

            for (int i = 0; i < uploadTexture3D.Depth; i++)
            {
                for (int j = 0; j < uploadTexture3D.Height; j++)
                {
                    Span <int> sourceRow      = uploadTexture3D.View.GetRowSpan(j, i);
                    Span <int> destinationRow = result.AsSpan2D(i).GetRowSpan(j);

                    Assert.IsTrue(sourceRow.SequenceEqual(destinationRow));
                }
            }
        }
        public void Allocate_UploadTexture3D_Copy_Range(Device device, int x, int y, int z, int width, int height, int depth)
        {
            using UploadTexture3D <int> uploadTexture3D = device.Get().AllocateUploadTexture3D <int>(256, 256, 16);

            for (int i = 0; i < uploadTexture3D.Depth; i++)
            {
                for (int j = 0; j < uploadTexture3D.Height; j++)
                {
                    new Random(i * 5381 + j).NextBytes(uploadTexture3D.View.GetRowSpan(j, i).AsBytes());
                }
            }

            using ReadOnlyTexture3D <int> readOnlyTexture3D = device.Get().AllocateReadOnlyTexture3D <int>(uploadTexture3D.Width, uploadTexture3D.Height, uploadTexture3D.Depth);

            uploadTexture3D.CopyTo(readOnlyTexture3D, x, y, z, width, height, depth);

            int[,,] result = readOnlyTexture3D.ToArray();

            for (int i = 0; i < depth; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    Span <int> sourceRow      = uploadTexture3D.View.GetRowSpan(j + y, i + z).Slice(x, width);
                    Span <int> destinationRow = result.AsSpan2D(i).GetRowSpan(j).Slice(0, width);

                    Assert.IsTrue(sourceRow.SequenceEqual(destinationRow));
                }
            }
        }