OSDN Git Service

Remove LayerRenderer.
authorDerek Sollenberger <djsollen@google.com>
Fri, 22 Jul 2016 16:13:32 +0000 (12:13 -0400)
committerDerek Sollenberger <djsollen@google.com>
Tue, 26 Jul 2016 17:05:13 +0000 (13:05 -0400)
There is only one caller each for the static functions here so this
CL moves the logic to the caller.  Also by moving some of the code
into the pipeline it makes it easier for future changes to configure
how a pipeline handles a layer.

Change-Id: Ib735b5154325cbb658fd151f7a19dbf434ab44b7

19 files changed:
core/jni/android_view_HardwareLayer.cpp
libs/hwui/Android.mk
libs/hwui/Caches.cpp
libs/hwui/DeferredLayerUpdater.cpp
libs/hwui/DeferredLayerUpdater.h
libs/hwui/Layer.cpp
libs/hwui/Layer.h
libs/hwui/LayerRenderer.cpp [deleted file]
libs/hwui/LayerRenderer.h [deleted file]
libs/hwui/RenderNode.cpp
libs/hwui/renderthread/CanvasContext.cpp
libs/hwui/renderthread/CanvasContext.h
libs/hwui/renderthread/IRenderPipeline.h
libs/hwui/renderthread/OpenGLPipeline.cpp
libs/hwui/renderthread/OpenGLPipeline.h
libs/hwui/renderthread/RenderProxy.cpp
libs/hwui/tests/common/TestUtils.cpp
libs/hwui/tests/unit/DeferredLayerUpdaterTests.cpp [new file with mode: 0644]
libs/hwui/tests/unit/RenderNodeTests.cpp

index 6b774e8..4e0b924 100644 (file)
@@ -32,7 +32,6 @@
 #include <SkXfermode.h>
 
 #include <DeferredLayerUpdater.h>
-#include <LayerRenderer.h>
 #include <SkiaShader.h>
 #include <Rect.h>
 #include <RenderNode.h>
index 0a8cd78..8cbe016 100644 (file)
@@ -70,7 +70,6 @@ hwui_src_files := \
     JankTracker.cpp \
     Layer.cpp \
     LayerBuilder.cpp \
-    LayerRenderer.cpp \
     LayerUpdateQueue.cpp \
     Matrix.cpp \
     OpDumper.cpp \
@@ -249,6 +248,7 @@ LOCAL_SRC_FILES += \
     tests/unit/CanvasStateTests.cpp \
     tests/unit/ClipAreaTests.cpp \
     tests/unit/DamageAccumulatorTests.cpp \
+    tests/unit/DeferredLayerUpdaterTests.cpp \
     tests/unit/DeviceInfoTests.cpp \
     tests/unit/FatVectorTests.cpp \
     tests/unit/FontRendererTests.cpp \
index ef81a52..fe3d859 100644 (file)
@@ -17,7 +17,7 @@
 #include "Caches.h"
 
 #include "GammaFontRenderer.h"
-#include "LayerRenderer.h"
+#include "Layer.h"
 #include "Properties.h"
 #include "renderstate/RenderState.h"
 #include "ShadowTessellator.h"
index f13cb8d..c42ff1a 100644 (file)
@@ -15,7 +15,6 @@
  */
 #include "DeferredLayerUpdater.h"
 
-#include "LayerRenderer.h"
 #include "renderthread/EglManager.h"
 #include "renderthread/RenderTask.h"
 #include "utils/PaintUtils.h"
@@ -29,8 +28,8 @@ DeferredLayerUpdater::DeferredLayerUpdater(Layer* layer)
         , mNeedsGLContextAttach(false)
         , mUpdateTexImage(false)
         , mLayer(layer) {
-    mWidth = mLayer->layer.getWidth();
-    mHeight = mLayer->layer.getHeight();
+    mWidth = mLayer->getWidth();
+    mHeight = mLayer->getHeight();
     mBlend = mLayer->isBlend();
     mColorFilter = SkSafeRef(mLayer->getColorFilter());
     mAlpha = mLayer->getAlpha();
@@ -107,8 +106,22 @@ void DeferredLayerUpdater::doUpdateTexImage() {
         LOG_ALWAYS_FATAL_IF(renderTarget != GL_TEXTURE_2D && renderTarget != GL_TEXTURE_EXTERNAL_OES,
                 "doUpdateTexImage target %x, 2d %x, EXT %x",
                 renderTarget, GL_TEXTURE_2D, GL_TEXTURE_EXTERNAL_OES);
-        LayerRenderer::updateTextureLayer(mLayer, mWidth, mHeight,
-                !mBlend, forceFilter, renderTarget, transform);
+        updateLayer(forceFilter, renderTarget, transform);
+    }
+}
+
+void DeferredLayerUpdater::updateLayer(bool forceFilter, GLenum renderTarget,
+        const float* textureTransform) {
+    mLayer->setBlend(mBlend);
+    mLayer->setForceFilter(forceFilter);
+    mLayer->setSize(mWidth, mHeight);
+    mLayer->getTexTransform().load(textureTransform);
+
+    if (renderTarget != mLayer->getRenderTarget()) {
+        mLayer->setRenderTarget(renderTarget);
+        mLayer->bindTexture();
+        mLayer->setFilter(GL_NEAREST, false, true);
+        mLayer->setWrap(GL_CLAMP_TO_EDGE, false, true);
     }
 }
 
index 389e17d..2376295 100644 (file)
@@ -92,6 +92,8 @@ public:
 
     void detachSurfaceTexture();
 
+    void updateLayer(bool forceFilter, GLenum renderTarget, const float* textureTransform);
+
 private:
     // Generic properties
     int mWidth;
index b911b68..4e12bce 100644 (file)
@@ -41,7 +41,7 @@ Layer::Layer(RenderState& renderState, uint32_t layerWidth, uint32_t layerHeight
     // TODO: This is a violation of Android's typical ref counting, but it
     // preserves the old inc/dec ref locations. This should be changed...
     incStrong(nullptr);
-    renderTarget = GL_TEXTURE_2D;
+    renderTarget = GL_NONE;  // see DeferredLayerUpdater::updateLayer()
     texture.mWidth = layerWidth;
     texture.mHeight = layerHeight;
     renderState.registerLayer(this);
index 1531841..c688a96 100644 (file)
@@ -175,19 +175,6 @@ public:
      */
     void onGlContextLost();
 
-    /**
-     * Bounds of the layer.
-     */
-    Rect layer;
-    /**
-     * Texture coordinates of the layer.
-     */
-    Rect texCoords;
-    /**
-     * Clipping rectangle.
-     */
-    Rect clipRect;
-
 private:
     Caches& caches;
 
diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp
deleted file mode 100644 (file)
index 8d50dc2..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "LayerRenderer.h"
-#include "Matrix.h"
-#include "Properties.h"
-#include "Rect.h"
-#include "renderstate/RenderState.h"
-#include "utils/GLUtils.h"
-#include "utils/TraceUtils.h"
-
-#include <ui/Rect.h>
-
-#include <private/hwui/DrawGlInfo.h>
-
-namespace android {
-namespace uirenderer {
-
-Layer* LayerRenderer::createTextureLayer(RenderState& renderState) {
-    LAYER_RENDERER_LOGD("Creating new texture layer");
-
-    Layer* layer = new Layer(renderState, 0, 0);
-    layer->layer.set(0.0f, 0.0f, 0.0f, 0.0f);
-    layer->texCoords.set(0.0f, 1.0f, 1.0f, 0.0f);
-    layer->setRenderTarget(GL_NONE); // see ::updateTextureLayer()
-
-    Caches::getInstance().textureState().activateTexture(0);
-    layer->generateTexture();
-
-    return layer;
-}
-
-void LayerRenderer::updateTextureLayer(Layer* layer, uint32_t width, uint32_t height,
-    bool isOpaque, bool forceFilter, GLenum renderTarget, const float* textureTransform) {
-    layer->setBlend(!isOpaque);
-    layer->setForceFilter(forceFilter);
-    layer->setSize(width, height);
-    layer->layer.set(0.0f, 0.0f, width, height);
-    layer->getTexTransform().load(textureTransform);
-
-    if (renderTarget != layer->getRenderTarget()) {
-        layer->setRenderTarget(renderTarget);
-        layer->bindTexture();
-        layer->setFilter(GL_NEAREST, false, true);
-        layer->setWrap(GL_CLAMP_TO_EDGE, false, true);
-    }
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/LayerRenderer.h b/libs/hwui/LayerRenderer.h
deleted file mode 100644 (file)
index 7460e3e..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <cutils/compiler.h>
-
-#include "Layer.h"
-
-#include <SkBitmap.h>
-
-namespace android {
-namespace uirenderer {
-
-class RenderState;
-
-///////////////////////////////////////////////////////////////////////////////
-// Defines
-///////////////////////////////////////////////////////////////////////////////
-
-// Debug
-#if DEBUG_LAYER_RENDERER
-    #define LAYER_RENDERER_LOGD(...) ALOGD(__VA_ARGS__)
-#else
-    #define LAYER_RENDERER_LOGD(...)
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-// Renderer
-///////////////////////////////////////////////////////////////////////////////
-
-class LayerRenderer {
-public:
-    static Layer* createTextureLayer(RenderState& renderState);
-    static void updateTextureLayer(Layer* layer, uint32_t width, uint32_t height,
-            bool isOpaque, bool forceFilter, GLenum renderTarget, const float* textureTransform);
-}; // class LayerRenderer
-
-}; // namespace uirenderer
-}; // namespace android
index ff277d1..38c0e08 100644 (file)
@@ -19,7 +19,6 @@
 #include "BakedOpRenderer.h"
 #include "DamageAccumulator.h"
 #include "Debug.h"
-#include "LayerRenderer.h"
 #include "OpDumper.h"
 #include "RecordedOp.h"
 #include "TreeInfo.h"
index 9b0be49..5e9b9b3 100644 (file)
@@ -21,7 +21,6 @@
 #include "Caches.h"
 #include "DeferredLayerUpdater.h"
 #include "EglManager.h"
-#include "LayerRenderer.h"
 #include "LayerUpdateQueue.h"
 #include "Properties.h"
 #include "Readback.h"
@@ -504,7 +503,7 @@ void CanvasContext::trimMemory(RenderThread& thread, int level) {
     }
 }
 
-Layer* CanvasContext::createTextureLayer() {
+DeferredLayerUpdater* CanvasContext::createTextureLayer() {
     return mRenderPipeline->createTextureLayer();
 }
 
index 688bf2a..a3b6261 100644 (file)
@@ -100,7 +100,7 @@ public:
 
     static void invokeFunctor(RenderThread& thread, Functor* functor);
 
-    Layer* createTextureLayer();
+    DeferredLayerUpdater* createTextureLayer();
 
     ANDROID_API static void setTextureAtlas(RenderThread& thread,
             const sp<GraphicBuffer>& buffer, int64_t* map, size_t mapSize);
index 0c0fbe9..3250fed 100644 (file)
@@ -57,7 +57,7 @@ public:
     virtual bool swapBuffers(const Frame& frame, bool drew, const SkRect& screenDirty,
             FrameInfo* currentFrameInfo, bool* requireSwap) = 0;
     virtual bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap) = 0;
-    virtual Layer* createTextureLayer() = 0;
+    virtual DeferredLayerUpdater* createTextureLayer() = 0;
     virtual bool setSurface(Surface* window, SwapBehavior swapBehavior) = 0;
     virtual void onStop() = 0;
     virtual bool isSurfaceReady() = 0;
index 3a2b155..36be387 100644 (file)
@@ -18,7 +18,6 @@
 
 #include "DeferredLayerUpdater.h"
 #include "EglManager.h"
-#include "LayerRenderer.h"
 #include "renderstate/RenderState.h"
 #include "Readback.h"
 
@@ -120,9 +119,13 @@ bool OpenGLPipeline::copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap
             == CopyResult::Success;
 }
 
-Layer* OpenGLPipeline::createTextureLayer() {
+DeferredLayerUpdater* OpenGLPipeline::createTextureLayer() {
     mEglManager.initialize();
-    return LayerRenderer::createTextureLayer(mRenderThread.renderState());
+    Layer* layer = new Layer(mRenderThread.renderState(), 0, 0);
+    Caches::getInstance().textureState().activateTexture(0);
+    layer->generateTexture();
+
+    return new DeferredLayerUpdater(layer);
 }
 
 void OpenGLPipeline::onStop() {
index a6d22ee..e08fd9b 100644 (file)
@@ -46,7 +46,7 @@ public:
     bool swapBuffers(const Frame& frame, bool drew, const SkRect& screenDirty,
             FrameInfo* currentFrameInfo, bool* requireSwap) override;
     bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap) override;
-    Layer* createTextureLayer() override;
+    DeferredLayerUpdater* createTextureLayer() override;
     bool setSurface(Surface* window, SwapBehavior swapBehavior) override;
     void onStop() override;
     bool isSurfaceReady() override;
index d860acd..ad1af40 100644 (file)
@@ -18,7 +18,6 @@
 
 #include "DeferredLayerUpdater.h"
 #include "DisplayList.h"
-#include "LayerRenderer.h"
 #include "Readback.h"
 #include "Rect.h"
 #include "renderthread/CanvasContext.h"
@@ -266,9 +265,7 @@ void RenderProxy::invokeFunctor(Functor* functor, bool waitForCompletion) {
 }
 
 CREATE_BRIDGE1(createTextureLayer, CanvasContext* context) {
-    Layer* layer = args->context->createTextureLayer();
-    if (!layer) return nullptr;
-    return new DeferredLayerUpdater(layer);
+    return args->context->createTextureLayer();
 }
 
 DeferredLayerUpdater* RenderProxy::createTextureLayer() {
index 930067a..5b9b003 100644 (file)
@@ -18,9 +18,9 @@
 
 #include "hwui/Paint.h"
 #include "DeferredLayerUpdater.h"
-#include "LayerRenderer.h"
 
 #include <renderthread/EglManager.h>
+#include <renderthread/OpenGLPipeline.h>
 #include <utils/Unicode.h>
 
 namespace android {
@@ -46,20 +46,14 @@ SkColor TestUtils::interpolateColor(float fraction, SkColor start, SkColor end)
 sp<DeferredLayerUpdater> TestUtils::createTextureLayerUpdater(
         renderthread::RenderThread& renderThread, uint32_t width, uint32_t height,
         const SkMatrix& transform) {
-    Layer* layer = LayerRenderer::createTextureLayer(renderThread.renderState());
-    layer->getTransform().load(transform);
-
-    sp<DeferredLayerUpdater> layerUpdater = new DeferredLayerUpdater(layer);
+    renderthread::OpenGLPipeline pipeline(renderThread);
+    sp<DeferredLayerUpdater> layerUpdater = pipeline.createTextureLayer();
+    layerUpdater->backingLayer()->getTransform().load(transform);
     layerUpdater->setSize(width, height);
     layerUpdater->setTransform(&transform);
 
     // updateLayer so it's ready to draw
-    bool isOpaque = true;
-    bool forceFilter = true;
-    GLenum renderTarget = GL_TEXTURE_EXTERNAL_OES;
-    LayerRenderer::updateTextureLayer(layer, width, height, isOpaque, forceFilter,
-    renderTarget, Matrix4::identity().data);
-
+    layerUpdater->updateLayer(true, GL_TEXTURE_EXTERNAL_OES, Matrix4::identity().data);
     return layerUpdater;
 }
 
@@ -114,17 +108,12 @@ void TestUtils::drawUtf8ToCanvas(Canvas* canvas, const char* text,
 void TestUtils::TestTask::run() {
     // RenderState only valid once RenderThread is running, so queried here
     renderthread::RenderThread& renderThread = renderthread::RenderThread::getInstance();
-    bool hasEglContext = renderThread.eglManager().hasEglContext();
-    RenderState& renderState = renderThread.renderState();
-    if (!hasEglContext) {
-        renderState.onGLContextCreated();
-    }
+    renderThread.eglManager().initialize();
 
     rtCallback(renderThread);
-    if (!hasEglContext) {
-        renderState.flush(Caches::FlushMode::Full);
-        renderState.onGLContextDestroyed();
-    }
+
+    renderThread.renderState().flush(Caches::FlushMode::Full);
+    renderThread.eglManager().destroy();
 }
 
 std::unique_ptr<uint16_t[]> TestUtils::asciiToUtf16(const char* str) {
diff --git a/libs/hwui/tests/unit/DeferredLayerUpdaterTests.cpp b/libs/hwui/tests/unit/DeferredLayerUpdaterTests.cpp
new file mode 100644 (file)
index 0000000..0326aa9
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "DeferredLayerUpdater.h"
+
+#include "renderthread/OpenGLPipeline.h"
+#include "tests/common/TestUtils.h"
+
+#include <gtest/gtest.h>
+
+using namespace android;
+using namespace android::uirenderer;
+
+RENDERTHREAD_TEST(DeferredLayerUpdater, updateLayer) {
+    renderthread::OpenGLPipeline pipeline(renderThread);
+    sp<DeferredLayerUpdater> layerUpdater = pipeline.createTextureLayer();
+    layerUpdater->setSize(100, 100);
+    layerUpdater->setBlend(true);
+
+
+    // updates are deferred so the backing layer should still be in its default state
+    EXPECT_EQ((uint32_t)GL_NONE, layerUpdater->backingLayer()->getRenderTarget());
+    EXPECT_EQ(0u, layerUpdater->backingLayer()->getWidth());
+    EXPECT_EQ(0u, layerUpdater->backingLayer()->getHeight());
+    EXPECT_FALSE(layerUpdater->backingLayer()->getForceFilter());
+    EXPECT_FALSE(layerUpdater->backingLayer()->isBlend());
+    EXPECT_EQ(Matrix4::identity(), layerUpdater->backingLayer()->getTexTransform());
+
+    // push the deferred updates to the layer
+    Matrix4 scaledMatrix;
+    scaledMatrix.loadScale(0.5, 0.5, 0.0);
+    layerUpdater->updateLayer(true, GL_TEXTURE_EXTERNAL_OES, scaledMatrix.data);
+
+    // the backing layer should now have all the properties applied.
+    EXPECT_EQ((uint32_t)GL_TEXTURE_EXTERNAL_OES, layerUpdater->backingLayer()->getRenderTarget());
+    EXPECT_EQ(100u, layerUpdater->backingLayer()->getWidth());
+    EXPECT_EQ(100u, layerUpdater->backingLayer()->getHeight());
+    EXPECT_TRUE(layerUpdater->backingLayer()->getForceFilter());
+    EXPECT_TRUE(layerUpdater->backingLayer()->isBlend());
+    EXPECT_EQ(scaledMatrix, layerUpdater->backingLayer()->getTexTransform());
+}
index 132601e..1b34b2e 100644 (file)
@@ -104,9 +104,10 @@ TEST(RenderNode, releasedCallback) {
 }
 
 RENDERTHREAD_TEST(RenderNode, prepareTree_nullableDisplayList) {
+    auto rootNode = TestUtils::createNode(0, 0, 200, 400, nullptr);
     ContextFactory contextFactory;
     std::unique_ptr<CanvasContext> canvasContext(CanvasContext::create(
-            renderThread, false, nullptr, &contextFactory));
+            renderThread, false, rootNode.get(), &contextFactory));
     TreeInfo info(TreeInfo::MODE_RT_ONLY, *canvasContext.get());
     DamageAccumulator damageAccumulator;
     info.damageAccumulator = &damageAccumulator;