public void CmdCopyImageToBuffer( [FromProperty("this")] GenCommandBuffer commandBuffer, GenImage srcImage, VkImageLayout srcImageLayout, GenBuffer dstBuffer, [CountFor("regions")] int regionCount, [IsArray] VkBufferImageCopy *pRegions) { }
public void CmdCopyBufferToImage( [FromProperty("this")] GenCommandBuffer commandBuffer, GenBuffer srcBuffer, GenImage dstImage, VkImageLayout dstImageLayout, [CountFor("regions")] int regionCount, [IsArray] VkBufferImageCopy *pRegions) { }
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); }
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); }
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); }
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); }