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

Side by Side Diff: content/renderer/transport_texture_host.h

Issue 7066035: Moved GPU related files in content/renderer into gpu subdirectory. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 7 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Transport texture is a mechanism to share a texture between renderer process
6 // and GPU process. This is useful when a texture is used in the renderer
7 // process but updated in the GPU process.
8 //
9 // BACKGROUND INFORMATION
10 //
11 // Renderer process uses command buffer to submit GLES2 commands to the GPU
12 // process for execution. When using a texture in the renderer process it is
13 // supposed to update the texture, for example by using glTexImage2D().
14 //
15 // However for some cases the texture needs to be updated in the GPU process.
16 // Objects other than command buffer in the GPU process will then need to
17 // access the texture ID.
18 //
19 // This class provides the following functions that solve the problems:
20 // 1. Textures be requested in the GPU process. The request is submitted
21 // to renderer process and textures are created in the command buffer
22 // context and eventually in the system context.
23 // 2. Textures are then create and used in the renderer process.
24 // 3. The corresponding texture ID in the GPU process can be obtained.
25 // 4. When texture is updated in the GPU process, notification can be received
26 // in the renderer process.
27 //
28 // THREAD SEMANTICS
29 //
30 // TransportTextureHost *must* be created on the render thread.
31 // After that methods of this object call be called on any thread.
32 //
33 // GLES2 commands are executed on Render Thread. IPC messages are sent and
34 // received on IO thread.
35 //
36 // USAGE
37 //
38 // --------------------------
39 // | In the renderer procss |
40 // --------------------------
41 //
42 // class TextureUpdateHandler {
43 // public:
44 // void OnTextureUpdate(int texture_id) {
45 // // Do something with the texture.
46 // }
47 // }
48 //
49 // TransportTextureHost factory_host;
50 // TextureUpdateHandler handler;
51 //
52 // void MyObjectInitDone() {
53 // std::vector<int> textures;
54 // factory_host.GetTextures(
55 // NewCallback(&handler, &TextureUpdateHandler::OnTextureUpdate),
56 // &textures);
57 // }
58 //
59 // void InitDone() {
60 // InitMyObjectInGPUProcess(factory_host.GetPeerId(),
61 // NewRunnableFunction(&MyObjectInitDone));
62 // }
63 //
64 // factory_host.Init(NewRunnableFunction(&InitDone));
65 //
66 // ----------------------
67 // | In the GPU process |
68 // ----------------------
69 //
70 // // When the transport texture factory id is known.
71 // TransportTexture* factory = gpu_channel->GetTransportTexture(id);
72 //
73 // void TextureCreateDone(vector<int> textures) {
74 // // Send message to renderer saying init is done.
75 // SendInitDone();
76 //
77 // UpdateTextureContent(textures[0]);
78 // factory->TextureUpdated(textures[0]);
79 // }
80 //
81 // // When init is requested from renderer.
82 // vector<int> textures;
83 //
84 // void OnInit() {
85 // factory->CreateTextures(3, 1024, 768, TransportTexture::RGB, &textures,
86 // NewRunnableFunction(&TextureCreateDone),
87 // textures);
88 // }
89
90 #ifndef CONTENT_RENDERER_TRANSPORT_TEXTURE_HOST_H_
91 #define CONTENT_RENDERER_TRANSPORT_TEXTURE_HOST_H_
92
93 #include <vector>
94
95 #include "base/basictypes.h"
96 #include "base/callback_old.h"
97 #include "base/memory/ref_counted.h"
98 #include "base/memory/scoped_ptr.h"
99 #include "base/task.h"
100 #include "ipc/ipc_channel.h"
101
102 class MessageLoop;
103 class RendererGLContext;
104 class TransportTextureService;
105
106 class TransportTextureHost
107 : public base::RefCountedThreadSafe<TransportTextureHost>,
108 public IPC::Channel::Listener {
109 public:
110 typedef Callback1<int>::Type TextureUpdateCallback;
111
112 // |io_message_loop| is where the IPC communication should happen.
113 // |render_message_loop| is where the GLES2 commands should be exeucted.
114 // |service| contains the route to this object.
115 // |sender| is used to send IPC messages to GPU process.
116 // |context| is the RendererGLContextt for generating textures.
117 // |context_route_id| is the route ID for the GpuChannelHost.
118 // |host_id| is the ID of this object in GpuChannelHost.
119 TransportTextureHost(MessageLoop* io_message_loop,
120 MessageLoop* render_message_loop,
121 TransportTextureService* service,
122 IPC::Message::Sender* sender,
123 RendererGLContext* context,
124 int32 context_route_id,
125 int32 host_id);
126 virtual ~TransportTextureHost();
127
128 // Initialize this object, this will cause a corresponding
129 // TransportTexture be created in the GPU process.
130 // |done_task| is called when initialization is completed.
131 void Init(Task* done_task);
132
133 // Destroy resources acquired by this object and in the GPU process.
134 //
135 // WARNING
136 //
137 // Call this method only after textures are not used in both the renderer
138 // and GPU process.
139 void Destroy();
140
141 // Get the list of textures generated through this factory.
142 // A callback must be provided to listen to texture update events. The
143 // callback will be called on the IO thread.
144 //
145 // Note that this method doesn't generate any textures, it simply return
146 // the list of textures generated.
147 void GetTextures(TextureUpdateCallback* callback,
148 std::vector<int>* textures);
149
150 // Return the peer ID of TransportTexture in the GPU process.
151 int GetPeerId();
152
153 // IPC::Channel::Listener.
154 virtual void OnChannelConnected(int32 peer_pid);
155 virtual void OnChannelError();
156 virtual bool OnMessageReceived(const IPC::Message& message);
157
158 private:
159 // Released all textures generated.
160 void ReleaseTexturesInternal();
161
162 // Send the texture IDs to the GPU process. This will copy the set of
163 // texture IDs.
164 void SendTexturesInternal(std::vector<int> textures);
165
166 // Send the destroy message to the GPU process.
167 void SendDestroyInternal();
168
169 ////////////////////////////////////////////////////////////////////////////
170 // IPC Message Handlers
171 void OnTransportTextureCreated(int32 peer_id);
172 void OnCreateTextures(int32 n, uint32 width, uint32 height, int32 format);
173 void OnReleaseTextures();
174 void OnTextureUpdated(int texture_id);
175
176 MessageLoop* io_message_loop_;
177 MessageLoop* render_message_loop_;
178 scoped_refptr<TransportTextureService> service_;
179
180 IPC::Message::Sender* sender_;
181 RendererGLContext* context_;
182 int32 context_route_id_;
183 int32 host_id_;
184 int32 peer_id_;
185
186 scoped_ptr<Task> init_task_;
187
188 // A list of textures generated.
189 std::vector<int> textures_;
190
191 // Callback when a texture is updated.
192 scoped_ptr<TextureUpdateCallback> update_callback_;
193
194 DISALLOW_COPY_AND_ASSIGN(TransportTextureHost);
195 };
196
197 #endif // CONTENT_RENDERER_TRANSPORT_TEXTURE_HOST_H_
OLDNEW
« no previous file with comments | « content/renderer/renderer_webkitclient_impl.cc ('k') | content/renderer/transport_texture_host.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698