diff options
author | 2015-08-20 02:25:30 +0000 | |
---|---|---|
committer | 2015-08-20 02:25:30 +0000 | |
commit | 3b1c32eb5d96c9a13e101cc7207f27d045c6bd8b (patch) | |
tree | d4441f35ea4bdb5bfe68727a529601255e613400 | |
parent | 36d4aaeb6edddc995620c491e8a2d61a0a700c59 (diff) | |
parent | d35dcb13115ca1dd8c07e397f43a186cd7fd1a01 (diff) |
Merge "Revert "Simplify TextureView draw path""
-rw-r--r-- | core/java/android/view/DisplayListCanvas.java | 15 | ||||
-rw-r--r-- | core/java/android/view/HardwareLayer.java | 4 | ||||
-rw-r--r-- | core/java/android/view/TextureView.java | 28 | ||||
-rw-r--r-- | core/java/android/view/View.java | 15 | ||||
-rw-r--r-- | core/jni/android_view_DisplayListCanvas.cpp | 6 | ||||
-rw-r--r-- | core/jni/android_view_HardwareLayer.cpp | 8 | ||||
-rw-r--r-- | libs/hwui/DisplayListCanvas.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/DisplayListCanvas.h | 2 | ||||
-rw-r--r-- | libs/hwui/DisplayListOp.h | 8 | ||||
-rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 8 | ||||
-rwxr-xr-x | libs/hwui/OpenGLRenderer.h | 2 | ||||
-rw-r--r-- | libs/hwui/RenderNode.cpp | 2 |
12 files changed, 65 insertions, 37 deletions
diff --git a/core/java/android/view/DisplayListCanvas.java b/core/java/android/view/DisplayListCanvas.java index 080ed9ae1841..948cec71d819 100644 --- a/core/java/android/view/DisplayListCanvas.java +++ b/core/java/android/view/DisplayListCanvas.java @@ -20,7 +20,12 @@ import android.annotation.NonNull; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.CanvasProperty; +import android.graphics.NinePatch; import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Picture; +import android.graphics.Rect; +import android.graphics.RectF; import android.util.Pools.SynchronizedPool; /** @@ -201,12 +206,16 @@ public class DisplayListCanvas extends Canvas { * Draws the specified layer onto this canvas. * * @param layer The layer to composite on this canvas + * @param x The left coordinate of the layer + * @param y The top coordinate of the layer + * @param paint The paint used to draw the layer */ - void drawHardwareLayer(HardwareLayer layer) { - nDrawLayer(mNativeCanvasWrapper, layer.getLayerHandle()); + void drawHardwareLayer(HardwareLayer layer, float x, float y, Paint paint) { + layer.setLayerPaint(paint); + nDrawLayer(mNativeCanvasWrapper, layer.getLayerHandle(), x, y); } - private static native void nDrawLayer(long renderer, long layer); + private static native void nDrawLayer(long renderer, long layer, float x, float y); /////////////////////////////////////////////////////////////////////////// // Drawing diff --git a/core/java/android/view/HardwareLayer.java b/core/java/android/view/HardwareLayer.java index 692ca7ba99cf..65ae8a649241 100644 --- a/core/java/android/view/HardwareLayer.java +++ b/core/java/android/view/HardwareLayer.java @@ -150,4 +150,8 @@ final class HardwareLayer { private static native void nSetSurfaceTexture(long layerUpdater, SurfaceTexture surface, boolean isAlreadyAttached); private static native void nUpdateSurfaceTexture(long layerUpdater); + private static native void nUpdateRenderLayer(long layerUpdater, long displayList, + int left, int top, int right, int bottom); + + private static native int nGetTexName(long layerUpdater); } diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java index 6b60be9c91b5..197ea09e2d60 100644 --- a/core/java/android/view/TextureView.java +++ b/core/java/android/view/TextureView.java @@ -319,25 +319,11 @@ public class TextureView extends View { */ @Override public final void draw(Canvas canvas) { - // NOTE: Maintain this carefully (see View#draw) + // NOTE: Maintain this carefully (see View.java) mPrivateFlags = (mPrivateFlags & ~PFLAG_DIRTY_MASK) | PFLAG_DRAWN; - /* Simplify drawing to guarantee the layer is the only thing drawn - so e.g. no background, - scrolling, or fading edges. This guarantees all drawing is in the layer, so drawing - properties (alpha, layer paint) affect all of the content of a TextureView. */ - - if (canvas.isHardwareAccelerated()) { - DisplayListCanvas displayListCanvas = (DisplayListCanvas) canvas; - - HardwareLayer layer = getHardwareLayer(); - if (layer != null) { - applyUpdate(); - applyTransformMatrix(); - - mLayer.setLayerPaint(mLayerPaint); // ensure layer paint is up to date - displayListCanvas.drawHardwareLayer(layer); - } - } + applyUpdate(); + applyTransformMatrix(); } /** @@ -373,7 +359,12 @@ public class TextureView extends View { invalidate(true); } + @Override HardwareLayer getHardwareLayer() { + // NOTE: Maintain these two lines very carefully (see View.java) + mPrivateFlags |= PFLAG_DRAWN | PFLAG_DRAWING_CACHE_VALID; + mPrivateFlags &= ~PFLAG_DIRTY_MASK; + if (mLayer == null) { if (mAttachInfo == null || mAttachInfo.mHardwareRenderer == null) { return null; @@ -411,6 +402,9 @@ public class TextureView extends View { mSurface.setDefaultBufferSize(getWidth(), getHeight()); } + applyUpdate(); + applyTransformMatrix(); + return mLayer; } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index b17f88fc7497..a4925184f181 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -15002,6 +15002,16 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * If this View draws with a HardwareLayer, returns it. + * Otherwise returns null + * + * TODO: Only TextureView uses this, can we eliminate it? + */ + HardwareLayer getHardwareLayer() { + return null; + } + + /** * Destroys all hardware rendering resources. This method is invoked * when the system needs to reclaim resources. Upon execution of this * method, you should free any OpenGL resources created by the view. @@ -15151,7 +15161,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, canvas.setHighContrastText(mAttachInfo.mHighContrastText); try { - if (layerType == LAYER_TYPE_SOFTWARE) { + final HardwareLayer layer = getHardwareLayer(); + if (layer != null && layer.isValid()) { + canvas.drawHardwareLayer(layer, 0, 0, mLayerPaint); + } else if (layerType == LAYER_TYPE_SOFTWARE) { buildDrawingCache(true); Bitmap cache = getDrawingCache(true); if (cache != null) { diff --git a/core/jni/android_view_DisplayListCanvas.cpp b/core/jni/android_view_DisplayListCanvas.cpp index 9c1d6b17608b..3833325631c7 100644 --- a/core/jni/android_view_DisplayListCanvas.cpp +++ b/core/jni/android_view_DisplayListCanvas.cpp @@ -139,10 +139,10 @@ static void android_view_DisplayListCanvas_drawRenderNode(JNIEnv* env, // ---------------------------------------------------------------------------- static void android_view_DisplayListCanvas_drawLayer(JNIEnv* env, jobject clazz, - jlong rendererPtr, jlong layerPtr) { + jlong rendererPtr, jlong layerPtr, jfloat x, jfloat y) { DisplayListCanvas* renderer = reinterpret_cast<DisplayListCanvas*>(rendererPtr); DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); - renderer->drawLayer(layer); + renderer->drawLayer(layer, x, y); } // ---------------------------------------------------------------------------- @@ -192,7 +192,7 @@ static JNINativeMethod gMethods[] = { { "nCreateDisplayListCanvas", "(II)J", (void*) android_view_DisplayListCanvas_createDisplayListCanvas }, { "nResetDisplayListCanvas", "(JII)V", (void*) android_view_DisplayListCanvas_resetDisplayListCanvas }, - { "nDrawLayer", "(JJ)V", (void*) android_view_DisplayListCanvas_drawLayer }, + { "nDrawLayer", "(JJFF)V", (void*) android_view_DisplayListCanvas_drawLayer }, { "nGetMaximumTextureWidth", "()I", (void*) android_view_DisplayListCanvas_getMaxTextureWidth }, { "nGetMaximumTextureHeight", "()I", (void*) android_view_DisplayListCanvas_getMaxTextureHeight }, diff --git a/core/jni/android_view_HardwareLayer.cpp b/core/jni/android_view_HardwareLayer.cpp index 36ba892b51c4..9e49afb45790 100644 --- a/core/jni/android_view_HardwareLayer.cpp +++ b/core/jni/android_view_HardwareLayer.cpp @@ -79,6 +79,12 @@ static void android_view_HardwareLayer_updateSurfaceTexture(JNIEnv* env, jobject layer->updateTexImage(); } +static jint android_view_HardwareLayer_getTexName(JNIEnv* env, jobject clazz, + jlong layerUpdaterPtr) { + DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr); + return layer->backingLayer()->getTextureId(); +} + // ---------------------------------------------------------------------------- // JNI Glue // ---------------------------------------------------------------------------- @@ -92,6 +98,8 @@ static JNINativeMethod gMethods[] = { { "nSetSurfaceTexture", "(JLandroid/graphics/SurfaceTexture;Z)V", (void*) android_view_HardwareLayer_setSurfaceTexture }, { "nUpdateSurfaceTexture", "(J)V", (void*) android_view_HardwareLayer_updateSurfaceTexture }, + + { "nGetTexName", "(J)I", (void*) android_view_HardwareLayer_getTexName }, }; int register_android_view_HardwareLayer(JNIEnv* env) { diff --git a/libs/hwui/DisplayListCanvas.cpp b/libs/hwui/DisplayListCanvas.cpp index 506bfad08c1b..bb149fe09d69 100644 --- a/libs/hwui/DisplayListCanvas.cpp +++ b/libs/hwui/DisplayListCanvas.cpp @@ -216,11 +216,11 @@ void DisplayListCanvas::drawRenderNode(RenderNode* renderNode) { addRenderNodeOp(op); } -void DisplayListCanvas::drawLayer(DeferredLayerUpdater* layerHandle) { +void DisplayListCanvas::drawLayer(DeferredLayerUpdater* layerHandle, float x, float y) { // We ref the DeferredLayerUpdater due to its thread-safe ref-counting // semantics. mDisplayListData->ref(layerHandle); - addDrawOp(new (alloc()) DrawLayerOp(layerHandle->backingLayer())); + addDrawOp(new (alloc()) DrawLayerOp(layerHandle->backingLayer(), x, y)); } void DisplayListCanvas::drawBitmap(const SkBitmap* bitmap, const SkPaint* paint) { diff --git a/libs/hwui/DisplayListCanvas.h b/libs/hwui/DisplayListCanvas.h index 392bb3e5d85f..f29e835c4858 100644 --- a/libs/hwui/DisplayListCanvas.h +++ b/libs/hwui/DisplayListCanvas.h @@ -91,7 +91,7 @@ public: // ---------------------------------------------------------------------------- // HWUI Canvas draw operations - special // ---------------------------------------------------------------------------- - void drawLayer(DeferredLayerUpdater* layerHandle); + void drawLayer(DeferredLayerUpdater* layerHandle, float x, float y); void drawRenderNode(RenderNode* renderNode); // TODO: rename for consistency diff --git a/libs/hwui/DisplayListOp.h b/libs/hwui/DisplayListOp.h index 5fdde8d906e9..8bb892f8e9d4 100644 --- a/libs/hwui/DisplayListOp.h +++ b/libs/hwui/DisplayListOp.h @@ -1524,15 +1524,15 @@ private: class DrawLayerOp : public DrawOp { public: - DrawLayerOp(Layer* layer) - : DrawOp(nullptr), mLayer(layer) {} + DrawLayerOp(Layer* layer, float x, float y) + : DrawOp(nullptr), mLayer(layer), mX(x), mY(y) {} virtual void applyDraw(OpenGLRenderer& renderer, Rect& dirty) override { - renderer.drawLayer(mLayer); + renderer.drawLayer(mLayer, mX, mY); } virtual void output(int level, uint32_t logFlags) const override { - OP_LOG("Draw Layer %p", mLayer); + OP_LOG("Draw Layer %p at %f %f", mLayer, mX, mY); } virtual const char* name() override { return "DrawLayer"; } diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 5692d7e120ff..b35c0179193a 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -2268,7 +2268,7 @@ void OpenGLRenderer::drawPath(const SkPath* path, const SkPaint* paint) { mDirty = true; } -void OpenGLRenderer::drawLayer(Layer* layer) { +void OpenGLRenderer::drawLayer(Layer* layer, float x, float y) { if (!layer) { return; } @@ -2284,7 +2284,7 @@ void OpenGLRenderer::drawLayer(Layer* layer) { bool clipRequired = false; const bool rejected = mState.calculateQuickRejectForScissor( - 0, 0, layer->layer.getWidth(), layer->layer.getHeight(), + x, y, x + layer->layer.getWidth(), y + layer->layer.getHeight(), &clipRequired, nullptr, false); if (rejected) { @@ -2313,7 +2313,7 @@ void OpenGLRenderer::drawLayer(Layer* layer) { .setMeshTexturedIndexedQuads(layer->mesh, layer->meshElementCount) .setFillLayer(layer->getTexture(), layer->getColorFilter(), getLayerAlpha(layer), layer->getMode(), Blend::ModeOrderSwap::NoSwap) .setTransform(*currentSnapshot(), TransformFlags::None) - .setModelViewOffsetRectSnap(0, 0, Rect(0, 0, layer->layer.getWidth(), layer->layer.getHeight())) + .setModelViewOffsetRectSnap(x, y, Rect(0, 0, layer->layer.getWidth(), layer->layer.getHeight())) .build(); DRAW_DOUBLE_STENCIL_IF(!layer->hasDrawnSinceUpdate, renderGlop(glop)); #if DEBUG_LAYERS_AS_REGIONS @@ -2326,7 +2326,7 @@ void OpenGLRenderer::drawLayer(Layer* layer) { SkPaint paint; paint.setColor(0x7f00ff00); - drawColorRect(0, 0, layer->layer.getWidth(), layer->layer.getHeight(), &paint); + drawColorRect(x, y, x + layer->layer.getWidth(), y + layer->layer.getHeight(), &paint); } } layer->hasDrawnSinceUpdate = true; diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h index 5cbc486b1a13..45662a77cfdd 100755 --- a/libs/hwui/OpenGLRenderer.h +++ b/libs/hwui/OpenGLRenderer.h @@ -187,7 +187,7 @@ public: const SkPaint* paint, int flags); void drawRenderNode(RenderNode* displayList, Rect& dirty, int32_t replayFlags = 1); - void drawLayer(Layer* layer); + void drawLayer(Layer* layer, float x, float y); void drawBitmap(const SkBitmap* bitmap, const SkPaint* paint); void drawBitmaps(const SkBitmap* bitmap, AssetAtlas::Entry* entry, int bitmapCount, TextureVertex* vertices, bool pureTranslate, const Rect& bounds, const SkPaint* paint); diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index 74d09d76af87..73c01075e842 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -875,7 +875,7 @@ void RenderNode::issueOperations(OpenGLRenderer& renderer, T& handler) { renderer.setBaseTransform(initialTransform); if (drawLayer) { - handler(new (alloc) DrawLayerOp(mLayer), + handler(new (alloc) DrawLayerOp(mLayer, 0, 0), renderer.getSaveCount() - 1, properties().getClipToBounds()); } else { const int saveCountOffset = renderer.getSaveCount() - 1; |