| Index: content/common/gpu/client/gpu_memory_buffer_impl_foobar.cc
 | 
| diff --git a/content/common/gpu/client/gpu_memory_buffer_impl_foobar.cc b/content/common/gpu/client/gpu_memory_buffer_impl_foobar.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..de83803ddab16c4fea2fba9fddaabe2eb9758f80
 | 
| --- /dev/null
 | 
| +++ b/content/common/gpu/client/gpu_memory_buffer_impl_foobar.cc
 | 
| @@ -0,0 +1,100 @@
 | 
| +// 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 "base/debug/trace_event.h"
 | 
| +
 | 
| +#include "content/common/gpu/client/gpu_memory_buffer_impl_foobar.h"
 | 
| +
 | 
| +#include "ui/gl/gl_bindings.h"
 | 
| +
 | 
| +extern "C" {
 | 
| +#include <libdrm/intel_bufmgr.h>
 | 
| +}
 | 
| +
 | 
| +char GetZCopy() {
 | 
| +  // 0 off, 't' tiled, 'u' untiled
 | 
| +  static char mode;
 | 
| +  static char done = 0;
 | 
| +  if (!done) {
 | 
| +    done = 1;
 | 
| +    mode = 0;
 | 
| +    char *e = getenv("ZCOPY");
 | 
| +    if (e) {
 | 
| +      if (e[0] == 't') {
 | 
| +        mode = 't';
 | 
| +        TRACE_EVENT_INSTANT0("zcopy", "zero copy enabled - tiled mode",
 | 
| +                             TRACE_EVENT_SCOPE_THREAD);
 | 
| +      } else if (e[0] == 'u') {
 | 
| +        mode = 'u';
 | 
| +        TRACE_EVENT_INSTANT0("zcopy", "zero copy enabled - untiled mode",
 | 
| +                             TRACE_EVENT_SCOPE_THREAD);
 | 
| +      }
 | 
| +    }
 | 
| +    if (!mode) {
 | 
| +      TRACE_EVENT_INSTANT0("zcopy", "zero copy disabled",
 | 
| +                           TRACE_EVENT_SCOPE_THREAD);
 | 
| +    }
 | 
| +  }
 | 
| +  return mode;
 | 
| +}
 | 
| +
 | 
| +namespace content {
 | 
| +
 | 
| +GpuMemoryBufferImplFoobar::GpuMemoryBufferImplFoobar(
 | 
| +    gfx::Size size, unsigned internalformat)
 | 
| +    : GpuMemoryBufferImpl(size, internalformat), _prime_fd(-1) {
 | 
| +}
 | 
| +
 | 
| +GpuMemoryBufferImplFoobar::~GpuMemoryBufferImplFoobar() {
 | 
| +  if (_prime_fd >= 0) {
 | 
| +    close(_prime_fd);
 | 
| +  }
 | 
| +  drm_intel_bo_unreference(foobar_object);
 | 
| +}
 | 
| +
 | 
| +int GpuMemoryBufferImplFoobar::prime_fd() const {
 | 
| +  if (_prime_fd < 0) {
 | 
| +    TRACE_EVENT0("zcopy", "export");
 | 
| +    DCHECK(foobar_object);
 | 
| +    drm_intel_bo_gem_export_to_prime(foobar_object, &_prime_fd);
 | 
| +  }
 | 
| +  return _prime_fd;
 | 
| +}
 | 
| +
 | 
| +// static
 | 
| +bool GpuMemoryBufferImplFoobar::IsFormatSupported(unsigned internalformat) {
 | 
| +  return GetZCopy() && internalformat == GL_BGRA8_EXT;
 | 
| +}
 | 
| +
 | 
| +bool GpuMemoryBufferImplFoobar::InitializeFromFoobarObject(
 | 
| +    void *foobar_object) {
 | 
| +  this->foobar_object = (drm_intel_bo *) foobar_object;
 | 
| +  return true;
 | 
| +}
 | 
| +
 | 
| +void GpuMemoryBufferImplFoobar::Map(AccessMode mode, void** vaddr) {
 | 
| +  DCHECK(!mapped_);
 | 
| +  TRACE_EVENT0("zcopy", "map");
 | 
| +  if (GetZCopy() == 'u')
 | 
| +    drm_intel_bo_map(foobar_object, 1);
 | 
| +  else
 | 
| +    drm_intel_gem_bo_map_gtt(foobar_object);
 | 
| +  *vaddr = foobar_object->virt;
 | 
| +  mapped_ = true;
 | 
| +}
 | 
| +
 | 
| +void GpuMemoryBufferImplFoobar::Unmap() {
 | 
| +  DCHECK(mapped_);
 | 
| +  drm_intel_bo_unmap(foobar_object);
 | 
| +  mapped_ = false;
 | 
| +}
 | 
| +
 | 
| +gfx::GpuMemoryBufferHandle GpuMemoryBufferImplFoobar::GetHandle() const {
 | 
| +  gfx::GpuMemoryBufferHandle handle;
 | 
| +  handle.type = gfx::FOOBAR_BUFFER;
 | 
| +  handle.handle.fd = prime_fd();
 | 
| +  return handle;
 | 
| +}
 | 
| +
 | 
| +}  // namespace content
 | 
| 
 |