/* * Copyright (c) 2026 Mykhailo Mamedov. All rights reserved. * * RESEARCH PREVIEW / REFERENCE ONLY: * This source code is provided solely for the purpose of reviewing * the author's research methods and implementation. * * NO LICENSE GRANTED: * This code is NOT for distribution, modification, or use in any * project (commercial or otherwise). Unauthorized copying or * use of this code is strictly prohibited. * * For inquiries regarding use or licensing, contact: ua.modin@gmail.com */ #include #ifndef TOOLS_HEADER #define TOOLS_HEADER namespace M_TOOLS { struct Sync { // Barrier quick helper. std::vector buffers; std::vector images; Sync& buffer(VkBuffer buffer, VkPipelineStageFlags2 srcMask, VkAccessFlags2 srcAccessMask, VkPipelineStageFlags2 dstMask, VkAccessFlags2 dstAccessMask, VkDeviceSize offset=0) { VkBufferMemoryBarrier2 barrierInstance{ VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2 }; barrierInstance.srcStageMask = srcMask; barrierInstance.srcAccessMask = srcAccessMask; barrierInstance.dstStageMask = dstMask; barrierInstance.dstAccessMask = dstAccessMask; barrierInstance.buffer = buffer; barrierInstance.size = VK_WHOLE_SIZE; barrierInstance.offset = offset; buffers.push_back(barrierInstance); return *this; } Sync& image(VkImage image, VkImageLayout oldLayout, VkImageLayout newLayout, VkPipelineStageFlags2 srcMask, VkAccessFlags2 srcAccessMask, VkPipelineStageFlags2 dstMask, VkAccessFlags2 dstAccessMask) { VkImageMemoryBarrier2 barrierInstance{ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 }; barrierInstance.srcStageMask = srcMask; barrierInstance.srcAccessMask = srcAccessMask; barrierInstance.dstStageMask = dstMask; barrierInstance.dstAccessMask = dstAccessMask; barrierInstance.oldLayout = oldLayout; barrierInstance.newLayout = newLayout; barrierInstance.image = image; barrierInstance.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }; images.push_back(barrierInstance); return *this; } void apply(VkCommandBuffer cmd) { VkDependencyInfo depInfo{ VK_STRUCTURE_TYPE_DEPENDENCY_INFO }; depInfo.bufferMemoryBarrierCount = (uint32_t)buffers.size(); depInfo.pBufferMemoryBarriers = buffers.data(); depInfo.imageMemoryBarrierCount = (uint32_t)images.size(); depInfo.pImageMemoryBarriers = images.data(); vkCmdPipelineBarrier2(cmd, &depInfo); } }; } // namespace #endif // TOOLS_HEADER // #ifdef TOOLS_COMPONENT #endif