- add sources.
[platform/framework/web/crosswalk.git] / src / gpu / command_buffer / client / gles2_implementation_impl_autogen.h
1 // Copyright (c) 2012 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 // This file is auto-generated from
6 // gpu/command_buffer/build_gles2_cmd_buffer.py
7 // DO NOT EDIT!
8
9 // This file is included by gles2_implementation.cc to define the
10 // GL api functions.
11 #ifndef GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_IMPL_AUTOGEN_H_
12 #define GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_IMPL_AUTOGEN_H_
13
14 void GLES2Implementation::AttachShader(GLuint program, GLuint shader) {
15   GPU_CLIENT_SINGLE_THREAD_CHECK();
16   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glAttachShader(" << program << ", " << shader << ")");  // NOLINT
17   helper_->AttachShader(program, shader);
18   CheckGLError();
19 }
20
21 void GLES2Implementation::BindBuffer(GLenum target, GLuint buffer) {
22   GPU_CLIENT_SINGLE_THREAD_CHECK();
23   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindBuffer(" << GLES2Util::GetStringBufferTarget(target) << ", " << buffer << ")");  // NOLINT
24   if (IsBufferReservedId(buffer)) {
25     SetGLError(GL_INVALID_OPERATION, "BindBuffer", "buffer reserved id");
26     return;
27   }
28   if (BindBufferHelper(target, buffer)) {
29     helper_->BindBuffer(target, buffer);
30   }
31   CheckGLError();
32 }
33
34 void GLES2Implementation::BindFramebuffer(GLenum target, GLuint framebuffer) {
35   GPU_CLIENT_SINGLE_THREAD_CHECK();
36   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindFramebuffer(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << framebuffer << ")");  // NOLINT
37   if (IsFramebufferReservedId(framebuffer)) {
38     SetGLError(
39         GL_INVALID_OPERATION, "BindFramebuffer", "framebuffer reserved id");
40     return;
41   }
42   if (BindFramebufferHelper(target, framebuffer)) {
43     helper_->BindFramebuffer(target, framebuffer);
44   }
45   CheckGLError();
46 }
47
48 void GLES2Implementation::BindRenderbuffer(
49     GLenum target, GLuint renderbuffer) {
50   GPU_CLIENT_SINGLE_THREAD_CHECK();
51   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindRenderbuffer(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << renderbuffer << ")");  // NOLINT
52   if (IsRenderbufferReservedId(renderbuffer)) {
53     SetGLError(
54         GL_INVALID_OPERATION, "BindRenderbuffer", "renderbuffer reserved id");
55     return;
56   }
57   if (BindRenderbufferHelper(target, renderbuffer)) {
58     helper_->BindRenderbuffer(target, renderbuffer);
59   }
60   CheckGLError();
61 }
62
63 void GLES2Implementation::BindTexture(GLenum target, GLuint texture) {
64   GPU_CLIENT_SINGLE_THREAD_CHECK();
65   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindTexture(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << texture << ")");  // NOLINT
66   if (IsTextureReservedId(texture)) {
67     SetGLError(GL_INVALID_OPERATION, "BindTexture", "texture reserved id");
68     return;
69   }
70   if (BindTextureHelper(target, texture)) {
71     helper_->BindTexture(target, texture);
72   }
73   CheckGLError();
74 }
75
76 void GLES2Implementation::BlendColor(
77     GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) {
78   GPU_CLIENT_SINGLE_THREAD_CHECK();
79   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendColor(" << red << ", " << green << ", " << blue << ", " << alpha << ")");  // NOLINT
80   helper_->BlendColor(red, green, blue, alpha);
81   CheckGLError();
82 }
83
84 void GLES2Implementation::BlendEquation(GLenum mode) {
85   GPU_CLIENT_SINGLE_THREAD_CHECK();
86   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendEquation(" << GLES2Util::GetStringEquation(mode) << ")");  // NOLINT
87   helper_->BlendEquation(mode);
88   CheckGLError();
89 }
90
91 void GLES2Implementation::BlendEquationSeparate(
92     GLenum modeRGB, GLenum modeAlpha) {
93   GPU_CLIENT_SINGLE_THREAD_CHECK();
94   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendEquationSeparate(" << GLES2Util::GetStringEquation(modeRGB) << ", " << GLES2Util::GetStringEquation(modeAlpha) << ")");  // NOLINT
95   helper_->BlendEquationSeparate(modeRGB, modeAlpha);
96   CheckGLError();
97 }
98
99 void GLES2Implementation::BlendFunc(GLenum sfactor, GLenum dfactor) {
100   GPU_CLIENT_SINGLE_THREAD_CHECK();
101   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendFunc(" << GLES2Util::GetStringSrcBlendFactor(sfactor) << ", " << GLES2Util::GetStringDstBlendFactor(dfactor) << ")");  // NOLINT
102   helper_->BlendFunc(sfactor, dfactor);
103   CheckGLError();
104 }
105
106 void GLES2Implementation::BlendFuncSeparate(
107     GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) {
108   GPU_CLIENT_SINGLE_THREAD_CHECK();
109   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendFuncSeparate(" << GLES2Util::GetStringSrcBlendFactor(srcRGB) << ", " << GLES2Util::GetStringDstBlendFactor(dstRGB) << ", " << GLES2Util::GetStringSrcBlendFactor(srcAlpha) << ", " << GLES2Util::GetStringDstBlendFactor(dstAlpha) << ")");  // NOLINT
110   helper_->BlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
111   CheckGLError();
112 }
113
114 GLenum GLES2Implementation::CheckFramebufferStatus(GLenum target) {
115   GPU_CLIENT_SINGLE_THREAD_CHECK();
116   TRACE_EVENT0("gpu", "GLES2Implementation::CheckFramebufferStatus");
117   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCheckFramebufferStatus(" << GLES2Util::GetStringFrameBufferTarget(target) << ")");  // NOLINT
118   typedef cmds::CheckFramebufferStatus::Result Result;
119   Result* result = GetResultAs<Result*>();
120   if (!result) {
121     return GL_FRAMEBUFFER_UNSUPPORTED;
122   }
123   *result = 0;
124   helper_->CheckFramebufferStatus(
125       target, GetResultShmId(), GetResultShmOffset());
126   WaitForCmd();
127   GLenum result_value = *result;
128   GPU_CLIENT_LOG("returned " << result_value);
129   CheckGLError();
130   return result_value;
131 }
132
133 void GLES2Implementation::Clear(GLbitfield mask) {
134   GPU_CLIENT_SINGLE_THREAD_CHECK();
135   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glClear(" << mask << ")");
136   helper_->Clear(mask);
137   CheckGLError();
138 }
139
140 void GLES2Implementation::ClearColor(
141     GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) {
142   GPU_CLIENT_SINGLE_THREAD_CHECK();
143   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glClearColor(" << red << ", " << green << ", " << blue << ", " << alpha << ")");  // NOLINT
144   helper_->ClearColor(red, green, blue, alpha);
145   CheckGLError();
146 }
147
148 void GLES2Implementation::ClearDepthf(GLclampf depth) {
149   GPU_CLIENT_SINGLE_THREAD_CHECK();
150   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glClearDepthf(" << depth << ")");
151   helper_->ClearDepthf(depth);
152   CheckGLError();
153 }
154
155 void GLES2Implementation::ClearStencil(GLint s) {
156   GPU_CLIENT_SINGLE_THREAD_CHECK();
157   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glClearStencil(" << s << ")");
158   helper_->ClearStencil(s);
159   CheckGLError();
160 }
161
162 void GLES2Implementation::ColorMask(
163     GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) {
164   GPU_CLIENT_SINGLE_THREAD_CHECK();
165   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glColorMask(" << GLES2Util::GetStringBool(red) << ", " << GLES2Util::GetStringBool(green) << ", " << GLES2Util::GetStringBool(blue) << ", " << GLES2Util::GetStringBool(alpha) << ")");  // NOLINT
166   helper_->ColorMask(red, green, blue, alpha);
167   CheckGLError();
168 }
169
170 void GLES2Implementation::CompileShader(GLuint shader) {
171   GPU_CLIENT_SINGLE_THREAD_CHECK();
172   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCompileShader(" << shader << ")");  // NOLINT
173   helper_->CompileShader(shader);
174   CheckGLError();
175 }
176
177 void GLES2Implementation::CopyTexImage2D(
178     GLenum target, GLint level, GLenum internalformat, GLint x, GLint y,
179     GLsizei width, GLsizei height, GLint border) {
180   GPU_CLIENT_SINGLE_THREAD_CHECK();
181   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopyTexImage2D(" << GLES2Util::GetStringTextureTarget(target) << ", " << level << ", " << GLES2Util::GetStringTextureInternalFormat(internalformat) << ", " << x << ", " << y << ", " << width << ", " << height << ", " << border << ")");  // NOLINT
182   if (width < 0) {
183     SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D", "width < 0");
184     return;
185   }
186   if (height < 0) {
187     SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D", "height < 0");
188     return;
189   }
190   helper_->CopyTexImage2D(
191       target, level, internalformat, x, y, width, height, border);
192   CheckGLError();
193 }
194
195 void GLES2Implementation::CopyTexSubImage2D(
196     GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y,
197     GLsizei width, GLsizei height) {
198   GPU_CLIENT_SINGLE_THREAD_CHECK();
199   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopyTexSubImage2D(" << GLES2Util::GetStringTextureTarget(target) << ", " << level << ", " << xoffset << ", " << yoffset << ", " << x << ", " << y << ", " << width << ", " << height << ")");  // NOLINT
200   if (width < 0) {
201     SetGLError(GL_INVALID_VALUE, "glCopyTexSubImage2D", "width < 0");
202     return;
203   }
204   if (height < 0) {
205     SetGLError(GL_INVALID_VALUE, "glCopyTexSubImage2D", "height < 0");
206     return;
207   }
208   helper_->CopyTexSubImage2D(
209       target, level, xoffset, yoffset, x, y, width, height);
210   CheckGLError();
211 }
212
213 GLuint GLES2Implementation::CreateProgram() {
214   GPU_CLIENT_SINGLE_THREAD_CHECK();
215   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCreateProgram(" << ")");
216   GLuint client_id;
217   GetIdHandler(id_namespaces::kProgramsAndShaders)->
218       MakeIds(this, 0, 1, &client_id);
219   helper_->CreateProgram(client_id);
220   GPU_CLIENT_LOG("returned " << client_id);
221   CheckGLError();
222   return client_id;
223 }
224
225 GLuint GLES2Implementation::CreateShader(GLenum type) {
226   GPU_CLIENT_SINGLE_THREAD_CHECK();
227   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCreateShader(" << GLES2Util::GetStringShaderType(type) << ")");  // NOLINT
228   GLuint client_id;
229   GetIdHandler(id_namespaces::kProgramsAndShaders)->
230       MakeIds(this, 0, 1, &client_id);
231   helper_->CreateShader(type, client_id);
232   GPU_CLIENT_LOG("returned " << client_id);
233   CheckGLError();
234   return client_id;
235 }
236
237 void GLES2Implementation::CullFace(GLenum mode) {
238   GPU_CLIENT_SINGLE_THREAD_CHECK();
239   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCullFace(" << GLES2Util::GetStringFaceType(mode) << ")");  // NOLINT
240   helper_->CullFace(mode);
241   CheckGLError();
242 }
243
244 void GLES2Implementation::DeleteBuffers(GLsizei n, const GLuint* buffers) {
245   GPU_CLIENT_SINGLE_THREAD_CHECK();
246   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteBuffers(" << n << ", " << static_cast<const void*>(buffers) << ")");  // NOLINT
247   GPU_CLIENT_LOG_CODE_BLOCK({
248     for (GLsizei i = 0; i < n; ++i) {
249       GPU_CLIENT_LOG("  " << i << ": " << buffers[i]);
250     }
251   });
252   GPU_CLIENT_DCHECK_CODE_BLOCK({
253     for (GLsizei i = 0; i < n; ++i) {
254       GPU_DCHECK(buffers[i] != 0);
255     }
256   });
257   if (n < 0) {
258     SetGLError(GL_INVALID_VALUE, "glDeleteBuffers", "n < 0");
259     return;
260   }
261   DeleteBuffersHelper(n, buffers);
262   CheckGLError();
263 }
264
265 void GLES2Implementation::DeleteFramebuffers(
266     GLsizei n, const GLuint* framebuffers) {
267   GPU_CLIENT_SINGLE_THREAD_CHECK();
268   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteFramebuffers(" << n << ", " << static_cast<const void*>(framebuffers) << ")");  // NOLINT
269   GPU_CLIENT_LOG_CODE_BLOCK({
270     for (GLsizei i = 0; i < n; ++i) {
271       GPU_CLIENT_LOG("  " << i << ": " << framebuffers[i]);
272     }
273   });
274   GPU_CLIENT_DCHECK_CODE_BLOCK({
275     for (GLsizei i = 0; i < n; ++i) {
276       GPU_DCHECK(framebuffers[i] != 0);
277     }
278   });
279   if (n < 0) {
280     SetGLError(GL_INVALID_VALUE, "glDeleteFramebuffers", "n < 0");
281     return;
282   }
283   DeleteFramebuffersHelper(n, framebuffers);
284   CheckGLError();
285 }
286
287 void GLES2Implementation::DeleteProgram(GLuint program) {
288   GPU_CLIENT_SINGLE_THREAD_CHECK();
289   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteProgram(" << program << ")");  // NOLINT
290   GPU_CLIENT_DCHECK(program != 0);
291   DeleteProgramHelper(program);
292   CheckGLError();
293 }
294
295 void GLES2Implementation::DeleteRenderbuffers(
296     GLsizei n, const GLuint* renderbuffers) {
297   GPU_CLIENT_SINGLE_THREAD_CHECK();
298   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteRenderbuffers(" << n << ", " << static_cast<const void*>(renderbuffers) << ")");  // NOLINT
299   GPU_CLIENT_LOG_CODE_BLOCK({
300     for (GLsizei i = 0; i < n; ++i) {
301       GPU_CLIENT_LOG("  " << i << ": " << renderbuffers[i]);
302     }
303   });
304   GPU_CLIENT_DCHECK_CODE_BLOCK({
305     for (GLsizei i = 0; i < n; ++i) {
306       GPU_DCHECK(renderbuffers[i] != 0);
307     }
308   });
309   if (n < 0) {
310     SetGLError(GL_INVALID_VALUE, "glDeleteRenderbuffers", "n < 0");
311     return;
312   }
313   DeleteRenderbuffersHelper(n, renderbuffers);
314   CheckGLError();
315 }
316
317 void GLES2Implementation::DeleteShader(GLuint shader) {
318   GPU_CLIENT_SINGLE_THREAD_CHECK();
319   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteShader(" << shader << ")");
320   GPU_CLIENT_DCHECK(shader != 0);
321   DeleteShaderHelper(shader);
322   CheckGLError();
323 }
324
325 void GLES2Implementation::DeleteTextures(GLsizei n, const GLuint* textures) {
326   GPU_CLIENT_SINGLE_THREAD_CHECK();
327   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteTextures(" << n << ", " << static_cast<const void*>(textures) << ")");  // NOLINT
328   GPU_CLIENT_LOG_CODE_BLOCK({
329     for (GLsizei i = 0; i < n; ++i) {
330       GPU_CLIENT_LOG("  " << i << ": " << textures[i]);
331     }
332   });
333   GPU_CLIENT_DCHECK_CODE_BLOCK({
334     for (GLsizei i = 0; i < n; ++i) {
335       GPU_DCHECK(textures[i] != 0);
336     }
337   });
338   if (n < 0) {
339     SetGLError(GL_INVALID_VALUE, "glDeleteTextures", "n < 0");
340     return;
341   }
342   DeleteTexturesHelper(n, textures);
343   CheckGLError();
344 }
345
346 void GLES2Implementation::DepthFunc(GLenum func) {
347   GPU_CLIENT_SINGLE_THREAD_CHECK();
348   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDepthFunc(" << GLES2Util::GetStringCmpFunction(func) << ")");  // NOLINT
349   helper_->DepthFunc(func);
350   CheckGLError();
351 }
352
353 void GLES2Implementation::DepthMask(GLboolean flag) {
354   GPU_CLIENT_SINGLE_THREAD_CHECK();
355   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDepthMask(" << GLES2Util::GetStringBool(flag) << ")");  // NOLINT
356   helper_->DepthMask(flag);
357   CheckGLError();
358 }
359
360 void GLES2Implementation::DepthRangef(GLclampf zNear, GLclampf zFar) {
361   GPU_CLIENT_SINGLE_THREAD_CHECK();
362   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDepthRangef(" << zNear << ", " << zFar << ")");  // NOLINT
363   helper_->DepthRangef(zNear, zFar);
364   CheckGLError();
365 }
366
367 void GLES2Implementation::DetachShader(GLuint program, GLuint shader) {
368   GPU_CLIENT_SINGLE_THREAD_CHECK();
369   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDetachShader(" << program << ", " << shader << ")");  // NOLINT
370   helper_->DetachShader(program, shader);
371   CheckGLError();
372 }
373
374 void GLES2Implementation::FramebufferRenderbuffer(
375     GLenum target, GLenum attachment, GLenum renderbuffertarget,
376     GLuint renderbuffer) {
377   GPU_CLIENT_SINGLE_THREAD_CHECK();
378   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFramebufferRenderbuffer(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << GLES2Util::GetStringAttachment(attachment) << ", " << GLES2Util::GetStringRenderBufferTarget(renderbuffertarget) << ", " << renderbuffer << ")");  // NOLINT
379   helper_->FramebufferRenderbuffer(
380       target, attachment, renderbuffertarget, renderbuffer);
381   CheckGLError();
382 }
383
384 void GLES2Implementation::FramebufferTexture2D(
385     GLenum target, GLenum attachment, GLenum textarget, GLuint texture,
386     GLint level) {
387   GPU_CLIENT_SINGLE_THREAD_CHECK();
388   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFramebufferTexture2D(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << GLES2Util::GetStringAttachment(attachment) << ", " << GLES2Util::GetStringTextureTarget(textarget) << ", " << texture << ", " << level << ")");  // NOLINT
389   helper_->FramebufferTexture2D(target, attachment, textarget, texture, level);
390   CheckGLError();
391 }
392
393 void GLES2Implementation::FrontFace(GLenum mode) {
394   GPU_CLIENT_SINGLE_THREAD_CHECK();
395   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFrontFace(" << GLES2Util::GetStringFaceMode(mode) << ")");  // NOLINT
396   helper_->FrontFace(mode);
397   CheckGLError();
398 }
399
400 void GLES2Implementation::GenBuffers(GLsizei n, GLuint* buffers) {
401   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenBuffers(" << n << ", " << static_cast<const void*>(buffers) << ")");  // NOLINT
402   if (n < 0) {
403     SetGLError(GL_INVALID_VALUE, "glGenBuffers", "n < 0");
404     return;
405   }
406   GPU_CLIENT_SINGLE_THREAD_CHECK();
407   GetIdHandler(id_namespaces::kBuffers)->
408       MakeIds(this, 0, n, buffers);
409   GenBuffersHelper(n, buffers);
410   helper_->GenBuffersImmediate(n, buffers);
411   helper_->CommandBufferHelper::Flush();
412   GPU_CLIENT_LOG_CODE_BLOCK({
413     for (GLsizei i = 0; i < n; ++i) {
414       GPU_CLIENT_LOG("  " << i << ": " << buffers[i]);
415     }
416   });
417   CheckGLError();
418 }
419
420 void GLES2Implementation::GenerateMipmap(GLenum target) {
421   GPU_CLIENT_SINGLE_THREAD_CHECK();
422   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenerateMipmap(" << GLES2Util::GetStringTextureBindTarget(target) << ")");  // NOLINT
423   helper_->GenerateMipmap(target);
424   CheckGLError();
425 }
426
427 void GLES2Implementation::GenFramebuffers(GLsizei n, GLuint* framebuffers) {
428   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenFramebuffers(" << n << ", " << static_cast<const void*>(framebuffers) << ")");  // NOLINT
429   if (n < 0) {
430     SetGLError(GL_INVALID_VALUE, "glGenFramebuffers", "n < 0");
431     return;
432   }
433   GPU_CLIENT_SINGLE_THREAD_CHECK();
434   GetIdHandler(id_namespaces::kFramebuffers)->
435       MakeIds(this, 0, n, framebuffers);
436   GenFramebuffersHelper(n, framebuffers);
437   helper_->GenFramebuffersImmediate(n, framebuffers);
438   helper_->CommandBufferHelper::Flush();
439   GPU_CLIENT_LOG_CODE_BLOCK({
440     for (GLsizei i = 0; i < n; ++i) {
441       GPU_CLIENT_LOG("  " << i << ": " << framebuffers[i]);
442     }
443   });
444   CheckGLError();
445 }
446
447 void GLES2Implementation::GenRenderbuffers(GLsizei n, GLuint* renderbuffers) {
448   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenRenderbuffers(" << n << ", " << static_cast<const void*>(renderbuffers) << ")");  // NOLINT
449   if (n < 0) {
450     SetGLError(GL_INVALID_VALUE, "glGenRenderbuffers", "n < 0");
451     return;
452   }
453   GPU_CLIENT_SINGLE_THREAD_CHECK();
454   GetIdHandler(id_namespaces::kRenderbuffers)->
455       MakeIds(this, 0, n, renderbuffers);
456   GenRenderbuffersHelper(n, renderbuffers);
457   helper_->GenRenderbuffersImmediate(n, renderbuffers);
458   helper_->CommandBufferHelper::Flush();
459   GPU_CLIENT_LOG_CODE_BLOCK({
460     for (GLsizei i = 0; i < n; ++i) {
461       GPU_CLIENT_LOG("  " << i << ": " << renderbuffers[i]);
462     }
463   });
464   CheckGLError();
465 }
466
467 void GLES2Implementation::GenTextures(GLsizei n, GLuint* textures) {
468   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenTextures(" << n << ", " << static_cast<const void*>(textures) << ")");  // NOLINT
469   if (n < 0) {
470     SetGLError(GL_INVALID_VALUE, "glGenTextures", "n < 0");
471     return;
472   }
473   GPU_CLIENT_SINGLE_THREAD_CHECK();
474   GetIdHandler(id_namespaces::kTextures)->
475       MakeIds(this, 0, n, textures);
476   GenTexturesHelper(n, textures);
477   helper_->GenTexturesImmediate(n, textures);
478   helper_->CommandBufferHelper::Flush();
479   GPU_CLIENT_LOG_CODE_BLOCK({
480     for (GLsizei i = 0; i < n; ++i) {
481       GPU_CLIENT_LOG("  " << i << ": " << textures[i]);
482     }
483   });
484   CheckGLError();
485 }
486
487 void GLES2Implementation::GetBooleanv(GLenum pname, GLboolean* params) {
488   GPU_CLIENT_SINGLE_THREAD_CHECK();
489   GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLboolean, params);
490   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetBooleanv(" << GLES2Util::GetStringGLState(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
491   TRACE_EVENT0("gpu", "GLES2Implementation::GetBooleanv");
492   if (GetBooleanvHelper(pname, params)) {
493     return;
494   }
495   typedef cmds::GetBooleanv::Result Result;
496   Result* result = GetResultAs<Result*>();
497   if (!result) {
498     return;
499   }
500   result->SetNumResults(0);
501   helper_->GetBooleanv(pname,
502       GetResultShmId(), GetResultShmOffset());
503   WaitForCmd();
504   result->CopyResult(params);
505   GPU_CLIENT_LOG_CODE_BLOCK({
506     for (int32 i = 0; i < result->GetNumResults(); ++i) {
507       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
508     }
509   });
510   CheckGLError();
511 }
512 void GLES2Implementation::GetBufferParameteriv(
513     GLenum target, GLenum pname, GLint* params) {
514   GPU_CLIENT_SINGLE_THREAD_CHECK();
515   GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params);
516   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetBufferParameteriv(" << GLES2Util::GetStringBufferTarget(target) << ", " << GLES2Util::GetStringBufferParameter(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
517   TRACE_EVENT0("gpu", "GLES2Implementation::GetBufferParameteriv");
518   if (GetBufferParameterivHelper(target, pname, params)) {
519     return;
520   }
521   typedef cmds::GetBufferParameteriv::Result Result;
522   Result* result = GetResultAs<Result*>();
523   if (!result) {
524     return;
525   }
526   result->SetNumResults(0);
527   helper_->GetBufferParameteriv(target, pname,
528       GetResultShmId(), GetResultShmOffset());
529   WaitForCmd();
530   result->CopyResult(params);
531   GPU_CLIENT_LOG_CODE_BLOCK({
532     for (int32 i = 0; i < result->GetNumResults(); ++i) {
533       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
534     }
535   });
536   CheckGLError();
537 }
538 void GLES2Implementation::GetFloatv(GLenum pname, GLfloat* params) {
539   GPU_CLIENT_SINGLE_THREAD_CHECK();
540   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetFloatv(" << GLES2Util::GetStringGLState(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
541   TRACE_EVENT0("gpu", "GLES2Implementation::GetFloatv");
542   if (GetFloatvHelper(pname, params)) {
543     return;
544   }
545   typedef cmds::GetFloatv::Result Result;
546   Result* result = GetResultAs<Result*>();
547   if (!result) {
548     return;
549   }
550   result->SetNumResults(0);
551   helper_->GetFloatv(pname,
552       GetResultShmId(), GetResultShmOffset());
553   WaitForCmd();
554   result->CopyResult(params);
555   GPU_CLIENT_LOG_CODE_BLOCK({
556     for (int32 i = 0; i < result->GetNumResults(); ++i) {
557       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
558     }
559   });
560   CheckGLError();
561 }
562 void GLES2Implementation::GetFramebufferAttachmentParameteriv(
563     GLenum target, GLenum attachment, GLenum pname, GLint* params) {
564   GPU_CLIENT_SINGLE_THREAD_CHECK();
565   GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params);
566   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetFramebufferAttachmentParameteriv(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << GLES2Util::GetStringAttachment(attachment) << ", " << GLES2Util::GetStringFrameBufferParameter(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
567   TRACE_EVENT0("gpu", "GLES2Implementation::GetFramebufferAttachmentParameteriv");  // NOLINT
568   if (GetFramebufferAttachmentParameterivHelper(
569       target, attachment, pname, params)) {
570     return;
571   }
572   typedef cmds::GetFramebufferAttachmentParameteriv::Result Result;
573   Result* result = GetResultAs<Result*>();
574   if (!result) {
575     return;
576   }
577   result->SetNumResults(0);
578   helper_->GetFramebufferAttachmentParameteriv(target, attachment, pname,
579       GetResultShmId(), GetResultShmOffset());
580   WaitForCmd();
581   result->CopyResult(params);
582   GPU_CLIENT_LOG_CODE_BLOCK({
583     for (int32 i = 0; i < result->GetNumResults(); ++i) {
584       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
585     }
586   });
587   CheckGLError();
588 }
589 void GLES2Implementation::GetIntegerv(GLenum pname, GLint* params) {
590   GPU_CLIENT_SINGLE_THREAD_CHECK();
591   GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params);
592   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetIntegerv(" << GLES2Util::GetStringGLState(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
593   TRACE_EVENT0("gpu", "GLES2Implementation::GetIntegerv");
594   if (GetIntegervHelper(pname, params)) {
595     return;
596   }
597   typedef cmds::GetIntegerv::Result Result;
598   Result* result = GetResultAs<Result*>();
599   if (!result) {
600     return;
601   }
602   result->SetNumResults(0);
603   helper_->GetIntegerv(pname,
604       GetResultShmId(), GetResultShmOffset());
605   WaitForCmd();
606   result->CopyResult(params);
607   GPU_CLIENT_LOG_CODE_BLOCK({
608     for (int32 i = 0; i < result->GetNumResults(); ++i) {
609       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
610     }
611   });
612   CheckGLError();
613 }
614 void GLES2Implementation::GetProgramiv(
615     GLuint program, GLenum pname, GLint* params) {
616   GPU_CLIENT_SINGLE_THREAD_CHECK();
617   GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params);
618   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetProgramiv(" << program << ", " << GLES2Util::GetStringProgramParameter(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
619   TRACE_EVENT0("gpu", "GLES2Implementation::GetProgramiv");
620   if (GetProgramivHelper(program, pname, params)) {
621     return;
622   }
623   typedef cmds::GetProgramiv::Result Result;
624   Result* result = GetResultAs<Result*>();
625   if (!result) {
626     return;
627   }
628   result->SetNumResults(0);
629   helper_->GetProgramiv(program, pname,
630       GetResultShmId(), GetResultShmOffset());
631   WaitForCmd();
632   result->CopyResult(params);
633   GPU_CLIENT_LOG_CODE_BLOCK({
634     for (int32 i = 0; i < result->GetNumResults(); ++i) {
635       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
636     }
637   });
638   CheckGLError();
639 }
640 void GLES2Implementation::GetProgramInfoLog(
641     GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) {
642   GPU_CLIENT_SINGLE_THREAD_CHECK();
643   GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(GLsizei, length);
644   GPU_CLIENT_LOG("[" << GetLogPrefix()
645       << "] glGetProgramInfoLog" << "("
646       << program << ", "
647       << bufsize << ", "
648       << static_cast<void*>(length) << ", "
649       << static_cast<void*>(infolog) << ")");
650   helper_->SetBucketSize(kResultBucketId, 0);
651   helper_->GetProgramInfoLog(program, kResultBucketId);
652   std::string str;
653   GLsizei max_size = 0;
654   if (GetBucketAsString(kResultBucketId, &str)) {
655     if (bufsize > 0) {
656       max_size =
657           std::min(static_cast<size_t>(bufsize) - 1, str.size());
658       memcpy(infolog, str.c_str(), max_size);
659       infolog[max_size] = '\0';
660       GPU_CLIENT_LOG("------\n" << infolog << "\n------");
661     }
662   }
663   if (length != NULL) {
664     *length = max_size;
665   }
666   CheckGLError();
667 }
668 void GLES2Implementation::GetRenderbufferParameteriv(
669     GLenum target, GLenum pname, GLint* params) {
670   GPU_CLIENT_SINGLE_THREAD_CHECK();
671   GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params);
672   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetRenderbufferParameteriv(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << GLES2Util::GetStringRenderBufferParameter(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
673   TRACE_EVENT0("gpu", "GLES2Implementation::GetRenderbufferParameteriv");
674   if (GetRenderbufferParameterivHelper(target, pname, params)) {
675     return;
676   }
677   typedef cmds::GetRenderbufferParameteriv::Result Result;
678   Result* result = GetResultAs<Result*>();
679   if (!result) {
680     return;
681   }
682   result->SetNumResults(0);
683   helper_->GetRenderbufferParameteriv(target, pname,
684       GetResultShmId(), GetResultShmOffset());
685   WaitForCmd();
686   result->CopyResult(params);
687   GPU_CLIENT_LOG_CODE_BLOCK({
688     for (int32 i = 0; i < result->GetNumResults(); ++i) {
689       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
690     }
691   });
692   CheckGLError();
693 }
694 void GLES2Implementation::GetShaderiv(
695     GLuint shader, GLenum pname, GLint* params) {
696   GPU_CLIENT_SINGLE_THREAD_CHECK();
697   GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params);
698   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetShaderiv(" << shader << ", " << GLES2Util::GetStringShaderParameter(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
699   TRACE_EVENT0("gpu", "GLES2Implementation::GetShaderiv");
700   if (GetShaderivHelper(shader, pname, params)) {
701     return;
702   }
703   typedef cmds::GetShaderiv::Result Result;
704   Result* result = GetResultAs<Result*>();
705   if (!result) {
706     return;
707   }
708   result->SetNumResults(0);
709   helper_->GetShaderiv(shader, pname,
710       GetResultShmId(), GetResultShmOffset());
711   WaitForCmd();
712   result->CopyResult(params);
713   GPU_CLIENT_LOG_CODE_BLOCK({
714     for (int32 i = 0; i < result->GetNumResults(); ++i) {
715       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
716     }
717   });
718   CheckGLError();
719 }
720 void GLES2Implementation::GetShaderInfoLog(
721     GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) {
722   GPU_CLIENT_SINGLE_THREAD_CHECK();
723   GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(GLsizei, length);
724   GPU_CLIENT_LOG("[" << GetLogPrefix()
725       << "] glGetShaderInfoLog" << "("
726       << shader << ", "
727       << bufsize << ", "
728       << static_cast<void*>(length) << ", "
729       << static_cast<void*>(infolog) << ")");
730   helper_->SetBucketSize(kResultBucketId, 0);
731   helper_->GetShaderInfoLog(shader, kResultBucketId);
732   std::string str;
733   GLsizei max_size = 0;
734   if (GetBucketAsString(kResultBucketId, &str)) {
735     if (bufsize > 0) {
736       max_size =
737           std::min(static_cast<size_t>(bufsize) - 1, str.size());
738       memcpy(infolog, str.c_str(), max_size);
739       infolog[max_size] = '\0';
740       GPU_CLIENT_LOG("------\n" << infolog << "\n------");
741     }
742   }
743   if (length != NULL) {
744     *length = max_size;
745   }
746   CheckGLError();
747 }
748 void GLES2Implementation::GetShaderSource(
749     GLuint shader, GLsizei bufsize, GLsizei* length, char* source) {
750   GPU_CLIENT_SINGLE_THREAD_CHECK();
751   GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(GLsizei, length);
752   GPU_CLIENT_LOG("[" << GetLogPrefix()
753       << "] glGetShaderSource" << "("
754       << shader << ", "
755       << bufsize << ", "
756       << static_cast<void*>(length) << ", "
757       << static_cast<void*>(source) << ")");
758   helper_->SetBucketSize(kResultBucketId, 0);
759   helper_->GetShaderSource(shader, kResultBucketId);
760   std::string str;
761   GLsizei max_size = 0;
762   if (GetBucketAsString(kResultBucketId, &str)) {
763     if (bufsize > 0) {
764       max_size =
765           std::min(static_cast<size_t>(bufsize) - 1, str.size());
766       memcpy(source, str.c_str(), max_size);
767       source[max_size] = '\0';
768       GPU_CLIENT_LOG("------\n" << source << "\n------");
769     }
770   }
771   if (length != NULL) {
772     *length = max_size;
773   }
774   CheckGLError();
775 }
776 void GLES2Implementation::GetTexParameterfv(
777     GLenum target, GLenum pname, GLfloat* params) {
778   GPU_CLIENT_SINGLE_THREAD_CHECK();
779   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetTexParameterfv(" << GLES2Util::GetStringGetTexParamTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
780   TRACE_EVENT0("gpu", "GLES2Implementation::GetTexParameterfv");
781   if (GetTexParameterfvHelper(target, pname, params)) {
782     return;
783   }
784   typedef cmds::GetTexParameterfv::Result Result;
785   Result* result = GetResultAs<Result*>();
786   if (!result) {
787     return;
788   }
789   result->SetNumResults(0);
790   helper_->GetTexParameterfv(target, pname,
791       GetResultShmId(), GetResultShmOffset());
792   WaitForCmd();
793   result->CopyResult(params);
794   GPU_CLIENT_LOG_CODE_BLOCK({
795     for (int32 i = 0; i < result->GetNumResults(); ++i) {
796       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
797     }
798   });
799   CheckGLError();
800 }
801 void GLES2Implementation::GetTexParameteriv(
802     GLenum target, GLenum pname, GLint* params) {
803   GPU_CLIENT_SINGLE_THREAD_CHECK();
804   GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params);
805   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetTexParameteriv(" << GLES2Util::GetStringGetTexParamTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
806   TRACE_EVENT0("gpu", "GLES2Implementation::GetTexParameteriv");
807   if (GetTexParameterivHelper(target, pname, params)) {
808     return;
809   }
810   typedef cmds::GetTexParameteriv::Result Result;
811   Result* result = GetResultAs<Result*>();
812   if (!result) {
813     return;
814   }
815   result->SetNumResults(0);
816   helper_->GetTexParameteriv(target, pname,
817       GetResultShmId(), GetResultShmOffset());
818   WaitForCmd();
819   result->CopyResult(params);
820   GPU_CLIENT_LOG_CODE_BLOCK({
821     for (int32 i = 0; i < result->GetNumResults(); ++i) {
822       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
823     }
824   });
825   CheckGLError();
826 }
827 void GLES2Implementation::Hint(GLenum target, GLenum mode) {
828   GPU_CLIENT_SINGLE_THREAD_CHECK();
829   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glHint(" << GLES2Util::GetStringHintTarget(target) << ", " << GLES2Util::GetStringHintMode(mode) << ")");  // NOLINT
830   helper_->Hint(target, mode);
831   CheckGLError();
832 }
833
834 GLboolean GLES2Implementation::IsBuffer(GLuint buffer) {
835   GPU_CLIENT_SINGLE_THREAD_CHECK();
836   TRACE_EVENT0("gpu", "GLES2Implementation::IsBuffer");
837   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsBuffer(" << buffer << ")");
838   typedef cmds::IsBuffer::Result Result;
839   Result* result = GetResultAs<Result*>();
840   if (!result) {
841     return GL_FALSE;
842   }
843   *result = 0;
844   helper_->IsBuffer(buffer, GetResultShmId(), GetResultShmOffset());
845   WaitForCmd();
846   GLboolean result_value = *result;
847   GPU_CLIENT_LOG("returned " << result_value);
848   CheckGLError();
849   return result_value;
850 }
851
852 GLboolean GLES2Implementation::IsFramebuffer(GLuint framebuffer) {
853   GPU_CLIENT_SINGLE_THREAD_CHECK();
854   TRACE_EVENT0("gpu", "GLES2Implementation::IsFramebuffer");
855   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsFramebuffer(" << framebuffer << ")");  // NOLINT
856   typedef cmds::IsFramebuffer::Result Result;
857   Result* result = GetResultAs<Result*>();
858   if (!result) {
859     return GL_FALSE;
860   }
861   *result = 0;
862   helper_->IsFramebuffer(framebuffer, GetResultShmId(), GetResultShmOffset());
863   WaitForCmd();
864   GLboolean result_value = *result;
865   GPU_CLIENT_LOG("returned " << result_value);
866   CheckGLError();
867   return result_value;
868 }
869
870 GLboolean GLES2Implementation::IsProgram(GLuint program) {
871   GPU_CLIENT_SINGLE_THREAD_CHECK();
872   TRACE_EVENT0("gpu", "GLES2Implementation::IsProgram");
873   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsProgram(" << program << ")");
874   typedef cmds::IsProgram::Result Result;
875   Result* result = GetResultAs<Result*>();
876   if (!result) {
877     return GL_FALSE;
878   }
879   *result = 0;
880   helper_->IsProgram(program, GetResultShmId(), GetResultShmOffset());
881   WaitForCmd();
882   GLboolean result_value = *result;
883   GPU_CLIENT_LOG("returned " << result_value);
884   CheckGLError();
885   return result_value;
886 }
887
888 GLboolean GLES2Implementation::IsRenderbuffer(GLuint renderbuffer) {
889   GPU_CLIENT_SINGLE_THREAD_CHECK();
890   TRACE_EVENT0("gpu", "GLES2Implementation::IsRenderbuffer");
891   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsRenderbuffer(" << renderbuffer << ")");  // NOLINT
892   typedef cmds::IsRenderbuffer::Result Result;
893   Result* result = GetResultAs<Result*>();
894   if (!result) {
895     return GL_FALSE;
896   }
897   *result = 0;
898   helper_->IsRenderbuffer(
899       renderbuffer, GetResultShmId(), GetResultShmOffset());
900   WaitForCmd();
901   GLboolean result_value = *result;
902   GPU_CLIENT_LOG("returned " << result_value);
903   CheckGLError();
904   return result_value;
905 }
906
907 GLboolean GLES2Implementation::IsShader(GLuint shader) {
908   GPU_CLIENT_SINGLE_THREAD_CHECK();
909   TRACE_EVENT0("gpu", "GLES2Implementation::IsShader");
910   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsShader(" << shader << ")");
911   typedef cmds::IsShader::Result Result;
912   Result* result = GetResultAs<Result*>();
913   if (!result) {
914     return GL_FALSE;
915   }
916   *result = 0;
917   helper_->IsShader(shader, GetResultShmId(), GetResultShmOffset());
918   WaitForCmd();
919   GLboolean result_value = *result;
920   GPU_CLIENT_LOG("returned " << result_value);
921   CheckGLError();
922   return result_value;
923 }
924
925 GLboolean GLES2Implementation::IsTexture(GLuint texture) {
926   GPU_CLIENT_SINGLE_THREAD_CHECK();
927   TRACE_EVENT0("gpu", "GLES2Implementation::IsTexture");
928   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsTexture(" << texture << ")");
929   typedef cmds::IsTexture::Result Result;
930   Result* result = GetResultAs<Result*>();
931   if (!result) {
932     return GL_FALSE;
933   }
934   *result = 0;
935   helper_->IsTexture(texture, GetResultShmId(), GetResultShmOffset());
936   WaitForCmd();
937   GLboolean result_value = *result;
938   GPU_CLIENT_LOG("returned " << result_value);
939   CheckGLError();
940   return result_value;
941 }
942
943 void GLES2Implementation::LineWidth(GLfloat width) {
944   GPU_CLIENT_SINGLE_THREAD_CHECK();
945   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glLineWidth(" << width << ")");
946   helper_->LineWidth(width);
947   CheckGLError();
948 }
949
950 void GLES2Implementation::PolygonOffset(GLfloat factor, GLfloat units) {
951   GPU_CLIENT_SINGLE_THREAD_CHECK();
952   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glPolygonOffset(" << factor << ", " << units << ")");  // NOLINT
953   helper_->PolygonOffset(factor, units);
954   CheckGLError();
955 }
956
957 void GLES2Implementation::ReleaseShaderCompiler() {
958   GPU_CLIENT_SINGLE_THREAD_CHECK();
959   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glReleaseShaderCompiler(" << ")");
960   helper_->ReleaseShaderCompiler();
961   CheckGLError();
962 }
963
964 void GLES2Implementation::RenderbufferStorage(
965     GLenum target, GLenum internalformat, GLsizei width, GLsizei height) {
966   GPU_CLIENT_SINGLE_THREAD_CHECK();
967   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glRenderbufferStorage(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << GLES2Util::GetStringRenderBufferFormat(internalformat) << ", " << width << ", " << height << ")");  // NOLINT
968   if (width < 0) {
969     SetGLError(GL_INVALID_VALUE, "glRenderbufferStorage", "width < 0");
970     return;
971   }
972   if (height < 0) {
973     SetGLError(GL_INVALID_VALUE, "glRenderbufferStorage", "height < 0");
974     return;
975   }
976   helper_->RenderbufferStorage(target, internalformat, width, height);
977   CheckGLError();
978 }
979
980 void GLES2Implementation::SampleCoverage(GLclampf value, GLboolean invert) {
981   GPU_CLIENT_SINGLE_THREAD_CHECK();
982   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glSampleCoverage(" << value << ", " << GLES2Util::GetStringBool(invert) << ")");  // NOLINT
983   helper_->SampleCoverage(value, invert);
984   CheckGLError();
985 }
986
987 void GLES2Implementation::Scissor(
988     GLint x, GLint y, GLsizei width, GLsizei height) {
989   GPU_CLIENT_SINGLE_THREAD_CHECK();
990   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glScissor(" << x << ", " << y << ", " << width << ", " << height << ")");  // NOLINT
991   if (width < 0) {
992     SetGLError(GL_INVALID_VALUE, "glScissor", "width < 0");
993     return;
994   }
995   if (height < 0) {
996     SetGLError(GL_INVALID_VALUE, "glScissor", "height < 0");
997     return;
998   }
999   helper_->Scissor(x, y, width, height);
1000   CheckGLError();
1001 }
1002
1003 void GLES2Implementation::StencilFunc(GLenum func, GLint ref, GLuint mask) {
1004   GPU_CLIENT_SINGLE_THREAD_CHECK();
1005   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilFunc(" << GLES2Util::GetStringCmpFunction(func) << ", " << ref << ", " << mask << ")");  // NOLINT
1006   helper_->StencilFunc(func, ref, mask);
1007   CheckGLError();
1008 }
1009
1010 void GLES2Implementation::StencilFuncSeparate(
1011     GLenum face, GLenum func, GLint ref, GLuint mask) {
1012   GPU_CLIENT_SINGLE_THREAD_CHECK();
1013   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilFuncSeparate(" << GLES2Util::GetStringFaceType(face) << ", " << GLES2Util::GetStringCmpFunction(func) << ", " << ref << ", " << mask << ")");  // NOLINT
1014   helper_->StencilFuncSeparate(face, func, ref, mask);
1015   CheckGLError();
1016 }
1017
1018 void GLES2Implementation::StencilMask(GLuint mask) {
1019   GPU_CLIENT_SINGLE_THREAD_CHECK();
1020   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilMask(" << mask << ")");
1021   helper_->StencilMask(mask);
1022   CheckGLError();
1023 }
1024
1025 void GLES2Implementation::StencilMaskSeparate(GLenum face, GLuint mask) {
1026   GPU_CLIENT_SINGLE_THREAD_CHECK();
1027   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilMaskSeparate(" << GLES2Util::GetStringFaceType(face) << ", " << mask << ")");  // NOLINT
1028   helper_->StencilMaskSeparate(face, mask);
1029   CheckGLError();
1030 }
1031
1032 void GLES2Implementation::StencilOp(GLenum fail, GLenum zfail, GLenum zpass) {
1033   GPU_CLIENT_SINGLE_THREAD_CHECK();
1034   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilOp(" << GLES2Util::GetStringStencilOp(fail) << ", " << GLES2Util::GetStringStencilOp(zfail) << ", " << GLES2Util::GetStringStencilOp(zpass) << ")");  // NOLINT
1035   helper_->StencilOp(fail, zfail, zpass);
1036   CheckGLError();
1037 }
1038
1039 void GLES2Implementation::StencilOpSeparate(
1040     GLenum face, GLenum fail, GLenum zfail, GLenum zpass) {
1041   GPU_CLIENT_SINGLE_THREAD_CHECK();
1042   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilOpSeparate(" << GLES2Util::GetStringFaceType(face) << ", " << GLES2Util::GetStringStencilOp(fail) << ", " << GLES2Util::GetStringStencilOp(zfail) << ", " << GLES2Util::GetStringStencilOp(zpass) << ")");  // NOLINT
1043   helper_->StencilOpSeparate(face, fail, zfail, zpass);
1044   CheckGLError();
1045 }
1046
1047 void GLES2Implementation::TexParameterf(
1048     GLenum target, GLenum pname, GLfloat param) {
1049   GPU_CLIENT_SINGLE_THREAD_CHECK();
1050   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameterf(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << param << ")");  // NOLINT
1051   helper_->TexParameterf(target, pname, param);
1052   CheckGLError();
1053 }
1054
1055 void GLES2Implementation::TexParameterfv(
1056     GLenum target, GLenum pname, const GLfloat* params) {
1057   GPU_CLIENT_SINGLE_THREAD_CHECK();
1058   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameterfv(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
1059   GPU_CLIENT_LOG("values: " << params[0]);
1060   helper_->TexParameterfvImmediate(target, pname, params);
1061   CheckGLError();
1062 }
1063
1064 void GLES2Implementation::TexParameteri(
1065     GLenum target, GLenum pname, GLint param) {
1066   GPU_CLIENT_SINGLE_THREAD_CHECK();
1067   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameteri(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << param << ")");  // NOLINT
1068   helper_->TexParameteri(target, pname, param);
1069   CheckGLError();
1070 }
1071
1072 void GLES2Implementation::TexParameteriv(
1073     GLenum target, GLenum pname, const GLint* params) {
1074   GPU_CLIENT_SINGLE_THREAD_CHECK();
1075   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameteriv(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
1076   GPU_CLIENT_LOG("values: " << params[0]);
1077   helper_->TexParameterivImmediate(target, pname, params);
1078   CheckGLError();
1079 }
1080
1081 void GLES2Implementation::Uniform1f(GLint location, GLfloat x) {
1082   GPU_CLIENT_SINGLE_THREAD_CHECK();
1083   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1f(" << location << ", " << x << ")");  // NOLINT
1084   helper_->Uniform1f(location, x);
1085   CheckGLError();
1086 }
1087
1088 void GLES2Implementation::Uniform1fv(
1089     GLint location, GLsizei count, const GLfloat* v) {
1090   GPU_CLIENT_SINGLE_THREAD_CHECK();
1091   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1fv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")");  // NOLINT
1092   GPU_CLIENT_LOG_CODE_BLOCK({
1093     for (GLsizei i = 0; i < count; ++i) {
1094        GPU_CLIENT_LOG("  " << i << ": " << v[0 + i * 1]);
1095     }
1096   });
1097   if (count < 0) {
1098     SetGLError(GL_INVALID_VALUE, "glUniform1fv", "count < 0");
1099     return;
1100   }
1101   helper_->Uniform1fvImmediate(location, count, v);
1102   CheckGLError();
1103 }
1104
1105 void GLES2Implementation::Uniform1i(GLint location, GLint x) {
1106   GPU_CLIENT_SINGLE_THREAD_CHECK();
1107   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1i(" << location << ", " << x << ")");  // NOLINT
1108   helper_->Uniform1i(location, x);
1109   CheckGLError();
1110 }
1111
1112 void GLES2Implementation::Uniform1iv(
1113     GLint location, GLsizei count, const GLint* v) {
1114   GPU_CLIENT_SINGLE_THREAD_CHECK();
1115   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1iv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")");  // NOLINT
1116   GPU_CLIENT_LOG_CODE_BLOCK({
1117     for (GLsizei i = 0; i < count; ++i) {
1118        GPU_CLIENT_LOG("  " << i << ": " << v[0 + i * 1]);
1119     }
1120   });
1121   if (count < 0) {
1122     SetGLError(GL_INVALID_VALUE, "glUniform1iv", "count < 0");
1123     return;
1124   }
1125   helper_->Uniform1ivImmediate(location, count, v);
1126   CheckGLError();
1127 }
1128
1129 void GLES2Implementation::Uniform2f(GLint location, GLfloat x, GLfloat y) {
1130   GPU_CLIENT_SINGLE_THREAD_CHECK();
1131   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2f(" << location << ", " << x << ", " << y << ")");  // NOLINT
1132   helper_->Uniform2f(location, x, y);
1133   CheckGLError();
1134 }
1135
1136 void GLES2Implementation::Uniform2fv(
1137     GLint location, GLsizei count, const GLfloat* v) {
1138   GPU_CLIENT_SINGLE_THREAD_CHECK();
1139   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2fv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")");  // NOLINT
1140   GPU_CLIENT_LOG_CODE_BLOCK({
1141     for (GLsizei i = 0; i < count; ++i) {
1142        GPU_CLIENT_LOG("  " << i << ": " << v[0 + i * 2] << ", " << v[1 + i * 2]);  // NOLINT
1143     }
1144   });
1145   if (count < 0) {
1146     SetGLError(GL_INVALID_VALUE, "glUniform2fv", "count < 0");
1147     return;
1148   }
1149   helper_->Uniform2fvImmediate(location, count, v);
1150   CheckGLError();
1151 }
1152
1153 void GLES2Implementation::Uniform2i(GLint location, GLint x, GLint y) {
1154   GPU_CLIENT_SINGLE_THREAD_CHECK();
1155   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2i(" << location << ", " << x << ", " << y << ")");  // NOLINT
1156   helper_->Uniform2i(location, x, y);
1157   CheckGLError();
1158 }
1159
1160 void GLES2Implementation::Uniform2iv(
1161     GLint location, GLsizei count, const GLint* v) {
1162   GPU_CLIENT_SINGLE_THREAD_CHECK();
1163   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2iv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")");  // NOLINT
1164   GPU_CLIENT_LOG_CODE_BLOCK({
1165     for (GLsizei i = 0; i < count; ++i) {
1166        GPU_CLIENT_LOG("  " << i << ": " << v[0 + i * 2] << ", " << v[1 + i * 2]);  // NOLINT
1167     }
1168   });
1169   if (count < 0) {
1170     SetGLError(GL_INVALID_VALUE, "glUniform2iv", "count < 0");
1171     return;
1172   }
1173   helper_->Uniform2ivImmediate(location, count, v);
1174   CheckGLError();
1175 }
1176
1177 void GLES2Implementation::Uniform3f(
1178     GLint location, GLfloat x, GLfloat y, GLfloat z) {
1179   GPU_CLIENT_SINGLE_THREAD_CHECK();
1180   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3f(" << location << ", " << x << ", " << y << ", " << z << ")");  // NOLINT
1181   helper_->Uniform3f(location, x, y, z);
1182   CheckGLError();
1183 }
1184
1185 void GLES2Implementation::Uniform3fv(
1186     GLint location, GLsizei count, const GLfloat* v) {
1187   GPU_CLIENT_SINGLE_THREAD_CHECK();
1188   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3fv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")");  // NOLINT
1189   GPU_CLIENT_LOG_CODE_BLOCK({
1190     for (GLsizei i = 0; i < count; ++i) {
1191        GPU_CLIENT_LOG("  " << i << ": " << v[0 + i * 3] << ", " << v[1 + i * 3] << ", " << v[2 + i * 3]);  // NOLINT
1192     }
1193   });
1194   if (count < 0) {
1195     SetGLError(GL_INVALID_VALUE, "glUniform3fv", "count < 0");
1196     return;
1197   }
1198   helper_->Uniform3fvImmediate(location, count, v);
1199   CheckGLError();
1200 }
1201
1202 void GLES2Implementation::Uniform3i(
1203     GLint location, GLint x, GLint y, GLint z) {
1204   GPU_CLIENT_SINGLE_THREAD_CHECK();
1205   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3i(" << location << ", " << x << ", " << y << ", " << z << ")");  // NOLINT
1206   helper_->Uniform3i(location, x, y, z);
1207   CheckGLError();
1208 }
1209
1210 void GLES2Implementation::Uniform3iv(
1211     GLint location, GLsizei count, const GLint* v) {
1212   GPU_CLIENT_SINGLE_THREAD_CHECK();
1213   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3iv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")");  // NOLINT
1214   GPU_CLIENT_LOG_CODE_BLOCK({
1215     for (GLsizei i = 0; i < count; ++i) {
1216        GPU_CLIENT_LOG("  " << i << ": " << v[0 + i * 3] << ", " << v[1 + i * 3] << ", " << v[2 + i * 3]);  // NOLINT
1217     }
1218   });
1219   if (count < 0) {
1220     SetGLError(GL_INVALID_VALUE, "glUniform3iv", "count < 0");
1221     return;
1222   }
1223   helper_->Uniform3ivImmediate(location, count, v);
1224   CheckGLError();
1225 }
1226
1227 void GLES2Implementation::Uniform4f(
1228     GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {
1229   GPU_CLIENT_SINGLE_THREAD_CHECK();
1230   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4f(" << location << ", " << x << ", " << y << ", " << z << ", " << w << ")");  // NOLINT
1231   helper_->Uniform4f(location, x, y, z, w);
1232   CheckGLError();
1233 }
1234
1235 void GLES2Implementation::Uniform4fv(
1236     GLint location, GLsizei count, const GLfloat* v) {
1237   GPU_CLIENT_SINGLE_THREAD_CHECK();
1238   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4fv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")");  // NOLINT
1239   GPU_CLIENT_LOG_CODE_BLOCK({
1240     for (GLsizei i = 0; i < count; ++i) {
1241        GPU_CLIENT_LOG("  " << i << ": " << v[0 + i * 4] << ", " << v[1 + i * 4] << ", " << v[2 + i * 4] << ", " << v[3 + i * 4]);  // NOLINT
1242     }
1243   });
1244   if (count < 0) {
1245     SetGLError(GL_INVALID_VALUE, "glUniform4fv", "count < 0");
1246     return;
1247   }
1248   helper_->Uniform4fvImmediate(location, count, v);
1249   CheckGLError();
1250 }
1251
1252 void GLES2Implementation::Uniform4i(
1253     GLint location, GLint x, GLint y, GLint z, GLint w) {
1254   GPU_CLIENT_SINGLE_THREAD_CHECK();
1255   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4i(" << location << ", " << x << ", " << y << ", " << z << ", " << w << ")");  // NOLINT
1256   helper_->Uniform4i(location, x, y, z, w);
1257   CheckGLError();
1258 }
1259
1260 void GLES2Implementation::Uniform4iv(
1261     GLint location, GLsizei count, const GLint* v) {
1262   GPU_CLIENT_SINGLE_THREAD_CHECK();
1263   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4iv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")");  // NOLINT
1264   GPU_CLIENT_LOG_CODE_BLOCK({
1265     for (GLsizei i = 0; i < count; ++i) {
1266        GPU_CLIENT_LOG("  " << i << ": " << v[0 + i * 4] << ", " << v[1 + i * 4] << ", " << v[2 + i * 4] << ", " << v[3 + i * 4]);  // NOLINT
1267     }
1268   });
1269   if (count < 0) {
1270     SetGLError(GL_INVALID_VALUE, "glUniform4iv", "count < 0");
1271     return;
1272   }
1273   helper_->Uniform4ivImmediate(location, count, v);
1274   CheckGLError();
1275 }
1276
1277 void GLES2Implementation::UniformMatrix2fv(
1278     GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) {
1279   GPU_CLIENT_SINGLE_THREAD_CHECK();
1280   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix2fv(" << location << ", " << count << ", " << GLES2Util::GetStringBool(transpose) << ", " << static_cast<const void*>(value) << ")");  // NOLINT
1281   GPU_CLIENT_LOG_CODE_BLOCK({
1282     for (GLsizei i = 0; i < count; ++i) {
1283        GPU_CLIENT_LOG("  " << i << ": " << value[0 + i * 4] << ", " << value[1 + i * 4] << ", " << value[2 + i * 4] << ", " << value[3 + i * 4]);  // NOLINT
1284     }
1285   });
1286   if (count < 0) {
1287     SetGLError(GL_INVALID_VALUE, "glUniformMatrix2fv", "count < 0");
1288     return;
1289   }
1290   helper_->UniformMatrix2fvImmediate(location, count, transpose, value);
1291   CheckGLError();
1292 }
1293
1294 void GLES2Implementation::UniformMatrix3fv(
1295     GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) {
1296   GPU_CLIENT_SINGLE_THREAD_CHECK();
1297   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix3fv(" << location << ", " << count << ", " << GLES2Util::GetStringBool(transpose) << ", " << static_cast<const void*>(value) << ")");  // NOLINT
1298   GPU_CLIENT_LOG_CODE_BLOCK({
1299     for (GLsizei i = 0; i < count; ++i) {
1300        GPU_CLIENT_LOG("  " << i << ": " << value[0 + i * 9] << ", " << value[1 + i * 9] << ", " << value[2 + i * 9] << ", " << value[3 + i * 9] << ", " << value[4 + i * 9] << ", " << value[5 + i * 9] << ", " << value[6 + i * 9] << ", " << value[7 + i * 9] << ", " << value[8 + i * 9]);  // NOLINT
1301     }
1302   });
1303   if (count < 0) {
1304     SetGLError(GL_INVALID_VALUE, "glUniformMatrix3fv", "count < 0");
1305     return;
1306   }
1307   helper_->UniformMatrix3fvImmediate(location, count, transpose, value);
1308   CheckGLError();
1309 }
1310
1311 void GLES2Implementation::UniformMatrix4fv(
1312     GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) {
1313   GPU_CLIENT_SINGLE_THREAD_CHECK();
1314   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix4fv(" << location << ", " << count << ", " << GLES2Util::GetStringBool(transpose) << ", " << static_cast<const void*>(value) << ")");  // NOLINT
1315   GPU_CLIENT_LOG_CODE_BLOCK({
1316     for (GLsizei i = 0; i < count; ++i) {
1317        GPU_CLIENT_LOG("  " << i << ": " << value[0 + i * 16] << ", " << value[1 + i * 16] << ", " << value[2 + i * 16] << ", " << value[3 + i * 16] << ", " << value[4 + i * 16] << ", " << value[5 + i * 16] << ", " << value[6 + i * 16] << ", " << value[7 + i * 16] << ", " << value[8 + i * 16] << ", " << value[9 + i * 16] << ", " << value[10 + i * 16] << ", " << value[11 + i * 16] << ", " << value[12 + i * 16] << ", " << value[13 + i * 16] << ", " << value[14 + i * 16] << ", " << value[15 + i * 16]);  // NOLINT
1318     }
1319   });
1320   if (count < 0) {
1321     SetGLError(GL_INVALID_VALUE, "glUniformMatrix4fv", "count < 0");
1322     return;
1323   }
1324   helper_->UniformMatrix4fvImmediate(location, count, transpose, value);
1325   CheckGLError();
1326 }
1327
1328 void GLES2Implementation::ValidateProgram(GLuint program) {
1329   GPU_CLIENT_SINGLE_THREAD_CHECK();
1330   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glValidateProgram(" << program << ")");  // NOLINT
1331   helper_->ValidateProgram(program);
1332   CheckGLError();
1333 }
1334
1335 void GLES2Implementation::VertexAttrib1f(GLuint indx, GLfloat x) {
1336   GPU_CLIENT_SINGLE_THREAD_CHECK();
1337   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib1f(" << indx << ", " << x << ")");  // NOLINT
1338   helper_->VertexAttrib1f(indx, x);
1339   CheckGLError();
1340 }
1341
1342 void GLES2Implementation::VertexAttrib1fv(GLuint indx, const GLfloat* values) {
1343   GPU_CLIENT_SINGLE_THREAD_CHECK();
1344   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib1fv(" << indx << ", " << static_cast<const void*>(values) << ")");  // NOLINT
1345   GPU_CLIENT_LOG("values: " << values[0]);
1346   helper_->VertexAttrib1fvImmediate(indx, values);
1347   CheckGLError();
1348 }
1349
1350 void GLES2Implementation::VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) {
1351   GPU_CLIENT_SINGLE_THREAD_CHECK();
1352   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib2f(" << indx << ", " << x << ", " << y << ")");  // NOLINT
1353   helper_->VertexAttrib2f(indx, x, y);
1354   CheckGLError();
1355 }
1356
1357 void GLES2Implementation::VertexAttrib2fv(GLuint indx, const GLfloat* values) {
1358   GPU_CLIENT_SINGLE_THREAD_CHECK();
1359   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib2fv(" << indx << ", " << static_cast<const void*>(values) << ")");  // NOLINT
1360   GPU_CLIENT_LOG("values: " << values[0] << ", " << values[1]);
1361   helper_->VertexAttrib2fvImmediate(indx, values);
1362   CheckGLError();
1363 }
1364
1365 void GLES2Implementation::VertexAttrib3f(
1366     GLuint indx, GLfloat x, GLfloat y, GLfloat z) {
1367   GPU_CLIENT_SINGLE_THREAD_CHECK();
1368   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib3f(" << indx << ", " << x << ", " << y << ", " << z << ")");  // NOLINT
1369   helper_->VertexAttrib3f(indx, x, y, z);
1370   CheckGLError();
1371 }
1372
1373 void GLES2Implementation::VertexAttrib3fv(GLuint indx, const GLfloat* values) {
1374   GPU_CLIENT_SINGLE_THREAD_CHECK();
1375   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib3fv(" << indx << ", " << static_cast<const void*>(values) << ")");  // NOLINT
1376   GPU_CLIENT_LOG("values: " << values[0] << ", " << values[1] << ", " << values[2]);  // NOLINT
1377   helper_->VertexAttrib3fvImmediate(indx, values);
1378   CheckGLError();
1379 }
1380
1381 void GLES2Implementation::VertexAttrib4f(
1382     GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {
1383   GPU_CLIENT_SINGLE_THREAD_CHECK();
1384   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib4f(" << indx << ", " << x << ", " << y << ", " << z << ", " << w << ")");  // NOLINT
1385   helper_->VertexAttrib4f(indx, x, y, z, w);
1386   CheckGLError();
1387 }
1388
1389 void GLES2Implementation::VertexAttrib4fv(GLuint indx, const GLfloat* values) {
1390   GPU_CLIENT_SINGLE_THREAD_CHECK();
1391   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib4fv(" << indx << ", " << static_cast<const void*>(values) << ")");  // NOLINT
1392   GPU_CLIENT_LOG("values: " << values[0] << ", " << values[1] << ", " << values[2] << ", " << values[3]);  // NOLINT
1393   helper_->VertexAttrib4fvImmediate(indx, values);
1394   CheckGLError();
1395 }
1396
1397 void GLES2Implementation::Viewport(
1398     GLint x, GLint y, GLsizei width, GLsizei height) {
1399   GPU_CLIENT_SINGLE_THREAD_CHECK();
1400   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glViewport(" << x << ", " << y << ", " << width << ", " << height << ")");  // NOLINT
1401   if (width < 0) {
1402     SetGLError(GL_INVALID_VALUE, "glViewport", "width < 0");
1403     return;
1404   }
1405   if (height < 0) {
1406     SetGLError(GL_INVALID_VALUE, "glViewport", "height < 0");
1407     return;
1408   }
1409   helper_->Viewport(x, y, width, height);
1410   CheckGLError();
1411 }
1412
1413 void GLES2Implementation::BlitFramebufferEXT(
1414     GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0,
1415     GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) {
1416   GPU_CLIENT_SINGLE_THREAD_CHECK();
1417   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlitFramebufferEXT(" << srcX0 << ", " << srcY0 << ", " << srcX1 << ", " << srcY1 << ", " << dstX0 << ", " << dstY0 << ", " << dstX1 << ", " << dstY1 << ", " << mask << ", " << GLES2Util::GetStringBlitFilter(filter) << ")");  // NOLINT
1418   helper_->BlitFramebufferEXT(
1419       srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
1420   CheckGLError();
1421 }
1422
1423 void GLES2Implementation::RenderbufferStorageMultisampleEXT(
1424     GLenum target, GLsizei samples, GLenum internalformat, GLsizei width,
1425     GLsizei height) {
1426   GPU_CLIENT_SINGLE_THREAD_CHECK();
1427   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glRenderbufferStorageMultisampleEXT(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << samples << ", " << GLES2Util::GetStringRenderBufferFormat(internalformat) << ", " << width << ", " << height << ")");  // NOLINT
1428   if (samples < 0) {
1429     SetGLError(
1430         GL_INVALID_VALUE, "glRenderbufferStorageMultisampleEXT", "samples < 0");
1431     return;
1432   }
1433   if (width < 0) {
1434     SetGLError(
1435         GL_INVALID_VALUE, "glRenderbufferStorageMultisampleEXT", "width < 0");
1436     return;
1437   }
1438   if (height < 0) {
1439     SetGLError(
1440         GL_INVALID_VALUE, "glRenderbufferStorageMultisampleEXT", "height < 0");
1441     return;
1442   }
1443   helper_->RenderbufferStorageMultisampleEXT(
1444       target, samples, internalformat, width, height);
1445   CheckGLError();
1446 }
1447
1448 void GLES2Implementation::FramebufferTexture2DMultisampleEXT(
1449     GLenum target, GLenum attachment, GLenum textarget, GLuint texture,
1450     GLint level, GLsizei samples) {
1451   GPU_CLIENT_SINGLE_THREAD_CHECK();
1452   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFramebufferTexture2DMultisampleEXT(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << GLES2Util::GetStringAttachment(attachment) << ", " << GLES2Util::GetStringTextureTarget(textarget) << ", " << texture << ", " << level << ", " << samples << ")");  // NOLINT
1453   if (samples < 0) {
1454     SetGLError(
1455         GL_INVALID_VALUE, "glFramebufferTexture2DMultisampleEXT", "samples < 0");  // NOLINT
1456     return;
1457   }
1458   helper_->FramebufferTexture2DMultisampleEXT(
1459       target, attachment, textarget, texture, level, samples);
1460   CheckGLError();
1461 }
1462
1463 void GLES2Implementation::TexStorage2DEXT(
1464     GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width,
1465     GLsizei height) {
1466   GPU_CLIENT_SINGLE_THREAD_CHECK();
1467   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexStorage2DEXT(" << GLES2Util::GetStringTextureTarget(target) << ", " << levels << ", " << GLES2Util::GetStringTextureInternalFormatStorage(internalFormat) << ", " << width << ", " << height << ")");  // NOLINT
1468   if (levels < 0) {
1469     SetGLError(GL_INVALID_VALUE, "glTexStorage2DEXT", "levels < 0");
1470     return;
1471   }
1472   if (width < 0) {
1473     SetGLError(GL_INVALID_VALUE, "glTexStorage2DEXT", "width < 0");
1474     return;
1475   }
1476   if (height < 0) {
1477     SetGLError(GL_INVALID_VALUE, "glTexStorage2DEXT", "height < 0");
1478     return;
1479   }
1480   helper_->TexStorage2DEXT(target, levels, internalFormat, width, height);
1481   CheckGLError();
1482 }
1483
1484 void GLES2Implementation::GenQueriesEXT(GLsizei n, GLuint* queries) {
1485   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenQueriesEXT(" << n << ", " << static_cast<const void*>(queries) << ")");  // NOLINT
1486   if (n < 0) {
1487     SetGLError(GL_INVALID_VALUE, "glGenQueriesEXT", "n < 0");
1488     return;
1489   }
1490   GPU_CLIENT_SINGLE_THREAD_CHECK();
1491   GetIdHandler(id_namespaces::kQueries)->
1492       MakeIds(this, 0, n, queries);
1493   GenQueriesEXTHelper(n, queries);
1494   helper_->GenQueriesEXTImmediate(n, queries);
1495   helper_->CommandBufferHelper::Flush();
1496   GPU_CLIENT_LOG_CODE_BLOCK({
1497     for (GLsizei i = 0; i < n; ++i) {
1498       GPU_CLIENT_LOG("  " << i << ": " << queries[i]);
1499     }
1500   });
1501   CheckGLError();
1502 }
1503
1504 void GLES2Implementation::DeleteQueriesEXT(GLsizei n, const GLuint* queries) {
1505   GPU_CLIENT_SINGLE_THREAD_CHECK();
1506   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteQueriesEXT(" << n << ", " << static_cast<const void*>(queries) << ")");  // NOLINT
1507   GPU_CLIENT_LOG_CODE_BLOCK({
1508     for (GLsizei i = 0; i < n; ++i) {
1509       GPU_CLIENT_LOG("  " << i << ": " << queries[i]);
1510     }
1511   });
1512   GPU_CLIENT_DCHECK_CODE_BLOCK({
1513     for (GLsizei i = 0; i < n; ++i) {
1514       GPU_DCHECK(queries[i] != 0);
1515     }
1516   });
1517   if (n < 0) {
1518     SetGLError(GL_INVALID_VALUE, "glDeleteQueriesEXT", "n < 0");
1519     return;
1520   }
1521   DeleteQueriesEXTHelper(n, queries);
1522   CheckGLError();
1523 }
1524
1525 void GLES2Implementation::GenVertexArraysOES(GLsizei n, GLuint* arrays) {
1526   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenVertexArraysOES(" << n << ", " << static_cast<const void*>(arrays) << ")");  // NOLINT
1527   if (n < 0) {
1528     SetGLError(GL_INVALID_VALUE, "glGenVertexArraysOES", "n < 0");
1529     return;
1530   }
1531   GPU_CLIENT_SINGLE_THREAD_CHECK();
1532   GetIdHandler(id_namespaces::kVertexArrays)->
1533       MakeIds(this, 0, n, arrays);
1534   GenVertexArraysOESHelper(n, arrays);
1535   helper_->GenVertexArraysOESImmediate(n, arrays);
1536   helper_->CommandBufferHelper::Flush();
1537   GPU_CLIENT_LOG_CODE_BLOCK({
1538     for (GLsizei i = 0; i < n; ++i) {
1539       GPU_CLIENT_LOG("  " << i << ": " << arrays[i]);
1540     }
1541   });
1542   CheckGLError();
1543 }
1544
1545 void GLES2Implementation::DeleteVertexArraysOES(
1546     GLsizei n, const GLuint* arrays) {
1547   GPU_CLIENT_SINGLE_THREAD_CHECK();
1548   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteVertexArraysOES(" << n << ", " << static_cast<const void*>(arrays) << ")");  // NOLINT
1549   GPU_CLIENT_LOG_CODE_BLOCK({
1550     for (GLsizei i = 0; i < n; ++i) {
1551       GPU_CLIENT_LOG("  " << i << ": " << arrays[i]);
1552     }
1553   });
1554   GPU_CLIENT_DCHECK_CODE_BLOCK({
1555     for (GLsizei i = 0; i < n; ++i) {
1556       GPU_DCHECK(arrays[i] != 0);
1557     }
1558   });
1559   if (n < 0) {
1560     SetGLError(GL_INVALID_VALUE, "glDeleteVertexArraysOES", "n < 0");
1561     return;
1562   }
1563   DeleteVertexArraysOESHelper(n, arrays);
1564   CheckGLError();
1565 }
1566
1567 GLboolean GLES2Implementation::IsVertexArrayOES(GLuint array) {
1568   GPU_CLIENT_SINGLE_THREAD_CHECK();
1569   TRACE_EVENT0("gpu", "GLES2Implementation::IsVertexArrayOES");
1570   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsVertexArrayOES(" << array << ")");  // NOLINT
1571   typedef cmds::IsVertexArrayOES::Result Result;
1572   Result* result = GetResultAs<Result*>();
1573   if (!result) {
1574     return GL_FALSE;
1575   }
1576   *result = 0;
1577   helper_->IsVertexArrayOES(array, GetResultShmId(), GetResultShmOffset());
1578   WaitForCmd();
1579   GLboolean result_value = *result;
1580   GPU_CLIENT_LOG("returned " << result_value);
1581   CheckGLError();
1582   return result_value;
1583 }
1584
1585 void GLES2Implementation::BindVertexArrayOES(GLuint array) {
1586   GPU_CLIENT_SINGLE_THREAD_CHECK();
1587   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindVertexArrayOES(" << array << ")");  // NOLINT
1588   if (IsVertexArrayReservedId(array)) {
1589     SetGLError(
1590         GL_INVALID_OPERATION, "BindVertexArrayOES", "array reserved id");
1591     return;
1592   }
1593   if (BindVertexArrayHelper(array)) {
1594     helper_->BindVertexArrayOES(array);
1595   }
1596   CheckGLError();
1597 }
1598
1599 void GLES2Implementation::GetTranslatedShaderSourceANGLE(
1600     GLuint shader, GLsizei bufsize, GLsizei* length, char* source) {
1601   GPU_CLIENT_SINGLE_THREAD_CHECK();
1602   GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(GLsizei, length);
1603   GPU_CLIENT_LOG("[" << GetLogPrefix()
1604       << "] glGetTranslatedShaderSourceANGLE" << "("
1605       << shader << ", "
1606       << bufsize << ", "
1607       << static_cast<void*>(length) << ", "
1608       << static_cast<void*>(source) << ")");
1609   helper_->SetBucketSize(kResultBucketId, 0);
1610   helper_->GetTranslatedShaderSourceANGLE(shader, kResultBucketId);
1611   std::string str;
1612   GLsizei max_size = 0;
1613   if (GetBucketAsString(kResultBucketId, &str)) {
1614     if (bufsize > 0) {
1615       max_size =
1616           std::min(static_cast<size_t>(bufsize) - 1, str.size());
1617       memcpy(source, str.c_str(), max_size);
1618       source[max_size] = '\0';
1619       GPU_CLIENT_LOG("------\n" << source << "\n------");
1620     }
1621   }
1622   if (length != NULL) {
1623     *length = max_size;
1624   }
1625   CheckGLError();
1626 }
1627 void GLES2Implementation::TexImageIOSurface2DCHROMIUM(
1628     GLenum target, GLsizei width, GLsizei height, GLuint ioSurfaceId,
1629     GLuint plane) {
1630   GPU_CLIENT_SINGLE_THREAD_CHECK();
1631   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexImageIOSurface2DCHROMIUM(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << width << ", " << height << ", " << ioSurfaceId << ", " << plane << ")");  // NOLINT
1632   if (width < 0) {
1633     SetGLError(GL_INVALID_VALUE, "glTexImageIOSurface2DCHROMIUM", "width < 0");
1634     return;
1635   }
1636   if (height < 0) {
1637     SetGLError(
1638         GL_INVALID_VALUE, "glTexImageIOSurface2DCHROMIUM", "height < 0");
1639     return;
1640   }
1641   helper_->TexImageIOSurface2DCHROMIUM(
1642       target, width, height, ioSurfaceId, plane);
1643   CheckGLError();
1644 }
1645
1646 void GLES2Implementation::CopyTextureCHROMIUM(
1647     GLenum target, GLenum source_id, GLenum dest_id, GLint level,
1648     GLint internalformat, GLenum dest_type) {
1649   GPU_CLIENT_SINGLE_THREAD_CHECK();
1650   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopyTextureCHROMIUM(" << GLES2Util::GetStringEnum(target) << ", " << GLES2Util::GetStringEnum(source_id) << ", " << GLES2Util::GetStringEnum(dest_id) << ", " << level << ", " << internalformat << ", " << GLES2Util::GetStringPixelType(dest_type) << ")");  // NOLINT
1651   helper_->CopyTextureCHROMIUM(
1652       target, source_id, dest_id, level, internalformat, dest_type);
1653   CheckGLError();
1654 }
1655
1656 void GLES2Implementation::ProduceTextureCHROMIUM(
1657     GLenum target, const GLbyte* mailbox) {
1658   GPU_CLIENT_SINGLE_THREAD_CHECK();
1659   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glProduceTextureCHROMIUM(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << static_cast<const void*>(mailbox) << ")");  // NOLINT
1660   GPU_CLIENT_LOG("values: " << mailbox[0] << ", " << mailbox[1] << ", " << mailbox[2] << ", " << mailbox[3] << ", " << mailbox[4] << ", " << mailbox[5] << ", " << mailbox[6] << ", " << mailbox[7] << ", " << mailbox[8] << ", " << mailbox[9] << ", " << mailbox[10] << ", " << mailbox[11] << ", " << mailbox[12] << ", " << mailbox[13] << ", " << mailbox[14] << ", " << mailbox[15] << ", " << mailbox[16] << ", " << mailbox[17] << ", " << mailbox[18] << ", " << mailbox[19] << ", " << mailbox[20] << ", " << mailbox[21] << ", " << mailbox[22] << ", " << mailbox[23] << ", " << mailbox[24] << ", " << mailbox[25] << ", " << mailbox[26] << ", " << mailbox[27] << ", " << mailbox[28] << ", " << mailbox[29] << ", " << mailbox[30] << ", " << mailbox[31] << ", " << mailbox[32] << ", " << mailbox[33] << ", " << mailbox[34] << ", " << mailbox[35] << ", " << mailbox[36] << ", " << mailbox[37] << ", " << mailbox[38] << ", " << mailbox[39] << ", " << mailbox[40] << ", " << mailbox[41] << ", " << mailbox[42] << ", " << mailbox[43] << ", " << mailbox[44] << ", " << mailbox[45] << ", " << mailbox[46] << ", " << mailbox[47] << ", " << mailbox[48] << ", " << mailbox[49] << ", " << mailbox[50] << ", " << mailbox[51] << ", " << mailbox[52] << ", " << mailbox[53] << ", " << mailbox[54] << ", " << mailbox[55] << ", " << mailbox[56] << ", " << mailbox[57] << ", " << mailbox[58] << ", " << mailbox[59] << ", " << mailbox[60] << ", " << mailbox[61] << ", " << mailbox[62] << ", " << mailbox[63]);  // NOLINT
1661   helper_->ProduceTextureCHROMIUMImmediate(target, mailbox);
1662   CheckGLError();
1663 }
1664
1665 void GLES2Implementation::ConsumeTextureCHROMIUM(
1666     GLenum target, const GLbyte* mailbox) {
1667   GPU_CLIENT_SINGLE_THREAD_CHECK();
1668   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glConsumeTextureCHROMIUM(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << static_cast<const void*>(mailbox) << ")");  // NOLINT
1669   GPU_CLIENT_LOG("values: " << mailbox[0] << ", " << mailbox[1] << ", " << mailbox[2] << ", " << mailbox[3] << ", " << mailbox[4] << ", " << mailbox[5] << ", " << mailbox[6] << ", " << mailbox[7] << ", " << mailbox[8] << ", " << mailbox[9] << ", " << mailbox[10] << ", " << mailbox[11] << ", " << mailbox[12] << ", " << mailbox[13] << ", " << mailbox[14] << ", " << mailbox[15] << ", " << mailbox[16] << ", " << mailbox[17] << ", " << mailbox[18] << ", " << mailbox[19] << ", " << mailbox[20] << ", " << mailbox[21] << ", " << mailbox[22] << ", " << mailbox[23] << ", " << mailbox[24] << ", " << mailbox[25] << ", " << mailbox[26] << ", " << mailbox[27] << ", " << mailbox[28] << ", " << mailbox[29] << ", " << mailbox[30] << ", " << mailbox[31] << ", " << mailbox[32] << ", " << mailbox[33] << ", " << mailbox[34] << ", " << mailbox[35] << ", " << mailbox[36] << ", " << mailbox[37] << ", " << mailbox[38] << ", " << mailbox[39] << ", " << mailbox[40] << ", " << mailbox[41] << ", " << mailbox[42] << ", " << mailbox[43] << ", " << mailbox[44] << ", " << mailbox[45] << ", " << mailbox[46] << ", " << mailbox[47] << ", " << mailbox[48] << ", " << mailbox[49] << ", " << mailbox[50] << ", " << mailbox[51] << ", " << mailbox[52] << ", " << mailbox[53] << ", " << mailbox[54] << ", " << mailbox[55] << ", " << mailbox[56] << ", " << mailbox[57] << ", " << mailbox[58] << ", " << mailbox[59] << ", " << mailbox[60] << ", " << mailbox[61] << ", " << mailbox[62] << ", " << mailbox[63]);  // NOLINT
1670   helper_->ConsumeTextureCHROMIUMImmediate(target, mailbox);
1671   CheckGLError();
1672 }
1673
1674 void GLES2Implementation::BindTexImage2DCHROMIUM(
1675     GLenum target, GLint imageId) {
1676   GPU_CLIENT_SINGLE_THREAD_CHECK();
1677   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindTexImage2DCHROMIUM(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << imageId << ")");  // NOLINT
1678   helper_->BindTexImage2DCHROMIUM(target, imageId);
1679   CheckGLError();
1680 }
1681
1682 void GLES2Implementation::ReleaseTexImage2DCHROMIUM(
1683     GLenum target, GLint imageId) {
1684   GPU_CLIENT_SINGLE_THREAD_CHECK();
1685   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glReleaseTexImage2DCHROMIUM(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << imageId << ")");  // NOLINT
1686   helper_->ReleaseTexImage2DCHROMIUM(target, imageId);
1687   CheckGLError();
1688 }
1689
1690 void GLES2Implementation::DiscardFramebufferEXT(
1691     GLenum target, GLsizei count, const GLenum* attachments) {
1692   GPU_CLIENT_SINGLE_THREAD_CHECK();
1693   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDiscardFramebufferEXT(" << GLES2Util::GetStringEnum(target) << ", " << count << ", " << static_cast<const void*>(attachments) << ")");  // NOLINT
1694   GPU_CLIENT_LOG_CODE_BLOCK({
1695     for (GLsizei i = 0; i < count; ++i) {
1696        GPU_CLIENT_LOG("  " << i << ": " << attachments[0 + i * 1]);
1697     }
1698   });
1699   if (count < 0) {
1700     SetGLError(GL_INVALID_VALUE, "glDiscardFramebufferEXT", "count < 0");
1701     return;
1702   }
1703   helper_->DiscardFramebufferEXTImmediate(target, count, attachments);
1704   CheckGLError();
1705 }
1706
1707 void GLES2Implementation::LoseContextCHROMIUM(GLenum current, GLenum other) {
1708   GPU_CLIENT_SINGLE_THREAD_CHECK();
1709   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glLoseContextCHROMIUM(" << GLES2Util::GetStringEnum(current) << ", " << GLES2Util::GetStringEnum(other) << ")");  // NOLINT
1710   helper_->LoseContextCHROMIUM(current, other);
1711   CheckGLError();
1712 }
1713
1714 void GLES2Implementation::WaitSyncPointCHROMIUM(GLuint sync_point) {
1715   GPU_CLIENT_SINGLE_THREAD_CHECK();
1716   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glWaitSyncPointCHROMIUM(" << sync_point << ")");  // NOLINT
1717   helper_->WaitSyncPointCHROMIUM(sync_point);
1718   CheckGLError();
1719 }
1720
1721 void GLES2Implementation::DrawBuffersEXT(GLsizei count, const GLenum* bufs) {
1722   GPU_CLIENT_SINGLE_THREAD_CHECK();
1723   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDrawBuffersEXT(" << count << ", " << static_cast<const void*>(bufs) << ")");  // NOLINT
1724   GPU_CLIENT_LOG_CODE_BLOCK({
1725     for (GLsizei i = 0; i < count; ++i) {
1726        GPU_CLIENT_LOG("  " << i << ": " << bufs[0 + i * 1]);
1727     }
1728   });
1729   if (count < 0) {
1730     SetGLError(GL_INVALID_VALUE, "glDrawBuffersEXT", "count < 0");
1731     return;
1732   }
1733   helper_->DrawBuffersEXTImmediate(count, bufs);
1734   CheckGLError();
1735 }
1736
1737 #endif  // GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_IMPL_AUTOGEN_H_
1738