| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "gpu/command_buffer/service/texture_definition.h" | 5 #include "gpu/command_buffer/service/texture_definition.h" |
| 6 | 6 |
| 7 #include <list> | 7 #include <list> |
| 8 | 8 |
| 9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
| 10 #include "base/memory/linked_ptr.h" | 10 #include "base/memory/linked_ptr.h" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 public: | 29 public: |
| 30 explicit GLImageSync(const scoped_refptr<NativeImageBuffer>& buffer, | 30 explicit GLImageSync(const scoped_refptr<NativeImageBuffer>& buffer, |
| 31 const gfx::Size& size); | 31 const gfx::Size& size); |
| 32 | 32 |
| 33 // Implement GLImage. | 33 // Implement GLImage. |
| 34 void Destroy(bool have_context) override; | 34 void Destroy(bool have_context) override; |
| 35 gfx::Size GetSize() override; | 35 gfx::Size GetSize() override; |
| 36 unsigned GetInternalFormat() override; | 36 unsigned GetInternalFormat() override; |
| 37 bool BindTexImage(unsigned target) override; | 37 bool BindTexImage(unsigned target) override; |
| 38 void ReleaseTexImage(unsigned target) override; | 38 void ReleaseTexImage(unsigned target) override; |
| 39 bool CopyTexImage(unsigned target) override; |
| 39 bool CopyTexSubImage(unsigned target, | 40 bool CopyTexSubImage(unsigned target, |
| 40 const gfx::Point& offset, | 41 const gfx::Point& offset, |
| 41 const gfx::Rect& rect) override; | 42 const gfx::Rect& rect) override; |
| 42 void WillUseTexImage() override; | 43 void WillUseTexImage() override; |
| 43 void WillModifyTexImage() override; | 44 void WillModifyTexImage() override; |
| 44 void DidModifyTexImage() override; | 45 void DidModifyTexImage() override; |
| 45 void DidUseTexImage() override; | 46 void DidUseTexImage() override; |
| 46 bool ScheduleOverlayPlane(gfx::AcceleratedWidget widget, | 47 bool ScheduleOverlayPlane(gfx::AcceleratedWidget widget, |
| 47 int z_order, | 48 int z_order, |
| 48 gfx::OverlayTransform transform, | 49 gfx::OverlayTransform transform, |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 | 88 |
| 88 bool GLImageSync::BindTexImage(unsigned target) { | 89 bool GLImageSync::BindTexImage(unsigned target) { |
| 89 NOTREACHED(); | 90 NOTREACHED(); |
| 90 return false; | 91 return false; |
| 91 } | 92 } |
| 92 | 93 |
| 93 void GLImageSync::ReleaseTexImage(unsigned target) { | 94 void GLImageSync::ReleaseTexImage(unsigned target) { |
| 94 NOTREACHED(); | 95 NOTREACHED(); |
| 95 } | 96 } |
| 96 | 97 |
| 98 bool GLImageSync::CopyTexImage(unsigned target) { |
| 99 return false; |
| 100 } |
| 101 |
| 97 bool GLImageSync::CopyTexSubImage(unsigned target, | 102 bool GLImageSync::CopyTexSubImage(unsigned target, |
| 98 const gfx::Point& offset, | 103 const gfx::Point& offset, |
| 99 const gfx::Rect& rect) { | 104 const gfx::Rect& rect) { |
| 100 return false; | 105 return false; |
| 101 } | 106 } |
| 102 | 107 |
| 103 void GLImageSync::WillUseTexImage() { | 108 void GLImageSync::WillUseTexImage() { |
| 104 } | 109 } |
| 105 | 110 |
| 106 void GLImageSync::DidUseTexImage() { | 111 void GLImageSync::DidUseTexImage() { |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 image_buffer_ = NativeImageBuffer::Create(texture->service_id()); | 355 image_buffer_ = NativeImageBuffer::Create(texture->service_id()); |
| 351 DCHECK(image_buffer_.get()); | 356 DCHECK(image_buffer_.get()); |
| 352 } | 357 } |
| 353 | 358 |
| 354 const Texture::FaceInfo& first_face = texture->face_infos_[0]; | 359 const Texture::FaceInfo& first_face = texture->face_infos_[0]; |
| 355 if (image_buffer_.get()) { | 360 if (image_buffer_.get()) { |
| 356 scoped_refptr<gfx::GLImage> gl_image( | 361 scoped_refptr<gfx::GLImage> gl_image( |
| 357 new GLImageSync(image_buffer_, | 362 new GLImageSync(image_buffer_, |
| 358 gfx::Size(first_face.level_infos[0].width, | 363 gfx::Size(first_face.level_infos[0].width, |
| 359 first_face.level_infos[0].height))); | 364 first_face.level_infos[0].height))); |
| 360 texture->SetLevelImage(NULL, target_, 0, gl_image.get()); | 365 texture->SetLevelImage(target_, 0, gl_image.get(), Texture::BOUND); |
| 361 } | 366 } |
| 362 | 367 |
| 363 const Texture::LevelInfo& level = first_face.level_infos[0]; | 368 const Texture::LevelInfo& level = first_face.level_infos[0]; |
| 364 level_info_ = LevelInfo(level.target, level.internal_format, level.width, | 369 level_info_ = LevelInfo(level.target, level.internal_format, level.width, |
| 365 level.height, level.depth, level.border, level.format, | 370 level.height, level.depth, level.border, level.format, |
| 366 level.type, level.cleared_rect); | 371 level.type, level.cleared_rect); |
| 367 } | 372 } |
| 368 | 373 |
| 369 TextureDefinition::~TextureDefinition() { | 374 TextureDefinition::~TextureDefinition() { |
| 370 } | 375 } |
| 371 | 376 |
| 372 Texture* TextureDefinition::CreateTexture() const { | 377 Texture* TextureDefinition::CreateTexture() const { |
| 373 GLuint texture_id; | 378 GLuint texture_id; |
| 374 glGenTextures(1, &texture_id); | 379 glGenTextures(1, &texture_id); |
| 375 | 380 |
| 376 Texture* texture(new Texture(texture_id)); | 381 Texture* texture(new Texture(texture_id)); |
| 377 UpdateTextureInternal(texture); | 382 UpdateTextureInternal(texture); |
| 378 | 383 |
| 379 return texture; | 384 return texture; |
| 380 } | 385 } |
| 381 | 386 |
| 382 void TextureDefinition::UpdateTextureInternal(Texture* texture) const { | 387 void TextureDefinition::UpdateTextureInternal(Texture* texture) const { |
| 383 gfx::ScopedTextureBinder texture_binder(target_, texture->service_id()); | 388 gfx::ScopedTextureBinder texture_binder(target_, texture->service_id()); |
| 384 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter_); | 389 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter_); |
| 385 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter_); | 390 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter_); |
| 386 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_s_); | 391 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_s_); |
| 387 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_t_); | 392 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_t_); |
| 388 | 393 |
| 389 if (image_buffer_.get()) { | 394 if (image_buffer_.get()) { |
| 390 gfx::GLImage* existing_image = texture->GetLevelImage(target_, 0); | 395 gfx::GLImage* existing_image = texture->GetLevelImage(target_, 0, nullptr); |
| 391 // Don't need to re-bind if already bound before. | 396 // Don't need to re-bind if already bound before. |
| 392 if (!existing_image || !image_buffer_->IsClient(existing_image)) { | 397 if (!existing_image || !image_buffer_->IsClient(existing_image)) { |
| 393 image_buffer_->BindToTexture(target_); | 398 image_buffer_->BindToTexture(target_); |
| 394 } | 399 } |
| 395 } | 400 } |
| 396 | 401 |
| 397 if (defined_) { | 402 if (defined_) { |
| 398 texture->face_infos_.resize(1); | 403 texture->face_infos_.resize(1); |
| 399 texture->face_infos_[0].level_infos.resize(1); | 404 texture->face_infos_[0].level_infos.resize(1); |
| 400 texture->SetLevelInfo(NULL, level_info_.target, 0, | 405 texture->SetLevelInfo(NULL, level_info_.target, 0, |
| 401 level_info_.internal_format, level_info_.width, | 406 level_info_.internal_format, level_info_.width, |
| 402 level_info_.height, level_info_.depth, | 407 level_info_.height, level_info_.depth, |
| 403 level_info_.border, level_info_.format, | 408 level_info_.border, level_info_.format, |
| 404 level_info_.type, level_info_.cleared_rect); | 409 level_info_.type, level_info_.cleared_rect); |
| 405 } | 410 } |
| 406 | 411 |
| 407 if (image_buffer_.get()) { | 412 if (image_buffer_.get()) { |
| 408 texture->SetLevelImage( | 413 texture->SetLevelImage( |
| 409 NULL, | 414 target_, 0, |
| 410 target_, | 415 new GLImageSync(image_buffer_, |
| 411 0, | 416 gfx::Size(level_info_.width, level_info_.height)), |
| 412 new GLImageSync( | 417 Texture::BOUND); |
| 413 image_buffer_, | |
| 414 gfx::Size(level_info_.width, level_info_.height))); | |
| 415 } | 418 } |
| 416 | 419 |
| 417 texture->target_ = target_; | 420 texture->target_ = target_; |
| 418 texture->SetImmutable(immutable_); | 421 texture->SetImmutable(immutable_); |
| 419 texture->min_filter_ = min_filter_; | 422 texture->min_filter_ = min_filter_; |
| 420 texture->mag_filter_ = mag_filter_; | 423 texture->mag_filter_ = mag_filter_; |
| 421 texture->wrap_s_ = wrap_s_; | 424 texture->wrap_s_ = wrap_s_; |
| 422 texture->wrap_t_ = wrap_t_; | 425 texture->wrap_t_ = wrap_t_; |
| 423 texture->usage_ = usage_; | 426 texture->usage_ = usage_; |
| 424 } | 427 } |
| 425 | 428 |
| 426 void TextureDefinition::UpdateTexture(Texture* texture) const { | 429 void TextureDefinition::UpdateTexture(Texture* texture) const { |
| 427 GLuint old_service_id = 0u; | 430 GLuint old_service_id = 0u; |
| 428 if (image_buffer_.get() && g_avoid_egl_target_texture_reuse) { | 431 if (image_buffer_.get() && g_avoid_egl_target_texture_reuse) { |
| 429 GLuint service_id = 0u; | 432 GLuint service_id = 0u; |
| 430 glGenTextures(1, &service_id); | 433 glGenTextures(1, &service_id); |
| 431 old_service_id = texture->service_id(); | 434 old_service_id = texture->service_id(); |
| 432 texture->SetServiceId(service_id); | 435 texture->SetServiceId(service_id); |
| 433 | 436 |
| 434 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), target_); | 437 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), target_); |
| 435 GLint bound_id = 0; | 438 GLint bound_id = 0; |
| 436 glGetIntegerv(GL_TEXTURE_BINDING_2D, &bound_id); | 439 glGetIntegerv(GL_TEXTURE_BINDING_2D, &bound_id); |
| 437 if (bound_id == static_cast<GLint>(old_service_id)) { | 440 if (bound_id == static_cast<GLint>(old_service_id)) { |
| 438 glBindTexture(target_, service_id); | 441 glBindTexture(target_, service_id); |
| 439 } | 442 } |
| 440 texture->SetLevelImage(NULL, target_, 0, NULL); | 443 texture->SetLevelImage(target_, 0, NULL, Texture::UNBOUND); |
| 441 } | 444 } |
| 442 | 445 |
| 443 UpdateTextureInternal(texture); | 446 UpdateTextureInternal(texture); |
| 444 | 447 |
| 445 if (old_service_id) { | 448 if (old_service_id) { |
| 446 glDeleteTextures(1, &old_service_id); | 449 glDeleteTextures(1, &old_service_id); |
| 447 } | 450 } |
| 448 } | 451 } |
| 449 | 452 |
| 450 bool TextureDefinition::Matches(const Texture* texture) const { | 453 bool TextureDefinition::Matches(const Texture* texture) const { |
| 451 DCHECK(target_ == texture->target()); | 454 DCHECK(target_ == texture->target()); |
| 452 if (texture->min_filter_ != min_filter_ || | 455 if (texture->min_filter_ != min_filter_ || |
| 453 texture->mag_filter_ != mag_filter_ || | 456 texture->mag_filter_ != mag_filter_ || |
| 454 texture->wrap_s_ != wrap_s_ || | 457 texture->wrap_s_ != wrap_s_ || |
| 455 texture->wrap_t_ != wrap_t_ || | 458 texture->wrap_t_ != wrap_t_ || |
| 456 texture->SafeToRenderFrom() != SafeToRenderFrom()) { | 459 texture->SafeToRenderFrom() != SafeToRenderFrom()) { |
| 457 return false; | 460 return false; |
| 458 } | 461 } |
| 459 | 462 |
| 460 // Texture became defined. | 463 // Texture became defined. |
| 461 if (!image_buffer_.get() && texture->IsDefined()) | 464 if (!image_buffer_.get() && texture->IsDefined()) |
| 462 return false; | 465 return false; |
| 463 | 466 |
| 464 // All structural changes should have orphaned the texture. | 467 // All structural changes should have orphaned the texture. |
| 465 if (image_buffer_.get() && !texture->GetLevelImage(texture->target(), 0)) | 468 if (image_buffer_.get() && |
| 469 !texture->GetLevelImage(texture->target(), 0, nullptr)) { |
| 466 return false; | 470 return false; |
| 471 } |
| 467 | 472 |
| 468 return true; | 473 return true; |
| 469 } | 474 } |
| 470 | 475 |
| 471 bool TextureDefinition::SafeToRenderFrom() const { | 476 bool TextureDefinition::SafeToRenderFrom() const { |
| 472 return level_info_.cleared_rect.Contains( | 477 return level_info_.cleared_rect.Contains( |
| 473 gfx::Rect(level_info_.width, level_info_.height)); | 478 gfx::Rect(level_info_.width, level_info_.height)); |
| 474 } | 479 } |
| 475 | 480 |
| 476 } // namespace gles2 | 481 } // namespace gles2 |
| 477 } // namespace gpu | 482 } // namespace gpu |
| OLD | NEW |