1054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*
2054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Copyright (c) 2012-2014, Linux Foundation. All rights reserved.
3054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
4054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Redistribution and use in source and binary forms, with or without
5054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * modification, are permitted provided that the following conditions are
6054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * met:
7054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *   * Redistributions of source code must retain the above copyright
8054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *     notice, this list of conditions and the following disclaimer.
9054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *   * Redistributions in binary form must reproduce the above
10054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *     copyright notice, this list of conditions and the following
11054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *     disclaimer in the documentation and/or other materials provided
12054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *     with the distribution.
13054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *   * Neither the name of Linux Foundation nor the names of its
14054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *     contributors may be used to endorse or promote products derived
15054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *     from this software without specific prior written permission.
16054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
17054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */
29054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
30054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifndef LOG_TAG
31054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define LOG_TAG "qsfdump"
32054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif
33054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define LOG_NDEBUG 0
34054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <hwc_utils.h>
35054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <hwc_dump_layers.h>
36054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <cutils/log.h>
37054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <sys/stat.h>
38054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <comptype.h>
39054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifdef QCOM_BSP
40054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// Ignore Wconversion errors for external headers
41054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#pragma GCC diagnostic push
42054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#pragma GCC diagnostic ignored "-Wconversion"
43054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <SkBitmap.h>
44054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <SkImageEncoder.h>
45054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#pragma GCC diagnostic pop
46054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif
47054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifdef STDC_FORMAT_MACROS
48054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <inttypes.h>
49054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif
50054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
51054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinnamespace qhwc {
52054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
53054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// MAX_ALLOWED_FRAMEDUMPS must be capped to (LONG_MAX - 1)
54054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// 60fps => 216000 frames per hour
55054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// Below setting of 216000 * 24 * 7 => 1 week or 168 hours of capture.
56054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin  enum {
57054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    MAX_ALLOWED_FRAMEDUMPS = (216000 * 24 * 7)
58054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin  };
59054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
60054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool HwcDebug::sDumpEnable = false;
61054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
62054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinHwcDebug::HwcDebug(uint32_t dpy):
63054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin  mDumpCntLimRaw(0),
64054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin  mDumpCntrRaw(1),
65054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin  mDumpCntLimPng(0),
66054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin  mDumpCntrPng(1),
67054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin  mDpy(dpy) {
68054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    char dumpPropStr[PROPERTY_VALUE_MAX];
69054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(mDpy) {
70054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        strlcpy(mDisplayName, "external", sizeof(mDisplayName));
71054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    } else {
72054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        strlcpy(mDisplayName, "primary", sizeof(mDisplayName));
73054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
74054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    snprintf(mDumpPropKeyDisplayType, sizeof(mDumpPropKeyDisplayType),
75054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin             "debug.sf.dump.%s", (char *)mDisplayName);
76054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
77054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if ((property_get("debug.sf.dump.enable", dumpPropStr, NULL) > 0)) {
78054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if(!strncmp(dumpPropStr, "true", strlen("true"))) {
79054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            sDumpEnable = true;
80054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
81054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
82054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
83054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
84054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid HwcDebug::dumpLayers(hwc_display_contents_1_t* list)
85054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
86054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // Check need for dumping layers for debugging.
87054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (UNLIKELY(sDumpEnable) && UNLIKELY(needToDumpLayers()) && LIKELY(list)) {
88054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        logHwcProps(list->flags);
89054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        for (size_t i = 0; i < list->numHwLayers; i++) {
90054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            logLayer(i, list->hwLayers);
91054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            dumpLayer(i, list->hwLayers);
92054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
93054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
94054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
95054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
96054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool HwcDebug::needToDumpLayers()
97054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
98054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool bDumpLayer = false;
99054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    char dumpPropStr[PROPERTY_VALUE_MAX];
100054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // Enable primary dump and disable external dump by default.
101054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool bDumpEnable = !mDpy;
102054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    time_t timeNow;
103054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    tm dumpTime;
104054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
105054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // Override the bDumpEnable based on the property value, if the property
106054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // is present in the build.prop file.
107054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if ((property_get(mDumpPropKeyDisplayType, dumpPropStr, NULL) > 0)) {
108054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if(!strncmp(dumpPropStr, "true", strlen("true")))
109054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            bDumpEnable = true;
110054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        else
111054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            bDumpEnable = false;
112054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
113054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
114054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (false == bDumpEnable)
115054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return false;
116054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
117054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    time(&timeNow);
118054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    localtime_r(&timeNow, &dumpTime);
119054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
120054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if ((property_get("debug.sf.dump.png", dumpPropStr, NULL) > 0) &&
121054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            (strncmp(dumpPropStr, mDumpPropStrPng, PROPERTY_VALUE_MAX - 1))) {
122054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        // Strings exist & not equal implies it has changed, so trigger a dump
123054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        strlcpy(mDumpPropStrPng, dumpPropStr, sizeof(mDumpPropStrPng));
124054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        mDumpCntLimPng = atoi(dumpPropStr);
125054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (mDumpCntLimPng > MAX_ALLOWED_FRAMEDUMPS) {
126054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            ALOGW("Warning: Using debug.sf.dump.png %d (= max)",
127054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                MAX_ALLOWED_FRAMEDUMPS);
128054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mDumpCntLimPng = MAX_ALLOWED_FRAMEDUMPS;
129054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
130054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        mDumpCntLimPng = (mDumpCntLimPng < 0) ? 0: mDumpCntLimPng;
131054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (mDumpCntLimPng) {
132054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            snprintf(mDumpDirPng, sizeof(mDumpDirPng),
133054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    "/data/sfdump.png.%04d.%02d.%02d.%02d.%02d.%02d",
134054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    dumpTime.tm_year + 1900, dumpTime.tm_mon + 1,
135054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    dumpTime.tm_mday, dumpTime.tm_hour,
136054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    dumpTime.tm_min, dumpTime.tm_sec);
137054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            if (0 == mkdir(mDumpDirPng, 0777))
138054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                mDumpCntrPng = 0;
139054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            else {
140054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                ALOGE("Error: %s. Failed to create sfdump directory: %s",
141054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    strerror(errno), mDumpDirPng);
142054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                mDumpCntrPng = mDumpCntLimPng + 1;
143054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            }
144054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
145054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
146054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
147054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (mDumpCntrPng <= mDumpCntLimPng)
148054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        mDumpCntrPng++;
149054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
150054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if ((property_get("debug.sf.dump", dumpPropStr, NULL) > 0) &&
151054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            (strncmp(dumpPropStr, mDumpPropStrRaw, PROPERTY_VALUE_MAX - 1))) {
152054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        // Strings exist & not equal implies it has changed, so trigger a dump
153054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        strlcpy(mDumpPropStrRaw, dumpPropStr, sizeof(mDumpPropStrRaw));
154054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        mDumpCntLimRaw = atoi(dumpPropStr);
155054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (mDumpCntLimRaw > MAX_ALLOWED_FRAMEDUMPS) {
156054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            ALOGW("Warning: Using debug.sf.dump %d (= max)",
157054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                MAX_ALLOWED_FRAMEDUMPS);
158054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mDumpCntLimRaw = MAX_ALLOWED_FRAMEDUMPS;
159054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
160054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        mDumpCntLimRaw = (mDumpCntLimRaw < 0) ? 0: mDumpCntLimRaw;
161054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (mDumpCntLimRaw) {
162054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            snprintf(mDumpDirRaw, sizeof(mDumpDirRaw),
163054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    "/data/sfdump.raw.%04d.%02d.%02d.%02d.%02d.%02d",
164054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    dumpTime.tm_year + 1900, dumpTime.tm_mon + 1,
165054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    dumpTime.tm_mday, dumpTime.tm_hour,
166054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    dumpTime.tm_min, dumpTime.tm_sec);
167054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            if (0 == mkdir(mDumpDirRaw, 0777))
168054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                mDumpCntrRaw = 0;
169054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            else {
170054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                ALOGE("Error: %s. Failed to create sfdump directory: %s",
171054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    strerror(errno), mDumpDirRaw);
172054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                mDumpCntrRaw = mDumpCntLimRaw + 1;
173054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            }
174054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
175054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
176054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
177054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (mDumpCntrRaw <= mDumpCntLimRaw)
178054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        mDumpCntrRaw++;
179054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
180054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bDumpLayer = (mDumpCntLimPng || mDumpCntLimRaw)? true : false;
181054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return bDumpLayer;
182054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
183054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
184054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid HwcDebug::logHwcProps(uint32_t listFlags)
185054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
186054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    static int hwcModuleCompType = -1;
187054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    static int sMdpCompMaxLayers = 0;
188054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    static String8 hwcModuleCompTypeLog("");
189054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (-1 == hwcModuleCompType) {
190054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        // One time stuff
191054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        char mdpCompPropStr[PROPERTY_VALUE_MAX];
192054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (property_get("debug.mdpcomp.maxlayer", mdpCompPropStr, NULL) > 0) {
193054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            sMdpCompMaxLayers = atoi(mdpCompPropStr);
194054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
195054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        hwcModuleCompType =
196054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            qdutils::QCCompositionType::getInstance().getCompositionType();
197054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        hwcModuleCompTypeLog.appendFormat("%s%s%s%s%s%s",
198054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            // Is hwc module composition type now a bit-field?!
199054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            (hwcModuleCompType == qdutils::COMPOSITION_TYPE_GPU)?
200054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                "[GPU]": "",
201054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            (hwcModuleCompType & qdutils::COMPOSITION_TYPE_MDP)?
202054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                "[MDP]": "",
203054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            (hwcModuleCompType & qdutils::COMPOSITION_TYPE_C2D)?
204054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                "[C2D]": "",
205054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            (hwcModuleCompType & qdutils::COMPOSITION_TYPE_CPU)?
206054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                "[CPU]": "",
207054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            (hwcModuleCompType & qdutils::COMPOSITION_TYPE_DYN)?
208054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                "[DYN]": "",
209054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            (hwcModuleCompType >= (qdutils::COMPOSITION_TYPE_DYN << 1))?
210054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                "[???]": "");
211054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
212054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ALOGI("Display[%s] Layer[*] %s-HwcModuleCompType, %d-layer MdpComp %s",
213054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin         mDisplayName, hwcModuleCompTypeLog.string(), sMdpCompMaxLayers,
214054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        (listFlags & HWC_GEOMETRY_CHANGED)? "[HwcList Geometry Changed]": "");
215054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
216054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
217054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid HwcDebug::logLayer(size_t layerIndex, hwc_layer_1_t hwLayers[])
218054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
219054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (NULL == hwLayers) {
220054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        ALOGE("Display[%s] Layer[%zu] Error. No hwc layers to log.",
221054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mDisplayName, layerIndex);
222054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return;
223054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
224054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
225054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    hwc_layer_1_t *layer = &hwLayers[layerIndex];
226054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf);
227054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    hwc_rect_t displayFrame = layer->displayFrame;
228054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    size_t numHwcRects = layer->visibleRegionScreen.numRects;
229054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    hwc_rect_t const *hwcRects = layer->visibleRegionScreen.rects;
230054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    private_handle_t *hnd = (private_handle_t *)layer->handle;
231054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
232054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    char pixFormatStr[32] = "None";
233054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    String8 hwcVisRegsScrLog("[None]");
234054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
235054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    for (size_t i = 0 ; (hwcRects && (i < numHwcRects)); i++) {
236054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (0 == i)
237054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            hwcVisRegsScrLog.clear();
238054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        hwcVisRegsScrLog.appendFormat("[%dl, %dt, %dr, %db]",
239054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                                        hwcRects[i].left, hwcRects[i].top,
240054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                                        hwcRects[i].right, hwcRects[i].bottom);
241054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
242054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
243054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (hnd)
244054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        getHalPixelFormatStr(hnd->format, pixFormatStr);
245054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
246054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // Log Line 1
247054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ALOGI("Display[%s] Layer[%zu] SrcBuff[%dx%d] SrcCrop[%dl, %dt, %dr, %db] "
248054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        "DispFrame[%dl, %dt, %dr, %db] VisRegsScr%s", mDisplayName, layerIndex,
249054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        (hnd)? getWidth(hnd) : -1, (hnd)? getHeight(hnd) : -1,
250054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        sourceCrop.left, sourceCrop.top,
251054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        sourceCrop.right, sourceCrop.bottom,
252054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        displayFrame.left, displayFrame.top,
253054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        displayFrame.right, displayFrame.bottom,
254054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        hwcVisRegsScrLog.string());
255054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // Log Line 2
256054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ALOGI("Display[%s] Layer[%zu] LayerCompType = %s, Format = %s, "
257054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        "Orientation = %s, Flags = %s%s%s, Hints = %s%s%s, "
258054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        "Blending = %s%s%s", mDisplayName, layerIndex,
259054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        (layer->compositionType == HWC_FRAMEBUFFER)? "Framebuffer(GPU)":
260054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            (layer->compositionType == HWC_OVERLAY)? "Overlay":
261054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            (layer->compositionType == HWC_BACKGROUND)? "Background":"???",
262054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin         pixFormatStr,
263054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin         (layer->transform == 0)? "ROT_0":
264054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin             (layer->transform == HWC_TRANSFORM_FLIP_H)? "FLIP_H":
265054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin             (layer->transform == HWC_TRANSFORM_FLIP_V)? "FLIP_V":
266054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin             (layer->transform == HWC_TRANSFORM_ROT_90)? "ROT_90":
267054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                                                        "ROT_INVALID",
268054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin         (layer->flags)? "": "[None]",
269054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin         (layer->flags & HWC_SKIP_LAYER)? "[Skip layer]":"",
270054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin         (layer->flags & qhwc::HWC_MDPCOMP)? "[MDP Comp]":"",
271054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin         (layer->hints)? "":"[None]",
272054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin         (layer->hints & HWC_HINT_TRIPLE_BUFFER)? "[Triple Buffer]":"",
273054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin         (layer->hints & HWC_HINT_CLEAR_FB)? "[Clear FB]":"",
274054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin         (layer->blending == HWC_BLENDING_NONE)? "[None]":"",
275054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin         (layer->blending == HWC_BLENDING_PREMULT)? "[PreMult]":"",
276054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin         (layer->blending == HWC_BLENDING_COVERAGE)? "[Coverage]":"");
277054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
278054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
279054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid HwcDebug::dumpLayer(size_t layerIndex, hwc_layer_1_t hwLayers[])
280054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
281054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    char dumpLogStrPng[128] = "";
282054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    char dumpLogStrRaw[128] = "";
283054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool needDumpPng = (mDumpCntrPng <= mDumpCntLimPng)? true:false;
284054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool needDumpRaw = (mDumpCntrRaw <= mDumpCntLimRaw)? true:false;
285054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
286054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (needDumpPng) {
287054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        snprintf(dumpLogStrPng, sizeof(dumpLogStrPng),
288054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            "[png-dump-frame: %03d of %03d]", mDumpCntrPng,
289054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mDumpCntLimPng);
290054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
291054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (needDumpRaw) {
292054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        snprintf(dumpLogStrRaw, sizeof(dumpLogStrRaw),
293054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            "[raw-dump-frame: %03d of %03d]", mDumpCntrRaw,
294054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mDumpCntLimRaw);
295054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
296054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
297054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (!(needDumpPng || needDumpRaw))
298054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return;
299054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
300054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (NULL == hwLayers) {
301054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        ALOGE("Display[%s] Layer[%zu] %s%s Error: No hwc layers to dump.",
302054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mDisplayName, layerIndex, dumpLogStrRaw, dumpLogStrPng);
303054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return;
304054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
305054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
306054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    hwc_layer_1_t *layer = &hwLayers[layerIndex];
307054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    private_handle_t *hnd = (private_handle_t *)layer->handle;
308054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    char pixFormatStr[32] = "None";
309054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
310054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (NULL == hnd) {
311054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        ALOGI("Display[%s] Layer[%zu] %s%s Skipping dump: Bufferless layer.",
312054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mDisplayName, layerIndex, dumpLogStrRaw, dumpLogStrPng);
313054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return;
314054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
315054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
316054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    getHalPixelFormatStr(hnd->format, pixFormatStr);
317054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifdef QCOM_BSP
318054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (needDumpPng && hnd->base) {
319054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        bool bResult = false;
320054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        char dumpFilename[PATH_MAX];
321054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        SkColorType tempSkBmpColor = kUnknown_SkColorType;
322054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        snprintf(dumpFilename, sizeof(dumpFilename),
323054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            "%s/sfdump%03d.layer%zu.%s.png", mDumpDirPng,
324054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mDumpCntrPng, layerIndex, mDisplayName);
325054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
326054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        switch (hnd->format) {
327054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            case HAL_PIXEL_FORMAT_RGBA_8888:
328054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            case HAL_PIXEL_FORMAT_RGBX_8888:
329054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                tempSkBmpColor = kRGBA_8888_SkColorType;
330054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                break;
331054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            case HAL_PIXEL_FORMAT_BGRA_8888:
332054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                tempSkBmpColor = kBGRA_8888_SkColorType;
333054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                break;
334054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            case HAL_PIXEL_FORMAT_RGB_565:
335054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                tempSkBmpColor = kRGB_565_SkColorType;
336054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                break;
337054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            case HAL_PIXEL_FORMAT_RGBA_5551:
338054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            case HAL_PIXEL_FORMAT_RGBA_4444:
339054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            case HAL_PIXEL_FORMAT_RGB_888:
340054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            default:
341054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                tempSkBmpColor = kUnknown_SkColorType;
342054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                break;
343054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
344054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (kUnknown_SkColorType != tempSkBmpColor) {
3458e9bbcb6fe0f087e761acebc007753ca2f4838bfHal Canary            SkImageInfo info = SkImageInfo::Make(getWidth(hnd), getHeight(hnd),
3468e9bbcb6fe0f087e761acebc007753ca2f4838bfHal Canary                                                 tempSkBmpColor, kIgnore_SkAlphaType);
3478e9bbcb6fe0f087e761acebc007753ca2f4838bfHal Canary            SkPixmap pixmap(info, (const void*)hnd->base, info.minRowBytes());
3488e9bbcb6fe0f087e761acebc007753ca2f4838bfHal Canary            SkFILEWStream file(dumpFilename);
3498e9bbcb6fe0f087e761acebc007753ca2f4838bfHal Canary            bResult = SkEncodeImage(&file, pixmap, SkEncodedImageFormat::kPNG, 100);
350054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            ALOGI("Display[%s] Layer[%zu] %s Dump to %s: %s",
351054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                mDisplayName, layerIndex, dumpLogStrPng,
352054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                dumpFilename, bResult ? "Success" : "Fail");
353054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        } else {
354054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            ALOGI("Display[%s] Layer[%zu] %s Skipping dump: Unsupported layer"
355054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                " format %s for png encoder",
356054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                mDisplayName, layerIndex, dumpLogStrPng, pixFormatStr);
357054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
358054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
359054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif
360054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (needDumpRaw && hnd->base) {
361054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        char dumpFilename[PATH_MAX];
362054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        bool bResult = false;
363054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        snprintf(dumpFilename, sizeof(dumpFilename),
364054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            "%s/sfdump%03d.layer%zu.%dx%d.%s.%s.raw",
365054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mDumpDirRaw, mDumpCntrRaw,
366054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            layerIndex, getWidth(hnd), getHeight(hnd),
367054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            pixFormatStr, mDisplayName);
368054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        FILE* fp = fopen(dumpFilename, "w+");
369054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (NULL != fp) {
370054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            bResult = (bool) fwrite((void*)hnd->base, hnd->size, 1, fp);
371054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            fclose(fp);
372054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
373054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        ALOGI("Display[%s] Layer[%zu] %s Dump to %s: %s",
374054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mDisplayName, layerIndex, dumpLogStrRaw,
375054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            dumpFilename, bResult ? "Success" : "Fail");
376054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
377054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
378054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
379054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid HwcDebug::getHalPixelFormatStr(int format, char pixFormatStr[])
380054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
381054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (!pixFormatStr)
382054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return;
383054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
384054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    switch(format) {
385054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_RGBA_8888:
386054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "RGBA_8888", sizeof(pixFormatStr));
387054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
388054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_RGBX_8888:
389054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "RGBX_8888", sizeof(pixFormatStr));
390054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
391054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_RGB_888:
392054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "RGB_888", sizeof(pixFormatStr));
393054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
394054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_RGB_565:
395054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "RGB_565", sizeof(pixFormatStr));
396054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
397054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_BGRA_8888:
398054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "BGRA_8888", sizeof(pixFormatStr));
399054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
400054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_RGBA_5551:
401054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "RGBA_5551", sizeof(pixFormatStr));
402054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
403054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_RGBA_4444:
404054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "RGBA_4444", sizeof(pixFormatStr));
405054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
406054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_YV12:
407054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "YV12", sizeof(pixFormatStr));
408054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
409054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_YCbCr_422_SP:
410054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "YCbCr_422_SP_NV16", sizeof(pixFormatStr));
411054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
412054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
413054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "YCrCb_420_SP_NV21", sizeof(pixFormatStr));
414054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
415054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_YCbCr_422_I:
416054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "YCbCr_422_I_YUY2", sizeof(pixFormatStr));
417054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
418054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_YCrCb_422_I:
419054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "YCrCb_422_I_YVYU", sizeof(pixFormatStr));
420054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
421054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
422054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "NV12_ENCODEABLE", sizeof(pixFormatStr));
423054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
424054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
425054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "YCbCr_420_SP_TILED_TILE_4x2",
426054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                   sizeof(pixFormatStr));
427054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
428054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_YCbCr_420_SP:
429054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "YCbCr_420_SP", sizeof(pixFormatStr));
430054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
431054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO:
432054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "YCrCb_420_SP_ADRENO", sizeof(pixFormatStr));
433054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
434054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_YCrCb_422_SP:
435054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "YCrCb_422_SP", sizeof(pixFormatStr));
436054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
437054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_R_8:
438054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "R_8", sizeof(pixFormatStr));
439054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
440054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_RG_88:
441054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "RG_88", sizeof(pixFormatStr));
442054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
443054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_INTERLACE:
444054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "INTERLACE", sizeof(pixFormatStr));
445054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
446054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
447054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            strlcpy(pixFormatStr, "YCbCr_420_SP_VENUS", sizeof(pixFormatStr));
448054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
449054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        default:
450054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            size_t len = sizeof(pixFormatStr);
451054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            snprintf(pixFormatStr, len, "Unknown0x%X", format);
452054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
453054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
454054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
455054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
456054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} // namespace qhwc
457054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
458