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

Side by Side Diff: ui/gl/gl_surface_ozone.cc

Issue 1333693004: Support for depth renderbuffer attachment. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: use unique_ptr Created 5 years, 3 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "ui/gl/gl_surface.h" 5 #include "ui/gl/gl_surface.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/location.h" 9 #include "base/location.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 ~SurfaceImage() override; 453 ~SurfaceImage() override;
454 454
455 scoped_refptr<ui::NativePixmap> pixmap_; 455 scoped_refptr<ui::NativePixmap> pixmap_;
456 }; 456 };
457 457
458 ~GLSurfaceOzoneSurfacelessSurfaceImpl() override; 458 ~GLSurfaceOzoneSurfacelessSurfaceImpl() override;
459 459
460 void BindFramebuffer(); 460 void BindFramebuffer();
461 bool CreatePixmaps(); 461 bool CreatePixmaps();
462 462
463 static const int kBuffers = 2;
463 GLuint fbo_; 464 GLuint fbo_;
464 GLuint textures_[2]; 465 GLuint textures_[kBuffers];
466 std::unique_ptr<GLuint[]> rb_depth_;
jamesr 2015/09/10 18:22:27 add #include <memory> for this
465 scoped_refptr<GLImage> images_[2]; 467 scoped_refptr<GLImage> images_[2];
466 int current_surface_; 468 int current_surface_;
467 DISALLOW_COPY_AND_ASSIGN(GLSurfaceOzoneSurfacelessSurfaceImpl); 469 DISALLOW_COPY_AND_ASSIGN(GLSurfaceOzoneSurfacelessSurfaceImpl);
468 }; 470 };
469 471
470 GLSurfaceOzoneSurfacelessSurfaceImpl::SurfaceImage::SurfaceImage( 472 GLSurfaceOzoneSurfacelessSurfaceImpl::SurfaceImage::SurfaceImage(
471 const gfx::Size& size, 473 const gfx::Size& size,
472 unsigned internalformat) 474 unsigned internalformat)
473 : GLImageLinuxDMABuffer(size, internalformat) { 475 : GLImageLinuxDMABuffer(size, internalformat) {
474 } 476 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
512 GLSurfaceOzoneSurfacelessSurfaceImpl::GetBackingFrameBufferObject() { 514 GLSurfaceOzoneSurfacelessSurfaceImpl::GetBackingFrameBufferObject() {
513 return fbo_; 515 return fbo_;
514 } 516 }
515 517
516 bool GLSurfaceOzoneSurfacelessSurfaceImpl::OnMakeCurrent(GLContext* context) { 518 bool GLSurfaceOzoneSurfacelessSurfaceImpl::OnMakeCurrent(GLContext* context) {
517 if (!fbo_) { 519 if (!fbo_) {
518 glGenFramebuffersEXT(1, &fbo_); 520 glGenFramebuffersEXT(1, &fbo_);
519 if (!fbo_) 521 if (!fbo_)
520 return false; 522 return false;
521 glGenTextures(arraysize(textures_), textures_); 523 glGenTextures(arraysize(textures_), textures_);
524 if (get_surface_configuration().depth_bits <= 16) {
525 rb_depth_.reset(new GLuint[kBuffers]);
526 glGenRenderbuffersEXT(kBuffers, rb_depth_.get());
527 }
522 if (!CreatePixmaps()) 528 if (!CreatePixmaps())
523 return false; 529 return false;
524 } 530 }
525 BindFramebuffer(); 531 BindFramebuffer();
526 glBindFramebufferEXT(GL_FRAMEBUFFER, fbo_); 532 glBindFramebufferEXT(GL_FRAMEBUFFER, fbo_);
527 return SurfacelessEGL::OnMakeCurrent(context); 533 return SurfacelessEGL::OnMakeCurrent(context);
528 } 534 }
529 535
530 bool GLSurfaceOzoneSurfacelessSurfaceImpl::Resize(const gfx::Size& size) { 536 bool GLSurfaceOzoneSurfacelessSurfaceImpl::Resize(const gfx::Size& size) {
531 if (size == GetSize()) 537 if (size == GetSize())
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 } 570 }
565 571
566 void GLSurfaceOzoneSurfacelessSurfaceImpl::Destroy() { 572 void GLSurfaceOzoneSurfacelessSurfaceImpl::Destroy() {
567 GLContext* current_context = GLContext::GetCurrent(); 573 GLContext* current_context = GLContext::GetCurrent();
568 DCHECK(current_context && current_context->IsCurrent(this)); 574 DCHECK(current_context && current_context->IsCurrent(this));
569 glBindFramebufferEXT(GL_FRAMEBUFFER, 0); 575 glBindFramebufferEXT(GL_FRAMEBUFFER, 0);
570 if (fbo_) { 576 if (fbo_) {
571 glDeleteTextures(arraysize(textures_), textures_); 577 glDeleteTextures(arraysize(textures_), textures_);
572 for (auto& texture : textures_) 578 for (auto& texture : textures_)
573 texture = 0; 579 texture = 0;
580 if (rb_depth_) {
581 glDeleteRenderbuffersEXT(kBuffers, rb_depth_.get());
582 rb_depth_.reset();
583 }
574 glDeleteFramebuffersEXT(1, &fbo_); 584 glDeleteFramebuffersEXT(1, &fbo_);
575 fbo_ = 0; 585 fbo_ = 0;
576 } 586 }
577 for (auto image : images_) { 587 for (auto image : images_) {
578 if (image) 588 if (image)
579 image->Destroy(true); 589 image->Destroy(true);
580 } 590 }
581 } 591 }
582 592
583 GLSurfaceOzoneSurfacelessSurfaceImpl::~GLSurfaceOzoneSurfacelessSurfaceImpl() { 593 GLSurfaceOzoneSurfacelessSurfaceImpl::~GLSurfaceOzoneSurfacelessSurfaceImpl() {
584 DCHECK(!fbo_); 594 DCHECK(!fbo_);
585 for (size_t i = 0; i < arraysize(textures_); i++) 595 for (size_t i = 0; i < arraysize(textures_); i++)
586 DCHECK(!textures_[i]) << "texture " << i << " not released"; 596 DCHECK(!textures_[i]) << "texture " << i << " not released";
597 DCHECK(!rb_depth_);
587 } 598 }
588 599
589 void GLSurfaceOzoneSurfacelessSurfaceImpl::BindFramebuffer() { 600 void GLSurfaceOzoneSurfacelessSurfaceImpl::BindFramebuffer() {
590 ScopedFrameBufferBinder fb(fbo_); 601 ScopedFrameBufferBinder fb(fbo_);
591 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 602 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
592 textures_[current_surface_], 0); 603 textures_[current_surface_], 0);
604 if (rb_depth_) {
605 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER,
606 GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rb_depth_[current_surface_]);
607 }
593 } 608 }
594 609
595 bool GLSurfaceOzoneSurfacelessSurfaceImpl::CreatePixmaps() { 610 bool GLSurfaceOzoneSurfacelessSurfaceImpl::CreatePixmaps() {
596 if (!fbo_) 611 if (!fbo_)
597 return true; 612 return true;
598 for (size_t i = 0; i < arraysize(textures_); i++) { 613 for (size_t i = 0; i < arraysize(textures_); i++) {
599 scoped_refptr<ui::NativePixmap> pixmap = 614 scoped_refptr<ui::NativePixmap> pixmap =
600 ui::OzonePlatform::GetInstance() 615 ui::OzonePlatform::GetInstance()
601 ->GetSurfaceFactoryOzone() 616 ->GetSurfaceFactoryOzone()
602 ->CreateNativePixmap(widget_, GetSize(), 617 ->CreateNativePixmap(widget_, GetSize(),
603 ui::SurfaceFactoryOzone::BGRA_8888, 618 ui::SurfaceFactoryOzone::BGRA_8888,
604 ui::SurfaceFactoryOzone::SCANOUT); 619 ui::SurfaceFactoryOzone::SCANOUT);
605 if (!pixmap) 620 if (!pixmap)
606 return false; 621 return false;
607 scoped_refptr<SurfaceImage> image = 622 scoped_refptr<SurfaceImage> image =
608 new SurfaceImage(GetSize(), GL_BGRA_EXT); 623 new SurfaceImage(GetSize(), GL_BGRA_EXT);
609 if (!image->Initialize(pixmap, gfx::GpuMemoryBuffer::Format::BGRA_8888)) 624 if (!image->Initialize(pixmap, gfx::GpuMemoryBuffer::Format::BGRA_8888))
610 return false; 625 return false;
611 if (images_[i]) 626 if (images_[i])
612 images_[i]->Destroy(true); 627 images_[i]->Destroy(true);
613 images_[i] = image; 628 images_[i] = image;
614 // Bind image to texture. 629 // Bind image to texture.
615 ScopedTextureBinder binder(GL_TEXTURE_2D, textures_[i]); 630 ScopedTextureBinder binder(GL_TEXTURE_2D, textures_[i]);
616 631
617 if (!images_[i]->BindTexImage(GL_TEXTURE_2D)) 632 if (!images_[i]->BindTexImage(GL_TEXTURE_2D))
618 return false; 633 return false;
619 } 634 }
635 if (rb_depth_) {
636 for (size_t i = 0; i < kBuffers; i++) {
637 glBindRenderbufferEXT(GL_RENDERBUFFER, rb_depth_[i]);
638 glRenderbufferStorageEXT(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16,
639 GetSize().width(), GetSize().height());
640 }
641 }
620 return true; 642 return true;
621 } 643 }
622 644
623 } // namespace 645 } // namespace
624 646
625 // static 647 // static
626 bool GLSurface::InitializeOneOffInternal() { 648 bool GLSurface::InitializeOneOffInternal() {
627 switch (GetGLImplementation()) { 649 switch (GetGLImplementation()) {
628 case kGLImplementationEGLGLES2: 650 case kGLImplementationEGLGLES2:
629 if (!GLSurfaceEGL::InitializeOneOff()) { 651 if (!GLSurfaceEGL::InitializeOneOff()) {
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
749 } 771 }
750 } 772 }
751 773
752 EGLNativeDisplayType GetPlatformDefaultEGLNativeDisplay() { 774 EGLNativeDisplayType GetPlatformDefaultEGLNativeDisplay() {
753 return ui::OzonePlatform::GetInstance() 775 return ui::OzonePlatform::GetInstance()
754 ->GetSurfaceFactoryOzone() 776 ->GetSurfaceFactoryOzone()
755 ->GetNativeDisplay(); 777 ->GetNativeDisplay();
756 } 778 }
757 779
758 } // namespace gfx 780 } // namespace gfx
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698