gpu: Empty swaps for surfaceless output surfaces.

This improves hardware overlay support by avoiding updates to the
primary plane when only overlays are damaged. The previous buffer
is now reused for the primary plane when damage rect is empty.

An important side-effect of this is that we can always support empty
swaps without the need for partial updates.

BUG=705290
CQ_INCLUDE_TRYBOTS=master.tryserver.blink:linux_trusty_blink_rel;master.tryserver.chromium.android:android_optional_gpu_tests_rel;master.tryserver.chromium.linux:linux_optional_gpu_tests_rel;master.tryserver.chromium.mac:mac_optional_gpu_tests_rel;master.tryserver.chromium.win:win_optional_gpu_tests_rel

Review-Url: https://codereview.chromium.org/2829543003
Cr-Original-Commit-Position: refs/heads/master@{#466245}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: bba53b15c45ce0fa66d3343befae28aa695311c1
diff --git a/command_buffer/common/capabilities.h b/command_buffer/common/capabilities.h
index 41ab8ef..410f65c 100644
--- a/command_buffer/common/capabilities.h
+++ b/command_buffer/common/capabilities.h
@@ -172,6 +172,9 @@
   // See https://crbug.com/710029.
   bool software_to_accelerated_canvas_upgrade = true;
 
+  // When true, non-empty post sub buffer calls are unsupported.
+  bool disable_non_empty_post_sub_buffers = false;
+
   int major_version = 2;
   int minor_version = 0;
 };
diff --git a/command_buffer/service/gles2_cmd_decoder.cc b/command_buffer/service/gles2_cmd_decoder.cc
index ac14422..b909740 100644
--- a/command_buffer/service/gles2_cmd_decoder.cc
+++ b/command_buffer/service/gles2_cmd_decoder.cc
@@ -3816,6 +3816,10 @@
       !workarounds().disable_software_to_accelerated_canvas_upgrade;
   caps.emulate_rgb_buffer_with_rgba =
       workarounds().disable_gl_rgb_format;
+  if (workarounds().disable_non_empty_post_sub_buffers_for_onscreen_surfaces &&
+      !surface_->IsOffscreen()) {
+    caps.disable_non_empty_post_sub_buffers = true;
+  }
 
   return caps;
 }
diff --git a/config/gpu_driver_bug_list.json b/config/gpu_driver_bug_list.json
index 7d5d1e7..2cd064f 100644
--- a/config/gpu_driver_bug_list.json
+++ b/config/gpu_driver_bug_list.json
@@ -854,7 +854,7 @@
       "gl_vendor": "ARM.*",
       "gl_renderer": "Mali-T.*",
       "features": [
-        "disable_post_sub_buffers_for_onscreen_surfaces"
+        "disable_non_empty_post_sub_buffers_for_onscreen_surfaces"
       ]
     },
     {
diff --git a/config/gpu_driver_bug_workaround_type.h b/config/gpu_driver_bug_workaround_type.h
index fc021b3..cca18b9 100644
--- a/config/gpu_driver_bug_workaround_type.h
+++ b/config/gpu_driver_bug_workaround_type.h
@@ -213,6 +213,8 @@
          disallow_large_instanced_draw)                      \
   GPU_OP(DISABLE_SOFTWARE_TO_ACCELERATED_CANVAS_UPGRADE,     \
          disable_software_to_accelerated_canvas_upgrade)     \
+  GPU_OP(DISABLE_NON_EMPTY_POST_SUB_BUFFERS_FOR_ONSCREEN_SURFACES, \
+         disable_non_empty_post_sub_buffers_for_onscreen_surfaces) \
 // clang-format on
 
 namespace gpu {
diff --git a/ipc/common/gpu_command_buffer_traits_multi.h b/ipc/common/gpu_command_buffer_traits_multi.h
index fe721e6..f8e031f 100644
--- a/ipc/common/gpu_command_buffer_traits_multi.h
+++ b/ipc/common/gpu_command_buffer_traits_multi.h
@@ -129,6 +129,7 @@
   IPC_STRUCT_TRAITS_MEMBER(emulate_rgb_buffer_with_rgba)
   IPC_STRUCT_TRAITS_MEMBER(software_to_accelerated_canvas_upgrade)
   IPC_STRUCT_TRAITS_MEMBER(dc_layers)
+  IPC_STRUCT_TRAITS_MEMBER(disable_non_empty_post_sub_buffers)
 
   IPC_STRUCT_TRAITS_MEMBER(major_version)
   IPC_STRUCT_TRAITS_MEMBER(minor_version)