[Impeller] remove capability to read from onscreen. (#47808)
As discovered by @knopp in https://github.com/flutter/flutter/issues/131567#issuecomment-1678210475, this is actually reducing performance substantially when there are multiple blurs. In the case of https://github.com/flutter/flutter/issues/132735 , removing this capbility improves GPU performance from 400ms per frame to ~100 ms per frame.
Fixes https://github.com/flutter/flutter/issues/131567#issuecomment-1678210475
-----
 | Macrobench | Example App
-- | -- | --
TOT | 250 | 450
W/Out OnScreen | 203-187 | 125-109
W/Out Onscreen and Resolve | 203 | 125
diff --git a/impeller/entity/entity_pass.cc b/impeller/entity/entity_pass.cc
index c6c39a6..dcfd141 100644
--- a/impeller/entity/entity_pass.cc
+++ b/impeller/entity/entity_pass.cc
@@ -333,16 +333,11 @@
.coverage = Rect::MakeSize(root_render_target.GetRenderTargetSize()),
.clip_depth = 0}};
- bool supports_onscreen_backdrop_reads =
- renderer.GetDeviceCapabilities().SupportsReadFromOnscreenTexture() &&
- // If the backend doesn't have `SupportsReadFromResolve`, we need to flip
- // between two textures when restoring a previous MSAA pass.
- renderer.GetDeviceCapabilities().SupportsReadFromResolve();
bool reads_from_onscreen_backdrop = GetTotalPassReads(renderer) > 0;
// In this branch path, we need to render everything to an offscreen texture
// and then blit the results onto the onscreen texture. If using this branch,
// there's no need to set up a stencil attachment on the root render target.
- if (!supports_onscreen_backdrop_reads && reads_from_onscreen_backdrop) {
+ if (reads_from_onscreen_backdrop) {
auto offscreen_target =
CreateRenderTarget(renderer, root_render_target.GetRenderTargetSize(),
GetClearColor(render_target.GetRenderTargetSize()));
diff --git a/impeller/renderer/backend/gles/capabilities_gles.cc b/impeller/renderer/backend/gles/capabilities_gles.cc
index 9b2251c..c659dad 100644
--- a/impeller/renderer/backend/gles/capabilities_gles.cc
+++ b/impeller/renderer/backend/gles/capabilities_gles.cc
@@ -169,10 +169,6 @@
return false;
}
-bool CapabilitiesGLES::SupportsReadFromOnscreenTexture() const {
- return false;
-}
-
bool CapabilitiesGLES::SupportsReadFromResolve() const {
return false;
}
diff --git a/impeller/renderer/backend/gles/capabilities_gles.h b/impeller/renderer/backend/gles/capabilities_gles.h
index 47dcaa3..921d3a4 100644
--- a/impeller/renderer/backend/gles/capabilities_gles.h
+++ b/impeller/renderer/backend/gles/capabilities_gles.h
@@ -98,9 +98,6 @@
bool SupportsComputeSubgroups() const override;
// |Capabilities|
- bool SupportsReadFromOnscreenTexture() const override;
-
- // |Capabilities|
bool SupportsReadFromResolve() const override;
// |Capabilities|
diff --git a/impeller/renderer/backend/gles/test/capabilities_unittests.cc b/impeller/renderer/backend/gles/test/capabilities_unittests.cc
index 5a82cf5..530c5c5 100644
--- a/impeller/renderer/backend/gles/test/capabilities_unittests.cc
+++ b/impeller/renderer/backend/gles/test/capabilities_unittests.cc
@@ -22,7 +22,6 @@
EXPECT_FALSE(capabilities->SupportsFramebufferFetch());
EXPECT_FALSE(capabilities->SupportsCompute());
EXPECT_FALSE(capabilities->SupportsComputeSubgroups());
- EXPECT_FALSE(capabilities->SupportsReadFromOnscreenTexture());
EXPECT_FALSE(capabilities->SupportsReadFromResolve());
EXPECT_FALSE(capabilities->SupportsDecalSamplerAddressMode());
EXPECT_FALSE(capabilities->SupportsDeviceTransientTextures());
diff --git a/impeller/renderer/backend/metal/context_mtl.mm b/impeller/renderer/backend/metal/context_mtl.mm
index 06fd347..9373d3e 100644
--- a/impeller/renderer/backend/metal/context_mtl.mm
+++ b/impeller/renderer/backend/metal/context_mtl.mm
@@ -66,7 +66,6 @@
.SetSupportsCompute(true)
.SetSupportsComputeSubgroups(DeviceSupportsComputeSubgroups(device))
.SetSupportsReadFromResolve(true)
- .SetSupportsReadFromOnscreenTexture(true)
.SetSupportsDeviceTransientTextures(true)
.Build();
}
diff --git a/impeller/renderer/backend/vulkan/capabilities_vk.cc b/impeller/renderer/backend/vulkan/capabilities_vk.cc
index ada7712..8af5a31 100644
--- a/impeller/renderer/backend/vulkan/capabilities_vk.cc
+++ b/impeller/renderer/backend/vulkan/capabilities_vk.cc
@@ -451,11 +451,6 @@
return false;
}
-// |Capabilities|
-bool CapabilitiesVK::SupportsReadFromOnscreenTexture() const {
- return false;
-}
-
bool CapabilitiesVK::SupportsDecalSamplerAddressMode() const {
return true;
}
diff --git a/impeller/renderer/backend/vulkan/capabilities_vk.h b/impeller/renderer/backend/vulkan/capabilities_vk.h
index a768610..f7ffd22 100644
--- a/impeller/renderer/backend/vulkan/capabilities_vk.h
+++ b/impeller/renderer/backend/vulkan/capabilities_vk.h
@@ -86,9 +86,6 @@
bool SupportsReadFromResolve() const override;
// |Capabilities|
- bool SupportsReadFromOnscreenTexture() const override;
-
- // |Capabilities|
bool SupportsDecalSamplerAddressMode() const override;
// |Capabilities|
diff --git a/impeller/renderer/capabilities.cc b/impeller/renderer/capabilities.cc
index 80ea8e0..4dcda95 100644
--- a/impeller/renderer/capabilities.cc
+++ b/impeller/renderer/capabilities.cc
@@ -50,11 +50,6 @@
}
// |Capabilities|
- bool SupportsReadFromOnscreenTexture() const override {
- return supports_read_from_onscreen_texture_;
- }
-
- // |Capabilities|
bool SupportsReadFromResolve() const override {
return supports_read_from_resolve_;
}
@@ -91,7 +86,6 @@
bool supports_framebuffer_fetch,
bool supports_compute,
bool supports_compute_subgroups,
- bool supports_read_from_onscreen_texture,
bool supports_read_from_resolve,
bool supports_decal_sampler_address_mode,
bool supports_device_transient_textures,
@@ -105,8 +99,6 @@
supports_framebuffer_fetch_(supports_framebuffer_fetch),
supports_compute_(supports_compute),
supports_compute_subgroups_(supports_compute_subgroups),
- supports_read_from_onscreen_texture_(
- supports_read_from_onscreen_texture),
supports_read_from_resolve_(supports_read_from_resolve),
supports_decal_sampler_address_mode_(
supports_decal_sampler_address_mode),
@@ -124,7 +116,6 @@
bool supports_framebuffer_fetch_ = false;
bool supports_compute_ = false;
bool supports_compute_subgroups_ = false;
- bool supports_read_from_onscreen_texture_ = false;
bool supports_read_from_resolve_ = false;
bool supports_decal_sampler_address_mode_ = false;
bool supports_device_transient_textures_ = false;
@@ -180,18 +171,6 @@
return *this;
}
-CapabilitiesBuilder& CapabilitiesBuilder::SetSupportsReadFromOnscreenTexture(
- bool read_from_onscreen_texture) {
- supports_read_from_onscreen_texture_ = read_from_onscreen_texture;
- return *this;
-}
-
-CapabilitiesBuilder& CapabilitiesBuilder::SetSupportsReadFromResolve(
- bool read_from_resolve) {
- supports_read_from_resolve_ = read_from_resolve;
- return *this;
-}
-
CapabilitiesBuilder& CapabilitiesBuilder::SetDefaultColorFormat(
PixelFormat value) {
default_color_format_ = value;
@@ -210,6 +189,12 @@
return *this;
}
+CapabilitiesBuilder& CapabilitiesBuilder::SetSupportsReadFromResolve(
+ bool read_from_resolve) {
+ supports_read_from_resolve_ = read_from_resolve;
+ return *this;
+}
+
CapabilitiesBuilder& CapabilitiesBuilder::SetSupportsDecalSamplerAddressMode(
bool value) {
supports_decal_sampler_address_mode_ = value;
@@ -231,7 +216,6 @@
supports_framebuffer_fetch_, //
supports_compute_, //
supports_compute_subgroups_, //
- supports_read_from_onscreen_texture_, //
supports_read_from_resolve_, //
supports_decal_sampler_address_mode_, //
supports_device_transient_textures_, //
diff --git a/impeller/renderer/capabilities.h b/impeller/renderer/capabilities.h
index 99d5986..48f12a7 100644
--- a/impeller/renderer/capabilities.h
+++ b/impeller/renderer/capabilities.h
@@ -64,10 +64,6 @@
/// command subgroups.
virtual bool SupportsComputeSubgroups() const = 0;
- /// @brief Whether the context backend supports binding the on-screen surface
- /// texture for shader reading.
- virtual bool SupportsReadFromOnscreenTexture() const = 0;
-
/// @brief Whether the context backend supports binding the current
/// `RenderPass` attachments. This is supported if the backend can
/// guarantee that attachment textures will not be mutated until the
@@ -136,8 +132,6 @@
CapabilitiesBuilder& SetSupportsComputeSubgroups(bool value);
- CapabilitiesBuilder& SetSupportsReadFromOnscreenTexture(bool value);
-
CapabilitiesBuilder& SetSupportsReadFromResolve(bool value);
CapabilitiesBuilder& SetDefaultColorFormat(PixelFormat value);
@@ -160,7 +154,6 @@
bool supports_framebuffer_fetch_ = false;
bool supports_compute_ = false;
bool supports_compute_subgroups_ = false;
- bool supports_read_from_onscreen_texture_ = false;
bool supports_read_from_resolve_ = false;
bool supports_decal_sampler_address_mode_ = false;
bool supports_device_transient_textures_ = false;
diff --git a/impeller/renderer/capabilities_unittests.cc b/impeller/renderer/capabilities_unittests.cc
index beab9a9..06c9bc3 100644
--- a/impeller/renderer/capabilities_unittests.cc
+++ b/impeller/renderer/capabilities_unittests.cc
@@ -25,7 +25,6 @@
CAPABILITY_TEST(SupportsFramebufferFetch, false);
CAPABILITY_TEST(SupportsCompute, false);
CAPABILITY_TEST(SupportsComputeSubgroups, false);
-CAPABILITY_TEST(SupportsReadFromOnscreenTexture, false);
CAPABILITY_TEST(SupportsReadFromResolve, false);
CAPABILITY_TEST(SupportsDecalSamplerAddressMode, false);
CAPABILITY_TEST(SupportsDeviceTransientTextures, false);