1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/common/gpu/client/gpu_memory_buffer_impl_surface_texture.h"
7 #include "base/logging.h"
8 #include "base/trace_event/trace_event.h"
9 #include "content/common/android/surface_texture_manager.h"
10 #include "ui/gl/gl_bindings.h"
15 int WindowFormat(gfx::GpuMemoryBuffer::Format format
) {
17 case gfx::GpuMemoryBuffer::RGBA_8888
:
18 return WINDOW_FORMAT_RGBA_8888
;
19 case gfx::GpuMemoryBuffer::ATC
:
20 case gfx::GpuMemoryBuffer::ATCIA
:
21 case gfx::GpuMemoryBuffer::DXT1
:
22 case gfx::GpuMemoryBuffer::DXT5
:
23 case gfx::GpuMemoryBuffer::ETC1
:
24 case gfx::GpuMemoryBuffer::RGBX_8888
:
25 case gfx::GpuMemoryBuffer::BGRA_8888
:
26 case gfx::GpuMemoryBuffer::YUV_420
:
37 GpuMemoryBufferImplSurfaceTexture::GpuMemoryBufferImplSurfaceTexture(
38 gfx::GpuMemoryBufferId id
,
39 const gfx::Size
& size
,
41 const DestructionCallback
& callback
,
42 ANativeWindow
* native_window
)
43 : GpuMemoryBufferImpl(id
, size
, format
, callback
),
44 native_window_(native_window
),
48 GpuMemoryBufferImplSurfaceTexture::~GpuMemoryBufferImplSurfaceTexture() {
49 ANativeWindow_release(native_window_
);
53 scoped_ptr
<GpuMemoryBufferImpl
>
54 GpuMemoryBufferImplSurfaceTexture::CreateFromHandle(
55 const gfx::GpuMemoryBufferHandle
& handle
,
56 const gfx::Size
& size
,
58 const DestructionCallback
& callback
) {
59 ANativeWindow
* native_window
= SurfaceTextureManager::GetInstance()->
60 AcquireNativeWidgetForSurfaceTexture(handle
.id
);
62 return scoped_ptr
<GpuMemoryBufferImpl
>();
64 ANativeWindow_setBuffersGeometry(
65 native_window
, size
.width(), size
.height(), WindowFormat(format
));
67 return make_scoped_ptr
<GpuMemoryBufferImpl
>(
68 new GpuMemoryBufferImplSurfaceTexture(
69 handle
.id
, size
, format
, callback
, native_window
));
72 bool GpuMemoryBufferImplSurfaceTexture::Map(void** data
) {
73 TRACE_EVENT0("gpu", "GpuMemoryBufferImplSurfaceTexture::Map");
76 DCHECK(native_window_
);
77 ANativeWindow_Buffer buffer
;
78 int status
= ANativeWindow_lock(native_window_
, &buffer
, NULL
);
80 VLOG(1) << "ANativeWindow_lock failed with error code: " << status
;
84 size_t stride_in_bytes
= 0;
85 if (!StrideInBytes(buffer
.stride
, format_
, 0, &stride_in_bytes
))
88 DCHECK_LE(size_
.width(), buffer
.stride
);
89 stride_
= stride_in_bytes
;
95 void GpuMemoryBufferImplSurfaceTexture::Unmap() {
96 TRACE_EVENT0("gpu", "GpuMemoryBufferImplSurfaceTexture::Unmap");
99 ANativeWindow_unlockAndPost(native_window_
);
103 void GpuMemoryBufferImplSurfaceTexture::GetStride(uint32
* stride
) const {
107 gfx::GpuMemoryBufferHandle
GpuMemoryBufferImplSurfaceTexture::GetHandle()
109 gfx::GpuMemoryBufferHandle handle
;
110 handle
.type
= gfx::SURFACE_TEXTURE_BUFFER
;
115 } // namespace content