OLD | NEW |
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 #include "content/common/gpu/texture_image_transport_surface.h" | 5 #include "content/common/gpu/texture_image_transport_surface.h" |
6 | 6 |
7 #include "content/common/gpu/gpu_channel.h" | 7 #include "content/common/gpu/gpu_channel.h" |
8 #include "content/common/gpu/gpu_channel_manager.h" | 8 #include "content/common/gpu/gpu_channel_manager.h" |
9 #include "content/common/gpu/gpu_messages.h" | 9 #include "content/common/gpu/gpu_messages.h" |
10 #include "gpu/command_buffer/service/context_group.h" | 10 #include "gpu/command_buffer/service/context_group.h" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 ~ScopedTextureBinder() { | 43 ~ScopedTextureBinder() { |
44 glBindTexture(GL_TEXTURE_2D, old_id_); | 44 glBindTexture(GL_TEXTURE_2D, old_id_); |
45 } | 45 } |
46 | 46 |
47 private: | 47 private: |
48 int old_id_; | 48 int old_id_; |
49 }; | 49 }; |
50 | 50 |
51 } // anonymous namespace | 51 } // anonymous namespace |
52 | 52 |
| 53 TextureImageTransportSurface::Texture::Texture() |
| 54 : client_id(0), |
| 55 sent_to_client(false) { |
| 56 } |
| 57 |
| 58 TextureImageTransportSurface::Texture::~Texture() { |
| 59 } |
| 60 |
53 TextureImageTransportSurface::TextureImageTransportSurface( | 61 TextureImageTransportSurface::TextureImageTransportSurface( |
54 GpuChannelManager* manager, | 62 GpuChannelManager* manager, |
55 GpuCommandBufferStub* stub, | 63 GpuCommandBufferStub* stub, |
56 const gfx::GLSurfaceHandle& handle) | 64 const gfx::GLSurfaceHandle& handle) |
57 : fbo_id_(0), | 65 : fbo_id_(0), |
58 front_(0), | 66 front_(0), |
59 stub_destroyed_(false) { | 67 stub_destroyed_(false), |
| 68 parent_stub_(NULL) { |
60 GpuChannel* parent_channel = manager->LookupChannel(handle.parent_client_id); | 69 GpuChannel* parent_channel = manager->LookupChannel(handle.parent_client_id); |
61 DCHECK(parent_channel); | 70 DCHECK(parent_channel); |
62 GpuCommandBufferStub* parent_stub = parent_channel->LookupCommandBuffer( | 71 parent_stub_ = parent_channel->LookupCommandBuffer(handle.parent_context_id); |
63 handle.parent_context_id); | 72 DCHECK(parent_stub_); |
64 DCHECK(parent_stub); | 73 parent_stub_->AddDestructionObserver(this); |
65 parent_stub_ = parent_stub->AsWeakPtr(); | |
66 TextureManager* texture_manager = | 74 TextureManager* texture_manager = |
67 parent_stub_->decoder()->GetContextGroup()->texture_manager(); | 75 parent_stub_->decoder()->GetContextGroup()->texture_manager(); |
68 DCHECK(texture_manager); | 76 DCHECK(texture_manager); |
69 | 77 |
70 for (int i = 0; i < 2; ++i) { | 78 for (int i = 0; i < 2; ++i) { |
71 Texture& texture = textures_[i]; | 79 Texture& texture = textures_[i]; |
72 texture.client_id = handle.parent_texture_id[i]; | 80 texture.client_id = handle.parent_texture_id[i]; |
73 TextureInfo* info = texture_manager->GetTextureInfo(texture.client_id); | 81 texture.info = texture_manager->GetTextureInfo(texture.client_id); |
74 DCHECK(info); | 82 DCHECK(texture.info); |
75 if (!info->target()) | 83 if (!texture.info->target()) |
76 texture_manager->SetInfoTarget(info, GL_TEXTURE_2D); | 84 texture_manager->SetInfoTarget(texture.info, GL_TEXTURE_2D); |
77 texture_manager->SetParameter(info, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | 85 texture_manager->SetParameter( |
78 texture_manager->SetParameter(info, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | 86 texture.info, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
79 texture_manager->SetParameter(info, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 87 texture_manager->SetParameter( |
80 texture_manager->SetParameter(info, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 88 texture.info, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
| 89 texture_manager->SetParameter( |
| 90 texture.info, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| 91 texture_manager->SetParameter( |
| 92 texture.info, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
81 } | 93 } |
82 | 94 |
83 helper_.reset(new ImageTransportHelper(this, | 95 helper_.reset(new ImageTransportHelper(this, |
84 manager, | 96 manager, |
85 stub, | 97 stub, |
86 gfx::kNullPluginWindow)); | 98 gfx::kNullPluginWindow)); |
87 | 99 |
88 stub->AddDestructionObserver(this); | 100 stub->AddDestructionObserver(this); |
89 } | 101 } |
90 | 102 |
91 TextureImageTransportSurface::~TextureImageTransportSurface() { | 103 TextureImageTransportSurface::~TextureImageTransportSurface() { |
92 DCHECK(stub_destroyed_); | 104 DCHECK(stub_destroyed_); |
93 Destroy(); | 105 Destroy(); |
94 } | 106 } |
95 | 107 |
96 bool TextureImageTransportSurface::Initialize() { | 108 bool TextureImageTransportSurface::Initialize() { |
97 return helper_->Initialize(); | 109 return helper_->Initialize(); |
98 } | 110 } |
99 | 111 |
100 void TextureImageTransportSurface::Destroy() { | 112 void TextureImageTransportSurface::Destroy() { |
| 113 if (parent_stub_) { |
| 114 parent_stub_->RemoveDestructionObserver(this); |
| 115 parent_stub_ = NULL; |
| 116 } |
101 for (int i = 0; i < 2; ++i) { | 117 for (int i = 0; i < 2; ++i) { |
102 Texture& texture = textures_[i]; | 118 Texture& texture = textures_[i]; |
103 if (!texture.sent_to_client) | 119 if (!texture.sent_to_client) |
104 continue; | 120 continue; |
105 GpuHostMsg_AcceleratedSurfaceRelease_Params params; | 121 GpuHostMsg_AcceleratedSurfaceRelease_Params params; |
106 params.identifier = texture.client_id; | 122 params.identifier = texture.client_id; |
107 helper_->SendAcceleratedSurfaceRelease(params); | 123 helper_->SendAcceleratedSurfaceRelease(params); |
| 124 texture.info = NULL; |
108 } | 125 } |
109 | 126 |
110 helper_->Destroy(); | 127 helper_->Destroy(); |
111 } | 128 } |
112 | 129 |
113 bool TextureImageTransportSurface::Resize(const gfx::Size&) { | 130 bool TextureImageTransportSurface::Resize(const gfx::Size&) { |
114 return true; | 131 return true; |
115 } | 132 } |
116 | 133 |
117 bool TextureImageTransportSurface::IsOffscreen() { | 134 bool TextureImageTransportSurface::IsOffscreen() { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
160 ReleaseBackTexture(); | 177 ReleaseBackTexture(); |
161 break; | 178 break; |
162 }; | 179 }; |
163 } | 180 } |
164 | 181 |
165 void* TextureImageTransportSurface::GetShareHandle() { | 182 void* TextureImageTransportSurface::GetShareHandle() { |
166 return GetHandle(); | 183 return GetHandle(); |
167 } | 184 } |
168 | 185 |
169 void* TextureImageTransportSurface::GetDisplay() { | 186 void* TextureImageTransportSurface::GetDisplay() { |
170 return parent_stub_.get() ? parent_stub_->surface()->GetDisplay() : NULL; | 187 return parent_stub_ ? parent_stub_->surface()->GetDisplay() : NULL; |
171 } | 188 } |
172 | 189 |
173 void* TextureImageTransportSurface::GetConfig() { | 190 void* TextureImageTransportSurface::GetConfig() { |
174 return parent_stub_.get() ? parent_stub_->surface()->GetConfig() : NULL; | 191 return parent_stub_ ? parent_stub_->surface()->GetConfig() : NULL; |
175 } | 192 } |
176 | 193 |
177 void TextureImageTransportSurface::OnResize(gfx::Size size) { | 194 void TextureImageTransportSurface::OnResize(gfx::Size size) { |
178 CreateBackTexture(size); | 195 CreateBackTexture(size); |
179 } | 196 } |
180 | 197 |
181 void TextureImageTransportSurface::OnWillDestroyStub( | 198 void TextureImageTransportSurface::OnWillDestroyStub( |
182 GpuCommandBufferStub* stub) { | 199 GpuCommandBufferStub* stub) { |
183 glDeleteFramebuffersEXT(1, &fbo_id_); | 200 stub->RemoveDestructionObserver(this); |
184 CHECK_GL_ERROR(); | 201 if (stub == parent_stub_) { |
185 fbo_id_ = 0; | 202 // We are losing the parent stub, we need to clear the reference on the |
| 203 // infos (they are not allowed to outlive the stub). |
| 204 textures_[0].info = NULL; |
| 205 textures_[1].info = NULL; |
| 206 parent_stub_ = NULL; |
| 207 } else { |
| 208 // We are losing the stub owning us, this is our last chance to clean up the |
| 209 // resources we allocated in the stub's context. |
| 210 glDeleteFramebuffersEXT(1, &fbo_id_); |
| 211 CHECK_GL_ERROR(); |
| 212 fbo_id_ = 0; |
186 | 213 |
187 stub->RemoveDestructionObserver(this); | 214 stub_destroyed_ = true; |
188 stub_destroyed_ = true; | 215 } |
189 } | 216 } |
190 | 217 |
191 bool TextureImageTransportSurface::SwapBuffers() { | 218 bool TextureImageTransportSurface::SwapBuffers() { |
| 219 if (!parent_stub_) { |
| 220 LOG(ERROR) << "SwapBuffers failed because no parent stub."; |
| 221 return false; |
| 222 } |
| 223 |
192 glFlush(); | 224 glFlush(); |
193 front_ = back(); | 225 front_ = back(); |
194 previous_damage_rect_ = gfx::Rect(textures_[front_].size); | 226 previous_damage_rect_ = gfx::Rect(textures_[front_].size); |
195 | 227 |
196 DCHECK(textures_[front_].client_id != 0); | 228 DCHECK(textures_[front_].client_id != 0); |
197 | 229 |
198 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; | 230 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; |
199 params.surface_handle = textures_[front_].client_id; | 231 params.surface_handle = textures_[front_].client_id; |
200 helper_->SendAcceleratedSurfaceBuffersSwapped(params); | 232 helper_->SendAcceleratedSurfaceBuffersSwapped(params); |
201 helper_->SetScheduled(false); | 233 helper_->SetScheduled(false); |
202 return true; | 234 return true; |
203 } | 235 } |
204 | 236 |
205 bool TextureImageTransportSurface::PostSubBuffer( | 237 bool TextureImageTransportSurface::PostSubBuffer( |
206 int x, int y, int width, int height) { | 238 int x, int y, int width, int height) { |
207 if (!parent_stub_.get()) | 239 if (!parent_stub_) { |
| 240 LOG(ERROR) << "PostSubBuffer failed because no parent stub."; |
208 return false; | 241 return false; |
| 242 } |
209 | 243 |
210 TextureInfo* info = GetParentInfo(textures_[back()].client_id); | 244 DCHECK(textures_[back()].info); |
211 if (!info) | 245 int back_texture_service_id = textures_[back()].info->service_id(); |
212 return false; | |
213 int back_texture_service_id = info->service_id(); | |
214 | 246 |
215 info = GetParentInfo(textures_[front_].client_id); | 247 DCHECK(textures_[front_].info); |
216 if (!info) | 248 int front_texture_service_id = textures_[front_].info->service_id(); |
217 return false; | |
218 int front_texture_service_id = info->service_id(); | |
219 | 249 |
220 gfx::Size expected_size = textures_[back()].size; | 250 gfx::Size expected_size = textures_[back()].size; |
221 bool surfaces_same_size = textures_[front_].size == expected_size; | 251 bool surfaces_same_size = textures_[front_].size == expected_size; |
222 | 252 |
223 const gfx::Rect new_damage_rect(x, y, width, height); | 253 const gfx::Rect new_damage_rect(x, y, width, height); |
224 | 254 |
225 // An empty damage rect is a successful no-op. | 255 // An empty damage rect is a successful no-op. |
226 if (new_damage_rect.IsEmpty()) | 256 if (new_damage_rect.IsEmpty()) |
227 return true; | 257 return true; |
228 | 258 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 extensions += "GL_CHROMIUM_front_buffer_cached "; | 302 extensions += "GL_CHROMIUM_front_buffer_cached "; |
273 extensions += "GL_CHROMIUM_post_sub_buffer"; | 303 extensions += "GL_CHROMIUM_post_sub_buffer"; |
274 return extensions; | 304 return extensions; |
275 } | 305 } |
276 | 306 |
277 gfx::Size TextureImageTransportSurface::GetSize() { | 307 gfx::Size TextureImageTransportSurface::GetSize() { |
278 return textures_[back()].size; | 308 return textures_[back()].size; |
279 } | 309 } |
280 | 310 |
281 void* TextureImageTransportSurface::GetHandle() { | 311 void* TextureImageTransportSurface::GetHandle() { |
282 return parent_stub_.get() ? parent_stub_->surface()->GetHandle() : NULL; | 312 return parent_stub_ ? parent_stub_->surface()->GetHandle() : NULL; |
283 } | 313 } |
284 | 314 |
285 | 315 |
286 void TextureImageTransportSurface::OnNewSurfaceACK( | 316 void TextureImageTransportSurface::OnNewSurfaceACK( |
287 uint64 surface_handle, TransportDIB::Handle /*shm_handle*/) { | 317 uint64 surface_handle, TransportDIB::Handle /*shm_handle*/) { |
288 } | 318 } |
289 | 319 |
290 void TextureImageTransportSurface::OnBuffersSwappedACK() { | 320 void TextureImageTransportSurface::OnBuffersSwappedACK() { |
291 if (helper_->MakeCurrent()) { | 321 if (helper_->MakeCurrent()) { |
292 if (textures_[front_].size != textures_[back()].size) { | 322 if (textures_[front_].size != textures_[back()].size) { |
(...skipping 10 matching lines...) Expand all Loading... |
303 | 333 |
304 void TextureImageTransportSurface::OnPostSubBufferACK() { | 334 void TextureImageTransportSurface::OnPostSubBufferACK() { |
305 OnBuffersSwappedACK(); | 335 OnBuffersSwappedACK(); |
306 } | 336 } |
307 | 337 |
308 void TextureImageTransportSurface::OnResizeViewACK() { | 338 void TextureImageTransportSurface::OnResizeViewACK() { |
309 NOTREACHED(); | 339 NOTREACHED(); |
310 } | 340 } |
311 | 341 |
312 void TextureImageTransportSurface::ReleaseBackTexture() { | 342 void TextureImageTransportSurface::ReleaseBackTexture() { |
313 if (!parent_stub_.get()) | 343 if (!parent_stub_) |
314 return; | 344 return; |
315 TextureInfo* info = GetParentInfo(textures_[back()].client_id); | 345 TextureInfo* info = textures_[back()].info; |
316 if (!info) | 346 DCHECK(info); |
317 return; | |
318 | 347 |
319 GLuint service_id = info->service_id(); | 348 GLuint service_id = info->service_id(); |
320 if (!service_id) | 349 if (!service_id) |
321 return; | 350 return; |
322 info->SetServiceId(0); | 351 info->SetServiceId(0); |
323 | 352 |
324 { | 353 { |
325 ScopedFrameBufferBinder fbo_binder(fbo_id_); | 354 ScopedFrameBufferBinder fbo_binder(fbo_id_); |
326 glDeleteTextures(1, &service_id); | 355 glDeleteTextures(1, &service_id); |
327 } | 356 } |
328 glFlush(); | 357 glFlush(); |
329 CHECK_GL_ERROR(); | 358 CHECK_GL_ERROR(); |
330 } | 359 } |
331 | 360 |
332 void TextureImageTransportSurface::CreateBackTexture(const gfx::Size& size) { | 361 void TextureImageTransportSurface::CreateBackTexture(const gfx::Size& size) { |
333 if (!parent_stub_.get()) | 362 if (!parent_stub_) |
334 return; | 363 return; |
335 Texture& texture = textures_[back()]; | 364 Texture& texture = textures_[back()]; |
336 TextureInfo* info = GetParentInfo(texture.client_id); | 365 TextureInfo* info = texture.info; |
337 if (!info) | 366 DCHECK(info); |
338 return; | |
339 | 367 |
340 GLuint service_id = info->service_id(); | 368 GLuint service_id = info->service_id(); |
341 | 369 |
342 if (service_id && texture.size == size) | 370 if (service_id && texture.size == size) |
343 return; | 371 return; |
344 | 372 |
345 if (!service_id) { | 373 if (!service_id) { |
346 glGenTextures(1, &service_id); | 374 glGenTextures(1, &service_id); |
347 info->SetServiceId(service_id); | 375 info->SetServiceId(service_id); |
348 } | 376 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 | 409 |
382 GpuHostMsg_AcceleratedSurfaceNew_Params params; | 410 GpuHostMsg_AcceleratedSurfaceNew_Params params; |
383 params.width = size.width(); | 411 params.width = size.width(); |
384 params.height = size.height(); | 412 params.height = size.height(); |
385 params.surface_handle = texture.client_id; | 413 params.surface_handle = texture.client_id; |
386 helper_->SendAcceleratedSurfaceNew(params); | 414 helper_->SendAcceleratedSurfaceNew(params); |
387 texture.sent_to_client = true; | 415 texture.sent_to_client = true; |
388 } | 416 } |
389 | 417 |
390 void TextureImageTransportSurface::AttachBackTextureToFBO() { | 418 void TextureImageTransportSurface::AttachBackTextureToFBO() { |
391 if (!parent_stub_.get()) | 419 if (!parent_stub_) |
392 return; | 420 return; |
393 TextureInfo* info = GetParentInfo(textures_[back()].client_id); | 421 DCHECK(textures_[back()].info); |
394 if (!info) | |
395 return; | |
396 | 422 |
397 ScopedFrameBufferBinder fbo_binder(fbo_id_); | 423 ScopedFrameBufferBinder fbo_binder(fbo_id_); |
398 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, | 424 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, |
399 GL_COLOR_ATTACHMENT0, | 425 GL_COLOR_ATTACHMENT0, |
400 GL_TEXTURE_2D, | 426 GL_TEXTURE_2D, |
401 info->service_id(), | 427 textures_[back()].info->service_id(), |
402 0); | 428 0); |
403 glFlush(); | 429 glFlush(); |
404 CHECK_GL_ERROR(); | 430 CHECK_GL_ERROR(); |
405 | 431 |
406 #ifndef NDEBUG | 432 #ifndef NDEBUG |
407 GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); | 433 GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); |
408 if (status != GL_FRAMEBUFFER_COMPLETE) { | 434 if (status != GL_FRAMEBUFFER_COMPLETE) { |
409 DLOG(ERROR) << "Framebuffer incomplete."; | 435 DLOG(ERROR) << "Framebuffer incomplete."; |
410 } | 436 } |
411 #endif | 437 #endif |
412 } | 438 } |
413 | |
414 TextureInfo* TextureImageTransportSurface::GetParentInfo(uint32 client_id) { | |
415 DCHECK(parent_stub_.get()); | |
416 TextureManager* texture_manager = | |
417 parent_stub_->decoder()->GetContextGroup()->texture_manager(); | |
418 TextureInfo* info = texture_manager->GetTextureInfo(client_id); | |
419 return info; | |
420 } | |
OLD | NEW |