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