void CopyBufferToImage(Queue queue, CommandPool cmdPool, ImageData imageData, Buffer imageBuffer) { var cmdBuffers = AllocateCommandBuffers(cmdPool, 1); var cmdBuffer = cmdBuffers[0]; var beginInfo = new CommandBufferBeginInfo(); cmdBuffer.Begin(beginInfo); PipelineBarrierSetLayout(cmdBuffer, imageData.Image, ImageLayout.Preinitialized, ImageLayout.TransferDstOptimal, AccessFlags.HostWrite, AccessFlags.TransferWrite); var subresource = new ImageSubresourceLayers(ImageAspectFlags.Color, 0, 0, 1); var imageCopy = new BufferImageCopy(0, 0, 0, subresource, new Offset3D(0, 0, 0), new Extent3D(imageData.Width, imageData.Height, 1)); cmdBuffer.CopyBufferToImage(imageBuffer, imageData.Image, ImageLayout.TransferDstOptimal, new BufferImageCopy[] { imageCopy }); PipelineBarrierSetLayout(cmdBuffer, imageData.Image, ImageLayout.TransferDstOptimal, ImageLayout.ColorAttachmentOptimal, AccessFlags.TransferWrite, AccessFlags.ColorAttachmentWrite); cmdBuffer.End(); var submitInfo = new SubmitInfo(null, null, new[] { cmdBuffer }, null); queue.Submit(new[] { submitInfo }); submitInfo.Dispose(); queue.WaitIdle(); device.FreeCommandBuffers(cmdPool, new[] { cmdBuffer }); }
protected void SubmitForExecution(Queue queue, Semaphore presentSemaphore, CommandBuffer cmdBuffer) { var submitInfo = new SubmitInfo(new[] { presentSemaphore }, null, new[] { cmdBuffer }, null); queue.Submit(new[] { submitInfo }); submitInfo.Dispose(); }
void SubmitForExecution(Queue queue, CommandBuffer cmdBuffer) { var submitInfo = new SubmitInfo(null, null, new[] { cmdBuffer }, null); queue.Submit(new[] { submitInfo }); submitInfo.Dispose(); }
ImageData LoadTexture(string filename, Queue queue, CommandPool cmdPool) { // var bmp = new Bitmap(filename); var bitmapFormat = System.Drawing.Imaging.PixelFormat.Format32bppArgb; var rect = new Rectangle(0, 0, bmp.Width, bmp.Height); var bitmapData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, bitmapFormat); // uint imageWidth = (uint)bmp.Width; uint imageHeight = (uint)bmp.Height; var imageData = new ImageData(); imageData.Width = imageWidth; imageData.Height = imageHeight; imageData.Image = CreateTextureImage(Format.B8g8r8a8Unorm, imageWidth, imageHeight); imageData.Memory = BindImage(imageData.Image); imageData.View = CreateImageView(imageData.Image, Format.B8g8r8a8Unorm); imageData.Sampler = CreateSampler(); var memRequirements = device.GetImageMemoryRequirements(imageData.Image); var imageBuffer = CreateBuffer(memRequirements.Size, BufferUsageFlags.TransferSrc | BufferUsageFlags.TransferDst); var memoryIndex = FindMemoryIndex(MemoryPropertyFlags.HostVisible); var memAlloc = new MemoryAllocateInfo(memRequirements.Size, memoryIndex); var bufferMemory = BindBuffer(imageBuffer, memAlloc); CopyBitmapToBuffer(bitmapData.Scan0, (int)(imageWidth * imageHeight * 4), bufferMemory, memRequirements); // var cmdBuffers = AllocateCommandBuffers(cmdPool, 1); var cmdBuffer = cmdBuffers[0]; var beginInfo = new CommandBufferBeginInfo(); cmdBuffer.Begin(beginInfo); PipelineBarrierSetLayout(cmdBuffer, imageData.Image, ImageLayout.Preinitialized, ImageLayout.TransferDstOptimal, AccessFlags.HostWrite, AccessFlags.TransferWrite); CopyBufferToImage(cmdBuffer, imageData, imageBuffer); PipelineBarrierSetLayout(cmdBuffer, imageData.Image, ImageLayout.TransferDstOptimal, ImageLayout.ShaderReadOnlyOptimal, AccessFlags.TransferWrite, AccessFlags.ShaderRead); // wait... why does this work? device.DestroyBuffer(imageBuffer); device.FreeMemory(bufferMemory); cmdBuffer.End(); var submitInfo = new SubmitInfo(null, null, new[] { cmdBuffer }, null); queue.Submit(new[] { submitInfo }); submitInfo.Dispose(); queue.WaitIdle(); device.FreeCommandBuffers(cmdPool, new[] { cmdBuffer }); // //CopyBufferToImage(queue, cmdPool, imageData, imageBuffer); // bmp.UnlockBits(bitmapData); bmp.Dispose(); // return(imageData); }