Advertisement
Guest User

Untitled

a guest
Dec 12th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.31 KB | None | 0 0
  1. public static VKImage FromBitmapData(BitmapData[] mipmaps, ImageUsages usages)
  2. {
  3.     var totalSize = 0L;
  4.     foreach (var mip in mipmaps)
  5.         totalSize += mip.Size;
  6.            
  7.     var stagingBuffer = VK.Device.CreateBuffer(new BufferCreateInfo(totalSize, BufferUsages.TransferSrc));
  8.     var stagingMemReq = stagingBuffer.GetMemoryRequirements();
  9.     var heapIndex = VK.PhysicalDeviceMemoryProperties.MemoryTypes.IndexOf(stagingMemReq.MemoryTypeBits, MemoryProperties.HostVisible);
  10.     var stagingMemory = VK.Device.AllocateMemory(new MemoryAllocateInfo(stagingMemReq.Size, heapIndex));
  11.     stagingBuffer.BindMemory(stagingMemory);
  12.  
  13.     var bufferCopyRegions = new BufferImageCopy[mipmaps.Length];
  14.     var mipNum = 0;
  15.     unsafe
  16.     {
  17.         var start = (byte*)stagingMemory.Map(0, stagingMemReq.Size);
  18.         var dest = start;
  19.         foreach (var mip in mipmaps)
  20.         {
  21.             var bufferOffset = (long)dest - (long)start;
  22.             var src = (byte*)mip.Data;
  23.             for (var i = 0; i < stagingMemReq.Size - 3; i += 4)
  24.             {
  25.                 *(dest + 2) = *(src++);
  26.                 *(dest + 1) = *(src++);
  27.                 *(dest) = *(src++);
  28.                 *(dest + 3) = *(src++);
  29.                 dest += 4;
  30.             }
  31.             stagingMemory.Unmap();
  32.  
  33.             bufferCopyRegions[mipNum] = new BufferImageCopy
  34.             {
  35.                 ImageSubresource = new ImageSubresourceLayers(ImageAspects.Color, mipNum, 0, 1),
  36.                 ImageExtent = new Extent3D(mip.Extent.Width, mip.Extent.Height, 1),
  37.                 BufferOffset = bufferOffset,
  38.                 BufferImageHeight = mip.Extent.Height,
  39.                 BufferRowLength = mip.Extent.Width
  40.             };
  41.             mipNum++;
  42.         }
  43.     }
  44.  
  45.     var image = VK.Device.CreateImage(new ImageCreateInfo
  46.     {
  47.         ImageType = ImageType.Image2D,
  48.         Format = VK.ColorFormat,
  49.         MipLevels = mipmaps.Length,
  50.         ArrayLayers = 1,
  51.         Samples = SampleCounts.Count1,
  52.         Tiling = ImageTiling.Optimal,
  53.         SharingMode = SharingMode.Exclusive,
  54.         InitialLayout = ImageLayout.Undefined,
  55.         Extent = new Extent3D(mipmaps[0].Extent.Width, mipmaps[0].Extent.Height, 1),
  56.         Usage = usages | ImageUsages.TransferDst
  57.     });
  58.  
  59.     var imageMemReq = image.GetMemoryRequirements();
  60.     var imageHeapIndex = VK.PhysicalDeviceMemoryProperties.MemoryTypes.IndexOf(imageMemReq.MemoryTypeBits, MemoryProperties.DeviceLocal);
  61.     var memory = VK.Device.AllocateMemory(new MemoryAllocateInfo(imageMemReq.Size, imageHeapIndex));
  62.     image.BindMemory(memory);
  63.  
  64.     var subresourceRange = new ImageSubresourceRange(ImageAspects.Color, 0, mipmaps.Length, 0, 1);
  65.  
  66.     var cmdBuffer = VK.GraphicsCommandPool.AllocateBuffers(new CommandBufferAllocateInfo(CommandBufferLevel.Primary, 1))[0];
  67.     cmdBuffer.Begin(new CommandBufferBeginInfo(CommandBufferUsages.OneTimeSubmit));
  68.     cmdBuffer.CmdPipelineBarrier(PipelineStages.TopOfPipe, PipelineStages.Transfer,
  69.         imageMemoryBarriers: new[]
  70.         {
  71.             new ImageMemoryBarrier(
  72.                 image, subresourceRange,
  73.                 0, Accesses.TransferWrite,
  74.                 ImageLayout.Undefined, ImageLayout.TransferDstOptimal)
  75.         });
  76.     cmdBuffer.CmdCopyBufferToImage(stagingBuffer, image, ImageLayout.TransferDstOptimal, bufferCopyRegions);
  77.     if (usages.HasFlag(ImageUsages.Sampled))
  78.     {
  79.         cmdBuffer.CmdPipelineBarrier(PipelineStages.Transfer, PipelineStages.FragmentShader,
  80.             imageMemoryBarriers: new[]
  81.             {
  82.                 new ImageMemoryBarrier(
  83.                     image, subresourceRange,
  84.                     Accesses.TransferWrite, Accesses.ShaderRead,
  85.                     ImageLayout.TransferDstOptimal, ImageLayout.ShaderReadOnlyOptimal)
  86.             });
  87.     }
  88.     cmdBuffer.End();
  89.  
  90.     var fence = VK.Device.CreateFence();
  91.     VK.GraphicsQueue.Submit(new SubmitInfo(commandBuffers: new[] { cmdBuffer }), fence);
  92.     fence.Wait();
  93.  
  94.     fence.Dispose();
  95.     stagingMemory.Dispose();
  96.     stagingBuffer.Dispose();
  97.  
  98.     var mipmapExtents = new Extent2D[mipmaps.Length];
  99.     for (var i = 0; i < mipmaps.Length; i++)
  100.         mipmapExtents[i] = mipmaps[i].Extent;
  101.  
  102.     return new VKImage
  103.     {
  104.         Disposed = false,
  105.         Image = image,
  106.         MipmapExtents = mipmapExtents
  107.     };
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement