[Title] Fix to noise DRI2 buffer.
authorWonsik Jung <sidein@samsung.com>
Tue, 14 May 2013 11:27:59 +0000 (20:27 +0900)
committerSungho Kwak <sungho1.kwak@samsung.com>
Tue, 11 Jun 2013 12:33:32 +0000 (21:33 +0900)
[Problem]  When window is created and is shown first, noise is appeared.
[Cause]    When window is created and try to render at first, canvas size 1x1, but DRI2buffer size is bigger than canvas size.
[Solution] If canvas size is different to DRI2Buffer's, skip swapbuffer.
[Team]     Graphics

Change-Id: Iac886787ced0bd6004ec03aa2dd5544fd2bea543

src/modules/engines/software_x11/evas_xlib_swapbuf.c
src/modules/engines/software_x11/evas_xlib_swapper.c
src/modules/engines/software_x11/evas_xlib_swapper.h

index d9bba56..df7e831 100755 (executable)
@@ -314,6 +314,7 @@ evas_software_xlib_swapbuf_free_region_for_update(Outbuf *buf EINA_UNUSED, RGBA_
 void
 evas_software_xlib_swapbuf_flush(Outbuf *buf)
 {
+   int buf_w, buf_h, temp;
    if (!buf->priv.pending_writes)
      {
         Eina_Rectangle *rects, *rect;
@@ -329,7 +330,17 @@ evas_software_xlib_swapbuf_flush(Outbuf *buf)
              rects[i] = *rect;
           }
         evas_xlib_swapper_buffer_unmap(buf->priv.swapper);
-        evas_xlib_swapper_swap(buf->priv.swapper, rects, n);
+        evas_xlib_swapper_buffer_size_get(buf->priv.swapper, &buf_w, &buf_h);
+        if ((buf->rot == 90) || (buf->rot == 270))
+          {
+             temp = buf_w;
+             buf_w = buf_h;
+             buf_h = temp;
+          }
+
+        if ((buf_w == buf->w) && (buf_h == buf->h))
+           evas_xlib_swapper_swap(buf->priv.swapper, rects, n);
+
         eina_array_clean(&buf->priv.onebuf_regions);
         im = buf->priv.onebuf;
         buf->priv.onebuf = NULL;
@@ -398,7 +409,17 @@ evas_software_xlib_swapbuf_flush(Outbuf *buf)
              i++;
           }
         evas_xlib_swapper_buffer_unmap(buf->priv.swapper);
-        evas_xlib_swapper_swap(buf->priv.swapper, rects, n);
+        evas_xlib_swapper_buffer_size_get(buf->priv.swapper, &buf_w, &buf_h);
+        if ((buf->rot == 90) || (buf->rot == 270))
+          {
+             temp = buf_w;
+             buf_w = buf_h;
+             buf_h = temp;
+          }
+
+        if ((buf_w == buf->w) && (buf_h == buf->h))
+           evas_xlib_swapper_swap(buf->priv.swapper, rects, n);
+
 //        evas_xlib_swapper_swap(buf->priv.swapper, NULL, 0);
      }
 }
index ce94c49..7dc1440 100755 (executable)
@@ -871,6 +871,17 @@ evas_xlib_swapper_bit_order_get(X_Swapper *swp EINA_UNUSED)
    return LSBFirst;
 }
 
+void
+evas_xlib_swapper_buffer_size_get(X_Swapper *swp, int *w, int *h)
+{
+   if (!swp) return;
+
+   *w = swp->buf_w;
+   *h = swp->buf_h;
+
+   return;
+}
+
 #endif
 
 #else
index 043ee41..18ad594 100755 (executable)
@@ -12,4 +12,5 @@ int evas_xlib_swapper_buffer_state_get(X_Swapper *swp);
 int evas_xlib_swapper_depth_get(X_Swapper *swp);
 int evas_xlib_swapper_byte_order_get(X_Swapper *swp);
 int evas_xlib_swapper_bit_order_get(X_Swapper *swp);
+void evas_xlib_swapper_buffer_size_get(X_Swapper *swp, int *w, int *h);