summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Bart Sears <bsears@google.com> 2015-08-20 02:23:39 +0000
committer Bart Sears <bsears@google.com> 2015-08-20 02:23:39 +0000
commitd35dcb13115ca1dd8c07e397f43a186cd7fd1a01 (patch)
tree4f2c4acd4e0df556f2d34529dcb85fac3815dc44
parent20a248934c67b19c8734362dba76a5cc94254686 (diff)
Revert "Simplify TextureView draw path"
This reverts commit 20a248934c67b19c8734362dba76a5cc94254686. Change-Id: Iaa3ebb1d868acbe184080087aec312b43e87e3c7
-rw-r--r--core/java/android/view/DisplayListCanvas.java15
-rw-r--r--core/java/android/view/HardwareLayer.java4
-rw-r--r--core/java/android/view/TextureView.java28
-rw-r--r--core/java/android/view/View.java15
-rw-r--r--core/jni/android_view_DisplayListCanvas.cpp6
-rw-r--r--core/jni/android_view_HardwareLayer.cpp8
-rw-r--r--libs/hwui/DisplayListCanvas.cpp4
-rw-r--r--libs/hwui/DisplayListCanvas.h2
-rw-r--r--libs/hwui/DisplayListOp.h8
-rw-r--r--libs/hwui/OpenGLRenderer.cpp8
-rwxr-xr-xlibs/hwui/OpenGLRenderer.h2
-rw-r--r--libs/hwui/RenderNode.cpp2
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 23bd3ac17954..cdc196e1c371 100644
--- a/core/java/android/view/TextureView.java
+++ b/core/java/android/view/TextureView.java
@@ -302,25 +302,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();
}
/**
@@ -356,7 +342,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;
@@ -394,6 +385,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 22cddfc6d1cd..61c5883cfbfb 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) {
+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 978cceab3779..3b619046612f 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 cd5d0ddc8c76..8ff58d4f64f5 100644
--- a/libs/hwui/DisplayListOp.h
+++ b/libs/hwui/DisplayListOp.h
@@ -1541,15 +1541,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 84f35f8beacf..7a56d42b65e2 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) {
+void OpenGLRenderer::drawLayer(Layer* layer, float x, float y) {
if (!layer) {
return;
}
@@ -2283,7 +2283,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) {
@@ -2312,7 +2312,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
@@ -2325,7 +2325,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 501a219b91f4..4f75482f06e5 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 4ae152196be0..48da3e8b380e 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;