OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/view_manager/gles2/mojo_gpu_memory_buffer.h" | 5 #include "components/view_manager/gles2/mojo_gpu_memory_buffer.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/memory/shared_memory.h" | 8 #include "base/memory/shared_memory.h" |
9 #include "base/numerics/safe_conversions.h" | 9 #include "base/numerics/safe_conversions.h" |
| 10 #include "ui/gfx/buffer_format_util.h" |
10 | 11 |
11 namespace gles2 { | 12 namespace gles2 { |
12 | 13 |
13 namespace { | 14 namespace { |
14 | 15 |
15 int NumberOfPlanesForGpuMemoryBufferFormat(gfx::BufferFormat format) { | |
16 switch (format) { | |
17 case gfx::BufferFormat::ATC: | |
18 case gfx::BufferFormat::ATCIA: | |
19 case gfx::BufferFormat::DXT1: | |
20 case gfx::BufferFormat::DXT5: | |
21 case gfx::BufferFormat::ETC1: | |
22 case gfx::BufferFormat::R_8: | |
23 case gfx::BufferFormat::RGBA_4444: | |
24 case gfx::BufferFormat::RGBA_8888: | |
25 case gfx::BufferFormat::RGBX_8888: | |
26 case gfx::BufferFormat::BGRA_8888: | |
27 return 1; | |
28 case gfx::BufferFormat::YUV_420: | |
29 return 3; | |
30 } | |
31 NOTREACHED(); | |
32 return 0; | |
33 } | |
34 | |
35 size_t SubsamplingFactor(gfx::BufferFormat format, int plane) { | 16 size_t SubsamplingFactor(gfx::BufferFormat format, int plane) { |
36 switch (format) { | 17 switch (format) { |
37 case gfx::BufferFormat::ATC: | 18 case gfx::BufferFormat::ATC: |
38 case gfx::BufferFormat::ATCIA: | 19 case gfx::BufferFormat::ATCIA: |
39 case gfx::BufferFormat::DXT1: | 20 case gfx::BufferFormat::DXT1: |
40 case gfx::BufferFormat::DXT5: | 21 case gfx::BufferFormat::DXT5: |
41 case gfx::BufferFormat::ETC1: | 22 case gfx::BufferFormat::ETC1: |
42 case gfx::BufferFormat::R_8: | 23 case gfx::BufferFormat::R_8: |
43 case gfx::BufferFormat::RGBA_4444: | 24 case gfx::BufferFormat::RGBA_4444: |
44 case gfx::BufferFormat::RGBA_8888: | 25 case gfx::BufferFormat::RGBA_8888: |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 return width * 4; | 60 return width * 4; |
80 case gfx::BufferFormat::YUV_420: | 61 case gfx::BufferFormat::YUV_420: |
81 return width / SubsamplingFactor(format, plane); | 62 return width / SubsamplingFactor(format, plane); |
82 } | 63 } |
83 NOTREACHED(); | 64 NOTREACHED(); |
84 return 0; | 65 return 0; |
85 } | 66 } |
86 | 67 |
87 size_t BufferSizeInBytes(const gfx::Size& size, gfx::BufferFormat format) { | 68 size_t BufferSizeInBytes(const gfx::Size& size, gfx::BufferFormat format) { |
88 size_t size_in_bytes = 0; | 69 size_t size_in_bytes = 0; |
89 int num_planes = NumberOfPlanesForGpuMemoryBufferFormat(format); | 70 int num_planes = static_cast<int>(gfx::NumberOfPlanesForBufferFormat(format)); |
90 for (int i = 0; i < num_planes; ++i) { | 71 for (int i = 0; i < num_planes; ++i) { |
91 size_in_bytes += StrideInBytes(size.width(), format, i) * | 72 size_in_bytes += StrideInBytes(size.width(), format, i) * |
92 (size.height() / SubsamplingFactor(format, i)); | 73 (size.height() / SubsamplingFactor(format, i)); |
93 } | 74 } |
94 return size_in_bytes; | 75 return size_in_bytes; |
95 } | 76 } |
96 | 77 |
97 } // namespace | 78 } // namespace |
98 | 79 |
99 MojoGpuMemoryBufferImpl::MojoGpuMemoryBufferImpl( | 80 MojoGpuMemoryBufferImpl::MojoGpuMemoryBufferImpl( |
(...skipping 24 matching lines...) Expand all Loading... |
124 ClientBuffer buffer) { | 105 ClientBuffer buffer) { |
125 return reinterpret_cast<MojoGpuMemoryBufferImpl*>(buffer); | 106 return reinterpret_cast<MojoGpuMemoryBufferImpl*>(buffer); |
126 } | 107 } |
127 | 108 |
128 bool MojoGpuMemoryBufferImpl::Map(void** data) { | 109 bool MojoGpuMemoryBufferImpl::Map(void** data) { |
129 DCHECK(!mapped_); | 110 DCHECK(!mapped_); |
130 if (!shared_memory_->Map(BufferSizeInBytes(size_, format_))) | 111 if (!shared_memory_->Map(BufferSizeInBytes(size_, format_))) |
131 return false; | 112 return false; |
132 mapped_ = true; | 113 mapped_ = true; |
133 size_t offset = 0; | 114 size_t offset = 0; |
134 int num_planes = NumberOfPlanesForGpuMemoryBufferFormat(format_); | 115 int num_planes = static_cast<int>( |
| 116 gfx::NumberOfPlanesForBufferFormat(format_)); |
135 for (int i = 0; i < num_planes; ++i) { | 117 for (int i = 0; i < num_planes; ++i) { |
136 data[i] = reinterpret_cast<uint8*>(shared_memory_->memory()) + offset; | 118 data[i] = reinterpret_cast<uint8*>(shared_memory_->memory()) + offset; |
137 offset += StrideInBytes(size_.width(), format_, i) * | 119 offset += StrideInBytes(size_.width(), format_, i) * |
138 (size_.height() / SubsamplingFactor(format_, i)); | 120 (size_.height() / SubsamplingFactor(format_, i)); |
139 } | 121 } |
140 return true; | 122 return true; |
141 } | 123 } |
142 | 124 |
143 void MojoGpuMemoryBufferImpl::Unmap() { | 125 void MojoGpuMemoryBufferImpl::Unmap() { |
144 DCHECK(mapped_); | 126 DCHECK(mapped_); |
145 shared_memory_->Unmap(); | 127 shared_memory_->Unmap(); |
146 mapped_ = false; | 128 mapped_ = false; |
147 } | 129 } |
148 | 130 |
149 bool MojoGpuMemoryBufferImpl::IsMapped() const { | 131 bool MojoGpuMemoryBufferImpl::IsMapped() const { |
150 return mapped_; | 132 return mapped_; |
151 } | 133 } |
152 | 134 |
153 gfx::BufferFormat MojoGpuMemoryBufferImpl::GetFormat() const { | 135 gfx::BufferFormat MojoGpuMemoryBufferImpl::GetFormat() const { |
154 return format_; | 136 return format_; |
155 } | 137 } |
156 | 138 |
157 void MojoGpuMemoryBufferImpl::GetStride(int* stride) const { | 139 void MojoGpuMemoryBufferImpl::GetStride(int* stride) const { |
158 int num_planes = NumberOfPlanesForGpuMemoryBufferFormat(format_); | 140 int num_planes = static_cast<int>( |
| 141 gfx::NumberOfPlanesForBufferFormat(format_)); |
159 for (int i = 0; i < num_planes; ++i) | 142 for (int i = 0; i < num_planes; ++i) |
160 stride[i] = | 143 stride[i] = |
161 base::checked_cast<int>(StrideInBytes(size_.width(), format_, i)); | 144 base::checked_cast<int>(StrideInBytes(size_.width(), format_, i)); |
162 } | 145 } |
163 | 146 |
164 gfx::GpuMemoryBufferId MojoGpuMemoryBufferImpl::GetId() const { | 147 gfx::GpuMemoryBufferId MojoGpuMemoryBufferImpl::GetId() const { |
165 return 0; | 148 return 0; |
166 } | 149 } |
167 | 150 |
168 gfx::GpuMemoryBufferHandle MojoGpuMemoryBufferImpl::GetHandle() const { | 151 gfx::GpuMemoryBufferHandle MojoGpuMemoryBufferImpl::GetHandle() const { |
169 gfx::GpuMemoryBufferHandle handle; | 152 gfx::GpuMemoryBufferHandle handle; |
170 handle.type = gfx::SHARED_MEMORY_BUFFER; | 153 handle.type = gfx::SHARED_MEMORY_BUFFER; |
171 handle.handle = shared_memory_->handle(); | 154 handle.handle = shared_memory_->handle(); |
172 return handle; | 155 return handle; |
173 } | 156 } |
174 | 157 |
175 ClientBuffer MojoGpuMemoryBufferImpl::AsClientBuffer() { | 158 ClientBuffer MojoGpuMemoryBufferImpl::AsClientBuffer() { |
176 return reinterpret_cast<ClientBuffer>(this); | 159 return reinterpret_cast<ClientBuffer>(this); |
177 } | 160 } |
178 | 161 |
179 } // namespace gles2 | 162 } // namespace gles2 |
OLD | NEW |