70 lines
2.7 KiB
C++
70 lines
2.7 KiB
C++
|
|
/*
|
||
|
|
* 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 <stdio.h>
|
||
|
|
|
||
|
|
|
||
|
|
#ifndef TOOLS_HEADER
|
||
|
|
#define TOOLS_HEADER
|
||
|
|
|
||
|
|
|
||
|
|
namespace M_TOOLS {
|
||
|
|
|
||
|
|
struct Sync {
|
||
|
|
// Barrier quick helper.
|
||
|
|
std::vector<VkBufferMemoryBarrier2> buffers;
|
||
|
|
std::vector<VkImageMemoryBarrier2> 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
|