diff --git a/display_server/ft_build/ds_config.gni b/display_server/ft_build/ds_config.gni index 8847cb3b9743a40a3d52ba6db0456cf3cd7791df..0ac116af55ab0df68667e484f16cb1d715bcdf28 100644 --- a/display_server/ft_build/ds_config.gni +++ b/display_server/ft_build/ds_config.gni @@ -17,6 +17,7 @@ declare_args() { graphic_standard_feature_rs_enable_eglimage = true graphic_standard_feature_rs_enable_uni_render = false graphic_standard_feature_enable_afbc = false + postprocess_feature_enable_fps = true } if (graphic_standard_feature_ace_enable_gpu) { @@ -50,3 +51,9 @@ if (graphic_standard_feature_rs_enable_uni_render) { if (graphic_standard_feature_enable_afbc) { gpu_defines += [ "RS_ENABLE_AFBC" ] } + +if (postprocess_feature_enable_fps) { + fps_defines = [ "SHOW_FPS" ] +} else { + fps_defines = [] +} \ No newline at end of file diff --git a/display_server/rosen/modules/composer/hdi_backend/src/hdi_backend.cpp b/display_server/rosen/modules/composer/hdi_backend/src/hdi_backend.cpp index 77590a1174286a9b57d0561f9b5700a775f60a94..0c336546b8414e7047f538e80c0fba0a5c557652 100644 --- a/display_server/rosen/modules/composer/hdi_backend/src/hdi_backend.cpp +++ b/display_server/rosen/modules/composer/hdi_backend/src/hdi_backend.cpp @@ -164,6 +164,7 @@ void HdiBackend::Repaint(std::vector &outputs) } output->UpdatePrevLayerInfo(); + // FIXME: why the first timestamp is soooo big? int64_t timestamp = lastPresentFence_->SyncFileReadTimestamp(); bool startSample = false; if (timestamp != SyncFence::FENCE_PENDING_TIMESTAMP) { diff --git a/display_server/rosen/modules/render_service/core/pipeline/rs_base_render_engine.cpp b/display_server/rosen/modules/render_service/core/pipeline/rs_base_render_engine.cpp index 94b9f88aaeed01177b289de9546e869f7e08946f..7a18dc3b372779da6d0399f9cd97bfea49dc3889 100644 --- a/display_server/rosen/modules/render_service/core/pipeline/rs_base_render_engine.cpp +++ b/display_server/rosen/modules/render_service/core/pipeline/rs_base_render_engine.cpp @@ -25,6 +25,15 @@ #include "platform/ohos/backend/rs_surface_ohos_raster.h" #include "render/rs_skia_filter.h" +#ifdef SHOW_FPS +#include "SkFont.h" +#include + +#define MAX_QUEUE_SIZE 60 // Ensure that the queue's length does not exceed 60. +#define MAX_FPS 240 // In general, the refresh rate will not exceed 240 Hz. +#define BUFFER_SIZE 16 // 16 characters are sufficient to display all the information. +#endif + namespace OHOS { namespace Rosen { RSBaseRenderEngine::RSBaseRenderEngine() @@ -35,6 +44,40 @@ RSBaseRenderEngine::~RSBaseRenderEngine() noexcept { } +void RSBaseRenderEngine::PostProcessOutput(RSPaintFilterCanvas& canvas, [[maybe_unused]] bool forceCPU, + [[maybe_unused]] float mirrorAdaptiveCoefficient) +{ +#ifdef SHOW_FPS + static std::queue timestampQueue; + static double fps; + + timestampQueue.push(std::chrono::duration_cast(std::chrono::steady_clock::now().time_since_epoch()).count()); + while ((timestampQueue.back() - timestampQueue.front()) > 1e9 // 1s = 1e9ns + || (timestampQueue.back() - timestampQueue.front()) < 0 + || timestampQueue.size() > MAX_QUEUE_SIZE) { + timestampQueue.pop(); + } + // turn nanoseconds to seconds + long double tmp = (timestampQueue.back() - timestampQueue.front()) / 1e9L; + fps = tmp ? (timestampQueue.size() - 1) / tmp : 0; + SkPaint paint; + paint.setAntiAlias(true); + paint.setStyle(SkPaint::kFill_Style); + paint.setStrokeJoin(SkPaint::kRound_Join); + paint.setARGB(0xaa, 0xff, 0xff, 0xff); // set the font color to white with some transparency. + char fpsMsg[BUFFER_SIZE] = { 0 }; + if (fps > MAX_FPS || fps < 0) { + sprintf(fpsMsg, "FPS ERROR"); + } else { + sprintf(fpsMsg, "%.1f", fps); + } + SkFont font; + const float fontSize = 16; + font.setSize(fontSize); + canvas.drawString(fpsMsg, 1.0f, fontSize, font, paint); +#endif +} + void RSBaseRenderEngine::Init() { #ifdef RS_ENABLE_GL diff --git a/display_server/rosen/modules/render_service/core/pipeline/rs_base_render_engine.h b/display_server/rosen/modules/render_service/core/pipeline/rs_base_render_engine.h index 2c5db5e6110bc5debc03db041807c3e97c27c1db..157437887ba9941f9c7c5ec7b6c51a14fd968f9e 100644 --- a/display_server/rosen/modules/render_service/core/pipeline/rs_base_render_engine.h +++ b/display_server/rosen/modules/render_service/core/pipeline/rs_base_render_engine.h @@ -130,6 +130,8 @@ public: virtual void DrawLayers(RSPaintFilterCanvas& canvas, const std::vector& layers, bool forceCPU = false, float mirrorAdaptiveCoefficient = 1.0f) = 0; + static void PostProcessOutput(RSPaintFilterCanvas& canvas, bool forceCPU = false, float mirrorAdaptiveCoefficient = 1.0f); + static void ShrinkCachesIfNeeded(); static void SetColorFilterMode(ColorFilterMode mode); static ColorFilterMode GetColorFilterMode() diff --git a/display_server/rosen/modules/render_service/core/pipeline/rs_physical_screen_processor.cpp b/display_server/rosen/modules/render_service/core/pipeline/rs_physical_screen_processor.cpp index fd5663e477dbe4049d2d6ab1f390ca4050392466..7753e0d0b0a7be382ae2543df936b680a2c9924f 100644 --- a/display_server/rosen/modules/render_service/core/pipeline/rs_physical_screen_processor.cpp +++ b/display_server/rosen/modules/render_service/core/pipeline/rs_physical_screen_processor.cpp @@ -92,6 +92,7 @@ void RSPhysicalScreenProcessor::Redraw(const sptr& surface, const std:: canvas->clear(SK_ColorTRANSPARENT); canvas->concat(screenTransformMatrix_); renderEngine_->DrawLayers(*canvas, layers, forceCPU, mirrorAdaptiveCoefficient_); + renderEngine_->PostProcessOutput(*canvas, forceCPU, mirrorAdaptiveCoefficient_); renderFrame->Flush(); RS_LOGD("RsDebug RSPhysicalScreenProcessor::Redraw flush frame buffer end"); } diff --git a/display_server/rosen/modules/render_service/core/pipeline/rs_uni_render_processor.cpp b/display_server/rosen/modules/render_service/core/pipeline/rs_uni_render_processor.cpp index 09021d329d6ae8e485fad0fbb20560b563ca5dd0..f4bf3a9f0c00df80e8a06e63ea18c007912d0504 100644 --- a/display_server/rosen/modules/render_service/core/pipeline/rs_uni_render_processor.cpp +++ b/display_server/rosen/modules/render_service/core/pipeline/rs_uni_render_processor.cpp @@ -106,6 +106,7 @@ void RSUniRenderProcessor::Redraw(const sptr& surface, const std::vecto return; } renderEngine_->DrawLayers(*canvas, layers, forceCPU); + renderEngine_->PostProcessOutput(*canvas, forceCPU); renderFrame->Flush(); RS_LOGD("RsDebug RSUniRenderProcessor::Redraw flush frame buffer end"); } diff --git a/display_server/rosen/modules/render_service/ft_build/BUILD.gn b/display_server/rosen/modules/render_service/ft_build/BUILD.gn index f885efd7630d2bf679c33e79698f186f59c8a30e..0a2965606c2de7cb09cc8cfb0e93c229cce8fa1e 100644 --- a/display_server/rosen/modules/render_service/ft_build/BUILD.gn +++ b/display_server/rosen/modules/render_service/ft_build/BUILD.gn @@ -24,6 +24,7 @@ group("render_service_group") { ft_shared_library("librender_service") { defines = ft_defines defines += gpu_defines + defines += fps_defines if (use_musl) { defines += [ "FRAME_AWARE_TRACE" ] }