X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=libs%2Fhwui%2Frenderthread%2FRenderProxy.cpp;h=088c65b939ef42bd25d284f806c51b218160d29c;hb=d5a4a1aac980c304d6f46f07f15bfc5c94d8f9d0;hp=6d063a4b0ce001638b1967ad802f56c835ac3ce9;hpb=51c23674ab6340d7a2f2be6b3ff515e7033e118a;p=android-x86%2Fframeworks-base.git diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 6d063a4b0ce0..088c65b939ef 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -16,14 +16,14 @@ #include "RenderProxy.h" -#include "CanvasContext.h" -#include "RenderTask.h" -#include "RenderThread.h" - -#include "../DeferredLayerUpdater.h" -#include "../DisplayList.h" -#include "../LayerRenderer.h" -#include "../Rect.h" +#include "DeferredLayerUpdater.h" +#include "DisplayList.h" +#include "LayerRenderer.h" +#include "Rect.h" +#include "renderthread/CanvasContext.h" +#include "renderthread/RenderTask.h" +#include "renderthread/RenderThread.h" +#include "utils/Macros.h" namespace android { namespace uirenderer { @@ -52,6 +52,11 @@ namespace renderthread { MethodInvokeRenderTask* task = new MethodInvokeRenderTask((RunnableMethod) Bridge_ ## method); \ ARGS(method) *args = (ARGS(method) *) task->payload() +HWUI_ENUM(DumpFlags, + kFrameStats = 1 << 0, + kReset = 1 << 1, +); + CREATE_BRIDGE4(createContext, RenderThread* thread, bool translucent, RenderNode* rootRenderNode, IContextFactory* contextFactory) { return new CanvasContext(*args->thread, args->translucent, @@ -92,7 +97,7 @@ void RenderProxy::destroyContext() { } CREATE_BRIDGE2(setFrameInterval, RenderThread* thread, nsecs_t frameIntervalNanos) { - args->thread->timeLord().setFrameInterval(args->frameIntervalNanos); + args->thread->setFrameInterval(args->frameIntervalNanos); return NULL; } @@ -175,7 +180,8 @@ CREATE_BRIDGE7(setup, CanvasContext* context, int width, int height, } void RenderProxy::setup(int width, int height, const Vector3& lightCenter, float lightRadius, - uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha) { + uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha, float density) { + mDrawFrameTask.setDensity(density); SETUP_TASK(setup); args->context = mContext; args->width = width; @@ -199,10 +205,12 @@ void RenderProxy::setOpaque(bool opaque) { post(task); } -int RenderProxy::syncAndDrawFrame(nsecs_t frameTimeNanos, nsecs_t recordDurationNanos, - float density) { - mDrawFrameTask.setDensity(density); - return mDrawFrameTask.drawFrame(frameTimeNanos, recordDurationNanos); +int64_t* RenderProxy::frameInfo() { + return mDrawFrameTask.frameInfo(); +} + +int RenderProxy::syncAndDrawFrame() { + return mDrawFrameTask.drawFrame(); } CREATE_BRIDGE1(destroy, CanvasContext* context) { @@ -371,19 +379,28 @@ void RenderProxy::notifyFramePending() { mRenderThread.queueAtFront(task); } -CREATE_BRIDGE2(dumpProfileInfo, CanvasContext* context, int fd) { +CREATE_BRIDGE3(dumpProfileInfo, CanvasContext* context, int fd, int dumpFlags) { args->context->profiler().dumpData(args->fd); + + if (args->dumpFlags & DumpFlags::kFrameStats) { + args->context->dumpFrames(args->fd); + } + if (args->dumpFlags & DumpFlags::kReset) { + args->context->resetFrameStats(); + } return NULL; } -void RenderProxy::dumpProfileInfo(int fd) { +void RenderProxy::dumpProfileInfo(int fd, int dumpFlags) { SETUP_TASK(dumpProfileInfo); args->context = mContext; args->fd = fd; + args->dumpFlags = dumpFlags; postAndWait(task); } -CREATE_BRIDGE1(outputLogBuffer, int fd) { +CREATE_BRIDGE2(outputLogBuffer, int fd, RenderThread* thread) { + args->thread->jankTracker().dump(args->fd); RenderNode::outputLogBuffer(args->fd); return NULL; } @@ -391,6 +408,7 @@ CREATE_BRIDGE1(outputLogBuffer, int fd) { void RenderProxy::outputLogBuffer(int fd) { SETUP_TASK(outputLogBuffer); args->fd = fd; + args->thread = &RenderThread::getInstance(); staticPostAndWait(task); }