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

Unified Diff: content/browser/compositor/buffered_output_surface.cc

Issue 516663003: Surfaceless OutputSurface implementation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/compositor/buffered_output_surface.cc
diff --git a/content/browser/compositor/buffered_output_surface.cc b/content/browser/compositor/buffered_output_surface.cc
new file mode 100644
index 0000000000000000000000000000000000000000..92c05323d51ceb0d967ebf567aa10690126ce4f2
--- /dev/null
+++ b/content/browser/compositor/buffered_output_surface.cc
@@ -0,0 +1,137 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/compositor/buffered_output_surface.h"
+
+#include "content/common/gpu/client/context_provider_command_buffer.h"
+#include "gpu/GLES2/gl2extchromium.h"
+#include "gpu/command_buffer/client/gles2_interface.h"
+
+namespace content {
+
+BufferedOutputSurface::BufferedOutputSurface(
+ scoped_refptr<cc::ContextProvider> context_provider,
+ unsigned int internalformat)
+ : context_provider_(context_provider),
+ fbo_(0),
+ depth_rb_(0),
+ allocated_count_(0),
+ internalformat_(internalformat) {
+ Initialize();
+}
+
+BufferedOutputSurface::~BufferedOutputSurface() {
+ FreeAllSurfaces();
+
+ gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
+ if (fbo_)
+ gl->DeleteFramebuffers(1, &fbo_);
+ if (depth_rb_)
+ gl->DeleteRenderbuffers(1, &depth_rb_);
+}
+
+void BufferedOutputSurface::Initialize() {
+ gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
+ gl->GenFramebuffers(1, &fbo_);
+ gl->GenRenderbuffers(1, &depth_rb_);
+ DCHECK(fbo_);
+ DCHECK(depth_rb_);
+}
+
+void BufferedOutputSurface::BindFramebuffer() {
+ gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
+ gl->BindFramebuffer(GL_FRAMEBUFFER, fbo_);
+
+ if (!current_surface_.first) {
+ current_surface_ = GetNextSurface();
+ gl->FramebufferTexture2D(GL_FRAMEBUFFER,
+ GL_COLOR_ATTACHMENT0,
+ GL_TEXTURE_2D,
+ current_surface_.second,
+ 0);
+ }
+}
+
+void BufferedOutputSurface::SwapBuffers() {
+ if (last_surface_.first)
+ in_flight_surfaces_.push(last_surface_);
+ last_surface_ = current_surface_;
+ current_surface_.first = 0;
+ current_surface_.second = 0;
+}
+
+void BufferedOutputSurface::Reshape(const gfx::Size& size, float scale_factor) {
+ if (size == size_)
+ return;
+ size_ = size;
+ FreeAllSurfaces();
+
+ if (size_.width() == 0 || size_.height() == 0)
+ return; // Nothing to do.
+ gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
+ gl->BindFramebuffer(GL_FRAMEBUFFER, fbo_);
+ gl->BindRenderbuffer(GL_RENDERBUFFER, depth_rb_);
+ gl->RenderbufferStorage(
+ GL_RENDERBUFFER, GL_DEPTH_COMPONENT24_OES, size_.width(), size_.height());
+ gl->FramebufferRenderbuffer(
+ GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_rb_);
+}
+
+void BufferedOutputSurface::PageFlipComplete() {
+ if (!in_flight_surfaces_.empty()) {
+ available_surfaces_.push_back(in_flight_surfaces_.front());
+ in_flight_surfaces_.pop();
+ }
+}
+
+void BufferedOutputSurface::FreeAllSurfaces() {
+ FreeSurface(&last_surface_);
+ FreeSurface(&current_surface_);
+ while (!in_flight_surfaces_.empty()) {
+ FreeSurface(&in_flight_surfaces_.front());
+ in_flight_surfaces_.pop();
+ }
+ for (size_t i = 0; i < available_surfaces_.size(); i++)
+ FreeSurface(&available_surfaces_[i]);
+ available_surfaces_.clear();
+}
+
+void BufferedOutputSurface::FreeSurface(AllocatedSurface* surface) {
+ if (surface->first) {
+ gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
+ gl->DeleteTextures(1, &surface->first);
alexst (slow to review) 2014/09/10 21:25:14 Use ReleaseTexImage2DCHROMIUM before deleting the
achaulk 2014/09/11 17:25:47 Done.
+ gl->DestroyImageCHROMIUM(surface->second);
+ surface->first = 0;
+ surface->second = 0;
+ }
+}
+
+BufferedOutputSurface::AllocatedSurface
+BufferedOutputSurface::GetNextSurface() {
+ if (!available_surfaces_.empty()) {
+ AllocatedSurface id = available_surfaces_.back();
+ available_surfaces_.pop_back();
+ return id;
+ }
+
+ unsigned int tex;
+ gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
+ gl->GenTextures(1, &tex);
+
+ // We don't want to allow anything more than triple buffering.
+ DCHECK(allocated_count_ < 4);
alexst (slow to review) 2014/09/10 21:25:14 There is a DCHECK_LT, please use that instead.
achaulk 2014/09/11 17:25:48 Done.
+
+ unsigned int id = context_provider_->ContextGL()->CreateImageCHROMIUM(
+ size_.width(),
+ size_.height(),
+ internalformat_,
+ GL_IMAGE_SCANOUT_CHROMIUM);
+ DCHECK(id);
+ allocated_count_++;
+ gl->BindTexture(GL_TEXTURE_2D, tex);
+ gl->BindTexImage2DCHROMIUM(GL_TEXTURE_2D, id);
+ return AllocatedSurface(tex, id);
+}
+
+} // namespace content

Powered by Google App Engine
This is Rietveld 408576698