diff options
-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, 37 insertions, 65 deletions
diff --git a/core/java/android/view/DisplayListCanvas.java b/core/java/android/view/DisplayListCanvas.java index 948cec71d819..080ed9ae1841 100644 --- a/core/java/android/view/DisplayListCanvas.java +++ b/core/java/android/view/DisplayListCanvas.java @@ -20,12 +20,7 @@ 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; /** @@ -206,16 +201,12 @@ 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, float x, float y, Paint paint) { - layer.setLayerPaint(paint); - nDrawLayer(mNativeCanvasWrapper, layer.getLayerHandle(), x, y); + void drawHardwareLayer(HardwareLayer layer) { + nDrawLayer(mNativeCanvasWrapper, layer.getLayerHandle()); } - private static native void nDrawLayer(long renderer, long layer, float x, float y); + private static native void nDrawLayer(long renderer, long layer); /////////////////////////////////////////////////////////////////////////// // Drawing diff --git a/core/java/android/view/HardwareLayer.java b/core/java/android/view/HardwareLayer.java index 65ae8a649241..692ca7ba99cf 100644 --- a/core/java/android/view/HardwareLayer.java +++ b/core/java/android/view/HardwareLayer.java @@ -150,8 +150,4 @@ 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 cdc196e1c371..23bd3ac17954 100644 --- a/core/java/android/view/TextureView.java +++ b/core/java/android/view/TextureView.java @@ -302,11 +302,25 @@ public class TextureView extends View { */ @Override public final void draw(Canvas canvas) { - // NOTE: Maintain this carefully (see View.java) + // NOTE: Maintain this carefully (see View#draw) mPrivateFlags = (mPrivateFlags & ~PFLAG_DIRTY_MASK) | PFLAG_DRAWN; - applyUpdate(); - applyTransformMatrix(); + /* 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); + } + } } /** @@ -342,12 +356,7 @@ 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; @@ -385,9 +394,6 @@ 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 a4925184f181..b17f88fc7497 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -15002,16 +15002,6 @@ 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. @@ -15161,10 +15151,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, canvas.setHighContrastText(mAttachInfo.mHighContrastText); try { - final HardwareLayer layer = getHardwareLayer(); - if (layer != null && layer.isValid()) { - canvas.drawHardwareLayer(layer, 0, 0, mLayerPaint); - } else if (layerType == LAYER_TYPE_SOFTWARE) { + 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 3833325631c7..9c1d6b17608b 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, jfloat x, jfloat y) { + jlong rendererPtr, jlong layerPtr) { DisplayListCanvas* renderer = reinterpret_cast<DisplayListCanvas*>(rendererPtr); DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); - renderer->drawLayer(layer, x, y); + renderer->drawLayer(layer); } // ---------------------------------------------------------------------------- @@ -192,7 +192,7 @@ static JNINativeMethod gMethods[] = { { "nCreateDisplayListCanvas", "(II)J", (void*) android_view_DisplayListCanvas_createDisplayListCanvas }, { "nResetDisplayListCanvas", "(JII)V", (void*) android_view_DisplayListCanvas_resetDisplayListCanvas }, - { "nDrawLayer", "(JJFF)V", (void*) android_view_DisplayListCanvas_drawLayer }, + { "nDrawLayer", "(JJ)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 9e49afb45790..36ba892b51c4 100644 --- a/core/jni/android_view_HardwareLayer.cpp +++ b/core/jni/android_view_HardwareLayer.cpp @@ -79,12 +79,6 @@ 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 // ---------------------------------------------------------------------------- @@ -98,8 +92,6 @@ 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 61c5883cfbfb..22cddfc6d1cd 100644 --- a/libs/hwui/DisplayListCanvas.cpp +++ b/libs/hwui/DisplayListCanvas.cpp @@ -221,11 +221,11 @@ void DisplayListCanvas::drawRenderNode(RenderNode* renderNode) { addRenderNodeOp(op); } -void DisplayListCanvas::drawLayer(DeferredLayerUpdater* layerHandle, float x, float y) { +void DisplayListCanvas::drawLayer(DeferredLayerUpdater* layerHandle) { // We ref the DeferredLayerUpdater due to its thread-safe ref-counting // semantics. mDisplayListData->ref(layerHandle); - addDrawOp(new (alloc()) DrawLayerOp(layerHandle->backingLayer(), x, y)); + addDrawOp(new (alloc()) DrawLayerOp(layerHandle->backingLayer())); } void DisplayListCanvas::drawBitmap(const SkBitmap* bitmap, const SkPaint* paint) { diff --git a/libs/hwui/DisplayListCanvas.h b/libs/hwui/DisplayListCanvas.h index 3b619046612f..978cceab3779 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, float x, float y); + void drawLayer(DeferredLayerUpdater* layerHandle); void drawRenderNode(RenderNode* renderNode); // TODO: rename for consistency diff --git a/libs/hwui/DisplayListOp.h b/libs/hwui/DisplayListOp.h index 8ff58d4f64f5..cd5d0ddc8c76 100644 --- a/libs/hwui/DisplayListOp.h +++ b/libs/hwui/DisplayListOp.h @@ -1541,15 +1541,15 @@ private: class DrawLayerOp : public DrawOp { public: - DrawLayerOp(Layer* layer, float x, float y) - : DrawOp(nullptr), mLayer(layer), mX(x), mY(y) {} + DrawLayerOp(Layer* layer) + : DrawOp(nullptr), mLayer(layer) {} virtual void applyDraw(OpenGLRenderer& renderer, Rect& dirty) override { - renderer.drawLayer(mLayer, mX, mY); + renderer.drawLayer(mLayer); } virtual void output(int level, uint32_t logFlags) const override { - OP_LOG("Draw Layer %p at %f %f", mLayer, mX, mY); + OP_LOG("Draw Layer %p", mLayer); } virtual const char* name() override { return "DrawLayer"; } diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 7a56d42b65e2..84f35f8beacf 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -2267,7 +2267,7 @@ void OpenGLRenderer::drawPath(const SkPath* path, const SkPaint* paint) { mDirty = true; } -void OpenGLRenderer::drawLayer(Layer* layer, float x, float y) { +void OpenGLRenderer::drawLayer(Layer* layer) { if (!layer) { return; } @@ -2283,7 +2283,7 @@ void OpenGLRenderer::drawLayer(Layer* layer, float x, float y) { bool clipRequired = false; const bool rejected = mState.calculateQuickRejectForScissor( - x, y, x + layer->layer.getWidth(), y + layer->layer.getHeight(), + 0, 0, layer->layer.getWidth(), layer->layer.getHeight(), &clipRequired, nullptr, false); if (rejected) { @@ -2312,7 +2312,7 @@ void OpenGLRenderer::drawLayer(Layer* layer, float x, float y) { .setMeshTexturedIndexedQuads(layer->mesh, layer->meshElementCount) .setFillLayer(layer->getTexture(), layer->getColorFilter(), getLayerAlpha(layer), layer->getMode(), Blend::ModeOrderSwap::NoSwap) .setTransform(*currentSnapshot(), TransformFlags::None) - .setModelViewOffsetRectSnap(x, y, Rect(0, 0, layer->layer.getWidth(), layer->layer.getHeight())) + .setModelViewOffsetRectSnap(0, 0, Rect(0, 0, layer->layer.getWidth(), layer->layer.getHeight())) .build(); DRAW_DOUBLE_STENCIL_IF(!layer->hasDrawnSinceUpdate, renderGlop(glop)); #if DEBUG_LAYERS_AS_REGIONS @@ -2325,7 +2325,7 @@ void OpenGLRenderer::drawLayer(Layer* layer, float x, float y) { SkPaint paint; paint.setColor(0x7f00ff00); - drawColorRect(x, y, x + layer->layer.getWidth(), y + layer->layer.getHeight(), &paint); + drawColorRect(0, 0, layer->layer.getWidth(), layer->layer.getHeight(), &paint); } } layer->hasDrawnSinceUpdate = true; diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h index 4f75482f06e5..501a219b91f4 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, float x, float y); + void drawLayer(Layer* layer); 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 48da3e8b380e..4ae152196be0 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, 0, 0), + handler(new (alloc) DrawLayerOp(mLayer), renderer.getSaveCount() - 1, properties().getClipToBounds()); } else { const int saveCountOffset = renderer.getSaveCount() - 1; |