diff options
Diffstat (limited to 'libs/hwui/renderthread/CanvasContext.cpp')
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 137 |
1 files changed, 13 insertions, 124 deletions
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index bfa2ae7e72ff..92a749f3da33 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -18,26 +18,20 @@ #include <GpuMemoryTracker.h> #include "AnimationContext.h" -#include "Caches.h" #include "EglManager.h" #include "Frame.h" #include "LayerUpdateQueue.h" -#include "OpenGLPipeline.h" #include "Properties.h" #include "RenderThread.h" #include "hwui/Canvas.h" #include "pipeline/skia/SkiaOpenGLPipeline.h" #include "pipeline/skia/SkiaPipeline.h" #include "pipeline/skia/SkiaVulkanPipeline.h" -#include "protos/hwui.pb.h" -#include "renderstate/RenderState.h" -#include "renderstate/Stencil.h" #include "utils/GLUtils.h" #include "utils/TimeUtils.h" #include "../Properties.h" #include <cutils/properties.h> -#include <google/protobuf/io/zero_copy_stream_impl.h> #include <private/hwui/DrawGlInfo.h> #include <strings.h> @@ -51,8 +45,6 @@ #define TRIM_MEMORY_COMPLETE 80 #define TRIM_MEMORY_UI_HIDDEN 20 -#define ENABLE_RENDERNODE_SERIALIZATION false - #define LOG_FRAMETIME_MMA 0 #if LOG_FRAMETIME_MMA @@ -70,9 +62,6 @@ CanvasContext* CanvasContext::create(RenderThread& thread, bool translucent, auto renderType = Properties::getRenderPipelineType(); switch (renderType) { - case RenderPipelineType::OpenGL: - return new CanvasContext(thread, translucent, rootRenderNode, contextFactory, - std::make_unique<OpenGLPipeline>(thread)); case RenderPipelineType::SkiaGL: return new CanvasContext(thread, translucent, rootRenderNode, contextFactory, std::make_unique<skiapipeline::SkiaOpenGLPipeline>(thread)); @@ -86,29 +75,10 @@ CanvasContext* CanvasContext::create(RenderThread& thread, bool translucent, return nullptr; } -void CanvasContext::destroyLayer(RenderNode* node) { - auto renderType = Properties::getRenderPipelineType(); - switch (renderType) { - case RenderPipelineType::OpenGL: - OpenGLPipeline::destroyLayer(node); - break; - case RenderPipelineType::SkiaGL: - case RenderPipelineType::SkiaVulkan: - skiapipeline::SkiaPipeline::destroyLayer(node); - break; - default: - LOG_ALWAYS_FATAL("canvas context type %d not supported", (int32_t)renderType); - break; - } -} - void CanvasContext::invokeFunctor(const RenderThread& thread, Functor* functor) { ATRACE_CALL(); auto renderType = Properties::getRenderPipelineType(); switch (renderType) { - case RenderPipelineType::OpenGL: - OpenGLPipeline::invokeFunctor(thread, functor); - break; case RenderPipelineType::SkiaGL: skiapipeline::SkiaOpenGLPipeline::invokeFunctor(thread, functor); break; @@ -122,19 +92,7 @@ void CanvasContext::invokeFunctor(const RenderThread& thread, Functor* functor) } void CanvasContext::prepareToDraw(const RenderThread& thread, Bitmap* bitmap) { - auto renderType = Properties::getRenderPipelineType(); - switch (renderType) { - case RenderPipelineType::OpenGL: - OpenGLPipeline::prepareToDraw(thread, bitmap); - break; - case RenderPipelineType::SkiaGL: - case RenderPipelineType::SkiaVulkan: - skiapipeline::SkiaPipeline::prepareToDraw(thread, bitmap); - break; - default: - LOG_ALWAYS_FATAL("canvas context type %d not supported", (int32_t)renderType); - break; - } + skiapipeline::SkiaPipeline::prepareToDraw(thread, bitmap); } CanvasContext::CanvasContext(RenderThread& thread, bool translucent, RenderNode* rootRenderNode, @@ -150,13 +108,11 @@ CanvasContext::CanvasContext(RenderThread& thread, bool translucent, RenderNode* , mRenderPipeline(std::move(renderPipeline)) { rootRenderNode->makeRoot(); mRenderNodes.emplace_back(rootRenderNode); - mRenderThread.renderState().registerCanvasContext(this); mProfiler.setDensity(mRenderThread.mainDisplayInfo().density); } CanvasContext::~CanvasContext() { destroy(); - mRenderThread.renderState().unregisterCanvasContext(this); for (auto& node : mRenderNodes) { node->clearRoot(); } @@ -188,7 +144,7 @@ void CanvasContext::setSurface(sp<Surface>&& surface) { mNativeSurface = std::move(surface); - ColorMode colorMode = mWideColorGamut ? ColorMode::WideColorGamut : ColorMode::Srgb; + ColorMode colorMode = mWideColorGamut ? ColorMode::WideColorGamut : ColorMode::SRGB; bool hasSurface = mRenderPipeline->setSurface(mNativeSurface.get(), mSwapBehavior, colorMode); mFrameNumber = -1; @@ -453,7 +409,7 @@ void CanvasContext::draw() { SkRect windowDirty = computeDirtyRect(frame, &dirty); bool drew = mRenderPipeline->draw(frame, windowDirty, dirty, mLightGeometry, &mLayerUpdateQueue, - mContentDrawBounds, mOpaque, mWideColorGamut, mLightInfo, + mContentDrawBounds, mOpaque, mLightInfo, mRenderNodes, &(profiler())); int64_t frameCompleteNr = mFrameCompleteCallbacks.size() ? getFrameNumber() : -1; @@ -531,13 +487,6 @@ void CanvasContext::draw() { } GpuMemoryTracker::onFrameCompleted(); -#ifdef BUGREPORT_FONT_CACHE_USAGE - auto renderType = Properties::getRenderPipelineType(); - if (RenderPipelineType::OpenGL == renderType) { - Caches& caches = Caches::getInstance(); - caches.fontRenderer.getFontRenderer().historyTracker().frameCompleted(); - } -#endif } // Called by choreographer to do an RT-driven animation @@ -599,17 +548,12 @@ void CanvasContext::buildLayer(RenderNode* node) { // purposes when the frame is actually drawn node->setPropertyFieldsDirty(RenderNode::GENERIC); - mRenderPipeline->renderLayers(mLightGeometry, &mLayerUpdateQueue, mOpaque, mWideColorGamut, - mLightInfo); + mRenderPipeline->renderLayers(mLightGeometry, &mLayerUpdateQueue, mOpaque, mLightInfo); node->incStrong(nullptr); mPrefetchedLayers.insert(node); } -bool CanvasContext::copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap) { - return mRenderPipeline->copyLayerInto(layer, bitmap); -} - void CanvasContext::destroyHardwareResources() { stopDrawing(); if (mRenderPipeline->isContextReady()) { @@ -622,37 +566,15 @@ void CanvasContext::destroyHardwareResources() { } void CanvasContext::trimMemory(RenderThread& thread, int level) { - auto renderType = Properties::getRenderPipelineType(); - switch (renderType) { - case RenderPipelineType::OpenGL: { - // No context means nothing to free - if (!thread.eglManager().hasEglContext()) return; - ATRACE_CALL(); - if (level >= TRIM_MEMORY_COMPLETE) { - thread.renderState().flush(Caches::FlushMode::Full); - thread.eglManager().destroy(); - } else if (level >= TRIM_MEMORY_UI_HIDDEN) { - thread.renderState().flush(Caches::FlushMode::Moderate); - } - break; - } - case RenderPipelineType::SkiaGL: - case RenderPipelineType::SkiaVulkan: { - // No context means nothing to free - if (!thread.getGrContext()) return; - ATRACE_CALL(); - if (level >= TRIM_MEMORY_COMPLETE) { - thread.cacheManager().trimMemory(CacheManager::TrimMemoryMode::Complete); - thread.eglManager().destroy(); - thread.vulkanManager().destroy(); - } else if (level >= TRIM_MEMORY_UI_HIDDEN) { - thread.cacheManager().trimMemory(CacheManager::TrimMemoryMode::UiHidden); - } - break; - } - default: - LOG_ALWAYS_FATAL("canvas context type %d not supported", (int32_t)renderType); - break; + ATRACE_CALL(); + if (!thread.getGrContext()) return; + ATRACE_CALL(); + if (level >= TRIM_MEMORY_COMPLETE) { + thread.cacheManager().trimMemory(CacheManager::TrimMemoryMode::Complete); + thread.destroyGlContext(); + thread.vulkanManager().destroy(); + } else if (level >= TRIM_MEMORY_UI_HIDDEN) { + thread.cacheManager().trimMemory(CacheManager::TrimMemoryMode::UiHidden); } } @@ -673,39 +595,6 @@ void CanvasContext::setName(const std::string&& name) { mJankTracker.setDescription(JankTrackerType::Window, std::move(name)); } -void CanvasContext::serializeDisplayListTree() { -#if ENABLE_RENDERNODE_SERIALIZATION - using namespace google::protobuf::io; - char package[128]; - // Check whether tracing is enabled for this process. - FILE* file = fopen("/proc/self/cmdline", "r"); - if (file) { - if (!fgets(package, 128, file)) { - ALOGE("Error reading cmdline: %s (%d)", strerror(errno), errno); - fclose(file); - return; - } - fclose(file); - } else { - ALOGE("Error opening /proc/self/cmdline: %s (%d)", strerror(errno), errno); - return; - } - char path[1024]; - snprintf(path, 1024, "/data/data/%s/cache/rendertree_dump", package); - int fd = open(path, O_CREAT | O_WRONLY, S_IRWXU | S_IRGRP | S_IROTH); - if (fd == -1) { - ALOGD("Failed to open '%s'", path); - return; - } - proto::RenderNode tree; - // TODO: Streaming writes? - mRootRenderNode->copyTo(&tree); - std::string data = tree.SerializeAsString(); - write(fd, data.c_str(), data.length()); - close(fd); -#endif -} - void CanvasContext::waitOnFences() { if (mFrameFences.size()) { ATRACE_CALL(); |