blob: 08eaac73d70032970b3540ba64978b44caa9a80a [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_INTERFACE_IN_PROCESS_H_
#define GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_INTERFACE_IN_PROCESS_H_
#include <memory>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/task/single_thread_task_runner.h"
#include "build/build_config.h"
#include "gpu/command_buffer/client/client_shared_image.h"
#include "gpu/command_buffer/client/shared_image_interface.h"
#include "gpu/command_buffer/common/command_buffer_id.h"
#include "gpu/command_buffer/common/shared_image_usage.h"
#include "gpu/command_buffer/service/shared_image_interface_in_process_base.h"
#include "gpu/command_buffer/service/task_graph.h"
#include "gpu/gpu_gles2_export.h"
#include "gpu/ipc/common/gpu_memory_buffer_handle_info.h"
#include "ui/gfx/gpu_memory_buffer_handle.h"
namespace base {
class WaitableEvent;
}
namespace gpu {
class SharedContextState;
class SharedImageFactory;
class SharedImageManager;
class SingleTaskSequence;
struct GpuPreferences;
class GpuDriverBugWorkarounds;
struct GpuFeatureInfo;
struct SyncToken;
// This is an implementation of the SharedImageInterface to be used on the viz
// compositor thread. This class also implements the corresponding parts
// happening on gpu thread.
class GPU_GLES2_EXPORT SharedImageInterfaceInProcess
: public SharedImageInterfaceInProcessBase {
public:
// Callers must guarantee that the instances passed via pointers are kept
// alive for as long as the instance of this class is alive. This can be
// achieved by ensuring that the ownership of the created
// SharedImageInterfaceInProcess is the same as the ownership of the passed in
// pointers. The `gpu_task_runner` is the task runner that `ScheduleGpuTask()`
// schedules on; it is used to ensure that some parts of initialization and
// destruction happen on the GPU thread.
static scoped_refptr<SharedImageInterfaceInProcess> Create(
SingleTaskSequence* task_sequence,
const GpuPreferences& gpu_preferences,
const GpuDriverBugWorkarounds& gpu_workarounds,
const GpuFeatureInfo& gpu_feature_info,
gpu::SharedContextState* context_state,
SharedImageManager* shared_image_manager,
bool is_for_display_compositor,
scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner);
SharedImageInterfaceInProcess(const SharedImageInterfaceInProcess&) = delete;
SharedImageInterfaceInProcess& operator=(
const SharedImageInterfaceInProcess&) = delete;
protected:
~SharedImageInterfaceInProcess() override;
// SharedImageInterfaceBase:
SharedImageFactory* GetSharedImageFactoryOnGpuThread() override;
bool MakeContextCurrentOnGpuThread(bool needs_gl) override;
using SharedImageInterfaceInProcessBase::MakeContextCurrentOnGpuThread;
void MarkContextLostOnGpuThread() override;
void ScheduleGpuTask(base::OnceClosure task,
std::vector<SyncToken> sync_token_fences,
const SyncToken& release) override;
private:
// Private to ensure `Initialize()` is always called after construction.
SharedImageInterfaceInProcess(
SingleTaskSequence* task_sequence,
SharedImageManager* shared_image_manager,
scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner);
// Parameters needed to be passed in to set up the class on the GPU.
// Needed since we cannot pass refcounted instances (e.g.
// gpu::SharedContextState) to base::BindOnce as raw pointers.
struct SetUpOnGpuParams;
// Set up GPU state.
void Initialize(std::unique_ptr<SetUpOnGpuParams> params);
void SetUpOnGpu(std::unique_ptr<SetUpOnGpuParams> params);
void DestroyOnGpu(base::WaitableEvent* completion);
// Used to schedule work on the gpu thread. This is a raw pointer for now
// since the ownership of SingleTaskSequence would be the same as the
// SharedImageInterfaceInProcess.
raw_ptr<SingleTaskSequence> task_sequence_;
base::OnceCallback<std::unique_ptr<SharedImageFactory>()> create_factory_;
// Accessed on any thread.
scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner_;
// Accessed on compositor thread.
// This is used to get NativePixmap, and is only used when SharedImageManager
// is thread safe.
raw_ptr<SharedImageManager> shared_image_manager_;
// Accessed on GPU thread.
scoped_refptr<SharedContextState> context_state_;
ScopedSyncPointClientState sync_point_client_state_;
std::unique_ptr<SharedImageFactory> shared_image_factory_;
};
} // namespace gpu
#endif // GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_INTERFACE_IN_PROCESS_H_