OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "base/at_exit.h" | 5 #include "base/at_exit.h" |
6 #include "base/message_loop.h" | 6 #include "base/message_loop.h" |
7 #include "gpu/command_buffer/common/command_buffer_mock.h" | 7 #include "gpu/command_buffer/common/command_buffer_mock.h" |
8 #include "gpu/command_buffer/service/mocks.h" | 8 #include "gpu/command_buffer/service/mocks.h" |
9 #include "gpu/command_buffer/service/gpu_processor.h" | 9 #include "gpu/command_buffer/service/gpu_processor.h" |
10 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 10 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
11 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
12 #include "testing/gmock/include/gmock/gmock.h" | 12 #include "testing/gmock/include/gmock/gmock.h" |
13 | 13 |
14 using testing::_; | 14 using testing::_; |
15 using testing::DoAll; | 15 using testing::DoAll; |
16 using testing::Invoke; | 16 using testing::Invoke; |
17 using testing::NiceMock; | 17 using testing::NiceMock; |
18 using testing::Return; | 18 using testing::Return; |
19 using testing::SetArgumentPointee; | 19 using testing::SetArgumentPointee; |
20 using testing::StrictMock; | 20 using testing::StrictMock; |
21 | 21 |
22 namespace command_buffer { | 22 namespace gpu { |
23 | 23 |
24 const size_t kRingBufferSize = 1024; | 24 const size_t kRingBufferSize = 1024; |
25 const size_t kRingBufferEntries = kRingBufferSize / sizeof(int32); | 25 const size_t kRingBufferEntries = kRingBufferSize / sizeof(CommandBufferEntry); |
26 | 26 |
27 class GPUProcessorTest : public testing::Test { | 27 class GPUProcessorTest : public testing::Test { |
28 protected: | 28 protected: |
29 virtual void SetUp() { | 29 virtual void SetUp() { |
30 shared_memory_.reset(new ::base::SharedMemory); | 30 shared_memory_.reset(new ::base::SharedMemory); |
31 shared_memory_->Create(std::wstring(), false, false, kRingBufferSize); | 31 shared_memory_->Create(std::wstring(), false, false, kRingBufferSize); |
32 shared_memory_->Map(kRingBufferSize); | 32 shared_memory_->Map(kRingBufferSize); |
33 buffer_ = static_cast<int32*>(shared_memory_->memory()); | 33 buffer_ = static_cast<int32*>(shared_memory_->memory()); |
34 | 34 |
35 memset(buffer_, 0, kRingBufferSize); | 35 memset(buffer_, 0, kRingBufferSize); |
36 | 36 |
37 command_buffer_.reset(new MockCommandBuffer); | 37 command_buffer_.reset(new MockCommandBuffer); |
38 ON_CALL(*command_buffer_.get(), GetRingBuffer()) | 38 ON_CALL(*command_buffer_.get(), GetRingBuffer()) |
39 .WillByDefault(Return(shared_memory_.get())); | 39 .WillByDefault(Return(shared_memory_.get())); |
40 ON_CALL(*command_buffer_.get(), GetSize()) | 40 ON_CALL(*command_buffer_.get(), GetSize()) |
41 .WillByDefault(Return(kRingBufferEntries)); | 41 .WillByDefault(Return(kRingBufferEntries)); |
42 | 42 |
43 async_api_.reset(new StrictMock<command_buffer::AsyncAPIMock>); | 43 async_api_.reset(new StrictMock<gpu::AsyncAPIMock>); |
44 | 44 |
45 decoder_ = gles2::GLES2Decoder::Create(); | 45 decoder_ = gles2::GLES2Decoder::Create(); |
46 | 46 |
47 parser_ = new command_buffer::CommandParser(buffer_, | 47 parser_ = new gpu::CommandParser(buffer_, |
48 kRingBufferEntries, | 48 kRingBufferEntries, |
49 0, | 49 0, |
50 kRingBufferEntries, | 50 kRingBufferEntries, |
51 0, | 51 0, |
52 async_api_.get()); | 52 async_api_.get()); |
53 | 53 |
54 processor_ = new GPUProcessor(command_buffer_.get(), | 54 processor_ = new GPUProcessor(command_buffer_.get(), |
55 decoder_, | 55 decoder_, |
56 parser_, | 56 parser_, |
57 2); | 57 2); |
58 } | 58 } |
59 | 59 |
60 virtual void TearDown() { | 60 virtual void TearDown() { |
61 // Ensure that any unexpected tasks posted by the GPU processor are executed | 61 // Ensure that any unexpected tasks posted by the GPU processor are executed |
62 // in order to fail the test. | 62 // in order to fail the test. |
63 MessageLoop::current()->RunAllPending(); | 63 MessageLoop::current()->RunAllPending(); |
64 } | 64 } |
65 | 65 |
66 base::AtExitManager at_exit_manager; | 66 base::AtExitManager at_exit_manager; |
67 MessageLoop message_loop; | 67 MessageLoop message_loop; |
68 scoped_ptr<MockCommandBuffer> command_buffer_; | 68 scoped_ptr<MockCommandBuffer> command_buffer_; |
69 scoped_ptr<::base::SharedMemory> shared_memory_; | 69 scoped_ptr<::base::SharedMemory> shared_memory_; |
70 int32* buffer_; | 70 int32* buffer_; |
71 command_buffer::gles2::GLES2Decoder* decoder_; | 71 gpu::gles2::GLES2Decoder* decoder_; |
72 command_buffer::CommandParser* parser_; | 72 gpu::CommandParser* parser_; |
73 scoped_ptr<command_buffer::AsyncAPIMock> async_api_; | 73 scoped_ptr<gpu::AsyncAPIMock> async_api_; |
74 scoped_refptr<GPUProcessor> processor_; | 74 scoped_refptr<GPUProcessor> processor_; |
75 }; | 75 }; |
76 | 76 |
77 TEST_F(GPUProcessorTest, ProcessorDoesNothingIfRingBufferIsEmpty) { | 77 TEST_F(GPUProcessorTest, ProcessorDoesNothingIfRingBufferIsEmpty) { |
78 EXPECT_CALL(*command_buffer_, GetPutOffset()) | 78 EXPECT_CALL(*command_buffer_, GetPutOffset()) |
79 .WillOnce(Return(0)); | 79 .WillOnce(Return(0)); |
80 EXPECT_CALL(*command_buffer_, SetGetOffset(0)); | 80 EXPECT_CALL(*command_buffer_, SetGetOffset(0)); |
81 | 81 |
82 processor_->ProcessCommands(); | 82 processor_->ProcessCommands(); |
83 | 83 |
84 EXPECT_EQ(command_buffer::parse_error::kParseNoError, | 84 EXPECT_EQ(gpu::parse_error::kParseNoError, |
85 command_buffer_->ResetParseError()); | 85 command_buffer_->ResetParseError()); |
86 EXPECT_FALSE(command_buffer_->GetErrorStatus()); | 86 EXPECT_FALSE(command_buffer_->GetErrorStatus()); |
87 } | 87 } |
88 | 88 |
89 TEST_F(GPUProcessorTest, ProcessesOneCommand) { | 89 TEST_F(GPUProcessorTest, ProcessesOneCommand) { |
90 command_buffer::CommandHeader* header = | 90 gpu::CommandHeader* header = |
91 reinterpret_cast<command_buffer::CommandHeader*>(&buffer_[0]); | 91 reinterpret_cast<gpu::CommandHeader*>(&buffer_[0]); |
92 header[0].command = 7; | 92 header[0].command = 7; |
93 header[0].size = 2; | 93 header[0].size = 2; |
94 buffer_[1] = 123; | 94 buffer_[1] = 123; |
95 | 95 |
96 EXPECT_CALL(*command_buffer_, GetPutOffset()) | 96 EXPECT_CALL(*command_buffer_, GetPutOffset()) |
97 .WillOnce(Return(2)); | 97 .WillOnce(Return(2)); |
98 EXPECT_CALL(*command_buffer_, SetGetOffset(2)); | 98 EXPECT_CALL(*command_buffer_, SetGetOffset(2)); |
99 | 99 |
100 EXPECT_CALL(*async_api_, DoCommand(7, 1, &buffer_[0])) | 100 EXPECT_CALL(*async_api_, DoCommand(7, 1, &buffer_[0])) |
101 .WillOnce(Return(command_buffer::parse_error::kParseNoError)); | 101 .WillOnce(Return(gpu::parse_error::kParseNoError)); |
102 | 102 |
103 processor_->ProcessCommands(); | 103 processor_->ProcessCommands(); |
104 | 104 |
105 EXPECT_EQ(command_buffer::parse_error::kParseNoError, | 105 EXPECT_EQ(gpu::parse_error::kParseNoError, |
106 command_buffer_->ResetParseError()); | 106 command_buffer_->ResetParseError()); |
107 EXPECT_FALSE(command_buffer_->GetErrorStatus()); | 107 EXPECT_FALSE(command_buffer_->GetErrorStatus()); |
108 } | 108 } |
109 | 109 |
110 TEST_F(GPUProcessorTest, ProcessesTwoCommands) { | 110 TEST_F(GPUProcessorTest, ProcessesTwoCommands) { |
111 command_buffer::CommandHeader* header = | 111 gpu::CommandHeader* header = |
112 reinterpret_cast<command_buffer::CommandHeader*>(&buffer_[0]); | 112 reinterpret_cast<gpu::CommandHeader*>(&buffer_[0]); |
113 header[0].command = 7; | 113 header[0].command = 7; |
114 header[0].size = 2; | 114 header[0].size = 2; |
115 buffer_[1] = 123; | 115 buffer_[1] = 123; |
116 header[2].command = 8; | 116 header[2].command = 8; |
117 header[2].size = 1; | 117 header[2].size = 1; |
118 | 118 |
119 EXPECT_CALL(*command_buffer_, GetPutOffset()) | 119 EXPECT_CALL(*command_buffer_, GetPutOffset()) |
120 .WillOnce(Return(3)); | 120 .WillOnce(Return(3)); |
121 EXPECT_CALL(*command_buffer_, SetGetOffset(3)); | 121 EXPECT_CALL(*command_buffer_, SetGetOffset(3)); |
122 | 122 |
123 EXPECT_CALL(*async_api_, DoCommand(7, 1, &buffer_[0])) | 123 EXPECT_CALL(*async_api_, DoCommand(7, 1, &buffer_[0])) |
124 .WillOnce(Return(command_buffer::parse_error::kParseNoError)); | 124 .WillOnce(Return(gpu::parse_error::kParseNoError)); |
125 | 125 |
126 EXPECT_CALL(*async_api_, DoCommand(8, 0, &buffer_[2])) | 126 EXPECT_CALL(*async_api_, DoCommand(8, 0, &buffer_[2])) |
127 .WillOnce(Return(command_buffer::parse_error::kParseNoError)); | 127 .WillOnce(Return(gpu::parse_error::kParseNoError)); |
128 | 128 |
129 processor_->ProcessCommands(); | 129 processor_->ProcessCommands(); |
130 } | 130 } |
131 | 131 |
132 TEST_F(GPUProcessorTest, PostsTaskToFinishRemainingCommands) { | 132 TEST_F(GPUProcessorTest, PostsTaskToFinishRemainingCommands) { |
133 command_buffer::CommandHeader* header = | 133 gpu::CommandHeader* header = |
134 reinterpret_cast<command_buffer::CommandHeader*>(&buffer_[0]); | 134 reinterpret_cast<gpu::CommandHeader*>(&buffer_[0]); |
135 header[0].command = 7; | 135 header[0].command = 7; |
136 header[0].size = 2; | 136 header[0].size = 2; |
137 buffer_[1] = 123; | 137 buffer_[1] = 123; |
138 header[2].command = 8; | 138 header[2].command = 8; |
139 header[2].size = 1; | 139 header[2].size = 1; |
140 header[3].command = 9; | 140 header[3].command = 9; |
141 header[3].size = 1; | 141 header[3].size = 1; |
142 | 142 |
143 EXPECT_CALL(*command_buffer_, GetPutOffset()) | 143 EXPECT_CALL(*command_buffer_, GetPutOffset()) |
144 .WillOnce(Return(4)); | 144 .WillOnce(Return(4)); |
145 | 145 |
146 EXPECT_CALL(*async_api_, DoCommand(7, 1, &buffer_[0])) | 146 EXPECT_CALL(*async_api_, DoCommand(7, 1, &buffer_[0])) |
147 .WillOnce(Return(command_buffer::parse_error::kParseNoError)); | 147 .WillOnce(Return(gpu::parse_error::kParseNoError)); |
148 | 148 |
149 EXPECT_CALL(*async_api_, DoCommand(8, 0, &buffer_[2])) | 149 EXPECT_CALL(*async_api_, DoCommand(8, 0, &buffer_[2])) |
150 .WillOnce(Return(command_buffer::parse_error::kParseNoError)); | 150 .WillOnce(Return(gpu::parse_error::kParseNoError)); |
151 | 151 |
152 EXPECT_CALL(*command_buffer_, SetGetOffset(3)); | 152 EXPECT_CALL(*command_buffer_, SetGetOffset(3)); |
153 | 153 |
154 processor_->ProcessCommands(); | 154 processor_->ProcessCommands(); |
155 | 155 |
156 // ProcessCommands is called a second time when the pending task is run. | 156 // ProcessCommands is called a second time when the pending task is run. |
157 | 157 |
158 EXPECT_CALL(*command_buffer_, GetPutOffset()) | 158 EXPECT_CALL(*command_buffer_, GetPutOffset()) |
159 .WillOnce(Return(4)); | 159 .WillOnce(Return(4)); |
160 | 160 |
161 EXPECT_CALL(*async_api_, DoCommand(9, 0, &buffer_[3])) | 161 EXPECT_CALL(*async_api_, DoCommand(9, 0, &buffer_[3])) |
162 .WillOnce(Return(command_buffer::parse_error::kParseNoError)); | 162 .WillOnce(Return(gpu::parse_error::kParseNoError)); |
163 | 163 |
164 EXPECT_CALL(*command_buffer_, SetGetOffset(4)); | 164 EXPECT_CALL(*command_buffer_, SetGetOffset(4)); |
165 | 165 |
166 MessageLoop::current()->RunAllPending(); | 166 MessageLoop::current()->RunAllPending(); |
167 } | 167 } |
168 | 168 |
169 TEST_F(GPUProcessorTest, SetsErrorCodeOnCommandBuffer) { | 169 TEST_F(GPUProcessorTest, SetsErrorCodeOnCommandBuffer) { |
170 command_buffer::CommandHeader* header = | 170 gpu::CommandHeader* header = |
171 reinterpret_cast<command_buffer::CommandHeader*>(&buffer_[0]); | 171 reinterpret_cast<gpu::CommandHeader*>(&buffer_[0]); |
172 header[0].command = 7; | 172 header[0].command = 7; |
173 header[0].size = 1; | 173 header[0].size = 1; |
174 | 174 |
175 EXPECT_CALL(*command_buffer_, GetPutOffset()) | 175 EXPECT_CALL(*command_buffer_, GetPutOffset()) |
176 .WillOnce(Return(1)); | 176 .WillOnce(Return(1)); |
177 EXPECT_CALL(*command_buffer_, SetGetOffset(1)); | 177 EXPECT_CALL(*command_buffer_, SetGetOffset(1)); |
178 | 178 |
179 EXPECT_CALL(*async_api_, DoCommand(7, 0, &buffer_[0])) | 179 EXPECT_CALL(*async_api_, DoCommand(7, 0, &buffer_[0])) |
180 .WillOnce(Return( | 180 .WillOnce(Return( |
181 command_buffer::parse_error::kParseUnknownCommand)); | 181 gpu::parse_error::kParseUnknownCommand)); |
182 | 182 |
183 EXPECT_CALL(*command_buffer_, | 183 EXPECT_CALL(*command_buffer_, |
184 SetParseError(command_buffer::parse_error::kParseUnknownCommand)); | 184 SetParseError(gpu::parse_error::kParseUnknownCommand)); |
185 | 185 |
186 processor_->ProcessCommands(); | 186 processor_->ProcessCommands(); |
187 } | 187 } |
188 | 188 |
189 TEST_F(GPUProcessorTest, | 189 TEST_F(GPUProcessorTest, |
190 RecoverableParseErrorsAreNotClearedByFollowingSuccessfulCommands) { | 190 RecoverableParseErrorsAreNotClearedByFollowingSuccessfulCommands) { |
191 command_buffer::CommandHeader* header = | 191 gpu::CommandHeader* header = |
192 reinterpret_cast<command_buffer::CommandHeader*>(&buffer_[0]); | 192 reinterpret_cast<gpu::CommandHeader*>(&buffer_[0]); |
193 header[0].command = 7; | 193 header[0].command = 7; |
194 header[0].size = 1; | 194 header[0].size = 1; |
195 header[1].command = 8; | 195 header[1].command = 8; |
196 header[1].size = 1; | 196 header[1].size = 1; |
197 | 197 |
198 EXPECT_CALL(*command_buffer_, GetPutOffset()) | 198 EXPECT_CALL(*command_buffer_, GetPutOffset()) |
199 .WillOnce(Return(2)); | 199 .WillOnce(Return(2)); |
200 EXPECT_CALL(*command_buffer_, SetGetOffset(2)); | 200 EXPECT_CALL(*command_buffer_, SetGetOffset(2)); |
201 | 201 |
202 EXPECT_CALL(*async_api_, DoCommand(7, 0, &buffer_[0])) | 202 EXPECT_CALL(*async_api_, DoCommand(7, 0, &buffer_[0])) |
203 .WillOnce(Return( | 203 .WillOnce(Return( |
204 command_buffer::parse_error::kParseUnknownCommand)); | 204 gpu::parse_error::kParseUnknownCommand)); |
205 | 205 |
206 EXPECT_CALL(*async_api_, DoCommand(8, 0, &buffer_[1])) | 206 EXPECT_CALL(*async_api_, DoCommand(8, 0, &buffer_[1])) |
207 .WillOnce(Return(command_buffer::parse_error::kParseNoError)); | 207 .WillOnce(Return(gpu::parse_error::kParseNoError)); |
208 | 208 |
209 EXPECT_CALL(*command_buffer_, | 209 EXPECT_CALL(*command_buffer_, |
210 SetParseError(command_buffer::parse_error::kParseUnknownCommand)); | 210 SetParseError(gpu::parse_error::kParseUnknownCommand)); |
211 | 211 |
212 processor_->ProcessCommands(); | 212 processor_->ProcessCommands(); |
213 } | 213 } |
214 | 214 |
215 TEST_F(GPUProcessorTest, UnrecoverableParseErrorsRaiseTheErrorStatus) { | 215 TEST_F(GPUProcessorTest, UnrecoverableParseErrorsRaiseTheErrorStatus) { |
216 command_buffer::CommandHeader* header = | 216 gpu::CommandHeader* header = |
217 reinterpret_cast<command_buffer::CommandHeader*>(&buffer_[0]); | 217 reinterpret_cast<gpu::CommandHeader*>(&buffer_[0]); |
218 header[0].command = 7; | 218 header[0].command = 7; |
219 header[0].size = 1; | 219 header[0].size = 1; |
220 header[1].command = 8; | 220 header[1].command = 8; |
221 header[1].size = 1; | 221 header[1].size = 1; |
222 | 222 |
223 EXPECT_CALL(*command_buffer_, GetPutOffset()) | 223 EXPECT_CALL(*command_buffer_, GetPutOffset()) |
224 .WillOnce(Return(2)); | 224 .WillOnce(Return(2)); |
225 | 225 |
226 EXPECT_CALL(*async_api_, DoCommand(7, 0, &buffer_[0])) | 226 EXPECT_CALL(*async_api_, DoCommand(7, 0, &buffer_[0])) |
227 .WillOnce(Return(command_buffer::parse_error::kParseInvalidSize)); | 227 .WillOnce(Return(gpu::parse_error::kParseInvalidSize)); |
228 | 228 |
229 EXPECT_CALL(*command_buffer_, | 229 EXPECT_CALL(*command_buffer_, |
230 SetParseError(command_buffer::parse_error::kParseInvalidSize)); | 230 SetParseError(gpu::parse_error::kParseInvalidSize)); |
231 | 231 |
232 EXPECT_CALL(*command_buffer_, RaiseErrorStatus()); | 232 EXPECT_CALL(*command_buffer_, RaiseErrorStatus()); |
233 | 233 |
234 processor_->ProcessCommands(); | 234 processor_->ProcessCommands(); |
235 } | 235 } |
236 | 236 |
237 TEST_F(GPUProcessorTest, ProcessCommandsDoesNothingAfterUnrecoverableError) { | 237 TEST_F(GPUProcessorTest, ProcessCommandsDoesNothingAfterUnrecoverableError) { |
238 EXPECT_CALL(*command_buffer_, GetErrorStatus()) | 238 EXPECT_CALL(*command_buffer_, GetErrorStatus()) |
239 .WillOnce(Return(true)); | 239 .WillOnce(Return(true)); |
240 | 240 |
(...skipping 26 matching lines...) Expand all Loading... |
267 .WillOnce(Return(shared_memory_.get())); | 267 .WillOnce(Return(shared_memory_.get())); |
268 | 268 |
269 EXPECT_EQ(kRingBufferSize, processor_->GetSharedMemorySize(7)); | 269 EXPECT_EQ(kRingBufferSize, processor_->GetSharedMemorySize(7)); |
270 } | 270 } |
271 | 271 |
272 TEST_F(GPUProcessorTest, SetTokenForwardsToCommandBuffer) { | 272 TEST_F(GPUProcessorTest, SetTokenForwardsToCommandBuffer) { |
273 EXPECT_CALL(*command_buffer_, SetToken(7)); | 273 EXPECT_CALL(*command_buffer_, SetToken(7)); |
274 processor_->set_token(7); | 274 processor_->set_token(7); |
275 } | 275 } |
276 | 276 |
277 } // namespace command_buffer | 277 } // namespace gpu |
OLD | NEW |