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

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers.h

Issue 2012533004: Add generated and hand-written passthrough command handlers with stub Doers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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
OLDNEW
(Empty)
1 // Copyright (c) 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_PASSTHROUGH_HANDLERS_H_
6 #define GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_PASSTHROUGH_HANDLERS_H_
7
8 namespace gpu {
9 namespace gles2 {
10
11 // Custom Handlers
piman 2016/05/25 23:34:42 This too, make it a .cc
12 error::Error GLES2DecoderPassthroughImpl::HandleBindAttribLocationBucket(
13 uint32_t immediate_data_size,
14 const void* cmd_data) {
15 const gles2::cmds::BindAttribLocationBucket& c =
16 *static_cast<const gles2::cmds::BindAttribLocationBucket*>(cmd_data);
17 GLuint program = static_cast<GLuint>(c.program);
18 GLuint index = static_cast<GLuint>(c.index);
19 Bucket* bucket = GetBucket(c.name_bucket_id);
20 if (!bucket || bucket->size() == 0) {
21 return error::kInvalidArguments;
22 }
23 std::string name_str;
24 if (!bucket->GetAsString(&name_str)) {
25 return error::kInvalidArguments;
26 }
27 error::Error error = DoBindAttribLocation(program, index, name_str.c_str());
28 if (error != error::kNoError) {
29 return error;
30 }
31 return error::kNoError;
32 }
33
34 error::Error GLES2DecoderPassthroughImpl::HandleBufferData(
35 uint32_t immediate_data_size,
36 const void* cmd_data) {
37 const gles2::cmds::BufferData& c =
38 *static_cast<const gles2::cmds::BufferData*>(cmd_data);
39 GLenum target = static_cast<GLenum>(c.target);
40 GLsizeiptr size = static_cast<GLsizeiptr>(c.size);
41 uint32_t data_shm_id = static_cast<uint32_t>(c.data_shm_id);
42 uint32_t data_shm_offset = static_cast<uint32_t>(c.data_shm_offset);
43 GLenum usage = static_cast<GLenum>(c.usage);
44 const void* data = NULL;
45 if (data_shm_id != 0 || data_shm_offset != 0) {
46 data = GetSharedMemoryAs<const void*>(data_shm_id, data_shm_offset, size);
47 if (!data) {
48 return error::kOutOfBounds;
49 }
50 }
51 error::Error error = DoBufferData(target, size, data, usage);
52 if (error != error::kNoError) {
53 return error;
54 }
55 return error::kNoError;
56 }
57
58 error::Error GLES2DecoderPassthroughImpl::HandleClientWaitSync(
59 uint32_t immediate_data_size,
60 const void* cmd_data) {
61 const gles2::cmds::ClientWaitSync& c =
62 *static_cast<const gles2::cmds::ClientWaitSync*>(cmd_data);
63 const GLuint sync = static_cast<GLuint>(c.sync);
64 const GLbitfield flags = static_cast<GLbitfield>(c.flags);
65 const GLuint64 timeout = c.timeout();
66 typedef cmds::ClientWaitSync::Result Result;
67 Result* result_dst = GetSharedMemoryAs<Result*>(
68 c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
69 if (!result_dst) {
70 return error::kOutOfBounds;
71 }
72 error::Error error = DoClientWaitSync(sync, flags, timeout, result_dst);
73 if (error != error::kNoError) {
74 return error;
75 }
76 return error::kNoError;
77 }
78
79 error::Error GLES2DecoderPassthroughImpl::HandleCompressedTexImage2DBucket(
80 uint32_t immediate_data_size,
81 const void* cmd_data) {
82 const gles2::cmds::CompressedTexImage2DBucket& c =
83 *static_cast<const gles2::cmds::CompressedTexImage2DBucket*>(cmd_data);
84 GLenum target = static_cast<GLenum>(c.target);
85 GLint level = static_cast<GLint>(c.level);
86 GLenum internalformat = static_cast<GLenum>(c.internalformat);
87 GLsizei width = static_cast<GLsizei>(c.width);
88 GLsizei height = static_cast<GLsizei>(c.height);
89 GLint border = static_cast<GLint>(c.border);
90 Bucket* bucket = GetBucket(c.bucket_id);
91 if (!bucket) {
92 return error::kInvalidArguments;
93 }
94 uint32_t data_size = bucket->size();
95 GLsizei imageSize = data_size;
96 const void* data = bucket->GetData(0, data_size);
97 if (!data) {
98 return error::kInvalidArguments;
99 }
100 error::Error error = DoCompressedTexImage2D(
101 target, level, internalformat, width, height, border, imageSize, data);
102 if (error != error::kNoError) {
103 return error;
104 }
105 return error::kNoError;
106 }
107
108 error::Error GLES2DecoderPassthroughImpl::HandleCompressedTexImage2D(
109 uint32_t immediate_data_size,
110 const void* cmd_data) {
111 const gles2::cmds::CompressedTexImage2D& c =
112 *static_cast<const gles2::cmds::CompressedTexImage2D*>(cmd_data);
113 GLenum target = static_cast<GLenum>(c.target);
114 GLint level = static_cast<GLint>(c.level);
115 GLenum internalformat = static_cast<GLenum>(c.internalformat);
116 GLsizei width = static_cast<GLsizei>(c.width);
117 GLsizei height = static_cast<GLsizei>(c.height);
118 GLint border = static_cast<GLint>(c.border);
119 GLsizei imageSize = static_cast<GLsizei>(c.imageSize);
120 uint32_t data_shm_id = static_cast<uint32_t>(c.data_shm_id);
121 uint32_t data_shm_offset = static_cast<uint32_t>(c.data_shm_offset);
122 const void* data = NULL;
123 if (data_shm_id != 0 || data_shm_offset != 0) {
124 data =
125 GetSharedMemoryAs<const void*>(data_shm_id, data_shm_offset, imageSize);
126 if (!data) {
127 return error::kOutOfBounds;
128 }
129 }
130 error::Error error = DoCompressedTexImage2D(
131 target, level, internalformat, width, height, border, imageSize, data);
132 if (error != error::kNoError) {
133 return error;
134 }
135 return error::kNoError;
136 }
137
138 error::Error GLES2DecoderPassthroughImpl::HandleCompressedTexSubImage2DBucket(
139 uint32_t immediate_data_size,
140 const void* cmd_data) {
141 const gles2::cmds::CompressedTexSubImage2DBucket& c =
142 *static_cast<const gles2::cmds::CompressedTexSubImage2DBucket*>(cmd_data);
143 GLenum target = static_cast<GLenum>(c.target);
144 GLint level = static_cast<GLint>(c.level);
145 GLint xoffset = static_cast<GLint>(c.xoffset);
146 GLint yoffset = static_cast<GLint>(c.yoffset);
147 GLsizei width = static_cast<GLsizei>(c.width);
148 GLsizei height = static_cast<GLsizei>(c.height);
149 GLenum format = static_cast<GLenum>(c.format);
150 Bucket* bucket = GetBucket(c.bucket_id);
151 if (!bucket) {
152 return error::kInvalidArguments;
153 }
154 uint32_t data_size = bucket->size();
155 GLsizei imageSize = data_size;
156 const void* data = bucket->GetData(0, data_size);
157 if (!data) {
158 return error::kInvalidArguments;
159 }
160 error::Error error = DoCompressedTexSubImage2D(
161 target, level, xoffset, yoffset, width, height, format, imageSize, data);
162 if (error != error::kNoError) {
163 return error;
164 }
165 return error::kNoError;
166 }
167
168 error::Error GLES2DecoderPassthroughImpl::HandleCompressedTexImage3DBucket(
169 uint32_t immediate_data_size,
170 const void* cmd_data) {
171 const gles2::cmds::CompressedTexImage3DBucket& c =
172 *static_cast<const gles2::cmds::CompressedTexImage3DBucket*>(cmd_data);
173 GLenum target = static_cast<GLenum>(c.target);
174 GLint level = static_cast<GLint>(c.level);
175 GLenum internal_format = static_cast<GLenum>(c.internalformat);
176 GLsizei width = static_cast<GLsizei>(c.width);
177 GLsizei height = static_cast<GLsizei>(c.height);
178 GLsizei depth = static_cast<GLsizei>(c.depth);
179 GLint border = static_cast<GLint>(c.border);
180 Bucket* bucket = GetBucket(c.bucket_id);
181 if (!bucket) {
182 return error::kInvalidArguments;
183 }
184 uint32_t data_size = bucket->size();
185 GLsizei imageSize = data_size;
186 const void* data = bucket->GetData(0, data_size);
187 if (!data) {
188 return error::kInvalidArguments;
189 }
190 error::Error error =
191 DoCompressedTexImage3D(target, level, internal_format, width, height,
192 depth, border, imageSize, data);
193 if (error != error::kNoError) {
194 return error;
195 }
196 return error::kNoError;
197 }
198 error::Error GLES2DecoderPassthroughImpl::HandleCompressedTexImage3D(
199 uint32_t immediate_data_size,
200 const void* cmd_data) {
201 const gles2::cmds::CompressedTexImage3D& c =
202 *static_cast<const gles2::cmds::CompressedTexImage3D*>(cmd_data);
203 GLenum target = static_cast<GLenum>(c.target);
204 GLint level = static_cast<GLint>(c.level);
205 GLenum internal_format = static_cast<GLenum>(c.internalformat);
206 GLsizei width = static_cast<GLsizei>(c.width);
207 GLsizei height = static_cast<GLsizei>(c.height);
208 GLsizei depth = static_cast<GLsizei>(c.depth);
209 GLint border = static_cast<GLint>(c.border);
210 GLsizei image_size = static_cast<GLsizei>(c.imageSize);
211 uint32_t data_shm_id = static_cast<uint32_t>(c.data_shm_id);
212 uint32_t data_shm_offset = static_cast<uint32_t>(c.data_shm_offset);
213 const void* data = NULL;
214 if (data_shm_id != 0 || data_shm_offset != 0) {
215 data = GetSharedMemoryAs<const void*>(data_shm_id, data_shm_offset,
216 image_size);
217 if (!data) {
218 return error::kOutOfBounds;
219 }
220 }
221 error::Error error =
222 DoCompressedTexImage3D(target, level, internal_format, width, height,
223 depth, border, image_size, data);
224 if (error != error::kNoError) {
225 return error;
226 }
227 return error::kNoError;
228 }
229
230 error::Error GLES2DecoderPassthroughImpl::HandleCompressedTexSubImage3DBucket(
231 uint32_t immediate_data_size,
232 const void* cmd_data) {
233 const gles2::cmds::CompressedTexSubImage3DBucket& c =
234 *static_cast<const gles2::cmds::CompressedTexSubImage3DBucket*>(cmd_data);
235 GLenum target = static_cast<GLenum>(c.target);
236 GLint level = static_cast<GLint>(c.level);
237 GLint xoffset = static_cast<GLint>(c.xoffset);
238 GLint yoffset = static_cast<GLint>(c.yoffset);
239 GLint zoffset = static_cast<GLint>(c.zoffset);
240 GLsizei width = static_cast<GLsizei>(c.width);
241 GLsizei height = static_cast<GLsizei>(c.height);
242 GLsizei depth = static_cast<GLsizei>(c.depth);
243 GLenum format = static_cast<GLenum>(c.format);
244 Bucket* bucket = GetBucket(c.bucket_id);
245 if (!bucket) {
246 return error::kInvalidArguments;
247 }
248 uint32_t data_size = bucket->size();
249 GLsizei image_size = data_size;
250 const void* data = bucket->GetData(0, data_size);
251 if (!data) {
252 return error::kInvalidArguments;
253 }
254 error::Error error =
255 DoCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width,
256 height, depth, format, image_size, data);
257 if (error != error::kNoError) {
258 return error;
259 }
260 return error::kNoError;
261 }
262
263 error::Error GLES2DecoderPassthroughImpl::HandleCreateProgram(
264 uint32_t immediate_data_size,
265 const void* cmd_data) {
266 const gles2::cmds::CreateProgram& c =
267 *static_cast<const gles2::cmds::CreateProgram*>(cmd_data);
268 GLuint client_id = static_cast<GLuint>(c.client_id);
269 error::Error error = DoCreateProgram(client_id);
270 if (error != error::kNoError) {
271 return error;
272 }
273 return error::kNoError;
274 }
275
276 error::Error GLES2DecoderPassthroughImpl::HandleCreateShader(
277 uint32_t immediate_data_size,
278 const void* cmd_data) {
279 const gles2::cmds::CreateShader& c =
280 *static_cast<const gles2::cmds::CreateShader*>(cmd_data);
281 GLenum type = static_cast<GLenum>(c.type);
282 GLuint client_id = static_cast<GLuint>(c.client_id);
283 error::Error error = DoCreateShader(type, client_id);
284 if (error != error::kNoError) {
285 return error;
286 }
287 return error::kNoError;
288 }
289
290 error::Error GLES2DecoderPassthroughImpl::HandleFenceSync(
291 uint32_t immediate_data_size,
292 const void* cmd_data) {
293 const gles2::cmds::FenceSync& c =
294 *static_cast<const gles2::cmds::FenceSync*>(cmd_data);
295 (void)c;
piman 2016/05/25 23:34:42 nit: no need for this
Geoff Lang 2016/05/27 14:31:28 Done.
296 GLenum condition = static_cast<GLenum>(c.condition);
297 GLbitfield flags = static_cast<GLbitfield>(c.flags);
298 GLuint client_id = static_cast<GLuint>(c.client_id);
299 error::Error error = DoFenceSync(condition, flags, client_id);
300 if (error != error::kNoError) {
301 return error;
302 }
303 return error::kNoError;
304 }
305
306 error::Error GLES2DecoderPassthroughImpl::HandleDrawArrays(
307 uint32_t immediate_data_size,
308 const void* cmd_data) {
309 const gles2::cmds::DrawArrays& c =
310 *static_cast<const gles2::cmds::DrawArrays*>(cmd_data);
311 GLenum mode = static_cast<GLenum>(c.mode);
312 GLint first = static_cast<GLint>(c.first);
313 GLsizei count = static_cast<GLsizei>(c.count);
314 error::Error error = DoDrawArrays(mode, first, count);
315 if (error != error::kNoError) {
316 return error;
317 }
318 return error::kNoError;
319 }
320
321 error::Error GLES2DecoderPassthroughImpl::HandleDrawElements(
322 uint32_t immediate_data_size,
323 const void* cmd_data) {
324 const gles2::cmds::DrawElements& c =
325 *static_cast<const gles2::cmds::DrawElements*>(cmd_data);
326 GLenum mode = static_cast<GLenum>(c.mode);
327 GLsizei count = static_cast<GLsizei>(c.count);
328 GLenum type = static_cast<GLenum>(c.type);
329 const GLvoid* indices =
330 reinterpret_cast<const GLvoid*>(static_cast<uintptr_t>(c.index_offset));
331 error::Error error = DoDrawElements(mode, count, type, indices);
332 if (error != error::kNoError) {
333 return error;
334 }
335 return error::kNoError;
336 }
337
338 error::Error GLES2DecoderPassthroughImpl::HandleGetActiveAttrib(
339 uint32_t immediate_data_size,
340 const void* cmd_data) {
341 const gles2::cmds::GetActiveAttrib& c =
342 *static_cast<const gles2::cmds::GetActiveAttrib*>(cmd_data);
343 GLuint program = static_cast<GLuint>(c.program);
344 GLuint index = static_cast<GLuint>(c.index);
345 uint32_t name_bucket_id = c.name_bucket_id;
346 typedef cmds::GetActiveAttrib::Result Result;
347 Result* result = GetSharedMemoryAs<Result*>(
348 c.result_shm_id, c.result_shm_offset, sizeof(*result));
349 if (!result) {
350 return error::kOutOfBounds;
351 }
352 // Check that the client initialized the result.
353 if (result->success != 0) {
354 return error::kInvalidArguments;
355 }
356
357 std::string name;
358 error::Error error =
359 DoGetActiveAttrib(program, index, &result->size, &result->type, &name);
360 if (error != error::kNoError) {
361 return error;
362 }
363
364 result->success = 1; // true.
365 Bucket* bucket = CreateBucket(name_bucket_id);
366 bucket->SetFromString(name.c_str());
367 return error::kNoError;
368 }
369
370 error::Error GLES2DecoderPassthroughImpl::HandleGetActiveUniform(
371 uint32_t immediate_data_size,
372 const void* cmd_data) {
373 const gles2::cmds::GetActiveUniform& c =
374 *static_cast<const gles2::cmds::GetActiveUniform*>(cmd_data);
375 GLuint program = static_cast<GLuint>(c.program);
376 GLuint index = static_cast<GLuint>(c.index);
377 uint32_t name_bucket_id = c.name_bucket_id;
378 typedef cmds::GetActiveUniform::Result Result;
379 Result* result = GetSharedMemoryAs<Result*>(
380 c.result_shm_id, c.result_shm_offset, sizeof(*result));
381 if (!result) {
382 return error::kOutOfBounds;
383 }
384 // Check that the client initialized the result.
385 if (result->success != 0) {
386 return error::kInvalidArguments;
387 }
388
389 std::string name;
390 error::Error error =
391 DoGetActiveUniform(program, index, &result->size, &result->type, &name);
392 if (error != error::kNoError) {
393 return error;
394 }
395
396 result->success = 1; // true.
397 Bucket* bucket = CreateBucket(name_bucket_id);
398 bucket->SetFromString(name.c_str());
399 return error::kNoError;
400 }
401
402 error::Error GLES2DecoderPassthroughImpl::HandleGetActiveUniformBlockiv(
403 uint32_t immediate_data_size,
404 const void* cmd_data) {
405 const gles2::cmds::GetActiveUniformBlockiv& c =
406 *static_cast<const gles2::cmds::GetActiveUniformBlockiv*>(cmd_data);
407 GLuint program = static_cast<GLuint>(c.program);
408 GLuint uniformBlockIndex = static_cast<GLuint>(c.index);
409 GLenum pname = static_cast<GLenum>(c.pname);
410 unsigned int buffer_size = 0;
411 typedef cmds::GetActiveUniformBlockiv::Result Result;
412 Result* result = GetSharedMemoryAndSizeAs<Result*>(
413 c.params_shm_id, c.params_shm_offset, &buffer_size);
414 GLint* params = result ? result->GetData() : NULL;
415 GLsizei bufsize = Result::ComputeMaxResults(buffer_size);
416 GLsizei length = 0;
417 error::Error error = DoGetActiveUniformBlockiv(
418 program, uniformBlockIndex, pname, bufsize, &length, params);
419 if (error != error::kNoError) {
420 return error;
421 }
422 if (length > bufsize) {
423 return error::kOutOfBounds;
424 }
425 result->SetNumResults(length);
426 return error::kNoError;
427 }
428
429 error::Error GLES2DecoderPassthroughImpl::HandleGetActiveUniformBlockName(
430 uint32_t immediate_data_size,
431 const void* cmd_data) {
432 const gles2::cmds::GetActiveUniformBlockName& c =
433 *static_cast<const gles2::cmds::GetActiveUniformBlockName*>(cmd_data);
434 GLuint program = static_cast<GLuint>(c.program);
435 GLuint uniformBlockIndex = static_cast<GLuint>(c.index);
436 uint32_t name_bucket_id = c.name_bucket_id;
437 typedef cmds::GetActiveUniformBlockName::Result Result;
438 Result* result = GetSharedMemoryAs<Result*>(
439 c.result_shm_id, c.result_shm_offset, sizeof(*result));
440 if (!result) {
441 return error::kOutOfBounds;
442 }
443 // Check that the client initialized the result.
444 if (*result != 0) {
445 return error::kInvalidArguments;
446 }
447
448 std::string name;
449 error::Error error =
450 DoGetActiveUniformBlockName(program, uniformBlockIndex, &name);
451 if (error != error::kNoError) {
452 return error;
453 }
454
455 *result = 1;
456 Bucket* bucket = CreateBucket(name_bucket_id);
457 bucket->SetFromString(name.c_str());
458 return error::kNoError;
459 }
460
461 error::Error GLES2DecoderPassthroughImpl::HandleGetActiveUniformsiv(
462 uint32_t immediate_data_size,
463 const void* cmd_data) {
464 const gles2::cmds::GetActiveUniformsiv& c =
465 *static_cast<const gles2::cmds::GetActiveUniformsiv*>(cmd_data);
466 GLuint program = static_cast<GLuint>(c.program);
467 GLenum pname = static_cast<GLenum>(c.pname);
468 Bucket* bucket = GetBucket(c.indices_bucket_id);
469 if (!bucket) {
470 return error::kInvalidArguments;
471 }
472 GLsizei uniformCount = static_cast<GLsizei>(bucket->size() / sizeof(GLuint));
473 const GLuint* indices = bucket->GetDataAs<const GLuint*>(0, bucket->size());
474 typedef cmds::GetActiveUniformsiv::Result Result;
475 Result* result = GetSharedMemoryAs<Result*>(
476 c.params_shm_id, c.params_shm_offset, Result::ComputeSize(uniformCount));
477 GLint* params = result ? result->GetData() : NULL;
478 if (params == NULL) {
479 return error::kOutOfBounds;
480 }
481 // Check that the client initialized the result.
482 if (result->size != 0) {
483 return error::kInvalidArguments;
484 }
485
486 GLsizei bufsize = uniformCount;
487 GLsizei length = 0;
488 error::Error error = DoGetActiveUniformsiv(program, uniformCount, indices,
489 pname, bufsize, &length, params);
490 if (error != error::kNoError) {
491 return error;
492 }
493
494 result->SetNumResults(length);
495 return error::kNoError;
496 }
497
498 error::Error GLES2DecoderPassthroughImpl::HandleGetAttachedShaders(
499 uint32_t immediate_data_size,
500 const void* cmd_data) {
501 const gles2::cmds::GetAttachedShaders& c =
502 *static_cast<const gles2::cmds::GetAttachedShaders*>(cmd_data);
503 GLuint program = static_cast<GLuint>(c.program);
504 typedef cmds::GetAttachedShaders::Result Result;
505 uint32_t maxCount = Result::ComputeMaxResults(c.result_size);
506 Result* result = GetSharedMemoryAs<Result*>(
507 c.result_shm_id, c.result_shm_offset, Result::ComputeSize(maxCount));
508 if (!result) {
509 return error::kOutOfBounds;
510 }
511 // Check that the client initialized the result.
512 if (result->size != 0) {
513 return error::kInvalidArguments;
514 }
515 GLsizei count = 0;
516 error::Error error =
517 DoGetAttachedShaders(program, maxCount, &count, result->GetData());
518 if (error != error::kNoError) {
519 return error;
520 }
521
522 result->SetNumResults(count);
523 return error::kNoError;
524 }
525
526 error::Error GLES2DecoderPassthroughImpl::HandleGetAttribLocation(
527 uint32_t immediate_data_size,
528 const void* cmd_data) {
529 const gles2::cmds::GetAttribLocation& c =
530 *static_cast<const gles2::cmds::GetAttribLocation*>(cmd_data);
531 GLuint program = static_cast<GLuint>(c.program);
532 Bucket* bucket = GetBucket(c.name_bucket_id);
533 if (!bucket) {
534 return error::kInvalidArguments;
535 }
536 std::string name_str;
537 if (!bucket->GetAsString(&name_str)) {
538 return error::kInvalidArguments;
539 }
540 GLint* location = GetSharedMemoryAs<GLint*>(
541 c.location_shm_id, c.location_shm_offset, sizeof(GLint));
542 if (!location) {
543 return error::kOutOfBounds;
544 }
545 if (*location != -1) {
546 return error::kInvalidArguments;
547 }
548 error::Error error = DoGetAttribLocation(program, name_str.c_str(), location);
549 if (error != error::kNoError) {
550 return error;
551 }
552 return error::kNoError;
553 }
554
555 error::Error GLES2DecoderPassthroughImpl::HandleGetFragDataLocation(
556 uint32_t immediate_data_size,
557 const void* cmd_data) {
558 const gles2::cmds::GetFragDataLocation& c =
559 *static_cast<const gles2::cmds::GetFragDataLocation*>(cmd_data);
560 GLuint program = static_cast<GLuint>(c.program);
561 Bucket* bucket = GetBucket(c.name_bucket_id);
562 if (!bucket) {
563 return error::kInvalidArguments;
564 }
565 std::string name_str;
566 if (!bucket->GetAsString(&name_str)) {
567 return error::kInvalidArguments;
568 }
569 GLint* location = GetSharedMemoryAs<GLint*>(
570 c.location_shm_id, c.location_shm_offset, sizeof(GLint));
571 if (!location) {
572 return error::kOutOfBounds;
573 }
574 if (*location != -1) {
575 return error::kInvalidArguments;
576 }
577 error::Error error =
578 DoGetFragDataLocation(program, name_str.c_str(), location);
579 if (error != error::kNoError) {
580 return error;
581 }
582 return error::kNoError;
583 }
584
585 error::Error GLES2DecoderPassthroughImpl::HandleGetInternalformativ(
586 uint32_t immediate_data_size,
587 const void* cmd_data) {
588 const gles2::cmds::GetInternalformativ& c =
589 *static_cast<const gles2::cmds::GetInternalformativ*>(cmd_data);
590 GLenum target = static_cast<GLenum>(c.target);
591 GLenum internalformat = static_cast<GLenum>(c.format);
592 GLenum pname = static_cast<GLenum>(c.pname);
593 unsigned int buffer_size = 0;
594 typedef cmds::GetInternalformativ::Result Result;
595 Result* result = GetSharedMemoryAndSizeAs<Result*>(
596 c.params_shm_id, c.params_shm_offset, &buffer_size);
597 GLint* params = result ? result->GetData() : NULL;
598 GLsizei bufsize = Result::ComputeMaxResults(buffer_size);
599 GLsizei length = 0;
600 error::Error error = DoGetInternalformativ(target, internalformat, pname,
601 bufsize, &length, params);
602 if (error != error::kNoError) {
603 return error;
604 }
605 if (length > bufsize) {
606 return error::kOutOfBounds;
607 }
608 result->SetNumResults(length);
609 return error::kNoError;
610 }
611
612 error::Error GLES2DecoderPassthroughImpl::HandleGetProgramInfoLog(
613 uint32_t immediate_data_size,
614 const void* cmd_data) {
615 const gles2::cmds::GetProgramInfoLog& c =
616 *static_cast<const gles2::cmds::GetProgramInfoLog*>(cmd_data);
617 GLuint program = static_cast<GLuint>(c.program);
618 uint32_t bucket_id = static_cast<uint32_t>(c.bucket_id);
619
620 std::string infolog;
621 error::Error error = DoGetProgramInfoLog(program, &infolog);
622 if (error != error::kNoError) {
623 return error;
624 }
625
626 Bucket* bucket = CreateBucket(bucket_id);
627 bucket->SetFromString(infolog.c_str());
628 return error::kNoError;
629 }
630
631 error::Error GLES2DecoderPassthroughImpl::HandleGetShaderInfoLog(
632 uint32_t immediate_data_size,
633 const void* cmd_data) {
634 const gles2::cmds::GetShaderInfoLog& c =
635 *static_cast<const gles2::cmds::GetShaderInfoLog*>(cmd_data);
636 GLuint shader = static_cast<GLuint>(c.shader);
637 uint32_t bucket_id = static_cast<uint32_t>(c.bucket_id);
638
639 std::string infolog;
640 error::Error error = DoGetShaderInfoLog(shader, &infolog);
641 if (error != error::kNoError) {
642 return error;
643 }
644
645 Bucket* bucket = CreateBucket(bucket_id);
646 bucket->SetFromString(infolog.c_str());
647 return error::kNoError;
648 }
649
650 error::Error GLES2DecoderPassthroughImpl::HandleGetShaderPrecisionFormat(
651 uint32_t immediate_data_size,
652 const void* cmd_data) {
653 const gles2::cmds::GetShaderPrecisionFormat& c =
654 *static_cast<const gles2::cmds::GetShaderPrecisionFormat*>(cmd_data);
655 GLenum shader_type = static_cast<GLenum>(c.shadertype);
656 GLenum precision_type = static_cast<GLenum>(c.precisiontype);
657 typedef cmds::GetShaderPrecisionFormat::Result Result;
658 Result* result = GetSharedMemoryAs<Result*>(
659 c.result_shm_id, c.result_shm_offset, sizeof(*result));
660 if (!result) {
661 return error::kOutOfBounds;
662 }
663 // Check that the client initialized the result.
664 if (result->success != 0) {
665 return error::kInvalidArguments;
666 }
667
668 GLint range[2] = {0, 0};
669 GLint precision = 0;
670 error::Error error = DoGetShaderPrecisionFormat(shader_type, precision_type,
671 range, &precision);
672 if (error != error::kNoError) {
673 return error;
674 }
675
676 result->success = 1; // true
677 result->min_range = range[0];
678 result->max_range = range[1];
679 result->precision = precision;
680
681 return error::kNoError;
682 }
683
684 error::Error GLES2DecoderPassthroughImpl::HandleGetShaderSource(
685 uint32_t immediate_data_size,
686 const void* cmd_data) {
687 const gles2::cmds::GetShaderSource& c =
688 *static_cast<const gles2::cmds::GetShaderSource*>(cmd_data);
689 GLuint shader = static_cast<GLuint>(c.shader);
690 uint32_t bucket_id = static_cast<uint32_t>(c.bucket_id);
691
692 std::string source;
693 error::Error error = DoGetShaderSource(shader, &source);
694 if (error != error::kNoError) {
695 return error;
696 }
697
698 Bucket* bucket = CreateBucket(bucket_id);
699 bucket->SetFromString(source.c_str());
700
701 return error::kNoError;
702 }
703 error::Error GLES2DecoderPassthroughImpl::HandleGetString(
704 uint32_t immediate_data_size,
705 const void* cmd_data) {
706 const gles2::cmds::GetString& c =
707 *static_cast<const gles2::cmds::GetString*>(cmd_data);
708 GLenum name = static_cast<GLenum>(c.name);
709
710 const char* str = nullptr;
711 error::Error error = DoGetString(name, &str);
712 if (error != error::kNoError) {
713 return error;
714 }
715 if (!str) {
716 return error::kOutOfBounds;
717 }
718 Bucket* bucket = CreateBucket(c.bucket_id);
719 bucket->SetFromString(str);
720
721 return error::kNoError;
722 }
723 error::Error GLES2DecoderPassthroughImpl::HandleGetTransformFeedbackVarying(
724 uint32_t immediate_data_size,
725 const void* cmd_data) {
726 const gles2::cmds::GetTransformFeedbackVarying& c =
727 *static_cast<const gles2::cmds::GetTransformFeedbackVarying*>(cmd_data);
728 GLuint program = static_cast<GLuint>(c.program);
729 GLuint index = static_cast<GLuint>(c.index);
730 uint32_t name_bucket_id = c.name_bucket_id;
731 typedef cmds::GetTransformFeedbackVarying::Result Result;
732 Result* result = GetSharedMemoryAs<Result*>(
733 c.result_shm_id, c.result_shm_offset, sizeof(*result));
734 if (!result) {
735 return error::kOutOfBounds;
736 }
737 // Check that the client initialized the result.
738 if (result->success != 0) {
739 return error::kInvalidArguments;
740 }
741
742 GLsizei size = 0;
743 GLenum type = 0;
744 std::string name;
745 error::Error error =
746 DoGetTransformFeedbackVarying(program, index, &size, &type, &name);
747 if (error != error::kNoError) {
748 return error;
749 }
750
751 result->success = 1; // true.
752 result->size = static_cast<int32_t>(size);
753 result->type = static_cast<uint32_t>(type);
754 Bucket* bucket = CreateBucket(name_bucket_id);
755 bucket->SetFromString(name.c_str());
756 return error::kNoError;
757 }
758
759 error::Error GLES2DecoderPassthroughImpl::HandleGetUniformBlockIndex(
760 uint32_t immediate_data_size,
761 const void* cmd_data) {
762 const gles2::cmds::GetUniformBlockIndex& c =
763 *static_cast<const gles2::cmds::GetUniformBlockIndex*>(cmd_data);
764 GLuint program = static_cast<GLuint>(c.program);
765 Bucket* bucket = GetBucket(c.name_bucket_id);
766 if (!bucket) {
767 return error::kInvalidArguments;
768 }
769 std::string name_str;
770 if (!bucket->GetAsString(&name_str)) {
771 return error::kInvalidArguments;
772 }
773 GLint* index = GetSharedMemoryAs<GLint*>(c.index_shm_id, c.index_shm_offset,
774 sizeof(GLint));
775 if (!index) {
776 return error::kOutOfBounds;
777 }
778 if (*index != -1) {
779 return error::kInvalidArguments;
780 }
781 error::Error error = DoGetUniformBlockIndex(program, name_str.c_str(), index);
782 if (error != error::kNoError) {
783 return error;
784 }
785 return error::kNoError;
786 }
787
788 error::Error GLES2DecoderPassthroughImpl::HandleGetUniformfv(
789 uint32_t immediate_data_size,
790 const void* cmd_data) {
791 const gles2::cmds::GetUniformfv& c =
792 *static_cast<const gles2::cmds::GetUniformfv*>(cmd_data);
793 GLuint program = static_cast<GLuint>(c.program);
794 GLint location = static_cast<GLint>(c.location);
795 unsigned int buffer_size = 0;
796 typedef cmds::GetUniformfv::Result Result;
797 Result* result = GetSharedMemoryAndSizeAs<Result*>(
798 c.params_shm_id, c.params_shm_offset, &buffer_size);
799 GLfloat* params = result ? result->GetData() : NULL;
800 GLsizei bufsize = Result::ComputeMaxResults(buffer_size);
801 GLsizei length = 0;
802 error::Error error =
803 DoGetUniformfv(program, location, bufsize, &length, params);
804 if (error != error::kNoError) {
805 return error;
806 }
807 if (length > bufsize) {
808 return error::kOutOfBounds;
809 }
810 result->SetNumResults(length);
811 return error::kNoError;
812 }
813 error::Error GLES2DecoderPassthroughImpl::HandleGetUniformiv(
814 uint32_t immediate_data_size,
815 const void* cmd_data) {
816 const gles2::cmds::GetUniformiv& c =
817 *static_cast<const gles2::cmds::GetUniformiv*>(cmd_data);
818 GLuint program = static_cast<GLuint>(c.program);
819 GLint location = static_cast<GLint>(c.location);
820 unsigned int buffer_size = 0;
821 typedef cmds::GetUniformiv::Result Result;
822 Result* result = GetSharedMemoryAndSizeAs<Result*>(
823 c.params_shm_id, c.params_shm_offset, &buffer_size);
824 GLint* params = result ? result->GetData() : NULL;
825 GLsizei bufsize = Result::ComputeMaxResults(buffer_size);
826 GLsizei length = 0;
827 error::Error error =
828 DoGetUniformiv(program, location, bufsize, &length, params);
829 if (error != error::kNoError) {
830 return error;
831 }
832 if (length > bufsize) {
833 return error::kOutOfBounds;
834 }
835 result->SetNumResults(length);
836 return error::kNoError;
837 }
838 error::Error GLES2DecoderPassthroughImpl::HandleGetUniformuiv(
839 uint32_t immediate_data_size,
840 const void* cmd_data) {
841 const gles2::cmds::GetUniformuiv& c =
842 *static_cast<const gles2::cmds::GetUniformuiv*>(cmd_data);
843 GLuint program = static_cast<GLuint>(c.program);
844 GLint location = static_cast<GLint>(c.location);
845 unsigned int buffer_size = 0;
846 typedef cmds::GetUniformuiv::Result Result;
847 Result* result = GetSharedMemoryAndSizeAs<Result*>(
848 c.params_shm_id, c.params_shm_offset, &buffer_size);
849 GLuint* params = result ? result->GetData() : NULL;
850 GLsizei bufsize = Result::ComputeMaxResults(buffer_size);
851 GLsizei length = 0;
852 error::Error error =
853 DoGetUniformuiv(program, location, bufsize, &length, params);
854 if (error != error::kNoError) {
855 return error;
856 }
857 if (length > bufsize) {
858 return error::kOutOfBounds;
859 }
860 result->SetNumResults(length);
861 return error::kNoError;
862 }
863 error::Error GLES2DecoderPassthroughImpl::HandleGetUniformIndices(
864 uint32_t immediate_data_size,
865 const void* cmd_data) {
866 const gles2::cmds::GetUniformIndices& c =
867 *static_cast<const gles2::cmds::GetUniformIndices*>(cmd_data);
868 GLuint program = static_cast<GLuint>(c.program);
869 Bucket* bucket = GetBucket(c.names_bucket_id);
870 if (!bucket) {
871 return error::kInvalidArguments;
872 }
873 GLsizei count = 0;
874 std::vector<char*> names;
875 std::vector<GLint> len;
876 if (!bucket->GetAsStrings(&count, &names, &len) || count <= 0) {
877 return error::kInvalidArguments;
878 }
879 typedef cmds::GetUniformIndices::Result Result;
880 Result* result = GetSharedMemoryAs<Result*>(
881 c.indices_shm_id, c.indices_shm_offset,
882 Result::ComputeSize(static_cast<size_t>(count)));
883 GLuint* indices = result ? result->GetData() : NULL;
884 if (indices == NULL) {
885 return error::kOutOfBounds;
886 }
887 // Check that the client initialized the result.
888 if (result->size != 0) {
889 return error::kInvalidArguments;
890 }
891 GLsizei length = 0;
892 error::Error error =
893 DoGetUniformIndices(program, count, &names[0], count, &length, indices);
894 if (error != error::kNoError) {
895 return error;
896 }
897 if (length != count) {
898 return error::kOutOfBounds;
899 }
900 result->SetNumResults(length);
901 return error::kNoError;
902 }
903 error::Error GLES2DecoderPassthroughImpl::HandleGetUniformLocation(
904 uint32_t immediate_data_size,
905 const void* cmd_data) {
906 const gles2::cmds::GetUniformLocation& c =
907 *static_cast<const gles2::cmds::GetUniformLocation*>(cmd_data);
908 GLuint program = static_cast<GLuint>(c.program);
909 Bucket* bucket = GetBucket(c.name_bucket_id);
910 if (!bucket) {
911 return error::kInvalidArguments;
912 }
913 std::string name_str;
914 if (!bucket->GetAsString(&name_str)) {
915 return error::kInvalidArguments;
916 }
917 GLint* location = GetSharedMemoryAs<GLint*>(
918 c.location_shm_id, c.location_shm_offset, sizeof(GLint));
919 if (!location) {
920 return error::kOutOfBounds;
921 }
922 if (*location != -1) {
923 return error::kInvalidArguments;
924 }
925 error::Error error =
926 DoGetUniformLocation(program, name_str.c_str(), location);
927 if (error != error::kNoError) {
928 return error;
929 }
930 return error::kNoError;
931 }
932 error::Error GLES2DecoderPassthroughImpl::HandleGetVertexAttribPointerv(
933 uint32_t immediate_data_size,
934 const void* cmd_data) {
935 const gles2::cmds::GetVertexAttribPointerv& c =
936 *static_cast<const gles2::cmds::GetVertexAttribPointerv*>(cmd_data);
937 GLuint index = static_cast<GLuint>(c.index);
938 GLenum pname = static_cast<GLenum>(c.pname);
939 unsigned int buffer_size = 0;
940 typedef cmds::GetVertexAttribPointerv::Result Result;
941 Result* result = GetSharedMemoryAndSizeAs<Result*>(
942 c.pointer_shm_id, c.pointer_shm_offset, &buffer_size);
943 GLuint* params = result ? result->GetData() : NULL;
944 GLsizei bufsize = Result::ComputeMaxResults(buffer_size);
945 GLsizei length = 0;
946 error::Error error =
947 DoGetVertexAttribPointerv(index, pname, bufsize, &length, params);
948 if (error != error::kNoError) {
949 return error;
950 }
951 if (length > bufsize) {
952 return error::kOutOfBounds;
953 }
954 result->SetNumResults(length);
955 return error::kNoError;
956 }
957 error::Error GLES2DecoderPassthroughImpl::HandlePixelStorei(
958 uint32_t immediate_data_size,
959 const void* cmd_data) {
960 const gles2::cmds::PixelStorei& c =
961 *static_cast<const gles2::cmds::PixelStorei*>(cmd_data);
962 GLenum pname = static_cast<GLuint>(c.pname);
963 GLint param = static_cast<GLint>(c.param);
964 error::Error error = DoPixelStorei(pname, param);
965 if (error != error::kNoError) {
966 return error;
967 }
968 return error::kNoError;
969 }
970 error::Error GLES2DecoderPassthroughImpl::HandleReadPixels(
971 uint32_t immediate_data_size,
972 const void* cmd_data) {
973 const gles2::cmds::ReadPixels& c =
974 *static_cast<const gles2::cmds::ReadPixels*>(cmd_data);
975 GLint x = static_cast<GLint>(c.x);
976 GLint y = static_cast<GLint>(c.y);
977 GLsizei width = static_cast<GLsizei>(c.width);
978 GLsizei height = static_cast<GLsizei>(c.height);
979 GLenum format = static_cast<GLenum>(c.format);
980 GLenum type = static_cast<GLenum>(c.type);
981
982 uint8_t* pixels = nullptr;
983 unsigned int buffer_size = 0;
984 if (c.pixels_shm_id != 0) {
985 pixels = GetSharedMemoryAndSizeAs<uint8_t*>(
986 c.pixels_shm_id, c.pixels_shm_offset, &buffer_size);
987 if (!pixels) {
988 return error::kOutOfBounds;
989 }
990 }
991
992 GLsizei bufsize = buffer_size;
993 GLsizei length = 0;
994 error::Error error =
995 DoReadPixels(x, y, width, height, format, type, bufsize, &length, pixels);
996 if (error != error::kNoError) {
997 return error;
998 }
999 if (length > bufsize) {
1000 return error::kOutOfBounds;
1001 }
1002
1003 typedef cmds::ReadPixels::Result Result;
1004 Result* result = nullptr;
1005 if (c.result_shm_id != 0) {
1006 result = GetSharedMemoryAs<Result*>(c.result_shm_id, c.result_shm_offset,
1007 sizeof(*result));
1008 if (!result) {
1009 return error::kOutOfBounds;
1010 }
1011 if (result->success != 0) {
1012 return error::kInvalidArguments;
1013 }
1014 }
1015
1016 if (result) {
1017 result->success = 1;
1018 result->row_length = static_cast<uint32_t>(width);
1019 result->num_rows = static_cast<uint32_t>(height);
1020 }
1021
1022 return error::kNoError;
1023 }
1024 error::Error GLES2DecoderPassthroughImpl::HandleShaderBinary(
1025 uint32_t immediate_data_size,
1026 const void* cmd_data) {
1027 const gles2::cmds::ShaderBinary& c =
1028 *static_cast<const gles2::cmds::ShaderBinary*>(cmd_data);
1029 GLsizei n = static_cast<GLsizei>(c.n);
1030 GLsizei length = static_cast<GLsizei>(c.length);
1031 uint32_t data_size;
1032 if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
1033 return error::kOutOfBounds;
1034 }
1035 const GLuint* shaders = GetSharedMemoryAs<const GLuint*>(
1036 c.shaders_shm_id, c.shaders_shm_offset, data_size);
1037 GLenum binaryformat = static_cast<GLenum>(c.binaryformat);
1038 const void* binary = GetSharedMemoryAs<const void*>(
1039 c.binary_shm_id, c.binary_shm_offset, length);
1040 if (shaders == NULL || binary == NULL) {
1041 return error::kOutOfBounds;
1042 }
1043
1044 error::Error error = DoShaderBinary(n, shaders, binaryformat, binary, length);
1045 if (error != error::kNoError) {
1046 return error;
1047 }
1048
1049 return error::kNoError;
1050 }
1051 error::Error GLES2DecoderPassthroughImpl::HandleTexImage2D(
1052 uint32_t immediate_data_size,
1053 const void* cmd_data) {
1054 const gles2::cmds::TexImage2D& c =
1055 *static_cast<const gles2::cmds::TexImage2D*>(cmd_data);
1056 GLenum target = static_cast<GLenum>(c.target);
1057 GLint level = static_cast<GLint>(c.level);
1058 GLint internal_format = static_cast<GLint>(c.internalformat);
1059 GLsizei width = static_cast<GLsizei>(c.width);
1060 GLsizei height = static_cast<GLsizei>(c.height);
1061 GLint border = static_cast<GLint>(c.border);
1062 GLenum format = static_cast<GLenum>(c.format);
1063 GLenum type = static_cast<GLenum>(c.type);
1064
1065 GLsizei imagesize = 0;
1066 const void* pixels = NULL;
1067 if (c.pixels_shm_id != 0 || c.pixels_shm_offset != 0) {
1068 unsigned int buffer_size = 0;
1069 pixels = GetSharedMemoryAndSizeAs<uint8_t*>(
1070 c.pixels_shm_id, c.pixels_shm_offset, &buffer_size);
1071 if (!pixels) {
1072 return error::kOutOfBounds;
1073 }
1074 imagesize = buffer_size;
1075 }
1076
1077 error::Error error =
1078 DoTexImage2D(target, level, internal_format, width, height, border,
1079 format, type, imagesize, pixels);
1080 if (error != error::kNoError) {
1081 return error;
1082 }
1083
1084 return error::kNoError;
1085 }
1086
1087 error::Error GLES2DecoderPassthroughImpl::HandleTexImage3D(
1088 uint32_t immediate_data_size,
1089 const void* cmd_data) {
1090 const gles2::cmds::TexImage3D& c =
1091 *static_cast<const gles2::cmds::TexImage3D*>(cmd_data);
1092 GLenum target = static_cast<GLenum>(c.target);
1093 GLint level = static_cast<GLint>(c.level);
1094 GLint internal_format = static_cast<GLint>(c.internalformat);
1095 GLsizei width = static_cast<GLsizei>(c.width);
1096 GLsizei height = static_cast<GLsizei>(c.height);
1097 GLsizei depth = static_cast<GLsizei>(c.depth);
1098 GLint border = static_cast<GLint>(c.border);
1099 GLenum format = static_cast<GLenum>(c.format);
1100 GLenum type = static_cast<GLenum>(c.type);
1101
1102 GLsizei imagesize = 0;
1103 const void* pixels = NULL;
1104 if (c.pixels_shm_id != 0 || c.pixels_shm_offset != 0) {
1105 unsigned int buffer_size = 0;
1106 pixels = GetSharedMemoryAndSizeAs<uint8_t*>(
1107 c.pixels_shm_id, c.pixels_shm_offset, &buffer_size);
1108 if (!pixels) {
1109 return error::kOutOfBounds;
1110 }
1111 imagesize = buffer_size;
1112 }
1113
1114 error::Error error =
1115 DoTexImage3D(target, level, internal_format, width, height, depth, border,
1116 format, type, imagesize, pixels);
1117 if (error != error::kNoError) {
1118 return error;
1119 }
1120
1121 return error::kNoError;
1122 }
1123
1124 error::Error GLES2DecoderPassthroughImpl::HandleTexSubImage2D(
1125 uint32_t immediate_data_size,
1126 const void* cmd_data) {
1127 const gles2::cmds::TexSubImage2D& c =
1128 *static_cast<const gles2::cmds::TexSubImage2D*>(cmd_data);
1129 GLenum target = static_cast<GLenum>(c.target);
1130 GLint level = static_cast<GLint>(c.level);
1131 GLint xoffset = static_cast<GLint>(c.xoffset);
1132 GLint yoffset = static_cast<GLint>(c.yoffset);
1133 GLsizei width = static_cast<GLsizei>(c.width);
1134 GLsizei height = static_cast<GLsizei>(c.height);
1135 GLenum format = static_cast<GLenum>(c.format);
1136 GLenum type = static_cast<GLenum>(c.type);
1137
1138 unsigned int buffer_size = 0;
1139 const void* pixels = GetSharedMemoryAndSizeAs<uint8_t*>(
1140 c.pixels_shm_id, c.pixels_shm_offset, &buffer_size);
1141 if (!pixels) {
1142 return error::kOutOfBounds;
1143 }
1144 GLsizei imagesize = buffer_size;
1145
1146 error::Error error = DoTexSubImage2D(target, level, xoffset, yoffset, width,
1147 height, format, type, imagesize, pixels);
1148 if (error != error::kNoError) {
1149 return error;
1150 }
1151
1152 return error::kNoError;
1153 }
1154
1155 error::Error GLES2DecoderPassthroughImpl::HandleTexSubImage3D(
1156 uint32_t immediate_data_size,
1157 const void* cmd_data) {
1158 const gles2::cmds::TexSubImage3D& c =
1159 *static_cast<const gles2::cmds::TexSubImage3D*>(cmd_data);
1160 GLenum target = static_cast<GLenum>(c.target);
1161 GLint level = static_cast<GLint>(c.level);
1162 GLint xoffset = static_cast<GLint>(c.xoffset);
1163 GLint yoffset = static_cast<GLint>(c.yoffset);
1164 GLint zoffset = static_cast<GLint>(c.zoffset);
1165 GLsizei width = static_cast<GLsizei>(c.width);
1166 GLsizei height = static_cast<GLsizei>(c.height);
1167 GLsizei depth = static_cast<GLsizei>(c.depth);
1168 GLenum format = static_cast<GLenum>(c.format);
1169 GLenum type = static_cast<GLenum>(c.type);
1170
1171 unsigned int buffer_size = 0;
1172 const void* pixels = GetSharedMemoryAndSizeAs<uint8_t*>(
1173 c.pixels_shm_id, c.pixels_shm_offset, &buffer_size);
1174 if (!pixels) {
1175 return error::kOutOfBounds;
1176 }
1177 GLsizei imagesize = buffer_size;
1178
1179 error::Error error =
1180 DoTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height,
1181 depth, format, type, imagesize, pixels);
1182 if (error != error::kNoError) {
1183 return error;
1184 }
1185
1186 return error::kNoError;
1187 }
1188
1189 error::Error GLES2DecoderPassthroughImpl::HandleUniformBlockBinding(
1190 uint32_t immediate_data_size,
1191 const void* cmd_data) {
1192 const gles2::cmds::UniformBlockBinding& c =
1193 *static_cast<const gles2::cmds::UniformBlockBinding*>(cmd_data);
1194 GLuint program = static_cast<GLuint>(c.program);
1195 GLuint index = static_cast<GLuint>(c.index);
1196 GLuint binding = static_cast<GLuint>(c.binding);
1197
1198 error::Error error = DoUniformBlockBinding(program, index, binding);
1199 if (error != error::kNoError) {
1200 return error;
1201 }
1202
1203 return error::kNoError;
1204 }
1205
1206 error::Error GLES2DecoderPassthroughImpl::HandleVertexAttribIPointer(
1207 uint32_t immediate_data_size,
1208 const void* cmd_data) {
1209 const gles2::cmds::VertexAttribIPointer& c =
1210 *static_cast<const gles2::cmds::VertexAttribIPointer*>(cmd_data);
1211 GLuint index = static_cast<GLuint>(c.indx);
1212 GLint size = static_cast<GLint>(c.size);
1213 GLenum type = static_cast<GLenum>(c.type);
1214 GLsizei stride = static_cast<GLsizei>(c.stride);
1215 GLsizei offset = static_cast<GLsizei>(c.offset);
1216 const void* ptr = reinterpret_cast<const void*>(offset);
1217
1218 error::Error error = DoVertexAttribIPointer(index, size, type, stride, ptr);
1219 if (error != error::kNoError) {
1220 return error;
1221 }
1222
1223 return error::kNoError;
1224 }
1225
1226 error::Error GLES2DecoderPassthroughImpl::HandleVertexAttribPointer(
1227 uint32_t immediate_data_size,
1228 const void* cmd_data) {
1229 const gles2::cmds::VertexAttribPointer& c =
1230 *static_cast<const gles2::cmds::VertexAttribPointer*>(cmd_data);
1231 GLuint index = static_cast<GLuint>(c.indx);
1232 GLint size = static_cast<GLint>(c.size);
1233 GLenum type = static_cast<GLenum>(c.type);
1234 GLboolean normalized = static_cast<GLenum>(c.normalized);
1235 GLsizei stride = static_cast<GLsizei>(c.stride);
1236 GLsizei offset = static_cast<GLsizei>(c.offset);
1237 const void* ptr = reinterpret_cast<const void*>(offset);
1238
1239 error::Error error =
1240 DoVertexAttribPointer(index, size, type, normalized, stride, ptr);
1241 if (error != error::kNoError) {
1242 return error;
1243 }
1244
1245 return error::kNoError;
1246 }
1247
1248 error::Error GLES2DecoderPassthroughImpl::HandleWaitSync(
1249 uint32_t immediate_data_size,
1250 const void* cmd_data) {
1251 const gles2::cmds::WaitSync& c =
1252 *static_cast<const gles2::cmds::WaitSync*>(cmd_data);
1253 const GLuint sync = static_cast<GLuint>(c.sync);
1254 const GLbitfield flags = static_cast<GLbitfield>(c.flags);
1255 const GLuint64 timeout = c.timeout();
1256
1257 error::Error error = DoWaitSync(sync, flags, timeout);
1258 if (error != error::kNoError) {
1259 return error;
1260 }
1261
1262 return error::kNoError;
1263 }
1264
1265 error::Error GLES2DecoderPassthroughImpl::HandleQueryCounterEXT(
1266 uint32_t immediate_data_size,
1267 const void* cmd_data) {
1268 const gles2::cmds::QueryCounterEXT& c =
1269 *static_cast<const gles2::cmds::QueryCounterEXT*>(cmd_data);
1270 GLuint id = static_cast<GLuint>(c.id);
1271 GLenum target = static_cast<GLenum>(c.target);
1272
1273 error::Error error = DoQueryCounterEXT(id, target);
1274 if (error != error::kNoError) {
1275 return error;
1276 }
1277
1278 return error::kNoError;
1279 }
1280
1281 error::Error GLES2DecoderPassthroughImpl::HandleBeginQueryEXT(
1282 uint32_t immediate_data_size,
1283 const void* cmd_data) {
1284 const gles2::cmds::BeginQueryEXT& c =
1285 *static_cast<const gles2::cmds::BeginQueryEXT*>(cmd_data);
1286 GLenum target = static_cast<GLenum>(c.target);
1287 GLuint id = static_cast<GLuint>(c.id);
1288
1289 error::Error error = DoBeginQueryEXT(target, id);
1290 if (error != error::kNoError) {
1291 return error;
1292 }
1293
1294 return error::kNoError;
1295 }
1296
1297 error::Error GLES2DecoderPassthroughImpl::HandleEndQueryEXT(
1298 uint32_t immediate_data_size,
1299 const void* cmd_data) {
1300 const gles2::cmds::EndQueryEXT& c =
1301 *static_cast<const gles2::cmds::EndQueryEXT*>(cmd_data);
1302 GLenum target = static_cast<GLenum>(c.target);
1303
1304 error::Error error = DoEndQueryEXT(target);
1305 if (error != error::kNoError) {
1306 return error;
1307 }
1308
1309 return error::kNoError;
1310 }
1311
1312 error::Error GLES2DecoderPassthroughImpl::HandleSetDisjointValueSyncCHROMIUM(
1313 uint32_t immediate_data_size,
1314 const void* cmd_data) {
1315 const gles2::cmds::SetDisjointValueSyncCHROMIUM& c =
1316 *static_cast<const gles2::cmds::SetDisjointValueSyncCHROMIUM*>(cmd_data);
1317 DisjointValueSync* sync = GetSharedMemoryAs<DisjointValueSync*>(
1318 c.sync_data_shm_id, c.sync_data_shm_offset, sizeof(*sync));
1319 if (!sync) {
1320 return error::kOutOfBounds;
1321 }
1322 error::Error error = DoSetDisjointValueSyncCHROMIUM(sync);
1323 if (error != error::kNoError) {
1324 return error;
1325 }
1326 return error::kNoError;
1327 }
1328
1329 error::Error GLES2DecoderPassthroughImpl::HandleInsertEventMarkerEXT(
1330 uint32_t immediate_data_size,
1331 const void* cmd_data) {
1332 const gles2::cmds::InsertEventMarkerEXT& c =
1333 *static_cast<const gles2::cmds::InsertEventMarkerEXT*>(cmd_data);
1334 GLuint bucket_id = static_cast<GLuint>(c.bucket_id);
1335 Bucket* bucket = GetBucket(bucket_id);
1336 if (!bucket || bucket->size() == 0) {
1337 return error::kInvalidArguments;
1338 }
1339 std::string str;
1340 if (!bucket->GetAsString(&str)) {
1341 return error::kInvalidArguments;
1342 }
1343 error::Error error = DoInsertEventMarkerEXT(0, str.c_str());
1344 if (error != error::kNoError) {
1345 return error;
1346 }
1347 return error::kNoError;
1348 }
1349
1350 error::Error GLES2DecoderPassthroughImpl::HandlePushGroupMarkerEXT(
1351 uint32_t immediate_data_size,
1352 const void* cmd_data) {
1353 const gles2::cmds::PushGroupMarkerEXT& c =
1354 *static_cast<const gles2::cmds::PushGroupMarkerEXT*>(cmd_data);
1355 GLuint bucket_id = static_cast<GLuint>(c.bucket_id);
1356 Bucket* bucket = GetBucket(bucket_id);
1357 if (!bucket || bucket->size() == 0) {
1358 return error::kInvalidArguments;
1359 }
1360 std::string str;
1361 if (!bucket->GetAsString(&str)) {
1362 return error::kInvalidArguments;
1363 }
1364 error::Error error = DoPushGroupMarkerEXT(0, str.c_str());
1365 if (error != error::kNoError) {
1366 return error;
1367 }
1368 return error::kNoError;
1369 }
1370 error::Error GLES2DecoderPassthroughImpl::HandleEnableFeatureCHROMIUM(
1371 uint32_t immediate_data_size,
1372 const void* cmd_data) {
1373 const gles2::cmds::EnableFeatureCHROMIUM& c =
1374 *static_cast<const gles2::cmds::EnableFeatureCHROMIUM*>(cmd_data);
1375 Bucket* bucket = GetBucket(c.bucket_id);
1376 if (!bucket || bucket->size() == 0) {
1377 return error::kInvalidArguments;
1378 }
1379 typedef cmds::EnableFeatureCHROMIUM::Result Result;
1380 Result* result = GetSharedMemoryAs<Result*>(
1381 c.result_shm_id, c.result_shm_offset, sizeof(*result));
1382 if (!result) {
1383 return error::kOutOfBounds;
1384 }
1385 // Check that the client initialized the result.
1386 if (*result != 0) {
1387 return error::kInvalidArguments;
1388 }
1389 std::string feature_str;
1390 if (!bucket->GetAsString(&feature_str)) {
1391 return error::kInvalidArguments;
1392 }
1393 error::Error error = DoEnableFeatureCHROMIUM(feature_str.c_str());
1394 if (error != error::kNoError) {
1395 return error;
1396 }
1397
1398 *result = 1; // true.
1399 return error::kNoError;
1400 }
1401 error::Error GLES2DecoderPassthroughImpl::HandleMapBufferRange(
1402 uint32_t immediate_data_size,
1403 const void* cmd_data) {
1404 const gles2::cmds::MapBufferRange& c =
1405 *static_cast<const gles2::cmds::MapBufferRange*>(cmd_data);
1406 GLenum target = static_cast<GLenum>(c.target);
1407 GLbitfield access = static_cast<GLbitfield>(c.access);
1408 GLintptr offset = static_cast<GLintptr>(c.offset);
1409 GLsizeiptr size = static_cast<GLsizeiptr>(c.size);
1410
1411 typedef cmds::MapBufferRange::Result Result;
1412 Result* result = GetSharedMemoryAs<Result*>(
1413 c.result_shm_id, c.result_shm_offset, sizeof(*result));
1414 if (!result) {
1415 return error::kOutOfBounds;
1416 }
1417 if (*result != 0) {
1418 *result = 0;
1419 return error::kInvalidArguments;
1420 }
1421 uint8_t* mem =
1422 GetSharedMemoryAs<uint8_t*>(c.data_shm_id, c.data_shm_offset, size);
1423 if (!mem) {
1424 return error::kOutOfBounds;
1425 }
1426
1427 void* ptr = nullptr;
1428 error::Error error = DoMapBufferRange(target, offset, size, access, &ptr);
1429 if (error != error::kNoError) {
1430 return error;
1431 }
1432
1433 *result = 1;
1434 return error::kNoError;
1435 }
1436
1437 error::Error GLES2DecoderPassthroughImpl::HandleUnmapBuffer(
1438 uint32_t immediate_data_size,
1439 const void* cmd_data) {
1440 const gles2::cmds::UnmapBuffer& c =
1441 *static_cast<const gles2::cmds::UnmapBuffer*>(cmd_data);
1442 GLenum target = static_cast<GLenum>(c.target);
1443 error::Error error = DoUnmapBuffer(target);
1444 if (error != error::kNoError) {
1445 return error;
1446 }
1447 return error::kNoError;
1448 }
1449
1450 error::Error GLES2DecoderPassthroughImpl::HandleResizeCHROMIUM(
1451 uint32_t immediate_data_size,
1452 const void* cmd_data) {
1453 const gles2::cmds::ResizeCHROMIUM& c =
1454 *static_cast<const gles2::cmds::ResizeCHROMIUM*>(cmd_data);
1455 GLuint width = static_cast<GLuint>(c.width);
1456 GLuint height = static_cast<GLuint>(c.height);
1457 GLfloat scale_factor = static_cast<GLfloat>(c.scale_factor);
1458 GLboolean has_alpha = static_cast<GLboolean>(c.alpha);
1459 error::Error error = DoResizeCHROMIUM(width, height, scale_factor, has_alpha);
1460 if (error != error::kNoError) {
1461 return error;
1462 }
1463 return error::kNoError;
1464 }
1465
1466 error::Error
1467 GLES2DecoderPassthroughImpl::HandleGetRequestableExtensionsCHROMIUM(
1468 uint32_t immediate_data_size,
1469 const void* cmd_data) {
1470 const gles2::cmds::GetRequestableExtensionsCHROMIUM& c =
1471 *static_cast<const gles2::cmds::GetRequestableExtensionsCHROMIUM*>(
1472 cmd_data);
1473 const char* str = nullptr;
1474 error::Error error = DoGetRequestableExtensionsCHROMIUM(&str);
1475 if (error != error::kNoError) {
1476 return error;
1477 }
1478 if (!str) {
1479 return error::kOutOfBounds;
1480 }
1481 Bucket* bucket = CreateBucket(c.bucket_id);
1482 bucket->SetFromString(str);
1483
1484 return error::kNoError;
1485 }
1486
1487 error::Error GLES2DecoderPassthroughImpl::HandleRequestExtensionCHROMIUM(
1488 uint32_t immediate_data_size,
1489 const void* cmd_data) {
1490 const gles2::cmds::RequestExtensionCHROMIUM& c =
1491 *static_cast<const gles2::cmds::RequestExtensionCHROMIUM*>(cmd_data);
1492 Bucket* bucket = GetBucket(c.bucket_id);
1493 if (!bucket || bucket->size() == 0) {
1494 return error::kInvalidArguments;
1495 }
1496 std::string feature_str;
1497 if (!bucket->GetAsString(&feature_str)) {
1498 return error::kInvalidArguments;
1499 }
1500 error::Error error = DoRequestExtensionCHROMIUM(feature_str.c_str());
1501 if (error != error::kNoError) {
1502 return error;
1503 }
1504 return error::kNoError;
1505 }
1506
1507 error::Error GLES2DecoderPassthroughImpl::HandleGetProgramInfoCHROMIUM(
1508 uint32_t immediate_data_size,
1509 const void* cmd_data) {
1510 const gles2::cmds::GetProgramInfoCHROMIUM& c =
1511 *static_cast<const gles2::cmds::GetProgramInfoCHROMIUM*>(cmd_data);
1512 GLuint program = static_cast<GLuint>(c.program);
1513
1514 uint32_t bucket_id = c.bucket_id;
1515 Bucket* bucket = CreateBucket(bucket_id);
1516 bucket->SetSize(sizeof(ProgramInfoHeader)); // in case we fail.
1517
1518 std::vector<uint8_t> data;
1519 error::Error error = DoGetProgramInfoCHROMIUM(program, &data);
1520 if (error != error::kNoError) {
1521 return error;
1522 }
1523
1524 bucket->SetSize(data.size());
1525 bucket->SetData(data.data(), 0, data.size());
1526
1527 return error::kNoError;
1528 }
1529
1530 error::Error GLES2DecoderPassthroughImpl::HandleGetUniformBlocksCHROMIUM(
1531 uint32_t immediate_data_size,
1532 const void* cmd_data) {
1533 const gles2::cmds::GetUniformBlocksCHROMIUM& c =
1534 *static_cast<const gles2::cmds::GetUniformBlocksCHROMIUM*>(cmd_data);
1535 GLuint program = static_cast<GLuint>(c.program);
1536
1537 uint32_t bucket_id = c.bucket_id;
1538 Bucket* bucket = CreateBucket(bucket_id);
1539 bucket->SetSize(sizeof(UniformBlocksHeader)); // in case we fail.
1540
1541 std::vector<uint8_t> data;
1542 error::Error error = DoGetUniformBlocksCHROMIUM(program, &data);
1543 if (error != error::kNoError) {
1544 return error;
1545 }
1546
1547 bucket->SetSize(data.size());
1548 bucket->SetData(data.data(), 0, data.size());
1549
1550 return error::kNoError;
1551 }
1552
1553 error::Error
1554 GLES2DecoderPassthroughImpl::HandleGetTransformFeedbackVaryingsCHROMIUM(
1555 uint32_t immediate_data_size,
1556 const void* cmd_data) {
1557 const gles2::cmds::GetTransformFeedbackVaryingsCHROMIUM& c =
1558 *static_cast<const gles2::cmds::GetTransformFeedbackVaryingsCHROMIUM*>(
1559 cmd_data);
1560 GLuint program = static_cast<GLuint>(c.program);
1561
1562 uint32_t bucket_id = c.bucket_id;
1563 Bucket* bucket = CreateBucket(bucket_id);
1564 bucket->SetSize(sizeof(TransformFeedbackVaryingsHeader)); // in case we fail.
1565
1566 std::vector<uint8_t> data;
1567 error::Error error = DoGetTransformFeedbackVaryingsCHROMIUM(program, &data);
1568 if (error != error::kNoError) {
1569 return error;
1570 }
1571
1572 bucket->SetSize(data.size());
1573 bucket->SetData(data.data(), 0, data.size());
1574
1575 return error::kNoError;
1576 }
1577
1578 error::Error GLES2DecoderPassthroughImpl::HandleGetUniformsES3CHROMIUM(
1579 uint32_t immediate_data_size,
1580 const void* cmd_data) {
1581 const gles2::cmds::GetUniformsES3CHROMIUM& c =
1582 *static_cast<const gles2::cmds::GetUniformsES3CHROMIUM*>(cmd_data);
1583 GLuint program = static_cast<GLuint>(c.program);
1584
1585 uint32_t bucket_id = c.bucket_id;
1586 Bucket* bucket = CreateBucket(bucket_id);
1587 bucket->SetSize(sizeof(UniformsES3Header)); // in case we fail.
1588
1589 std::vector<uint8_t> data;
1590 error::Error error = DoGetUniformsES3CHROMIUM(program, &data);
1591 if (error != error::kNoError) {
1592 return error;
1593 }
1594
1595 bucket->SetSize(data.size());
1596 bucket->SetData(data.data(), 0, data.size());
1597
1598 return error::kNoError;
1599 }
1600
1601 error::Error GLES2DecoderPassthroughImpl::HandleGetTranslatedShaderSourceANGLE(
1602 uint32_t immediate_data_size,
1603 const void* cmd_data) {
1604 const gles2::cmds::GetTranslatedShaderSourceANGLE& c =
1605 *static_cast<const gles2::cmds::GetTranslatedShaderSourceANGLE*>(
1606 cmd_data);
1607 GLuint shader = static_cast<GLuint>(c.shader);
1608
1609 std::string source;
1610 error::Error error = DoGetTranslatedShaderSourceANGLE(shader, &source);
1611 if (error != error::kNoError) {
1612 return error;
1613 }
1614
1615 Bucket* bucket = CreateBucket(c.bucket_id);
1616 bucket->SetFromString(source.c_str());
1617
1618 return error::kNoError;
1619 }
1620 error::Error GLES2DecoderPassthroughImpl::HandlePostSubBufferCHROMIUM(
1621 uint32_t immediate_data_size,
1622 const void* cmd_data) {
1623 const gles2::cmds::PostSubBufferCHROMIUM& c =
1624 *static_cast<const gles2::cmds::PostSubBufferCHROMIUM*>(cmd_data);
1625 GLint x = static_cast<GLint>(c.x);
1626 GLint y = static_cast<GLint>(c.y);
1627 GLint width = static_cast<GLint>(c.width);
1628 GLint height = static_cast<GLint>(c.height);
1629 error::Error error = DoPostSubBufferCHROMIUM(x, y, width, height);
1630 if (error != error::kNoError) {
1631 return error;
1632 }
1633 return error::kNoError;
1634 }
1635 error::Error GLES2DecoderPassthroughImpl::HandleDrawArraysInstancedANGLE(
1636 uint32_t immediate_data_size,
1637 const void* cmd_data) {
1638 const gles2::cmds::DrawArraysInstancedANGLE& c =
1639 *static_cast<const gles2::cmds::DrawArraysInstancedANGLE*>(cmd_data);
1640 GLenum mode = static_cast<GLenum>(c.mode);
1641 GLint first = static_cast<GLint>(c.first);
1642 GLsizei count = static_cast<GLsizei>(c.count);
1643 GLsizei primcount = static_cast<GLsizei>(c.primcount);
1644 error::Error error =
1645 DoDrawArraysInstancedANGLE(mode, first, count, primcount);
1646 if (error != error::kNoError) {
1647 return error;
1648 }
1649 return error::kNoError;
1650 }
1651
1652 error::Error GLES2DecoderPassthroughImpl::HandleDrawElementsInstancedANGLE(
1653 uint32_t immediate_data_size,
1654 const void* cmd_data) {
1655 const gles2::cmds::DrawElementsInstancedANGLE& c =
1656 *static_cast<const gles2::cmds::DrawElementsInstancedANGLE*>(cmd_data);
1657 GLenum mode = static_cast<GLenum>(c.mode);
1658 GLsizei count = static_cast<GLsizei>(c.count);
1659 GLenum type = static_cast<GLenum>(c.type);
1660 const GLvoid* indices =
1661 reinterpret_cast<const GLvoid*>(static_cast<uintptr_t>(c.index_offset));
1662 GLsizei primcount = static_cast<GLsizei>(c.primcount);
1663 error::Error error =
1664 DoDrawElementsInstancedANGLE(mode, count, type, indices, primcount);
1665 if (error != error::kNoError) {
1666 return error;
1667 }
1668 return error::kNoError;
1669 }
1670
1671 error::Error GLES2DecoderPassthroughImpl::HandleVertexAttribDivisorANGLE(
1672 uint32_t immediate_data_size,
1673 const void* cmd_data) {
1674 const gles2::cmds::VertexAttribDivisorANGLE& c =
1675 *static_cast<const gles2::cmds::VertexAttribDivisorANGLE*>(cmd_data);
1676 GLuint index = static_cast<GLuint>(c.index);
1677 GLuint divisor = static_cast<GLuint>(c.divisor);
1678 error::Error error = DoVertexAttribDivisorANGLE(index, divisor);
1679 if (error != error::kNoError) {
1680 return error;
1681 }
1682 return error::kNoError;
1683 }
1684
1685 error::Error GLES2DecoderPassthroughImpl::HandleGenMailboxCHROMIUM(
1686 uint32_t immediate_data_size,
1687 const void* cmd_data) {
1688 const gles2::cmds::GenMailboxCHROMIUM& c =
1689 *static_cast<const gles2::cmds::GenMailboxCHROMIUM*>(cmd_data);
1690 (void)c;
1691 return error::kUnknownCommand;
1692 }
1693
1694 error::Error
1695 GLES2DecoderPassthroughImpl::HandleCreateAndConsumeTextureCHROMIUMImmediate(
1696 uint32_t immediate_data_size,
1697 const void* cmd_data) {
1698 const gles2::cmds::CreateAndConsumeTextureCHROMIUMImmediate& c = *static_cast<
1699 const gles2::cmds::CreateAndConsumeTextureCHROMIUMImmediate*>(cmd_data);
1700 GLenum target = static_cast<GLenum>(c.target);
1701 uint32_t data_size;
1702 if (!GLES2Util::ComputeDataSize(1, sizeof(GLbyte), 64, &data_size)) {
1703 return error::kOutOfBounds;
1704 }
1705 if (data_size > immediate_data_size) {
1706 return error::kOutOfBounds;
1707 }
1708 const GLbyte* mailbox =
1709 GetImmediateDataAs<const GLbyte*>(c, data_size, immediate_data_size);
1710 if (mailbox == NULL) {
1711 return error::kOutOfBounds;
1712 }
1713 uint32_t client_id = c.client_id;
1714 error::Error error =
1715 DoCreateAndConsumeTextureCHROMIUM(target, mailbox, client_id);
1716 if (error != error::kNoError) {
1717 return error;
1718 }
1719
1720 return error::kNoError;
1721 }
1722
1723 error::Error
1724 GLES2DecoderPassthroughImpl::HandleBindUniformLocationCHROMIUMBucket(
1725 uint32_t immediate_data_size,
1726 const void* cmd_data) {
1727 const gles2::cmds::BindUniformLocationCHROMIUMBucket& c =
1728 *static_cast<const gles2::cmds::BindUniformLocationCHROMIUMBucket*>(
1729 cmd_data);
1730 GLuint program = static_cast<GLuint>(c.program);
1731 GLint location = static_cast<GLint>(c.location);
1732 Bucket* bucket = GetBucket(c.name_bucket_id);
1733 if (!bucket || bucket->size() == 0) {
1734 return error::kInvalidArguments;
1735 }
1736 std::string name_str;
1737 if (!bucket->GetAsString(&name_str)) {
1738 return error::kInvalidArguments;
1739 }
1740 error::Error error =
1741 DoBindUniformLocationCHROMIUM(program, location, name_str.c_str());
1742 if (error != error::kNoError) {
1743 return error;
1744 }
1745 return error::kNoError;
1746 }
1747
1748 error::Error GLES2DecoderPassthroughImpl::HandleTraceBeginCHROMIUM(
1749 uint32_t immediate_data_size,
1750 const void* cmd_data) {
1751 const gles2::cmds::TraceBeginCHROMIUM& c =
1752 *static_cast<const gles2::cmds::TraceBeginCHROMIUM*>(cmd_data);
1753 Bucket* category_bucket = GetBucket(c.category_bucket_id);
1754 Bucket* name_bucket = GetBucket(c.name_bucket_id);
1755 if (!category_bucket || category_bucket->size() == 0 || !name_bucket ||
1756 name_bucket->size() == 0) {
1757 return error::kInvalidArguments;
1758 }
1759
1760 std::string category_name;
1761 std::string trace_name;
1762 if (!category_bucket->GetAsString(&category_name) ||
1763 !name_bucket->GetAsString(&trace_name)) {
1764 return error::kInvalidArguments;
1765 }
1766
1767 error::Error error =
1768 DoTraceBeginCHROMIUM(category_name.c_str(), trace_name.c_str());
1769 if (error != error::kNoError) {
1770 return error;
1771 }
1772 return error::kNoError;
1773 }
1774
1775 error::Error GLES2DecoderPassthroughImpl::HandleInsertFenceSyncCHROMIUM(
1776 uint32_t immediate_data_size,
1777 const void* cmd_data) {
1778 const gles2::cmds::InsertFenceSyncCHROMIUM& c =
1779 *static_cast<const gles2::cmds::InsertFenceSyncCHROMIUM*>(cmd_data);
1780 GLuint64 release_count = c.release_count();
1781 error::Error error = DoInsertFenceSyncCHROMIUM(release_count);
1782 if (error != error::kNoError) {
1783 return error;
1784 }
1785 return error::kNoError;
1786 }
1787 error::Error GLES2DecoderPassthroughImpl::HandleGenSyncTokenCHROMIUMImmediate(
1788 uint32_t immediate_data_size,
1789 const void* cmd_data) {
1790 const gles2::cmds::GenSyncTokenCHROMIUMImmediate& c =
1791 *static_cast<const gles2::cmds::GenSyncTokenCHROMIUMImmediate*>(cmd_data);
1792 (void)c;
1793 return error::kUnknownCommand;
1794 }
1795
1796 error::Error
1797 GLES2DecoderPassthroughImpl::HandleGenUnverifiedSyncTokenCHROMIUMImmediate(
1798 uint32_t immediate_data_size,
1799 const void* cmd_data) {
1800 const gles2::cmds::GenUnverifiedSyncTokenCHROMIUMImmediate& c =
1801 *static_cast<const gles2::cmds::GenUnverifiedSyncTokenCHROMIUMImmediate*>(
1802 cmd_data);
1803 (void)c;
1804 return error::kUnknownCommand;
1805 }
1806
1807 error::Error
1808 GLES2DecoderPassthroughImpl::HandleVerifySyncTokensCHROMIUMImmediate(
1809 uint32_t immediate_data_size,
1810 const void* cmd_data) {
1811 const gles2::cmds::VerifySyncTokensCHROMIUMImmediate& c =
1812 *static_cast<const gles2::cmds::VerifySyncTokensCHROMIUMImmediate*>(
1813 cmd_data);
1814 (void)c;
1815 return error::kUnknownCommand;
1816 }
1817
1818 error::Error GLES2DecoderPassthroughImpl::HandleWaitSyncTokenCHROMIUM(
1819 uint32_t immediate_data_size,
1820 const void* cmd_data) {
1821 const gles2::cmds::WaitSyncTokenCHROMIUM& c =
1822 *static_cast<const gles2::cmds::WaitSyncTokenCHROMIUM*>(cmd_data);
1823 CommandBufferNamespace namespace_id =
1824 static_cast<gpu::CommandBufferNamespace>(c.namespace_id);
1825 CommandBufferId command_buffer_id =
1826 CommandBufferId::FromUnsafeValue(c.command_buffer_id());
1827 const uint64_t release_count = c.release_count();
1828
1829 const CommandBufferNamespace kMinNamespaceId =
1830 CommandBufferNamespace::INVALID;
1831 const CommandBufferNamespace kMaxNamespaceId =
1832 CommandBufferNamespace::NUM_COMMAND_BUFFER_NAMESPACES;
1833 if ((namespace_id < static_cast<int32_t>(kMinNamespaceId)) ||
1834 (namespace_id >= static_cast<int32_t>(kMaxNamespaceId))) {
1835 namespace_id = gpu::CommandBufferNamespace::INVALID;
1836 }
1837
1838 error::Error error =
1839 DoWaitSyncTokenCHROMIUM(namespace_id, command_buffer_id, release_count);
1840 if (error != error::kNoError) {
1841 return error;
1842 }
1843 return error::kNoError;
1844 }
1845
1846 error::Error GLES2DecoderPassthroughImpl::HandleDiscardBackbufferCHROMIUM(
1847 uint32_t immediate_data_size,
1848 const void* cmd_data) {
1849 const gles2::cmds::DiscardBackbufferCHROMIUM& c =
1850 *static_cast<const gles2::cmds::DiscardBackbufferCHROMIUM*>(cmd_data);
1851 (void)c;
1852 error::Error error = DoDiscardBackbufferCHROMIUM();
1853 if (error != error::kNoError) {
1854 return error;
1855 }
1856 return error::kNoError;
1857 }
1858
1859 error::Error GLES2DecoderPassthroughImpl::HandleScheduleOverlayPlaneCHROMIUM(
1860 uint32_t immediate_data_size,
1861 const void* cmd_data) {
1862 const gles2::cmds::ScheduleOverlayPlaneCHROMIUM& c =
1863 *static_cast<const gles2::cmds::ScheduleOverlayPlaneCHROMIUM*>(cmd_data);
1864 GLint plane_z_order = static_cast<GLint>(c.plane_z_order);
1865 GLenum plane_transform = static_cast<GLenum>(c.plane_transform);
1866 GLuint overlay_texture_id = static_cast<GLuint>(c.overlay_texture_id);
1867 GLint bounds_x = static_cast<GLint>(c.bounds_x);
1868 GLint bounds_y = static_cast<GLint>(c.bounds_y);
1869 GLint bounds_width = static_cast<GLint>(c.bounds_width);
1870 GLint bounds_height = static_cast<GLint>(c.bounds_height);
1871 GLfloat uv_x = static_cast<GLfloat>(c.uv_x);
1872 GLfloat uv_y = static_cast<GLfloat>(c.uv_x);
1873 GLfloat uv_width = static_cast<GLfloat>(c.uv_x);
1874 GLfloat uv_height = static_cast<GLfloat>(c.uv_x);
1875 error::Error error = DoScheduleOverlayPlaneCHROMIUM(
1876 plane_z_order, plane_transform, overlay_texture_id, bounds_x, bounds_y,
1877 bounds_width, bounds_height, uv_x, uv_y, uv_width, uv_height);
1878 if (error != error::kNoError) {
1879 return error;
1880 }
1881 return error::kNoError;
1882 }
1883
1884 error::Error GLES2DecoderPassthroughImpl::HandleScheduleCALayerCHROMIUM(
1885 uint32_t immediate_data_size,
1886 const void* cmd_data) {
1887 const gles2::cmds::ScheduleCALayerCHROMIUM& c =
1888 *static_cast<const gles2::cmds::ScheduleCALayerCHROMIUM*>(cmd_data);
1889 const GLfloat* mem = GetSharedMemoryAs<const GLfloat*>(c.shm_id, c.shm_offset,
1890 28 * sizeof(GLfloat));
1891 if (!mem) {
1892 return error::kOutOfBounds;
1893 }
1894 GLuint contents_texture_id = static_cast<GLint>(c.contents_texture_id);
1895 const GLfloat* contents_rect = mem;
1896 GLfloat opacity = static_cast<GLfloat>(c.opacity);
1897 GLuint background_color = static_cast<GLuint>(c.background_color);
1898 GLuint edge_aa_mask = static_cast<GLuint>(c.edge_aa_mask);
1899 const GLfloat* bounds_rect = mem + 4;
1900 GLboolean is_clipped = static_cast<GLboolean>(c.is_clipped);
1901 const GLfloat* clip_rect = mem + 8;
1902 GLint sorting_context_id = static_cast<GLint>(c.sorting_context_id);
1903 const GLfloat* transform = mem + 12;
1904 error::Error error = DoScheduleCALayerCHROMIUM(
1905 contents_texture_id, contents_rect, opacity, background_color,
1906 edge_aa_mask, bounds_rect, is_clipped, clip_rect, sorting_context_id,
1907 transform);
1908 if (error != error::kNoError) {
1909 return error;
1910 }
1911 return error::kNoError;
1912 }
1913
1914 error::Error GLES2DecoderPassthroughImpl::HandleGenPathsCHROMIUM(
1915 uint32_t immediate_data_size,
1916 const void* cmd_data) {
1917 const gles2::cmds::GenPathsCHROMIUM& c =
1918 *static_cast<const gles2::cmds::GenPathsCHROMIUM*>(cmd_data);
1919 GLuint path = static_cast<GLuint>(c.first_client_id);
1920 GLsizei range = static_cast<GLsizei>(c.range);
1921 error::Error error = DoGenPathsCHROMIUM(path, range);
1922 if (error != error::kNoError) {
1923 return error;
1924 }
1925 return error::kNoError;
1926 }
1927
1928 error::Error GLES2DecoderPassthroughImpl::HandleDeletePathsCHROMIUM(
1929 uint32_t immediate_data_size,
1930 const void* cmd_data) {
1931 const gles2::cmds::DeletePathsCHROMIUM& c =
1932 *static_cast<const gles2::cmds::DeletePathsCHROMIUM*>(cmd_data);
1933 GLuint path = static_cast<GLuint>(c.first_client_id);
1934 GLsizei range = static_cast<GLsizei>(c.range);
1935 error::Error error = DoDeletePathsCHROMIUM(path, range);
1936 if (error != error::kNoError) {
1937 return error;
1938 }
1939 return error::kNoError;
1940 }
1941
1942 error::Error GLES2DecoderPassthroughImpl::HandlePathCommandsCHROMIUM(
1943 uint32_t immediate_data_size,
1944 const void* cmd_data) {
1945 const gles2::cmds::PathCommandsCHROMIUM& c =
1946 *static_cast<const gles2::cmds::PathCommandsCHROMIUM*>(cmd_data);
1947 GLuint path = static_cast<GLuint>(c.path);
1948 GLsizei num_commands = static_cast<GLsizei>(c.numCommands);
1949 const GLubyte* commands = nullptr;
1950 if (num_commands > 0) {
1951 uint32_t commands_shm_id = static_cast<uint32_t>(c.commands_shm_id);
1952 uint32_t commands_shm_offset = static_cast<uint32_t>(c.commands_shm_offset);
1953 if (commands_shm_id != 0 || commands_shm_offset != 0) {
1954 commands = GetSharedMemoryAs<const GLubyte*>(
1955 commands_shm_id, commands_shm_offset, num_commands);
1956 }
1957 if (!commands) {
1958 return error::kOutOfBounds;
1959 }
1960 }
1961 GLsizei num_coords = static_cast<GLsizei>(c.numCoords);
1962 GLenum coord_type = static_cast<GLenum>(c.coordType);
1963 const GLvoid* coords = nullptr;
1964 GLsizei coords_bufsize = 0;
1965 if (num_coords > 0) {
1966 uint32_t coords_shm_id = static_cast<uint32_t>(c.coords_shm_id);
1967 uint32_t coords_shm_offset = static_cast<uint32_t>(c.coords_shm_offset);
1968 if (coords_shm_id != 0 || coords_shm_offset != 0) {
1969 unsigned int memory_size = 0;
1970 coords = GetSharedMemoryAndSizeAs<const GLvoid*>(
1971 coords_shm_id, coords_shm_offset, &memory_size);
1972 coords_bufsize = static_cast<GLsizei>(memory_size);
1973 }
1974
1975 if (!coords) {
1976 return error::kOutOfBounds;
1977 }
1978 }
1979
1980 error::Error error =
1981 DoPathCommandsCHROMIUM(path, num_commands, commands, num_coords,
1982 coord_type, coords, coords_bufsize);
1983 if (error != error::kNoError) {
1984 return error;
1985 }
1986
1987 return error::kNoError;
1988 }
1989
1990 error::Error GLES2DecoderPassthroughImpl::HandlePathParameterfCHROMIUM(
1991 uint32_t immediate_data_size,
1992 const void* cmd_data) {
1993 const gles2::cmds::PathParameterfCHROMIUM& c =
1994 *static_cast<const gles2::cmds::PathParameterfCHROMIUM*>(cmd_data);
1995 GLuint path = static_cast<GLuint>(c.path);
1996 GLenum pname = static_cast<GLenum>(c.pname);
1997 GLfloat value = static_cast<GLfloat>(c.value);
1998 error::Error error = DoPathParameterfCHROMIUM(path, pname, value);
1999 if (error != error::kNoError) {
2000 return error;
2001 }
2002 return error::kNoError;
2003 }
2004
2005 error::Error GLES2DecoderPassthroughImpl::HandlePathParameteriCHROMIUM(
2006 uint32_t immediate_data_size,
2007 const void* cmd_data) {
2008 const gles2::cmds::PathParameteriCHROMIUM& c =
2009 *static_cast<const gles2::cmds::PathParameteriCHROMIUM*>(cmd_data);
2010 GLuint path = static_cast<GLuint>(c.path);
2011 GLenum pname = static_cast<GLenum>(c.pname);
2012 GLint value = static_cast<GLint>(c.value);
2013 error::Error error = DoPathParameteriCHROMIUM(path, pname, value);
2014 if (error != error::kNoError) {
2015 return error;
2016 }
2017 return error::kNoError;
2018 }
2019
2020 error::Error GLES2DecoderPassthroughImpl::HandleStencilFillPathCHROMIUM(
2021 uint32_t immediate_data_size,
2022 const void* cmd_data) {
2023 const gles2::cmds::StencilFillPathCHROMIUM& c =
2024 *static_cast<const gles2::cmds::StencilFillPathCHROMIUM*>(cmd_data);
2025 GLuint path = static_cast<GLuint>(c.path);
2026 GLenum fill_mode = static_cast<GLenum>(c.fillMode);
2027 GLuint mask = static_cast<GLuint>(c.mask);
2028 error::Error error = DoStencilFillPathCHROMIUM(path, fill_mode, mask);
2029 if (error != error::kNoError) {
2030 return error;
2031 }
2032 return error::kNoError;
2033 }
2034
2035 error::Error GLES2DecoderPassthroughImpl::HandleStencilStrokePathCHROMIUM(
2036 uint32_t immediate_data_size,
2037 const void* cmd_data) {
2038 const gles2::cmds::StencilStrokePathCHROMIUM& c =
2039 *static_cast<const gles2::cmds::StencilStrokePathCHROMIUM*>(cmd_data);
2040 GLuint path = static_cast<GLuint>(c.path);
2041 GLint reference = static_cast<GLint>(c.reference);
2042 GLuint mask = static_cast<GLuint>(c.mask);
2043 error::Error error = DoStencilStrokePathCHROMIUM(path, reference, mask);
2044 if (error != error::kNoError) {
2045 return error;
2046 }
2047 return error::kNoError;
2048 }
2049
2050 error::Error GLES2DecoderPassthroughImpl::HandleCoverFillPathCHROMIUM(
2051 uint32_t immediate_data_size,
2052 const void* cmd_data) {
2053 const gles2::cmds::CoverFillPathCHROMIUM& c =
2054 *static_cast<const gles2::cmds::CoverFillPathCHROMIUM*>(cmd_data);
2055 GLuint path = static_cast<GLuint>(c.path);
2056 GLenum cover_mode = static_cast<GLenum>(c.coverMode);
2057 error::Error error = DoCoverFillPathCHROMIUM(path, cover_mode);
2058 if (error != error::kNoError) {
2059 return error;
2060 }
2061 return error::kNoError;
2062 }
2063
2064 error::Error GLES2DecoderPassthroughImpl::HandleCoverStrokePathCHROMIUM(
2065 uint32_t immediate_data_size,
2066 const void* cmd_data) {
2067 const gles2::cmds::CoverStrokePathCHROMIUM& c =
2068 *static_cast<const gles2::cmds::CoverStrokePathCHROMIUM*>(cmd_data);
2069 GLuint path = static_cast<GLuint>(c.path);
2070 GLenum cover_mode = static_cast<GLenum>(c.coverMode);
2071 error::Error error = DoCoverStrokePathCHROMIUM(path, cover_mode);
2072 if (error != error::kNoError) {
2073 return error;
2074 }
2075 return error::kNoError;
2076 }
2077
2078 error::Error
2079 GLES2DecoderPassthroughImpl::HandleStencilThenCoverFillPathCHROMIUM(
2080 uint32_t immediate_data_size,
2081 const void* cmd_data) {
2082 const gles2::cmds::StencilThenCoverFillPathCHROMIUM& c =
2083 *static_cast<const gles2::cmds::StencilThenCoverFillPathCHROMIUM*>(
2084 cmd_data);
2085 GLuint path = static_cast<GLuint>(c.path);
2086 GLenum fill_mode = static_cast<GLenum>(c.fillMode);
2087 GLuint mask = static_cast<GLuint>(c.mask);
2088 GLenum cover_mode = static_cast<GLenum>(c.coverMode);
2089 error::Error error =
2090 DoStencilThenCoverFillPathCHROMIUM(path, fill_mode, mask, cover_mode);
2091 if (error != error::kNoError) {
2092 return error;
2093 }
2094 return error::kNoError;
2095 }
2096
2097 error::Error
2098 GLES2DecoderPassthroughImpl::HandleStencilThenCoverStrokePathCHROMIUM(
2099 uint32_t immediate_data_size,
2100 const void* cmd_data) {
2101 const gles2::cmds::StencilThenCoverStrokePathCHROMIUM& c =
2102 *static_cast<const gles2::cmds::StencilThenCoverStrokePathCHROMIUM*>(
2103 cmd_data);
2104 GLuint path = static_cast<GLuint>(c.path);
2105 GLint reference = static_cast<GLint>(c.reference);
2106 GLuint mask = static_cast<GLuint>(c.mask);
2107 GLenum cover_mode = static_cast<GLenum>(c.coverMode);
2108 error::Error error =
2109 DoStencilThenCoverStrokePathCHROMIUM(path, reference, mask, cover_mode);
2110 if (error != error::kNoError) {
2111 return error;
2112 }
2113 return error::kNoError;
2114 }
2115
2116 error::Error
2117 GLES2DecoderPassthroughImpl::HandleStencilFillPathInstancedCHROMIUM(
2118 uint32_t immediate_data_size,
2119 const void* cmd_data) {
2120 const gles2::cmds::StencilFillPathInstancedCHROMIUM& c =
2121 *static_cast<const gles2::cmds::StencilFillPathInstancedCHROMIUM*>(
2122 cmd_data);
2123 GLsizei num_paths = static_cast<GLsizei>(c.numPaths);
2124 GLenum path_name_type = static_cast<GLuint>(c.pathNameType);
2125 const GLvoid* paths = nullptr;
2126 GLsizei paths_bufsize = 0;
2127 if (num_paths > 0) {
2128 uint32_t paths_shm_id = static_cast<uint32_t>(c.paths_shm_id);
2129 uint32_t paths_shm_offset = static_cast<uint32_t>(c.paths_shm_offset);
2130 if (paths_shm_id != 0 || paths_shm_offset != 0) {
2131 unsigned int memory_size = 0;
2132 paths = GetSharedMemoryAndSizeAs<const GLvoid*>(
2133 paths_shm_id, paths_shm_offset, &memory_size);
2134 paths_bufsize = static_cast<GLsizei>(memory_size);
2135 }
2136
2137 if (!paths) {
2138 return error::kOutOfBounds;
2139 }
2140 }
2141 GLuint path_base = static_cast<GLuint>(c.pathBase);
2142 GLenum fill_mode = static_cast<GLenum>(c.fillMode);
2143 GLuint mask = static_cast<GLuint>(c.mask);
2144 GLenum transform_type = static_cast<GLuint>(c.transformType);
2145 const GLfloat* transform_values = nullptr;
2146 GLsizei transform_values_bufsize = 0;
2147 if (c.transformValues_shm_id != 0 || c.transformValues_shm_offset != 0) {
2148 unsigned int memory_size = 0;
2149 transform_values = GetSharedMemoryAndSizeAs<const GLfloat*>(
2150 c.transformValues_shm_id, c.transformValues_shm_offset, &memory_size);
2151 transform_values_bufsize = static_cast<GLsizei>(memory_size);
2152 }
2153 if (!transform_values) {
2154 return error::kOutOfBounds;
2155 }
2156
2157 error::Error error = DoStencilFillPathInstancedCHROMIUM(
2158 num_paths, path_name_type, paths, paths_bufsize, path_base, fill_mode,
2159 mask, transform_type, transform_values, transform_values_bufsize);
2160 if (error != error::kNoError) {
2161 return error;
2162 }
2163
2164 return error::kNoError;
2165 }
2166
2167 error::Error
2168 GLES2DecoderPassthroughImpl::HandleStencilStrokePathInstancedCHROMIUM(
2169 uint32_t immediate_data_size,
2170 const void* cmd_data) {
2171 const gles2::cmds::StencilStrokePathInstancedCHROMIUM& c =
2172 *static_cast<const gles2::cmds::StencilStrokePathInstancedCHROMIUM*>(
2173 cmd_data);
2174 GLsizei num_paths = static_cast<GLsizei>(c.numPaths);
2175 GLenum path_name_type = static_cast<GLuint>(c.pathNameType);
2176 const GLvoid* paths = nullptr;
2177 GLsizei paths_bufsize = 0;
2178 if (num_paths > 0) {
2179 uint32_t paths_shm_id = static_cast<uint32_t>(c.paths_shm_id);
2180 uint32_t paths_shm_offset = static_cast<uint32_t>(c.paths_shm_offset);
2181 if (paths_shm_id != 0 || paths_shm_offset != 0) {
2182 unsigned int memory_size = 0;
2183 paths = GetSharedMemoryAndSizeAs<const GLvoid*>(
2184 paths_shm_id, paths_shm_offset, &memory_size);
2185 paths_bufsize = static_cast<GLsizei>(memory_size);
2186 }
2187
2188 if (!paths) {
2189 return error::kOutOfBounds;
2190 }
2191 }
2192 GLuint path_base = static_cast<GLuint>(c.pathBase);
2193 GLint reference = static_cast<GLint>(c.reference);
2194 GLuint mask = static_cast<GLuint>(c.mask);
2195 GLenum transform_type = static_cast<GLuint>(c.transformType);
2196 const GLfloat* transform_values = nullptr;
2197 GLsizei transform_values_bufsize = 0;
2198 if (c.transformValues_shm_id != 0 || c.transformValues_shm_offset != 0) {
2199 unsigned int memory_size = 0;
2200 transform_values = GetSharedMemoryAndSizeAs<const GLfloat*>(
2201 c.transformValues_shm_id, c.transformValues_shm_offset, &memory_size);
2202 transform_values_bufsize = static_cast<GLsizei>(memory_size);
2203 }
2204 if (!transform_values) {
2205 return error::kOutOfBounds;
2206 }
2207
2208 error::Error error = DoStencilStrokePathInstancedCHROMIUM(
2209 num_paths, path_name_type, paths, paths_bufsize, path_base, reference,
2210 mask, transform_type, transform_values, transform_values_bufsize);
2211 if (error != error::kNoError) {
2212 return error;
2213 }
2214
2215 return error::kNoError;
2216 }
2217
2218 error::Error GLES2DecoderPassthroughImpl::HandleCoverFillPathInstancedCHROMIUM(
2219 uint32_t immediate_data_size,
2220 const void* cmd_data) {
2221 const gles2::cmds::CoverFillPathInstancedCHROMIUM& c =
2222 *static_cast<const gles2::cmds::CoverFillPathInstancedCHROMIUM*>(
2223 cmd_data);
2224 GLsizei num_paths = static_cast<GLsizei>(c.numPaths);
2225 GLenum path_name_type = static_cast<GLuint>(c.pathNameType);
2226 const GLvoid* paths = nullptr;
2227 GLsizei paths_bufsize = 0;
2228 if (num_paths > 0) {
2229 uint32_t paths_shm_id = static_cast<uint32_t>(c.paths_shm_id);
2230 uint32_t paths_shm_offset = static_cast<uint32_t>(c.paths_shm_offset);
2231 if (paths_shm_id != 0 || paths_shm_offset != 0) {
2232 unsigned int memory_size = 0;
2233 paths = GetSharedMemoryAndSizeAs<const GLvoid*>(
2234 paths_shm_id, paths_shm_offset, &memory_size);
2235 paths_bufsize = static_cast<GLsizei>(memory_size);
2236 }
2237
2238 if (!paths) {
2239 return error::kOutOfBounds;
2240 }
2241 }
2242 GLuint path_base = static_cast<GLuint>(c.pathBase);
2243 GLenum cover_mode = static_cast<GLenum>(c.coverMode);
2244 GLenum transform_type = static_cast<GLuint>(c.transformType);
2245 const GLfloat* transform_values = nullptr;
2246 GLsizei transform_values_bufsize = 0;
2247 if (c.transformValues_shm_id != 0 || c.transformValues_shm_offset != 0) {
2248 unsigned int memory_size = 0;
2249 transform_values = GetSharedMemoryAndSizeAs<const GLfloat*>(
2250 c.transformValues_shm_id, c.transformValues_shm_offset, &memory_size);
2251 transform_values_bufsize = static_cast<GLsizei>(memory_size);
2252 }
2253 if (!transform_values) {
2254 return error::kOutOfBounds;
2255 }
2256
2257 error::Error error = DoCoverFillPathInstancedCHROMIUM(
2258 num_paths, path_name_type, paths, paths_bufsize, path_base, cover_mode,
2259 transform_type, transform_values, transform_values_bufsize);
2260 if (error != error::kNoError) {
2261 return error;
2262 }
2263
2264 return error::kNoError;
2265 }
2266
2267 error::Error
2268 GLES2DecoderPassthroughImpl::HandleCoverStrokePathInstancedCHROMIUM(
2269 uint32_t immediate_data_size,
2270 const void* cmd_data) {
2271 const gles2::cmds::CoverStrokePathInstancedCHROMIUM& c =
2272 *static_cast<const gles2::cmds::CoverStrokePathInstancedCHROMIUM*>(
2273 cmd_data);
2274 GLsizei num_paths = static_cast<GLsizei>(c.numPaths);
2275 GLenum path_name_type = static_cast<GLuint>(c.pathNameType);
2276 const GLvoid* paths = nullptr;
2277 GLsizei paths_bufsize = 0;
2278 if (num_paths > 0) {
2279 uint32_t paths_shm_id = static_cast<uint32_t>(c.paths_shm_id);
2280 uint32_t paths_shm_offset = static_cast<uint32_t>(c.paths_shm_offset);
2281 if (paths_shm_id != 0 || paths_shm_offset != 0) {
2282 unsigned int memory_size = 0;
2283 paths = GetSharedMemoryAndSizeAs<const GLvoid*>(
2284 paths_shm_id, paths_shm_offset, &memory_size);
2285 paths_bufsize = static_cast<GLsizei>(memory_size);
2286 }
2287
2288 if (!paths) {
2289 return error::kOutOfBounds;
2290 }
2291 }
2292 GLuint path_base = static_cast<GLuint>(c.pathBase);
2293 GLenum cover_mode = static_cast<GLenum>(c.coverMode);
2294 GLenum transform_type = static_cast<GLuint>(c.transformType);
2295 const GLfloat* transform_values = nullptr;
2296 GLsizei transform_values_bufsize = 0;
2297 if (c.transformValues_shm_id != 0 || c.transformValues_shm_offset != 0) {
2298 unsigned int memory_size = 0;
2299 transform_values = GetSharedMemoryAndSizeAs<const GLfloat*>(
2300 c.transformValues_shm_id, c.transformValues_shm_offset, &memory_size);
2301 transform_values_bufsize = static_cast<GLsizei>(memory_size);
2302 }
2303 if (!transform_values) {
2304 return error::kOutOfBounds;
2305 }
2306
2307 error::Error error = DoCoverStrokePathInstancedCHROMIUM(
2308 num_paths, path_name_type, paths, paths_bufsize, path_base, cover_mode,
2309 transform_type, transform_values, transform_values_bufsize);
2310 if (error != error::kNoError) {
2311 return error;
2312 }
2313
2314 return error::kNoError;
2315 }
2316
2317 error::Error
2318 GLES2DecoderPassthroughImpl::HandleStencilThenCoverFillPathInstancedCHROMIUM(
2319 uint32_t immediate_data_size,
2320 const void* cmd_data) {
2321 const gles2::cmds::StencilThenCoverFillPathInstancedCHROMIUM& c =
2322 *static_cast<
2323 const gles2::cmds::StencilThenCoverFillPathInstancedCHROMIUM*>(
2324 cmd_data);
2325 GLsizei num_paths = static_cast<GLsizei>(c.numPaths);
2326 GLenum path_name_type = static_cast<GLuint>(c.pathNameType);
2327 const GLvoid* paths = nullptr;
2328 GLsizei paths_bufsize = 0;
2329 if (num_paths > 0) {
2330 uint32_t paths_shm_id = static_cast<uint32_t>(c.paths_shm_id);
2331 uint32_t paths_shm_offset = static_cast<uint32_t>(c.paths_shm_offset);
2332 if (paths_shm_id != 0 || paths_shm_offset != 0) {
2333 unsigned int memory_size = 0;
2334 paths = GetSharedMemoryAndSizeAs<const GLvoid*>(
2335 paths_shm_id, paths_shm_offset, &memory_size);
2336 paths_bufsize = static_cast<GLsizei>(memory_size);
2337 }
2338
2339 if (!paths) {
2340 return error::kOutOfBounds;
2341 }
2342 }
2343 GLuint path_base = static_cast<GLuint>(c.pathBase);
2344 GLenum cover_mode = static_cast<GLenum>(c.coverMode);
2345 GLenum fill_mode = static_cast<GLenum>(c.fillMode);
2346 GLuint mask = static_cast<GLuint>(c.mask);
2347 GLenum transform_type = static_cast<GLuint>(c.transformType);
2348 const GLfloat* transform_values = nullptr;
2349 GLsizei transform_values_bufsize = 0;
2350 if (c.transformValues_shm_id != 0 || c.transformValues_shm_offset != 0) {
2351 unsigned int memory_size = 0;
2352 transform_values = GetSharedMemoryAndSizeAs<const GLfloat*>(
2353 c.transformValues_shm_id, c.transformValues_shm_offset, &memory_size);
2354 transform_values_bufsize = static_cast<GLsizei>(memory_size);
2355 }
2356 if (!transform_values) {
2357 return error::kOutOfBounds;
2358 }
2359
2360 error::Error error = DoStencilThenCoverFillPathInstancedCHROMIUM(
2361 num_paths, path_name_type, paths, paths_bufsize, path_base, cover_mode,
2362 fill_mode, mask, transform_type, transform_values,
2363 transform_values_bufsize);
2364 if (error != error::kNoError) {
2365 return error;
2366 }
2367
2368 return error::kNoError;
2369 }
2370
2371 error::Error
2372 GLES2DecoderPassthroughImpl::HandleStencilThenCoverStrokePathInstancedCHROMIUM(
2373 uint32_t immediate_data_size,
2374 const void* cmd_data) {
2375 const gles2::cmds::StencilThenCoverStrokePathInstancedCHROMIUM& c =
2376 *static_cast<
2377 const gles2::cmds::StencilThenCoverStrokePathInstancedCHROMIUM*>(
2378 cmd_data);
2379 GLsizei num_paths = static_cast<GLsizei>(c.numPaths);
2380 GLenum path_name_type = static_cast<GLuint>(c.pathNameType);
2381 const GLvoid* paths = nullptr;
2382 GLsizei paths_bufsize = 0;
2383 if (num_paths > 0) {
2384 uint32_t paths_shm_id = static_cast<uint32_t>(c.paths_shm_id);
2385 uint32_t paths_shm_offset = static_cast<uint32_t>(c.paths_shm_offset);
2386 if (paths_shm_id != 0 || paths_shm_offset != 0) {
2387 unsigned int memory_size = 0;
2388 paths = GetSharedMemoryAndSizeAs<const GLvoid*>(
2389 paths_shm_id, paths_shm_offset, &memory_size);
2390 paths_bufsize = static_cast<GLsizei>(memory_size);
2391 }
2392
2393 if (!paths) {
2394 return error::kOutOfBounds;
2395 }
2396 }
2397 GLuint path_base = static_cast<GLuint>(c.pathBase);
2398 GLenum cover_mode = static_cast<GLenum>(c.coverMode);
2399 GLint reference = static_cast<GLint>(c.reference);
2400 GLuint mask = static_cast<GLuint>(c.mask);
2401 GLenum transform_type = static_cast<GLuint>(c.transformType);
2402 const GLfloat* transform_values = nullptr;
2403 GLsizei transform_values_bufsize = 0;
2404 if (c.transformValues_shm_id != 0 || c.transformValues_shm_offset != 0) {
2405 unsigned int memory_size = 0;
2406 transform_values = GetSharedMemoryAndSizeAs<const GLfloat*>(
2407 c.transformValues_shm_id, c.transformValues_shm_offset, &memory_size);
2408 transform_values_bufsize = static_cast<GLsizei>(memory_size);
2409 }
2410 if (!transform_values) {
2411 return error::kOutOfBounds;
2412 }
2413
2414 error::Error error = DoStencilThenCoverStrokePathInstancedCHROMIUM(
2415 num_paths, path_name_type, paths, paths_bufsize, path_base, cover_mode,
2416 reference, mask, transform_type, transform_values,
2417 transform_values_bufsize);
2418 if (error != error::kNoError) {
2419 return error;
2420 }
2421
2422 return error::kNoError;
2423 }
2424
2425 error::Error
2426 GLES2DecoderPassthroughImpl::HandleBindFragmentInputLocationCHROMIUMBucket(
2427 uint32_t immediate_data_size,
2428 const void* cmd_data) {
2429 const gles2::cmds::BindFragmentInputLocationCHROMIUMBucket& c =
2430 *static_cast<const gles2::cmds::BindFragmentInputLocationCHROMIUMBucket*>(
2431 cmd_data);
2432 GLuint program = static_cast<GLuint>(c.program);
2433 GLint location = static_cast<GLint>(c.location);
2434 Bucket* bucket = GetBucket(c.name_bucket_id);
2435 if (!bucket || bucket->size() == 0) {
2436 return error::kInvalidArguments;
2437 }
2438 std::string name_str;
2439 if (!bucket->GetAsString(&name_str)) {
2440 return error::kInvalidArguments;
2441 }
2442 error::Error error =
2443 DoBindFragmentInputLocationCHROMIUM(program, location, name_str.c_str());
2444 if (error != error::kNoError) {
2445 return error;
2446 }
2447 return error::kNoError;
2448 }
2449
2450 error::Error
2451 GLES2DecoderPassthroughImpl::HandleProgramPathFragmentInputGenCHROMIUM(
2452 uint32_t immediate_data_size,
2453 const void* cmd_data) {
2454 const gles2::cmds::ProgramPathFragmentInputGenCHROMIUM& c =
2455 *static_cast<const gles2::cmds::ProgramPathFragmentInputGenCHROMIUM*>(
2456 cmd_data);
2457 GLint program = static_cast<GLint>(c.program);
2458 GLint location = static_cast<GLint>(c.location);
2459 GLenum gen_mode = static_cast<GLint>(c.genMode);
2460 GLint components = static_cast<GLint>(c.components);
2461 const GLfloat* coeffs = nullptr;
2462 GLsizei coeffs_bufsize = 0;
2463 if (c.coeffs_shm_id != 0 || c.coeffs_shm_offset != 0) {
2464 unsigned int memory_size = 0;
2465 coeffs = GetSharedMemoryAndSizeAs<const GLfloat*>(
2466 c.coeffs_shm_id, c.coeffs_shm_offset, &memory_size);
2467 coeffs_bufsize = static_cast<GLsizei>(memory_size);
2468 }
2469 if (!coeffs) {
2470 return error::kOutOfBounds;
2471 }
2472 error::Error error = DoProgramPathFragmentInputGenCHROMIUM(
2473 program, location, gen_mode, components, coeffs, coeffs_bufsize);
2474 if (error != error::kNoError) {
2475 return error;
2476 }
2477 return error::kNoError;
2478 }
2479 error::Error
2480 GLES2DecoderPassthroughImpl::HandleBindFragDataLocationIndexedEXTBucket(
2481 uint32_t immediate_data_size,
2482 const void* cmd_data) {
2483 const gles2::cmds::BindFragDataLocationIndexedEXTBucket& c =
2484 *static_cast<const gles2::cmds::BindFragDataLocationIndexedEXTBucket*>(
2485 cmd_data);
2486 GLuint program = static_cast<GLuint>(c.program);
2487 GLuint colorNumber = static_cast<GLuint>(c.colorNumber);
2488 GLuint index = static_cast<GLuint>(c.index);
2489 Bucket* bucket = GetBucket(c.name_bucket_id);
2490 if (!bucket || bucket->size() == 0) {
2491 return error::kInvalidArguments;
2492 }
2493 std::string name_str;
2494 if (!bucket->GetAsString(&name_str)) {
2495 return error::kInvalidArguments;
2496 }
2497 error::Error error = DoBindFragDataLocationIndexedEXT(
2498 program, colorNumber, index, name_str.c_str());
2499 if (error != error::kNoError) {
2500 return error;
2501 }
2502 return error::kNoError;
2503 }
2504 error::Error GLES2DecoderPassthroughImpl::HandleBindFragDataLocationEXTBucket(
2505 uint32_t immediate_data_size,
2506 const void* cmd_data) {
2507 const gles2::cmds::BindFragDataLocationEXTBucket& c =
2508 *static_cast<const gles2::cmds::BindFragDataLocationEXTBucket*>(cmd_data);
2509 GLuint program = static_cast<GLuint>(c.program);
2510 GLuint colorNumber = static_cast<GLuint>(c.colorNumber);
2511 Bucket* bucket = GetBucket(c.name_bucket_id);
2512 if (!bucket || bucket->size() == 0) {
2513 return error::kInvalidArguments;
2514 }
2515 std::string name_str;
2516 if (!bucket->GetAsString(&name_str)) {
2517 return error::kInvalidArguments;
2518 }
2519 error::Error error =
2520 DoBindFragDataLocationEXT(program, colorNumber, name_str.c_str());
2521 if (error != error::kNoError) {
2522 return error;
2523 }
2524 return error::kNoError;
2525 }
2526 error::Error GLES2DecoderPassthroughImpl::HandleGetFragDataIndexEXT(
2527 uint32_t immediate_data_size,
2528 const void* cmd_data) {
2529 const gles2::cmds::GetFragDataIndexEXT& c =
2530 *static_cast<const gles2::cmds::GetFragDataIndexEXT*>(cmd_data);
2531 GLuint program = static_cast<GLuint>(c.program);
2532 Bucket* bucket = GetBucket(c.name_bucket_id);
2533 if (!bucket) {
2534 return error::kInvalidArguments;
2535 }
2536 std::string name_str;
2537 if (!bucket->GetAsString(&name_str)) {
2538 return error::kInvalidArguments;
2539 }
2540 GLint* index = GetSharedMemoryAs<GLint*>(c.index_shm_id, c.index_shm_offset,
2541 sizeof(GLint));
2542 if (!index) {
2543 return error::kOutOfBounds;
2544 }
2545 // Check that the client initialized the result.
2546 if (*index != -1) {
2547 return error::kInvalidArguments;
2548 }
2549 error::Error error = DoGetFragDataIndexEXT(program, name_str.c_str(), index);
2550 if (error != error::kNoError) {
2551 return error;
2552 }
2553 return error::kNoError;
2554 }
2555
2556 #include "gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_auto gen.h"
2557
2558 } // namespace gles2
2559 } // namespace gpu
2560
2561 #endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_PASSTHROUGH_HANDLERS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698