summaryrefslogtreecommitdiff
path: root/libs/hwui/renderthread/RenderThread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/hwui/renderthread/RenderThread.cpp')
-rw-r--r--libs/hwui/renderthread/RenderThread.cpp71
1 files changed, 69 insertions, 2 deletions
diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp
index 1450ec98dabf..13af2c4d15e8 100644
--- a/libs/hwui/renderthread/RenderThread.cpp
+++ b/libs/hwui/renderthread/RenderThread.cpp
@@ -16,8 +16,12 @@
#include "RenderThread.h"
-#include "../renderstate/RenderState.h"
-#include "../pipeline/skia/SkiaOpenGLReadback.h"
+#include "hwui/Bitmap.h"
+#include "renderstate/RenderState.h"
+#include "renderthread/OpenGLPipeline.h"
+#include "pipeline/skia/SkiaOpenGLReadback.h"
+#include "pipeline/skia/SkiaOpenGLPipeline.h"
+#include "pipeline/skia/SkiaVulkanPipeline.h"
#include "CanvasContext.h"
#include "EglManager.h"
#include "OpenGLReadback.h"
@@ -198,6 +202,45 @@ void RenderThread::initThreadLocals() {
mRenderState = new RenderState(*this);
mJankTracker = new JankTracker(mDisplayInfo);
mVkManager = new VulkanManager(*this);
+ mCacheManager = new CacheManager(mDisplayInfo);
+}
+
+void RenderThread::dumpGraphicsMemory(int fd) {
+ jankTracker().dump(fd);
+
+ String8 cachesOutput;
+ String8 pipeline;
+ auto renderType = Properties::getRenderPipelineType();
+ switch (renderType) {
+ case RenderPipelineType::OpenGL: {
+ if (Caches::hasInstance()) {
+ cachesOutput.appendFormat("Caches:\n");
+ Caches::getInstance().dumpMemoryUsage(cachesOutput);
+ } else {
+ cachesOutput.appendFormat("No caches instance.");
+ }
+ pipeline.appendFormat("FrameBuilder");
+ break;
+ }
+ case RenderPipelineType::SkiaGL: {
+ mCacheManager->dumpMemoryUsage(cachesOutput, mRenderState);
+ pipeline.appendFormat("Skia (OpenGL)");
+ break;
+ }
+ case RenderPipelineType::SkiaVulkan: {
+ mCacheManager->dumpMemoryUsage(cachesOutput, mRenderState);
+ pipeline.appendFormat("Skia (Vulkan)");
+ break;
+ }
+ default:
+ LOG_ALWAYS_FATAL("canvas context type %d not supported", (int32_t) renderType);
+ break;
+ }
+
+ FILE *file = fdopen(fd, "a");
+ fprintf(file, "\n%s\n", cachesOutput.string());
+ fprintf(file, "\nPipeline=%s\n", pipeline.string());
+ fflush(file);
}
Readback& RenderThread::readback() {
@@ -224,6 +267,14 @@ Readback& RenderThread::readback() {
return *mReadback;
}
+void RenderThread::setGrContext(GrContext* context) {
+ mCacheManager->reset(context);
+ if (mGrContext.get()) {
+ mGrContext->releaseResourcesAndAbandonContext();
+ }
+ mGrContext.reset(context);
+}
+
int RenderThread::displayEventReceiverCallback(int fd, int events, void* data) {
if (events & (Looper::EVENT_ERROR | Looper::EVENT_HANGUP)) {
ALOGE("Display event receiver pipe was closed or an error occurred. "
@@ -433,6 +484,22 @@ RenderTask* RenderThread::nextTask(nsecs_t* nextWakeup) {
return next;
}
+sk_sp<Bitmap> RenderThread::allocateHardwareBitmap(SkBitmap& skBitmap) {
+ auto renderType = Properties::getRenderPipelineType();
+ switch (renderType) {
+ case RenderPipelineType::OpenGL:
+ return OpenGLPipeline::allocateHardwareBitmap(*this, skBitmap);
+ case RenderPipelineType::SkiaGL:
+ return skiapipeline::SkiaOpenGLPipeline::allocateHardwareBitmap(*this, skBitmap);
+ case RenderPipelineType::SkiaVulkan:
+ return skiapipeline::SkiaVulkanPipeline::allocateHardwareBitmap(*this, skBitmap);
+ default:
+ LOG_ALWAYS_FATAL("canvas context type %d not supported", (int32_t) renderType);
+ break;
+ }
+ return nullptr;
+}
+
} /* namespace renderthread */
} /* namespace uirenderer */
} /* namespace android */