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

Unified Diff: android_webview/browser/gpu_memory_buffer_factory_impl.cc

Issue 20658002: gpu: Add GpuMemoryBufferFactory interface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 5 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: android_webview/browser/gpu_memory_buffer_factory_impl.cc
diff --git a/android_webview/browser/gpu_memory_buffer_factory_impl.cc b/android_webview/browser/gpu_memory_buffer_factory_impl.cc
new file mode 100644
index 0000000000000000000000000000000000000000..3a9dc8a86a873e9c2fa7c23cb82a3b69b766f937
--- /dev/null
+++ b/android_webview/browser/gpu_memory_buffer_factory_impl.cc
@@ -0,0 +1,107 @@
+// Copyright 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 "android_webview/browser/gpu_memory_buffer_factory_impl.h"
+
+#include "android_webview/public/browser/draw_gl.h"
+#include "base/logging.h"
+#include "gpu/command_buffer/client/gpu_memory_buffer.h"
+#include "ui/gfx/size.h"
+#include "ui/gl/gl_bindings.h"
+
+namespace android_webview {
+
+namespace {
+
+// Provides hardware rendering functions from the Android glue layer.
+AwDrawGLFunctionTable* g_gl_draw_functions = NULL;
+
+class GpuMemoryBufferImpl : public gpu::GpuMemoryBuffer {
+ public:
+ GpuMemoryBufferImpl(int buffer_id, gfx::Size size)
+ : buffer_id_(buffer_id),
+ size_(size),
+ mapped_(false) {
+ DCHECK(buffer_id_);
+ }
+
+ virtual ~GpuMemoryBufferImpl() {
+ g_gl_draw_functions->release_graphic_buffer(buffer_id_);
+ }
+
+ // Overridden from gpu::GpuMemoryBuffer:
+ virtual void Map(gpu::GpuMemoryBuffer::AccessMode mode,
+ void** vaddr) OVERRIDE {
+ AwMapMode map_mode = MAP_READ_ONLY;
+ switch (mode) {
+ case GpuMemoryBuffer::READ_ONLY:
+ map_mode = MAP_READ_ONLY;
+ break;
+ case GpuMemoryBuffer::WRITE_ONLY:
+ map_mode = MAP_WRITE_ONLY;
+ break;
+ case GpuMemoryBuffer::READ_WRITE:
+ map_mode = MAP_READ_WRITE;
+ break;
+ default:
+ LOG(DFATAL) << "Unknown map mode: " << mode;
+ }
+ int err = g_gl_draw_functions->map(buffer_id_, map_mode, vaddr);
+ DCHECK(!err);
+ mapped_ = true;
+ }
+ virtual void Unmap() OVERRIDE {
+ int err = g_gl_draw_functions->unmap(buffer_id_);
+ DCHECK(!err);
+ mapped_ = false;
+ }
+ virtual bool IsMapped() OVERRIDE { return mapped_; }
+ virtual uint32 GetStride() OVERRIDE {
+ return g_gl_draw_functions->get_stride(buffer_id_);
+ }
+ virtual void* GetNativeBuffer() OVERRIDE {
+ return g_gl_draw_functions->get_native_buffer(buffer_id_);
+ }
+
+ private:
+ int buffer_id_;
+ gfx::Size size_;
+ bool mapped_;
+
+ DISALLOW_COPY_AND_ASSIGN(GpuMemoryBufferImpl);
+};
+
+} // namespace
+
+GpuMemoryBufferFactoryImpl::GpuMemoryBufferFactoryImpl() {
+}
+
+GpuMemoryBufferFactoryImpl::~GpuMemoryBufferFactoryImpl() {
+}
+
+gpu::GpuMemoryBuffer* GpuMemoryBufferFactoryImpl::CreateGpuMemoryBuffer(
+ size_t width,
+ size_t height,
+ unsigned internalformat) {
+ // For Android WebView we assume the |internalformat| will always be
+ // GL_RGBA8_OES.
+ DCHECK_EQ(static_cast<GLenum>(GL_RGBA8_OES), internalformat);
kaanb 2013/07/26 05:59:13 Checking the same condition in DCHECK and if is a
reveman 2013/07/26 15:40:57 I think this is common in cases where we want a DC
kaanb 2013/07/26 16:57:40 Just making this a CHECK sounds good.
reveman 2013/07/26 17:57:37 Done.
+ if (internalformat != static_cast<unsigned>(GL_RGBA8_OES))
+ return NULL;
+
+ CHECK(g_gl_draw_functions);
+ int buffer_id = g_gl_draw_functions->create_graphic_buffer(width, height);
+ if (!buffer_id)
kaanb 2013/07/26 05:59:13 consider using the ternary conditional operator:
reveman 2013/07/26 15:40:57 I prefer the current code as it makes it more clea
+ return NULL;
+
+ return new GpuMemoryBufferImpl(buffer_id, gfx::Size(width, height));
+}
+
+// static
+void GpuMemoryBufferFactoryImpl::SetAwDrawGLFunctionTable(
+ AwDrawGLFunctionTable* table) {
+ g_gl_draw_functions = table;
+}
+
+} // namespace android_webview

Powered by Google App Engine
This is Rietveld 408576698