63 {
64 const auto& cmd_buffer =
encoder.GetCommandBuffer();
65
68
70 return false;
71 }
72
73 BarrierVK src_barrier;
74 src_barrier.cmd_buffer = cmd_buffer;
75 src_barrier.new_layout = vk::ImageLayout::eTransferSrcOptimal;
76 src_barrier.src_access = vk::AccessFlagBits::eTransferWrite |
77 vk::AccessFlagBits::eShaderWrite |
78 vk::AccessFlagBits::eColorAttachmentWrite;
79 src_barrier.src_stage = vk::PipelineStageFlagBits::eTransfer |
80 vk::PipelineStageFlagBits::eFragmentShader |
81 vk::PipelineStageFlagBits::eColorAttachmentOutput;
82 src_barrier.dst_access = vk::AccessFlagBits::eTransferRead;
83 src_barrier.dst_stage = vk::PipelineStageFlagBits::eTransfer;
84
85 BarrierVK dst_barrier;
86 dst_barrier.cmd_buffer = cmd_buffer;
87 dst_barrier.new_layout = vk::ImageLayout::eTransferDstOptimal;
88 dst_barrier.src_access = {};
89 dst_barrier.src_stage = vk::PipelineStageFlagBits::eTopOfPipe;
90 dst_barrier.dst_access =
91 vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eTransferWrite;
92 dst_barrier.dst_stage = vk::PipelineStageFlagBits::eFragmentShader |
93 vk::PipelineStageFlagBits::eTransfer;
94
95 if (!
src.SetLayout(src_barrier) || !
dst.SetLayout(dst_barrier)) {
97 return false;
98 }
99
100 vk::ImageCopy image_copy;
101
102 image_copy.setSrcSubresource(
103 vk::ImageSubresourceLayers(vk::ImageAspectFlagBits::eColor, 0, 0, 1));
104 image_copy.setDstSubresource(
105 vk::ImageSubresourceLayers(vk::ImageAspectFlagBits::eColor, 0, 0, 1));
106
107 image_copy.srcOffset =
109 image_copy.dstOffset =
111 image_copy.extent =
113
114
115
116 cmd_buffer.copyImage(
src.GetImage(),
117 src_barrier.new_layout,
119 dst_barrier.new_layout,
120 image_copy
121 );
122
123
124
125 if (
dst.IsSwapchainImage()) {
126 return true;
127 }
128
129 BarrierVK barrier;
130 barrier.cmd_buffer = cmd_buffer;
131 barrier.new_layout = vk::ImageLayout::eShaderReadOnlyOptimal;
132 barrier.src_access = {};
133 barrier.src_stage = vk::PipelineStageFlagBits::eTopOfPipe;
134 barrier.dst_access = vk::AccessFlagBits::eShaderRead;
135 barrier.dst_stage = vk::PipelineStageFlagBits::eFragmentShader;
136
137 return dst.SetLayout(barrier);
138}
static TextureVK & Cast(Texture &base)
IPoint destination_origin
std::shared_ptr< Texture > destination
std::shared_ptr< Texture > source
constexpr Type GetY() const
Returns the Y coordinate of the upper left corner, equivalent to |GetOrigin().y|.
constexpr Type GetHeight() const
Returns the height of the rectangle, equivalent to |GetSize().height|.
constexpr Type GetX() const
Returns the X coordinate of the upper left corner, equivalent to |GetOrigin().x|.
constexpr Type GetWidth() const
Returns the width of the rectangle, equivalent to |GetSize().width|.