From 5a40d67aa1755f2f7a4f3b6daa9348171478cfed Mon Sep 17 00:00:00 2001 From: Mouse Zhang Date: Sun, 16 Jul 2023 14:15:02 +0800 Subject: [PATCH] add post process feature: fps --- display_server/ft_build/ds_config.gni | 7 +++ .../composer/hdi_backend/src/hdi_backend.cpp | 1 + .../core/pipeline/rs_base_render_engine.cpp | 43 +++++++++++++++++++ .../core/pipeline/rs_base_render_engine.h | 2 + .../pipeline/rs_physical_screen_processor.cpp | 1 + .../core/pipeline/rs_uni_render_processor.cpp | 1 + .../modules/render_service/ft_build/BUILD.gn | 1 + 7 files changed, 56 insertions(+) diff --git a/display_server/ft_build/ds_config.gni b/display_server/ft_build/ds_config.gni index 8847cb3..0ac116a 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 77590a1..0c33654 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 94b9f88..7a18dc3 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 2c5db5e..1574378 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 fd5663e..7753e0d 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 09021d3..f4bf3a9 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 f885efd..0a29656 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" ] } -- Gitee