Exemplo n.º 1
0
        internal void BlitImageToCurrentImage(VulkanSurfaceRenderTarget renderTarget, CommandBuffer commandBuffer)
        {
            var image = renderTarget.GetImage();

            VulkanMemoryHelper.TransitionLayout(_device, commandBuffer,
                                                image.InternalHandle.Value, (ImageLayout)image.CurrentLayout,
                                                AccessFlags.AccessNoneKhr,
                                                ImageLayout.TransferSrcOptimal,
                                                AccessFlags.AccessTransferReadBit,
                                                renderTarget.MipLevels);

            var srcBlitRegion = new ImageBlit
            {
                SrcOffsets = new ImageBlit.SrcOffsetsBuffer
                {
                    Element0 = new Offset3D(0, 0, 0),
                    Element1 = new Offset3D(renderTarget.Size.Width, renderTarget.Size.Height, 1),
                },
                DstOffsets = new ImageBlit.DstOffsetsBuffer
                {
                    Element0 = new Offset3D(0, 0, 0),
                    Element1 = new Offset3D(Size.Width, Size.Height, 1),
                },
                SrcSubresource = new ImageSubresourceLayers
                {
                    AspectMask     = ImageAspectFlags.ImageAspectColorBit,
                    BaseArrayLayer = 0,
                    LayerCount     = 1,
                    MipLevel       = 0
                },
                DstSubresource = new ImageSubresourceLayers
                {
                    AspectMask     = ImageAspectFlags.ImageAspectColorBit,
                    BaseArrayLayer = 0,
                    LayerCount     = 1,
                    MipLevel       = 0
                }
            };

            _device.Api.CmdBlitImage(commandBuffer, image.InternalHandle.Value,
                                     ImageLayout.TransferSrcOptimal,
                                     _swapchainImages[_nextImage],
                                     ImageLayout.TransferDstOptimal,
                                     1,
                                     srcBlitRegion,
                                     Filter.Linear);

            VulkanMemoryHelper.TransitionLayout(_device, commandBuffer,
                                                image.InternalHandle.Value, ImageLayout.TransferSrcOptimal,
                                                AccessFlags.AccessTransferReadBit,
                                                (ImageLayout)image.CurrentLayout,
                                                AccessFlags.AccessNoneKhr,
                                                renderTarget.MipLevels);
        }
        private static void BlitImage(
            ImageAspects aspectMask,
            Image fromImage,
            IntRect fromRegion,
            int fromMipLevel,
            int fromLayerCount,
            Image toImage,
            IntRect toRegion,
            int toMipLevel,
            int toLayerCount,
            TransientExecutor executor)
        {
            ImageBlit blit = new ImageBlit
            {
                SrcSubresource = new ImageSubresourceLayers(
                    aspectMask,
                    fromMipLevel,
                    baseArrayLayer: 0,
                    fromLayerCount),
                SrcOffset1     = new Offset3D(fromRegion.Min.X, fromRegion.Min.Y, 0),
                SrcOffset2     = new Offset3D(fromRegion.Max.X, fromRegion.Max.Y, 1),
                DstSubresource = new ImageSubresourceLayers(
                    aspectMask,
                    toMipLevel,
                    baseArrayLayer: 0,
                    toLayerCount),
                DstOffset1 = new Offset3D(toRegion.Min.X, toRegion.Min.Y, 0),
                DstOffset2 = new Offset3D(toRegion.Max.X, toRegion.Max.Y, 1)
            };

            //Execute the blit
            executor.ExecuteBlocking(commandBuffer =>
            {
                commandBuffer.CmdBlitImage(
                    srcImage: fromImage,
                    srcImageLayout: ImageLayout.TransferSrcOptimal,
                    dstImage: toImage,
                    dstImageLayout: ImageLayout.TransferDstOptimal,
                    regions:  new [] { blit },
                    filter: Filter.Linear);
            });
        }
Exemplo n.º 3
0
 public unsafe void BlitImage(Image sourceImage, ImageLayout sourceImageLayout, Image destinationImage, ImageLayout destinationImageLayout, uint regionCount, ImageBlit* regions, Filter filter)
 {
     vkCmdBlitImage(this, sourceImage, sourceImageLayout, destinationImage, destinationImageLayout, regionCount, regions, filter);
 }
Exemplo n.º 4
0
 public void CmdBlitImage(Image srcImage, ImageLayout srcImageLayout, Image dstImage, ImageLayout dstImageLayout, ImageBlit pRegion, Filter filter)
 {
     unsafe {
         Interop.NativeMethods.vkCmdBlitImage(this.m, srcImage != null ? srcImage.m : default(UInt64), srcImageLayout, dstImage != null ? dstImage.m : default(UInt64), dstImageLayout, (UInt32)(pRegion != null ? 1 : 0), pRegion != null ? pRegion.m : (Interop.ImageBlit *) default(IntPtr), filter);
     }
 }
Exemplo n.º 5
0
 internal static unsafe extern void vkCmdBlitImage(CommandBuffer commandBuffer, Image sourceImage, ImageLayout sourceImageLayout, Image destinationImage, ImageLayout destinationImageLayout, uint regionCount, ImageBlit* regions, Filter filter);