diff options
Diffstat (limited to 'libs')
-rw-r--r-- | libs/androidfw/ResourceTypes.cpp | 6 | ||||
-rw-r--r-- | libs/hwui/DeferredLayerUpdater.cpp | 41 | ||||
-rw-r--r-- | libs/hwui/DeferredLayerUpdater.h | 8 | ||||
-rw-r--r-- | libs/hwui/DisplayListOp.h | 5 | ||||
-rwxr-xr-x | libs/hwui/OpenGLRenderer.cpp | 7 | ||||
-rw-r--r-- | libs/hwui/RenderNode.cpp | 11 | ||||
-rw-r--r-- | libs/hwui/Renderer.h | 11 | ||||
-rw-r--r-- | libs/hwui/ShadowTessellator.cpp | 2 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 5 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.h | 1 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.cpp | 21 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.h | 1 |
12 files changed, 59 insertions, 60 deletions
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp index 61a767c..8cef137 100644 --- a/libs/androidfw/ResourceTypes.cpp +++ b/libs/androidfw/ResourceTypes.cpp @@ -1185,11 +1185,7 @@ uint32_t ResXMLParser::getAttributeNameResID(size_t idx) const { int32_t id = getAttributeNameID(idx); if (id >= 0 && (size_t)id < mTree.mNumResIds) { - uint32_t resId = dtohl(mTree.mResIds[id]); - if (mTree.mDynamicRefTable == NULL || - mTree.mDynamicRefTable->lookupResourceId(&resId) == NO_ERROR) { - return resId; - } + return dtohl(mTree.mResIds[id]); } return 0; } diff --git a/libs/hwui/DeferredLayerUpdater.cpp b/libs/hwui/DeferredLayerUpdater.cpp index 836de45..a6d7e78 100644 --- a/libs/hwui/DeferredLayerUpdater.cpp +++ b/libs/hwui/DeferredLayerUpdater.cpp @@ -18,38 +18,52 @@ #include "OpenGLRenderer.h" #include "LayerRenderer.h" +#include "renderthread/EglManager.h" +#include "renderthread/RenderTask.h" namespace android { namespace uirenderer { -static void defaultLayerDestroyer(Layer* layer) { - Caches::getInstance().resourceCache.decrementRefcount(layer); -} +class DeleteLayerTask : public renderthread::RenderTask { +public: + DeleteLayerTask(renderthread::EglManager& eglManager, Layer* layer) + : mEglManager(eglManager) + , mLayer(layer) + {} + + virtual void run() { + mEglManager.requireGlContext(); + LayerRenderer::destroyLayer(mLayer); + mLayer = 0; + delete this; + } -DeferredLayerUpdater::DeferredLayerUpdater(Layer* layer, LayerDestroyer destroyer) +private: + renderthread::EglManager& mEglManager; + Layer* mLayer; +}; + +DeferredLayerUpdater::DeferredLayerUpdater(renderthread::RenderThread& thread, Layer* layer) : mSurfaceTexture(0) , mTransform(0) , mNeedsGLContextAttach(false) , mUpdateTexImage(false) , mLayer(layer) , mCaches(Caches::getInstance()) - , mDestroyer(destroyer) { + , mRenderThread(thread) { mWidth = mLayer->layer.getWidth(); mHeight = mLayer->layer.getHeight(); mBlend = mLayer->isBlend(); mColorFilter = SkSafeRef(mLayer->getColorFilter()); mAlpha = mLayer->getAlpha(); mMode = mLayer->getMode(); - - if (!mDestroyer) { - mDestroyer = defaultLayerDestroyer; - } } DeferredLayerUpdater::~DeferredLayerUpdater() { SkSafeUnref(mColorFilter); setTransform(0); - mDestroyer(mLayer); + mRenderThread.queue(new DeleteLayerTask(mRenderThread.eglManager(), mLayer)); + mLayer = 0; } void DeferredLayerUpdater::setPaint(const SkPaint* paint) { @@ -121,7 +135,12 @@ void DeferredLayerUpdater::doUpdateTexImage() { void DeferredLayerUpdater::detachSurfaceTexture() { if (mSurfaceTexture.get()) { - mSurfaceTexture->detachFromContext(); + mRenderThread.eglManager().requireGlContext(); + status_t err = mSurfaceTexture->detachFromContext(); + if (err != 0) { + // TODO: Elevate to fatal exception + ALOGE("Failed to detach SurfaceTexture from context %d", err); + } mSurfaceTexture = 0; mLayer->clearTexture(); } diff --git a/libs/hwui/DeferredLayerUpdater.h b/libs/hwui/DeferredLayerUpdater.h index c838c32..dda3e89 100644 --- a/libs/hwui/DeferredLayerUpdater.h +++ b/libs/hwui/DeferredLayerUpdater.h @@ -25,19 +25,18 @@ #include "Layer.h" #include "Rect.h" #include "RenderNode.h" +#include "renderthread/RenderThread.h" namespace android { namespace uirenderer { -typedef void (*LayerDestroyer)(Layer* layer); - // Container to hold the properties a layer should be set to at the start // of a render pass class DeferredLayerUpdater : public VirtualLightRefBase { public: // Note that DeferredLayerUpdater assumes it is taking ownership of the layer // and will not call incrementRef on it as a result. - ANDROID_API DeferredLayerUpdater(Layer* layer, LayerDestroyer = 0); + ANDROID_API DeferredLayerUpdater(renderthread::RenderThread& thread, Layer* layer); ANDROID_API ~DeferredLayerUpdater(); ANDROID_API bool setSize(uint32_t width, uint32_t height) { @@ -99,8 +98,7 @@ private: Layer* mLayer; Caches& mCaches; - - LayerDestroyer mDestroyer; + renderthread::RenderThread& mRenderThread; void doUpdateTexImage(); }; diff --git a/libs/hwui/DisplayListOp.h b/libs/hwui/DisplayListOp.h index cb3ef9b..d78c1cb 100644 --- a/libs/hwui/DisplayListOp.h +++ b/libs/hwui/DisplayListOp.h @@ -212,10 +212,13 @@ protected: // check state/paint for transparency if (mPaint) { + if (mPaint->getAlpha() != 0xFF) { + return false; + } if (mPaint->getShader() && !mPaint->getShader()->isOpaque()) { return false; } - if (mPaint->getAlpha() != 0xFF) { + if (Renderer::isBlendedColorFilter(mPaint->getColorFilter())) { return false; } } diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index eac06cb..7a094fd 100755 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -1734,13 +1734,6 @@ void OpenGLRenderer::accountForClear(SkXfermode::Mode mode) { } } -static bool isBlendedColorFilter(const SkColorFilter* filter) { - if (filter == NULL) { - return false; - } - return (filter->getFlags() & SkColorFilter::kAlphaUnchanged_Flag) == 0; -} - void OpenGLRenderer::setupDrawBlending(const Layer* layer, bool swapSrcDst) { SkXfermode::Mode mode = layer->getMode(); // When the blending mode is kClear_Mode, we need to use a modulate color diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index 254492f..70ff6e5 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -50,10 +50,13 @@ void RenderNode::outputLogBuffer(int fd) { fprintf(file, "\nRecent DisplayList operations\n"); logBuffer.outputCommands(file); - String8 cachesLog; - Caches::getInstance().dumpMemoryUsage(cachesLog); - fprintf(file, "\nCaches:\n%s", cachesLog.string()); - fprintf(file, "\n"); + if (Caches::hasInstance()) { + String8 cachesLog; + Caches::getInstance().dumpMemoryUsage(cachesLog); + fprintf(file, "\nCaches:\n%s\n", cachesLog.string()); + } else { + fprintf(file, "\nNo caches instance.\n"); + } fflush(file); } diff --git a/libs/hwui/Renderer.h b/libs/hwui/Renderer.h index 9cedd5a..a2f8c05 100644 --- a/libs/hwui/Renderer.h +++ b/libs/hwui/Renderer.h @@ -17,12 +17,13 @@ #ifndef ANDROID_HWUI_RENDERER_H #define ANDROID_HWUI_RENDERER_H +#include <SkColorFilter.h> +#include <SkPaint.h> #include <SkRegion.h> #include <utils/String8.h> #include "AssetAtlas.h" -#include "SkPaint.h" namespace android { @@ -81,6 +82,14 @@ public: && !paint.getColorFilter() && getXfermode(paint.getXfermode()) == SkXfermode::kSrcOver_Mode; } + + static bool isBlendedColorFilter(const SkColorFilter* filter) { + if (filter == NULL) { + return false; + } + return (filter->getFlags() & SkColorFilter::kAlphaUnchanged_Flag) == 0; + } + // ---------------------------------------------------------------------------- // Frame state operations // ---------------------------------------------------------------------------- diff --git a/libs/hwui/ShadowTessellator.cpp b/libs/hwui/ShadowTessellator.cpp index 35cc7a4..c1ffa0a 100644 --- a/libs/hwui/ShadowTessellator.cpp +++ b/libs/hwui/ShadowTessellator.cpp @@ -37,7 +37,7 @@ void ShadowTessellator::tessellateAmbientShadow(bool isCasterOpaque, // A bunch of parameters to tweak the shadow. // TODO: Allow some of these changable by debug settings or APIs. - float heightFactor = 1.0f / 86; + float heightFactor = 1.0f / 128; const float geomFactor = 64; Caches& caches = Caches::getInstance(); diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 1c416a7..b50a433 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -344,11 +344,6 @@ void CanvasContext::runWithGlContext(RenderTask* task) { task->run(); } -Layer* CanvasContext::createRenderLayer(int width, int height) { - requireSurface(); - return LayerRenderer::createRenderLayer(mRenderThread.renderState(), width, height); -} - Layer* CanvasContext::createTextureLayer() { requireSurface(); return LayerRenderer::createTextureLayer(mRenderThread.renderState()); diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 2460f6b..d4282fa 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -83,7 +83,6 @@ public: void runWithGlContext(RenderTask* task); - Layer* createRenderLayer(int width, int height); Layer* createTextureLayer(); ANDROID_API static void setTextureAtlas(RenderThread& thread, diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 9528874..047819d 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -257,31 +257,16 @@ void RenderProxy::enqueueDestroyLayer(Layer* layer) { RenderThread::getInstance().queue(task); } -CREATE_BRIDGE3(createDisplayListLayer, CanvasContext* context, int width, int height) { - Layer* layer = args->context->createRenderLayer(args->width, args->height); - if (!layer) return 0; - return new DeferredLayerUpdater(layer, RenderProxy::enqueueDestroyLayer); -} - -DeferredLayerUpdater* RenderProxy::createDisplayListLayer(int width, int height) { - SETUP_TASK(createDisplayListLayer); - args->width = width; - args->height = height; - args->context = mContext; - void* retval = postAndWait(task); - DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval); - return layer; -} - -CREATE_BRIDGE1(createTextureLayer, CanvasContext* context) { +CREATE_BRIDGE2(createTextureLayer, RenderThread* thread, CanvasContext* context) { Layer* layer = args->context->createTextureLayer(); if (!layer) return 0; - return new DeferredLayerUpdater(layer, RenderProxy::enqueueDestroyLayer); + return new DeferredLayerUpdater(*args->thread, layer); } DeferredLayerUpdater* RenderProxy::createTextureLayer() { SETUP_TASK(createTextureLayer); args->context = mContext; + args->thread = &mRenderThread; void* retval = postAndWait(task); DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval); return layer; diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index 8b8d99c..678e7e2 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -80,7 +80,6 @@ public: ANDROID_API void runWithGlContext(RenderTask* task); static void enqueueDestroyLayer(Layer* layer); - ANDROID_API DeferredLayerUpdater* createDisplayListLayer(int width, int height); ANDROID_API DeferredLayerUpdater* createTextureLayer(); ANDROID_API void buildLayer(RenderNode* node); ANDROID_API bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap); |