Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(537)

Side by Side Diff: content/common/gpu/client/gpu_channel_host.h

Issue 1656433002: Sample code: IPC Transport object for GPU Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: GpuMemoryBufferService + Transport object. TODO: Eliminate ChildThreadImpl dependency Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CONTENT_COMMON_GPU_CLIENT_GPU_CHANNEL_HOST_H_ 5 #ifndef CONTENT_COMMON_GPU_CLIENT_GPU_CHANNEL_HOST_H_
6 #define CONTENT_COMMON_GPU_CLIENT_GPU_CHANNEL_HOST_H_ 6 #define CONTENT_COMMON_GPU_CLIENT_GPU_CHANNEL_HOST_H_
7 7
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
11 #include <string> 11 #include <string>
12 #include <vector> 12 #include <vector>
13 13
14 #include "base/atomic_sequence_num.h" 14 #include "base/atomic_sequence_num.h"
15 #include "base/containers/scoped_ptr_hash_map.h" 15 #include "base/containers/scoped_ptr_hash_map.h"
16 #include "base/macros.h" 16 #include "base/macros.h"
17 #include "base/memory/ref_counted.h" 17 #include "base/memory/ref_counted.h"
18 #include "base/memory/scoped_ptr.h" 18 #include "base/memory/scoped_ptr.h"
19 #include "base/memory/weak_ptr.h" 19 #include "base/memory/weak_ptr.h"
20 #include "base/process/process.h" 20 #include "base/process/process.h"
21 #include "base/synchronization/lock.h" 21 #include "base/synchronization/lock.h"
22 #include "content/common/content_export.h" 22 #include "content/common/content_export.h"
23 #include "content/common/gpu/client/ipc/gpu_channel_host_ipc_transport.h"
23 #include "content/common/gpu/gpu_process_launch_causes.h" 24 #include "content/common/gpu/gpu_process_launch_causes.h"
24 #include "content/common/gpu/gpu_result_codes.h" 25 #include "content/common/gpu/gpu_result_codes.h"
25 #include "content/common/gpu/gpu_stream_priority.h" 26 #include "content/common/gpu/gpu_stream_priority.h"
26 #include "content/common/message_router.h"
27 #include "gpu/config/gpu_info.h" 27 #include "gpu/config/gpu_info.h"
28 #include "ipc/ipc_channel_handle.h"
29 #include "ipc/ipc_sync_channel.h"
30 #include "ipc/message_filter.h"
31 #include "media/video/jpeg_decode_accelerator.h" 28 #include "media/video/jpeg_decode_accelerator.h"
32 #include "ui/events/latency_info.h" 29 #include "ui/events/latency_info.h"
33 #include "ui/gfx/geometry/size.h" 30 #include "ui/gfx/geometry/size.h"
34 #include "ui/gfx/gpu_memory_buffer.h" 31 #include "ui/gfx/gpu_memory_buffer.h"
35 #include "ui/gfx/native_widget_types.h" 32 #include "ui/gfx/native_widget_types.h"
36 #include "ui/gl/gpu_preference.h" 33 #include "ui/gl/gpu_preference.h"
37 34
38 class GURL; 35 class GURL;
39 class TransportTextureService; 36 class TransportTextureService;
40 struct GPUCreateCommandBufferConfig;
41 37
42 namespace base { 38 namespace base {
43 class MessageLoop; 39 class MessageLoop;
44 class WaitableEvent; 40 class WaitableEvent;
45 } 41 }
46 42
47 namespace IPC { 43 namespace IPC {
48 class SyncMessageFilter; 44 class SyncMessageFilter;
49 } 45 }
50 46
51 namespace media { 47 namespace media {
52 class JpegDecodeAccelerator; 48 class JpegDecodeAccelerator;
53 class VideoDecodeAccelerator; 49 class VideoDecodeAccelerator;
54 class VideoEncodeAccelerator; 50 class VideoEncodeAccelerator;
55 } 51 }
56 52
57 namespace gpu { 53 namespace gpu {
58 class GpuMemoryBufferManager; 54 class GpuMemoryBufferManager;
59 } 55 }
60 56
61 namespace content { 57 namespace content {
62 class CommandBufferProxyImpl; 58 class CommandBufferProxyImpl;
63 class GpuChannelHost; 59 class GpuChannelHost;
64 60 class GpuChannelHostFactory;
65 class CONTENT_EXPORT GpuChannelHostFactory { 61 struct GpuCreateCommandBufferConfig;
66 public:
67 virtual ~GpuChannelHostFactory() {}
68
69 virtual bool IsMainThread() = 0;
70 virtual scoped_refptr<base::SingleThreadTaskRunner>
71 GetIOThreadTaskRunner() = 0;
72 virtual scoped_ptr<base::SharedMemory> AllocateSharedMemory(size_t size) = 0;
73 virtual CreateCommandBufferResult CreateViewCommandBuffer(
74 int32_t surface_id,
75 const GPUCreateCommandBufferConfig& init_params,
76 int32_t route_id) = 0;
77 };
78 62
79 // Encapsulates an IPC channel between the client and one GPU process. 63 // Encapsulates an IPC channel between the client and one GPU process.
80 // On the GPU process side there's a corresponding GpuChannel. 64 // On the GPU process side there's a corresponding GpuChannel.
81 // Every method can be called on any thread with a message loop, except for the 65 // Every method can be called on any thread with a message loop, except for the
82 // IO thread. 66 // IO thread.
83 class GpuChannelHost : public IPC::Sender, 67 class GpuChannelHost : public base::RefCountedThreadSafe<GpuChannelHost> {
84 public base::RefCountedThreadSafe<GpuChannelHost> {
85 public: 68 public:
86 // Must be called on the main thread (as defined by the factory). 69 // Must be called on the main thread (as defined by the factory).
87 static scoped_refptr<GpuChannelHost> Create( 70 static scoped_refptr<GpuChannelHost> Create(
88 GpuChannelHostFactory* factory, 71 scoped_ptr<GpuChannelHostIPCTransport> transport,
89 int channel_id,
90 const gpu::GPUInfo& gpu_info, 72 const gpu::GPUInfo& gpu_info,
91 const IPC::ChannelHandle& channel_handle,
92 base::WaitableEvent* shutdown_event,
93 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager); 73 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager);
94 74
95 static const int32_t kDefaultStreamId = -1; 75 static const int32_t kDefaultStreamId = -1;
96 static const GpuStreamPriority kDefaultStreamPriority = 76 static const GpuStreamPriority kDefaultStreamPriority =
97 GpuStreamPriority::NORMAL; 77 GpuStreamPriority::NORMAL;
98 78
99 bool IsLost() const { 79 bool IsLost() const {
100 DCHECK(channel_filter_.get()); 80 DCHECK(transport_.get());
101 return channel_filter_->IsLost(); 81 return transport_->IsLost();
102 } 82 }
103 83
104 int channel_id() const { return channel_id_; }
105
106 // The GPU stats reported by the GPU process. 84 // The GPU stats reported by the GPU process.
107 const gpu::GPUInfo& gpu_info() const { return gpu_info_; } 85 const gpu::GPUInfo& gpu_info() const { return gpu_info_; }
108 86
109 // IPC::Sender implementation:
110 bool Send(IPC::Message* msg) override;
111
112 // Set an ordering barrier. AsyncFlushes any pending barriers on other 87 // Set an ordering barrier. AsyncFlushes any pending barriers on other
113 // routes. Combines multiple OrderingBarriers into a single AsyncFlush. 88 // routes. Combines multiple OrderingBarriers into a single AsyncFlush.
114 // Returns the flush ID for the stream or 0 if put offset was not changed. 89 // Returns the flush ID for the stream or 0 if put offset was not changed.
115 uint32_t OrderingBarrier(int32_t route_id, 90 uint32_t OrderingBarrier(CommandBufferIPCTransport* transport,
116 int32_t stream_id, 91 int32_t stream_id,
117 int32_t put_offset, 92 int32_t put_offset,
118 uint32_t flush_count, 93 uint32_t flush_count,
119 const std::vector<ui::LatencyInfo>& latency_info, 94 const std::vector<ui::LatencyInfo>& latency_info,
120 bool put_offset_changed, 95 bool put_offset_changed,
121 bool do_flush); 96 bool do_flush);
122 97
123 void FlushPendingStream(int32_t stream_id); 98 void FlushPendingStream(int32_t stream_id);
124 99
125 // Create and connect to a command buffer in the GPU process. 100 // Create and connect to a command buffer in the GPU process.
(...skipping 20 matching lines...) Expand all
146 scoped_ptr<media::JpegDecodeAccelerator> CreateJpegDecoder( 121 scoped_ptr<media::JpegDecodeAccelerator> CreateJpegDecoder(
147 media::JpegDecodeAccelerator::Client* client); 122 media::JpegDecodeAccelerator::Client* client);
148 123
149 // Destroy a command buffer created by this channel. 124 // Destroy a command buffer created by this channel.
150 void DestroyCommandBuffer(CommandBufferProxyImpl* command_buffer); 125 void DestroyCommandBuffer(CommandBufferProxyImpl* command_buffer);
151 126
152 // Destroy this channel. Must be called on the main thread, before 127 // Destroy this channel. Must be called on the main thread, before
153 // destruction. 128 // destruction.
154 void DestroyChannel(); 129 void DestroyChannel();
155 130
156 // Add a route for the current message loop.
157 void AddRoute(int route_id, base::WeakPtr<IPC::Listener> listener);
158 void RemoveRoute(int route_id);
159
160 GpuChannelHostFactory* factory() const { return factory_; }
161
162 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager() const { 131 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager() const {
163 return gpu_memory_buffer_manager_; 132 return gpu_memory_buffer_manager_;
164 } 133 }
165 134
166 // Returns a handle to the shared memory that can be sent via IPC to the 135 // Returns a handle to the shared memory that can be sent via IPC to the
167 // GPU process. The caller is responsible for ensuring it is closed. Returns 136 // GPU process. The caller is responsible for ensuring it is closed. Returns
168 // an invalid handle on failure. 137 // an invalid handle on failure.
169 base::SharedMemoryHandle ShareToGpuProcess( 138 base::SharedMemoryHandle ShareToGpuProcess(
170 base::SharedMemoryHandle source_handle); 139 base::SharedMemoryHandle source_handle);
171 140
172 // Reserve one unused transfer buffer ID. 141 // Reserve one unused transfer buffer ID.
173 int32_t ReserveTransferBufferId(); 142 int32_t ReserveTransferBufferId();
174 143
175 // Returns a GPU memory buffer handle to the buffer that can be sent via 144 // Returns a GPU memory buffer handle to the buffer that can be sent via
176 // IPC to the GPU process. The caller is responsible for ensuring it is 145 // IPC to the GPU process. The caller is responsible for ensuring it is
177 // closed. Returns an invalid handle on failure. 146 // closed. Returns an invalid handle on failure.
178 gfx::GpuMemoryBufferHandle ShareGpuMemoryBufferToGpuProcess( 147 gfx::GpuMemoryBufferHandle ShareGpuMemoryBufferToGpuProcess(
179 const gfx::GpuMemoryBufferHandle& source_handle, 148 const gfx::GpuMemoryBufferHandle& source_handle,
180 bool* requires_sync_point); 149 bool* requires_sync_point);
181 150
182 // Reserve one unused image ID. 151 // Reserve one unused image ID.
183 int32_t ReserveImageId(); 152 int32_t ReserveImageId();
184 153
185 // Generate a route ID guaranteed to be unique for this channel.
186 int32_t GenerateRouteID();
187
188 // Generate a stream ID guaranteed to be unique for this channel. 154 // Generate a stream ID guaranteed to be unique for this channel.
189 int32_t GenerateStreamID(); 155 int32_t GenerateStreamID();
190 156
191 // Sends a synchronous nop to the server which validate that all previous IPC 157 // Sends a synchronous nop to the server which validate that all previous IPC
192 // messages have been received. Once the synchronous nop has been sent to the 158 // messages have been received. Once the synchronous nop has been sent to the
193 // server all previous flushes will all be marked as validated, including 159 // server all previous flushes will all be marked as validated, including
194 // flushes for other streams on the same channel. Once a validation has been 160 // flushes for other streams on the same channel. Once a validation has been
195 // sent, it will return the highest validated flush id for the stream. 161 // sent, it will return the highest validated flush id for the stream.
196 // If the validation fails (which can only happen upon context lost), the 162 // If the validation fails (which can only happen upon context lost), the
197 // highest validated flush id will not change. If no flush ID were ever 163 // highest validated flush id will not change. If no flush ID were ever
198 // validated then it will return 0 (Note the lowest valid flush ID is 1). 164 // validated then it will return 0 (Note the lowest valid flush ID is 1).
199 uint32_t ValidateFlushIDReachedServer(int32_t stream_id, bool force_validate); 165 uint32_t ValidateFlushIDReachedServer(int32_t stream_id, bool force_validate);
200 166
201 // Returns the highest validated flush ID for a given stream. 167 // Returns the highest validated flush ID for a given stream.
202 uint32_t GetHighestValidatedFlushID(int32_t stream_id); 168 uint32_t GetHighestValidatedFlushID(int32_t stream_id);
203 169
204 private: 170 private:
205 friend class base::RefCountedThreadSafe<GpuChannelHost>; 171 friend class base::RefCountedThreadSafe<GpuChannelHost>;
206 172
207 // A filter used internally to route incoming messages from the IO thread
208 // to the correct message loop. It also maintains some shared state between
209 // all the contexts.
210 class MessageFilter : public IPC::MessageFilter {
211 public:
212 MessageFilter();
213
214 // Called on the IO thread.
215 void AddRoute(int32_t route_id,
216 base::WeakPtr<IPC::Listener> listener,
217 scoped_refptr<base::SingleThreadTaskRunner> task_runner);
218 // Called on the IO thread.
219 void RemoveRoute(int32_t route_id);
220
221 // IPC::MessageFilter implementation
222 // (called on the IO thread):
223 bool OnMessageReceived(const IPC::Message& msg) override;
224 void OnChannelError() override;
225
226 // The following methods can be called on any thread.
227
228 // Whether the channel is lost.
229 bool IsLost() const;
230
231 private:
232 struct ListenerInfo {
233 ListenerInfo();
234 ~ListenerInfo();
235
236 base::WeakPtr<IPC::Listener> listener;
237 scoped_refptr<base::SingleThreadTaskRunner> task_runner;
238 };
239
240 ~MessageFilter() override;
241
242 // Threading notes: |listeners_| is only accessed on the IO thread. Every
243 // other field is protected by |lock_|.
244 base::hash_map<int32_t, ListenerInfo> listeners_;
245
246 // Protects all fields below this one.
247 mutable base::Lock lock_;
248
249 // Whether the channel has been lost.
250 bool lost_;
251 };
252
253 struct StreamFlushInfo { 173 struct StreamFlushInfo {
254 StreamFlushInfo(); 174 StreamFlushInfo();
255 ~StreamFlushInfo(); 175 ~StreamFlushInfo();
256 176
257 // These are global per stream. 177 // These are global per stream.
258 uint32_t next_stream_flush_id; 178 uint32_t next_stream_flush_id;
259 uint32_t flushed_stream_flush_id; 179 uint32_t flushed_stream_flush_id;
260 uint32_t verified_stream_flush_id; 180 uint32_t verified_stream_flush_id;
261 181
262 // These are local per context. 182 // These are local per context.
263 bool flush_pending; 183 bool flush_pending;
264 int32_t route_id; 184 // int32_t route_id;
185 CommandBufferIPCTransport* transport;
265 int32_t put_offset; 186 int32_t put_offset;
266 uint32_t flush_count; 187 uint32_t flush_count;
267 uint32_t flush_id; 188 uint32_t flush_id;
268 std::vector<ui::LatencyInfo> latency_info; 189 std::vector<ui::LatencyInfo> latency_info;
269 }; 190 };
270 191
271 GpuChannelHost(GpuChannelHostFactory* factory, 192 GpuChannelHost(scoped_ptr<GpuChannelHostIPCTransport> transport,
272 int channel_id,
273 const gpu::GPUInfo& gpu_info, 193 const gpu::GPUInfo& gpu_info,
274 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager); 194 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager);
275 ~GpuChannelHost() override; 195 ~GpuChannelHost();
276 void Connect(const IPC::ChannelHandle& channel_handle, 196
277 base::WaitableEvent* shutdown_event);
278 bool InternalSend(IPC::Message* msg);
279 void InternalFlush(StreamFlushInfo* flush_info); 197 void InternalFlush(StreamFlushInfo* flush_info);
280 198
281 // Threading notes: all fields are constant during the lifetime of |this|
282 // except:
283 // - |next_image_id_|, atomic type
284 // - |next_route_id_|, atomic type
285 // - |next_stream_id_|, atomic type
286 // - |channel_| and |stream_flush_info_|, protected by |context_lock_|
287 GpuChannelHostFactory* const factory_;
288
289 const int channel_id_;
290 const gpu::GPUInfo gpu_info_; 199 const gpu::GPUInfo gpu_info_;
291 200
292 scoped_refptr<MessageFilter> channel_filter_;
293
294 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager_; 201 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager_;
295 202
296 // A filter for sending messages from thread other than the main thread.
297 scoped_refptr<IPC::SyncMessageFilter> sync_filter_;
298
299 // Image IDs are allocated in sequence. 203 // Image IDs are allocated in sequence.
300 base::AtomicSequenceNumber next_image_id_; 204 base::AtomicSequenceNumber next_image_id_;
301 205
302 // Route IDs are allocated in sequence.
303 base::AtomicSequenceNumber next_route_id_;
304
305 // Stream IDs are allocated in sequence. 206 // Stream IDs are allocated in sequence.
306 base::AtomicSequenceNumber next_stream_id_; 207 base::AtomicSequenceNumber next_stream_id_;
307 208
308 // Protects channel_ and stream_flush_info_. 209 // Protects channel_ and stream_flush_info_.
309 mutable base::Lock context_lock_; 210 mutable base::Lock context_lock_;
310 scoped_ptr<IPC::SyncChannel> channel_;
311 base::hash_map<int32_t, StreamFlushInfo> stream_flush_info_; 211 base::hash_map<int32_t, StreamFlushInfo> stream_flush_info_;
312 212
213 scoped_ptr<GpuChannelHostIPCTransport> transport_;
214
313 DISALLOW_COPY_AND_ASSIGN(GpuChannelHost); 215 DISALLOW_COPY_AND_ASSIGN(GpuChannelHost);
314 }; 216 };
315 217
316 } // namespace content 218 } // namespace content
317 219
318 #endif // CONTENT_COMMON_GPU_CLIENT_GPU_CHANNEL_HOST_H_ 220 #endif // CONTENT_COMMON_GPU_CLIENT_GPU_CHANNEL_HOST_H_
OLDNEW
« no previous file with comments | « content/common/gpu/client/command_buffer_proxy_impl.cc ('k') | content/common/gpu/client/gpu_channel_host.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698