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