| 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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 | 60 |
| 61 TextureImageTransportSurface::TextureImageTransportSurface( | 61 TextureImageTransportSurface::TextureImageTransportSurface( |
| 62 GpuChannelManager* manager, | 62 GpuChannelManager* manager, |
| 63 GpuCommandBufferStub* stub, | 63 GpuCommandBufferStub* stub, |
| 64 const gfx::GLSurfaceHandle& handle) | 64 const gfx::GLSurfaceHandle& handle) |
| 65 : fbo_id_(0), | 65 : fbo_id_(0), |
| 66 front_(0), | 66 front_(0), |
| 67 stub_destroyed_(false), | 67 stub_destroyed_(false), |
| 68 backbuffer_suggested_allocation_(true), | 68 backbuffer_suggested_allocation_(true), |
| 69 frontbuffer_suggested_allocation_(true), | 69 frontbuffer_suggested_allocation_(true), |
| 70 frontbuffer_is_protected_(true), |
| 71 ui_may_not_have_frontbuffer_handle_(false), |
| 72 current_valid_release_front_request_id_(0), |
| 73 next_unique_release_front_request_id_(0), |
| 70 parent_stub_(NULL) { | 74 parent_stub_(NULL) { |
| 71 GpuChannel* parent_channel = manager->LookupChannel(handle.parent_client_id); | 75 GpuChannel* parent_channel = manager->LookupChannel(handle.parent_client_id); |
| 72 DCHECK(parent_channel); | 76 DCHECK(parent_channel); |
| 73 parent_stub_ = parent_channel->LookupCommandBuffer(handle.parent_context_id); | 77 parent_stub_ = parent_channel->LookupCommandBuffer(handle.parent_context_id); |
| 74 DCHECK(parent_stub_); | 78 DCHECK(parent_stub_); |
| 75 parent_stub_->AddDestructionObserver(this); | 79 parent_stub_->AddDestructionObserver(this); |
| 76 TextureManager* texture_manager = | 80 TextureManager* texture_manager = |
| 77 parent_stub_->decoder()->GetContextGroup()->texture_manager(); | 81 parent_stub_->decoder()->GetContextGroup()->texture_manager(); |
| 78 DCHECK(texture_manager); | 82 DCHECK(texture_manager); |
| 79 | 83 |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 if (backbuffer_suggested_allocation_ == allocation) | 165 if (backbuffer_suggested_allocation_ == allocation) |
| 162 return; | 166 return; |
| 163 backbuffer_suggested_allocation_ = allocation; | 167 backbuffer_suggested_allocation_ = allocation; |
| 164 | 168 |
| 165 if (!helper_->MakeCurrent()) | 169 if (!helper_->MakeCurrent()) |
| 166 return; | 170 return; |
| 167 | 171 |
| 168 if (backbuffer_suggested_allocation_) | 172 if (backbuffer_suggested_allocation_) |
| 169 CreateBackTexture(textures_[back()].size); | 173 CreateBackTexture(textures_[back()].size); |
| 170 else | 174 else |
| 171 ReleaseBackTexture(); | 175 ReleaseTexture(back()); |
| 172 } | 176 } |
| 173 | 177 |
| 174 void TextureImageTransportSurface::SetFrontbufferAllocation(bool allocation) { | 178 void TextureImageTransportSurface::SetFrontbufferAllocation(bool allocation) { |
| 175 if (frontbuffer_suggested_allocation_ == allocation) | 179 if (frontbuffer_suggested_allocation_ == allocation) |
| 176 return; | 180 return; |
| 177 frontbuffer_suggested_allocation_ = allocation; | 181 frontbuffer_suggested_allocation_ = allocation; |
| 182 AdjustFrontBufferAllocation(0); |
| 183 } |
| 184 |
| 185 void TextureImageTransportSurface::AdjustFrontBufferAllocation( |
| 186 int retry_count) { |
| 187 if (!helper_->MakeCurrent()) |
| 188 return; |
| 189 |
| 190 if (!frontbuffer_suggested_allocation_ && |
| 191 textures_[front()].info->service_id() && |
| 192 !frontbuffer_is_protected_) |
| 193 RequestReleaseFrontTexture(retry_count); |
| 178 } | 194 } |
| 179 | 195 |
| 180 void* TextureImageTransportSurface::GetShareHandle() { | 196 void* TextureImageTransportSurface::GetShareHandle() { |
| 181 return GetHandle(); | 197 return GetHandle(); |
| 182 } | 198 } |
| 183 | 199 |
| 184 void* TextureImageTransportSurface::GetDisplay() { | 200 void* TextureImageTransportSurface::GetDisplay() { |
| 185 return parent_stub_ ? parent_stub_->surface()->GetDisplay() : NULL; | 201 return parent_stub_ ? parent_stub_->surface()->GetDisplay() : NULL; |
| 186 } | 202 } |
| 187 | 203 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 203 // resources we allocated in the stub's context. | 219 // resources we allocated in the stub's context. |
| 204 glDeleteFramebuffersEXT(1, &fbo_id_); | 220 glDeleteFramebuffersEXT(1, &fbo_id_); |
| 205 CHECK_GL_ERROR(); | 221 CHECK_GL_ERROR(); |
| 206 fbo_id_ = 0; | 222 fbo_id_ = 0; |
| 207 | 223 |
| 208 stub_destroyed_ = true; | 224 stub_destroyed_ = true; |
| 209 } | 225 } |
| 210 } | 226 } |
| 211 | 227 |
| 212 bool TextureImageTransportSurface::SwapBuffers() { | 228 bool TextureImageTransportSurface::SwapBuffers() { |
| 229 current_valid_release_front_request_id_ = 0; |
| 213 DCHECK(backbuffer_suggested_allocation_); | 230 DCHECK(backbuffer_suggested_allocation_); |
| 214 if (!frontbuffer_suggested_allocation_) | 231 if (!frontbuffer_suggested_allocation_) |
| 215 return true; | 232 return true; |
| 216 if (!parent_stub_) { | 233 if (!parent_stub_) { |
| 217 LOG(ERROR) << "SwapBuffers failed because no parent stub."; | 234 LOG(ERROR) << "SwapBuffers failed because no parent stub."; |
| 218 return false; | 235 return false; |
| 219 } | 236 } |
| 220 | 237 |
| 221 glFlush(); | 238 glFlush(); |
| 222 front_ = back(); | 239 front_ = back(); |
| 223 previous_damage_rect_ = gfx::Rect(textures_[front_].size); | 240 previous_damage_rect_ = gfx::Rect(textures_[front()].size); |
| 224 | 241 |
| 225 DCHECK(textures_[front_].client_id != 0); | 242 DCHECK(textures_[front()].client_id != 0); |
| 226 | 243 |
| 227 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; | 244 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; |
| 228 params.surface_handle = textures_[front_].client_id; | 245 params.surface_handle = textures_[front()].client_id; |
| 229 helper_->SendAcceleratedSurfaceBuffersSwapped(params); | 246 helper_->SendAcceleratedSurfaceBuffersSwapped(params); |
| 230 helper_->SetScheduled(false); | 247 helper_->SetScheduled(false); |
| 231 return true; | 248 return true; |
| 232 } | 249 } |
| 233 | 250 |
| 234 bool TextureImageTransportSurface::PostSubBuffer( | 251 bool TextureImageTransportSurface::PostSubBuffer( |
| 235 int x, int y, int width, int height) { | 252 int x, int y, int width, int height) { |
| 253 current_valid_release_front_request_id_ = 0; |
| 236 DCHECK(backbuffer_suggested_allocation_); | 254 DCHECK(backbuffer_suggested_allocation_); |
| 237 if (!frontbuffer_suggested_allocation_) | 255 if (!frontbuffer_suggested_allocation_) |
| 238 return true; | 256 return true; |
| 239 // If we are recreating the frontbuffer with this swap, make sure we are | 257 // If we are recreating the frontbuffer with this swap, make sure we are |
| 240 // drawing a full frame. | 258 // drawing a full frame. |
| 241 DCHECK(textures_[front_].info->service_id() || | 259 DCHECK(textures_[front_].info->service_id() || |
| 242 (!x && !y && gfx::Size(width, height) == textures_[back()].size)); | 260 (!x && !y && gfx::Size(width, height) == textures_[back()].size)); |
| 243 if (!parent_stub_) { | 261 if (!parent_stub_) { |
| 244 LOG(ERROR) << "PostSubBuffer failed because no parent stub."; | 262 LOG(ERROR) << "PostSubBuffer failed because no parent stub."; |
| 245 return false; | 263 return false; |
| 246 } | 264 } |
| 247 | 265 |
| 248 DCHECK(textures_[back()].info); | |
| 249 int back_texture_service_id = textures_[back()].info->service_id(); | |
| 250 | |
| 251 DCHECK(textures_[front_].info); | |
| 252 int front_texture_service_id = textures_[front_].info->service_id(); | |
| 253 | |
| 254 gfx::Size expected_size = textures_[back()].size; | |
| 255 bool surfaces_same_size = textures_[front_].size == expected_size; | |
| 256 | |
| 257 const gfx::Rect new_damage_rect(x, y, width, height); | 266 const gfx::Rect new_damage_rect(x, y, width, height); |
| 258 | 267 |
| 259 // An empty damage rect is a successful no-op. | 268 // An empty damage rect is a successful no-op. |
| 260 if (new_damage_rect.IsEmpty()) | 269 if (new_damage_rect.IsEmpty()) |
| 261 return true; | 270 return true; |
| 262 | 271 |
| 272 int back_texture_service_id = textures_[back()].info->service_id(); |
| 273 int front_texture_service_id = textures_[front()].info->service_id(); |
| 274 |
| 275 gfx::Size expected_size = textures_[back()].size; |
| 276 bool surfaces_same_size = textures_[front()].size == expected_size; |
| 277 |
| 263 if (surfaces_same_size) { | 278 if (surfaces_same_size) { |
| 264 std::vector<gfx::Rect> regions_to_copy; | 279 std::vector<gfx::Rect> regions_to_copy; |
| 265 GetRegionsToCopy(previous_damage_rect_, new_damage_rect, ®ions_to_copy); | 280 GetRegionsToCopy(previous_damage_rect_, new_damage_rect, ®ions_to_copy); |
| 266 | 281 |
| 267 ScopedFrameBufferBinder fbo_binder(fbo_id_); | 282 ScopedFrameBufferBinder fbo_binder(fbo_id_); |
| 268 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, | 283 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, |
| 269 GL_COLOR_ATTACHMENT0, | 284 GL_COLOR_ATTACHMENT0, |
| 270 GL_TEXTURE_2D, | 285 GL_TEXTURE_2D, |
| 271 front_texture_service_id, | 286 front_texture_service_id, |
| 272 0); | 287 0); |
| 273 ScopedTextureBinder texture_binder(back_texture_service_id); | 288 ScopedTextureBinder texture_binder(back_texture_service_id); |
| 274 | 289 |
| 275 for (size_t i = 0; i < regions_to_copy.size(); ++i) { | 290 for (size_t i = 0; i < regions_to_copy.size(); ++i) { |
| 276 const gfx::Rect& region_to_copy = regions_to_copy[i]; | 291 const gfx::Rect& region_to_copy = regions_to_copy[i]; |
| 277 if (!region_to_copy.IsEmpty()) { | 292 if (!region_to_copy.IsEmpty()) { |
| 278 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, region_to_copy.x(), | 293 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, region_to_copy.x(), |
| 279 region_to_copy.y(), region_to_copy.x(), region_to_copy.y(), | 294 region_to_copy.y(), region_to_copy.x(), region_to_copy.y(), |
| 280 region_to_copy.width(), region_to_copy.height()); | 295 region_to_copy.width(), region_to_copy.height()); |
| 281 } | 296 } |
| 282 } | 297 } |
| 283 } else { | 298 } else { |
| 284 DCHECK(new_damage_rect == gfx::Rect(expected_size)); | 299 DCHECK(new_damage_rect == gfx::Rect(expected_size)); |
| 285 } | 300 } |
| 286 | 301 |
| 287 glFlush(); | 302 glFlush(); |
| 288 front_ = back(); | 303 front_ = back(); |
| 304 previous_damage_rect_ = new_damage_rect; |
| 305 |
| 306 DCHECK(textures_[front()].client_id != 0); |
| 289 | 307 |
| 290 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params; | 308 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params; |
| 291 params.surface_handle = textures_[front_].client_id; | 309 params.surface_handle = textures_[front()].client_id; |
| 292 params.x = x; | 310 params.x = x; |
| 293 params.y = y; | 311 params.y = y; |
| 294 params.width = width; | 312 params.width = width; |
| 295 params.height = height; | 313 params.height = height; |
| 296 helper_->SendAcceleratedSurfacePostSubBuffer(params); | 314 helper_->SendAcceleratedSurfacePostSubBuffer(params); |
| 297 helper_->SetScheduled(false); | 315 helper_->SetScheduled(false); |
| 298 | |
| 299 previous_damage_rect_ = new_damage_rect; | |
| 300 return true; | 316 return true; |
| 301 } | 317 } |
| 302 | 318 |
| 303 std::string TextureImageTransportSurface::GetExtensions() { | 319 std::string TextureImageTransportSurface::GetExtensions() { |
| 304 std::string extensions = gfx::GLSurface::GetExtensions(); | 320 std::string extensions = gfx::GLSurface::GetExtensions(); |
| 305 extensions += extensions.empty() ? "" : " "; | 321 extensions += extensions.empty() ? "" : " "; |
| 306 extensions += "GL_CHROMIUM_front_buffer_cached "; | 322 extensions += "GL_CHROMIUM_front_buffer_cached "; |
| 307 extensions += "GL_CHROMIUM_post_sub_buffer"; | 323 extensions += "GL_CHROMIUM_post_sub_buffer"; |
| 308 return extensions; | 324 return extensions; |
| 309 } | 325 } |
| 310 | 326 |
| 311 gfx::Size TextureImageTransportSurface::GetSize() { | 327 gfx::Size TextureImageTransportSurface::GetSize() { |
| 312 return textures_[back()].size; | 328 return textures_[back()].size; |
| 313 } | 329 } |
| 314 | 330 |
| 315 void* TextureImageTransportSurface::GetHandle() { | 331 void* TextureImageTransportSurface::GetHandle() { |
| 316 return parent_stub_ ? parent_stub_->surface()->GetHandle() : NULL; | 332 return parent_stub_ ? parent_stub_->surface()->GetHandle() : NULL; |
| 317 } | 333 } |
| 318 | 334 |
| 319 | 335 |
| 320 void TextureImageTransportSurface::OnNewSurfaceACK( | 336 void TextureImageTransportSurface::OnNewSurfaceACK( |
| 321 uint64 surface_handle, TransportDIB::Handle /*shm_handle*/) { | 337 uint64 surface_handle, TransportDIB::Handle /*shm_handle*/) { |
| 322 } | 338 } |
| 323 | 339 |
| 340 void TextureImageTransportSurface::OnSetFrontSurfaceIsProtected( |
| 341 bool is_protected) { |
| 342 if (frontbuffer_is_protected_ == is_protected) |
| 343 return; |
| 344 frontbuffer_is_protected_ = is_protected; |
| 345 AdjustFrontBufferAllocation(0); |
| 346 } |
| 347 |
| 348 void TextureImageTransportSurface::OnRequestReleaseFrontACK( |
| 349 int request_id, int retry_count, bool was_released) { |
| 350 if (!was_released) { |
| 351 // If the browser ignored out request, but the request id is still valid, |
| 352 // call AdjustFrontBufferAllocation, which will send another request only if |
| 353 // it still makes sense to do so. This can happen with visibility ABA |
| 354 // transitions. |
| 355 if (request_id == current_valid_release_front_request_id_ && |
| 356 retry_count < kMaxRequestReleaseFrontRetries) |
| 357 AdjustFrontBufferAllocation(retry_count + 1); |
| 358 return; |
| 359 } |
| 360 if (frontbuffer_suggested_allocation_ || frontbuffer_is_protected_ || |
| 361 request_id != current_valid_release_front_request_id_) |
| 362 return; |
| 363 Texture& texture = textures_[front()]; |
| 364 texture.sent_to_client = false; |
| 365 ReleaseTexture(front()); |
| 366 } |
| 367 |
| 324 void TextureImageTransportSurface::OnBuffersSwappedACK() { | 368 void TextureImageTransportSurface::OnBuffersSwappedACK() { |
| 325 if (helper_->MakeCurrent()) { | 369 if (helper_->MakeCurrent()) { |
| 326 if (textures_[front_].size != textures_[back()].size) { | 370 if (textures_[front()].size != textures_[back()].size || |
| 327 CreateBackTexture(textures_[front_].size); | 371 !textures_[back()].info->service_id() || |
| 372 !textures_[back()].sent_to_client || |
| 373 ui_may_not_have_frontbuffer_handle_) { |
| 374 CreateBackTexture(textures_[front()].size); |
| 375 ui_may_not_have_frontbuffer_handle_ = false; |
| 328 } else { | 376 } else { |
| 329 AttachBackTextureToFBO(); | 377 AttachBackTextureToFBO(); |
| 330 } | 378 } |
| 331 } | 379 } |
| 332 | 380 |
| 333 // Even if MakeCurrent fails, schedule anyway, to trigger the lost context | 381 // Even if MakeCurrent fails, schedule anyway, to trigger the lost context |
| 334 // logic. | 382 // logic. |
| 335 helper_->SetScheduled(true); | 383 helper_->SetScheduled(true); |
| 336 } | 384 } |
| 337 | 385 |
| 338 void TextureImageTransportSurface::OnPostSubBufferACK() { | 386 void TextureImageTransportSurface::OnPostSubBufferACK() { |
| 339 OnBuffersSwappedACK(); | 387 OnBuffersSwappedACK(); |
| 340 } | 388 } |
| 341 | 389 |
| 342 void TextureImageTransportSurface::OnResizeViewACK() { | 390 void TextureImageTransportSurface::OnResizeViewACK() { |
| 343 NOTREACHED(); | 391 NOTREACHED(); |
| 344 } | 392 } |
| 345 | 393 |
| 346 void TextureImageTransportSurface::ReleaseBackTexture() { | 394 void TextureImageTransportSurface::RequestReleaseFrontTexture(int retry_count) { |
| 395 Texture& texture = textures_[front()]; |
| 396 DCHECK(texture.info); |
| 397 DCHECK(texture.info->service_id()); |
| 398 if (!texture.sent_to_client) { |
| 399 ReleaseTexture(front()); |
| 400 return; |
| 401 } |
| 402 if (!retry_count) |
| 403 current_valid_release_front_request_id_ = |
| 404 ++next_unique_release_front_request_id_; |
| 405 GpuHostMsg_AcceleratedSurfaceRequestReleaseFront_Params params; |
| 406 params.identifier = texture.client_id; |
| 407 params.request_id = current_valid_release_front_request_id_; |
| 408 params.retry_count = retry_count; |
| 409 helper_->SendAcceleratedSurfaceRequestReleaseFront(params); |
| 410 ui_may_not_have_frontbuffer_handle_ = true; |
| 411 } |
| 412 |
| 413 void TextureImageTransportSurface::ReleaseTexture(int id) { |
| 347 if (!parent_stub_) | 414 if (!parent_stub_) |
| 348 return; | 415 return; |
| 349 TextureInfo* info = textures_[back()].info; | 416 Texture& texture = textures_[id]; |
| 417 TextureInfo* info = texture.info; |
| 350 DCHECK(info); | 418 DCHECK(info); |
| 351 | 419 |
| 352 GLuint service_id = info->service_id(); | 420 GLuint service_id = info->service_id(); |
| 353 if (!service_id) | 421 if (!service_id) |
| 354 return; | 422 return; |
| 355 info->SetServiceId(0); | 423 info->SetServiceId(0); |
| 356 | 424 |
| 357 { | 425 { |
| 358 ScopedFrameBufferBinder fbo_binder(fbo_id_); | 426 ScopedFrameBufferBinder fbo_binder(fbo_id_); |
| 359 glDeleteTextures(1, &service_id); | 427 glDeleteTextures(1, &service_id); |
| 360 } | 428 } |
| 361 glFlush(); | 429 glFlush(); |
| 362 CHECK_GL_ERROR(); | 430 CHECK_GL_ERROR(); |
| 363 } | 431 } |
| 364 | 432 |
| 365 void TextureImageTransportSurface::CreateBackTexture(const gfx::Size& size) { | 433 void TextureImageTransportSurface::CreateBackTexture(const gfx::Size& size) { |
| 366 if (!parent_stub_) | 434 if (!parent_stub_) |
| 367 return; | 435 return; |
| 368 Texture& texture = textures_[back()]; | 436 Texture& texture = textures_[back()]; |
| 369 TextureInfo* info = texture.info; | 437 TextureInfo* info = texture.info; |
| 370 DCHECK(info); | 438 DCHECK(info); |
| 371 | 439 |
| 372 GLuint service_id = info->service_id(); | 440 GLuint service_id = info->service_id(); |
| 373 | 441 |
| 374 if (service_id && texture.size == size) | 442 if (service_id && texture.size == size && |
| 443 !ui_may_not_have_frontbuffer_handle_ && texture.sent_to_client) |
| 375 return; | 444 return; |
| 376 | 445 |
| 377 if (!service_id) { | 446 if (!service_id) { |
| 378 glGenTextures(1, &service_id); | 447 glGenTextures(1, &service_id); |
| 379 info->SetServiceId(service_id); | 448 info->SetServiceId(service_id); |
| 380 } | 449 } |
| 381 | 450 |
| 382 if (size != texture.size) { | 451 if (size != texture.size) { |
| 383 texture.size = size; | 452 texture.size = size; |
| 384 TextureManager* texture_manager = | 453 TextureManager* texture_manager = |
| (...skipping 30 matching lines...) Expand all Loading... |
| 415 params.width = size.width(); | 484 params.width = size.width(); |
| 416 params.height = size.height(); | 485 params.height = size.height(); |
| 417 params.surface_handle = texture.client_id; | 486 params.surface_handle = texture.client_id; |
| 418 helper_->SendAcceleratedSurfaceNew(params); | 487 helper_->SendAcceleratedSurfaceNew(params); |
| 419 texture.sent_to_client = true; | 488 texture.sent_to_client = true; |
| 420 } | 489 } |
| 421 | 490 |
| 422 void TextureImageTransportSurface::AttachBackTextureToFBO() { | 491 void TextureImageTransportSurface::AttachBackTextureToFBO() { |
| 423 if (!parent_stub_) | 492 if (!parent_stub_) |
| 424 return; | 493 return; |
| 425 DCHECK(textures_[back()].info); | 494 TextureInfo* info = textures_[back()].info; |
| 495 DCHECK(info); |
| 426 | 496 |
| 427 ScopedFrameBufferBinder fbo_binder(fbo_id_); | 497 ScopedFrameBufferBinder fbo_binder(fbo_id_); |
| 428 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, | 498 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, |
| 429 GL_COLOR_ATTACHMENT0, | 499 GL_COLOR_ATTACHMENT0, |
| 430 GL_TEXTURE_2D, | 500 GL_TEXTURE_2D, |
| 431 textures_[back()].info->service_id(), | 501 info->service_id(), |
| 432 0); | 502 0); |
| 433 glFlush(); | 503 glFlush(); |
| 434 CHECK_GL_ERROR(); | 504 CHECK_GL_ERROR(); |
| 435 | 505 |
| 436 #ifndef NDEBUG | 506 #ifndef NDEBUG |
| 437 GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); | 507 GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); |
| 438 if (status != GL_FRAMEBUFFER_COMPLETE) { | 508 if (status != GL_FRAMEBUFFER_COMPLETE) { |
| 439 DLOG(ERROR) << "Framebuffer incomplete."; | 509 DLOG(ERROR) << "Framebuffer incomplete."; |
| 440 } | 510 } |
| 441 #endif | 511 #endif |
| 442 } | 512 } |
| 443 | 513 |
| 444 void TextureImageTransportSurface::ReleaseParentStub() { | 514 void TextureImageTransportSurface::ReleaseParentStub() { |
| 445 DCHECK(parent_stub_); | 515 DCHECK(parent_stub_); |
| 446 parent_stub_->RemoveDestructionObserver(this); | 516 parent_stub_->RemoveDestructionObserver(this); |
| 447 for (int i = 0; i < 2; ++i) { | 517 for (int i = 0; i < 2; ++i) { |
| 448 Texture& texture = textures_[i]; | 518 Texture& texture = textures_[i]; |
| 449 texture.info = NULL; | 519 texture.info = NULL; |
| 450 if (!texture.sent_to_client) | 520 if (!texture.sent_to_client) |
| 451 continue; | 521 continue; |
| 452 GpuHostMsg_AcceleratedSurfaceRelease_Params params; | 522 GpuHostMsg_AcceleratedSurfaceRelease_Params params; |
| 453 params.identifier = texture.client_id; | 523 params.identifier = texture.client_id; |
| 454 helper_->SendAcceleratedSurfaceRelease(params); | 524 helper_->SendAcceleratedSurfaceRelease(params); |
| 455 } | 525 } |
| 456 parent_stub_ = NULL; | 526 parent_stub_ = NULL; |
| 457 } | 527 } |
| OLD | NEW |