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

Side by Side Diff: gpu/command_buffer/service/texture_definition.cc

Issue 1401423003: Re-land: ui: Move GLImage::BindTexImage fallback from GLImage implementations to GLES2CmdDecoder. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 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 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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698