Address Extra VPBlit Operations During Media Foundation fullscreen

This change addresses an issue where the finalized rect for Media
Foundation playback via the Direct Composition presentaiton path
was not equal to the full screen size.

In certain cases when watching 1080p content on a 1080p device we see
the visual_transform have a half pixel offset on the y-axis. The result
of this was a finalized onscreen rect of [1920, 1081] instead of The
expected [1920, 1080]. As a result of this DWM does not consider this as
a fullscreen scenario so we may see things like additional copies (e.g.
NV12-to-NV12 or NV12-to-ARGB) as well as features like DMRRS or CABC
not getting applied.

I found a set of issues with the way we were doing our current
calculation which are addressed here:
* On screen rect passed to AdjustTargetToOptimalSizeIfNeeded was
untransformed.
* AdjustTargetToOptimalSizeIfNeeded operates assuming the clipping
rect is applied but the rect set on the DComp Surface Proxy was not
clipped.
* AdjustTargetToFullScreenSizeIfNeeded would early exit if the clipped
onscreen rect equaled monitor size, but this path didn't validate if
there was any translation. That translation is still applied in the
DComp case.
* The way AdjustTargetToFullScreenSizeIfNeeded accounted for offset
from origin would not work for a partial pixel offset which wouldn't
modify the origin but would alter the finalized size.

Bug: 1469519
Change-Id: I93d79598b5607197f5ebc794b37c0ceefe2cb9c7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4893042
Commit-Queue: William Carr <wicarr@microsoft.com>
Reviewed-by: Maggie Chen <magchen@chromium.org>
Reviewed-by: Chunbo Hua <chunbo.hua@intel.com>
Cr-Commit-Position: refs/heads/main@{#1244110}
5 files changed
tree: 1fcca1fec2c1884776db35b2b669c25c1ccd876c
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. codelabs/
  13. components/
  14. content/
  15. courgette/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia_web/
  22. gin/
  23. google_apis/
  24. google_update/
  25. gpu/
  26. headless/
  27. infra/
  28. ios/
  29. ipc/
  30. media/
  31. mojo/
  32. native_client_sdk/
  33. net/
  34. pdf/
  35. ppapi/
  36. printing/
  37. remoting/
  38. rlz/
  39. sandbox/
  40. services/
  41. skia/
  42. sql/
  43. storage/
  44. styleguide/
  45. testing/
  46. third_party/
  47. tools/
  48. ui/
  49. url/
  50. webkit/
  51. .clang-format
  52. .clang-tidy
  53. .clangd
  54. .eslintrc.js
  55. .git-blame-ignore-revs
  56. .gitattributes
  57. .gitignore
  58. .gitmodules
  59. .gn
  60. .mailmap
  61. .rustfmt.toml
  62. .vpython3
  63. .yapfignore
  64. ATL_OWNERS
  65. AUTHORS
  66. BUILD.gn
  67. CODE_OF_CONDUCT.md
  68. codereview.settings
  69. DEPS
  70. DIR_METADATA
  71. LICENSE
  72. LICENSE.chromium_os
  73. OWNERS
  74. PRESUBMIT.py
  75. PRESUBMIT_test.py
  76. PRESUBMIT_test_mocks.py
  77. README.md
  78. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure.

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.

If you found a bug, please file it at https://crbug.com/new.