Ejemplo n.º 1
0
        public static Vk.ImageView CreateImageView(VkContext state, Vk.Image image, Vk.Format format,
                                                   Vk.ImageAspectFlags aspectFlags)
        {
            var subresourceRange = new Vk.ImageSubresourceRange();

            subresourceRange.AspectMask     = aspectFlags;
            subresourceRange.BaseMipLevel   = 0;
            subresourceRange.LevelCount     = 1;
            subresourceRange.BaseArrayLayer = 0;
            subresourceRange.LayerCount     = 1;

            var viewInfo = new Vk.ImageViewCreateInfo();

            viewInfo.Image            = image;
            viewInfo.ViewType         = Vk.ImageViewType.View2D;
            viewInfo.Format           = format;
            viewInfo.SubresourceRange = subresourceRange;

            return(state.Device.CreateImageView(viewInfo));
        }
Ejemplo n.º 2
0
        public static ImageWithMemory CreateImage(VkContext state, uint width, uint height,
                                                  Vk.Format format, Vk.ImageTiling tiling, Vk.ImageUsageFlags usageFlags,
                                                  Vk.MemoryPropertyFlags props)
        {
            var extent = new Vk.Extent3D();

            extent.Width  = width;
            extent.Height = height;
            extent.Depth  = 1;

            var imageInfo = new Vk.ImageCreateInfo();

            imageInfo.ImageType     = Vk.ImageType.Image2D;
            imageInfo.Extent        = extent;
            imageInfo.MipLevels     = 1;
            imageInfo.ArrayLayers   = 1;
            imageInfo.Format        = format;
            imageInfo.Tiling        = tiling;
            imageInfo.InitialLayout = Vk.ImageLayout.Undefined;
            imageInfo.Usage         = usageFlags;
            imageInfo.Samples       = Vk.SampleCountFlags.Count1;
            imageInfo.SharingMode   = Vk.SharingMode.Exclusive;

            var image = new ImageWithMemory();

            image.Image = state.Device.CreateImage(imageInfo);
            var memoryReqs = state.Device.GetImageMemoryRequirements(image.Image);

            var allocInfo = new Vk.MemoryAllocateInfo();

            allocInfo.AllocationSize  = memoryReqs.Size;
            allocInfo.MemoryTypeIndex = FindMemoryType(memoryReqs.MemoryTypeBits,
                                                       state.PhysicalDevice, props);

            image.Memory = state.Device.AllocateMemory(allocInfo);
            image.Bind(state.Device, 0);

            return(image);
        }
Ejemplo n.º 3
0
        public void TransitionImageLayout(Vk.Image image, Vk.Format format,
                                          Vk.ImageLayout oldLayout, Vk.ImageLayout newLayout)
        {
            var buffer = this.BeginSingleTimeCommands(this.GraphicsCommandPool);

            var subresourceRange = new Vk.ImageSubresourceRange();

            if (newLayout == Vk.ImageLayout.DepthStencilAttachmentOptimal)
            {
                subresourceRange.AspectMask = Vk.ImageAspectFlags.Depth;

                if (VkHelper.HasStencilComponent(format))
                {
                    subresourceRange.AspectMask |= Vk.ImageAspectFlags.Stencil;
                }
            }
            else
            {
                subresourceRange.AspectMask = Vk.ImageAspectFlags.Color;
            }

            subresourceRange.BaseMipLevel   = 0;
            subresourceRange.LevelCount     = 1;
            subresourceRange.BaseArrayLayer = 0;
            subresourceRange.LayerCount     = 1;

            Vk.PipelineStageFlags srcStage;
            Vk.PipelineStageFlags dstStage;

            var barrier = new Vk.ImageMemoryBarrier();

            barrier.OldLayout           = oldLayout;
            barrier.NewLayout           = newLayout;
            barrier.SrcQueueFamilyIndex = VkConstants.VK_QUEUE_FAMILY_IGNORED;
            barrier.DstQueueFamilyIndex = VkConstants.VK_QUEUE_FAMILY_IGNORED;

            if (oldLayout == Vk.ImageLayout.Undefined && newLayout == Vk.ImageLayout.TransferDstOptimal)
            {
                barrier.SrcAccessMask = 0;
                barrier.DstAccessMask = Vk.AccessFlags.TransferWrite;

                srcStage = Vk.PipelineStageFlags.TopOfPipe;
                dstStage = Vk.PipelineStageFlags.Transfer;
            }
            else if (oldLayout == Vk.ImageLayout.TransferDstOptimal && newLayout == Vk.ImageLayout.ShaderReadOnlyOptimal)
            {
                barrier.SrcAccessMask = Vk.AccessFlags.TransferWrite;
                barrier.DstAccessMask = Vk.AccessFlags.ShaderRead;

                srcStage = Vk.PipelineStageFlags.Transfer;
                dstStage = Vk.PipelineStageFlags.FragmentShader;
            }
            else if (oldLayout == Vk.ImageLayout.Undefined && newLayout == Vk.ImageLayout.DepthStencilAttachmentOptimal)
            {
                barrier.SrcAccessMask = 0;
                barrier.DstAccessMask = Vk.AccessFlags.DepthStencilAttachmentRead
                                        | Vk.AccessFlags.DepthStencilAttachmentWrite;

                srcStage = Vk.PipelineStageFlags.TopOfPipe;
                dstStage = Vk.PipelineStageFlags.EarlyFragmentTests;
            }
            else
            {
                throw new Exception("Unsupported layout transition.");
            }

            barrier.Image            = image;
            barrier.SubresourceRange = subresourceRange;

            buffer.CmdPipelineBarrier(srcStage, dstStage, 0, null, null,
                                      new Vk.ImageMemoryBarrier[] { barrier });

            this.EndSingleTimeCommands(this.GraphicsQueue, this.GraphicsCommandPool, buffer);
        }
Ejemplo n.º 4
0
 public static bool HasStencilComponent(Vk.Format format) =>
 format == Vk.Format.D32SfloatS8Uint || format == Vk.Format.D24UnormS8Uint;