// ----------------------------------------------------------------------------
void BackupBufDumper::dump(String8 &result, const char* prefix) {
    // dump status to log buffer first
    result.appendFormat("%s*BackupBufDumper mRingBuffer(size=%u, count=%u)\n",
        prefix, mRingBuffer.getSize(), mRingBuffer.getCount());

    for (size_t i = 0; i < mRingBuffer.getValidSize(); i++) {
        const sp<BackupBuffer>& buffer = getItem(i);
        result.appendFormat("%s [%02u] handle(source=%p, backup=%p)\n",
            prefix, i, buffer->mSourceHandle, buffer->mGraphicBuffer->handle);
    }

    // start buffer dump check and process
    String8 name;
    String8 name_prefix;

    BufferQueueDump::getDumpFileName(name, mName);

    for (size_t i = 0; i < mRingBuffer.getValidSize(); i++) {
        const sp<BackupBuffer>& buffer = getItem(i);
        name_prefix = String8::format("[%s](Backup%02u_H%p_ts%" PRId64 ")",
                                      name.string(), i, buffer->mSourceHandle, ns2ms(buffer->mTimeStamp));
        getGraphicBufferUtil().dump(buffer->mGraphicBuffer, name_prefix.string(), DUMP_FILE_PATH);

        BQD_LOGI("[dump] Backup:%02u, handle(source=%p, backup=%p)",
            i, buffer->mSourceHandle, buffer->mGraphicBuffer->handle);
    }
}
Exemple #2
0
// -----------------------------------------------------------------------------
status_t drawDebugLineToGraphicBuffer(
        const sp<GraphicBuffer>& gb, uint32_t cnt, uint8_t val = 0xff) {
#ifndef MTK_EMULATOR_SUPPORT
    const uint32_t DEFAULT_LINE_W = 4;
    const uint32_t DEFAULT_LINE_H = 4;
    if (gb == NULL) {
        return INVALID_OPERATION;
    }

    int line_number_w = DEFAULT_LINE_W;
    int line_number_h = DEFAULT_LINE_H;
    int line_w = DEFAULT_LINE_W;
    int line_h = DEFAULT_LINE_H;

    char value[PROPERTY_VALUE_MAX];
    property_get("debug.bq.line_p", value, "-1");
    int line_pos = atoi(value);
    if (line_pos >= 0)
        cnt = line_pos;

    property_get("debug.bq.line_g", value, "-1");
    sscanf(value, "%d:%d", &line_w, &line_h);
    if (line_w > 0)
        line_number_w = line_w;
    if (line_h > 0)
        line_number_h = line_h;

    property_get("debug.bq.line_c", value, "-1");
    int8_t line_c = atoi(value);
    if (line_c >= 0)
        val = line_c;

    getGraphicBufferUtil().drawLine(gb, val, line_number_w, line_number_h, cnt);
#endif
    return NO_ERROR;
}
// ----------------------------------------------------------------------------
void DumpBuffer::dump(const String8& prefix) {
    if (mFence != NULL) {
        mFence->waitForever(__func__);
    }
    getGraphicBufferUtil().dump(mGraphicBuffer, prefix.string(), DUMP_FILE_PATH);
}
// ----------------------------------------------------------------------------
bool BackupBufPusher::push(const sp<BackupBuffer>& in) {
    if ((in == NULL) || (in->mGraphicBuffer == NULL)) {
        return false;
    }

    sp<BackupBuffer>& buffer = editHead();

    // check property of GraphicBuffer, realloc if needed
    bool needCreate = false;
    if ((buffer == NULL) || (buffer->mGraphicBuffer == NULL)) {
        needCreate = true;
    } else {
        if ((buffer->mGraphicBuffer->width != in->mGraphicBuffer->width) ||
            (buffer->mGraphicBuffer->height != in->mGraphicBuffer->height) ||
            (buffer->mGraphicBuffer->format != in->mGraphicBuffer->format)) {
            needCreate = true;
            XLOGD("[%s] geometry changed, backup=(%d, %d, %d) => active=(%d, %d, %d)",
                __func__, buffer->mGraphicBuffer->width, buffer->mGraphicBuffer->height,
                buffer->mGraphicBuffer->format, in->mGraphicBuffer->width,
                in->mGraphicBuffer->height, in->mGraphicBuffer->format);
        }
    }

    if (needCreate) {
        sp<GraphicBuffer> newGraphicBuffer = new GraphicBuffer(
                                             in->mGraphicBuffer->width, in->mGraphicBuffer->height,
                                             in->mGraphicBuffer->format, in->mGraphicBuffer->usage);
        if (newGraphicBuffer == NULL) {
            XLOGE("[%s] alloc GraphicBuffer failed", __func__);
            return false;
        }

        if (buffer == NULL) {
            buffer = new BackupBuffer();
            if (buffer == NULL) {
                XLOGE("[%s] alloc BackupBuffer failed", __func__);
                return false;
            }
        }

        buffer->mGraphicBuffer = newGraphicBuffer;
    }

    int width = in->mGraphicBuffer->width;
    int height = in->mGraphicBuffer->height;
    int format = in->mGraphicBuffer->format;
    int usage = in->mGraphicBuffer->usage;
    int stride = in->mGraphicBuffer->stride;

    uint32_t bits = getGraphicBufferUtil().getBitsPerPixel(format);
    status_t err;

    // backup
    void *src;
    void *dst;
    err = in->mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, &src);
    if (err != NO_ERROR) {
        XLOGE("[%s] lock GraphicBuffer failed", __func__);
        return false;
    }

    err = buffer->mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN | GraphicBuffer::USAGE_SW_WRITE_OFTEN, &dst);
    if (err != NO_ERROR) {
        in->mGraphicBuffer->unlock();
        XLOGE("[%s] lock backup buffer failed", __func__);
        return false;
    }

    memcpy(dst, src, (stride * height * bits) >> 3);

    buffer->mGraphicBuffer->unlock();
    in->mGraphicBuffer->unlock();

    // update timestamp
    buffer->mTimeStamp = in->mTimeStamp;
    buffer->mSourceHandle = in->mGraphicBuffer->handle;

    return true;
}