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 "content/child/child_thread_impl.h" | 5 #include "content/child/child_thread_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <string.h> | 8 #include <string.h> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 12 matching lines...) Expand all Loading... |
23 #include "gpu/ipc/client/gpu_memory_buffer_impl.h" | 23 #include "gpu/ipc/client/gpu_memory_buffer_impl.h" |
24 #include "ui/gfx/buffer_format_util.h" | 24 #include "ui/gfx/buffer_format_util.h" |
25 #include "url/gurl.h" | 25 #include "url/gurl.h" |
26 | 26 |
27 namespace content { | 27 namespace content { |
28 namespace { | 28 namespace { |
29 | 29 |
30 class ChildThreadImplBrowserTest : public ContentBrowserTest { | 30 class ChildThreadImplBrowserTest : public ContentBrowserTest { |
31 public: | 31 public: |
32 ChildThreadImplBrowserTest() | 32 ChildThreadImplBrowserTest() |
33 : child_gpu_memory_buffer_manager_(nullptr), | 33 : child_discardable_shared_memory_manager_(nullptr) {} |
34 child_discardable_shared_memory_manager_(nullptr) {} | |
35 | 34 |
36 // Overridden from BrowserTestBase: | 35 // Overridden from BrowserTestBase: |
37 void SetUpCommandLine(base::CommandLine* command_line) override { | 36 void SetUpCommandLine(base::CommandLine* command_line) override { |
38 command_line->AppendSwitch(switches::kSingleProcess); | 37 command_line->AppendSwitch(switches::kSingleProcess); |
39 } | 38 } |
40 void SetUpOnMainThread() override { | 39 void SetUpOnMainThread() override { |
41 NavigateToURL(shell(), GURL(url::kAboutBlankURL)); | 40 NavigateToURL(shell(), GURL(url::kAboutBlankURL)); |
42 PostTaskToInProcessRendererAndWait( | 41 PostTaskToInProcessRendererAndWait( |
43 base::Bind(&ChildThreadImplBrowserTest::SetUpOnChildThread, | 42 base::Bind(&ChildThreadImplBrowserTest::SetUpOnChildThread, |
44 base::Unretained(this))); | 43 base::Unretained(this))); |
45 } | 44 } |
46 | 45 |
47 ChildGpuMemoryBufferManager* child_gpu_memory_buffer_manager() { | |
48 return child_gpu_memory_buffer_manager_; | |
49 } | |
50 | |
51 ChildDiscardableSharedMemoryManager* | 46 ChildDiscardableSharedMemoryManager* |
52 child_discardable_shared_memory_manager() { | 47 child_discardable_shared_memory_manager() { |
53 return child_discardable_shared_memory_manager_; | 48 return child_discardable_shared_memory_manager_; |
54 } | 49 } |
55 | 50 |
56 private: | 51 private: |
57 void SetUpOnChildThread() { | 52 void SetUpOnChildThread() { |
58 child_gpu_memory_buffer_manager_ = | |
59 ChildThreadImpl::current()->gpu_memory_buffer_manager(); | |
60 child_discardable_shared_memory_manager_ = | 53 child_discardable_shared_memory_manager_ = |
61 ChildThreadImpl::current()->discardable_shared_memory_manager(); | 54 ChildThreadImpl::current()->discardable_shared_memory_manager(); |
62 } | 55 } |
63 | 56 |
64 ChildGpuMemoryBufferManager* child_gpu_memory_buffer_manager_; | |
65 ChildDiscardableSharedMemoryManager* child_discardable_shared_memory_manager_; | 57 ChildDiscardableSharedMemoryManager* child_discardable_shared_memory_manager_; |
66 }; | 58 }; |
67 | 59 |
68 IN_PROC_BROWSER_TEST_F(ChildThreadImplBrowserTest, LockDiscardableMemory) { | 60 IN_PROC_BROWSER_TEST_F(ChildThreadImplBrowserTest, LockDiscardableMemory) { |
69 const size_t kSize = 1024 * 1024; // 1MiB. | 61 const size_t kSize = 1024 * 1024; // 1MiB. |
70 | 62 |
71 std::unique_ptr<base::DiscardableMemory> memory = | 63 std::unique_ptr<base::DiscardableMemory> memory = |
72 child_discardable_shared_memory_manager() | 64 child_discardable_shared_memory_manager() |
73 ->AllocateLockedDiscardableMemory(kSize); | 65 ->AllocateLockedDiscardableMemory(kSize); |
74 | 66 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 base::TimeTicks end = | 115 base::TimeTicks end = |
124 base::TimeTicks::Now() + base::TimeDelta::FromSeconds(5); | 116 base::TimeTicks::Now() + base::TimeDelta::FromSeconds(5); |
125 while (base::TimeTicks::Now() < end) { | 117 while (base::TimeTicks::Now() < end) { |
126 if (!HostDiscardableSharedMemoryManager::current()->GetBytesAllocated()) | 118 if (!HostDiscardableSharedMemoryManager::current()->GetBytesAllocated()) |
127 break; | 119 break; |
128 } | 120 } |
129 | 121 |
130 EXPECT_LT(base::TimeTicks::Now(), end); | 122 EXPECT_LT(base::TimeTicks::Now(), end); |
131 } | 123 } |
132 | 124 |
133 enum NativeBufferFlag { kDisableNativeBuffers, kEnableNativeBuffers }; | |
134 | |
135 class ChildThreadImplGpuMemoryBufferBrowserTest | |
136 : public ChildThreadImplBrowserTest, | |
137 public testing::WithParamInterface< | |
138 ::testing::tuple<NativeBufferFlag, gfx::BufferFormat>> { | |
139 public: | |
140 // Overridden from BrowserTestBase: | |
141 void SetUpCommandLine(base::CommandLine* command_line) override { | |
142 ChildThreadImplBrowserTest::SetUpCommandLine(command_line); | |
143 NativeBufferFlag native_buffer_flag = ::testing::get<0>(GetParam()); | |
144 switch (native_buffer_flag) { | |
145 case kEnableNativeBuffers: | |
146 command_line->AppendSwitch(switches::kEnableNativeGpuMemoryBuffers); | |
147 break; | |
148 case kDisableNativeBuffers: | |
149 command_line->AppendSwitch(switches::kDisableNativeGpuMemoryBuffers); | |
150 break; | |
151 } | |
152 } | |
153 }; | |
154 | |
155 IN_PROC_BROWSER_TEST_P(ChildThreadImplGpuMemoryBufferBrowserTest, | |
156 DISABLED_Map) { | |
157 gfx::BufferFormat format = ::testing::get<1>(GetParam()); | |
158 gfx::Size buffer_size(4, 4); | |
159 | |
160 std::unique_ptr<gfx::GpuMemoryBuffer> buffer = | |
161 child_gpu_memory_buffer_manager()->AllocateGpuMemoryBuffer( | |
162 buffer_size, format, gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, | |
163 gpu::kNullSurfaceHandle); | |
164 ASSERT_TRUE(buffer); | |
165 EXPECT_EQ(format, buffer->GetFormat()); | |
166 | |
167 // Map buffer planes. | |
168 ASSERT_TRUE(buffer->Map()); | |
169 | |
170 // Write to buffer and check result. | |
171 size_t num_planes = gfx::NumberOfPlanesForBufferFormat(format); | |
172 for (size_t plane = 0; plane < num_planes; ++plane) { | |
173 ASSERT_TRUE(buffer->memory(plane)); | |
174 ASSERT_TRUE(buffer->stride(plane)); | |
175 size_t row_size_in_bytes = | |
176 gfx::RowSizeForBufferFormat(buffer_size.width(), format, plane); | |
177 EXPECT_GT(row_size_in_bytes, 0u); | |
178 | |
179 std::unique_ptr<char[]> data(new char[row_size_in_bytes]); | |
180 memset(data.get(), 0x2a + plane, row_size_in_bytes); | |
181 size_t height = buffer_size.height() / | |
182 gfx::SubsamplingFactorForBufferFormat(format, plane); | |
183 for (size_t y = 0; y < height; ++y) { | |
184 // Copy |data| to row |y| of |plane| and verify result. | |
185 memcpy( | |
186 static_cast<char*>(buffer->memory(plane)) + y * buffer->stride(plane), | |
187 data.get(), row_size_in_bytes); | |
188 EXPECT_EQ(0, memcmp(static_cast<char*>(buffer->memory(plane)) + | |
189 y * buffer->stride(plane), | |
190 data.get(), row_size_in_bytes)); | |
191 } | |
192 } | |
193 | |
194 buffer->Unmap(); | |
195 } | |
196 | |
197 INSTANTIATE_TEST_CASE_P( | |
198 ChildThreadImplGpuMemoryBufferBrowserTests, | |
199 ChildThreadImplGpuMemoryBufferBrowserTest, | |
200 ::testing::Combine(::testing::Values(kDisableNativeBuffers, | |
201 kEnableNativeBuffers), | |
202 // These formats are guaranteed to work on all platforms. | |
203 ::testing::Values(gfx::BufferFormat::R_8, | |
204 gfx::BufferFormat::BGR_565, | |
205 gfx::BufferFormat::RGBA_4444, | |
206 gfx::BufferFormat::RGBA_8888, | |
207 gfx::BufferFormat::BGRA_8888, | |
208 gfx::BufferFormat::YVU_420))); | |
209 | |
210 } // namespace | 125 } // namespace |
211 } // namespace content | 126 } // namespace content |
OLD | NEW |