| 100 | }; |
| 101 | |
| 102 | decoder::decoder( |
| 103 | vk::raii::Device & device, |
| 104 | vk::raii::PhysicalDevice & physical_device, |
| 105 | const wivrn::to_headset::video_stream_description & description, |
| 106 | uint8_t stream_index, |
| 107 | std::weak_ptr<scenes::stream> scene, |
| 108 | shard_accumulator * accumulator) : |
| 109 | device(device), |
| 110 | codec(nullptr, free_codec_context), |
| 111 | sws(nullptr, sws_freeContext), |
| 112 | weak_scene(scene), |
| 113 | accumulator(accumulator), |
| 114 | extent{ |
| 115 | .width = description.width, |
| 116 | .height = description.height / (stream_index == 2 ? 2u : 1u), |
| 117 | } |
| 118 | { |
| 119 | free_images.resize(image_count); |
| 120 | |
| 121 | for (int i = 0; i < image_count; i++) |
| 122 | { |
| 123 | free_images[i] = i; |
| 124 | |
| 125 | vk::ImageCreateInfo image_info{ |
| 126 | .imageType = vk::ImageType::e2D, |
| 127 | .format = vk::Format::eA8B8G8R8SrgbPack32, |
| 128 | .extent = { |
| 129 | .width = extent.width, |
| 130 | .height = extent.height, |
| 131 | .depth = 1, |
| 132 | }, |
| 133 | .mipLevels = 1, |
| 134 | .arrayLayers = 1, |
| 135 | .samples = vk::SampleCountFlagBits::e1, |
| 136 | .tiling = vk::ImageTiling::eLinear, |
| 137 | .usage = vk::ImageUsageFlagBits::eSampled, |
| 138 | .initialLayout = vk::ImageLayout::eUndefined, |
| 139 | }; |
| 140 | |
| 141 | VmaAllocationCreateInfo alloc_info{ |
| 142 | .requiredFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT}; |
| 143 | |
| 144 | decoded_images[i].image = image_allocation(device, image_info, alloc_info); |
| 145 | |
| 146 | decoded_images[i].image.map(); |
| 147 | |
| 148 | vk::ImageSubresource resource; |
| 149 | resource.aspectMask = vk::ImageAspectFlagBits::eColor; |
| 150 | |
| 151 | decoded_images[i].layout = decoded_images[i].image->getSubresourceLayout(resource); |
| 152 | |
| 153 | decoded_images[i].image_view = vk::raii::ImageView( |
| 154 | device, |
| 155 | { |
| 156 | .image = (vk::Image)decoded_images[i].image, |
| 157 | .viewType = vk::ImageViewType::e2D, |
| 158 | .format = image_info.format, |
| 159 | .subresourceRange = { |