summaryrefslogtreecommitdiffstats
path: root/cc/output/output_surface.cc
diff options
context:
space:
mode:
Diffstat (limited to 'cc/output/output_surface.cc')
-rw-r--r--cc/output/output_surface.cc111
1 files changed, 111 insertions, 0 deletions
diff --git a/cc/output/output_surface.cc b/cc/output/output_surface.cc
new file mode 100644
index 0000000..34ba8d0
--- /dev/null
+++ b/cc/output/output_surface.cc
@@ -0,0 +1,111 @@
+// Copyright (c) 2013 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 "cc/output/output_surface.h"
+
+#include <set>
+#include <string>
+#include <vector>
+
+#include "base/logging.h"
+#include "base/string_util.h"
+#include "base/strings/string_split.h"
+#include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3D.h"
+#include "third_party/khronos/GLES2/gl2.h"
+#include "third_party/khronos/GLES2/gl2ext.h"
+#include "ui/gfx/rect.h"
+#include "ui/gfx/size.h"
+
+using std::set;
+using std::string;
+using std::vector;
+
+namespace cc {
+
+OutputSurface::OutputSurface(
+ scoped_ptr<WebKit::WebGraphicsContext3D> context3d)
+ : client_(NULL),
+ context3d_(context3d.Pass()),
+ has_gl_discard_backbuffer_(false) {
+}
+
+OutputSurface::OutputSurface(
+ scoped_ptr<cc::SoftwareOutputDevice> software_device)
+ : client_(NULL),
+ software_device_(software_device.Pass()),
+ has_gl_discard_backbuffer_(false) {
+}
+
+OutputSurface::OutputSurface(
+ scoped_ptr<WebKit::WebGraphicsContext3D> context3d,
+ scoped_ptr<cc::SoftwareOutputDevice> software_device)
+ : client_(NULL),
+ context3d_(context3d.Pass()),
+ software_device_(software_device.Pass()),
+ has_gl_discard_backbuffer_(false) {
+}
+
+OutputSurface::~OutputSurface() {
+}
+
+bool OutputSurface::BindToClient(
+ cc::OutputSurfaceClient* client) {
+ DCHECK(client);
+ client_ = client;
+ if (!context3d_)
+ return true;
+ if (!context3d_->makeContextCurrent())
+ return false;
+
+ string extensionsString = UTF16ToASCII(context3d_->getString(GL_EXTENSIONS));
+ vector<string> extensionsList;
+ base::SplitString(extensionsString, ' ', &extensionsList);
+ set<string> extensions(extensionsList.begin(), extensionsList.end());
+
+ has_gl_discard_backbuffer_ =
+ extensions.count("GL_CHROMIUM_discard_backbuffer");
+
+ return true;
+}
+
+void OutputSurface::SendFrameToParentCompositor(CompositorFrame*) {
+ NOTIMPLEMENTED();
+}
+
+void OutputSurface::EnsureBackbuffer() {
+ DCHECK(context3d_);
+ if (has_gl_discard_backbuffer_)
+ context3d_->ensureBackbufferCHROMIUM();
+}
+
+void OutputSurface::DiscardBackbuffer() {
+ DCHECK(context3d_);
+ if (has_gl_discard_backbuffer_)
+ context3d_->discardBackbufferCHROMIUM();
+}
+
+void OutputSurface::Reshape(gfx::Size size) {
+ DCHECK(context3d_);
+ context3d_->reshape(size.width(), size.height());
+}
+
+void OutputSurface::BindFramebuffer() {
+ DCHECK(context3d_);
+ context3d_->bindFramebuffer(GL_FRAMEBUFFER, 0);
+}
+
+void OutputSurface::SwapBuffers() {
+ DCHECK(context3d_);
+ // Note that currently this has the same effect as swapBuffers; we should
+ // consider exposing a different entry point on WebGraphicsContext3D.
+ context3d_->prepareTexture();
+}
+
+void OutputSurface::PostSubBuffer(gfx::Rect rect) {
+ DCHECK(context3d_);
+ context3d_->postSubBufferCHROMIUM(
+ rect.x(), rect.y(), rect.width(), rect.height());
+}
+
+} // namespace cc