Index: ui/ozone/platform/drm/gpu/drm_overlay_validator.cc |
diff --git a/ui/ozone/platform/drm/gpu/drm_overlay_validator.cc b/ui/ozone/platform/drm/gpu/drm_overlay_validator.cc |
index 6604e83dd58f2ab3d0f6f75bc00c5f94ca07cec4..1a66c814b440f932caae7d1f5618f8af8eafb7ee 100644 |
--- a/ui/ozone/platform/drm/gpu/drm_overlay_validator.cc |
+++ b/ui/ozone/platform/drm/gpu/drm_overlay_validator.cc |
@@ -106,15 +106,18 @@ DrmOverlayValidator::OverlayHints::OverlayHints(uint32_t format, |
DrmOverlayValidator::OverlayHints::~OverlayHints() {} |
-DrmOverlayValidator::DrmOverlayValidator(DrmWindow* window) |
- : window_(window), overlay_hints_cache_(kMaxCacheSize) {} |
+DrmOverlayValidator::DrmOverlayValidator( |
+ DrmWindow* window, |
+ ScanoutBufferGenerator* buffer_generator) |
+ : window_(window), |
+ buffer_generator_(buffer_generator), |
+ overlay_hints_cache_(kMaxCacheSize) {} |
DrmOverlayValidator::~DrmOverlayValidator() {} |
std::vector<OverlayCheck_Params> DrmOverlayValidator::TestPageFlip( |
const std::vector<OverlayCheck_Params>& params, |
- const OverlayPlaneList& last_used_planes, |
- ScanoutBufferGenerator* buffer_generator) { |
+ const OverlayPlaneList& last_used_planes) { |
std::vector<OverlayCheck_Params> validated_params = params; |
HardwareDisplayController* controller = window_->GetController(); |
if (!controller) { |
@@ -141,7 +144,7 @@ std::vector<OverlayCheck_Params> DrmOverlayValidator::TestPageFlip( |
scoped_refptr<ScanoutBuffer> buffer = GetBufferForPageFlipTest( |
drm, scaled_buffer_size, GetFourCCFormatForFramebuffer(overlay.format), |
- buffer_generator, &reusable_buffers); |
+ buffer_generator_, &reusable_buffers); |
DCHECK(buffer); |
OverlayPlane plane(buffer, overlay.plane_z_order, overlay.transform, |
@@ -163,35 +166,58 @@ std::vector<OverlayCheck_Params> DrmOverlayValidator::TestPageFlip( |
} |
} |
- UpdateOverlayHintsCache(drm, test_list, buffer_generator, &reusable_buffers); |
+ UpdateOverlayHintsCache(drm, test_list, &reusable_buffers); |
return validated_params; |
} |
-uint32_t DrmOverlayValidator::GetOptimalBufferFormat( |
- const OverlayPlane& plane, |
- const OverlayPlaneList& plane_list) const { |
- const auto& iter = overlay_hints_cache_.Peek(plane_list); |
- // We dont have any information in cache about this combination of layers, |
- // return standard BGRX format. |
- if (iter == overlay_hints_cache_.end()) |
- return DRM_FORMAT_XRGB8888; |
- |
- DCHECK(plane_list.size() == iter->second.size()); |
- |
- size_t size = plane_list.size(); |
- uint32_t index; |
- for (index = 0; index < size; index++) { |
- const OverlayPlane& test_plane = plane_list.at(index); |
- if (test_plane.z_order == plane.z_order && |
- test_plane.plane_transform == plane.plane_transform && |
- test_plane.display_bounds == plane.display_bounds && |
- test_plane.crop_rect == plane.crop_rect) { |
- break; |
+OverlayPlaneList DrmOverlayValidator::PrepareBuffersForPageFlip( |
+ const OverlayPlaneList& planes) { |
+ if (planes.size() <= 1) |
+ return planes; |
+ |
+ HardwareDisplayController* controller = window_->GetController(); |
+ if (!controller) |
+ return planes; |
+ |
+ OverlayPlaneList pending_planes = planes; |
+ const auto& overlay_hints = overlay_hints_cache_.Get(planes); |
+ |
+ size_t size = planes.size(); |
+ bool use_hints = overlay_hints != overlay_hints_cache_.end(); |
+ |
+ for (size_t i = 0; i < size; i++) { |
+ auto& plane = pending_planes.at(i); |
+ if (plane.processing_callback.is_null()) |
+ continue; |
+ |
+ uint32_t original_format = plane.buffer->GetFramebufferPixelFormat(); |
+ uint32_t target_format = original_format; |
+ |
+ const gfx::Size& original_size = plane.buffer->GetSize(); |
+ gfx::Size target_size = |
+ GetScaledSize(original_size, plane.display_bounds, plane.crop_rect); |
+ |
+ if (use_hints) { |
+ DCHECK(size == overlay_hints->second.size()); |
+ const OverlayHints& hints = overlay_hints->second.at(i); |
+ target_format = hints.optimal_format; |
+ |
+ // We can handle plane scaling, avoid scaling buffer here. |
+ if (!hints.handle_scaling) |
+ target_size = original_size; |
+ } |
+ |
+ if (original_size != target_size || original_format != target_format) { |
+ scoped_refptr<ScanoutBuffer> processed_buffer = |
+ plane.processing_callback.Run(target_size, target_format); |
+ |
+ if (processed_buffer) |
+ plane.buffer = processed_buffer; |
} |
} |
- return iter->second.at(index).optimal_format; |
+ return pending_planes; |
} |
void DrmOverlayValidator::ClearCache() { |
@@ -201,7 +227,6 @@ void DrmOverlayValidator::ClearCache() { |
void DrmOverlayValidator::UpdateOverlayHintsCache( |
const scoped_refptr<DrmDevice>& drm, |
const OverlayPlaneList& plane_list, |
- ScanoutBufferGenerator* buffer_generator, |
std::vector<scoped_refptr<ScanoutBuffer>>* reusable_buffers) { |
const auto& iter = overlay_hints_cache_.Get(plane_list); |
if (iter != overlay_hints_cache_.end()) |
@@ -227,7 +252,7 @@ void DrmOverlayValidator::UpdateOverlayHintsCache( |
scoped_refptr<ScanoutBuffer> original_buffer = plane.buffer; |
plane.buffer = |
GetBufferForPageFlipTest(drm, plane.buffer->GetSize(), optimal_format, |
- buffer_generator, reusable_buffers); |
+ buffer_generator_, reusable_buffers); |
if (!controller->TestPageFlip(preferred_format_test_list)) { |
// If test failed here, it means even though optimal_format is |