OLD | NEW |
| (Empty) |
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. | |
4 | |
5 #include "gpu/ipc/client/gpu_memory_buffer_impl_surface_texture.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "base/memory/ptr_util.h" | |
9 #include "base/trace_event/trace_event.h" | |
10 #include "gpu/ipc/common/android/surface_texture_manager.h" | |
11 #include "gpu/ipc/common/gpu_memory_buffer_support.h" | |
12 #include "ui/gfx/buffer_format_util.h" | |
13 #include "ui/gl/android/surface_texture.h" | |
14 #include "ui/gl/gl_bindings.h" | |
15 | |
16 namespace gpu { | |
17 namespace { | |
18 | |
19 int WindowFormat(gfx::BufferFormat format) { | |
20 switch (format) { | |
21 case gfx::BufferFormat::RGBA_8888: | |
22 return WINDOW_FORMAT_RGBA_8888; | |
23 case gfx::BufferFormat::ATC: | |
24 case gfx::BufferFormat::ATCIA: | |
25 case gfx::BufferFormat::DXT1: | |
26 case gfx::BufferFormat::DXT5: | |
27 case gfx::BufferFormat::ETC1: | |
28 case gfx::BufferFormat::R_8: | |
29 case gfx::BufferFormat::BGR_565: | |
30 case gfx::BufferFormat::RGBA_4444: | |
31 case gfx::BufferFormat::RGBX_8888: | |
32 case gfx::BufferFormat::BGRX_8888: | |
33 case gfx::BufferFormat::BGRA_8888: | |
34 case gfx::BufferFormat::YVU_420: | |
35 case gfx::BufferFormat::YUV_420_BIPLANAR: | |
36 case gfx::BufferFormat::UYVY_422: | |
37 NOTREACHED(); | |
38 return 0; | |
39 } | |
40 | |
41 NOTREACHED(); | |
42 return 0; | |
43 } | |
44 | |
45 void FreeSurfaceTextureForTesting( | |
46 scoped_refptr<gl::SurfaceTexture> surface_texture, | |
47 gfx::GpuMemoryBufferId id) { | |
48 gpu::SurfaceTextureManager::GetInstance()->UnregisterSurfaceTexture(id.id, 0); | |
49 } | |
50 | |
51 } // namespace | |
52 | |
53 GpuMemoryBufferImplSurfaceTexture::GpuMemoryBufferImplSurfaceTexture( | |
54 gfx::GpuMemoryBufferId id, | |
55 const gfx::Size& size, | |
56 gfx::BufferFormat format, | |
57 const DestructionCallback& callback, | |
58 ANativeWindow* native_window) | |
59 : GpuMemoryBufferImpl(id, size, format, callback), | |
60 native_window_(native_window) {} | |
61 | |
62 GpuMemoryBufferImplSurfaceTexture::~GpuMemoryBufferImplSurfaceTexture() { | |
63 ANativeWindow_release(native_window_); | |
64 } | |
65 | |
66 // static | |
67 std::unique_ptr<GpuMemoryBufferImplSurfaceTexture> | |
68 GpuMemoryBufferImplSurfaceTexture::CreateFromHandle( | |
69 const gfx::GpuMemoryBufferHandle& handle, | |
70 const gfx::Size& size, | |
71 gfx::BufferFormat format, | |
72 gfx::BufferUsage usage, | |
73 const DestructionCallback& callback) { | |
74 ANativeWindow* native_window = | |
75 gpu::SurfaceTextureManager::GetInstance() | |
76 ->AcquireNativeWidgetForSurfaceTexture(handle.id.id); | |
77 if (!native_window) | |
78 return nullptr; | |
79 | |
80 ANativeWindow_setBuffersGeometry(native_window, size.width(), size.height(), | |
81 WindowFormat(format)); | |
82 | |
83 return base::WrapUnique(new GpuMemoryBufferImplSurfaceTexture( | |
84 handle.id, size, format, callback, native_window)); | |
85 } | |
86 | |
87 // static | |
88 bool GpuMemoryBufferImplSurfaceTexture::IsConfigurationSupported( | |
89 gfx::BufferFormat format, | |
90 gfx::BufferUsage usage) { | |
91 return gpu::IsNativeGpuMemoryBufferConfigurationSupported(format, usage); | |
92 } | |
93 | |
94 // static | |
95 base::Closure GpuMemoryBufferImplSurfaceTexture::AllocateForTesting( | |
96 const gfx::Size& size, | |
97 gfx::BufferFormat format, | |
98 gfx::BufferUsage usage, | |
99 gfx::GpuMemoryBufferHandle* handle) { | |
100 scoped_refptr<gl::SurfaceTexture> surface_texture = | |
101 gl::SurfaceTexture::Create(0); | |
102 DCHECK(surface_texture); | |
103 const gfx::GpuMemoryBufferId kBufferId(1); | |
104 gpu::SurfaceTextureManager::GetInstance()->RegisterSurfaceTexture( | |
105 kBufferId.id, 0, surface_texture.get()); | |
106 handle->type = gfx::SURFACE_TEXTURE_BUFFER; | |
107 handle->id = kBufferId; | |
108 return base::Bind(&FreeSurfaceTextureForTesting, surface_texture, kBufferId); | |
109 } | |
110 | |
111 bool GpuMemoryBufferImplSurfaceTexture::Map() { | |
112 TRACE_EVENT0("gpu", "GpuMemoryBufferImplSurfaceTexture::Map"); | |
113 DCHECK(!mapped_); | |
114 DCHECK(native_window_); | |
115 if (ANativeWindow_lock(native_window_, &buffer_, NULL)) { | |
116 DPLOG(ERROR) << "ANativeWindow_lock failed"; | |
117 return false; | |
118 } | |
119 DCHECK_LE(size_.width(), buffer_.stride); | |
120 mapped_ = true; | |
121 return true; | |
122 } | |
123 | |
124 void* GpuMemoryBufferImplSurfaceTexture::memory(size_t plane) { | |
125 TRACE_EVENT0("gpu", "GpuMemoryBufferImplSurfaceTexture::memory"); | |
126 DCHECK(mapped_); | |
127 DCHECK_EQ(0u, plane); | |
128 return buffer_.bits; | |
129 } | |
130 | |
131 void GpuMemoryBufferImplSurfaceTexture::Unmap() { | |
132 TRACE_EVENT0("gpu", "GpuMemoryBufferImplSurfaceTexture::Unmap"); | |
133 DCHECK(mapped_); | |
134 ANativeWindow_unlockAndPost(native_window_); | |
135 mapped_ = false; | |
136 } | |
137 | |
138 int GpuMemoryBufferImplSurfaceTexture::stride(size_t plane) const { | |
139 DCHECK(mapped_); | |
140 DCHECK_EQ(0u, plane); | |
141 return gfx::RowSizeForBufferFormat(buffer_.stride, format_, 0); | |
142 } | |
143 | |
144 gfx::GpuMemoryBufferHandle GpuMemoryBufferImplSurfaceTexture::GetHandle() | |
145 const { | |
146 gfx::GpuMemoryBufferHandle handle; | |
147 handle.type = gfx::SURFACE_TEXTURE_BUFFER; | |
148 handle.id = id_; | |
149 return handle; | |
150 } | |
151 | |
152 } // namespace gpu | |
OLD | NEW |