Add hw y-inverting for ARGB images 16/144416/3 accepted/tizen/unified/20170922.065340 submit/tizen/20170913.082218 submit/tizen/20170921.074615
authorVladislav Andresov <v.andresov@partner.samsung.com>
Wed, 16 Aug 2017 13:15:56 +0000 (16:15 +0300)
committerVasiliy Ulyanov <v.ulyanov@samsung.com>
Thu, 17 Aug 2017 09:10:30 +0000 (12:10 +0300)
Change-Id: I9ee0fd94cb773d326a18074aa99d4576d5ac9639
Signed-off-by: Vladislav Andresov <v.andresov@partner.samsung.com>
Signed-off-by: Vasiliy Ulyanov <v.ulyanov@samsung.com>
EGL/yagl_onscreen_image_tizen_sfc.c
EGL/yagl_onscreen_image_tizen_sfc.h

index 031d4a0fc60287edf5f73d3a79db317dfb56d22b..3a33a79cc58f25b5c88b2dfd2272c0e9b7726668 100644 (file)
@@ -41,6 +41,7 @@
 #include "yagl_state.h"
 #include "yagl_client_interface.h"
 #include "yagl_client_image.h"
+#include "drm_fourcc.h"
 #include "vigs.h"
 #include <tbm_bufmgr.h>
 #include <tbm_bufmgr_backend.h>
@@ -68,7 +69,6 @@ static inline uint32_t yuv2argb(float y, float u, float v)
     return (0xff000000 | (r << 16) | (g << 8) | b);
 }
 
-/* TODO need to think about HW convertion */
 static bool yagl_onscreen_image_tizen_sfc_convert(struct yagl_onscreen_image_tizen_sfc *image)
 {
     uint32_t *dst;
@@ -79,10 +79,6 @@ static bool yagl_onscreen_image_tizen_sfc_convert(struct yagl_onscreen_image_tiz
 
     YAGL_LOG_FUNC_SET(yagl_onscreen_image_tizen_sfc_convert);
 
-    if (!image->need_convert) {
-        return true;
-    }
-
     ret = tbm_surface_map(image->sfc, TBM_SURF_OPTION_READ, &info);
 
     if (ret != TBM_SURFACE_ERROR_NONE) {
@@ -160,6 +156,38 @@ static void yagl_onscreen_image_tizen_sfc_update(struct yagl_image *image)
     struct yagl_onscreen_image_tizen_sfc *tizen_sfc_image =
         (struct yagl_onscreen_image_tizen_sfc *)image;
 
+    YAGL_LOG_FUNC_SET(yagl_onscreen_image_tizen_sfc_update);
+
+    if (!tizen_sfc_image->need_convert) {
+        return;
+    }
+
+    if (tizen_sfc_image->format == TBM_FORMAT_ARGB8888) {
+        tbm_bo bo = tbm_surface_internal_get_bo(tizen_sfc_image->sfc, 0);
+        struct vigs_drm_surface *src = bo ? tbm_backend_get_bo_priv(bo) : NULL;
+        int ret;
+
+        /*
+         * No actual format conversion in ARGB8888 case. We just need to
+         * y-invert the image.
+         */
+        ret = vigs_drm_surface_convert(src,
+                                       DRM_FORMAT_ARGB8888,
+                                       tizen_sfc_image->drm_sfc,
+                                       DRM_FORMAT_ARGB8888,
+                                       true);
+
+        if (ret == 0) {
+            return;
+        }
+
+        YAGL_LOG_ERROR("vigs_drm_surface_convert failed %s\n", strerror(-ret));
+
+        /*
+         * Fallback to software converson in case of error.
+         */
+    }
+
     yagl_onscreen_image_tizen_sfc_convert(tizen_sfc_image);
 }
 
@@ -297,6 +325,7 @@ struct yagl_onscreen_image_tizen_sfc
     image->sfc = sfc;
     image->need_convert = need_convert;
     image->drm_sfc = drm_sfc;
+    image->format = info.format;
 
     YAGL_LOG_DEBUG("%ux%u/%u, sfc_id = %u, need_convert = %d (0x%X), num_planes = %u, size = %u",
                    info.width,
index 7da39fe757a56a54b4237c19ff244d2a3713a0d5..e7af41bc575d7f81cc9da87df384649f539917a4 100644 (file)
@@ -50,6 +50,8 @@ struct yagl_onscreen_image_tizen_sfc
     bool need_convert;
 
     struct vigs_drm_surface *drm_sfc;
+
+    uint32_t format;
 };
 
 struct yagl_onscreen_image_tizen_sfc