Skip to content

Commit 05afee0

Browse files
committed
Fix render texture issue
1 parent 48cf36f commit 05afee0

File tree

3 files changed

+47
-21
lines changed

3 files changed

+47
-21
lines changed

engine/src/flutter/shell/platform/embedder/embedder_external_texture_source_vulkan.cc

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,21 @@
1212

1313
namespace 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+
1530
EmbedderExternalTextureSourceVulkan::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

113134
bool 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);

engine/src/flutter/shell/platform/embedder/embedder_external_texture_source_vulkan.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ class EmbedderExternalTextureSourceVulkan final
4343
std::shared_ptr<impeller::YUVConversionVK> GetYUVConversion() const override;
4444

4545
private:
46-
bool CreateTextureImageView(const impeller::vk::Device& device);
46+
bool CreateTextureImageView(
47+
const impeller::vk::Device& device,
48+
FlutterVulkanTexture* embedder_desc,
49+
const std::shared_ptr<impeller::YUVConversionVK>& yuv_conversion_wrapper);
4750
impeller::TextureDescriptor ToTextureDescriptor(
4851
FlutterVulkanTexture* embedder_desc);
4952
std::shared_ptr<impeller::YUVConversionVK> CreateYUVConversion(

engine/src/flutter/shell/platform/embedder/embedder_external_texture_vulkan.cc

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -124,15 +124,14 @@ sk_sp<DlImage> EmbedderExternalTextureVulkan::ResolveTextureSkia(
124124

125125
GrVkImageInfo image_info = {};
126126
if (IsYUVVkFormat(static_cast<VkFormat>(texture->format))) {
127-
FML_LOG(ERROR) << "try to create YUV image-002.....";
128127
skgpu::VulkanYcbcrConversionInfo ycbcr_info = {
129128
static_cast<VkFormat>(texture->format),
130129
0,
131130
VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709,
132-
VK_SAMPLER_YCBCR_RANGE_ITU_NARROW,
131+
VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
133132
VK_CHROMA_LOCATION_COSITED_EVEN,
134133
VK_CHROMA_LOCATION_COSITED_EVEN,
135-
VK_FILTER_LINEAR,
134+
VK_FILTER_NEAREST,
136135
false,
137136
static_cast<VkFormatFeatureFlags>(texture->format_features)};
138137

@@ -144,10 +143,9 @@ sk_sp<DlImage> EmbedderExternalTextureVulkan::ResolveTextureSkia(
144143
image_info = {.fImage = reinterpret_cast<VkImage>(texture->image),
145144
.fAlloc = alloc,
146145
.fImageTiling = VK_IMAGE_TILING_LINEAR,
147-
.fImageLayout = VK_IMAGE_LAYOUT_UNDEFINED,
146+
.fImageLayout = VK_IMAGE_LAYOUT_PREINITIALIZED,
148147
.fFormat = static_cast<VkFormat>(texture->format),
149-
.fImageUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
150-
VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
148+
.fImageUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
151149
VK_IMAGE_USAGE_TRANSFER_DST_BIT |
152150
VK_IMAGE_USAGE_SAMPLED_BIT,
153151
.fSampleCount = 1,
@@ -170,9 +168,6 @@ sk_sp<DlImage> EmbedderExternalTextureVulkan::ResolveTextureSkia(
170168

171169
auto gr_backend_texture =
172170
GrBackendTextures::MakeVk(width, height, image_info);
173-
FML_LOG(ERROR) << "backend texture isValid : "
174-
<< gr_backend_texture.isValid();
175-
// FML_LOG(ERROR) << "backend texture isValid : " << gr_backend_texture.;
176171
SkImages::TextureReleaseProc release_proc = texture->destruction_callback;
177172
auto image =
178173
SkImages::BorrowTextureFrom(context, // context
@@ -191,7 +186,6 @@ sk_sp<DlImage> EmbedderExternalTextureVulkan::ResolveTextureSkia(
191186
if (release_proc) {
192187
release_proc(texture->user_data);
193188
}
194-
FML_LOG(ERROR) << "Could not create external texture.....";
195189
return nullptr;
196190
}
197191

0 commit comments

Comments
 (0)