1+ //
2+ // Created by rfdic on 6/29/2025.
3+ //
4+
5+ #include " ImageStateTracker.h"
6+ #include < stdexcept>
7+
8+ namespace reactor {
9+
10+ void ImageStateTracker::recordState (vk::Image image, vk::ImageLayout initialState) {
11+ m_imageStates[image] = initialState;
12+ }
13+
14+ vk::ImageLayout ImageStateTracker::getCurrentLayout (vk::Image image) const {
15+ auto it = m_imageStates.find (image);
16+ if (it == m_imageStates.end ()) {
17+ // Or you could default to eUndefined and record it, depending on desired strictness
18+ throw std::runtime_error (" Attempted to get layout of an untracked image." );
19+ }
20+ return it->second ;
21+ }
22+
23+ void ImageStateTracker::transition (
24+ vk::CommandBuffer cmd,
25+ vk::Image image,
26+ vk::ImageLayout newLayout,
27+ vk::PipelineStageFlags srcStage,
28+ vk::PipelineStageFlags dstStage,
29+ vk::AccessFlags srcAccess,
30+ vk::AccessFlags dstAccess,
31+ vk::ImageAspectFlags aspectFlags
32+ ) {
33+ const vk::ImageLayout oldLayout = getCurrentLayout (image);
34+
35+ // If the layout is already correct, we don't need a barrier.
36+ if (oldLayout == newLayout) {
37+ return ;
38+ }
39+
40+ vk::ImageMemoryBarrier barrier{};
41+ barrier.oldLayout = oldLayout;
42+ barrier.newLayout = newLayout;
43+ barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED ;
44+ barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED ;
45+ barrier.image = image;
46+ barrier.subresourceRange .aspectMask = aspectFlags;
47+ barrier.subresourceRange .baseMipLevel = 0 ;
48+ barrier.subresourceRange .levelCount = 1 ;
49+ barrier.subresourceRange .baseArrayLayer = 0 ;
50+ barrier.subresourceRange .layerCount = 1 ;
51+ barrier.srcAccessMask = srcAccess;
52+ barrier.dstAccessMask = dstAccess;
53+
54+ cmd.pipelineBarrier (
55+ srcStage, // Stage where operations occurred before the barrier
56+ dstStage, // Stage where operations will wait for the barrier
57+ {}, // Dependency flags
58+ nullptr , // Memory barriers
59+ nullptr , // Buffer memory barriers
60+ barrier // Image memory barriers
61+ );
62+
63+ // IMPORTANT: Update the internal state to the new layout.
64+ m_imageStates[image] = newLayout;
65+ }
66+
67+
68+ } // reactor
0 commit comments