summaryrefslogtreecommitdiff
path: root/libcef/browser/osr/software_output_device_proxy.h
diff options
context:
space:
mode:
Diffstat (limited to 'libcef/browser/osr/software_output_device_proxy.h')
-rw-r--r--libcef/browser/osr/software_output_device_proxy.h56
1 files changed, 56 insertions, 0 deletions
diff --git a/libcef/browser/osr/software_output_device_proxy.h b/libcef/browser/osr/software_output_device_proxy.h
new file mode 100644
index 00000000..fc29ae2e
--- /dev/null
+++ b/libcef/browser/osr/software_output_device_proxy.h
@@ -0,0 +1,56 @@
+#ifndef CEF_LIBCEF_BROWSER_OSR_SOFTWARE_OUTPUT_DEVICE_PROXY_H_
+#define CEF_LIBCEF_BROWSER_OSR_SOFTWARE_OUTPUT_DEVICE_PROXY_H_
+
+#include "base/memory/shared_memory_mapping.h"
+#include "base/threading/thread_checker.h"
+#include "components/viz/service/display/software_output_device.h"
+#include "components/viz/service/viz_service_export.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "services/viz/privileged/mojom/compositing/layered_window_updater.mojom.h"
+
+namespace viz {
+
+// SoftwareOutputDevice implementation that draws indirectly. An
+// implementation of mojom::LayeredWindowUpdater in the browser process
+// handles the actual drawing. Pixel backing is in SharedMemory so no copying
+// between processes is required.
+class VIZ_SERVICE_EXPORT SoftwareOutputDeviceProxy
+ : public SoftwareOutputDevice {
+ public:
+ explicit SoftwareOutputDeviceProxy(
+ mojo::PendingRemote<mojom::LayeredWindowUpdater> layered_window_updater);
+
+ SoftwareOutputDeviceProxy(const SoftwareOutputDeviceProxy&) = delete;
+ SoftwareOutputDeviceProxy& operator=(const SoftwareOutputDeviceProxy&) =
+ delete;
+
+ ~SoftwareOutputDeviceProxy() override;
+
+ // SoftwareOutputDevice implementation.
+ void OnSwapBuffers(SwapBuffersCallback swap_ack_callback,
+ gfx::FrameData data) override;
+
+ // SoftwareOutputDeviceBase implementation.
+ void Resize(const gfx::Size& viewport_pixel_size,
+ float scale_factor) override;
+ SkCanvas* BeginPaint(const gfx::Rect& damage_rect) override;
+ void EndPaint() override;
+
+ private:
+ // Runs |swap_ack_callback_| after draw has happened.
+ void DrawAck();
+
+ mojo::Remote<mojom::LayeredWindowUpdater> layered_window_updater_;
+
+ std::unique_ptr<SkCanvas> canvas_;
+ bool waiting_on_draw_ack_ = false;
+ bool in_paint_ = false;
+ base::OnceClosure swap_ack_callback_;
+ base::WritableSharedMemoryMapping shm_;
+
+ THREAD_CHECKER(thread_checker_);
+};
+
+} // namespace viz
+
+#endif // CEF_LIBCEF_BROWSER_OSR_SOFTWARE_OUTPUT_DEVICE_PROXY_H_ \ No newline at end of file