OLD | NEW |
| (Empty) |
1 // Copyright 2015 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 "components/view_manager/gles2/mojo_gpu_memory_buffer.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "base/memory/shared_memory.h" | |
9 #include "base/numerics/safe_conversions.h" | |
10 | |
11 namespace gles2 { | |
12 | |
13 namespace { | |
14 | |
15 int NumberOfPlanesForGpuMemoryBufferFormat( | |
16 gfx::GpuMemoryBuffer::Format format) { | |
17 switch (format) { | |
18 case gfx::GpuMemoryBuffer::ATC: | |
19 case gfx::GpuMemoryBuffer::ATCIA: | |
20 case gfx::GpuMemoryBuffer::DXT1: | |
21 case gfx::GpuMemoryBuffer::DXT5: | |
22 case gfx::GpuMemoryBuffer::ETC1: | |
23 case gfx::GpuMemoryBuffer::R_8: | |
24 case gfx::GpuMemoryBuffer::RGBA_4444: | |
25 case gfx::GpuMemoryBuffer::RGBA_8888: | |
26 case gfx::GpuMemoryBuffer::RGBX_8888: | |
27 case gfx::GpuMemoryBuffer::BGRA_8888: | |
28 return 1; | |
29 case gfx::GpuMemoryBuffer::YUV_420: | |
30 return 3; | |
31 } | |
32 NOTREACHED(); | |
33 return 0; | |
34 } | |
35 | |
36 size_t SubsamplingFactor(gfx::GpuMemoryBuffer::Format format, int plane) { | |
37 switch (format) { | |
38 case gfx::GpuMemoryBuffer::ATC: | |
39 case gfx::GpuMemoryBuffer::ATCIA: | |
40 case gfx::GpuMemoryBuffer::DXT1: | |
41 case gfx::GpuMemoryBuffer::DXT5: | |
42 case gfx::GpuMemoryBuffer::ETC1: | |
43 case gfx::GpuMemoryBuffer::R_8: | |
44 case gfx::GpuMemoryBuffer::RGBA_4444: | |
45 case gfx::GpuMemoryBuffer::RGBA_8888: | |
46 case gfx::GpuMemoryBuffer::RGBX_8888: | |
47 case gfx::GpuMemoryBuffer::BGRA_8888: | |
48 return 1; | |
49 case gfx::GpuMemoryBuffer::YUV_420: { | |
50 static size_t factor[] = {1, 2, 2}; | |
51 DCHECK_LT(static_cast<size_t>(plane), arraysize(factor)); | |
52 return factor[plane]; | |
53 } | |
54 } | |
55 NOTREACHED(); | |
56 return 0; | |
57 } | |
58 | |
59 size_t StrideInBytes(size_t width, | |
60 gfx::GpuMemoryBuffer::Format format, | |
61 int plane) { | |
62 switch (format) { | |
63 case gfx::GpuMemoryBuffer::ATCIA: | |
64 case gfx::GpuMemoryBuffer::DXT5: | |
65 DCHECK_EQ(plane, 0); | |
66 return width; | |
67 case gfx::GpuMemoryBuffer::ATC: | |
68 case gfx::GpuMemoryBuffer::DXT1: | |
69 case gfx::GpuMemoryBuffer::ETC1: | |
70 DCHECK_EQ(plane, 0); | |
71 DCHECK_EQ(width % 2, 0u); | |
72 return width / 2; | |
73 case gfx::GpuMemoryBuffer::R_8: | |
74 return (width + 3) & ~0x3; | |
75 case gfx::GpuMemoryBuffer::RGBA_4444: | |
76 DCHECK_EQ(plane, 0); | |
77 return width * 2; | |
78 case gfx::GpuMemoryBuffer::RGBA_8888: | |
79 case gfx::GpuMemoryBuffer::RGBX_8888: | |
80 case gfx::GpuMemoryBuffer::BGRA_8888: | |
81 DCHECK_EQ(plane, 0); | |
82 return width * 4; | |
83 case gfx::GpuMemoryBuffer::YUV_420: | |
84 return width / SubsamplingFactor(format, plane); | |
85 } | |
86 NOTREACHED(); | |
87 return 0; | |
88 } | |
89 | |
90 size_t BufferSizeInBytes(const gfx::Size& size, | |
91 gfx::GpuMemoryBuffer::Format format) { | |
92 size_t size_in_bytes = 0; | |
93 int num_planes = NumberOfPlanesForGpuMemoryBufferFormat(format); | |
94 for (int i = 0; i < num_planes; ++i) { | |
95 size_in_bytes += StrideInBytes(size.width(), format, i) * | |
96 (size.height() / SubsamplingFactor(format, i)); | |
97 } | |
98 return size_in_bytes; | |
99 } | |
100 | |
101 } // namespace | |
102 | |
103 MojoGpuMemoryBufferImpl::MojoGpuMemoryBufferImpl( | |
104 const gfx::Size& size, | |
105 Format format, | |
106 scoped_ptr<base::SharedMemory> shared_memory) | |
107 : size_(size), | |
108 format_(format), | |
109 shared_memory_(shared_memory.Pass()), | |
110 mapped_(false) { | |
111 } | |
112 | |
113 MojoGpuMemoryBufferImpl::~MojoGpuMemoryBufferImpl() { | |
114 } | |
115 | |
116 scoped_ptr<gfx::GpuMemoryBuffer> MojoGpuMemoryBufferImpl::Create( | |
117 const gfx::Size& size, | |
118 Format format, | |
119 Usage usage) { | |
120 size_t bytes = BufferSizeInBytes(size, format); | |
121 scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory); | |
122 if (!shared_memory->CreateAnonymous(bytes)) | |
123 return nullptr; | |
124 return make_scoped_ptr<gfx::GpuMemoryBuffer>( | |
125 new MojoGpuMemoryBufferImpl(size, format, shared_memory.Pass())); | |
126 } | |
127 | |
128 MojoGpuMemoryBufferImpl* MojoGpuMemoryBufferImpl::FromClientBuffer( | |
129 ClientBuffer buffer) { | |
130 return reinterpret_cast<MojoGpuMemoryBufferImpl*>(buffer); | |
131 } | |
132 | |
133 bool MojoGpuMemoryBufferImpl::Map(void** data) { | |
134 DCHECK(!mapped_); | |
135 if (!shared_memory_->Map(BufferSizeInBytes(size_, format_))) | |
136 return false; | |
137 mapped_ = true; | |
138 size_t offset = 0; | |
139 int num_planes = NumberOfPlanesForGpuMemoryBufferFormat(format_); | |
140 for (int i = 0; i < num_planes; ++i) { | |
141 data[i] = reinterpret_cast<uint8*>(shared_memory_->memory()) + offset; | |
142 offset += StrideInBytes(size_.width(), format_, i) * | |
143 (size_.height() / SubsamplingFactor(format_, i)); | |
144 } | |
145 return true; | |
146 } | |
147 | |
148 void MojoGpuMemoryBufferImpl::Unmap() { | |
149 DCHECK(mapped_); | |
150 shared_memory_->Unmap(); | |
151 mapped_ = false; | |
152 } | |
153 | |
154 bool MojoGpuMemoryBufferImpl::IsMapped() const { | |
155 return mapped_; | |
156 } | |
157 | |
158 gfx::GpuMemoryBuffer::Format MojoGpuMemoryBufferImpl::GetFormat() const { | |
159 return format_; | |
160 } | |
161 | |
162 void MojoGpuMemoryBufferImpl::GetStride(int* stride) const { | |
163 int num_planes = NumberOfPlanesForGpuMemoryBufferFormat(format_); | |
164 for (int i = 0; i < num_planes; ++i) | |
165 stride[i] = | |
166 base::checked_cast<int>(StrideInBytes(size_.width(), format_, i)); | |
167 } | |
168 | |
169 gfx::GpuMemoryBufferHandle MojoGpuMemoryBufferImpl::GetHandle() const { | |
170 gfx::GpuMemoryBufferHandle handle; | |
171 handle.type = gfx::SHARED_MEMORY_BUFFER; | |
172 handle.handle = shared_memory_->handle(); | |
173 return handle; | |
174 } | |
175 | |
176 ClientBuffer MojoGpuMemoryBufferImpl::AsClientBuffer() { | |
177 return reinterpret_cast<ClientBuffer>(this); | |
178 } | |
179 | |
180 } // namespace gles2 | |
OLD | NEW |