summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.h')
-rw-r--r--chromium/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.h136
1 files changed, 136 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.h b/chromium/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.h
new file mode 100644
index 00000000000..d2afb6a9098
--- /dev/null
+++ b/chromium/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.h
@@ -0,0 +1,136 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_CANVAS_RESOURCE_DISPATCHER_H_
+#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_CANVAS_RESOURCE_DISPATCHER_H_
+
+#include <memory>
+#include "components/viz/common/frame_sinks/begin_frame_args.h"
+#include "components/viz/common/resources/resource_id.h"
+#include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
+#include "mojo/public/cpp/bindings/binding.h"
+#include "services/viz/public/interfaces/compositing/compositor_frame_sink.mojom-blink.h"
+#include "third_party/blink/renderer/platform/graphics/offscreen_canvas_resource_provider.h"
+#include "third_party/blink/renderer/platform/wtf/compiler.h"
+
+namespace blink {
+
+class CanvasResource;
+
+class CanvasResourceDispatcherClient {
+ public:
+ virtual void BeginFrame() = 0;
+};
+
+class PLATFORM_EXPORT CanvasResourceDispatcher
+ : public viz::mojom::blink::CompositorFrameSinkClient {
+ public:
+ base::WeakPtr<CanvasResourceDispatcher> GetWeakPtr() {
+ return weak_ptr_factory_.GetWeakPtr();
+ }
+
+ CanvasResourceDispatcherClient* Client() { return client_; }
+
+ enum {
+ kInvalidPlaceholderCanvasId = -1,
+ };
+
+ CanvasResourceDispatcher(CanvasResourceDispatcherClient*,
+ uint32_t client_id,
+ uint32_t sink_id,
+ int placeholder_canvas_id,
+ const IntSize&);
+
+ ~CanvasResourceDispatcher() override;
+ void SetNeedsBeginFrame(bool);
+ void SetSuspendAnimation(bool);
+ bool NeedsBeginFrame() const { return needs_begin_frame_; }
+ bool IsAnimationSuspended() const { return suspend_animation_; }
+ void DispatchFrame(scoped_refptr<StaticBitmapImage>,
+ base::TimeTicks commit_start_time,
+ const SkIRect& damage_rect);
+ void ReclaimResource(viz::ResourceId);
+ void DispatchFrameSync(scoped_refptr<StaticBitmapImage>,
+ base::TimeTicks commit_start_time,
+ const SkIRect& damage_rect);
+
+ void Reshape(const IntSize&);
+
+ // viz::mojom::blink::CompositorFrameSinkClient implementation.
+ void DidReceiveCompositorFrameAck(
+ const WTF::Vector<viz::ReturnedResource>& resources) final;
+ void DidPresentCompositorFrame(
+ uint32_t presentation_token,
+ ::gfx::mojom::blink::PresentationFeedbackPtr feedback) final;
+ void OnBeginFrame(const viz::BeginFrameArgs&) final;
+ void OnBeginFramePausedChanged(bool paused) final{};
+ void ReclaimResources(
+ const WTF::Vector<viz::ReturnedResource>& resources) final;
+
+ void DidAllocateSharedBitmap(mojo::ScopedSharedBufferHandle buffer,
+ ::gpu::mojom::blink::MailboxPtr id);
+ void DidDeleteSharedBitmap(::gpu::mojom::blink::MailboxPtr id);
+
+ // This enum is used in histogram, so it should be append-only.
+ enum OffscreenCanvasCommitType {
+ kCommitGPUCanvasGPUCompositing = 0,
+ kCommitGPUCanvasSoftwareCompositing = 1,
+ kCommitSoftwareCanvasGPUCompositing = 2,
+ kCommitSoftwareCanvasSoftwareCompositing = 3,
+ kOffscreenCanvasCommitTypeCount,
+
+ };
+
+ private:
+ friend class CanvasResourceDispatcherTest;
+
+ bool PrepareFrame(scoped_refptr<CanvasResource>,
+ base::TimeTicks commit_start_time,
+ const SkIRect& damage_rect,
+ viz::CompositorFrame* frame);
+
+ // Surface-related
+ viz::ParentLocalSurfaceIdAllocator parent_local_surface_id_allocator_;
+ const viz::FrameSinkId frame_sink_id_;
+
+ IntSize size_;
+ bool change_size_for_next_commit_;
+ bool suspend_animation_ = false;
+ bool needs_begin_frame_ = false;
+ int pending_compositor_frames_ = 0;
+
+ void SetNeedsBeginFrameInternal();
+
+ bool VerifyImageSize(const IntSize);
+ void PostImageToPlaceholderIfNotBlocked(scoped_refptr<CanvasResource>,
+ viz::ResourceId resource_id);
+ // virtual for testing
+ virtual void PostImageToPlaceholder(scoped_refptr<CanvasResource>,
+ viz::ResourceId resource_id);
+
+ viz::mojom::blink::CompositorFrameSinkPtr sink_;
+ mojo::Binding<viz::mojom::blink::CompositorFrameSinkClient> binding_;
+ viz::mojom::blink::CompositorFrameSinkClientPtr client_ptr_;
+
+ int placeholder_canvas_id_;
+
+ // The latest_unposted_resource_id_ always refers to the Id of the frame
+ // resource used by the latest_unposted_image_.
+ scoped_refptr<CanvasResource> latest_unposted_image_;
+ viz::ResourceId latest_unposted_resource_id_;
+ unsigned num_unreclaimed_frames_posted_;
+
+ viz::BeginFrameAck current_begin_frame_ack_;
+
+ CanvasResourceDispatcherClient* client_;
+
+ std::unique_ptr<OffscreenCanvasResourceProvider>
+ offscreen_canvas_resource_provider_;
+
+ base::WeakPtrFactory<CanvasResourceDispatcher> weak_ptr_factory_;
+};
+
+} // namespace blink
+
+#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_OFFSCREEN_CANVAS_FRAME_DISPATCHER_H_