150 {
151 const auto& cmd_buffer =
encoder.GetCommandBuffer();
152
153
155
157 return false;
158 }
159
160 BarrierVK barrier;
161 barrier.cmd_buffer = cmd_buffer;
162 barrier.new_layout = vk::ImageLayout::eTransferSrcOptimal;
163 barrier.src_access = vk::AccessFlagBits::eShaderWrite |
164 vk::AccessFlagBits::eTransferWrite |
165 vk::AccessFlagBits::eColorAttachmentWrite;
166 barrier.src_stage = vk::PipelineStageFlagBits::eFragmentShader |
167 vk::PipelineStageFlagBits::eTransfer |
168 vk::PipelineStageFlagBits::eColorAttachmentOutput;
169 barrier.dst_access = vk::AccessFlagBits::eShaderRead;
170 barrier.dst_stage = vk::PipelineStageFlagBits::eVertexShader |
171 vk::PipelineStageFlagBits::eFragmentShader;
172
174
175 vk::BufferImageCopy image_copy;
177 image_copy.setBufferRowLength(0);
178 image_copy.setBufferImageHeight(0);
179 image_copy.setImageSubresource(
180 vk::ImageSubresourceLayers(vk::ImageAspectFlagBits::eColor, 0, 0, 1));
181 image_copy.setImageOffset(
183 image_copy.setImageExtent(
185
186 if (!
src.SetLayout(barrier)) {
188 return false;
189 }
190
191 cmd_buffer.copyImageToBuffer(
src.GetImage(),
192 barrier.new_layout,
194 image_copy
195 );
196
197
198
199 if (
destination->GetDeviceBufferDescriptor().readback) {
200 vk::MemoryBarrier barrier;
201 barrier.srcAccessMask = vk::AccessFlagBits::eTransferWrite;
202 barrier.dstAccessMask = vk::AccessFlagBits::eHostRead;
203
204 cmd_buffer.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer,
205 vk::PipelineStageFlagBits::eHost, {}, 1,
206 &barrier, 0, {}, 0, {});
207 }
208
209 return true;
210}
static TextureVK & Cast(Texture &base)
std::shared_ptr< DeviceBuffer > destination
std::shared_ptr< Texture > source
size_t destination_offset
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|.