1212
1313namespace flutter {
1414
15+ bool RequiresYCBCRConversion (impeller::vk::Format format) {
16+ switch (format) {
17+ case impeller::vk::Format::eG8B8R83Plane420Unorm:
18+ case impeller::vk::Format::eG8B8R82Plane420Unorm:
19+ case impeller::vk::Format::eG8B8R83Plane422Unorm:
20+ case impeller::vk::Format::eG8B8R82Plane422Unorm:
21+ case impeller::vk::Format::eG8B8R83Plane444Unorm:
22+ return true ;
23+ default :
24+ // NOTE: NOT EXHAUSTIVE.
25+ break ;
26+ }
27+ return false ;
28+ }
29+
1530EmbedderExternalTextureSourceVulkan::EmbedderExternalTextureSourceVulkan (
1631 const std::shared_ptr<impeller::Context>& p_context,
1732 FlutterVulkanTexture* embedder_desc)
@@ -22,15 +37,21 @@ EmbedderExternalTextureSourceVulkan::EmbedderExternalTextureSourceVulkan(
2237 impeller::vk::Image (reinterpret_cast <VkImage>(embedder_desc->image ));
2338 texture_device_memory_ = impeller::vk::DeviceMemory (
2439 reinterpret_cast <VkDeviceMemory>(embedder_desc->image_memory ));
25- // Figure out how to perform YUV conversions.
26- auto yuv_conversion = CreateYUVConversion (context, embedder_desc);
27- if (!yuv_conversion || !yuv_conversion->IsValid ()) {
28- VALIDATION_LOG << " Fail to create yuv conversion" ;
29- return ;
40+
41+ needs_yuv_conversion_ = RequiresYCBCRConversion (
42+ static_cast <impeller::vk::Format>(embedder_desc->format ));
43+ std::shared_ptr<impeller::YUVConversionVK> yuv_conversion;
44+ if (needs_yuv_conversion_) {
45+ // Figure out how to perform YUV conversions.
46+ yuv_conversion = CreateYUVConversion (context, embedder_desc);
47+ if (!yuv_conversion || !yuv_conversion->IsValid ()) {
48+ VALIDATION_LOG << " Fail to create yuv conversion" ;
49+ return ;
50+ }
3051 }
3152
3253 // Create image view for the newly created image.
33- if (!CreateTextureImageView (device)) {
54+ if (!CreateTextureImageView (device, embedder_desc, yuv_conversion )) {
3455 VALIDATION_LOG << " Fail to create texture image view" ;
3556 return ;
3657 }
@@ -111,24 +132,32 @@ EmbedderExternalTextureSourceVulkan::CreateYUVConversion(
111132}
112133
113134bool EmbedderExternalTextureSourceVulkan::CreateTextureImageView (
114- const impeller::vk::Device& device) {
135+ const impeller::vk::Device& device,
136+ FlutterVulkanTexture* embedder_desc,
137+ const std::shared_ptr<impeller::YUVConversionVK>& yuv_conversion_wrapper) {
115138 impeller::vk::StructureChain<impeller::vk::ImageViewCreateInfo,
116139 impeller::vk::SamplerYcbcrConversionInfo>
117140 view_chain;
118141 auto & view_info = view_chain.get ();
119142 view_info.image = texture_image_;
120143 view_info.viewType = impeller::vk::ImageViewType::e2D;
121- view_info.format = impeller::vk::Format::eR8G8B8A8Srgb ;
144+ view_info.format = static_cast < impeller::vk::Format>(embedder_desc-> format ) ;
122145 view_info.subresourceRange .aspectMask =
123146 impeller::vk::ImageAspectFlagBits::eColor;
124147 view_info.subresourceRange .baseMipLevel = 0u ;
125148 view_info.subresourceRange .baseArrayLayer = 0u ;
126149 view_info.subresourceRange .levelCount = 1 ;
127150 view_info.subresourceRange .layerCount = 1 ;
151+
152+ if (RequiresYCBCRConversion (
153+ static_cast <impeller::vk::Format>(embedder_desc->format ))) {
154+ view_chain.get <impeller::vk::SamplerYcbcrConversionInfo>().conversion =
155+ yuv_conversion_wrapper->GetConversion ();
156+ } else {
157+ view_chain.unlink <impeller::vk::SamplerYcbcrConversionInfo>();
158+ }
128159 auto image_view = device.createImageViewUnique (view_info);
129160 if (image_view.result != impeller::vk::Result::eSuccess) {
130- VALIDATION_LOG << " Could not create external image view: "
131- << impeller::vk::to_string (image_view.result );
132161 return false ;
133162 }
134163 texture_image_view_ = std::move (image_view.value );
0 commit comments