| 199 | } |
| 200 | |
| 201 | void raw_decoder::frame_completed( |
| 202 | const from_headset::feedback & feedback, |
| 203 | const to_headset::video_stream_data_shard::view_info_t & view_info) |
| 204 | { |
| 205 | auto item = get_free(); |
| 206 | if (not item) |
| 207 | { |
| 208 | spdlog::warn("No image available in pool, discard frame"); |
| 209 | return; |
| 210 | } |
| 211 | |
| 212 | auto handle = std::make_shared<raw_blit_handle>( |
| 213 | feedback, |
| 214 | view_info, |
| 215 | *item->view_full, |
| 216 | item->image, |
| 217 | extent, |
| 218 | item->current_layout, |
| 219 | *item->semaphore, |
| 220 | item->semaphore_val, |
| 221 | item->free); |
| 222 | |
| 223 | auto res = device.waitForFences(*fence, true, UINT64_MAX); |
| 224 | if (res != vk::Result::eSuccess) |
| 225 | spdlog::warn("waitForFences failed"); |
| 226 | |
| 227 | cmd.reset(); |
| 228 | cmd.begin({.flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit}); |
| 229 | |
| 230 | if (item->current_layout != vk::ImageLayout::eTransferDstOptimal) |
| 231 | { |
| 232 | item->current_layout = vk::ImageLayout::eTransferDstOptimal; |
| 233 | vk::ImageMemoryBarrier barrier{ |
| 234 | .srcAccessMask = vk::AccessFlagBits::eNone, |
| 235 | .dstAccessMask = vk::AccessFlagBits::eMemoryWrite, |
| 236 | .oldLayout = vk::ImageLayout::eUndefined, |
| 237 | .newLayout = item->current_layout, |
| 238 | .image = item->image, |
| 239 | .subresourceRange = { |
| 240 | .aspectMask = vk::ImageAspectFlagBits::eColor, |
| 241 | .levelCount = 1, |
| 242 | .layerCount = 1, |
| 243 | }, |
| 244 | }; |
| 245 | cmd.pipelineBarrier( |
| 246 | vk::PipelineStageFlagBits::eAllCommands, |
| 247 | vk::PipelineStageFlagBits::eTransfer, |
| 248 | {}, |
| 249 | {}, |
| 250 | {}, |
| 251 | barrier); |
| 252 | } |
| 253 | |
| 254 | std::array regions{ |
| 255 | vk::BufferImageCopy{ |
| 256 | .imageSubresource = { |
| 257 | .aspectMask = vk::ImageAspectFlagBits::ePlane0, |
| 258 | .layerCount = 1, |
no test coverage detected