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

Unified Diff: content/common/gpu/client/gpu_memory_buffer_impl_surface_texture.cc

Issue 195583003: Add initial GpuMemoryBufferSurfaceTexture implementation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 9 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/common/gpu/client/gpu_memory_buffer_impl_surface_texture.cc
diff --git a/content/common/gpu/client/gpu_memory_buffer_impl_surface_texture.cc b/content/common/gpu/client/gpu_memory_buffer_impl_surface_texture.cc
new file mode 100644
index 0000000000000000000000000000000000000000..ee2f11114b66bb5749192c7c58ac43fb09233877
--- /dev/null
+++ b/content/common/gpu/client/gpu_memory_buffer_impl_surface_texture.cc
@@ -0,0 +1,105 @@
+// 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/common/gpu/client/gpu_memory_buffer_impl_surface_texture.h"
+
+#include "base/debug/trace_event.h"
+#include "base/logging.h"
+#include "content/common/android/surface_texture_lookup.h"
+#include "ui/gl/gl_bindings.h"
+
+namespace content {
+
+// static
+bool GpuMemoryBufferImplSurfaceTexture::IsFormatSupported(
+ unsigned internalformat) {
+ switch (internalformat) {
+ case GL_RGBA8_OES:
+ return true;
+ default:
+ return false;
+ }
+}
+
+// static
+int GpuMemoryBufferImplSurfaceTexture::WindowFormat(unsigned internalformat) {
+ switch (internalformat) {
+ case GL_RGBA8_OES:
+ return WINDOW_FORMAT_RGBA_8888;
+ default:
+ NOTREACHED();
+ return 0;
+ }
+}
+
+GpuMemoryBufferImplSurfaceTexture::GpuMemoryBufferImplSurfaceTexture(
+ gfx::Size size,
+ unsigned internalformat)
+ : GpuMemoryBufferImpl(size, internalformat),
+ native_window_(NULL),
+ stride_(0u) {}
+
+GpuMemoryBufferImplSurfaceTexture::~GpuMemoryBufferImplSurfaceTexture() {
+ if (native_window_)
+ ANativeWindow_release(native_window_);
+}
+
+bool GpuMemoryBufferImplSurfaceTexture::Initialize(
+ gfx::GpuMemoryBufferHandle handle) {
+ TRACE_EVENT0("gpu", "GpuMemoryBufferImplSurfaceTexture::Initialize");
+
+ DCHECK(!native_window_);
+ native_window_ = SurfaceTextureLookup::GetInstance()->AcquireNativeWidget(
+ handle.surface_texture_id.primary_id,
+ handle.surface_texture_id.secondary_id);
+ if (!native_window_)
+ return false;
+
+ ANativeWindow_setBuffersGeometry(native_window_,
+ size_.width(),
+ size_.height(),
+ WindowFormat(internalformat_));
+
+ surface_texture_id_ = handle.surface_texture_id;
+ return true;
+}
+
+void GpuMemoryBufferImplSurfaceTexture::Map(AccessMode mode, void** vaddr) {
+ TRACE_EVENT0("gpu", "GpuMemoryBufferImplSurfaceTexture::Map");
+
+ DCHECK(!mapped_);
+ DCHECK(native_window_);
+ ANativeWindow_Buffer buffer;
+ int status = ANativeWindow_lock(native_window_, &buffer, NULL);
+ if (status) {
+ VLOG(1) << "ANativeWindow_lock failed with error code: " << status;
+ *vaddr = NULL;
+ return;
+ }
+
+ DCHECK_LE(size_.width(), buffer.stride);
+ *vaddr = buffer.bits;
+ stride_ = buffer.stride * BytesPerPixel(internalformat_);
+ mapped_ = true;
+}
+
+void GpuMemoryBufferImplSurfaceTexture::Unmap() {
+ TRACE_EVENT0("gpu", "GpuMemoryBufferImplSurfaceTexture::Unmap");
+
+ DCHECK(mapped_);
+ ANativeWindow_unlockAndPost(native_window_);
+ mapped_ = false;
+}
+
+uint32 GpuMemoryBufferImplSurfaceTexture::GetStride() const { return stride_; }
+
+gfx::GpuMemoryBufferHandle GpuMemoryBufferImplSurfaceTexture::GetHandle()
+ const {
+ gfx::GpuMemoryBufferHandle handle;
+ handle.type = gfx::SURFACE_TEXTURE_BUFFER;
+ handle.surface_texture_id = surface_texture_id_;
+ return handle;
+}
+
+} // namespace content
« no previous file with comments | « content/common/gpu/client/gpu_memory_buffer_impl_surface_texture.h ('k') | content/common/gpu/gpu_channel.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698