diff options
-rw-r--r-- | core/jni/android_view_HardwareLayer.cpp | 1 | ||||
-rw-r--r-- | libs/hwui/Android.mk | 2 | ||||
-rw-r--r-- | libs/hwui/Caches.cpp | 2 | ||||
-rw-r--r-- | libs/hwui/DeferredLayerUpdater.cpp | 23 | ||||
-rw-r--r-- | libs/hwui/DeferredLayerUpdater.h | 2 | ||||
-rw-r--r-- | libs/hwui/Layer.cpp | 2 | ||||
-rw-r--r-- | libs/hwui/Layer.h | 13 | ||||
-rw-r--r-- | libs/hwui/LayerRenderer.cpp | 63 | ||||
-rw-r--r-- | libs/hwui/LayerRenderer.h | 53 | ||||
-rw-r--r-- | libs/hwui/RenderNode.cpp | 1 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 3 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.h | 2 | ||||
-rw-r--r-- | libs/hwui/renderthread/IRenderPipeline.h | 2 | ||||
-rw-r--r-- | libs/hwui/renderthread/OpenGLPipeline.cpp | 9 | ||||
-rw-r--r-- | libs/hwui/renderthread/OpenGLPipeline.h | 2 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.cpp | 5 | ||||
-rw-r--r-- | libs/hwui/tests/common/TestUtils.cpp | 29 | ||||
-rw-r--r-- | libs/hwui/tests/unit/DeferredLayerUpdaterTests.cpp | 54 | ||||
-rw-r--r-- | libs/hwui/tests/unit/RenderNodeTests.cpp | 3 |
19 files changed, 99 insertions, 172 deletions
diff --git a/core/jni/android_view_HardwareLayer.cpp b/core/jni/android_view_HardwareLayer.cpp index 6b774e8f23e3..4e0b924e801f 100644 --- a/core/jni/android_view_HardwareLayer.cpp +++ b/core/jni/android_view_HardwareLayer.cpp @@ -32,7 +32,6 @@ #include <SkXfermode.h> #include <DeferredLayerUpdater.h> -#include <LayerRenderer.h> #include <SkiaShader.h> #include <Rect.h> #include <RenderNode.h> diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk index 0a8cd789b515..8cbe016942ee 100644 --- a/libs/hwui/Android.mk +++ b/libs/hwui/Android.mk @@ -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 \ diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp index ef81a522c050..fe3d8598db71 100644 --- a/libs/hwui/Caches.cpp +++ b/libs/hwui/Caches.cpp @@ -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" diff --git a/libs/hwui/DeferredLayerUpdater.cpp b/libs/hwui/DeferredLayerUpdater.cpp index f13cb8d7d1d7..c42ff1a93353 100644 --- a/libs/hwui/DeferredLayerUpdater.cpp +++ b/libs/hwui/DeferredLayerUpdater.cpp @@ -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); } } diff --git a/libs/hwui/DeferredLayerUpdater.h b/libs/hwui/DeferredLayerUpdater.h index 389e17d12080..2376295b7eff 100644 --- a/libs/hwui/DeferredLayerUpdater.h +++ b/libs/hwui/DeferredLayerUpdater.h @@ -92,6 +92,8 @@ public: void detachSurfaceTexture(); + void updateLayer(bool forceFilter, GLenum renderTarget, const float* textureTransform); + private: // Generic properties int mWidth; diff --git a/libs/hwui/Layer.cpp b/libs/hwui/Layer.cpp index b911b6825226..4e12bcef8a4f 100644 --- a/libs/hwui/Layer.cpp +++ b/libs/hwui/Layer.cpp @@ -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); diff --git a/libs/hwui/Layer.h b/libs/hwui/Layer.h index 153184149db6..c688a96aa8cd 100644 --- a/libs/hwui/Layer.h +++ b/libs/hwui/Layer.h @@ -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 index 8d50dc2ccd94..000000000000 --- a/libs/hwui/LayerRenderer.cpp +++ /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 index 7460e3e47fa2..000000000000 --- a/libs/hwui/LayerRenderer.h +++ /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 diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index ff277d111197..38c0e08f400e 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -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" diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 9b0be49beb07..5e9b9b3c7a2a 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -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(); } diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 688bf2a0b792..a3b62612b123 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -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); diff --git a/libs/hwui/renderthread/IRenderPipeline.h b/libs/hwui/renderthread/IRenderPipeline.h index 0c0fbe9d716c..3250fed8f429 100644 --- a/libs/hwui/renderthread/IRenderPipeline.h +++ b/libs/hwui/renderthread/IRenderPipeline.h @@ -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; diff --git a/libs/hwui/renderthread/OpenGLPipeline.cpp b/libs/hwui/renderthread/OpenGLPipeline.cpp index 3a2b15584d50..36be387d3925 100644 --- a/libs/hwui/renderthread/OpenGLPipeline.cpp +++ b/libs/hwui/renderthread/OpenGLPipeline.cpp @@ -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() { diff --git a/libs/hwui/renderthread/OpenGLPipeline.h b/libs/hwui/renderthread/OpenGLPipeline.h index a6d22ee8b34f..e08fd9b63ffa 100644 --- a/libs/hwui/renderthread/OpenGLPipeline.h +++ b/libs/hwui/renderthread/OpenGLPipeline.h @@ -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; diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index d860acd1edd1..ad1af4043d10 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -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() { diff --git a/libs/hwui/tests/common/TestUtils.cpp b/libs/hwui/tests/common/TestUtils.cpp index 930067a9b2cc..5b9b003b4715 100644 --- a/libs/hwui/tests/common/TestUtils.cpp +++ b/libs/hwui/tests/common/TestUtils.cpp @@ -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 index 000000000000..0326aa91bb18 --- /dev/null +++ b/libs/hwui/tests/unit/DeferredLayerUpdaterTests.cpp @@ -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()); +} diff --git a/libs/hwui/tests/unit/RenderNodeTests.cpp b/libs/hwui/tests/unit/RenderNodeTests.cpp index 132601efb543..1b34b2ed6f5c 100644 --- a/libs/hwui/tests/unit/RenderNodeTests.cpp +++ b/libs/hwui/tests/unit/RenderNodeTests.cpp @@ -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; |