Enable MPO for moving clear video quads on new Intel GPU drivers
Intel gfx driver team cannot reproduce this issue on the new GPU drivers. A patch inside 31.0.101.4471 driver binary has fixed the problem. At the same time, AMD/NVIDIA GPU drivers are kept being disabled as before from the manual test results provided here. More evidence and verification are required for their better fixing in future. Bug: 40677119 Change-Id: Id1f512d45fa803be7e233b5753a09fba5c64cd99 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5831715 Commit-Queue: Chunbo Hua <chunbo.hua@intel.com> Reviewed-by: Michael Tang <tangm@microsoft.com> Reviewed-by: Maggie Chen <magchen@chromium.org> Cr-Commit-Position: refs/heads/main@{#1354935}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
874ab5e3c0
commit
11a0f1ec38
@@ -659,14 +659,16 @@ std::optional<OverlayCandidate> DCLayerOverlayProcessor::FromTextureOrYuvQuad(
|
|||||||
|
|
||||||
DCLayerOverlayProcessor::DCLayerOverlayProcessor(
|
DCLayerOverlayProcessor::DCLayerOverlayProcessor(
|
||||||
int allowed_yuv_overlay_count,
|
int allowed_yuv_overlay_count,
|
||||||
|
bool disable_video_overlay_if_moving,
|
||||||
bool skip_initialization_for_testing)
|
bool skip_initialization_for_testing)
|
||||||
: has_overlay_support_(skip_initialization_for_testing),
|
: has_overlay_support_(skip_initialization_for_testing),
|
||||||
allowed_yuv_overlay_count_(allowed_yuv_overlay_count),
|
allowed_yuv_overlay_count_(allowed_yuv_overlay_count),
|
||||||
is_on_battery_power_(
|
is_on_battery_power_(
|
||||||
base::PowerMonitor::GetInstance()
|
base::PowerMonitor::GetInstance()
|
||||||
->AddPowerStateObserverAndReturnOnBatteryState(this)),
|
->AddPowerStateObserverAndReturnOnBatteryState(this)),
|
||||||
no_undamaged_overlay_promotion_(base::FeatureList::IsEnabled(
|
no_undamaged_overlay_promotion_(
|
||||||
features::kNoUndamagedOverlayPromotion)) {
|
base::FeatureList::IsEnabled(features::kNoUndamagedOverlayPromotion)),
|
||||||
|
disable_video_overlay_if_moving_(disable_video_overlay_if_moving) {
|
||||||
if (!skip_initialization_for_testing) {
|
if (!skip_initialization_for_testing) {
|
||||||
UpdateHasHwOverlaySupport();
|
UpdateHasHwOverlaySupport();
|
||||||
UpdateSystemHDRStatus();
|
UpdateSystemHDRStatus();
|
||||||
@@ -1123,8 +1125,7 @@ void DCLayerOverlayProcessor::Process(
|
|||||||
// Recount the YUV overlays when they are added to the overlay list
|
// Recount the YUV overlays when they are added to the overlay list
|
||||||
// successfully.
|
// successfully.
|
||||||
global_overlay_state.processed_yuv_overlay_count = 0;
|
global_overlay_state.processed_yuv_overlay_count = 0;
|
||||||
|
if (disable_video_overlay_if_moving_) {
|
||||||
if (base::FeatureList::IsEnabled(features::kDisableVideoOverlayIfMoving)) {
|
|
||||||
RemoveClearVideoQuadCandidatesIfMoving(
|
RemoveClearVideoQuadCandidatesIfMoving(
|
||||||
resource_provider, render_pass_overlay_data_map, render_pass_state_map);
|
resource_provider, render_pass_overlay_data_map, render_pass_state_map);
|
||||||
}
|
}
|
||||||
|
@@ -36,6 +36,7 @@ class VIZ_SERVICE_EXPORT DCLayerOverlayProcessor final
|
|||||||
// for unit tests.
|
// for unit tests.
|
||||||
explicit DCLayerOverlayProcessor(
|
explicit DCLayerOverlayProcessor(
|
||||||
int allowed_yuv_overlay_count,
|
int allowed_yuv_overlay_count,
|
||||||
|
bool disable_video_overlay_if_moving,
|
||||||
bool skip_initialization_for_testing = false);
|
bool skip_initialization_for_testing = false);
|
||||||
|
|
||||||
DCLayerOverlayProcessor(const DCLayerOverlayProcessor&) = delete;
|
DCLayerOverlayProcessor(const DCLayerOverlayProcessor&) = delete;
|
||||||
@@ -110,6 +111,9 @@ class VIZ_SERVICE_EXPORT DCLayerOverlayProcessor final
|
|||||||
void set_is_on_battery_power_for_testing(bool value) {
|
void set_is_on_battery_power_for_testing(bool value) {
|
||||||
is_on_battery_power_ = value;
|
is_on_battery_power_ = value;
|
||||||
}
|
}
|
||||||
|
void set_disable_video_overlay_if_moving_for_testing(bool value) {
|
||||||
|
disable_video_overlay_if_moving_ = value;
|
||||||
|
}
|
||||||
bool force_overlay_for_auto_hdr() {
|
bool force_overlay_for_auto_hdr() {
|
||||||
return system_hdr_enabled_on_any_display_ &&
|
return system_hdr_enabled_on_any_display_ &&
|
||||||
has_auto_hdr_video_processor_support_ && !is_on_battery_power_;
|
has_auto_hdr_video_processor_support_ && !is_on_battery_power_;
|
||||||
@@ -369,6 +373,7 @@ class VIZ_SERVICE_EXPORT DCLayerOverlayProcessor final
|
|||||||
std::vector<gfx::Rect> previous_frame_overlay_candidate_rects_;
|
std::vector<gfx::Rect> previous_frame_overlay_candidate_rects_;
|
||||||
int frames_since_last_overlay_candidate_rects_change_ = 0;
|
int frames_since_last_overlay_candidate_rects_change_ = 0;
|
||||||
bool no_undamaged_overlay_promotion_;
|
bool no_undamaged_overlay_promotion_;
|
||||||
|
bool disable_video_overlay_if_moving_;
|
||||||
|
|
||||||
THREAD_CHECKER(thread_checker_);
|
THREAD_CHECKER(thread_checker_);
|
||||||
};
|
};
|
||||||
|
@@ -220,12 +220,6 @@ class OverlayProcessorTestBase : public testing::Test {
|
|||||||
std::vector<base::test::FeatureRef> enabled_features;
|
std::vector<base::test::FeatureRef> enabled_features;
|
||||||
std::vector<base::test::FeatureRef> disabled_features;
|
std::vector<base::test::FeatureRef> disabled_features;
|
||||||
|
|
||||||
// With DisableVideoOverlayIfMoving, videos are required to be stable for a
|
|
||||||
// certain number of frames to be considered for overlay promotion. This
|
|
||||||
// complicates tests since it adds behavior dependent on the number of times
|
|
||||||
// |Process| is called.
|
|
||||||
disabled_features.push_back(features::kDisableVideoOverlayIfMoving);
|
|
||||||
|
|
||||||
feature_list_.InitWithFeatures(enabled_features, disabled_features);
|
feature_list_.InitWithFeatures(enabled_features, disabled_features);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -265,8 +259,14 @@ class DCLayerOverlayProcessorTest : public OverlayProcessorTestBase {
|
|||||||
protected:
|
protected:
|
||||||
void InitializeDCLayerOverlayProcessor(int allowed_yuv_overlay_count = 1) {
|
void InitializeDCLayerOverlayProcessor(int allowed_yuv_overlay_count = 1) {
|
||||||
CHECK(!dc_layer_overlay_processor_);
|
CHECK(!dc_layer_overlay_processor_);
|
||||||
|
|
||||||
|
// With disable_video_overlay_if_moving enabled, videos are required to be
|
||||||
|
// stable for a certain number of frames to be considered for overlay
|
||||||
|
// promotion. This complicates tests since it adds behavior dependent on
|
||||||
|
// the number of times |Process| is called.
|
||||||
dc_layer_overlay_processor_ = std::make_unique<DCLayerOverlayProcessor>(
|
dc_layer_overlay_processor_ = std::make_unique<DCLayerOverlayProcessor>(
|
||||||
allowed_yuv_overlay_count,
|
allowed_yuv_overlay_count,
|
||||||
|
/*disable_video_overlay_if_moving=*/false,
|
||||||
/*skip_initialization_for_testing=*/true);
|
/*skip_initialization_for_testing=*/true);
|
||||||
|
|
||||||
dc_layer_overlay_processor_
|
dc_layer_overlay_processor_
|
||||||
@@ -315,7 +315,7 @@ class DCLayerOverlayProcessorTest : public OverlayProcessorTestBase {
|
|||||||
std::unique_ptr<DCLayerOverlayProcessor> dc_layer_overlay_processor_;
|
std::unique_ptr<DCLayerOverlayProcessor> dc_layer_overlay_processor_;
|
||||||
};
|
};
|
||||||
|
|
||||||
TEST_F(DCLayerOverlayProcessorTest, DisableVideoOverlayIfMovingFeature) {
|
TEST_F(DCLayerOverlayProcessorTest, DisableVideoOverlayIfMovingWorkaround) {
|
||||||
InitializeDCLayerOverlayProcessor();
|
InitializeDCLayerOverlayProcessor();
|
||||||
auto ProcessForOverlaysSingleVideoRectWithOffset =
|
auto ProcessForOverlaysSingleVideoRectWithOffset =
|
||||||
[&](gfx::Vector2d video_rect_offset, bool is_hdr = false,
|
[&](gfx::Vector2d video_rect_offset, bool is_hdr = false,
|
||||||
@@ -393,17 +393,15 @@ TEST_F(DCLayerOverlayProcessorTest, DisableVideoOverlayIfMovingFeature) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
{
|
{
|
||||||
base::test::ScopedFeatureList scoped_feature_list;
|
dc_layer_overlay_processor_
|
||||||
scoped_feature_list.InitAndDisableFeature(
|
->set_disable_video_overlay_if_moving_for_testing(false);
|
||||||
features::kDisableVideoOverlayIfMoving);
|
|
||||||
EXPECT_EQ(1U, ProcessForOverlaysSingleVideoRectWithOffset({0, 0}).size());
|
EXPECT_EQ(1U, ProcessForOverlaysSingleVideoRectWithOffset({0, 0}).size());
|
||||||
EXPECT_EQ(1U, ProcessForOverlaysSingleVideoRectWithOffset({1, 0}).size());
|
EXPECT_EQ(1U, ProcessForOverlaysSingleVideoRectWithOffset({1, 0}).size());
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
base::test::ScopedFeatureList scoped_feature_list;
|
dc_layer_overlay_processor_
|
||||||
scoped_feature_list.InitAndEnableFeature(
|
->set_disable_video_overlay_if_moving_for_testing(true);
|
||||||
features::kDisableVideoOverlayIfMoving);
|
|
||||||
// We expect an overlay promotion after a couple frames of no movement
|
// We expect an overlay promotion after a couple frames of no movement
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
ProcessForOverlaysSingleVideoRectWithOffset({0, 0}).size();
|
ProcessForOverlaysSingleVideoRectWithOffset({0, 0}).size();
|
||||||
@@ -421,9 +419,8 @@ TEST_F(DCLayerOverlayProcessorTest, DisableVideoOverlayIfMovingFeature) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
base::test::ScopedFeatureList scoped_feature_list;
|
dc_layer_overlay_processor_
|
||||||
scoped_feature_list.InitAndEnableFeature(
|
->set_disable_video_overlay_if_moving_for_testing(true);
|
||||||
features::kDisableVideoOverlayIfMoving);
|
|
||||||
// We expect an overlay promotion after a couple frames of no movement
|
// We expect an overlay promotion after a couple frames of no movement
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
ProcessForOverlaysSingleVideoRectWithOffset({0, 0}, /*is_hdr=*/false,
|
ProcessForOverlaysSingleVideoRectWithOffset({0, 0}, /*is_hdr=*/false,
|
||||||
@@ -442,9 +439,8 @@ TEST_F(DCLayerOverlayProcessorTest, DisableVideoOverlayIfMovingFeature) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
base::test::ScopedFeatureList scoped_feature_list;
|
dc_layer_overlay_processor_
|
||||||
scoped_feature_list.InitAndEnableFeature(
|
->set_disable_video_overlay_if_moving_for_testing(true);
|
||||||
features::kDisableVideoOverlayIfMoving);
|
|
||||||
// We expect an overlay promotion after a couple frames of no movement
|
// We expect an overlay promotion after a couple frames of no movement
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
ProcessForOverlaysSingleVideoRectWithOffset({0, 0}, /*is_hdr=*/true)
|
ProcessForOverlaysSingleVideoRectWithOffset({0, 0}, /*is_hdr=*/true)
|
||||||
@@ -2260,11 +2256,13 @@ TEST_F(OverlayProcessorWinStaticTest,
|
|||||||
|
|
||||||
class TestOverlayProcessorWin : public OverlayProcessorWin {
|
class TestOverlayProcessorWin : public OverlayProcessorWin {
|
||||||
public:
|
public:
|
||||||
explicit TestOverlayProcessorWin(int allowed_yuv_overlay_count)
|
explicit TestOverlayProcessorWin(int allowed_yuv_overlay_count,
|
||||||
|
bool disable_video_overlay_if_moving)
|
||||||
: OverlayProcessorWin(OutputSurface::DCSupportLevel::kDCompTexture,
|
: OverlayProcessorWin(OutputSurface::DCSupportLevel::kDCompTexture,
|
||||||
&debug_settings_,
|
&debug_settings_,
|
||||||
std::make_unique<DCLayerOverlayProcessor>(
|
std::make_unique<DCLayerOverlayProcessor>(
|
||||||
allowed_yuv_overlay_count,
|
allowed_yuv_overlay_count,
|
||||||
|
disable_video_overlay_if_moving,
|
||||||
/*skip_initialization_for_testing=*/true)) {}
|
/*skip_initialization_for_testing=*/true)) {}
|
||||||
DebugRendererSettings debug_settings_;
|
DebugRendererSettings debug_settings_;
|
||||||
};
|
};
|
||||||
@@ -2274,8 +2272,13 @@ class OverlayProcessorWinTest : public OverlayProcessorTestBase {
|
|||||||
void SetUp() override {
|
void SetUp() override {
|
||||||
OverlayProcessorTestBase::SetUp();
|
OverlayProcessorTestBase::SetUp();
|
||||||
|
|
||||||
|
// With disable_video_overlay_if_moving enabled, videos are required to be
|
||||||
|
// stable for a certain number of frames to be considered for overlay
|
||||||
|
// promotion. This complicates tests since it adds behavior dependent on
|
||||||
|
// the number of times |Process| is called.
|
||||||
overlay_processor_ = std::make_unique<TestOverlayProcessorWin>(
|
overlay_processor_ = std::make_unique<TestOverlayProcessorWin>(
|
||||||
/*allowed_yuv_overlay_count=*/1);
|
/*allowed_yuv_overlay_count=*/1,
|
||||||
|
/*disable_video_overlay_if_moving=*/false);
|
||||||
overlay_processor_->SetUsingDCLayersForTesting(kDefaultRootPassId, true);
|
overlay_processor_->SetUsingDCLayersForTesting(kDefaultRootPassId, true);
|
||||||
overlay_processor_->SetViewportSize(gfx::Size(256, 256));
|
overlay_processor_->SetViewportSize(gfx::Size(256, 256));
|
||||||
|
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
#include "components/viz/common/features.h"
|
#include "components/viz/common/features.h"
|
||||||
#include "components/viz/service/display/display_compositor_memory_and_task_controller.h"
|
#include "components/viz/service/display/display_compositor_memory_and_task_controller.h"
|
||||||
#include "components/viz/service/display/overlay_processor_stub.h"
|
#include "components/viz/service/display/overlay_processor_stub.h"
|
||||||
|
#include "components/viz/service/display_embedder/skia_output_surface_dependency.h"
|
||||||
#include "ui/gfx/overlay_priority_hint.h"
|
#include "ui/gfx/overlay_priority_hint.h"
|
||||||
|
|
||||||
#if BUILDFLAG(IS_APPLE)
|
#if BUILDFLAG(IS_APPLE)
|
||||||
@@ -110,10 +111,16 @@ OverlayProcessorInterface::CreateOverlayProcessor(
|
|||||||
return std::make_unique<OverlayProcessorStub>();
|
return std::make_unique<OverlayProcessorStub>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DCHECK(display_controller);
|
||||||
|
DCHECK(display_controller->skia_dependency());
|
||||||
return std::make_unique<OverlayProcessorWin>(
|
return std::make_unique<OverlayProcessorWin>(
|
||||||
capabilities.dc_support_level, debug_settings,
|
capabilities.dc_support_level, debug_settings,
|
||||||
std::make_unique<DCLayerOverlayProcessor>(
|
std::make_unique<DCLayerOverlayProcessor>(
|
||||||
capabilities.allowed_yuv_overlay_count));
|
capabilities.allowed_yuv_overlay_count,
|
||||||
|
display_controller->skia_dependency()
|
||||||
|
->GetGpuDriverBugWorkarounds()
|
||||||
|
.disable_video_overlay_if_moving));
|
||||||
|
|
||||||
#elif BUILDFLAG(IS_OZONE)
|
#elif BUILDFLAG(IS_OZONE)
|
||||||
#if !BUILDFLAG(IS_CASTOS)
|
#if !BUILDFLAG(IS_CASTOS)
|
||||||
// In tests and Ozone/X11, we do not expect surfaceless surface support.
|
// In tests and Ozone/X11, we do not expect surfaceless surface support.
|
||||||
|
@@ -3399,6 +3399,29 @@
|
|||||||
"features": [
|
"features": [
|
||||||
"disable_accelerated_h264_encode"
|
"disable_accelerated_h264_encode"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 436,
|
||||||
|
"cr_bugs": [40677119],
|
||||||
|
"description": "Disable overlay promotion for clear video quads when their MPO quads would move",
|
||||||
|
"os": {
|
||||||
|
"type" : "win"
|
||||||
|
},
|
||||||
|
"exceptions": [
|
||||||
|
{
|
||||||
|
"vendor_id": "0x8086",
|
||||||
|
"os": {
|
||||||
|
"type" : "win"
|
||||||
|
},
|
||||||
|
"driver_version": {
|
||||||
|
"op": ">=",
|
||||||
|
"value": "31.0.101.4471"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"features": [
|
||||||
|
"disable_video_overlay_if_moving"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@@ -185,12 +185,6 @@ BASE_FEATURE(kDawnSIRepsUseClientProvidedInternalUsages,
|
|||||||
base::FEATURE_ENABLED_BY_DEFAULT);
|
base::FEATURE_ENABLED_BY_DEFAULT);
|
||||||
|
|
||||||
#if BUILDFLAG(IS_WIN)
|
#if BUILDFLAG(IS_WIN)
|
||||||
// Disable overlay promotion for clear video quads when their MPO quad would
|
|
||||||
// move.
|
|
||||||
BASE_FEATURE(kDisableVideoOverlayIfMoving,
|
|
||||||
"DisableVideoOverlayIfMoving",
|
|
||||||
base::FEATURE_ENABLED_BY_DEFAULT);
|
|
||||||
|
|
||||||
BASE_FEATURE(kNoUndamagedOverlayPromotion,
|
BASE_FEATURE(kNoUndamagedOverlayPromotion,
|
||||||
"NoUndamagedOverlayPromotion",
|
"NoUndamagedOverlayPromotion",
|
||||||
base::FEATURE_DISABLED_BY_DEFAULT);
|
base::FEATURE_DISABLED_BY_DEFAULT);
|
||||||
|
@@ -44,10 +44,7 @@ GPU_EXPORT BASE_DECLARE_FEATURE(kEnableMSAAOnNewIntelGPUs);
|
|||||||
GPU_EXPORT BASE_DECLARE_FEATURE(kDawnSIRepsUseClientProvidedInternalUsages);
|
GPU_EXPORT BASE_DECLARE_FEATURE(kDawnSIRepsUseClientProvidedInternalUsages);
|
||||||
|
|
||||||
#if BUILDFLAG(IS_WIN)
|
#if BUILDFLAG(IS_WIN)
|
||||||
GPU_EXPORT BASE_DECLARE_FEATURE(kDisableVideoOverlayIfMoving);
|
|
||||||
|
|
||||||
GPU_EXPORT BASE_DECLARE_FEATURE(kNoUndamagedOverlayPromotion);
|
GPU_EXPORT BASE_DECLARE_FEATURE(kNoUndamagedOverlayPromotion);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_IOS)
|
#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_IOS)
|
||||||
|
@@ -56,6 +56,7 @@ disable_software_to_accelerated_canvas_upgrade
|
|||||||
disable_svc_encoding
|
disable_svc_encoding
|
||||||
disable_texture_storage
|
disable_texture_storage
|
||||||
disable_timestamp_queries
|
disable_timestamp_queries
|
||||||
|
disable_video_overlay_if_moving
|
||||||
disable_vp9_hmft_temporal_encoding
|
disable_vp9_hmft_temporal_encoding
|
||||||
disable_vp_auto_hdr
|
disable_vp_auto_hdr
|
||||||
disable_vp_scaling
|
disable_vp_scaling
|
||||||
|
Reference in New Issue
Block a user