Skip to content

Commit 33cf3b6

Browse files
author
Jonah Williams
authored
[Impeller] remove transfer barriers from render pass, drop blit, tighten up graphics on level 3. (#165584)
The change to fix PowerVR barriers regressed Mali (see #165538) We need to tighten the barriers to remove the transfer barrier to get back mali performance. however, this requires us to drop the usage of the blit for onscreen restore. not a huge loss imo. At any rate, all of these changes should be visible in benchmarks.
1 parent 46969e5 commit 33cf3b6

File tree

9 files changed

+38
-33
lines changed

9 files changed

+38
-33
lines changed

engine/src/flutter/impeller/display_list/canvas.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1718,8 +1718,8 @@ bool Canvas::SupportsBlitToOnscreen() const {
17181718
return renderer_.GetContext()
17191719
->GetCapabilities()
17201720
->SupportsTextureToTextureBlits() &&
1721-
renderer_.GetContext()->GetBackendType() !=
1722-
Context::BackendType::kOpenGLES;
1721+
renderer_.GetContext()->GetBackendType() ==
1722+
Context::BackendType::kMetal;
17231723
}
17241724

17251725
bool Canvas::BlitToOnscreen(bool is_onscreen) {

engine/src/flutter/impeller/display_list/canvas_unittests.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ TEST_P(AiksTest, SupportsBlitToOnscreen) {
378378
auto canvas = CreateTestCanvas(context, Rect::MakeLTRB(0, 0, 100, 100),
379379
/*requires_readback=*/true);
380380

381-
if (GetBackend() == PlaygroundBackend::kOpenGLES) {
381+
if (GetBackend() != PlaygroundBackend::kMetal) {
382382
EXPECT_FALSE(canvas->SupportsBlitToOnscreen());
383383
} else {
384384
EXPECT_TRUE(canvas->SupportsBlitToOnscreen());

engine/src/flutter/impeller/renderer/backend/vulkan/android/ahb_texture_source_vk.cc

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,7 @@ vk::UniqueImage CreateVKImageWrapperForAndroidHarwareBuffer(
5656
}
5757
if (ahb_desc.usage & AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER) {
5858
image_usage_flags |= vk::ImageUsageFlagBits::eColorAttachment;
59-
}
60-
if (ahb_desc.usage & AHARDWAREBUFFER_USAGE_COMPOSER_OVERLAY) {
61-
image_usage_flags |= vk::ImageUsageFlagBits::eColorAttachment;
6259
image_usage_flags |= vk::ImageUsageFlagBits::eInputAttachment;
63-
image_usage_flags |= vk::ImageUsageFlagBits::eTransferDst;
6460
}
6561

6662
vk::ImageCreateFlags image_create_flags;
@@ -302,7 +298,7 @@ TextureDescriptor ToTextureDescriptor(const AHardwareBuffer_Desc& ahb_desc) {
302298
desc.mip_count = (ahb_desc.usage & AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE)
303299
? ahb_size.MipCount()
304300
: 1u;
305-
if (ahb_desc.usage & AHARDWAREBUFFER_USAGE_COMPOSER_OVERLAY) {
301+
if (ahb_desc.usage & AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER) {
306302
desc.usage = TextureUsage::kRenderTarget;
307303
}
308304
return desc;

engine/src/flutter/impeller/renderer/backend/vulkan/render_pass_builder_vk.cc

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -196,12 +196,20 @@ vk::UniqueRenderPass RenderPassBuilderVK::Build(
196196
// to the onscreen.
197197
deps[0].srcSubpass = VK_SUBPASS_EXTERNAL;
198198
deps[0].dstSubpass = 0u;
199-
deps[0].srcStageMask = vk::PipelineStageFlagBits::eColorAttachmentOutput |
200-
vk::PipelineStageFlagBits::eFragmentShader |
201-
vk::PipelineStageFlagBits::eTransfer;
202-
deps[0].srcAccessMask = vk::AccessFlagBits::eShaderRead |
203-
vk::AccessFlagBits::eTransferRead |
204-
vk::AccessFlagBits::eColorAttachmentWrite;
199+
// If this render pass is performed using the onscreen attachment, then we
200+
// know that the previous stage does not include sampling - only color
201+
// attachment. According to various vulkan documentation, the correct access
202+
// flag bits for this stage with a queue submit in-between is `{}` as the
203+
// access is not otherwise expressable.
204+
if (is_swapchain_) {
205+
deps[0].srcStageMask = vk::PipelineStageFlagBits::eColorAttachmentOutput;
206+
deps[0].srcAccessMask = {};
207+
} else {
208+
deps[0].srcStageMask = vk::PipelineStageFlagBits::eColorAttachmentOutput |
209+
vk::PipelineStageFlagBits::eFragmentShader;
210+
deps[0].srcAccessMask = vk::AccessFlagBits::eShaderRead |
211+
vk::AccessFlagBits::eColorAttachmentWrite;
212+
}
205213
deps[0].dstStageMask = vk::PipelineStageFlagBits::eColorAttachmentOutput;
206214
deps[0].dstAccessMask = vk::AccessFlagBits::eColorAttachmentWrite;
207215
deps[0].dependencyFlags = kSelfDependencyFlags;
@@ -217,22 +225,23 @@ vk::UniqueRenderPass RenderPassBuilderVK::Build(
217225
deps[1].dependencyFlags = kSelfDependencyFlags;
218226

219227
// Outgoing dependency. The resolve step or color attachment must complete
220-
// before we can sample from the image, or use it as a blit src.
228+
// before we can sample from the image. This dependency is ignored for the
229+
// onscreen as we will already insert a barrier before presenting the
230+
// swapchain.
221231
deps[2].srcSubpass = 0u; // first subpass
222232
deps[2].dstSubpass = VK_SUBPASS_EXTERNAL;
223233
deps[2].srcStageMask = vk::PipelineStageFlagBits::eColorAttachmentOutput;
224234
deps[2].srcAccessMask = vk::AccessFlagBits::eColorAttachmentWrite;
225-
deps[2].dstStageMask = vk::PipelineStageFlagBits::eFragmentShader |
226-
vk::PipelineStageFlagBits::eTransfer;
227-
deps[2].dstAccessMask =
228-
vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eTransferRead;
235+
deps[2].dstStageMask = vk::PipelineStageFlagBits::eFragmentShader;
236+
deps[2].dstAccessMask = vk::AccessFlagBits::eShaderRead;
229237
deps[2].dependencyFlags = kSelfDependencyFlags;
230238

231239
vk::RenderPassCreateInfo render_pass_desc;
232240
render_pass_desc.setPAttachments(attachments.data());
233241
render_pass_desc.setAttachmentCount(attachments_index);
234242
render_pass_desc.setSubpasses(subpass0);
235-
render_pass_desc.setDependencies(deps);
243+
render_pass_desc.setPDependencies(deps);
244+
render_pass_desc.setDependencyCount(3);
236245

237246
auto [result, pass] = device.createRenderPassUnique(render_pass_desc);
238247
if (result != vk::Result::eSuccess) {
@@ -272,6 +281,10 @@ void InsertBarrierForInputAttachmentRead(const vk::CommandBuffer& buffer,
272281
);
273282
}
274283

284+
void RenderPassBuilderVK::SetSwapchain(bool value) {
285+
is_swapchain_ = value;
286+
}
287+
275288
const std::map<size_t, vk::AttachmentDescription>&
276289
RenderPassBuilderVK::GetColorAttachments() const {
277290
return colors_;

engine/src/flutter/impeller/renderer/backend/vulkan/render_pass_builder_vk.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ class RenderPassBuilderVK {
2828

2929
RenderPassBuilderVK& operator=(const RenderPassBuilderVK&) = delete;
3030

31+
/// Whether this builder should configure barriers for the onscreen render
32+
/// pass.
33+
void SetSwapchain(bool value);
34+
3135
RenderPassBuilderVK& SetColorAttachment(
3236
size_t index,
3337
PixelFormat format,
@@ -66,6 +70,7 @@ class RenderPassBuilderVK {
6670
std::optional<vk::AttachmentDescription> GetColor0Resolve() const;
6771

6872
private:
73+
bool is_swapchain_ = false;
6974
std::optional<vk::AttachmentDescription> color0_;
7075
std::optional<vk::AttachmentDescription> color0_resolve_;
7176
std::optional<vk::AttachmentDescription> depth_stencil_;

engine/src/flutter/impeller/renderer/backend/vulkan/render_pass_vk.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ SharedHandleVK<vk::RenderPass> RenderPassVK::CreateVKRenderPass(
8181
const std::shared_ptr<CommandBufferVK>& command_buffer,
8282
bool is_swapchain) const {
8383
RenderPassBuilderVK builder;
84+
builder.SetSwapchain(is_swapchain);
8485

8586
render_target_.IterateAllColorAttachments([&](size_t bind_point,
8687
const ColorAttachment&

engine/src/flutter/impeller/renderer/backend/vulkan/swapchain/khr/khr_swapchain_impl_vk.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,10 +186,9 @@ KHRSwapchainImplVK::KHRSwapchainImplVK(const std::shared_ptr<Context>& context,
186186
: surface_caps.maxImageCount // max zero means no limit
187187
);
188188
swapchain_info.imageArrayLayers = 1u;
189-
// Swapchain images are primarily used as color attachments (via resolve),
190-
// blit targets, or input attachments.
189+
// Swapchain images are primarily used as color attachments (via resolve) or
190+
// input attachments.
191191
swapchain_info.imageUsage = vk::ImageUsageFlagBits::eColorAttachment |
192-
vk::ImageUsageFlagBits::eTransferDst |
193192
vk::ImageUsageFlagBits::eInputAttachment;
194193
swapchain_info.preTransform = vk::SurfaceTransformFlagBitsKHR::eIdentity;
195194
swapchain_info.compositeAlpha = composite.value();

engine/src/flutter/impeller/renderer/backend/vulkan/texture_source_vk.cc

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,18 @@ std::shared_ptr<YUVConversionVK> TextureSourceVK::GetYUVConversion() const {
1919
}
2020

2121
vk::ImageLayout TextureSourceVK::GetLayout() const {
22-
ReaderLock lock(layout_mutex_);
2322
return layout_;
2423
}
2524

2625
vk::ImageLayout TextureSourceVK::SetLayoutWithoutEncoding(
2726
vk::ImageLayout layout) const {
28-
WriterLock lock(layout_mutex_);
2927
const auto old_layout = layout_;
3028
layout_ = layout;
3129
return old_layout;
3230
}
3331

3432
fml::Status TextureSourceVK::SetLayout(const BarrierVK& barrier) const {
3533
const auto old_layout = SetLayoutWithoutEncoding(barrier.new_layout);
36-
if (barrier.new_layout == old_layout) {
37-
return {};
38-
}
39-
4034
vk::ImageMemoryBarrier image_barrier;
4135
image_barrier.srcAccessMask = barrier.src_access;
4236
image_barrier.dstAccessMask = barrier.dst_access;

engine/src/flutter/impeller/renderer/backend/vulkan/texture_source_vk.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
#define FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_TEXTURE_SOURCE_VK_H_
77

88
#include "flutter/fml/status.h"
9-
#include "impeller/base/thread.h"
109
#include "impeller/core/texture_descriptor.h"
1110
#include "impeller/renderer/backend/vulkan/barrier_vk.h"
1211
#include "impeller/renderer/backend/vulkan/formats_vk.h"
@@ -159,9 +158,7 @@ class TextureSourceVK {
159158
private:
160159
SharedHandleVK<vk::Framebuffer> framebuffer_;
161160
SharedHandleVK<vk::RenderPass> render_pass_;
162-
mutable RWMutex layout_mutex_;
163-
mutable vk::ImageLayout layout_ IPLR_GUARDED_BY(layout_mutex_) =
164-
vk::ImageLayout::eUndefined;
161+
mutable vk::ImageLayout layout_ = vk::ImageLayout::eUndefined;
165162
};
166163

167164
} // namespace impeller

0 commit comments

Comments
 (0)