Loading core/java/android/view/HardwareRenderer.java +3 −0 Original line number Diff line number Diff line Loading @@ -428,6 +428,8 @@ public abstract class HardwareRenderer { interface HardwareDrawCallbacks { /** * Invoked before a view is drawn by a hardware renderer. * This method can be used to apply transformations to the * canvas but no drawing command should be issued. * * @param canvas The Canvas used to render the view. */ Loading @@ -435,6 +437,7 @@ public abstract class HardwareRenderer { /** * Invoked after a view is drawn by a hardware renderer. * It is safe to invoke drawing commands from this method. * * @param canvas The Canvas used to render the view. */ Loading libs/hwui/DeferredDisplayList.h +2 −2 Original line number Diff line number Diff line Loading @@ -52,6 +52,8 @@ public: kOpBatch_Count, // Add other batch ids before this }; void clear(); bool isEmpty() { return mBatches.isEmpty(); } /** Loading @@ -78,8 +80,6 @@ private: */ void resetBatchingState(); void clear(); void storeStateOpBarrier(OpenGLRenderer& renderer, StateOp* op); void storeRestoreToCountBarrier(int newSaveCount); Loading libs/hwui/Layer.cpp +45 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ #include <utils/Log.h> #include "DisplayList.h" #include "DeferredDisplayList.h" #include "Layer.h" #include "LayerRenderer.h" #include "OpenGLRenderer.h" Loading @@ -43,15 +45,18 @@ Layer::Layer(const uint32_t layerWidth, const uint32_t layerHeight) { fbo = 0; stencil = NULL; debugDrawUpdate = false; deferredList = NULL; Caches::getInstance().resourceCache.incrementRefcount(this); } Layer::~Layer() { if (mesh) delete mesh; if (meshIndices) delete meshIndices; if (colorFilter) Caches::getInstance().resourceCache.decrementRefcount(colorFilter); removeFbo(); deleteTexture(); delete[] mesh; delete[] meshIndices; delete deferredList; } uint32_t Layer::computeIdealWidth(uint32_t layerWidth) { Loading Loading @@ -133,5 +138,43 @@ void Layer::setColorFilter(SkiaColorFilter* filter) { } } void Layer::defer() { if (!deferredList) { deferredList = new DeferredDisplayList; } DeferStateStruct deferredState(*deferredList, *renderer, DisplayList::kReplayFlag_ClipChildren); const float width = layer.getWidth(); const float height = layer.getHeight(); if (dirtyRect.isEmpty() || (dirtyRect.left <= 0 && dirtyRect.top <= 0 && dirtyRect.right >= width && dirtyRect.bottom >= height)) { dirtyRect.set(0, 0, width, height); } renderer->initViewport(width, height); renderer->setupFrameState(dirtyRect.left, dirtyRect.top, dirtyRect.right, dirtyRect.bottom, !isBlend()); displayList->defer(deferredState, 0); } void Layer::flush() { if (deferredList && !deferredList->isEmpty()) { renderer->setViewport(layer.getWidth(), layer.getHeight()); renderer->prepareDirty(dirtyRect.left, dirtyRect.top, dirtyRect.right, dirtyRect.bottom, !isBlend()); deferredList->flush(*renderer, dirtyRect); renderer->finish(); renderer = NULL; dirtyRect.setEmpty(); deferredList->clear(); } } }; // namespace uirenderer }; // namespace android libs/hwui/Layer.h +11 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,8 @@ namespace uirenderer { // Forward declarations class OpenGLRenderer; class DisplayList; class DeferredDisplayList; class DeferStateStruct; /** * A layer has dimensions and is backed by an OpenGL texture or FBO. Loading Loading @@ -271,6 +273,9 @@ struct Layer { return transform; } void defer(); void flush(); /** * Bounds of the layer. */ Loading Loading @@ -379,6 +384,12 @@ private: */ mat4 transform; /** * Used to defer display lists when the layer is updated with a * display list. */ DeferredDisplayList* deferredList; }; // struct Layer }; // namespace uirenderer Loading libs/hwui/LayerRenderer.cpp +4 −4 Original line number Diff line number Diff line Loading @@ -129,8 +129,8 @@ Region* LayerRenderer::getRegion() const { void LayerRenderer::generateMesh() { if (mLayer->region.isRect() || mLayer->region.isEmpty()) { if (mLayer->mesh) { delete mLayer->mesh; delete mLayer->meshIndices; delete[] mLayer->mesh; delete[] mLayer->meshIndices; mLayer->mesh = NULL; mLayer->meshIndices = NULL; Loading @@ -153,8 +153,8 @@ void LayerRenderer::generateMesh() { GLsizei elementCount = count * 6; if (mLayer->mesh && mLayer->meshElementCount < elementCount) { delete mLayer->mesh; delete mLayer->meshIndices; delete[] mLayer->mesh; delete[] mLayer->meshIndices; mLayer->mesh = NULL; mLayer->meshIndices = NULL; Loading Loading
core/java/android/view/HardwareRenderer.java +3 −0 Original line number Diff line number Diff line Loading @@ -428,6 +428,8 @@ public abstract class HardwareRenderer { interface HardwareDrawCallbacks { /** * Invoked before a view is drawn by a hardware renderer. * This method can be used to apply transformations to the * canvas but no drawing command should be issued. * * @param canvas The Canvas used to render the view. */ Loading @@ -435,6 +437,7 @@ public abstract class HardwareRenderer { /** * Invoked after a view is drawn by a hardware renderer. * It is safe to invoke drawing commands from this method. * * @param canvas The Canvas used to render the view. */ Loading
libs/hwui/DeferredDisplayList.h +2 −2 Original line number Diff line number Diff line Loading @@ -52,6 +52,8 @@ public: kOpBatch_Count, // Add other batch ids before this }; void clear(); bool isEmpty() { return mBatches.isEmpty(); } /** Loading @@ -78,8 +80,6 @@ private: */ void resetBatchingState(); void clear(); void storeStateOpBarrier(OpenGLRenderer& renderer, StateOp* op); void storeRestoreToCountBarrier(int newSaveCount); Loading
libs/hwui/Layer.cpp +45 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ #include <utils/Log.h> #include "DisplayList.h" #include "DeferredDisplayList.h" #include "Layer.h" #include "LayerRenderer.h" #include "OpenGLRenderer.h" Loading @@ -43,15 +45,18 @@ Layer::Layer(const uint32_t layerWidth, const uint32_t layerHeight) { fbo = 0; stencil = NULL; debugDrawUpdate = false; deferredList = NULL; Caches::getInstance().resourceCache.incrementRefcount(this); } Layer::~Layer() { if (mesh) delete mesh; if (meshIndices) delete meshIndices; if (colorFilter) Caches::getInstance().resourceCache.decrementRefcount(colorFilter); removeFbo(); deleteTexture(); delete[] mesh; delete[] meshIndices; delete deferredList; } uint32_t Layer::computeIdealWidth(uint32_t layerWidth) { Loading Loading @@ -133,5 +138,43 @@ void Layer::setColorFilter(SkiaColorFilter* filter) { } } void Layer::defer() { if (!deferredList) { deferredList = new DeferredDisplayList; } DeferStateStruct deferredState(*deferredList, *renderer, DisplayList::kReplayFlag_ClipChildren); const float width = layer.getWidth(); const float height = layer.getHeight(); if (dirtyRect.isEmpty() || (dirtyRect.left <= 0 && dirtyRect.top <= 0 && dirtyRect.right >= width && dirtyRect.bottom >= height)) { dirtyRect.set(0, 0, width, height); } renderer->initViewport(width, height); renderer->setupFrameState(dirtyRect.left, dirtyRect.top, dirtyRect.right, dirtyRect.bottom, !isBlend()); displayList->defer(deferredState, 0); } void Layer::flush() { if (deferredList && !deferredList->isEmpty()) { renderer->setViewport(layer.getWidth(), layer.getHeight()); renderer->prepareDirty(dirtyRect.left, dirtyRect.top, dirtyRect.right, dirtyRect.bottom, !isBlend()); deferredList->flush(*renderer, dirtyRect); renderer->finish(); renderer = NULL; dirtyRect.setEmpty(); deferredList->clear(); } } }; // namespace uirenderer }; // namespace android
libs/hwui/Layer.h +11 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,8 @@ namespace uirenderer { // Forward declarations class OpenGLRenderer; class DisplayList; class DeferredDisplayList; class DeferStateStruct; /** * A layer has dimensions and is backed by an OpenGL texture or FBO. Loading Loading @@ -271,6 +273,9 @@ struct Layer { return transform; } void defer(); void flush(); /** * Bounds of the layer. */ Loading Loading @@ -379,6 +384,12 @@ private: */ mat4 transform; /** * Used to defer display lists when the layer is updated with a * display list. */ DeferredDisplayList* deferredList; }; // struct Layer }; // namespace uirenderer Loading
libs/hwui/LayerRenderer.cpp +4 −4 Original line number Diff line number Diff line Loading @@ -129,8 +129,8 @@ Region* LayerRenderer::getRegion() const { void LayerRenderer::generateMesh() { if (mLayer->region.isRect() || mLayer->region.isEmpty()) { if (mLayer->mesh) { delete mLayer->mesh; delete mLayer->meshIndices; delete[] mLayer->mesh; delete[] mLayer->meshIndices; mLayer->mesh = NULL; mLayer->meshIndices = NULL; Loading @@ -153,8 +153,8 @@ void LayerRenderer::generateMesh() { GLsizei elementCount = count * 6; if (mLayer->mesh && mLayer->meshElementCount < elementCount) { delete mLayer->mesh; delete mLayer->meshIndices; delete[] mLayer->mesh; delete[] mLayer->meshIndices; mLayer->mesh = NULL; mLayer->meshIndices = NULL; Loading