From ba9bff5b9bdd7904916c3ae844840c87376498c3 Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Wed, 8 Jun 2022 01:21:42 +0300
Subject: [PATCH] SL-17541 Show the message that user is currently at maximum
 FPS

---
 indra/llwindow/llwindow.cpp                   |  3 ++-
 indra/llwindow/llwindow.h                     |  3 +++
 indra/llwindow/llwindowwin32.cpp              |  3 ++-
 indra/newview/llfloaterperformance.cpp        | 20 ++++++++++++++++---
 indra/newview/llfloaterperformance.h          |  1 +
 .../default/xui/en/floater_performance.xml    |  8 +++++++-
 6 files changed, 32 insertions(+), 6 deletions(-)

diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp
index f4678a70c5b..c5725677b48 100644
--- a/indra/llwindow/llwindow.cpp
+++ b/indra/llwindow/llwindow.cpp
@@ -117,7 +117,8 @@ LLWindow::LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags)
 	  mSwapMethod(SWAP_METHOD_UNDEFINED),
 	  mHideCursorPermanent(FALSE),
 	  mFlags(flags),
-	  mHighSurrogate(0)
+	  mHighSurrogate(0),
+	  mRefreshRate(0)
 {
 }
 
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index 0edf39f6ef5..4380bbdb737 100644
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -196,6 +196,8 @@ class LLWindow : public LLInstanceTracker<LLWindow>
     // windows only DirectInput8 for joysticks
     virtual void* getDirectInput8() { return NULL; };
     virtual bool getInputDevices(U32 device_type_filter, void * devices_callback, void* userdata) { return false; };
+
+    virtual S32 getRefreshRate() { return mRefreshRate; }
 protected:
 	LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags);
 	virtual ~LLWindow();
@@ -229,6 +231,7 @@ class LLWindow : public LLInstanceTracker<LLWindow>
 	U16			mHighSurrogate;
 	S32			mMinWindowWidth;
 	S32			mMinWindowHeight;
+    S32         mRefreshRate;
 
  	// Handle a UTF-16 encoding unit received from keyboard.
  	// Converting the series of UTF-16 encoding units to UTF-32 data,
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 1f3823509c4..932f8c32cff 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -583,7 +583,7 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
 	{
 		current_refresh = 60;
 	}
-
+    mRefreshRate = current_refresh;
 	//-----------------------------------------------------------------------
 	// Drop resolution and go fullscreen
 	// use a display mode with our desired size and depth, with a refresh
@@ -1061,6 +1061,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen& size, BO
     {
         current_refresh = 60;
     }
+    mRefreshRate = current_refresh;
 
     gGLManager.shutdownGL();
     //destroy gl context
diff --git a/indra/newview/llfloaterperformance.cpp b/indra/newview/llfloaterperformance.cpp
index c89c58c4016..ecacadee3e7 100644
--- a/indra/newview/llfloaterperformance.cpp
+++ b/indra/newview/llfloaterperformance.cpp
@@ -43,6 +43,7 @@
 #include "lltextbox.h"
 #include "lltrans.h"
 #include "llviewerobjectlist.h"
+#include "llviewerwindow.h"
 #include "llvoavatar.h"
 #include "llvoavatarself.h"
 #include "llworld.h"
@@ -162,11 +163,9 @@ void LLFloaterPerformance::showSelectedPanel(LLPanel* selected_panel)
 
 void LLFloaterPerformance::draw()
 {
-    const S32 NUM_PERIODS = 50;
-
     if (mUpdateTimer->hasExpired())
     {
-        getChild<LLTextBox>("fps_value")->setValue((S32)llround(LLTrace::get_frame_recording().getPeriodMedianPerSec(LLStatViewer::FPS, NUM_PERIODS)));
+        setFPSText();
         if (mHUDsPanel->getVisible())
         {
             populateHUDList();
@@ -409,6 +408,21 @@ void LLFloaterPerformance::populateNearbyList()
     mNearbyList->selectByID(prev_selected_id);
 }
 
+void LLFloaterPerformance::setFPSText()
+{
+    const S32 NUM_PERIODS = 50;
+    S32 current_fps = (S32)llround(LLTrace::get_frame_recording().getPeriodMedianPerSec(LLStatViewer::FPS, NUM_PERIODS));
+    getChild<LLTextBox>("fps_value")->setValue(current_fps);
+
+    std::string fps_text = getString("fps_text");
+    static LLCachedControl<bool> vsync_enabled(gSavedSettings, "RenderVSyncEnable", true);
+    if (vsync_enabled && (current_fps >= gViewerWindow->getWindow()->getRefreshRate()))
+    {
+        fps_text += getString("max_text");
+    }
+    getChild<LLTextBox>("fps_lbl")->setValue(fps_text);
+}
+
 void LLFloaterPerformance::detachItem(const LLUUID& item_id)
 {
     LLAppearanceMgr::instance().removeItemFromAvatar(item_id);
diff --git a/indra/newview/llfloaterperformance.h b/indra/newview/llfloaterperformance.h
index 9ccb29cd7b5..e40eee162db 100644
--- a/indra/newview/llfloaterperformance.h
+++ b/indra/newview/llfloaterperformance.h
@@ -57,6 +57,7 @@ class LLFloaterPerformance : public LLFloater
     void populateHUDList();
     void populateObjectList();
     void populateNearbyList();
+    void setFPSText();
 
     void onClickAdvanced();
     void onChangeQuality(const LLSD& data);
diff --git a/indra/newview/skins/default/xui/en/floater_performance.xml b/indra/newview/skins/default/xui/en/floater_performance.xml
index 0107c598681..bf2623f3561 100644
--- a/indra/newview/skins/default/xui/en/floater_performance.xml
+++ b/indra/newview/skins/default/xui/en/floater_performance.xml
@@ -6,6 +6,12 @@
  save_rect="true"
  title="IMPROVE GRAPHICS SPEED"
  width="580">
+  <string
+   name="fps_text"
+   value="frames per second"/>
+  <string
+   name="max_text"
+   value=" (maximum)"/>
   <panel
    bevel_style="none"
    follows="left|top"
@@ -35,7 +41,7 @@
        text_color="White"
        height="20"
        layout="topleft"
-       left="20"
+       left="10"
        top="8"
        name="fps_value"
        width="42">
-- 
GitLab