widget/windows/RemoteBackbuffer.h
author Marian-Vasile Laza <mlaza@mozilla.com>
Tue, 30 Nov 2021 23:30:59 +0200
changeset 600683 15c1262d6e8f4524fa63dcc9cc2572038ffb3a92
parent 598760 1d94da94e88807ee078bae5c32dd09dadd4c9716
permissions -rw-r--r--
Backed out 6 changesets (bug 1715892, bug 1719735) for causing bc test failures. CLOSED TREE Backed out changeset 196952bd8c9c (bug 1715892) Backed out changeset 9105fe01c025 (bug 1715892) Backed out changeset 4c15d1a24ccd (bug 1715892) Backed out changeset 2c328b84285f (bug 1715892) Backed out changeset 8fcdcdf44b62 (bug 1719735) Backed out changeset c48f398e301f (bug 1719735)

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef widget_windows_RemoteBackbuffer_h
#define widget_windows_RemoteBackbuffer_h

#include "nsIWidget.h"
#include "mozilla/widget/PCompositorWidgetParent.h"
#include "mozilla/Maybe.h"
#include "prthread.h"
#include <windows.h>

namespace mozilla {
namespace widget {
namespace remote_backbuffer {

struct IpcRect;
struct SharedData;
struct BorrowResponseData;
struct PresentRequestData;
struct PresentResponseData;
class SharedImage;
class PresentableSharedImage;

class Provider {
 public:
  Provider();
  ~Provider();

  bool Initialize(HWND aWindowHandle, DWORD aTargetProcessId,
                  nsTransparencyMode aTransparencyMode);

  Maybe<RemoteBackbufferHandles> CreateRemoteHandles();

  void UpdateTransparencyMode(nsTransparencyMode aTransparencyMode);

  Provider(const Provider&) = delete;
  Provider(Provider&&) = delete;
  Provider& operator=(const Provider&) = delete;
  Provider& operator=(Provider&&) = delete;

 private:
  void ThreadMain();

  void HandleBorrowRequest(BorrowResponseData* aResponseData,
                           bool aAllowSameBuffer);
  void HandlePresentRequest(const PresentRequestData& aRequestData,
                            PresentResponseData* aResponseData);

  HWND mWindowHandle;
  HANDLE mTargetProcess;
  HANDLE mFileMapping;
  HANDLE mRequestReadyEvent;
  HANDLE mResponseReadyEvent;
  SharedData* mSharedDataPtr;
  bool mStopServiceThread;
  PRThread* mServiceThread;
  std::unique_ptr<PresentableSharedImage> mBackbuffer;
  mozilla::Atomic<nsTransparencyMode, MemoryOrdering::Relaxed>
      mTransparencyMode;
};

class Client {
 public:
  Client();
  ~Client();

  bool Initialize(const RemoteBackbufferHandles& aRemoteHandles);

  already_AddRefed<gfx::DrawTarget> BorrowDrawTarget();
  bool PresentDrawTarget(gfx::IntRegion aDirtyRegion);

  Client(const Client&) = delete;
  Client(Client&&) = delete;
  Client& operator=(const Client&) = delete;
  Client& operator=(Client&&) = delete;

 private:
  HANDLE mFileMapping;
  HANDLE mRequestReadyEvent;
  HANDLE mResponseReadyEvent;
  SharedData* mSharedDataPtr;
  std::unique_ptr<SharedImage> mBackbuffer;
};

}  // namespace remote_backbuffer
}  // namespace widget
}  // namespace mozilla

#endif  // widget_windows_RemoteBackbuffer_h