SL-16094 Move LLWindowWin32::mainWindowProc and Windows message handling to a background thread to prevent frame stalls in LLWindowWin32::gatherInput

master
Dave Parks 2021-10-01 15:51:12 +00:00
parent 675514bdb3
commit 2148e4c731
2 changed files with 1539 additions and 1175 deletions

File diff suppressed because it is too large Load Diff

View File

@ -33,11 +33,46 @@
#include "llwindow.h"
#include "llwindowcallbacks.h"
#include "lldragdropwin32.h"
#include "llthread.h"
#include "llthreadsafequeue.h"
// Hack for async host by name
#define LL_WM_HOST_RESOLVED (WM_APP + 1)
typedef void (*LLW32MsgCallback)(const MSG &msg);
class LLWindowWin32;
// Thread that owns the Window Handle
class LLWindowWin32Thread : public LLThread
{
public:
class Message
{
public:
LRESULT mMsg;
};
static const int MAX_QUEUE_SIZE = 2048;
LLThreadSafeQueue<MSG> mMessageQueue;
LLThreadSafeQueue<std::function<void()>> mFunctionQueue;
bool mFinished = false;
LLWindowWin32Thread(LLWindowWin32* window);
void run() override;
void post(const std::function<void()>& func);
private:
// call PeekMessage and pull enqueue messages for later processing
void gatherInput();
LLWindowWin32* mWindow = nullptr;
};
class LLWindowWin32 : public LLWindow
{
public:
@ -172,9 +207,9 @@ protected:
WCHAR *mWindowTitle;
WCHAR *mWindowClassName;
HWND mWindowHandle; // window handle
HGLRC mhRC; // OpenGL rendering context
HDC mhDC; // Windows Device context handle
HWND mWindowHandle = 0; // window handle
HGLRC mhRC = 0; // OpenGL rendering context
HDC mhDC = 0; // Windows Device context handle
HINSTANCE mhInstance; // handle to application instance
WNDPROC mWndProc; // user-installable window proc
RECT mOldMouseClip; // Screen rect to which the mouse cursor was globally constrained before we changed it in clipMouse()
@ -221,7 +256,12 @@ protected:
BOOL mMouseVanish;
LLWindowWin32Thread* mWindowThread = nullptr;
LLThreadSafeQueue<std::function<void()>> mFunctionQueue;
void post(const std::function<void()>& func);
friend class LLWindowManager;
friend class LLWindowWin32Thread;
};
class LLSplashScreenWin32 : public LLSplashScreen