Esempio n. 1
0
 public void CmdCopyImageToBuffer(
     [FromProperty("this")] GenCommandBuffer commandBuffer,
     GenImage srcImage,
     VkImageLayout srcImageLayout,
     GenBuffer dstBuffer,
     [CountFor("regions")] int regionCount,
     [IsArray] VkBufferImageCopy *pRegions)
 {
 }
Esempio n. 2
0
 public void CmdCopyBufferToImage(
     [FromProperty("this")] GenCommandBuffer commandBuffer,
     GenBuffer srcBuffer,
     GenImage dstImage,
     VkImageLayout dstImageLayout,
     [CountFor("regions")] int regionCount,
     [IsArray] VkBufferImageCopy *pRegions)
 {
 }
Esempio n. 3
0
 internal void copy_image_to_buffer(Buffer buffer, Image image, uint num_blits, VkBufferImageCopy *blits)
 {
     vkCmdCopyImageToBuffer(handle, image.handle, image.get_layout(VkImageLayout.TransferSrcOptimal), buffer.handle, num_blits, blits);
 }
Esempio n. 4
0
 internal void copy_buffer_to_image(Image image, Buffer buffer, uint num_blits, VkBufferImageCopy *blits)
 {
     vkCmdCopyBufferToImage(handle, buffer.handle, image.handle, image.get_layout(VkImageLayout.TransferDstOptimal), num_blits, blits);
 }
Esempio n. 5
0
 internal void copy_buffer_to_image(VkImage image, VkBuffer buffer, uint num_blits, VkBufferImageCopy *blits, VkImageLayout layout)
 {
     vkCmdCopyBufferToImage(handle, buffer, image, layout, num_blits, blits);
 }
Esempio n. 6
0
        public void SetData(byte[] data)
        {
            buffer = new Buffer(NativeDevice, new()
            {
                BufferFlags = BufferFlags.ShaderResource,
                SizeInBytes = Size,
                ByteStride  = Size,
                Usage       = ResourceUsage.CPU_To_GPU
            });


            buffer.SetData(data);

            CommandBuffer cmd = new(NativeDevice, CommandBufferType.AsyncTransfer);

            cmd.BeginOneTimeSubmit();


            VkImageSubresourceRange subresource_range = new(VkImageAspectFlags.Color, 0, (uint)MipLevels, 0, 1);

            VkImageMemoryBarrier memory_barrier = new()
            {
                sType               = VkStructureType.ImageMemoryBarrier,
                pNext               = null,
                image               = handle,
                subresourceRange    = subresource_range,
                srcAccessMask       = VkAccessFlags.None,
                dstAccessMask       = VkAccessFlags.TransferWrite,
                oldLayout           = VkImageLayout.Undefined,
                newLayout           = VkImageLayout.TransferDstOptimal,
                srcQueueFamilyIndex = QueueFamilyIgnored,
                dstQueueFamilyIndex = QueueFamilyIgnored
            };

            cmd.PipelineBarrier(VkPipelineStageFlags.TopOfPipe, VkPipelineStageFlags.Transfer, VkDependencyFlags.None, 0, null, 0, null, memory_barrier);



            uint num_blits = (uint)1;
            int  offset    = 0;

            VkBufferImageCopy *blits = stackalloc VkBufferImageCopy[MipLevels]; // Setup buffer copy regions for each mip level.

            for (uint i = 0; i < num_blits; i++)
            {
                blits[i] = new()
                {
                    imageSubresource = new(VkImageAspectFlags.Color, i, 0, 1),
                    imageExtent      = new(Width, Height, 1),
                    bufferOffset     = (ulong)offset
                };

                offset += Size;
            }
            cmd.copy_buffer_to_image(handle, buffer.handle, num_blits, blits, VkImageLayout.TransferDstOptimal);



            VkImageMemoryBarrier memory_barrier_read = new()
            {
                sType               = VkStructureType.ImageMemoryBarrier,
                pNext               = null,
                image               = handle,
                subresourceRange    = subresource_range,
                srcAccessMask       = VkAccessFlags.TransferWrite,
                dstAccessMask       = VkAccessFlags.ShaderRead,
                oldLayout           = VkImageLayout.TransferDstOptimal,
                newLayout           = VkImageLayout.ShaderReadOnlyOptimal,
                srcQueueFamilyIndex = QueueFamilyIgnored,
                dstQueueFamilyIndex = QueueFamilyIgnored
            };

            cmd.PipelineBarrier(VkPipelineStageFlags.Transfer, VkPipelineStageFlags.FragmentShader, VkDependencyFlags.None, 0, null, 0, null, memory_barrier_read);

            cmd.End();


            Fence fence = new Fence(NativeDevice);

            NativeDevice.Submit(cmd, fence);

            fence.Wait();

            //if (fence.IsSignaled)


            // Cleanup staging resources.
            fence.Dispose();
            vkFreeMemory(NativeDevice.handle, buffer_memory, null);
            vkDestroyBuffer(NativeDevice.handle, buffer.handle, null);
        }

        public void Image2D()
        {
            buffer = new Buffer(NativeDevice, new()
            {
                BufferFlags = BufferFlags.ShaderResource,
                SizeInBytes = Size,
                ByteStride  = Size,
                Usage       = ResourceUsage.CPU_To_GPU
            });


            buffer.SetData(Data);

            CommandBuffer cmd = new(NativeDevice, CommandBufferType.AsyncTransfer);

            cmd.BeginOneTimeSubmit();


            VkImageSubresourceRange subresource_range = new(VkImageAspectFlags.Color, 0, (uint)MipLevels, 0, 1);

            VkImageMemoryBarrier memory_barrier = new()
            {
                sType               = VkStructureType.ImageMemoryBarrier,
                pNext               = null,
                image               = handle,
                subresourceRange    = subresource_range,
                srcAccessMask       = VkAccessFlags.None,
                dstAccessMask       = VkAccessFlags.TransferWrite,
                oldLayout           = VkImageLayout.Undefined,
                newLayout           = VkImageLayout.TransferDstOptimal,
                srcQueueFamilyIndex = QueueFamilyIgnored,
                dstQueueFamilyIndex = QueueFamilyIgnored
            };

            cmd.PipelineBarrier(VkPipelineStageFlags.TopOfPipe, VkPipelineStageFlags.Transfer, VkDependencyFlags.None, 0, null, 0, null, memory_barrier);



            uint num_blits = (uint)1;
            int  offset    = 0;

            VkBufferImageCopy *blits = stackalloc VkBufferImageCopy[MipLevels]; // Setup buffer copy regions for each mip level.

            for (uint i = 0; i < num_blits; i++)
            {
                blits[i] = new()
                {
                    imageSubresource = new(VkImageAspectFlags.Color, i, 0, 1),
                    imageExtent      = new(Width, Height, 1),
                    bufferOffset     = (ulong)offset
                };

                offset += Size;
            }
            cmd.copy_buffer_to_image(handle, buffer.handle, num_blits, blits, VkImageLayout.TransferDstOptimal);



            VkImageMemoryBarrier memory_barrier_read = new()
            {
                sType               = VkStructureType.ImageMemoryBarrier,
                pNext               = null,
                image               = handle,
                subresourceRange    = subresource_range,
                srcAccessMask       = VkAccessFlags.TransferWrite,
                dstAccessMask       = VkAccessFlags.ShaderRead,
                oldLayout           = VkImageLayout.TransferDstOptimal,
                newLayout           = VkImageLayout.ShaderReadOnlyOptimal,
                srcQueueFamilyIndex = QueueFamilyIgnored,
                dstQueueFamilyIndex = QueueFamilyIgnored
            };

            cmd.PipelineBarrier(VkPipelineStageFlags.Transfer, VkPipelineStageFlags.FragmentShader, VkDependencyFlags.None, 0, null, 0, null, memory_barrier_read);

            cmd.End();


            Fence fence = new Fence(NativeDevice);

            NativeDevice.Submit(cmd, fence);

            fence.Wait();

            //if (fence.IsSignaled)


            // Cleanup staging resources.
            fence.Dispose();
            vkFreeMemory(NativeDevice.handle, buffer_memory, null);
            vkDestroyBuffer(NativeDevice.handle, buffer.handle, null);
        }

        internal VkImageView get_depth_stencil_view()
        {
            if (!IsDepthStencil)
            {
                return(VkImageView.Null);
            }

            // Create a Depth stencil view on this texture2D
            VkImageViewCreateInfo createInfo = new VkImageViewCreateInfo
            {
                sType            = VkStructureType.ImageViewCreateInfo,
                flags            = VkImageViewCreateFlags.None,
                pNext            = null,
                viewType         = VkImageViewType.Image2D,
                format           = Format,
                image            = handle,
                components       = VkComponentMapping.Identity,
                subresourceRange = new VkImageSubresourceRange(VkImageAspectFlags.Depth | VkImageAspectFlags.Stencil, 0, 1, 0, 1)
            };


            vkCreateImageView(NativeDevice.handle, &createInfo, null, out VkImageView _view).CheckResult();
            return(_view);
        }

        internal VkImageView get_image_view()
        {
            if (!IsShaderResource)
            {
                return(VkImageView.Null);
            }

            // Create image view.
            VkImageViewCreateInfo imageViewCreateInfo = new VkImageViewCreateInfo()
            {
                sType            = VkStructureType.ImageViewCreateInfo,
                image            = handle,
                viewType         = VkImageViewType.Image2D,
                format           = Format,
                subresourceRange = new VkImageSubresourceRange(VkImageAspectFlags.Color, 0, 1, 0, 1), // TODO: MipMaps
            };

            vkCreateImageView(NativeDevice.handle, &imageViewCreateInfo, null, out var _view);

            return(_view);
        }