diff options
Diffstat (limited to 'libs/hwui/DisplayListRenderer.cpp')
| -rw-r--r-- | libs/hwui/DisplayListRenderer.cpp | 382 |
1 files changed, 323 insertions, 59 deletions
diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp index 8153823..9f2bacd 100644 --- a/libs/hwui/DisplayListRenderer.cpp +++ b/libs/hwui/DisplayListRenderer.cpp @@ -16,17 +16,17 @@ #define LOG_TAG "OpenGLRenderer" +#include <SkCamera.h> + +#include <private/hwui/DrawGlInfo.h> #include "DisplayListLogBuffer.h" #include "DisplayListRenderer.h" #include "Caches.h" -#include <utils/String8.h> - namespace android { namespace uirenderer { - /////////////////////////////////////////////////////////////////////////////// // Display list /////////////////////////////////////////////////////////////////////////////// @@ -93,7 +93,10 @@ void DisplayList::outputLogBuffer(int fd) { fflush(file); } -DisplayList::DisplayList(const DisplayListRenderer& recorder) { +DisplayList::DisplayList(const DisplayListRenderer& recorder) : + mTransformMatrix(NULL), mTransformCamera(NULL), mTransformMatrix3D(NULL), + mStaticMatrix(NULL), mAnimationMatrix(NULL) { + initFromDisplayListRenderer(recorder); } @@ -101,9 +104,58 @@ DisplayList::~DisplayList() { clearResources(); } +void DisplayList::initProperties() { + mLeft = 0; + mTop = 0; + mRight = 0; + mBottom = 0; + mClipChildren = true; + mAlpha = 1; + mMultipliedAlpha = 255; + mHasOverlappingRendering = true; + mTranslationX = 0; + mTranslationY = 0; + mRotation = 0; + mRotationX = 0; + mRotationY= 0; + mScaleX = 1; + mScaleY = 1; + mPivotX = 0; + mPivotY = 0; + mCameraDistance = 0; + mMatrixDirty = false; + mMatrixFlags = 0; + mPrevWidth = -1; + mPrevHeight = -1; + mWidth = 0; + mHeight = 0; + mPivotExplicitlySet = false; + mCaching = false; +} + +void DisplayList::destroyDisplayListDeferred(DisplayList* displayList) { + if (displayList) { + DISPLAY_LIST_LOGD("Deferring display list destruction"); + Caches::getInstance().deleteDisplayListDeferred(displayList); + } +} + void DisplayList::clearResources() { sk_free((void*) mReader.base()); + if (USE_DISPLAY_LIST_PROPERTIES) { + delete mTransformMatrix; + delete mTransformCamera; + delete mTransformMatrix3D; + delete mStaticMatrix; + delete mAnimationMatrix; + mTransformMatrix = NULL; + mTransformCamera = NULL; + mTransformMatrix3D = NULL; + mStaticMatrix = NULL; + mAnimationMatrix = NULL; + } + Caches& caches = Caches::getInstance(); for (size_t i = 0; i < mBitmapResources.size(); i++) { @@ -152,6 +204,7 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde // re-using display list - clear out previous allocations clearResources(); } + initProperties(); mSize = writer.size(); void* buffer = sk_malloc_throw(mSize); @@ -223,6 +276,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { int saveCount = renderer.getSaveCount() - 1; + outputViewProperties(renderer, (char*) indent); mReader.rewind(); while (!mReader.eof()) { @@ -231,7 +285,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { int skip = mReader.readInt(); ALOGD("%sSkip %d", (char*) indent, skip); op &= ~OP_MAY_BE_SKIPPED_MASK; - } + } switch (op) { case DrawGLFunction: { @@ -261,7 +315,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { SkPaint* paint = getPaint(renderer); int flags = getInt(); ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent, - OP_NAMES[op], f1, f2, f3, f4, paint, flags); + OP_NAMES[op], f1, f2, f3, f4, paint, flags); } break; case SaveLayerAlpha: { @@ -272,7 +326,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { int alpha = getInt(); int flags = getInt(); ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent, - OP_NAMES[op], f1, f2, f3, f4, alpha, flags); + OP_NAMES[op], f1, f2, f3, f4, alpha, flags); } break; case Translate: { @@ -305,7 +359,10 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { break; case ConcatMatrix: { SkMatrix* matrix = getMatrix(); - ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix); + ALOGD("%s%s new concat %p: [%f, %f, %f] [%f, %f, %f] [%f, %f, %f]", + (char*) indent, OP_NAMES[op], matrix, matrix->get(0), matrix->get(1), + matrix->get(2), matrix->get(3), matrix->get(4), matrix->get(5), + matrix->get(6), matrix->get(7), matrix->get(8)); } break; case ClipRect: { @@ -315,7 +372,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { float f4 = getFloat(); int regionOp = getInt(); ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op], - f1, f2, f3, f4, regionOp); + f1, f2, f3, f4, regionOp); } break; case DrawDisplayList: { @@ -324,7 +381,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { uint32_t height = getUInt(); int32_t flags = getInt(); ALOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op], - displayList, width, height, flags, level + 1); + displayList, width, height, flags, level + 1); renderer.outputDisplayList(displayList, level + 1); } break; @@ -334,7 +391,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { float y = getFloat(); SkPaint* paint = getPaint(renderer); ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], - layer, x, y, paint); + layer, x, y, paint); } break; case DrawBitmap: { @@ -343,7 +400,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { float y = getFloat(); SkPaint* paint = getPaint(renderer); ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], - bitmap, x, y, paint); + bitmap, x, y, paint); } break; case DrawBitmapMatrix: { @@ -351,7 +408,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { SkMatrix* matrix = getMatrix(); SkPaint* paint = getPaint(renderer); ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op], - bitmap, matrix, paint); + bitmap, matrix, paint); } break; case DrawBitmapRect: { @@ -366,7 +423,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { float f8 = getFloat(); SkPaint* paint = getPaint(renderer); ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", - (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint); + (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint); } break; case DrawBitmapMesh: { @@ -415,7 +472,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { float f4 = getFloat(); SkPaint* paint = getPaint(renderer); ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], - f1, f2, f3, f4, paint); + f1, f2, f3, f4, paint); } break; case DrawRoundRect: { @@ -427,7 +484,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { float f6 = getFloat(); SkPaint* paint = getPaint(renderer); ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", - (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint); + (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint); } break; case DrawCircle: { @@ -436,7 +493,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { float f3 = getFloat(); SkPaint* paint = getPaint(renderer); ALOGD("%s%s %.2f, %.2f, %.2f, %p", - (char*) indent, OP_NAMES[op], f1, f2, f3, paint); + (char*) indent, OP_NAMES[op], f1, f2, f3, paint); } break; case DrawOval: { @@ -446,7 +503,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { float f4 = getFloat(); SkPaint* paint = getPaint(renderer); ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", - (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint); + (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint); } break; case DrawArc: { @@ -459,7 +516,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { int i1 = getInt(); SkPaint* paint = getPaint(renderer); ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p", - (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint); + (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint); } break; case DrawPath: { @@ -490,7 +547,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { SkPaint* paint = getPaint(renderer); float length = getFloat(); ALOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, OP_NAMES[op], - text.text(), text.length(), count, x, y, paint, length); + text.text(), text.length(), count, x, y, paint, length); } break; case DrawTextOnPath: { @@ -511,7 +568,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { float* positions = getFloats(positionsCount); SkPaint* paint = getPaint(renderer); ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], - text.text(), text.length(), count, paint); + text.text(), text.length(), count, paint); } case ResetShader: { ALOGD("%s%s", (char*) indent, OP_NAMES[op]); @@ -541,7 +598,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { float dy = getFloat(); int color = getInt(); ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op], - radius, dx, dy, color); + radius, dx, dy, color); } break; case ResetPaintFilter: { @@ -556,12 +613,191 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { break; default: ALOGD("Display List error: op not handled: %s%s", - (char*) indent, OP_NAMES[op]); + (char*) indent, OP_NAMES[op]); break; } } + ALOGD("%sDone (%p, %s)", (char*) indent + 2, this, mName.string()); +} + +void DisplayList::updateMatrix() { + if (mMatrixDirty) { + if (!mTransformMatrix) { + mTransformMatrix = new SkMatrix(); + } + if (mMatrixFlags == 0 || mMatrixFlags == TRANSLATION) { + mTransformMatrix->reset(); + } else { + if (!mPivotExplicitlySet) { + if (mWidth != mPrevWidth || mHeight != mPrevHeight) { + mPrevWidth = mWidth; + mPrevHeight = mHeight; + mPivotX = mPrevWidth / 2; + mPivotY = mPrevHeight / 2; + } + } + if ((mMatrixFlags & ROTATION_3D) == 0) { + mTransformMatrix->setTranslate(mTranslationX, mTranslationY); + mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY); + mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY); + } else { + if (!mTransformCamera) { + mTransformCamera = new Sk3DView(); + mTransformMatrix3D = new SkMatrix(); + } + mTransformMatrix->reset(); + mTransformCamera->save(); + mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY); + mTransformCamera->rotateX(mRotationX); + mTransformCamera->rotateY(mRotationY); + mTransformCamera->rotateZ(-mRotation); + mTransformCamera->getMatrix(mTransformMatrix3D); + mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY); + mTransformMatrix3D->postTranslate(mPivotX + mTranslationX, + mPivotY + mTranslationY); + mTransformMatrix->postConcat(*mTransformMatrix3D); + mTransformCamera->restore(); + } + } + mMatrixDirty = false; + } +} + +void DisplayList::outputViewProperties(OpenGLRenderer& renderer, char* indent) { + if (USE_DISPLAY_LIST_PROPERTIES) { + updateMatrix(); + if (mLeft != 0 || mTop != 0) { + ALOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop); + } + if (mStaticMatrix) { + ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", + indent, "ConcatMatrix (static)", mStaticMatrix, + mStaticMatrix->get(0), mStaticMatrix->get(1), + mStaticMatrix->get(2), mStaticMatrix->get(3), + mStaticMatrix->get(4), mStaticMatrix->get(5), + mStaticMatrix->get(6), mStaticMatrix->get(7), + mStaticMatrix->get(8)); + } + if (mAnimationMatrix) { + ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", + indent, "ConcatMatrix (animation)", mAnimationMatrix, + mAnimationMatrix->get(0), mAnimationMatrix->get(1), + mAnimationMatrix->get(2), mAnimationMatrix->get(3), + mAnimationMatrix->get(4), mAnimationMatrix->get(5), + mAnimationMatrix->get(6), mAnimationMatrix->get(7), + mAnimationMatrix->get(8)); + } + if (mMatrixFlags != 0) { + if (mMatrixFlags == TRANSLATION) { + ALOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY); + } else { + ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", + indent, "ConcatMatrix", mTransformMatrix, + mTransformMatrix->get(0), mTransformMatrix->get(1), + mTransformMatrix->get(2), mTransformMatrix->get(3), + mTransformMatrix->get(4), mTransformMatrix->get(5), + mTransformMatrix->get(6), mTransformMatrix->get(7), + mTransformMatrix->get(8)); + } + } + if (mAlpha < 1 && !mCaching) { + // TODO: should be able to store the size of a DL at record time and not + // have to pass it into this call. In fact, this information might be in the + // location/size info that we store with the new native transform data. + int flags = SkCanvas::kHasAlphaLayer_SaveFlag; + if (mClipChildren) { + flags |= SkCanvas::kClipToLayer_SaveFlag; + } + ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha", + (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop, + mMultipliedAlpha, flags); + } + if (mClipChildren) { + ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f, + (float) mRight - mLeft, (float) mBottom - mTop); + } + } +} - ALOGD("%sDone", (char*) indent + 2); +void DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t width, uint32_t height, + uint32_t level) { + if (USE_DISPLAY_LIST_PROPERTIES) { +#if DEBUG_DISPLAY_LIST + uint32_t count = (level + 1) * 2; + char indent[count + 1]; + for (uint32_t i = 0; i < count; i++) { + indent[i] = ' '; + } + indent[count] = '\0'; +#endif + updateMatrix(); + if (mLeft != 0 || mTop != 0) { + DISPLAY_LIST_LOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop); + renderer.translate(mLeft, mTop); + } + if (mStaticMatrix) { + DISPLAY_LIST_LOGD( + "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", + indent, "ConcatMatrix (static)", mStaticMatrix, + mStaticMatrix->get(0), mStaticMatrix->get(1), + mStaticMatrix->get(2), mStaticMatrix->get(3), + mStaticMatrix->get(4), mStaticMatrix->get(5), + mStaticMatrix->get(6), mStaticMatrix->get(7), + mStaticMatrix->get(8)); + renderer.concatMatrix(mStaticMatrix); + } else if (mAnimationMatrix) { + DISPLAY_LIST_LOGD( + "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", + indent, "ConcatMatrix (animation)", mAnimationMatrix, + mAnimationMatrix->get(0), mAnimationMatrix->get(1), + mAnimationMatrix->get(2), mAnimationMatrix->get(3), + mAnimationMatrix->get(4), mAnimationMatrix->get(5), + mAnimationMatrix->get(6), mAnimationMatrix->get(7), + mAnimationMatrix->get(8)); + renderer.concatMatrix(mAnimationMatrix); + } + if (mMatrixFlags != 0) { + if (mMatrixFlags == TRANSLATION) { + DISPLAY_LIST_LOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY); + renderer.translate(mTranslationX, mTranslationY); + } else { + DISPLAY_LIST_LOGD( + "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", + indent, "ConcatMatrix", mTransformMatrix, + mTransformMatrix->get(0), mTransformMatrix->get(1), + mTransformMatrix->get(2), mTransformMatrix->get(3), + mTransformMatrix->get(4), mTransformMatrix->get(5), + mTransformMatrix->get(6), mTransformMatrix->get(7), + mTransformMatrix->get(8)); + renderer.concatMatrix(mTransformMatrix); + } + } + if (mAlpha < 1 && !mCaching) { + if (!mHasOverlappingRendering) { + DISPLAY_LIST_LOGD("%s%s %.2f", indent, "SetAlpha", mAlpha); + renderer.setAlpha(mAlpha); + } else { + // TODO: should be able to store the size of a DL at record time and not + // have to pass it into this call. In fact, this information might be in the + // location/size info that we store with the new native transform data. + int flags = SkCanvas::kHasAlphaLayer_SaveFlag; + if (mClipChildren) { + flags |= SkCanvas::kClipToLayer_SaveFlag; + } + DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha", + (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop, + mMultipliedAlpha, flags); + renderer.saveLayerAlpha(0, 0, mRight - mLeft, mBottom - mTop, + mMultipliedAlpha, flags); + } + } + if (mClipChildren) { + DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f, + (float) mRight - mLeft, (float) mBottom - mTop); + renderer.clipRect(0, 0, mRight - mLeft, mBottom - mTop, + SkRegion::kIntersect_Op); + } + } } /** @@ -569,8 +805,9 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { * in the output() function, since that function processes the same list of opcodes for the * purposes of logging display list info for a given view. */ -bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level) { - bool needsInvalidate = false; +status_t DisplayList::replay(OpenGLRenderer& renderer, uint32_t width, + uint32_t height, Rect& dirty, int32_t flags, uint32_t level) { + status_t drawGlStatus = 0; TextContainer text; mReader.rewind(); @@ -585,13 +822,26 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u #endif renderer.startMark(mName.string()); + int restoreTo = 0; + if (USE_DISPLAY_LIST_PROPERTIES) { + DISPLAY_LIST_LOGD("%s%s %d", indent, "Save", + SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + } + setViewProperties(renderer, width, height, level); + if (USE_DISPLAY_LIST_PROPERTIES && renderer.quickReject(0, 0, width, height)) { + DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo); + renderer.restoreToCount(restoreTo); + renderer.endMark(); + return false; + } DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance(); int saveCount = renderer.getSaveCount() - 1; while (!mReader.eof()) { int op = mReader.readInt(); if (op & OP_MAY_BE_SKIPPED_MASK) { - int32_t skip = mReader.readInt() * 4; + int32_t skip = mReader.readInt(); if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) { mReader.skip(skip); DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent, @@ -599,7 +849,6 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u continue; } else { op &= ~OP_MAY_BE_SKIPPED_MASK; - ALOGD("%s", OP_NAMES[op]); } } logBuffer.writeCommand(level, op); @@ -609,7 +858,7 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u Functor *functor = (Functor *) getInt(); DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor); renderer.startMark("GL functor"); - needsInvalidate |= renderer.callDrawGLFunction(functor, dirty); + drawGlStatus |= renderer.callDrawGLFunction(functor, dirty); renderer.endMark(); } break; @@ -638,7 +887,7 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u SkPaint* paint = getPaint(renderer); int32_t flags = getInt(); DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent, - OP_NAMES[op], f1, f2, f3, f4, paint, flags); + OP_NAMES[op], f1, f2, f3, f4, paint, flags); renderer.saveLayer(f1, f2, f3, f4, paint, flags); } break; @@ -650,7 +899,7 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u int32_t alpha = getInt(); int32_t flags = getInt(); DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent, - OP_NAMES[op], f1, f2, f3, f4, alpha, flags); + OP_NAMES[op], f1, f2, f3, f4, alpha, flags); renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags); } break; @@ -689,7 +938,12 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u break; case ConcatMatrix: { SkMatrix* matrix = getMatrix(); - DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix); + DISPLAY_LIST_LOGD( + "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", + (char*) indent, OP_NAMES[op], matrix, + matrix->get(0), matrix->get(1), matrix->get(2), + matrix->get(3), matrix->get(4), matrix->get(5), + matrix->get(6), matrix->get(7), matrix->get(8)); renderer.concatMatrix(matrix); } break; @@ -700,7 +954,7 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u float f4 = getFloat(); int32_t regionOp = getInt(); DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op], - f1, f2, f3, f4, regionOp); + f1, f2, f3, f4, regionOp); renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp); } break; @@ -710,9 +964,9 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u uint32_t height = getUInt(); int32_t flags = getInt(); DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op], - displayList, width, height, flags, level + 1); - needsInvalidate |= renderer.drawDisplayList(displayList, width, height, - dirty, flags, level + 1); + displayList, width, height, flags, level + 1); + drawGlStatus |= renderer.drawDisplayList(displayList, width, + height, dirty, flags, level + 1); } break; case DrawLayer: { @@ -720,8 +974,11 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u float x = getFloat(); float y = getFloat(); SkPaint* paint = getPaint(renderer); + if (mCaching && mMultipliedAlpha < 255) { + paint->setAlpha(mMultipliedAlpha); + } DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], - layer, x, y, paint); + layer, x, y, paint); renderer.drawLayer(layer, x, y, paint); } break; @@ -730,8 +987,11 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u float x = getFloat(); float y = getFloat(); SkPaint* paint = getPaint(renderer); + if (mCaching && mMultipliedAlpha < 255) { + paint->setAlpha(mMultipliedAlpha); + } DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], - bitmap, x, y, paint); + bitmap, x, y, paint); renderer.drawBitmap(bitmap, x, y, paint); } break; @@ -740,7 +1000,7 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u SkMatrix* matrix = getMatrix(); SkPaint* paint = getPaint(renderer); DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op], - bitmap, matrix, paint); + bitmap, matrix, paint); renderer.drawBitmap(bitmap, matrix, paint); } break; @@ -756,7 +1016,8 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u float f8 = getFloat(); SkPaint* paint = getPaint(renderer); DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", - (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint); + (char*) indent, OP_NAMES[op], bitmap, + f1, f2, f3, f4, f5, f6, f7, f8,paint); renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint); } break; @@ -815,7 +1076,7 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u float f4 = getFloat(); SkPaint* paint = getPaint(renderer); DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], - f1, f2, f3, f4, paint); + f1, f2, f3, f4, paint); renderer.drawRect(f1, f2, f3, f4, paint); } break; @@ -828,7 +1089,7 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u float f6 = getFloat(); SkPaint* paint = getPaint(renderer); DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", - (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint); + (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint); renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint); } break; @@ -838,7 +1099,7 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u float f3 = getFloat(); SkPaint* paint = getPaint(renderer); DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p", - (char*) indent, OP_NAMES[op], f1, f2, f3, paint); + (char*) indent, OP_NAMES[op], f1, f2, f3, paint); renderer.drawCircle(f1, f2, f3, paint); } break; @@ -849,7 +1110,7 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u float f4 = getFloat(); SkPaint* paint = getPaint(renderer); DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", - (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint); + (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint); renderer.drawOval(f1, f2, f3, f4, paint); } break; @@ -863,7 +1124,7 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u int32_t i1 = getInt(); SkPaint* paint = getPaint(renderer); DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p", - (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint); + (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint); renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint); } break; @@ -959,7 +1220,7 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u float dy = getFloat(); int32_t color = getInt(); DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op], - radius, dx, dy, color); + radius, dx, dy, color); renderer.setupShadow(radius, dx, dy, color); } break; @@ -978,22 +1239,27 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u break; default: DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s", - (char*) indent, OP_NAMES[op]); + (char*) indent, OP_NAMES[op]); break; } } + if (USE_DISPLAY_LIST_PROPERTIES) { + DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo); + renderer.restoreToCount(restoreTo); + } renderer.endMark(); - DISPLAY_LIST_LOGD("%sDone, returning %d", (char*) indent + 2, needsInvalidate); - return needsInvalidate; + DISPLAY_LIST_LOGD("%sDone (%p, %s), returning %d", (char*) indent + 2, this, mName.string(), + drawGlStatus); + return drawGlStatus; } /////////////////////////////////////////////////////////////////////////////// // Base structure /////////////////////////////////////////////////////////////////////////////// -DisplayListRenderer::DisplayListRenderer(): mWriter(MIN_WRITER_SIZE), +DisplayListRenderer::DisplayListRenderer() : mWriter(MIN_WRITER_SIZE), mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false) { } @@ -1065,7 +1331,6 @@ void DisplayListRenderer::prepareDirty(float left, float top, void DisplayListRenderer::finish() { insertRestoreToCount(); insertTranlate(); - OpenGLRenderer::finish(); } void DisplayListRenderer::interrupt() { @@ -1074,11 +1339,11 @@ void DisplayListRenderer::interrupt() { void DisplayListRenderer::resume() { } -bool DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) { +status_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) { // Ignore dirty during recording, it matters only when we replay addOp(DisplayList::DrawGLFunction); addInt((int) functor); - return false; // No invalidate needed at record-time + return DrawGlInfo::kStatusDone; // No invalidate needed at record-time } int DisplayListRenderer::save(int flags) { @@ -1168,17 +1433,16 @@ bool DisplayListRenderer::clipRect(float left, float top, float right, float bot return OpenGLRenderer::clipRect(left, top, right, bottom, op); } -bool DisplayListRenderer::drawDisplayList(DisplayList* displayList, +status_t DisplayListRenderer::drawDisplayList(DisplayList* displayList, uint32_t width, uint32_t height, Rect& dirty, int32_t flags, uint32_t level) { // dirty is an out parameter and should not be recorded, // it matters only when replaying the display list - const bool reject = quickReject(0.0f, 0.0f, width, height); - uint32_t* location = addOp(DisplayList::DrawDisplayList, reject); + + addOp(DisplayList::DrawDisplayList); addDisplayList(displayList); addSize(width, height); addInt(flags); - addSkip(location); - return false; + return DrawGlInfo::kStatusDone; } void DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) { @@ -1269,7 +1533,7 @@ void DisplayListRenderer::drawRect(float left, float top, float right, float bot } void DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom, - float rx, float ry, SkPaint* paint) { + float rx, float ry, SkPaint* paint) { const bool reject = paint->getStyle() == SkPaint::kFill_Style && quickReject(left, top, right, bottom); uint32_t* location = addOp(DisplayList::DrawRoundRect, reject); |
