hwc: Combine all requests to stitch.

CRs-Fixed: 2660235
Change-Id: I752b69153ae8a4854e2be4f7324862c4444a5a9e
diff --git a/composer/gl_common.cpp b/composer/gl_common.cpp
index 4d4744d..4d1db6f 100644
--- a/composer/gl_common.cpp
+++ b/composer/gl_common.cpp
@@ -27,6 +27,9 @@
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <vector>
+#include <string>
+
 #include "gl_common.h"
 
 #define __CLASS__ "GLCommon"
@@ -97,21 +100,29 @@
   }
 }
 
-void GLCommon::SetDestinationBuffer(const private_handle_t *dst_hnd, const GLRect &dst_rect) {
+void GLCommon::SetDestinationBuffer(const private_handle_t *dst_hnd) {
   DTRACE_SCOPED();
+  if (dst_hnd_ == dst_hnd) {
+    return;
+  }
   EGLImageBuffer *dst_buffer = image_wrapper_.wrap(reinterpret_cast<const void *>(dst_hnd));
 
   if (dst_buffer) {
     GL(glBindFramebuffer(GL_FRAMEBUFFER, dst_buffer->getFramebuffer()));
-    float width = dst_rect.right - dst_rect.left;
-    float height = dst_rect.bottom - dst_rect.top;
-    GL(glViewport(dst_rect.left, dst_rect.top, width, height));
   }
+
+  // Same buffer gets reprogrammed. Avoid repeated setting.
+  dst_hnd_ = dst_hnd;
 }
 
-int GLCommon::WaitOnInputFence(const shared_ptr<Fence> &in_fence) {
+int GLCommon::WaitOnInputFence(const std::vector<shared_ptr<Fence>> &in_fences) {
   DTRACE_SCOPED();
 
+  shared_ptr<Fence> in_fence = Fence::Merge(in_fences, true /* ignore signaled*/);
+  if (in_fence == nullptr) {
+   return 0;
+  }
+
   int fd = Fence::Dup(in_fence);
   EGLint attribs[] = {EGL_SYNC_NATIVE_FENCE_FD_ANDROID, fd, EGL_NONE};
   EGLSyncKHR sync = eglCreateSyncKHR(eglGetCurrentDisplay(), EGL_SYNC_NATIVE_FENCE_ANDROID,
@@ -182,5 +193,12 @@
   }
 }
 
+void GLCommon::SetViewport(const GLRect &dst_rect) {
+  DTRACE_SCOPED();
+  float width = dst_rect.right - dst_rect.left;
+  float height = dst_rect.bottom - dst_rect.top;
+  GL(glViewport(dst_rect.left, dst_rect.top, width, height));
+}
+
 }  // namespace sdm