blob: a2a9aa528a5e8ff4d5d0ce4fc31f5d1813df4349 [file] [log] [blame]
// Copyright 2022 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 CC_TREES_RASTER_CONTEXT_PROVIDER_WRAPPER_H_
#define CC_TREES_RASTER_CONTEXT_PROVIDER_WRAPPER_H_
#include <memory>
#include "base/containers/flat_map.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_refptr.h"
#include "base/synchronization/lock.h"
#include "base/threading/thread_checker.h"
#include "cc/cc_export.h"
#include "third_party/skia/include/core/SkColorType.h"
namespace viz {
class RasterContextProvider;
} // namespace viz
namespace cc {
class RasterDarkModeFilter;
class GpuImageDecodeCache;
// A wrapper of a worker context that is responsible for creation and
// maintenance of GpuImageDecodeCache instances. These caches are created only
// when GPU rasterization is enabled and are meant to be shared across clients.
// If a parameter passed along with a request for a decode cache match to
// already existing cache, an existing cache is returned. This helps to share
// already decoded images between clients (eg 1+n browser windows).
// This class must be created, used and destroyed on the thread the underlying
// context is bound to. Or on a thread where the underlying context can be used
// if it supports locking.
class CC_EXPORT RasterContextProviderWrapper
: public base::RefCountedThreadSafe<RasterContextProviderWrapper> {
public:
RasterContextProviderWrapper(
scoped_refptr<viz::RasterContextProvider> context,
RasterDarkModeFilter* dark_mode_filter,
size_t max_working_set_bytes);
RasterContextProviderWrapper(const RasterContextProviderWrapper&) = delete;
RasterContextProviderWrapper& operator=(const RasterContextProviderWrapper&) =
delete;
const scoped_refptr<viz::RasterContextProvider>& GetContext() const;
// This should only be called from a thread which can use the underlying
// context. It's responsibility of the caller to ensure the context is bound
// to the current thread.
GpuImageDecodeCache& GetGpuImageDecodeCache(SkColorType color_type);
private:
friend class base::RefCountedThreadSafe<RasterContextProviderWrapper>;
~RasterContextProviderWrapper();
void CheckValidThreadOrLockSupported() const;
void OnAllClientsVisibilityChanged(bool visible);
// The worker context that this wrapper holds.
const scoped_refptr<viz::RasterContextProvider> context_;
// Identifies if the |context| supports locking. See more details in the
// comment to this class.
const bool context_supports_locking_;
// A filter that will be used by GpuImageDecodeCache instances.
const raw_ptr<RasterDarkModeFilter> dark_mode_filter_;
// If the feature is disabled, GetGpuImageDecodeCache mustn't be called.
const bool gpu_rasterization_enabled_;
// Oop raster must always be supported to be able to use the
// GpuImageDecodeCache.
const bool supports_oop_raster_;
// The following are passed to GpuImageDecodeCache instances:
// The budget size in bytes of decoded image working set.
const size_t max_working_set_bytes_;
// The maximum size (either width or height) that any texture can be.
const size_t max_texture_size_;
// Protects access to |gpu_image_decode_cache_map_|.
base::Lock lock_;
// Maintains the map of shared decode caches to be shared across clients of
// the same raster context. Guarded by |lock_|.
base::flat_map<SkColorType, std::unique_ptr<GpuImageDecodeCache>>
gpu_image_decode_cache_map_ GUARDED_BY(lock_);
THREAD_CHECKER(bound_context_thread_checker_);
};
} // namespace cc
#endif // CC_TREES_RASTER_CONTEXT_PROVIDER_WRAPPER_H_