1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
gpu / ipc / service / gpu_memory_buffer_factory.h [blame]
// Copyright 2014 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_IPC_SERVICE_GPU_MEMORY_BUFFER_FACTORY_H_
#define GPU_IPC_SERVICE_GPU_MEMORY_BUFFER_FACTORY_H_
#include <memory>
#include <vector>
#include "base/memory/unsafe_shared_memory_region.h"
#include "base/task/single_thread_task_runner.h"
#include "gpu/ipc/common/surface_handle.h"
#include "gpu/ipc/service/gpu_ipc_service_export.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/gpu_memory_buffer.h"
namespace viz {
class VulkanContextProvider;
} // namespace viz
namespace gpu {
// This enums will be used by clients when creating native gmb handles via
// GpuMemoryBufferFactory::CreateNativeGmbHandle(). This ensure each client uses
// a unique id.
enum class MappableSIClientGmbId : int {
kGpuChannel = 1,
kGmbVideoFramePoolContext = 2,
kLast = 2
};
class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactory {
public:
GpuMemoryBufferFactory(const GpuMemoryBufferFactory&) = delete;
GpuMemoryBufferFactory& operator=(const GpuMemoryBufferFactory&) = delete;
virtual ~GpuMemoryBufferFactory() = default;
// Creates a new factory instance for native GPU memory buffers. Returns null
// if native buffers are not supported.
static std::unique_ptr<GpuMemoryBufferFactory> CreateNativeType(
viz::VulkanContextProvider* vulkan_context_provider,
scoped_refptr<base::SingleThreadTaskRunner> io_runner = nullptr);
// Creates a native GpuMemoryBufferHandle for MappableSI work. Note that
// every client should use a different |id| here otherwise it can result in
// errors due to multiple clients creating and destroying GMBs with same |id|
// from multiple threads. Using MappableSIClientGmbId here ensures that every
// client uses unique id assigned to it and also makes it easier to track.
gfx::GpuMemoryBufferHandle CreateNativeGmbHandle(MappableSIClientGmbId id,
const gfx::Size& size,
gfx::BufferFormat format,
gfx::BufferUsage usage);
// Creates a new GPU memory buffer instance. A valid handle is returned on
// success. This method is thread-safe but it should not be called on the IO
// thread as it can lead to deadlocks (see https://crbug.com/981721). Instead
// use the asynchronous version on the IO thread. |framebuffer_size| specifies
// the size used to create a framebuffer when the |usage| requires it and the
// particular GpuMemoryBufferFactory implementation supports it (for example,
// when creating a buffer for scanout using the Ozone/DRM backend).
virtual gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id,
const gfx::Size& size,
const gfx::Size& framebuffer_size,
gfx::BufferFormat format,
gfx::BufferUsage usage,
int client_id,
SurfaceHandle surface_handle) = 0;
// Same as above, but returns the result asynchrounously. Safe to use on the
// IO thread. |callback| will be called on the same thread that calls this
// method, and it might be called on the same call stack.
using CreateGpuMemoryBufferAsyncCallback =
base::OnceCallback<void(gfx::GpuMemoryBufferHandle)>;
virtual void CreateGpuMemoryBufferAsync(
gfx::GpuMemoryBufferId id,
const gfx::Size& size,
gfx::BufferFormat format,
gfx::BufferUsage usage,
int client_id,
SurfaceHandle surface_handle,
CreateGpuMemoryBufferAsyncCallback callback);
// Destroys GPU memory buffer identified by |id|. It can be called on any
// thread.
virtual void DestroyGpuMemoryBuffer(gfx::GpuMemoryBufferId id,
int client_id) = 0;
// Fills |shared_memory| with the contents of the provided |buffer_handle|
virtual bool FillSharedMemoryRegionWithBufferContents(
gfx::GpuMemoryBufferHandle buffer_handle,
base::UnsafeSharedMemoryRegion shared_memory) = 0;
protected:
GpuMemoryBufferFactory() = default;
};
} // namespace gpu
#endif // GPU_IPC_SERVICE_GPU_MEMORY_BUFFER_FACTORY_H_