// ---------------------------------------------------------------------------- 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); } }
// ----------------------------------------------------------------------------- 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; }