107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/*
235bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare * Copyright (c) 2012-2014,2016 Linux Foundation. All rights reserved.
307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *
407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Redistribution and use in source and binary forms, with or without
507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * modification, are permitted provided that the following conditions are
607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * met:
707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *   * Redistributions of source code must retain the above copyright
807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *     notice, this list of conditions and the following disclaimer.
907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *   * Redistributions in binary form must reproduce the above
1007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *     copyright notice, this list of conditions and the following
1107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *     disclaimer in the documentation and/or other materials provided
1207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *     with the distribution.
1307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *   * Neither the name of Linux Foundation nor the names of its
1407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *     contributors may be used to endorse or promote products derived
1507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *     from this software without specific prior written permission.
1607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *
1707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
2007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani */
2907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
3007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifndef LOG_TAG
3107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define LOG_TAG "qsfdump"
3207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif
3307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define LOG_NDEBUG 0
3407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <hwc_utils.h>
3507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <hwc_dump_layers.h>
3607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <cutils/log.h>
3707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <sys/stat.h>
3807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <comptype.h>
3907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifdef QTI_BSP
4007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// Ignore W(float)conversion errors for external headers
4107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#pragma GCC diagnostic push
4207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#pragma GCC diagnostic ignored "-Wconversion"
4307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#pragma GCC diagnostic ignored "-Wfloat-conversion"
4407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <SkBitmap.h>
4507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <SkImageEncoder.h>
4607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#pragma GCC diagnostic pop
4707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif
4807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifdef STDC_FORMAT_MACROS
4907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <inttypes.h>
5007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif
5107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
5207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaninamespace qhwc {
5307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
5407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// MAX_ALLOWED_FRAMEDUMPS must be capped to (LONG_MAX - 1)
5507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// 60fps => 216000 frames per hour
5607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// Below setting of 216000 * 24 * 7 => 1 week or 168 hours of capture.
5707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani  enum {
5807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    MAX_ALLOWED_FRAMEDUMPS = (216000 * 24 * 7)
5907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani  };
6007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
6107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool HwcDebug::sDumpEnable = false;
6207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
6307bbf1e89c031a5d41a7561433e832d396c311a5Prashant MalaniHwcDebug::HwcDebug(uint32_t dpy):
6407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani  mDumpCntLimRaw(0),
6507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani  mDumpCntrRaw(1),
6607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani  mDumpCntLimPng(0),
6707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani  mDumpCntrPng(1),
6807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani  mDpy(dpy) {
6907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    char dumpPropStr[PROPERTY_VALUE_MAX];
7007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if(mDpy) {
7107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        strlcpy(mDisplayName, "external", sizeof(mDisplayName));
7207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    } else {
7307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        strlcpy(mDisplayName, "primary", sizeof(mDisplayName));
7407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
7507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    snprintf(mDumpPropKeyDisplayType, sizeof(mDumpPropKeyDisplayType),
7607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani             "debug.sf.dump.%s", (char *)mDisplayName);
7707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
7807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if ((property_get("debug.sf.dump.enable", dumpPropStr, NULL) > 0)) {
7907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        if(!strncmp(dumpPropStr, "true", strlen("true"))) {
8007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            sDumpEnable = true;
8107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        }
8207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
8307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}
8407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
8507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid HwcDebug::dumpLayers(hwc_display_contents_1_t* list)
8607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani{
8707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    // Check need for dumping layers for debugging.
8807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if (UNLIKELY(sDumpEnable) && UNLIKELY(needToDumpLayers()) && LIKELY(list)) {
8907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        logHwcProps(list->flags);
9007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        for (size_t i = 0; i < list->numHwLayers; i++) {
9107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            logLayer(i, list->hwLayers);
9207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            dumpLayer(i, list->hwLayers);
9307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        }
9407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
9507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}
9607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
9707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool HwcDebug::needToDumpLayers()
9807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani{
9907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool bDumpLayer = false;
10007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    char dumpPropStr[PROPERTY_VALUE_MAX];
10107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    // Enable primary dump and disable external dump by default.
10207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool bDumpEnable = !mDpy;
10307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    time_t timeNow;
10407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    tm dumpTime;
10507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
10607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    // Override the bDumpEnable based on the property value, if the property
10707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    // is present in the build.prop file.
10807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if ((property_get(mDumpPropKeyDisplayType, dumpPropStr, NULL) > 0)) {
10907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        if(!strncmp(dumpPropStr, "true", strlen("true")))
11007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            bDumpEnable = true;
11107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        else
11207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            bDumpEnable = false;
11307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
11407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
11507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if (false == bDumpEnable)
11607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        return false;
11707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
11807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    time(&timeNow);
11907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    localtime_r(&timeNow, &dumpTime);
12007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
12107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if ((property_get("debug.sf.dump.png", dumpPropStr, NULL) > 0) &&
12207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            (strncmp(dumpPropStr, mDumpPropStrPng, PROPERTY_VALUE_MAX - 1))) {
12307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        // Strings exist & not equal implies it has changed, so trigger a dump
12407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        strlcpy(mDumpPropStrPng, dumpPropStr, sizeof(mDumpPropStrPng));
12507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        mDumpCntLimPng = atoi(dumpPropStr);
12607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        if (mDumpCntLimPng > MAX_ALLOWED_FRAMEDUMPS) {
12707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            ALOGW("Warning: Using debug.sf.dump.png %d (= max)",
12807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                MAX_ALLOWED_FRAMEDUMPS);
12907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            mDumpCntLimPng = MAX_ALLOWED_FRAMEDUMPS;
13007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        }
13107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        mDumpCntLimPng = (mDumpCntLimPng < 0) ? 0: mDumpCntLimPng;
13207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        if (mDumpCntLimPng) {
13307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            snprintf(mDumpDirPng, sizeof(mDumpDirPng),
13407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                    "/data/sfdump.png.%04d.%02d.%02d.%02d.%02d.%02d",
13507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                    dumpTime.tm_year + 1900, dumpTime.tm_mon + 1,
13607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                    dumpTime.tm_mday, dumpTime.tm_hour,
13707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                    dumpTime.tm_min, dumpTime.tm_sec);
13807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            if (0 == mkdir(mDumpDirPng, 0777))
13907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                mDumpCntrPng = 0;
14007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            else {
14107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                ALOGE("Error: %s. Failed to create sfdump directory: %s",
14207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                    strerror(errno), mDumpDirPng);
14307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                mDumpCntrPng = mDumpCntLimPng + 1;
14407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            }
14507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        }
14607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
14707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
14807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if (mDumpCntrPng <= mDumpCntLimPng)
14907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        mDumpCntrPng++;
15007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
15107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if ((property_get("debug.sf.dump", dumpPropStr, NULL) > 0) &&
15207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            (strncmp(dumpPropStr, mDumpPropStrRaw, PROPERTY_VALUE_MAX - 1))) {
15307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        // Strings exist & not equal implies it has changed, so trigger a dump
15407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        strlcpy(mDumpPropStrRaw, dumpPropStr, sizeof(mDumpPropStrRaw));
15507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        mDumpCntLimRaw = atoi(dumpPropStr);
15607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        if (mDumpCntLimRaw > MAX_ALLOWED_FRAMEDUMPS) {
15707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            ALOGW("Warning: Using debug.sf.dump %d (= max)",
15807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                MAX_ALLOWED_FRAMEDUMPS);
15907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            mDumpCntLimRaw = MAX_ALLOWED_FRAMEDUMPS;
16007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        }
16107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        mDumpCntLimRaw = (mDumpCntLimRaw < 0) ? 0: mDumpCntLimRaw;
16207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        if (mDumpCntLimRaw) {
16307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            snprintf(mDumpDirRaw, sizeof(mDumpDirRaw),
16407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                    "/data/sfdump.raw.%04d.%02d.%02d.%02d.%02d.%02d",
16507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                    dumpTime.tm_year + 1900, dumpTime.tm_mon + 1,
16607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                    dumpTime.tm_mday, dumpTime.tm_hour,
16707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                    dumpTime.tm_min, dumpTime.tm_sec);
16807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            if (0 == mkdir(mDumpDirRaw, 0777))
16907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                mDumpCntrRaw = 0;
17007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            else {
17107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                ALOGE("Error: %s. Failed to create sfdump directory: %s",
17207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                    strerror(errno), mDumpDirRaw);
17307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                mDumpCntrRaw = mDumpCntLimRaw + 1;
17407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            }
17507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        }
17607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
17707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
17807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if (mDumpCntrRaw <= mDumpCntLimRaw)
17907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        mDumpCntrRaw++;
18007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
18107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bDumpLayer = (mDumpCntLimPng || mDumpCntLimRaw)? true : false;
18207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    return bDumpLayer;
18307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}
18407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
18507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid HwcDebug::logHwcProps(uint32_t listFlags)
18607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani{
18707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static int hwcModuleCompType = -1;
18807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static int sMdpCompMaxLayers = 0;
18907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static String8 hwcModuleCompTypeLog("");
19007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if (-1 == hwcModuleCompType) {
19107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        // One time stuff
19207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        char mdpCompPropStr[PROPERTY_VALUE_MAX];
19307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        if (property_get("debug.mdpcomp.maxlayer", mdpCompPropStr, NULL) > 0) {
19407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            sMdpCompMaxLayers = atoi(mdpCompPropStr);
19507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        }
19607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        hwcModuleCompType =
19707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            qdutils::QCCompositionType::getInstance().getCompositionType();
19807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        hwcModuleCompTypeLog.appendFormat("%s%s%s%s%s%s",
19907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            // Is hwc module composition type now a bit-field?!
20007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            (hwcModuleCompType == qdutils::COMPOSITION_TYPE_GPU)?
20107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                "[GPU]": "",
20207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            (hwcModuleCompType & qdutils::COMPOSITION_TYPE_MDP)?
20307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                "[MDP]": "",
20407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            (hwcModuleCompType & qdutils::COMPOSITION_TYPE_C2D)?
20507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                "[C2D]": "",
20607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            (hwcModuleCompType & qdutils::COMPOSITION_TYPE_CPU)?
20707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                "[CPU]": "",
20807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            (hwcModuleCompType & qdutils::COMPOSITION_TYPE_DYN)?
20907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                "[DYN]": "",
21007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            (hwcModuleCompType >= (qdutils::COMPOSITION_TYPE_DYN << 1))?
21107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                "[???]": "");
21207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
21307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    ALOGI("Display[%s] Layer[*] %s-HwcModuleCompType, %d-layer MdpComp %s",
21407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani         mDisplayName, hwcModuleCompTypeLog.string(), sMdpCompMaxLayers,
21507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        (listFlags & HWC_GEOMETRY_CHANGED)? "[HwcList Geometry Changed]": "");
21607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}
21707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
21807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid HwcDebug::logLayer(size_t layerIndex, hwc_layer_1_t hwLayers[])
21907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani{
22007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if (NULL == hwLayers) {
22107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        ALOGE("Display[%s] Layer[%zu] Error. No hwc layers to log.",
22207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            mDisplayName, layerIndex);
22307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        return;
22407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
22507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
22607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    hwc_layer_1_t *layer = &hwLayers[layerIndex];
22707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf);
22807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    hwc_rect_t displayFrame = layer->displayFrame;
22907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    size_t numHwcRects = layer->visibleRegionScreen.numRects;
23007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    hwc_rect_t const *hwcRects = layer->visibleRegionScreen.rects;
23107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    private_handle_t *hnd = (private_handle_t *)layer->handle;
23207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
23307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    char pixFormatStr[32] = "None";
23407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    String8 hwcVisRegsScrLog("[None]");
23507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
23607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    for (size_t i = 0 ; (hwcRects && (i < numHwcRects)); i++) {
23707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        if (0 == i)
23807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            hwcVisRegsScrLog.clear();
23907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        hwcVisRegsScrLog.appendFormat("[%dl, %dt, %dr, %db]",
24007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                        hwcRects[i].left, hwcRects[i].top,
24107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                        hwcRects[i].right, hwcRects[i].bottom);
24207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
24307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
24407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if (hnd)
24535bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare        getHalPixelFormatStr(hnd->format, pixFormatStr, sizeof(pixFormatStr));
24607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
24707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    // Log Line 1
24807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    ALOGI("Display[%s] Layer[%zu] SrcBuff[%dx%d] SrcCrop[%dl, %dt, %dr, %db] "
24907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        "DispFrame[%dl, %dt, %dr, %db] VisRegsScr%s", mDisplayName, layerIndex,
25007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        (hnd)? getWidth(hnd) : -1, (hnd)? getHeight(hnd) : -1,
25107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        sourceCrop.left, sourceCrop.top,
25207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        sourceCrop.right, sourceCrop.bottom,
25307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        displayFrame.left, displayFrame.top,
25407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        displayFrame.right, displayFrame.bottom,
25507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        hwcVisRegsScrLog.string());
25607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    // Log Line 2
25707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    ALOGI("Display[%s] Layer[%zu] LayerCompType = %s, Format = %s, "
25807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        "Orientation = %s, Flags = %s%s%s, Hints = %s%s%s, "
25907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        "Blending = %s%s%s", mDisplayName, layerIndex,
26007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        (layer->compositionType == HWC_FRAMEBUFFER)? "Framebuffer(GPU)":
26107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            (layer->compositionType == HWC_OVERLAY)? "Overlay":
26207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            (layer->compositionType == HWC_BACKGROUND)? "Background":"???",
26307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani         pixFormatStr,
26407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani         (layer->transform == 0)? "ROT_0":
26507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani             (layer->transform == HWC_TRANSFORM_FLIP_H)? "FLIP_H":
26607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani             (layer->transform == HWC_TRANSFORM_FLIP_V)? "FLIP_V":
26707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani             (layer->transform == HWC_TRANSFORM_ROT_90)? "ROT_90":
26807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                        "ROT_INVALID",
26907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani         (layer->flags)? "": "[None]",
27007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani         (layer->flags & HWC_SKIP_LAYER)? "[Skip layer]":"",
27107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani         (layer->flags & qhwc::HWC_MDPCOMP)? "[MDP Comp]":"",
27207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani         (layer->hints)? "":"[None]",
27307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani         (layer->hints & HWC_HINT_TRIPLE_BUFFER)? "[Triple Buffer]":"",
27407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani         (layer->hints & HWC_HINT_CLEAR_FB)? "[Clear FB]":"",
27507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani         (layer->blending == HWC_BLENDING_NONE)? "[None]":"",
27607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani         (layer->blending == HWC_BLENDING_PREMULT)? "[PreMult]":"",
27707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani         (layer->blending == HWC_BLENDING_COVERAGE)? "[Coverage]":"");
27807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}
27907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
28007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid HwcDebug::dumpLayer(size_t layerIndex, hwc_layer_1_t hwLayers[])
28107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani{
28207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    char dumpLogStrPng[128] = "";
28307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    char dumpLogStrRaw[128] = "";
28407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool needDumpPng = (mDumpCntrPng <= mDumpCntLimPng)? true:false;
28507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool needDumpRaw = (mDumpCntrRaw <= mDumpCntLimRaw)? true:false;
28607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
28707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if (needDumpPng) {
28807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        snprintf(dumpLogStrPng, sizeof(dumpLogStrPng),
28907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            "[png-dump-frame: %03d of %03d]", mDumpCntrPng,
29007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            mDumpCntLimPng);
29107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
29207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if (needDumpRaw) {
29307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        snprintf(dumpLogStrRaw, sizeof(dumpLogStrRaw),
29407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            "[raw-dump-frame: %03d of %03d]", mDumpCntrRaw,
29507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            mDumpCntLimRaw);
29607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
29707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
29807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if (!(needDumpPng || needDumpRaw))
29907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        return;
30007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
30107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if (NULL == hwLayers) {
30207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        ALOGE("Display[%s] Layer[%zu] %s%s Error: No hwc layers to dump.",
30307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            mDisplayName, layerIndex, dumpLogStrRaw, dumpLogStrPng);
30407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        return;
30507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
30607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
30707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    hwc_layer_1_t *layer = &hwLayers[layerIndex];
30807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    private_handle_t *hnd = (private_handle_t *)layer->handle;
30907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    char pixFormatStr[32] = "None";
31007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
31107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if (NULL == hnd) {
31207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        ALOGI("Display[%s] Layer[%zu] %s%s Skipping dump: Bufferless layer.",
31307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            mDisplayName, layerIndex, dumpLogStrRaw, dumpLogStrPng);
31407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        return;
31507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
31607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
31735bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare    getHalPixelFormatStr(hnd->format, pixFormatStr, sizeof(pixFormatStr));
31807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifdef QTI_BSP
31907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if (needDumpPng && hnd->base) {
32007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        bool bResult = false;
32107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        char dumpFilename[PATH_MAX];
32207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        SkBitmap *tempSkBmp = new SkBitmap();
32307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        SkColorType tempSkBmpColor = kUnknown_SkColorType;
32407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        snprintf(dumpFilename, sizeof(dumpFilename),
32507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            "%s/sfdump%03d.layer%zu.%s.png", mDumpDirPng,
32607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            mDumpCntrPng, layerIndex, mDisplayName);
32707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
32807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        switch (hnd->format) {
32907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            case HAL_PIXEL_FORMAT_RGBA_8888:
33007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            case HAL_PIXEL_FORMAT_RGBX_8888:
33107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                tempSkBmpColor = kRGBA_8888_SkColorType;
33207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                break;
33307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            case HAL_PIXEL_FORMAT_BGRA_8888:
33407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                tempSkBmpColor = kBGRA_8888_SkColorType;
33507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                break;
33607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            case HAL_PIXEL_FORMAT_RGB_565:
33707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                tempSkBmpColor = kRGB_565_SkColorType;
33807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                break;
33907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            case HAL_PIXEL_FORMAT_RGB_888:
34007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            default:
34107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                tempSkBmpColor = kUnknown_SkColorType;
34207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                break;
34307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        }
34407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        if (kUnknown_SkColorType != tempSkBmpColor) {
34507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            tempSkBmp->setInfo(SkImageInfo::Make(getWidth(hnd), getHeight(hnd),
34607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                    tempSkBmpColor, kUnknown_SkAlphaType), 0);
34707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            tempSkBmp->setPixels((void*)hnd->base);
34807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            bResult = SkImageEncoder::EncodeFile(dumpFilename,
34907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                    *tempSkBmp, SkImageEncoder::kPNG_Type, 100);
35007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            ALOGI("Display[%s] Layer[%zu] %s Dump to %s: %s",
35107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                mDisplayName, layerIndex, dumpLogStrPng,
35207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                dumpFilename, bResult ? "Success" : "Fail");
35307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        } else {
35407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            ALOGI("Display[%s] Layer[%zu] %s Skipping dump: Unsupported layer"
35507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                " format %s for png encoder",
35607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                mDisplayName, layerIndex, dumpLogStrPng, pixFormatStr);
35707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        }
35807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        delete tempSkBmp; // Calls SkBitmap::freePixels() internally.
35907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
36007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif
36107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if (needDumpRaw && hnd->base) {
36207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        char dumpFilename[PATH_MAX];
36307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        bool bResult = false;
36407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        snprintf(dumpFilename, sizeof(dumpFilename),
36507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            "%s/sfdump%03d.layer%zu.%dx%d.%s.%s.raw",
36607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            mDumpDirRaw, mDumpCntrRaw,
36707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            layerIndex, getWidth(hnd), getHeight(hnd),
36807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            pixFormatStr, mDisplayName);
36907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        FILE* fp = fopen(dumpFilename, "w+");
37007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        if (NULL != fp) {
37107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            bResult = (bool) fwrite((void*)hnd->base, hnd->size, 1, fp);
37207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            fclose(fp);
37307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        }
37407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        ALOGI("Display[%s] Layer[%zu] %s Dump to %s: %s",
37507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            mDisplayName, layerIndex, dumpLogStrRaw,
37607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            dumpFilename, bResult ? "Success" : "Fail");
37707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
37807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}
37907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
38035bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayarevoid HwcDebug::getHalPixelFormatStr(int format, char pixFormatStr[], size_t arraySize)
38107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani{
38207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if (!pixFormatStr)
38307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        return;
38407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
38507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    switch(format) {
38607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_RGBA_8888:
38735bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            strlcpy(pixFormatStr, "RGBA_8888", arraySize);
38807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
38907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_RGBX_8888:
39035bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            strlcpy(pixFormatStr, "RGBX_8888", arraySize);
39107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
39207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_RGB_888:
39335bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            strlcpy(pixFormatStr, "RGB_888", arraySize);
39407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
39507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_RGB_565:
39635bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            strlcpy(pixFormatStr, "RGB_565", arraySize);
39707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
39807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_BGRA_8888:
39935bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            strlcpy(pixFormatStr, "BGRA_8888", arraySize);
40007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
40107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_YV12:
40235bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            strlcpy(pixFormatStr, "YV12", arraySize);
40307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
40407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_YCbCr_422_SP:
40535bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            strlcpy(pixFormatStr, "YCbCr_422_SP_NV16", arraySize);
40607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
40707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
40835bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            strlcpy(pixFormatStr, "YCrCb_420_SP_NV21", arraySize);
40907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
41007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_YCbCr_422_I:
41135bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            strlcpy(pixFormatStr, "YCbCr_422_I_YUY2", arraySize);
41207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
41307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_YCrCb_422_I:
41435bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            strlcpy(pixFormatStr, "YCrCb_422_I_YVYU", arraySize);
41507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
41607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
41735bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            strlcpy(pixFormatStr, "NV12_ENCODEABLE", arraySize);
41807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
41907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
42007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            strlcpy(pixFormatStr, "YCbCr_420_SP_TILED_TILE_4x2",
42135bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare                   arraySize);
42207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
42307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_YCbCr_420_SP:
42435bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            strlcpy(pixFormatStr, "YCbCr_420_SP", arraySize);
42507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
42607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO:
42735bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            strlcpy(pixFormatStr, "YCrCb_420_SP_ADRENO", arraySize);
42807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
42907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_YCrCb_422_SP:
43035bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            strlcpy(pixFormatStr, "YCrCb_422_SP", arraySize);
43107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
43207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_R_8:
43335bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            strlcpy(pixFormatStr, "R_8", arraySize);
43407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
43507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_RG_88:
43635bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            strlcpy(pixFormatStr, "RG_88", arraySize);
43707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
43807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_INTERLACE:
43935bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            strlcpy(pixFormatStr, "INTERLACE", arraySize);
44007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
44107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
44235bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            strlcpy(pixFormatStr, "YCbCr_420_SP_VENUS", arraySize);
44307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
44407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        default:
44535bc51c90d4db20eeae2c2e807f5e045328cb8c2Sachin Bhayare            snprintf(pixFormatStr, arraySize, "Unknown0x%X", format);
44607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            break;
44707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
44807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}
44907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
45007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} // namespace qhwc
45107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
452