Bug:
20824843
Not really a proper "benchmark mode" but it turns out
we already have reasonably good profile data, so tweak
the test app to spit it out after a run.
Change-Id: Iaee9c0d61b5508daf282fe5f95d0b37ee419a8f1
mRenderThread.queueAtFront(task);
}
-CREATE_BRIDGE3(dumpProfileInfo, CanvasContext* context, int fd, int dumpFlags) {
+CREATE_BRIDGE4(dumpProfileInfo, CanvasContext* context, RenderThread* thread,
+ int fd, int dumpFlags) {
args->context->profiler().dumpData(args->fd);
+ args->thread->jankTracker().dump(args->fd);
if (args->dumpFlags & DumpFlags::kFrameStats) {
args->context->dumpFrames(args->fd);
}
void RenderProxy::dumpProfileInfo(int fd, int dumpFlags) {
SETUP_TASK(dumpProfileInfo);
args->context = mContext;
+ args->thread = &mRenderThread;
args->fd = fd;
args->dumpFlags = dumpFlags;
postAndWait(task);
}
+CREATE_BRIDGE1(resetProfileInfo, CanvasContext* context) {
+ args->context->resetFrameStats();
+ return nullptr;
+}
+
+void RenderProxy::resetProfileInfo() {
+ SETUP_TASK(resetProfileInfo);
+ args->context = mContext;
+ postAndWait(task);
+}
+
CREATE_BRIDGE2(dumpGraphicsMemory, int fd, RenderThread* thread) {
args->thread->jankTracker().dump(args->fd);
ANDROID_API void notifyFramePending();
ANDROID_API void dumpProfileInfo(int fd, int dumpFlags);
+ // Not exported, only used for testing
+ void resetProfileInfo();
ANDROID_API static void dumpGraphicsMemory(int fd);
ANDROID_API void setTextureAtlas(const sp<GraphicBuffer>& buffer, int64_t* map, size_t size);
}
void TestContext::waitForVsync() {
+#if HWUI_NULL_GPU
+ return;
+#endif
+
// Request vsync
mDisplayEventReceiver.requestNextVsync();
} // namespace test
} // namespace uirenderer
} // namespace android
-
--- /dev/null
+mmm -j8 frameworks/base/libs/hwui/tests/ &&
+ adb push $OUT/data/local/tmp/hwuitest /data/local/tmp/hwuitest &&
+ adb shell /data/local/tmp/hwuitest
+
+
+Command arguments:
+hwuitest [testname]
+
+Default test is 'shadowgrid'
+
+List of tests:
+
+shadowgrid: creates a grid of rounded rects that cast shadows, high CPU & GPU load
+
+rectgrid: creates a grid of 1x1 rects
+
+oval: draws 1 oval
* limitations under the License.
*/
-#include <stdio.h>
-
#include <cutils/log.h>
#include <gui/Surface.h>
#include <ui/PixelFormat.h>
#include "TestContext.h"
+#include <stdio.h>
+#include <unistd.h>
+
using namespace android;
using namespace android::uirenderer;
using namespace android::uirenderer::renderthread;
animation.createContent(width, height, renderer);
endRecording(renderer, rootNode);
+ // Do a few cold runs then reset the stats so that the caches are all hot
+ for (int i = 0; i < 3; i++) {
+ testContext.waitForVsync();
+ proxy->syncAndDrawFrame();
+ }
+ proxy->resetProfileInfo();
+
for (int i = 0; i < animation.getFrameCount(); i++) {
-#if !HWUI_NULL_GPU
testContext.waitForVsync();
-#endif
+ // workaround b/20853441
+ proxy->fence();
ATRACE_NAME("UI-Draw Frame");
+ nsecs_t vsync = systemTime(CLOCK_MONOTONIC);
+ UiFrameInfoBuilder(proxy->frameInfo())
+ .setVsync(vsync, vsync);
animation.doFrame(i);
proxy->syncAndDrawFrame();
}
+ proxy->dumpProfileInfo(STDOUT_FILENO, 0);
rootNode->decStrong(nullptr);
}
};