Loading services/surfaceflinger/FrameTimeline/FrameTimeline.cpp +13 −0 Original line number Original line Diff line number Diff line Loading @@ -207,6 +207,17 @@ FrameTimelineEvent::PresentType toProto(FramePresentMetadata presentMetadata) { } } } } FrameTimelineEvent::PredictionType toProto(PredictionState predictionState) { switch (predictionState) { case PredictionState::Valid: return FrameTimelineEvent::PREDICTION_VALID; case PredictionState::Expired: return FrameTimelineEvent::PREDICTION_EXPIRED; case PredictionState::None: return FrameTimelineEvent::PREDICTION_UNKNOWN; } } int32_t jankTypeBitmaskToProto(int32_t jankType) { int32_t jankTypeBitmaskToProto(int32_t jankType) { if (jankType == JankType::None) { if (jankType == JankType::None) { return FrameTimelineEvent::JANK_NONE; return FrameTimelineEvent::JANK_NONE; Loading Loading @@ -628,6 +639,7 @@ void SurfaceFrame::traceActuals(int64_t displayFrameToken) const { FrameReadyMetadata::OnTimeFinish); FrameReadyMetadata::OnTimeFinish); actualSurfaceFrameStartEvent->set_gpu_composition(mGpuComposition); actualSurfaceFrameStartEvent->set_gpu_composition(mGpuComposition); actualSurfaceFrameStartEvent->set_jank_type(jankTypeBitmaskToProto(mJankType)); actualSurfaceFrameStartEvent->set_jank_type(jankTypeBitmaskToProto(mJankType)); actualSurfaceFrameStartEvent->set_prediction_type(toProto(mPredictionState)); }); }); // Actual timeline end // Actual timeline end Loading Loading @@ -968,6 +980,7 @@ void FrameTimeline::DisplayFrame::traceActuals(pid_t surfaceFlingerPid) const { FrameReadyMetadata::OnTimeFinish); FrameReadyMetadata::OnTimeFinish); actualDisplayFrameStartEvent->set_gpu_composition(mGpuComposition); actualDisplayFrameStartEvent->set_gpu_composition(mGpuComposition); actualDisplayFrameStartEvent->set_jank_type(jankTypeBitmaskToProto(mJankType)); actualDisplayFrameStartEvent->set_jank_type(jankTypeBitmaskToProto(mJankType)); actualDisplayFrameStartEvent->set_prediction_type(toProto(mPredictionState)); }); }); // Actual timeline end // Actual timeline end Loading services/surfaceflinger/tests/unittests/FrameTimelineTest.cpp +19 −7 Original line number Original line Diff line number Diff line Loading @@ -40,6 +40,7 @@ using ProtoActualSurfaceFrameStart = perfetto::protos::FrameTimelineEvent_Actual using ProtoFrameEnd = perfetto::protos::FrameTimelineEvent_FrameEnd; using ProtoFrameEnd = perfetto::protos::FrameTimelineEvent_FrameEnd; using ProtoPresentType = perfetto::protos::FrameTimelineEvent_PresentType; using ProtoPresentType = perfetto::protos::FrameTimelineEvent_PresentType; using ProtoJankType = perfetto::protos::FrameTimelineEvent_JankType; using ProtoJankType = perfetto::protos::FrameTimelineEvent_JankType; using ProtoPredictionType = perfetto::protos::FrameTimelineEvent_PredictionType; namespace android::frametimeline { namespace android::frametimeline { Loading Loading @@ -717,7 +718,7 @@ ProtoExpectedDisplayFrameStart createProtoExpectedDisplayFrameStart(int64_t cook ProtoActualDisplayFrameStart createProtoActualDisplayFrameStart( ProtoActualDisplayFrameStart createProtoActualDisplayFrameStart( int64_t cookie, int64_t token, pid_t pid, ProtoPresentType presentType, bool onTimeFinish, int64_t cookie, int64_t token, pid_t pid, ProtoPresentType presentType, bool onTimeFinish, bool gpuComposition, ProtoJankType jankType) { bool gpuComposition, ProtoJankType jankType, ProtoPredictionType predictionType) { ProtoActualDisplayFrameStart proto; ProtoActualDisplayFrameStart proto; proto.set_cookie(cookie); proto.set_cookie(cookie); proto.set_token(token); proto.set_token(token); Loading @@ -726,6 +727,7 @@ ProtoActualDisplayFrameStart createProtoActualDisplayFrameStart( proto.set_on_time_finish(onTimeFinish); proto.set_on_time_finish(onTimeFinish); proto.set_gpu_composition(gpuComposition); proto.set_gpu_composition(gpuComposition); proto.set_jank_type(jankType); proto.set_jank_type(jankType); proto.set_prediction_type(predictionType); return proto; return proto; } } Loading @@ -745,7 +747,7 @@ ProtoExpectedSurfaceFrameStart createProtoExpectedSurfaceFrameStart(int64_t cook ProtoActualSurfaceFrameStart createProtoActualSurfaceFrameStart( ProtoActualSurfaceFrameStart createProtoActualSurfaceFrameStart( int64_t cookie, int64_t token, int64_t displayFrameToken, pid_t pid, std::string layerName, int64_t cookie, int64_t token, int64_t displayFrameToken, pid_t pid, std::string layerName, ProtoPresentType presentType, bool onTimeFinish, bool gpuComposition, ProtoPresentType presentType, bool onTimeFinish, bool gpuComposition, ProtoJankType jankType) { ProtoJankType jankType, ProtoPredictionType predictionType) { ProtoActualSurfaceFrameStart proto; ProtoActualSurfaceFrameStart proto; proto.set_cookie(cookie); proto.set_cookie(cookie); proto.set_token(token); proto.set_token(token); Loading @@ -756,6 +758,7 @@ ProtoActualSurfaceFrameStart createProtoActualSurfaceFrameStart( proto.set_on_time_finish(onTimeFinish); proto.set_on_time_finish(onTimeFinish); proto.set_gpu_composition(gpuComposition); proto.set_gpu_composition(gpuComposition); proto.set_jank_type(jankType); proto.set_jank_type(jankType); proto.set_prediction_type(predictionType); return proto; return proto; } } Loading Loading @@ -796,6 +799,8 @@ void validateTraceEvent(const ProtoActualDisplayFrameStart& received, EXPECT_EQ(received.gpu_composition(), source.gpu_composition()); EXPECT_EQ(received.gpu_composition(), source.gpu_composition()); ASSERT_TRUE(received.has_jank_type()); ASSERT_TRUE(received.has_jank_type()); EXPECT_EQ(received.jank_type(), source.jank_type()); EXPECT_EQ(received.jank_type(), source.jank_type()); ASSERT_TRUE(received.has_prediction_type()); EXPECT_EQ(received.prediction_type(), source.prediction_type()); } } void validateTraceEvent(const ProtoExpectedSurfaceFrameStart& received, void validateTraceEvent(const ProtoExpectedSurfaceFrameStart& received, Loading Loading @@ -841,6 +846,8 @@ void validateTraceEvent(const ProtoActualSurfaceFrameStart& received, EXPECT_EQ(received.gpu_composition(), source.gpu_composition()); EXPECT_EQ(received.gpu_composition(), source.gpu_composition()); ASSERT_TRUE(received.has_jank_type()); ASSERT_TRUE(received.has_jank_type()); EXPECT_EQ(received.jank_type(), source.jank_type()); EXPECT_EQ(received.jank_type(), source.jank_type()); ASSERT_TRUE(received.has_prediction_type()); EXPECT_EQ(received.prediction_type(), source.prediction_type()); } } void validateTraceEvent(const ProtoFrameEnd& received, const ProtoFrameEnd& source) { void validateTraceEvent(const ProtoFrameEnd& received, const ProtoFrameEnd& source) { Loading Loading @@ -869,7 +876,8 @@ TEST_F(FrameTimelineTest, traceDisplayFrame_emitsValidTracePacket) { createProtoActualDisplayFrameStart(traceCookie + 2, displayFrameToken1, createProtoActualDisplayFrameStart(traceCookie + 2, displayFrameToken1, kSurfaceFlingerPid, kSurfaceFlingerPid, FrameTimelineEvent::PRESENT_ON_TIME, true, false, FrameTimelineEvent::PRESENT_ON_TIME, true, false, FrameTimelineEvent::JANK_NONE); FrameTimelineEvent::JANK_NONE, FrameTimelineEvent::PREDICTION_VALID); auto protoActualDisplayFrameEnd = createProtoFrameEnd(traceCookie + 2); auto protoActualDisplayFrameEnd = createProtoFrameEnd(traceCookie + 2); addEmptyDisplayFrame(); addEmptyDisplayFrame(); Loading Loading @@ -944,7 +952,8 @@ TEST_F(FrameTimelineTest, traceDisplayFrame_predictionExpiredDoesNotTraceExpecte createProtoActualDisplayFrameStart(traceCookie + 1, displayFrameToken1, createProtoActualDisplayFrameStart(traceCookie + 1, displayFrameToken1, kSurfaceFlingerPid, kSurfaceFlingerPid, FrameTimelineEvent::PRESENT_UNSPECIFIED, false, FrameTimelineEvent::PRESENT_UNSPECIFIED, false, false, FrameTimelineEvent::JANK_UNKNOWN); false, FrameTimelineEvent::JANK_UNKNOWN, FrameTimelineEvent::PREDICTION_EXPIRED); auto protoActualDisplayFrameEnd = createProtoFrameEnd(traceCookie + 1); auto protoActualDisplayFrameEnd = createProtoFrameEnd(traceCookie + 1); addEmptyDisplayFrame(); addEmptyDisplayFrame(); Loading Loading @@ -1014,7 +1023,8 @@ TEST_F(FrameTimelineTest, traceSurfaceFrame_emitsValidTracePacket) { createProtoActualSurfaceFrameStart(traceCookie + 2, surfaceFrameToken, createProtoActualSurfaceFrameStart(traceCookie + 2, surfaceFrameToken, displayFrameToken1, sPidOne, sLayerNameOne, displayFrameToken1, sPidOne, sLayerNameOne, FrameTimelineEvent::PRESENT_DROPPED, false, false, FrameTimelineEvent::PRESENT_DROPPED, false, false, FrameTimelineEvent::JANK_NONE); FrameTimelineEvent::JANK_NONE, FrameTimelineEvent::PREDICTION_VALID); auto protoDroppedSurfaceFrameActualEnd = createProtoFrameEnd(traceCookie + 2); auto protoDroppedSurfaceFrameActualEnd = createProtoFrameEnd(traceCookie + 2); auto protoPresentedSurfaceFrameExpectedStart = auto protoPresentedSurfaceFrameExpectedStart = Loading @@ -1025,7 +1035,8 @@ TEST_F(FrameTimelineTest, traceSurfaceFrame_emitsValidTracePacket) { createProtoActualSurfaceFrameStart(traceCookie + 4, surfaceFrameToken, createProtoActualSurfaceFrameStart(traceCookie + 4, surfaceFrameToken, displayFrameToken1, sPidOne, sLayerNameOne, displayFrameToken1, sPidOne, sLayerNameOne, FrameTimelineEvent::PRESENT_ON_TIME, true, false, FrameTimelineEvent::PRESENT_ON_TIME, true, false, FrameTimelineEvent::JANK_NONE); FrameTimelineEvent::JANK_NONE, FrameTimelineEvent::PREDICTION_VALID); auto protoPresentedSurfaceFrameActualEnd = createProtoFrameEnd(traceCookie + 4); auto protoPresentedSurfaceFrameActualEnd = createProtoFrameEnd(traceCookie + 4); // Set up the display frame // Set up the display frame Loading Loading @@ -1167,7 +1178,8 @@ TEST_F(FrameTimelineTest, traceSurfaceFrame_predictionExpiredDoesNotTraceExpecte createProtoActualSurfaceFrameStart(traceCookie + 1, surfaceFrameToken, createProtoActualSurfaceFrameStart(traceCookie + 1, surfaceFrameToken, displayFrameToken, sPidOne, sLayerNameOne, displayFrameToken, sPidOne, sLayerNameOne, FrameTimelineEvent::PRESENT_UNSPECIFIED, false, FrameTimelineEvent::PRESENT_UNSPECIFIED, false, false, FrameTimelineEvent::JANK_UNKNOWN); false, FrameTimelineEvent::JANK_UNKNOWN, FrameTimelineEvent::PREDICTION_EXPIRED); auto protoActualSurfaceFrameEnd = createProtoFrameEnd(traceCookie + 1); auto protoActualSurfaceFrameEnd = createProtoFrameEnd(traceCookie + 1); // Set up the display frame // Set up the display frame Loading Loading
services/surfaceflinger/FrameTimeline/FrameTimeline.cpp +13 −0 Original line number Original line Diff line number Diff line Loading @@ -207,6 +207,17 @@ FrameTimelineEvent::PresentType toProto(FramePresentMetadata presentMetadata) { } } } } FrameTimelineEvent::PredictionType toProto(PredictionState predictionState) { switch (predictionState) { case PredictionState::Valid: return FrameTimelineEvent::PREDICTION_VALID; case PredictionState::Expired: return FrameTimelineEvent::PREDICTION_EXPIRED; case PredictionState::None: return FrameTimelineEvent::PREDICTION_UNKNOWN; } } int32_t jankTypeBitmaskToProto(int32_t jankType) { int32_t jankTypeBitmaskToProto(int32_t jankType) { if (jankType == JankType::None) { if (jankType == JankType::None) { return FrameTimelineEvent::JANK_NONE; return FrameTimelineEvent::JANK_NONE; Loading Loading @@ -628,6 +639,7 @@ void SurfaceFrame::traceActuals(int64_t displayFrameToken) const { FrameReadyMetadata::OnTimeFinish); FrameReadyMetadata::OnTimeFinish); actualSurfaceFrameStartEvent->set_gpu_composition(mGpuComposition); actualSurfaceFrameStartEvent->set_gpu_composition(mGpuComposition); actualSurfaceFrameStartEvent->set_jank_type(jankTypeBitmaskToProto(mJankType)); actualSurfaceFrameStartEvent->set_jank_type(jankTypeBitmaskToProto(mJankType)); actualSurfaceFrameStartEvent->set_prediction_type(toProto(mPredictionState)); }); }); // Actual timeline end // Actual timeline end Loading Loading @@ -968,6 +980,7 @@ void FrameTimeline::DisplayFrame::traceActuals(pid_t surfaceFlingerPid) const { FrameReadyMetadata::OnTimeFinish); FrameReadyMetadata::OnTimeFinish); actualDisplayFrameStartEvent->set_gpu_composition(mGpuComposition); actualDisplayFrameStartEvent->set_gpu_composition(mGpuComposition); actualDisplayFrameStartEvent->set_jank_type(jankTypeBitmaskToProto(mJankType)); actualDisplayFrameStartEvent->set_jank_type(jankTypeBitmaskToProto(mJankType)); actualDisplayFrameStartEvent->set_prediction_type(toProto(mPredictionState)); }); }); // Actual timeline end // Actual timeline end Loading
services/surfaceflinger/tests/unittests/FrameTimelineTest.cpp +19 −7 Original line number Original line Diff line number Diff line Loading @@ -40,6 +40,7 @@ using ProtoActualSurfaceFrameStart = perfetto::protos::FrameTimelineEvent_Actual using ProtoFrameEnd = perfetto::protos::FrameTimelineEvent_FrameEnd; using ProtoFrameEnd = perfetto::protos::FrameTimelineEvent_FrameEnd; using ProtoPresentType = perfetto::protos::FrameTimelineEvent_PresentType; using ProtoPresentType = perfetto::protos::FrameTimelineEvent_PresentType; using ProtoJankType = perfetto::protos::FrameTimelineEvent_JankType; using ProtoJankType = perfetto::protos::FrameTimelineEvent_JankType; using ProtoPredictionType = perfetto::protos::FrameTimelineEvent_PredictionType; namespace android::frametimeline { namespace android::frametimeline { Loading Loading @@ -717,7 +718,7 @@ ProtoExpectedDisplayFrameStart createProtoExpectedDisplayFrameStart(int64_t cook ProtoActualDisplayFrameStart createProtoActualDisplayFrameStart( ProtoActualDisplayFrameStart createProtoActualDisplayFrameStart( int64_t cookie, int64_t token, pid_t pid, ProtoPresentType presentType, bool onTimeFinish, int64_t cookie, int64_t token, pid_t pid, ProtoPresentType presentType, bool onTimeFinish, bool gpuComposition, ProtoJankType jankType) { bool gpuComposition, ProtoJankType jankType, ProtoPredictionType predictionType) { ProtoActualDisplayFrameStart proto; ProtoActualDisplayFrameStart proto; proto.set_cookie(cookie); proto.set_cookie(cookie); proto.set_token(token); proto.set_token(token); Loading @@ -726,6 +727,7 @@ ProtoActualDisplayFrameStart createProtoActualDisplayFrameStart( proto.set_on_time_finish(onTimeFinish); proto.set_on_time_finish(onTimeFinish); proto.set_gpu_composition(gpuComposition); proto.set_gpu_composition(gpuComposition); proto.set_jank_type(jankType); proto.set_jank_type(jankType); proto.set_prediction_type(predictionType); return proto; return proto; } } Loading @@ -745,7 +747,7 @@ ProtoExpectedSurfaceFrameStart createProtoExpectedSurfaceFrameStart(int64_t cook ProtoActualSurfaceFrameStart createProtoActualSurfaceFrameStart( ProtoActualSurfaceFrameStart createProtoActualSurfaceFrameStart( int64_t cookie, int64_t token, int64_t displayFrameToken, pid_t pid, std::string layerName, int64_t cookie, int64_t token, int64_t displayFrameToken, pid_t pid, std::string layerName, ProtoPresentType presentType, bool onTimeFinish, bool gpuComposition, ProtoPresentType presentType, bool onTimeFinish, bool gpuComposition, ProtoJankType jankType) { ProtoJankType jankType, ProtoPredictionType predictionType) { ProtoActualSurfaceFrameStart proto; ProtoActualSurfaceFrameStart proto; proto.set_cookie(cookie); proto.set_cookie(cookie); proto.set_token(token); proto.set_token(token); Loading @@ -756,6 +758,7 @@ ProtoActualSurfaceFrameStart createProtoActualSurfaceFrameStart( proto.set_on_time_finish(onTimeFinish); proto.set_on_time_finish(onTimeFinish); proto.set_gpu_composition(gpuComposition); proto.set_gpu_composition(gpuComposition); proto.set_jank_type(jankType); proto.set_jank_type(jankType); proto.set_prediction_type(predictionType); return proto; return proto; } } Loading Loading @@ -796,6 +799,8 @@ void validateTraceEvent(const ProtoActualDisplayFrameStart& received, EXPECT_EQ(received.gpu_composition(), source.gpu_composition()); EXPECT_EQ(received.gpu_composition(), source.gpu_composition()); ASSERT_TRUE(received.has_jank_type()); ASSERT_TRUE(received.has_jank_type()); EXPECT_EQ(received.jank_type(), source.jank_type()); EXPECT_EQ(received.jank_type(), source.jank_type()); ASSERT_TRUE(received.has_prediction_type()); EXPECT_EQ(received.prediction_type(), source.prediction_type()); } } void validateTraceEvent(const ProtoExpectedSurfaceFrameStart& received, void validateTraceEvent(const ProtoExpectedSurfaceFrameStart& received, Loading Loading @@ -841,6 +846,8 @@ void validateTraceEvent(const ProtoActualSurfaceFrameStart& received, EXPECT_EQ(received.gpu_composition(), source.gpu_composition()); EXPECT_EQ(received.gpu_composition(), source.gpu_composition()); ASSERT_TRUE(received.has_jank_type()); ASSERT_TRUE(received.has_jank_type()); EXPECT_EQ(received.jank_type(), source.jank_type()); EXPECT_EQ(received.jank_type(), source.jank_type()); ASSERT_TRUE(received.has_prediction_type()); EXPECT_EQ(received.prediction_type(), source.prediction_type()); } } void validateTraceEvent(const ProtoFrameEnd& received, const ProtoFrameEnd& source) { void validateTraceEvent(const ProtoFrameEnd& received, const ProtoFrameEnd& source) { Loading Loading @@ -869,7 +876,8 @@ TEST_F(FrameTimelineTest, traceDisplayFrame_emitsValidTracePacket) { createProtoActualDisplayFrameStart(traceCookie + 2, displayFrameToken1, createProtoActualDisplayFrameStart(traceCookie + 2, displayFrameToken1, kSurfaceFlingerPid, kSurfaceFlingerPid, FrameTimelineEvent::PRESENT_ON_TIME, true, false, FrameTimelineEvent::PRESENT_ON_TIME, true, false, FrameTimelineEvent::JANK_NONE); FrameTimelineEvent::JANK_NONE, FrameTimelineEvent::PREDICTION_VALID); auto protoActualDisplayFrameEnd = createProtoFrameEnd(traceCookie + 2); auto protoActualDisplayFrameEnd = createProtoFrameEnd(traceCookie + 2); addEmptyDisplayFrame(); addEmptyDisplayFrame(); Loading Loading @@ -944,7 +952,8 @@ TEST_F(FrameTimelineTest, traceDisplayFrame_predictionExpiredDoesNotTraceExpecte createProtoActualDisplayFrameStart(traceCookie + 1, displayFrameToken1, createProtoActualDisplayFrameStart(traceCookie + 1, displayFrameToken1, kSurfaceFlingerPid, kSurfaceFlingerPid, FrameTimelineEvent::PRESENT_UNSPECIFIED, false, FrameTimelineEvent::PRESENT_UNSPECIFIED, false, false, FrameTimelineEvent::JANK_UNKNOWN); false, FrameTimelineEvent::JANK_UNKNOWN, FrameTimelineEvent::PREDICTION_EXPIRED); auto protoActualDisplayFrameEnd = createProtoFrameEnd(traceCookie + 1); auto protoActualDisplayFrameEnd = createProtoFrameEnd(traceCookie + 1); addEmptyDisplayFrame(); addEmptyDisplayFrame(); Loading Loading @@ -1014,7 +1023,8 @@ TEST_F(FrameTimelineTest, traceSurfaceFrame_emitsValidTracePacket) { createProtoActualSurfaceFrameStart(traceCookie + 2, surfaceFrameToken, createProtoActualSurfaceFrameStart(traceCookie + 2, surfaceFrameToken, displayFrameToken1, sPidOne, sLayerNameOne, displayFrameToken1, sPidOne, sLayerNameOne, FrameTimelineEvent::PRESENT_DROPPED, false, false, FrameTimelineEvent::PRESENT_DROPPED, false, false, FrameTimelineEvent::JANK_NONE); FrameTimelineEvent::JANK_NONE, FrameTimelineEvent::PREDICTION_VALID); auto protoDroppedSurfaceFrameActualEnd = createProtoFrameEnd(traceCookie + 2); auto protoDroppedSurfaceFrameActualEnd = createProtoFrameEnd(traceCookie + 2); auto protoPresentedSurfaceFrameExpectedStart = auto protoPresentedSurfaceFrameExpectedStart = Loading @@ -1025,7 +1035,8 @@ TEST_F(FrameTimelineTest, traceSurfaceFrame_emitsValidTracePacket) { createProtoActualSurfaceFrameStart(traceCookie + 4, surfaceFrameToken, createProtoActualSurfaceFrameStart(traceCookie + 4, surfaceFrameToken, displayFrameToken1, sPidOne, sLayerNameOne, displayFrameToken1, sPidOne, sLayerNameOne, FrameTimelineEvent::PRESENT_ON_TIME, true, false, FrameTimelineEvent::PRESENT_ON_TIME, true, false, FrameTimelineEvent::JANK_NONE); FrameTimelineEvent::JANK_NONE, FrameTimelineEvent::PREDICTION_VALID); auto protoPresentedSurfaceFrameActualEnd = createProtoFrameEnd(traceCookie + 4); auto protoPresentedSurfaceFrameActualEnd = createProtoFrameEnd(traceCookie + 4); // Set up the display frame // Set up the display frame Loading Loading @@ -1167,7 +1178,8 @@ TEST_F(FrameTimelineTest, traceSurfaceFrame_predictionExpiredDoesNotTraceExpecte createProtoActualSurfaceFrameStart(traceCookie + 1, surfaceFrameToken, createProtoActualSurfaceFrameStart(traceCookie + 1, surfaceFrameToken, displayFrameToken, sPidOne, sLayerNameOne, displayFrameToken, sPidOne, sLayerNameOne, FrameTimelineEvent::PRESENT_UNSPECIFIED, false, FrameTimelineEvent::PRESENT_UNSPECIFIED, false, false, FrameTimelineEvent::JANK_UNKNOWN); false, FrameTimelineEvent::JANK_UNKNOWN, FrameTimelineEvent::PREDICTION_EXPIRED); auto protoActualSurfaceFrameEnd = createProtoFrameEnd(traceCookie + 1); auto protoActualSurfaceFrameEnd = createProtoFrameEnd(traceCookie + 1); // Set up the display frame // Set up the display frame Loading