summaryrefslogtreecommitdiff
path: root/chromium/components/viz/client/client_resource_provider.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/viz/client/client_resource_provider.h')
-rw-r--r--chromium/components/viz/client/client_resource_provider.h141
1 files changed, 141 insertions, 0 deletions
diff --git a/chromium/components/viz/client/client_resource_provider.h b/chromium/components/viz/client/client_resource_provider.h
new file mode 100644
index 00000000000..4087b5754ec
--- /dev/null
+++ b/chromium/components/viz/client/client_resource_provider.h
@@ -0,0 +1,141 @@
+// Copyright 2017 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 COMPONENTS_VIZ_CLIENT_CLIENT_RESOURCE_PROVIDER_H_
+#define COMPONENTS_VIZ_CLIENT_CLIENT_RESOURCE_PROVIDER_H_
+
+#include <vector>
+
+#include "base/threading/thread_checker.h"
+#include "components/viz/client/viz_client_export.h"
+#include "components/viz/common/display/renderer_settings.h"
+#include "components/viz/common/resources/release_callback.h"
+#include "components/viz/common/resources/resource_id.h"
+#include "components/viz/common/resources/resource_settings.h"
+#include "components/viz/common/resources/single_release_callback.h"
+#include "components/viz/common/resources/transferable_resource.h"
+#include "third_party/khronos/GLES2/gl2.h"
+#include "third_party/skia/include/core/SkSurface.h"
+#include "third_party/skia/include/gpu/GrBackendSurface.h"
+#include "third_party/skia/include/gpu/GrContext.h"
+
+namespace gpu {
+namespace gles2 {
+class GLES2Interface;
+}
+namespace raster {
+class RasterInterface;
+}
+} // namespace gpu
+
+namespace viz {
+class ContextProvider;
+
+// This class is used to give an integer name (ResourceId) to a gpu or software
+// resource (shipped as a TransferableResource), in order to use that name in
+// DrawQuads and give the resource to the viz display compositor. When the
+// resource is removed from the ClientResourceProvider, the
+// SingleReleaseCallback will be called once the resource is no longer in use by
+// the display compositor.
+//
+// This class is not thread-safe and can only be called from the thread it was
+// created on (in practice, the impl thread).
+class VIZ_CLIENT_EXPORT ClientResourceProvider {
+ public:
+ explicit ClientResourceProvider(bool delegated_sync_points_required);
+ ~ClientResourceProvider();
+
+ static gpu::SyncToken GenerateSyncTokenHelper(gpu::gles2::GLES2Interface* gl);
+ static gpu::SyncToken GenerateSyncTokenHelper(
+ gpu::raster::RasterInterface* ri);
+
+ // Prepares resources to be transfered to the parent, moving them to
+ // mailboxes and serializing meta-data into TransferableResources.
+ // Resources are not removed from the ResourceProvider, but are marked as
+ // "in use".
+ void PrepareSendToParent(
+ const std::vector<ResourceId>& resource_ids,
+ std::vector<TransferableResource>* transferable_resources,
+ ContextProvider* context_provider);
+
+ // Receives resources from the parent, moving them from mailboxes. ResourceIds
+ // passed are in the child namespace.
+ // NOTE: if the sync_token is set on any TransferableResource, this will
+ // wait on it.
+ void ReceiveReturnsFromParent(
+ const std::vector<ReturnedResource>& transferable_resources);
+
+ // Receives a resource from an external client that can be used in compositor
+ // frames, via the returned ResourceId.
+ ResourceId ImportResource(const TransferableResource&,
+ std::unique_ptr<SingleReleaseCallback>);
+ // Removes an imported resource, which will call the ReleaseCallback given
+ // originally, once the resource is no longer in use by any compositor frame.
+ void RemoveImportedResource(ResourceId);
+
+ // Call this to indicate that the connection to the parent is lost and
+ // resources previously exported will not be able to be returned. If |lose| is
+ // true, the resources are also marked as lost, to indicate the state of each
+ // resource can not be known, and/or they can not be reused.
+ //
+ // When a resource is sent to the parent (via PrepareSendToParent) it is put
+ // into an exported state, preventing it from being released until the parent
+ // returns the resource. Calling this drops that exported state on all
+ // resources allowing immediate release of them if they are removed via
+ // RemoveImportedResource().
+ void ReleaseAllExportedResources(bool lose);
+
+ // Immediately runs the SingleReleaseCallback for all resources that have been
+ // previously imported and removed, but not released yet. There should not be
+ // any imported resources yet when this is called, as they can be removed
+ // first via RemoveImportedResource(), and potentially avoid being lost.
+ void ShutdownAndReleaseAllResources();
+
+ // Verify that the ResourceId is valid and is known to this class, for debug
+ // checks.
+ void ValidateResource(ResourceId id) const;
+
+ // Checks whether a resource is in use by a consumer.
+ bool InUseByConsumer(ResourceId id);
+
+ size_t num_resources_for_testing() const;
+
+ class VIZ_CLIENT_EXPORT ScopedSkSurface {
+ public:
+ ScopedSkSurface(GrContext* gr_context,
+ GLuint texture_id,
+ GLenum texture_target,
+ const gfx::Size& size,
+ ResourceFormat format,
+ bool can_use_lcd_text,
+ int msaa_sample_count);
+ ~ScopedSkSurface();
+
+ SkSurface* surface() const { return surface_.get(); }
+
+ static SkSurfaceProps ComputeSurfaceProps(bool can_use_lcd_text);
+
+ private:
+ sk_sp<SkSurface> surface_;
+
+ DISALLOW_COPY_AND_ASSIGN(ScopedSkSurface);
+ };
+
+ private:
+ struct ImportedResource;
+
+ THREAD_CHECKER(thread_checker_);
+ const bool delegated_sync_points_required_;
+
+ base::flat_map<ResourceId, ImportedResource> imported_resources_;
+ // The ResourceIds in ClientResourceProvider start from 1 to avoid
+ // conflicts with id from DisplayResourceProvider.
+ ResourceId next_id_ = 1;
+
+ DISALLOW_COPY_AND_ASSIGN(ClientResourceProvider);
+};
+
+} // namespace viz
+
+#endif // COMPONENTS_VIZ_CLIENT_CLIENT_RESOURCE_PROVIDER_H_