Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: gpu/command_buffer/service/gpu_processor_unittest.cc

Issue 555020: Redesigned CommandBuffer and NPDevice3D interfaces (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « gpu/command_buffer/service/gpu_processor.cc ('k') | gpu/pgl/command_buffer_pepper.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 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"
(...skipping 21 matching lines...) Expand all
32 shared_memory_->Create(std::wstring(), false, false, kRingBufferSize); 32 shared_memory_->Create(std::wstring(), false, false, kRingBufferSize);
33 shared_memory_->Map(kRingBufferSize); 33 shared_memory_->Map(kRingBufferSize);
34 buffer_ = static_cast<int32*>(shared_memory_->memory()); 34 buffer_ = static_cast<int32*>(shared_memory_->memory());
35 shared_memory_buffer_.ptr = buffer_; 35 shared_memory_buffer_.ptr = buffer_;
36 shared_memory_buffer_.size = kRingBufferSize; 36 shared_memory_buffer_.size = kRingBufferSize;
37 memset(buffer_, 0, kRingBufferSize); 37 memset(buffer_, 0, kRingBufferSize);
38 38
39 command_buffer_.reset(new MockCommandBuffer); 39 command_buffer_.reset(new MockCommandBuffer);
40 ON_CALL(*command_buffer_.get(), GetRingBuffer()) 40 ON_CALL(*command_buffer_.get(), GetRingBuffer())
41 .WillByDefault(Return(shared_memory_buffer_)); 41 .WillByDefault(Return(shared_memory_buffer_));
42 ON_CALL(*command_buffer_.get(), GetSize()) 42
43 .WillByDefault(Return(kRingBufferEntries)); 43 CommandBuffer::State default_state;
44 default_state.size = kRingBufferEntries;
45 ON_CALL(*command_buffer_.get(), GetState())
46 .WillByDefault(Return(default_state));
44 47
45 async_api_.reset(new StrictMock<AsyncAPIMock>); 48 async_api_.reset(new StrictMock<AsyncAPIMock>);
46 49
47 decoder_ = new gles2::MockGLES2Decoder(); 50 decoder_ = new gles2::MockGLES2Decoder();
48 51
49 parser_ = new CommandParser(buffer_, 52 parser_ = new CommandParser(buffer_,
50 kRingBufferEntries, 53 kRingBufferEntries,
51 0, 54 0,
52 kRingBufferEntries, 55 kRingBufferEntries,
53 0, 56 0,
54 async_api_.get()); 57 async_api_.get());
55 58
56 processor_ = new GPUProcessor(command_buffer_.get(), 59 processor_ = new GPUProcessor(command_buffer_.get(),
57 decoder_, 60 decoder_,
58 parser_, 61 parser_,
59 2); 62 2);
60 } 63 }
61 64
62 virtual void TearDown() { 65 virtual void TearDown() {
63 // Ensure that any unexpected tasks posted by the GPU processor are executed 66 // Ensure that any unexpected tasks posted by the GPU processor are executed
64 // in order to fail the test. 67 // in order to fail the test.
65 MessageLoop::current()->RunAllPending(); 68 MessageLoop::current()->RunAllPending();
66 } 69 }
67 70
71 parse_error::ParseError GetError() {
72 return command_buffer_->GetState().error;
73 }
74
68 base::AtExitManager at_exit_manager; 75 base::AtExitManager at_exit_manager;
69 MessageLoop message_loop; 76 MessageLoop message_loop;
70 scoped_ptr<MockCommandBuffer> command_buffer_; 77 scoped_ptr<MockCommandBuffer> command_buffer_;
71 scoped_ptr<::base::SharedMemory> shared_memory_; 78 scoped_ptr<::base::SharedMemory> shared_memory_;
72 Buffer shared_memory_buffer_; 79 Buffer shared_memory_buffer_;
73 int32* buffer_; 80 int32* buffer_;
74 gles2::MockGLES2Decoder* decoder_; 81 gles2::MockGLES2Decoder* decoder_;
75 CommandParser* parser_; 82 CommandParser* parser_;
76 scoped_ptr<AsyncAPIMock> async_api_; 83 scoped_ptr<AsyncAPIMock> async_api_;
77 scoped_refptr<GPUProcessor> processor_; 84 scoped_refptr<GPUProcessor> processor_;
78 }; 85 };
79 86
80 TEST_F(GPUProcessorTest, ProcessorDoesNothingIfRingBufferIsEmpty) { 87 TEST_F(GPUProcessorTest, ProcessorDoesNothingIfRingBufferIsEmpty) {
81 EXPECT_CALL(*command_buffer_, GetPutOffset()) 88 CommandBuffer::State state;
82 .WillOnce(Return(0)); 89
90 state.put_offset = 0;
91 EXPECT_CALL(*command_buffer_, GetState())
92 .WillOnce(Return(state));
83 EXPECT_CALL(*command_buffer_, SetGetOffset(0)); 93 EXPECT_CALL(*command_buffer_, SetGetOffset(0));
84 94
95 EXPECT_CALL(*command_buffer_, SetParseError(_))
96 .Times(0);
97
85 processor_->ProcessCommands(); 98 processor_->ProcessCommands();
86
87 EXPECT_EQ(parse_error::kParseNoError,
88 command_buffer_->ResetParseError());
89 EXPECT_FALSE(command_buffer_->GetErrorStatus());
90 } 99 }
91 100
92 TEST_F(GPUProcessorTest, ProcessesOneCommand) { 101 TEST_F(GPUProcessorTest, ProcessesOneCommand) {
93 CommandHeader* header = reinterpret_cast<CommandHeader*>(&buffer_[0]); 102 CommandHeader* header = reinterpret_cast<CommandHeader*>(&buffer_[0]);
94 header[0].command = 7; 103 header[0].command = 7;
95 header[0].size = 2; 104 header[0].size = 2;
96 buffer_[1] = 123; 105 buffer_[1] = 123;
97 106
98 EXPECT_CALL(*command_buffer_, GetPutOffset()) 107 CommandBuffer::State state;
99 .WillOnce(Return(2)); 108
109 state.put_offset = 2;
110 EXPECT_CALL(*command_buffer_, GetState())
111 .WillOnce(Return(state));
100 EXPECT_CALL(*command_buffer_, SetGetOffset(2)); 112 EXPECT_CALL(*command_buffer_, SetGetOffset(2));
101 113
102 EXPECT_CALL(*async_api_, DoCommand(7, 1, &buffer_[0])) 114 EXPECT_CALL(*async_api_, DoCommand(7, 1, &buffer_[0]))
103 .WillOnce(Return(parse_error::kParseNoError)); 115 .WillOnce(Return(parse_error::kParseNoError));
104 116
117 EXPECT_CALL(*command_buffer_, SetParseError(_))
118 .Times(0);
119
105 processor_->ProcessCommands(); 120 processor_->ProcessCommands();
106
107 EXPECT_EQ(parse_error::kParseNoError,
108 command_buffer_->ResetParseError());
109 EXPECT_FALSE(command_buffer_->GetErrorStatus());
110 } 121 }
111 122
112 TEST_F(GPUProcessorTest, ProcessesTwoCommands) { 123 TEST_F(GPUProcessorTest, ProcessesTwoCommands) {
113 CommandHeader* header = reinterpret_cast<CommandHeader*>(&buffer_[0]); 124 CommandHeader* header = reinterpret_cast<CommandHeader*>(&buffer_[0]);
114 header[0].command = 7; 125 header[0].command = 7;
115 header[0].size = 2; 126 header[0].size = 2;
116 buffer_[1] = 123; 127 buffer_[1] = 123;
117 header[2].command = 8; 128 header[2].command = 8;
118 header[2].size = 1; 129 header[2].size = 1;
119 130
120 EXPECT_CALL(*command_buffer_, GetPutOffset()) 131 CommandBuffer::State state;
121 .WillOnce(Return(3)); 132
133 state.put_offset = 3;
134 EXPECT_CALL(*command_buffer_, GetState())
135 .WillOnce(Return(state));
122 EXPECT_CALL(*command_buffer_, SetGetOffset(3)); 136 EXPECT_CALL(*command_buffer_, SetGetOffset(3));
123 137
124 EXPECT_CALL(*async_api_, DoCommand(7, 1, &buffer_[0])) 138 EXPECT_CALL(*async_api_, DoCommand(7, 1, &buffer_[0]))
125 .WillOnce(Return(parse_error::kParseNoError)); 139 .WillOnce(Return(parse_error::kParseNoError));
126 140
127 EXPECT_CALL(*async_api_, DoCommand(8, 0, &buffer_[2])) 141 EXPECT_CALL(*async_api_, DoCommand(8, 0, &buffer_[2]))
128 .WillOnce(Return(parse_error::kParseNoError)); 142 .WillOnce(Return(parse_error::kParseNoError));
129 143
130 processor_->ProcessCommands(); 144 processor_->ProcessCommands();
131 } 145 }
132 146
133 TEST_F(GPUProcessorTest, ProcessorSetsAndResetsTheGLContext) { 147 TEST_F(GPUProcessorTest, ProcessorSetsTheGLContext) {
134 EXPECT_CALL(*decoder_, MakeCurrent()) 148 EXPECT_CALL(*decoder_, MakeCurrent())
135 .WillOnce(Return(true)); 149 .WillOnce(Return(true));
136 EXPECT_CALL(*command_buffer_, GetPutOffset()) 150
137 .WillOnce(Return(0)); 151 CommandBuffer::State state;
152 state.put_offset = 0;
153 EXPECT_CALL(*command_buffer_, GetState())
154 .WillOnce(Return(state));
155
138 EXPECT_CALL(*command_buffer_, SetGetOffset(0)); 156 EXPECT_CALL(*command_buffer_, SetGetOffset(0));
139 157
140 processor_->ProcessCommands(); 158 processor_->ProcessCommands();
141 } 159 }
142 160
143 TEST_F(GPUProcessorTest, PostsTaskToFinishRemainingCommands) { 161 TEST_F(GPUProcessorTest, PostsTaskToFinishRemainingCommands) {
144 CommandHeader* header = reinterpret_cast<CommandHeader*>(&buffer_[0]); 162 CommandHeader* header = reinterpret_cast<CommandHeader*>(&buffer_[0]);
145 header[0].command = 7; 163 header[0].command = 7;
146 header[0].size = 2; 164 header[0].size = 2;
147 buffer_[1] = 123; 165 buffer_[1] = 123;
148 header[2].command = 8; 166 header[2].command = 8;
149 header[2].size = 1; 167 header[2].size = 1;
150 header[3].command = 9; 168 header[3].command = 9;
151 header[3].size = 1; 169 header[3].size = 1;
152 170
153 EXPECT_CALL(*command_buffer_, GetPutOffset()) 171 CommandBuffer::State state;
154 .WillOnce(Return(4)); 172
173 state.put_offset = 4;
174 EXPECT_CALL(*command_buffer_, GetState())
175 .WillOnce(Return(state));
155 176
156 EXPECT_CALL(*async_api_, DoCommand(7, 1, &buffer_[0])) 177 EXPECT_CALL(*async_api_, DoCommand(7, 1, &buffer_[0]))
157 .WillOnce(Return(parse_error::kParseNoError)); 178 .WillOnce(Return(parse_error::kParseNoError));
158 179
159 EXPECT_CALL(*async_api_, DoCommand(8, 0, &buffer_[2])) 180 EXPECT_CALL(*async_api_, DoCommand(8, 0, &buffer_[2]))
160 .WillOnce(Return(parse_error::kParseNoError)); 181 .WillOnce(Return(parse_error::kParseNoError));
161 182
162 EXPECT_CALL(*command_buffer_, SetGetOffset(3)); 183 EXPECT_CALL(*command_buffer_, SetGetOffset(3));
163 184
164 processor_->ProcessCommands(); 185 processor_->ProcessCommands();
165 186
166 // ProcessCommands is called a second time when the pending task is run. 187 // ProcessCommands is called a second time when the pending task is run.
167 188
168 EXPECT_CALL(*command_buffer_, GetPutOffset()) 189 state.put_offset = 4;
169 .WillOnce(Return(4)); 190 EXPECT_CALL(*command_buffer_, GetState())
191 .WillOnce(Return(state));
170 192
171 EXPECT_CALL(*async_api_, DoCommand(9, 0, &buffer_[3])) 193 EXPECT_CALL(*async_api_, DoCommand(9, 0, &buffer_[3]))
172 .WillOnce(Return(parse_error::kParseNoError)); 194 .WillOnce(Return(parse_error::kParseNoError));
173 195
174 EXPECT_CALL(*command_buffer_, SetGetOffset(4)); 196 EXPECT_CALL(*command_buffer_, SetGetOffset(4));
175 197
176 MessageLoop::current()->RunAllPending(); 198 MessageLoop::current()->RunAllPending();
177 } 199 }
178 200
179 TEST_F(GPUProcessorTest, SetsErrorCodeOnCommandBuffer) { 201 TEST_F(GPUProcessorTest, SetsErrorCodeOnCommandBuffer) {
180 CommandHeader* header = reinterpret_cast<CommandHeader*>(&buffer_[0]); 202 CommandHeader* header = reinterpret_cast<CommandHeader*>(&buffer_[0]);
181 header[0].command = 7; 203 header[0].command = 7;
182 header[0].size = 1; 204 header[0].size = 1;
183 205
184 EXPECT_CALL(*command_buffer_, GetPutOffset()) 206 CommandBuffer::State state;
185 .WillOnce(Return(1)); 207
186 EXPECT_CALL(*command_buffer_, SetGetOffset(1)); 208 state.put_offset = 1;
209 EXPECT_CALL(*command_buffer_, GetState())
210 .WillOnce(Return(state));
187 211
188 EXPECT_CALL(*async_api_, DoCommand(7, 0, &buffer_[0])) 212 EXPECT_CALL(*async_api_, DoCommand(7, 0, &buffer_[0]))
189 .WillOnce(Return( 213 .WillOnce(Return(
190 parse_error::kParseUnknownCommand)); 214 parse_error::kParseUnknownCommand));
191 215
192 EXPECT_CALL(*command_buffer_, 216 EXPECT_CALL(*command_buffer_,
193 SetParseError(parse_error::kParseUnknownCommand)); 217 SetParseError(parse_error::kParseUnknownCommand));
194 218
195 processor_->ProcessCommands(); 219 processor_->ProcessCommands();
196 } 220 }
197 221
198 TEST_F(GPUProcessorTest, 222 TEST_F(GPUProcessorTest, ProcessCommandsDoesNothingAfterError) {
199 RecoverableParseErrorsAreNotClearedByFollowingSuccessfulCommands) { 223 CommandBuffer::State state;
200 CommandHeader* header = reinterpret_cast<CommandHeader*>(&buffer_[0]); 224 state.error = parse_error::kParseGenericError;
201 header[0].command = 7;
202 header[0].size = 1;
203 header[1].command = 8;
204 header[1].size = 1;
205 225
206 EXPECT_CALL(*command_buffer_, GetPutOffset()) 226 EXPECT_CALL(*command_buffer_, GetState())
207 .WillOnce(Return(2)); 227 .WillOnce(Return(state));
208 EXPECT_CALL(*command_buffer_, SetGetOffset(2));
209
210 EXPECT_CALL(*async_api_, DoCommand(7, 0, &buffer_[0]))
211 .WillOnce(Return(
212 parse_error::kParseUnknownCommand));
213
214 EXPECT_CALL(*async_api_, DoCommand(8, 0, &buffer_[1]))
215 .WillOnce(Return(parse_error::kParseNoError));
216
217 EXPECT_CALL(*command_buffer_,
218 SetParseError(parse_error::kParseUnknownCommand));
219
220 processor_->ProcessCommands();
221 }
222
223 TEST_F(GPUProcessorTest, UnrecoverableParseErrorsRaiseTheErrorStatus) {
224 CommandHeader* header =
225 reinterpret_cast<CommandHeader*>(&buffer_[0]);
226 header[0].command = 7;
227 header[0].size = 1;
228 header[1].command = 8;
229 header[1].size = 1;
230
231 EXPECT_CALL(*command_buffer_, GetPutOffset())
232 .WillOnce(Return(2));
233
234 EXPECT_CALL(*async_api_, DoCommand(7, 0, &buffer_[0]))
235 .WillOnce(Return(parse_error::kParseInvalidSize));
236
237 EXPECT_CALL(*command_buffer_,
238 SetParseError(parse_error::kParseInvalidSize));
239
240 EXPECT_CALL(*command_buffer_, RaiseErrorStatus());
241
242 processor_->ProcessCommands();
243 }
244
245 TEST_F(GPUProcessorTest, ProcessCommandsDoesNothingAfterUnrecoverableError) {
246 EXPECT_CALL(*command_buffer_, GetErrorStatus())
247 .WillOnce(Return(true));
248
249 EXPECT_CALL(*command_buffer_, GetPutOffset())
250 .Times(0);
251 228
252 processor_->ProcessCommands(); 229 processor_->ProcessCommands();
253 } 230 }
254 231
255 TEST_F(GPUProcessorTest, CanGetAddressOfSharedMemory) { 232 TEST_F(GPUProcessorTest, CanGetAddressOfSharedMemory) {
256 EXPECT_CALL(*command_buffer_.get(), GetTransferBuffer(7)) 233 EXPECT_CALL(*command_buffer_.get(), GetTransferBuffer(7))
257 .WillOnce(Return(shared_memory_buffer_)); 234 .WillOnce(Return(shared_memory_buffer_));
258 235
259 EXPECT_EQ(&buffer_[0], processor_->GetSharedMemoryBuffer(7).ptr); 236 EXPECT_EQ(&buffer_[0], processor_->GetSharedMemoryBuffer(7).ptr);
260 } 237 }
261 238
262 ACTION_P2(SetPointee, address, value) { 239 ACTION_P2(SetPointee, address, value) {
263 *address = value; 240 *address = value;
264 } 241 }
265 242
266 TEST_F(GPUProcessorTest, CanGetSizeOfSharedMemory) { 243 TEST_F(GPUProcessorTest, CanGetSizeOfSharedMemory) {
267 EXPECT_CALL(*command_buffer_.get(), GetTransferBuffer(7)) 244 EXPECT_CALL(*command_buffer_.get(), GetTransferBuffer(7))
268 .WillOnce(Return(shared_memory_buffer_)); 245 .WillOnce(Return(shared_memory_buffer_));
269 246
270 EXPECT_EQ(kRingBufferSize, processor_->GetSharedMemoryBuffer(7).size); 247 EXPECT_EQ(kRingBufferSize, processor_->GetSharedMemoryBuffer(7).size);
271 } 248 }
272 249
273 TEST_F(GPUProcessorTest, SetTokenForwardsToCommandBuffer) { 250 TEST_F(GPUProcessorTest, SetTokenForwardsToCommandBuffer) {
274 EXPECT_CALL(*command_buffer_, SetToken(7)); 251 EXPECT_CALL(*command_buffer_, SetToken(7));
275 processor_->set_token(7); 252 processor_->set_token(7);
276 } 253 }
277 254
278 } // namespace gpu 255 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gpu_processor.cc ('k') | gpu/pgl/command_buffer_pepper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698