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

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

Issue 2317363005: Add basic GL functionality to the passthrough command buffer. (Closed)
Patch Set: Handle bind_generates_resource Created 4 years, 3 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
1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h" 5 #include "gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h"
6 6
7 #include "base/strings/string_number_conversions.h" 7 #include "base/strings/string_number_conversions.h"
8 8
9 namespace gpu { 9 namespace gpu {
10 namespace gles2 { 10 namespace gles2 {
11 11
12 namespace {
13
14 template <typename ClientType, typename ServiceType, typename GenFunction>
15 error::Error GenHelper(GLsizei n,
16 const volatile ClientType* client_ids,
17 ClientServiceMap<ClientType, ServiceType>* id_map,
18 GenFunction gen_function) {
19 std::vector<ClientType> client_ids_copy(client_ids, client_ids + n);
20 for (GLsizei ii = 0; ii < n; ++ii) {
21 if (id_map->GetServiceID(client_ids_copy[ii], nullptr)) {
22 return error::kInvalidArguments;
23 }
24 }
25 if (!CheckUniqueAndNonNullIds(n, client_ids_copy.data())) {
26 return error::kInvalidArguments;
27 }
28
29 std::vector<ServiceType> service_ids(n, 0);
30 gen_function(n, service_ids.data());
31 for (GLsizei ii = 0; ii < n; ++ii) {
32 id_map->SetIDMapping(client_ids_copy[ii], service_ids[ii]);
33 }
34
35 return error::kNoError;
36 }
37
38 template <typename ClientType, typename ServiceType, typename GenFunction>
39 error::Error CreateHelper(ClientType client_id,
40 ClientServiceMap<ClientType, ServiceType>* id_map,
41 GenFunction create_function) {
42 if (id_map->GetServiceID(client_id, nullptr)) {
43 return error::kInvalidArguments;
44 }
45 ServiceType service_id = create_function();
46 id_map->SetIDMapping(client_id, service_id);
47 return error::kNoError;
48 }
49
50 template <typename ClientType, typename ServiceType, typename DeleteFunction>
51 error::Error DeleteHelper(GLsizei n,
52 const volatile ClientType* client_ids,
53 ClientServiceMap<ClientType, ServiceType>* id_map,
54 DeleteFunction delete_function) {
55 std::vector<ServiceType> service_ids(n, 0);
56 for (GLsizei ii = 0; ii < n; ++ii) {
57 ClientType client_id = client_ids[ii];
58 service_ids[ii] = id_map->GetServiceIDOrInvalid(client_id);
59 id_map->RemoveClientID(client_id);
60 }
61
62 delete_function(n, service_ids.data());
63
64 return error::kNoError;
65 }
66
67 template <typename ClientType, typename ServiceType, typename DeleteFunction>
68 error::Error DeleteHelper(ClientType client_id,
69 ClientServiceMap<ClientType, ServiceType>* id_map,
70 DeleteFunction delete_function) {
71 delete_function(id_map->GetServiceIDOrInvalid(client_id));
72 id_map->RemoveClientID(client_id);
73 return error::kNoError;
74 }
75
76 template <typename ClientType, typename ServiceType, typename GenFunction>
77 ServiceType GetServiceID(ClientType client_id,
78 ClientServiceMap<ClientType, ServiceType>* id_map,
79 bool create_if_missing,
80 GenFunction gen_function) {
81 ServiceType service_id = id_map->invalid_service_id();
82 if (id_map->GetServiceID(client_id, &service_id)) {
83 return service_id;
84 }
85
86 if (create_if_missing) {
87 service_id = gen_function();
88 id_map->SetIDMapping(client_id, service_id);
89 return service_id;
90 }
91
92 return id_map->invalid_service_id();
93 }
94
95 GLuint GetTextureServiceID(GLuint client_id,
96 PassthroughResources* resources,
97 bool create_if_missing) {
98 return GetServiceID(client_id, &resources->texture_id_map, create_if_missing,
99 []() {
100 GLuint service_id = 0;
101 glGenTextures(1, &service_id);
102 return service_id;
103 });
104 }
105
106 GLuint GetBufferServiceID(GLuint client_id,
107 PassthroughResources* resources,
108 bool create_if_missing) {
109 return GetServiceID(client_id, &resources->buffer_id_map, create_if_missing,
110 []() {
111 GLuint service_id = 0;
112 glGenBuffersARB(1, &service_id);
113 return service_id;
114 });
115 }
116
117 GLuint GetRenderbufferServiceID(GLuint client_id,
118 PassthroughResources* resources,
119 bool create_if_missing) {
120 return GetServiceID(client_id, &resources->renderbuffer_id_map,
121 create_if_missing, []() {
122 GLuint service_id = 0;
123 glGenRenderbuffersEXT(1, &service_id);
124 return service_id;
125 });
126 }
127
128 GLuint GetFramebufferServiceID(GLuint client_id,
129 ClientServiceMap<GLuint, GLuint>* id_map,
130 bool create_if_missing) {
131 return GetServiceID(client_id, id_map, create_if_missing, []() {
132 GLuint service_id = 0;
133 glGenFramebuffersEXT(1, &service_id);
134 return service_id;
135 });
136 }
137
138 GLuint GetTransformFeedbackServiceID(GLuint client_id,
139 ClientServiceMap<GLuint, GLuint>* id_map,
140 bool create_if_missing) {
141 return GetServiceID(client_id, id_map, create_if_missing, []() {
142 GLuint service_id = 0;
143 glGenTransformFeedbacks(1, &service_id);
144 return service_id;
145 });
146 }
147
148 GLuint GetVertexArrayServiceID(GLuint client_id,
149 ClientServiceMap<GLuint, GLuint>* id_map,
150 bool create_if_missing) {
151 return GetServiceID(client_id, id_map, create_if_missing, []() {
152 GLuint service_id = 0;
153 glGenVertexArraysOES(1, &service_id);
154 return service_id;
155 });
156 }
157
158 GLuint GetProgramServiceID(GLuint client_id, PassthroughResources* resources) {
159 return resources->program_id_map.GetServiceIDOrInvalid(client_id);
160 }
161
162 GLuint GetShaderServiceID(GLuint client_id, PassthroughResources* resources) {
163 return resources->shader_id_map.GetServiceIDOrInvalid(client_id);
164 }
165
166 GLuint GetQueryServiceID(GLuint client_id,
167 ClientServiceMap<GLuint, GLuint>* id_map) {
168 return id_map->GetServiceIDOrInvalid(client_id);
169 }
170
171 GLuint GetSamplerServiceID(GLuint client_id, PassthroughResources* resources) {
172 return resources->sampler_id_map.GetServiceIDOrInvalid(client_id);
173 }
174
175 GLsync GetSyncServiceID(GLuint client_id, PassthroughResources* resources) {
176 return reinterpret_cast<GLsync>(
177 resources->sync_id_map.GetServiceIDOrInvalid(client_id));
178 }
179
180 template <typename T>
181 void InsertValueIntoBuffer(std::vector<uint8_t>* data,
182 const T& value,
183 size_t offset) {
184 DCHECK_LE(offset + sizeof(T), data->size());
185 memcpy(data->data() + offset, &value, sizeof(T));
186 }
187
188 template <typename T>
189 void AppendValueToBuffer(std::vector<uint8_t>* data, const T& value) {
190 size_t old_size = data->size();
191 data->resize(old_size + sizeof(T));
192 memcpy(data->data() + old_size, &value, sizeof(T));
193 }
194
195 void AppendStringToBuffer(std::vector<uint8_t>* data,
196 const char* str,
197 size_t len) {
198 size_t old_size = data->size();
199 data->resize(old_size + len);
200 memcpy(data->data() + old_size, str, len);
201 }
202
203 } // anonymous namespace
204
12 // Implementations of commands 205 // Implementations of commands
13 error::Error GLES2DecoderPassthroughImpl::DoActiveTexture(GLenum texture) { 206 error::Error GLES2DecoderPassthroughImpl::DoActiveTexture(GLenum texture) {
207 glActiveTexture(texture);
208 active_texture_unit_ = static_cast<size_t>(texture) - GL_TEXTURE0;
14 return error::kNoError; 209 return error::kNoError;
15 } 210 }
16 211
17 error::Error GLES2DecoderPassthroughImpl::DoAttachShader(GLuint program, 212 error::Error GLES2DecoderPassthroughImpl::DoAttachShader(GLuint program,
18 GLuint shader) { 213 GLuint shader) {
19 return error::kNoError; 214 glAttachShader(GetProgramServiceID(program, resources_),
20 } 215 GetShaderServiceID(shader, resources_));
21 216 return error::kNoError;
217 }
218
22 error::Error GLES2DecoderPassthroughImpl::DoBindAttribLocation( 219 error::Error GLES2DecoderPassthroughImpl::DoBindAttribLocation(
23 GLuint program, 220 GLuint program,
24 GLuint index, 221 GLuint index,
25 const char* name) { 222 const char* name) {
223 glBindAttribLocation(GetProgramServiceID(program, resources_), index, name);
26 return error::kNoError; 224 return error::kNoError;
27 } 225 }
28 226
29 error::Error GLES2DecoderPassthroughImpl::DoBindBuffer(GLenum target, 227 error::Error GLES2DecoderPassthroughImpl::DoBindBuffer(GLenum target,
30 GLuint buffer) { 228 GLuint buffer) {
229 glBindBuffer(
230 target, GetBufferServiceID(buffer, resources_, bind_generates_resource_));
31 return error::kNoError; 231 return error::kNoError;
32 } 232 }
33 233
34 error::Error GLES2DecoderPassthroughImpl::DoBindBufferBase(GLenum target, 234 error::Error GLES2DecoderPassthroughImpl::DoBindBufferBase(GLenum target,
35 GLuint index, 235 GLuint index,
36 GLuint buffer) { 236 GLuint buffer) {
237 glBindBufferBase(target, index, GetBufferServiceID(buffer, resources_,
238 bind_generates_resource_));
37 return error::kNoError; 239 return error::kNoError;
38 } 240 }
39 241
40 error::Error GLES2DecoderPassthroughImpl::DoBindBufferRange(GLenum target, 242 error::Error GLES2DecoderPassthroughImpl::DoBindBufferRange(GLenum target,
41 GLuint index, 243 GLuint index,
42 GLuint buffer, 244 GLuint buffer,
43 GLintptr offset, 245 GLintptr offset,
44 GLsizeiptr size) { 246 GLsizeiptr size) {
247 glBindBufferRange(target, index, GetBufferServiceID(buffer, resources_,
248 bind_generates_resource_),
249 offset, size);
45 return error::kNoError; 250 return error::kNoError;
46 } 251 }
47 252
48 error::Error GLES2DecoderPassthroughImpl::DoBindFramebuffer( 253 error::Error GLES2DecoderPassthroughImpl::DoBindFramebuffer(
49 GLenum target, 254 GLenum target,
50 GLuint framebuffer) { 255 GLuint framebuffer) {
256 glBindFramebufferEXT(
257 target, GetFramebufferServiceID(framebuffer, &framebuffer_id_map_,
258 bind_generates_resource_));
51 return error::kNoError; 259 return error::kNoError;
52 } 260 }
53 261
54 error::Error GLES2DecoderPassthroughImpl::DoBindRenderbuffer( 262 error::Error GLES2DecoderPassthroughImpl::DoBindRenderbuffer(
55 GLenum target, 263 GLenum target,
56 GLuint renderbuffer) { 264 GLuint renderbuffer) {
265 glBindRenderbufferEXT(target,
266 GetRenderbufferServiceID(renderbuffer, resources_,
267 bind_generates_resource_));
57 return error::kNoError; 268 return error::kNoError;
58 } 269 }
59 270
60 error::Error GLES2DecoderPassthroughImpl::DoBindSampler(GLuint unit, 271 error::Error GLES2DecoderPassthroughImpl::DoBindSampler(GLuint unit,
61 GLuint sampler) { 272 GLuint sampler) {
273 glBindSampler(unit, GetSamplerServiceID(sampler, resources_));
62 return error::kNoError; 274 return error::kNoError;
63 } 275 }
64 276
65 error::Error GLES2DecoderPassthroughImpl::DoBindTexture(GLenum target, 277 error::Error GLES2DecoderPassthroughImpl::DoBindTexture(GLenum target,
66 GLuint texture) { 278 GLuint texture) {
279 glBindTexture(target, GetTextureServiceID(texture, resources_,
280 bind_generates_resource_));
281 if (target == GL_TEXTURE_2D &&
282 active_texture_unit_ < bound_textures_.size()) {
283 bound_textures_[active_texture_unit_] = texture;
284 }
67 return error::kNoError; 285 return error::kNoError;
68 } 286 }
69 287
70 error::Error GLES2DecoderPassthroughImpl::DoBindTransformFeedback( 288 error::Error GLES2DecoderPassthroughImpl::DoBindTransformFeedback(
71 GLenum target, 289 GLenum target,
72 GLuint transformfeedback) { 290 GLuint transformfeedback) {
291 glBindTransformFeedback(
292 target, GetTransformFeedbackServiceID(transformfeedback,
293 &transform_feedback_id_map_,
294 bind_generates_resource_));
73 return error::kNoError; 295 return error::kNoError;
74 } 296 }
75 297
76 error::Error GLES2DecoderPassthroughImpl::DoBlendColor(GLclampf red, 298 error::Error GLES2DecoderPassthroughImpl::DoBlendColor(GLclampf red,
77 GLclampf green, 299 GLclampf green,
78 GLclampf blue, 300 GLclampf blue,
79 GLclampf alpha) { 301 GLclampf alpha) {
302 glBlendColor(red, green, blue, alpha);
80 return error::kNoError; 303 return error::kNoError;
81 } 304 }
82 305
83 error::Error GLES2DecoderPassthroughImpl::DoBlendEquation(GLenum mode) { 306 error::Error GLES2DecoderPassthroughImpl::DoBlendEquation(GLenum mode) {
307 glBlendEquation(mode);
84 return error::kNoError; 308 return error::kNoError;
85 } 309 }
86 310
87 error::Error GLES2DecoderPassthroughImpl::DoBlendEquationSeparate( 311 error::Error GLES2DecoderPassthroughImpl::DoBlendEquationSeparate(
88 GLenum modeRGB, 312 GLenum modeRGB,
89 GLenum modeAlpha) { 313 GLenum modeAlpha) {
314 glBlendEquationSeparate(modeRGB, modeAlpha);
90 return error::kNoError; 315 return error::kNoError;
91 } 316 }
92 317
93 error::Error GLES2DecoderPassthroughImpl::DoBlendFunc(GLenum sfactor, 318 error::Error GLES2DecoderPassthroughImpl::DoBlendFunc(GLenum sfactor,
94 GLenum dfactor) { 319 GLenum dfactor) {
320 glBlendFunc(sfactor, dfactor);
95 return error::kNoError; 321 return error::kNoError;
96 } 322 }
97 323
98 error::Error GLES2DecoderPassthroughImpl::DoBlendFuncSeparate(GLenum srcRGB, 324 error::Error GLES2DecoderPassthroughImpl::DoBlendFuncSeparate(GLenum srcRGB,
99 GLenum dstRGB, 325 GLenum dstRGB,
100 GLenum srcAlpha, 326 GLenum srcAlpha,
101 GLenum dstAlpha) { 327 GLenum dstAlpha) {
328 glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
102 return error::kNoError; 329 return error::kNoError;
103 } 330 }
104 331
105 error::Error GLES2DecoderPassthroughImpl::DoBufferData(GLenum target, 332 error::Error GLES2DecoderPassthroughImpl::DoBufferData(GLenum target,
106 GLsizeiptr size, 333 GLsizeiptr size,
107 const void* data, 334 const void* data,
108 GLenum usage) { 335 GLenum usage) {
336 glBufferData(target, size, data, usage);
109 return error::kNoError; 337 return error::kNoError;
110 } 338 }
111 339
112 error::Error GLES2DecoderPassthroughImpl::DoBufferSubData(GLenum target, 340 error::Error GLES2DecoderPassthroughImpl::DoBufferSubData(GLenum target,
113 GLintptr offset, 341 GLintptr offset,
114 GLsizeiptr size, 342 GLsizeiptr size,
115 const void* data) { 343 const void* data) {
344 glBufferSubData(target, offset, size, data);
116 return error::kNoError; 345 return error::kNoError;
117 } 346 }
118 347
119 error::Error GLES2DecoderPassthroughImpl::DoCheckFramebufferStatus( 348 error::Error GLES2DecoderPassthroughImpl::DoCheckFramebufferStatus(
120 GLenum target, 349 GLenum target,
121 uint32_t* result) { 350 uint32_t* result) {
351 *result = glCheckFramebufferStatusEXT(target);
122 return error::kNoError; 352 return error::kNoError;
123 } 353 }
124 354
125 error::Error GLES2DecoderPassthroughImpl::DoClear(GLbitfield mask) { 355 error::Error GLES2DecoderPassthroughImpl::DoClear(GLbitfield mask) {
356 glClear(mask);
126 return error::kNoError; 357 return error::kNoError;
127 } 358 }
128 359
129 error::Error GLES2DecoderPassthroughImpl::DoClearBufferfi(GLenum buffer, 360 error::Error GLES2DecoderPassthroughImpl::DoClearBufferfi(GLenum buffer,
130 GLint drawbuffers, 361 GLint drawbuffers,
131 GLfloat depth, 362 GLfloat depth,
132 GLint stencil) { 363 GLint stencil) {
364 glClearBufferfi(buffer, drawbuffers, depth, stencil);
133 return error::kNoError; 365 return error::kNoError;
134 } 366 }
135 367
136 error::Error GLES2DecoderPassthroughImpl::DoClearBufferfv( 368 error::Error GLES2DecoderPassthroughImpl::DoClearBufferfv(
137 GLenum buffer, 369 GLenum buffer,
138 GLint drawbuffers, 370 GLint drawbuffers,
139 const volatile GLfloat* value) { 371 const volatile GLfloat* value) {
372 glClearBufferfv(buffer, drawbuffers, const_cast<const GLfloat*>(value));
140 return error::kNoError; 373 return error::kNoError;
141 } 374 }
142 375
143 error::Error GLES2DecoderPassthroughImpl::DoClearBufferiv( 376 error::Error GLES2DecoderPassthroughImpl::DoClearBufferiv(
144 GLenum buffer, 377 GLenum buffer,
145 GLint drawbuffers, 378 GLint drawbuffers,
146 const volatile GLint* value) { 379 const volatile GLint* value) {
380 glClearBufferiv(buffer, drawbuffers, const_cast<const GLint*>(value));
147 return error::kNoError; 381 return error::kNoError;
148 } 382 }
149 383
150 error::Error GLES2DecoderPassthroughImpl::DoClearBufferuiv( 384 error::Error GLES2DecoderPassthroughImpl::DoClearBufferuiv(
151 GLenum buffer, 385 GLenum buffer,
152 GLint drawbuffers, 386 GLint drawbuffers,
153 const volatile GLuint* value) { 387 const volatile GLuint* value) {
388 glClearBufferuiv(buffer, drawbuffers, const_cast<const GLuint*>(value));
154 return error::kNoError; 389 return error::kNoError;
155 } 390 }
156 391
157 error::Error GLES2DecoderPassthroughImpl::DoClearColor(GLclampf red, 392 error::Error GLES2DecoderPassthroughImpl::DoClearColor(GLclampf red,
158 GLclampf green, 393 GLclampf green,
159 GLclampf blue, 394 GLclampf blue,
160 GLclampf alpha) { 395 GLclampf alpha) {
396 glClearColor(red, green, blue, alpha);
161 return error::kNoError; 397 return error::kNoError;
162 } 398 }
163 399
164 error::Error GLES2DecoderPassthroughImpl::DoClearDepthf(GLclampf depth) { 400 error::Error GLES2DecoderPassthroughImpl::DoClearDepthf(GLclampf depth) {
401 glClearDepthf(depth);
165 return error::kNoError; 402 return error::kNoError;
166 } 403 }
167 404
168 error::Error GLES2DecoderPassthroughImpl::DoClearStencil(GLint s) { 405 error::Error GLES2DecoderPassthroughImpl::DoClearStencil(GLint s) {
406 glClearStencil(s);
169 return error::kNoError; 407 return error::kNoError;
170 } 408 }
171 409
172 error::Error GLES2DecoderPassthroughImpl::DoClientWaitSync(GLuint sync, 410 error::Error GLES2DecoderPassthroughImpl::DoClientWaitSync(GLuint sync,
173 GLbitfield flags, 411 GLbitfield flags,
174 GLuint64 timeout, 412 GLuint64 timeout,
175 GLenum* result) { 413 GLenum* result) {
414 NOTIMPLEMENTED();
176 return error::kNoError; 415 return error::kNoError;
177 } 416 }
178 417
179 error::Error GLES2DecoderPassthroughImpl::DoColorMask(GLboolean red, 418 error::Error GLES2DecoderPassthroughImpl::DoColorMask(GLboolean red,
180 GLboolean green, 419 GLboolean green,
181 GLboolean blue, 420 GLboolean blue,
182 GLboolean alpha) { 421 GLboolean alpha) {
422 glColorMask(red, green, blue, alpha);
183 return error::kNoError; 423 return error::kNoError;
184 } 424 }
185 425
186 error::Error GLES2DecoderPassthroughImpl::DoCompileShader(GLuint shader) { 426 error::Error GLES2DecoderPassthroughImpl::DoCompileShader(GLuint shader) {
427 glCompileShader(GetShaderServiceID(shader, resources_));
187 return error::kNoError; 428 return error::kNoError;
188 } 429 }
189 430
190 error::Error GLES2DecoderPassthroughImpl::DoCompressedTexImage2D( 431 error::Error GLES2DecoderPassthroughImpl::DoCompressedTexImage2D(
191 GLenum target, 432 GLenum target,
192 GLint level, 433 GLint level,
193 GLenum internalformat, 434 GLenum internalformat,
194 GLsizei width, 435 GLsizei width,
195 GLsizei height, 436 GLsizei height,
196 GLint border, 437 GLint border,
197 GLsizei imageSize, 438 GLsizei imageSize,
198 const void* data) { 439 const void* data) {
440 NOTIMPLEMENTED();
199 return error::kNoError; 441 return error::kNoError;
200 } 442 }
201 443
202 error::Error GLES2DecoderPassthroughImpl::DoCompressedTexSubImage2D( 444 error::Error GLES2DecoderPassthroughImpl::DoCompressedTexSubImage2D(
203 GLenum target, 445 GLenum target,
204 GLint level, 446 GLint level,
205 GLint xoffset, 447 GLint xoffset,
206 GLint yoffset, 448 GLint yoffset,
207 GLsizei width, 449 GLsizei width,
208 GLsizei height, 450 GLsizei height,
209 GLenum format, 451 GLenum format,
210 GLsizei imageSize, 452 GLsizei imageSize,
211 const void* data) { 453 const void* data) {
454 NOTIMPLEMENTED();
212 return error::kNoError; 455 return error::kNoError;
213 } 456 }
214 457
215 error::Error GLES2DecoderPassthroughImpl::DoCompressedTexImage3D( 458 error::Error GLES2DecoderPassthroughImpl::DoCompressedTexImage3D(
216 GLenum target, 459 GLenum target,
217 GLint level, 460 GLint level,
218 GLenum internalformat, 461 GLenum internalformat,
219 GLsizei width, 462 GLsizei width,
220 GLsizei height, 463 GLsizei height,
221 GLsizei depth, 464 GLsizei depth,
222 GLint border, 465 GLint border,
223 GLsizei imageSize, 466 GLsizei imageSize,
224 const void* data) { 467 const void* data) {
468 NOTIMPLEMENTED();
225 return error::kNoError; 469 return error::kNoError;
226 } 470 }
227 471
228 error::Error GLES2DecoderPassthroughImpl::DoCompressedTexSubImage3D( 472 error::Error GLES2DecoderPassthroughImpl::DoCompressedTexSubImage3D(
229 GLenum target, 473 GLenum target,
230 GLint level, 474 GLint level,
231 GLint xoffset, 475 GLint xoffset,
232 GLint yoffset, 476 GLint yoffset,
233 GLint zoffset, 477 GLint zoffset,
234 GLsizei width, 478 GLsizei width,
235 GLsizei height, 479 GLsizei height,
236 GLsizei depth, 480 GLsizei depth,
237 GLenum format, 481 GLenum format,
238 GLsizei imageSize, 482 GLsizei imageSize,
239 const void* data) { 483 const void* data) {
484 NOTIMPLEMENTED();
240 return error::kNoError; 485 return error::kNoError;
241 } 486 }
242 487
243 error::Error GLES2DecoderPassthroughImpl::DoCopyBufferSubData( 488 error::Error GLES2DecoderPassthroughImpl::DoCopyBufferSubData(
244 GLenum readtarget, 489 GLenum readtarget,
245 GLenum writetarget, 490 GLenum writetarget,
246 GLintptr readoffset, 491 GLintptr readoffset,
247 GLintptr writeoffset, 492 GLintptr writeoffset,
248 GLsizeiptr size) { 493 GLsizeiptr size) {
494 glCopyBufferSubData(readtarget, writetarget, readoffset, writeoffset, size);
249 return error::kNoError; 495 return error::kNoError;
250 } 496 }
251 497
252 error::Error GLES2DecoderPassthroughImpl::DoCopyTexImage2D( 498 error::Error GLES2DecoderPassthroughImpl::DoCopyTexImage2D(
253 GLenum target, 499 GLenum target,
254 GLint level, 500 GLint level,
255 GLenum internalformat, 501 GLenum internalformat,
256 GLint x, 502 GLint x,
257 GLint y, 503 GLint y,
258 GLsizei width, 504 GLsizei width,
259 GLsizei height, 505 GLsizei height,
260 GLint border) { 506 GLint border) {
507 glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
261 return error::kNoError; 508 return error::kNoError;
262 } 509 }
263 510
264 error::Error GLES2DecoderPassthroughImpl::DoCopyTexSubImage2D(GLenum target, 511 error::Error GLES2DecoderPassthroughImpl::DoCopyTexSubImage2D(GLenum target,
265 GLint level, 512 GLint level,
266 GLint xoffset, 513 GLint xoffset,
267 GLint yoffset, 514 GLint yoffset,
268 GLint x, 515 GLint x,
269 GLint y, 516 GLint y,
270 GLsizei width, 517 GLsizei width,
271 GLsizei height) { 518 GLsizei height) {
519 glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
272 return error::kNoError; 520 return error::kNoError;
273 } 521 }
274 522
275 error::Error GLES2DecoderPassthroughImpl::DoCopyTexSubImage3D(GLenum target, 523 error::Error GLES2DecoderPassthroughImpl::DoCopyTexSubImage3D(GLenum target,
276 GLint level, 524 GLint level,
277 GLint xoffset, 525 GLint xoffset,
278 GLint yoffset, 526 GLint yoffset,
279 GLint zoffset, 527 GLint zoffset,
280 GLint x, 528 GLint x,
281 GLint y, 529 GLint y,
282 GLsizei width, 530 GLsizei width,
283 GLsizei height) { 531 GLsizei height) {
532 glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width,
533 height);
284 return error::kNoError; 534 return error::kNoError;
285 } 535 }
286 536
287 error::Error GLES2DecoderPassthroughImpl::DoCreateProgram(GLuint client_id) { 537 error::Error GLES2DecoderPassthroughImpl::DoCreateProgram(GLuint client_id) {
288 return error::kNoError; 538 return CreateHelper(client_id, &resources_->program_id_map,
539 []() { return glCreateProgram(); });
289 } 540 }
290 541
291 error::Error GLES2DecoderPassthroughImpl::DoCreateShader(GLenum type, 542 error::Error GLES2DecoderPassthroughImpl::DoCreateShader(GLenum type,
292 GLuint client_id) { 543 GLuint client_id) {
293 return error::kNoError; 544 return CreateHelper(client_id, &resources_->shader_id_map,
545 [type]() { return glCreateShader(type); });
294 } 546 }
295 547
296 error::Error GLES2DecoderPassthroughImpl::DoCullFace(GLenum mode) { 548 error::Error GLES2DecoderPassthroughImpl::DoCullFace(GLenum mode) {
549 glCullFace(mode);
297 return error::kNoError; 550 return error::kNoError;
298 } 551 }
299 552
300 error::Error GLES2DecoderPassthroughImpl::DoDeleteBuffers( 553 error::Error GLES2DecoderPassthroughImpl::DoDeleteBuffers(
301 GLsizei n, 554 GLsizei n,
302 const volatile GLuint* buffers) { 555 const volatile GLuint* buffers) {
303 return error::kNoError; 556 return DeleteHelper(
557 n, buffers, &resources_->buffer_id_map,
558 [](GLsizei n, GLuint* buffers) { glDeleteBuffersARB(n, buffers); });
304 } 559 }
305 560
306 error::Error GLES2DecoderPassthroughImpl::DoDeleteFramebuffers( 561 error::Error GLES2DecoderPassthroughImpl::DoDeleteFramebuffers(
307 GLsizei n, 562 GLsizei n,
308 const volatile GLuint* framebuffers) { 563 const volatile GLuint* framebuffers) {
309 return error::kNoError; 564 return DeleteHelper(n, framebuffers, &framebuffer_id_map_,
565 [](GLsizei n, GLuint* framebuffers) {
566 glDeleteFramebuffersEXT(n, framebuffers);
567 });
310 } 568 }
311 569
312 error::Error GLES2DecoderPassthroughImpl::DoDeleteProgram(GLuint program) { 570 error::Error GLES2DecoderPassthroughImpl::DoDeleteProgram(GLuint program) {
313 return error::kNoError; 571 return DeleteHelper(program, &resources_->program_id_map,
572 [](GLuint program) { glDeleteProgram(program); });
314 } 573 }
315 574
316 error::Error GLES2DecoderPassthroughImpl::DoDeleteRenderbuffers( 575 error::Error GLES2DecoderPassthroughImpl::DoDeleteRenderbuffers(
317 GLsizei n, 576 GLsizei n,
318 const volatile GLuint* renderbuffers) { 577 const volatile GLuint* renderbuffers) {
319 return error::kNoError; 578 return DeleteHelper(n, renderbuffers, &resources_->renderbuffer_id_map,
579 [](GLsizei n, GLuint* renderbuffers) {
580 glDeleteRenderbuffersEXT(n, renderbuffers);
581 });
320 } 582 }
321 583
322 error::Error GLES2DecoderPassthroughImpl::DoDeleteSamplers( 584 error::Error GLES2DecoderPassthroughImpl::DoDeleteSamplers(
323 GLsizei n, 585 GLsizei n,
324 const volatile GLuint* samplers) { 586 const volatile GLuint* samplers) {
325 return error::kNoError; 587 return DeleteHelper(
588 n, samplers, &resources_->sampler_id_map,
589 [](GLsizei n, GLuint* samplers) { glDeleteSamplers(n, samplers); });
326 } 590 }
327 591
328 error::Error GLES2DecoderPassthroughImpl::DoDeleteSync(GLuint sync) { 592 error::Error GLES2DecoderPassthroughImpl::DoDeleteSync(GLuint sync) {
329 return error::kNoError; 593 return DeleteHelper(sync, &resources_->sync_id_map, [](uintptr_t sync) {
594 glDeleteSync(reinterpret_cast<GLsync>(sync));
595 });
330 } 596 }
331 597
332 error::Error GLES2DecoderPassthroughImpl::DoDeleteShader(GLuint shader) { 598 error::Error GLES2DecoderPassthroughImpl::DoDeleteShader(GLuint shader) {
333 return error::kNoError; 599 return DeleteHelper(shader, &resources_->shader_id_map,
600 [](GLuint shader) { glDeleteShader(shader); });
334 } 601 }
335 602
336 error::Error GLES2DecoderPassthroughImpl::DoDeleteTextures( 603 error::Error GLES2DecoderPassthroughImpl::DoDeleteTextures(
337 GLsizei n, 604 GLsizei n,
338 const volatile GLuint* textures) { 605 const volatile GLuint* textures) {
339 return error::kNoError; 606 // Textures that are currently associated with a mailbox are stored in the
607 // texture_object_map_ and are deleted automatically when they are
608 // unreferenced. Only delete textures that are not in this map.
609 std::vector<GLuint> non_mailbox_client_ids;
610 for (GLsizei ii = 0; ii < n; ++ii) {
611 GLuint client_id = textures[ii];
612 auto texture_object_iter = resources_->texture_object_map.find(client_id);
613 if (texture_object_iter == resources_->texture_object_map.end()) {
614 // Delete with DeleteHelper
615 non_mailbox_client_ids.push_back(client_id);
616 } else {
617 // Deleted when unreferenced
618 resources_->texture_id_map.RemoveClientID(client_id);
619 resources_->texture_object_map.erase(client_id);
620 }
621 }
622 return DeleteHelper(
623 non_mailbox_client_ids.size(), non_mailbox_client_ids.data(),
624 &resources_->texture_id_map,
625 [](GLsizei n, GLuint* textures) { glDeleteTextures(n, textures); });
340 } 626 }
341 627
342 error::Error GLES2DecoderPassthroughImpl::DoDeleteTransformFeedbacks( 628 error::Error GLES2DecoderPassthroughImpl::DoDeleteTransformFeedbacks(
343 GLsizei n, 629 GLsizei n,
344 const volatile GLuint* ids) { 630 const volatile GLuint* ids) {
345 return error::kNoError; 631 return DeleteHelper(n, ids, &transform_feedback_id_map_,
632 [](GLsizei n, GLuint* transform_feedbacks) {
633 glDeleteTransformFeedbacks(n, transform_feedbacks);
634 });
346 } 635 }
347 636
348 error::Error GLES2DecoderPassthroughImpl::DoDepthFunc(GLenum func) { 637 error::Error GLES2DecoderPassthroughImpl::DoDepthFunc(GLenum func) {
638 glDepthFunc(func);
349 return error::kNoError; 639 return error::kNoError;
350 } 640 }
351 641
352 error::Error GLES2DecoderPassthroughImpl::DoDepthMask(GLboolean flag) { 642 error::Error GLES2DecoderPassthroughImpl::DoDepthMask(GLboolean flag) {
643 glDepthMask(flag);
353 return error::kNoError; 644 return error::kNoError;
354 } 645 }
355 646
356 error::Error GLES2DecoderPassthroughImpl::DoDepthRangef(GLclampf zNear, 647 error::Error GLES2DecoderPassthroughImpl::DoDepthRangef(GLclampf zNear,
357 GLclampf zFar) { 648 GLclampf zFar) {
649 glDepthRangef(zNear, zFar);
358 return error::kNoError; 650 return error::kNoError;
359 } 651 }
360 652
361 error::Error GLES2DecoderPassthroughImpl::DoDetachShader(GLuint program, 653 error::Error GLES2DecoderPassthroughImpl::DoDetachShader(GLuint program,
362 GLuint shader) { 654 GLuint shader) {
655 glDetachShader(GetProgramServiceID(program, resources_),
656 GetShaderServiceID(shader, resources_));
363 return error::kNoError; 657 return error::kNoError;
364 } 658 }
365 659
366 error::Error GLES2DecoderPassthroughImpl::DoDisable(GLenum cap) { 660 error::Error GLES2DecoderPassthroughImpl::DoDisable(GLenum cap) {
661 glDisable(cap);
367 return error::kNoError; 662 return error::kNoError;
368 } 663 }
369 664
370 error::Error GLES2DecoderPassthroughImpl::DoDisableVertexAttribArray( 665 error::Error GLES2DecoderPassthroughImpl::DoDisableVertexAttribArray(
371 GLuint index) { 666 GLuint index) {
667 glDisableVertexAttribArray(index);
372 return error::kNoError; 668 return error::kNoError;
373 } 669 }
374 670
375 error::Error GLES2DecoderPassthroughImpl::DoDrawArrays(GLenum mode, 671 error::Error GLES2DecoderPassthroughImpl::DoDrawArrays(GLenum mode,
376 GLint first, 672 GLint first,
377 GLsizei count) { 673 GLsizei count) {
674 glDrawArrays(mode, first, count);
378 return error::kNoError; 675 return error::kNoError;
379 } 676 }
380 677
381 error::Error GLES2DecoderPassthroughImpl::DoDrawElements(GLenum mode, 678 error::Error GLES2DecoderPassthroughImpl::DoDrawElements(GLenum mode,
382 GLsizei count, 679 GLsizei count,
383 GLenum type, 680 GLenum type,
384 const void* indices) { 681 const void* indices) {
682 glDrawElements(mode, count, type, indices);
385 return error::kNoError; 683 return error::kNoError;
386 } 684 }
387 685
388 error::Error GLES2DecoderPassthroughImpl::DoEnable(GLenum cap) { 686 error::Error GLES2DecoderPassthroughImpl::DoEnable(GLenum cap) {
687 glEnable(cap);
389 return error::kNoError; 688 return error::kNoError;
390 } 689 }
391 690
392 error::Error GLES2DecoderPassthroughImpl::DoEnableVertexAttribArray( 691 error::Error GLES2DecoderPassthroughImpl::DoEnableVertexAttribArray(
393 GLuint index) { 692 GLuint index) {
693 glEnableVertexAttribArray(index);
394 return error::kNoError; 694 return error::kNoError;
395 } 695 }
396 696
397 error::Error GLES2DecoderPassthroughImpl::DoFenceSync(GLenum condition, 697 error::Error GLES2DecoderPassthroughImpl::DoFenceSync(GLenum condition,
398 GLbitfield flags, 698 GLbitfield flags,
399 GLuint client_id) { 699 GLuint client_id) {
700 NOTIMPLEMENTED();
400 return error::kNoError; 701 return error::kNoError;
401 } 702 }
402 703
403 error::Error GLES2DecoderPassthroughImpl::DoFinish() { 704 error::Error GLES2DecoderPassthroughImpl::DoFinish() {
705 glFinish();
404 return error::kNoError; 706 return error::kNoError;
405 } 707 }
406 708
407 error::Error GLES2DecoderPassthroughImpl::DoFlush() { 709 error::Error GLES2DecoderPassthroughImpl::DoFlush() {
710 glFlush();
408 return error::kNoError; 711 return error::kNoError;
409 } 712 }
410 713
411 error::Error GLES2DecoderPassthroughImpl::DoFramebufferRenderbuffer( 714 error::Error GLES2DecoderPassthroughImpl::DoFramebufferRenderbuffer(
412 GLenum target, 715 GLenum target,
413 GLenum attachment, 716 GLenum attachment,
414 GLenum renderbuffertarget, 717 GLenum renderbuffertarget,
415 GLuint renderbuffer) { 718 GLuint renderbuffer) {
719 // TODO(geofflang): Handle this case in ANGLE by adding a WebGL validation
720 // mode.
721 if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
722 glFramebufferRenderbufferEXT(
723 target, GL_DEPTH_ATTACHMENT, renderbuffertarget,
724 GetRenderbufferServiceID(renderbuffer, resources_, false));
725 glFramebufferRenderbufferEXT(
726 target, GL_STENCIL_ATTACHMENT, renderbuffertarget,
727 GetRenderbufferServiceID(renderbuffer, resources_, false));
728 } else {
729 glFramebufferRenderbufferEXT(
730 target, attachment, renderbuffertarget,
731 GetRenderbufferServiceID(renderbuffer, resources_, false));
732 }
416 return error::kNoError; 733 return error::kNoError;
417 } 734 }
418 735
419 error::Error GLES2DecoderPassthroughImpl::DoFramebufferTexture2D( 736 error::Error GLES2DecoderPassthroughImpl::DoFramebufferTexture2D(
420 GLenum target, 737 GLenum target,
421 GLenum attachment, 738 GLenum attachment,
422 GLenum textarget, 739 GLenum textarget,
423 GLuint texture, 740 GLuint texture,
424 GLint level) { 741 GLint level) {
742 glFramebufferTexture2DEXT(target, attachment, textarget,
743 GetTextureServiceID(texture, resources_, false),
744 level);
425 return error::kNoError; 745 return error::kNoError;
426 } 746 }
427 747
428 error::Error GLES2DecoderPassthroughImpl::DoFramebufferTextureLayer( 748 error::Error GLES2DecoderPassthroughImpl::DoFramebufferTextureLayer(
429 GLenum target, 749 GLenum target,
430 GLenum attachment, 750 GLenum attachment,
431 GLuint texture, 751 GLuint texture,
432 GLint level, 752 GLint level,
433 GLint layer) { 753 GLint layer) {
754 glFramebufferTextureLayer(target, attachment,
755 GetTextureServiceID(texture, resources_, false),
756 level, layer);
434 return error::kNoError; 757 return error::kNoError;
435 } 758 }
436 759
437 error::Error GLES2DecoderPassthroughImpl::DoFrontFace(GLenum mode) { 760 error::Error GLES2DecoderPassthroughImpl::DoFrontFace(GLenum mode) {
761 glFrontFace(mode);
438 return error::kNoError; 762 return error::kNoError;
439 } 763 }
440 764
441 error::Error GLES2DecoderPassthroughImpl::DoGenBuffers( 765 error::Error GLES2DecoderPassthroughImpl::DoGenBuffers(
442 GLsizei n, 766 GLsizei n,
443 volatile GLuint* buffers) { 767 volatile GLuint* buffers) {
444 return error::kNoError; 768 return GenHelper(
769 n, buffers, &resources_->buffer_id_map,
770 [](GLsizei n, GLuint* buffers) { glGenBuffersARB(n, buffers); });
445 } 771 }
446 772
447 error::Error GLES2DecoderPassthroughImpl::DoGenerateMipmap(GLenum target) { 773 error::Error GLES2DecoderPassthroughImpl::DoGenerateMipmap(GLenum target) {
774 glGenerateMipmapEXT(target);
448 return error::kNoError; 775 return error::kNoError;
449 } 776 }
450 777
451 error::Error GLES2DecoderPassthroughImpl::DoGenFramebuffers( 778 error::Error GLES2DecoderPassthroughImpl::DoGenFramebuffers(
452 GLsizei n, 779 GLsizei n,
453 volatile GLuint* framebuffers) { 780 volatile GLuint* framebuffers) {
454 return error::kNoError; 781 return GenHelper(n, framebuffers, &framebuffer_id_map_,
782 [](GLsizei n, GLuint* framebuffers) {
783 glGenFramebuffersEXT(n, framebuffers);
784 });
455 } 785 }
456 786
457 error::Error GLES2DecoderPassthroughImpl::DoGenRenderbuffers( 787 error::Error GLES2DecoderPassthroughImpl::DoGenRenderbuffers(
458 GLsizei n, 788 GLsizei n,
459 volatile GLuint* renderbuffers) { 789 volatile GLuint* renderbuffers) {
460 return error::kNoError; 790 return GenHelper(n, renderbuffers, &resources_->renderbuffer_id_map,
791 [](GLsizei n, GLuint* renderbuffers) {
792 glGenRenderbuffersEXT(n, renderbuffers);
793 });
461 } 794 }
462 795
463 error::Error GLES2DecoderPassthroughImpl::DoGenSamplers( 796 error::Error GLES2DecoderPassthroughImpl::DoGenSamplers(
464 GLsizei n, 797 GLsizei n,
465 volatile GLuint* samplers) { 798 volatile GLuint* samplers) {
466 return error::kNoError; 799 return GenHelper(
800 n, samplers, &resources_->sampler_id_map,
801 [](GLsizei n, GLuint* samplers) { glGenSamplers(n, samplers); });
467 } 802 }
468 803
469 error::Error GLES2DecoderPassthroughImpl::DoGenTextures( 804 error::Error GLES2DecoderPassthroughImpl::DoGenTextures(
470 GLsizei n, 805 GLsizei n,
471 volatile GLuint* textures) { 806 volatile GLuint* textures) {
472 return error::kNoError; 807 return GenHelper(
808 n, textures, &resources_->texture_id_map,
809 [](GLsizei n, GLuint* textures) { glGenTextures(n, textures); });
473 } 810 }
474 811
475 error::Error GLES2DecoderPassthroughImpl::DoGenTransformFeedbacks( 812 error::Error GLES2DecoderPassthroughImpl::DoGenTransformFeedbacks(
476 GLsizei n, 813 GLsizei n,
477 volatile GLuint* ids) { 814 volatile GLuint* ids) {
478 return error::kNoError; 815 return GenHelper(n, ids, &transform_feedback_id_map_,
816 [](GLsizei n, GLuint* transform_feedbacks) {
817 glGenTransformFeedbacks(n, transform_feedbacks);
818 });
479 } 819 }
480 820
481 error::Error GLES2DecoderPassthroughImpl::DoGetActiveAttrib(GLuint program, 821 error::Error GLES2DecoderPassthroughImpl::DoGetActiveAttrib(GLuint program,
482 GLuint index, 822 GLuint index,
483 GLint* size, 823 GLint* size,
484 GLenum* type, 824 GLenum* type,
485 std::string* name) { 825 std::string* name) {
826 NOTIMPLEMENTED();
486 return error::kNoError; 827 return error::kNoError;
487 } 828 }
488 829
489 error::Error GLES2DecoderPassthroughImpl::DoGetActiveUniform( 830 error::Error GLES2DecoderPassthroughImpl::DoGetActiveUniform(
490 GLuint program, 831 GLuint program,
491 GLuint index, 832 GLuint index,
492 GLint* size, 833 GLint* size,
493 GLenum* type, 834 GLenum* type,
494 std::string* name) { 835 std::string* name) {
836 NOTIMPLEMENTED();
495 return error::kNoError; 837 return error::kNoError;
496 } 838 }
497 839
498 error::Error GLES2DecoderPassthroughImpl::DoGetActiveUniformBlockiv( 840 error::Error GLES2DecoderPassthroughImpl::DoGetActiveUniformBlockiv(
499 GLuint program, 841 GLuint program,
500 GLuint index, 842 GLuint index,
501 GLenum pname, 843 GLenum pname,
502 GLsizei bufSize, 844 GLsizei bufSize,
503 GLsizei* length, 845 GLsizei* length,
504 GLint* params) { 846 GLint* params) {
847 NOTIMPLEMENTED();
505 return error::kNoError; 848 return error::kNoError;
506 } 849 }
507 850
508 error::Error GLES2DecoderPassthroughImpl::DoGetActiveUniformBlockName( 851 error::Error GLES2DecoderPassthroughImpl::DoGetActiveUniformBlockName(
509 GLuint program, 852 GLuint program,
510 GLuint index, 853 GLuint index,
511 std::string* name) { 854 std::string* name) {
855 NOTIMPLEMENTED();
512 return error::kNoError; 856 return error::kNoError;
513 } 857 }
514 858
515 error::Error GLES2DecoderPassthroughImpl::DoGetActiveUniformsiv( 859 error::Error GLES2DecoderPassthroughImpl::DoGetActiveUniformsiv(
516 GLuint program, 860 GLuint program,
517 GLsizei count, 861 GLsizei count,
518 const GLuint* indices, 862 const GLuint* indices,
519 GLenum pname, 863 GLenum pname,
520 GLsizei bufSize, 864 GLsizei bufSize,
521 GLsizei* length, 865 GLsizei* length,
522 GLint* params) { 866 GLint* params) {
867 NOTIMPLEMENTED();
523 return error::kNoError; 868 return error::kNoError;
524 } 869 }
525 870
526 error::Error GLES2DecoderPassthroughImpl::DoGetAttachedShaders( 871 error::Error GLES2DecoderPassthroughImpl::DoGetAttachedShaders(
527 GLuint program, 872 GLuint program,
528 GLsizei maxcount, 873 GLsizei maxcount,
529 GLsizei* count, 874 GLsizei* count,
530 GLuint* shaders) { 875 GLuint* shaders) {
876 NOTIMPLEMENTED();
531 return error::kNoError; 877 return error::kNoError;
532 } 878 }
533 879
534 error::Error GLES2DecoderPassthroughImpl::DoGetAttribLocation(GLuint program, 880 error::Error GLES2DecoderPassthroughImpl::DoGetAttribLocation(GLuint program,
535 const char* name, 881 const char* name,
536 GLint* result) { 882 GLint* result) {
883 NOTIMPLEMENTED();
537 return error::kNoError; 884 return error::kNoError;
538 } 885 }
539 886
540 error::Error GLES2DecoderPassthroughImpl::DoGetBooleanv(GLenum pname, 887 error::Error GLES2DecoderPassthroughImpl::DoGetBooleanv(GLenum pname,
541 GLsizei bufsize, 888 GLsizei bufsize,
542 GLsizei* length, 889 GLsizei* length,
543 GLboolean* params) { 890 GLboolean* params) {
891 // TODO(geofflang): new-style getter
892 glGetBooleanv(pname, params);
893 *length = 1;
544 return error::kNoError; 894 return error::kNoError;
545 } 895 }
546 896
547 error::Error GLES2DecoderPassthroughImpl::DoGetBufferParameteri64v( 897 error::Error GLES2DecoderPassthroughImpl::DoGetBufferParameteri64v(
548 GLenum target, 898 GLenum target,
549 GLenum pname, 899 GLenum pname,
550 GLsizei bufsize, 900 GLsizei bufsize,
551 GLsizei* length, 901 GLsizei* length,
552 GLint64* params) { 902 GLint64* params) {
903 NOTIMPLEMENTED();
904 // TODO(geofflang): new-style getter
905 // TODO(geofflang): missing glGetBufferParameteri64v?
906 // glGetBufferParameteri64v(target, pname, params);
907 *length = 1;
553 return error::kNoError; 908 return error::kNoError;
554 } 909 }
555 910
556 error::Error GLES2DecoderPassthroughImpl::DoGetBufferParameteriv( 911 error::Error GLES2DecoderPassthroughImpl::DoGetBufferParameteriv(
557 GLenum target, 912 GLenum target,
558 GLenum pname, 913 GLenum pname,
559 GLsizei bufsize, 914 GLsizei bufsize,
560 GLsizei* length, 915 GLsizei* length,
561 GLint* params) { 916 GLint* params) {
917 // TODO(geofflang): new-style getter
918 glGetBufferParameteriv(target, pname, params);
919 *length = 1;
562 return error::kNoError; 920 return error::kNoError;
563 } 921 }
564 922
565 error::Error GLES2DecoderPassthroughImpl::DoGetError(uint32_t* result) { 923 error::Error GLES2DecoderPassthroughImpl::DoGetError(uint32_t* result) {
924 *result = glGetError();
566 return error::kNoError; 925 return error::kNoError;
567 } 926 }
568 927
569 error::Error GLES2DecoderPassthroughImpl::DoGetFloatv(GLenum pname, 928 error::Error GLES2DecoderPassthroughImpl::DoGetFloatv(GLenum pname,
570 GLsizei bufsize, 929 GLsizei bufsize,
571 GLsizei* length, 930 GLsizei* length,
572 GLfloat* params) { 931 GLfloat* params) {
932 // TODO(geofflang): new-style getter
933 glGetFloatv(pname, params);
934 *length = 1;
573 return error::kNoError; 935 return error::kNoError;
574 } 936 }
575 937
576 error::Error GLES2DecoderPassthroughImpl::DoGetFragDataLocation( 938 error::Error GLES2DecoderPassthroughImpl::DoGetFragDataLocation(
577 GLuint program, 939 GLuint program,
578 const char* name, 940 const char* name,
579 GLint* result) { 941 GLint* result) {
942 NOTIMPLEMENTED();
580 return error::kNoError; 943 return error::kNoError;
581 } 944 }
582 945
583 error::Error GLES2DecoderPassthroughImpl::DoGetFramebufferAttachmentParameteriv( 946 error::Error GLES2DecoderPassthroughImpl::DoGetFramebufferAttachmentParameteriv(
584 GLenum target, 947 GLenum target,
585 GLenum attachment, 948 GLenum attachment,
586 GLenum pname, 949 GLenum pname,
587 GLsizei bufsize, 950 GLsizei bufsize,
588 GLsizei* length, 951 GLsizei* length,
589 GLint* params) { 952 GLint* params) {
953 // TODO(geofflang): new-style getter
954 glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params);
955 *length = 1;
590 return error::kNoError; 956 return error::kNoError;
591 } 957 }
592 958
593 error::Error GLES2DecoderPassthroughImpl::DoGetInteger64v(GLenum pname, 959 error::Error GLES2DecoderPassthroughImpl::DoGetInteger64v(GLenum pname,
594 GLsizei bufsize, 960 GLsizei bufsize,
595 GLsizei* length, 961 GLsizei* length,
596 GLint64* params) { 962 GLint64* params) {
963 // TODO(geofflang): new-style getter
964 glGetInteger64v(pname, params);
965 *length = 1;
597 return error::kNoError; 966 return error::kNoError;
598 } 967 }
599 968
600 error::Error GLES2DecoderPassthroughImpl::DoGetIntegeri_v(GLenum pname, 969 error::Error GLES2DecoderPassthroughImpl::DoGetIntegeri_v(GLenum pname,
601 GLuint index, 970 GLuint index,
602 GLsizei bufsize, 971 GLsizei bufsize,
603 GLsizei* length, 972 GLsizei* length,
604 GLint* data) { 973 GLint* data) {
974 // TODO(geofflang): new-style getter
975 glGetIntegeri_v(pname, index, data);
976 *length = 1;
605 return error::kNoError; 977 return error::kNoError;
606 } 978 }
607 979
608 error::Error GLES2DecoderPassthroughImpl::DoGetInteger64i_v(GLenum pname, 980 error::Error GLES2DecoderPassthroughImpl::DoGetInteger64i_v(GLenum pname,
609 GLuint index, 981 GLuint index,
610 GLsizei bufsize, 982 GLsizei bufsize,
611 GLsizei* length, 983 GLsizei* length,
612 GLint64* data) { 984 GLint64* data) {
985 // TODO(geofflang): new-style getter
986 glGetInteger64i_v(pname, index, data);
987 *length = 1;
613 return error::kNoError; 988 return error::kNoError;
614 } 989 }
615 990
616 error::Error GLES2DecoderPassthroughImpl::DoGetIntegerv(GLenum pname, 991 error::Error GLES2DecoderPassthroughImpl::DoGetIntegerv(GLenum pname,
617 GLsizei bufsize, 992 GLsizei bufsize,
618 GLsizei* length, 993 GLsizei* length,
619 GLint* params) { 994 GLint* params) {
995 // TODO(geofflang): new-style getter
996 glGetIntegerv(pname, params);
997 *length = 1;
998 // HACK: WebGL initialization requires this query
999 if (pname == GL_MAX_VIEWPORT_DIMS) {
1000 *length = 2;
1001 }
620 return error::kNoError; 1002 return error::kNoError;
621 } 1003 }
622 1004
623 error::Error GLES2DecoderPassthroughImpl::DoGetInternalformativ(GLenum target, 1005 error::Error GLES2DecoderPassthroughImpl::DoGetInternalformativ(GLenum target,
624 GLenum format, 1006 GLenum format,
625 GLenum pname, 1007 GLenum pname,
626 GLsizei bufSize, 1008 GLsizei bufSize,
627 GLsizei* length, 1009 GLsizei* length,
628 GLint* params) { 1010 GLint* params) {
1011 // TODO(geofflang): new-style getter
1012 glGetInternalformativ(target, format, pname, bufSize, params);
1013 *length = 1;
629 return error::kNoError; 1014 return error::kNoError;
630 } 1015 }
631 1016
632 error::Error GLES2DecoderPassthroughImpl::DoGetProgramiv(GLuint program, 1017 error::Error GLES2DecoderPassthroughImpl::DoGetProgramiv(GLuint program,
633 GLenum pname, 1018 GLenum pname,
634 GLsizei bufsize, 1019 GLsizei bufsize,
635 GLsizei* length, 1020 GLsizei* length,
636 GLint* params) { 1021 GLint* params) {
1022 // TODO(geofflang): new-style getter
1023 glGetProgramiv(GetProgramServiceID(program, resources_), pname, params);
1024 *length = 1;
637 return error::kNoError; 1025 return error::kNoError;
638 } 1026 }
639 1027
640 error::Error GLES2DecoderPassthroughImpl::DoGetProgramInfoLog( 1028 error::Error GLES2DecoderPassthroughImpl::DoGetProgramInfoLog(
641 GLuint program, 1029 GLuint program,
642 std::string* infolog) { 1030 std::string* infolog) {
1031 GLint info_log_len = 0;
1032 glGetProgramiv(GetProgramServiceID(program, resources_), GL_INFO_LOG_LENGTH,
1033 &info_log_len);
1034
1035 std::vector<char> buffer(info_log_len, 0);
1036 glGetProgramInfoLog(GetProgramServiceID(program, resources_), info_log_len,
1037 nullptr, buffer.data());
1038 *infolog = std::string(buffer.data());
643 return error::kNoError; 1039 return error::kNoError;
644 } 1040 }
645 1041
646 error::Error GLES2DecoderPassthroughImpl::DoGetRenderbufferParameteriv( 1042 error::Error GLES2DecoderPassthroughImpl::DoGetRenderbufferParameteriv(
647 GLenum target, 1043 GLenum target,
648 GLenum pname, 1044 GLenum pname,
649 GLsizei bufsize, 1045 GLsizei bufsize,
650 GLsizei* length, 1046 GLsizei* length,
651 GLint* params) { 1047 GLint* params) {
1048 NOTIMPLEMENTED();
652 return error::kNoError; 1049 return error::kNoError;
653 } 1050 }
654 1051
655 error::Error GLES2DecoderPassthroughImpl::DoGetSamplerParameterfv( 1052 error::Error GLES2DecoderPassthroughImpl::DoGetSamplerParameterfv(
656 GLuint sampler, 1053 GLuint sampler,
657 GLenum pname, 1054 GLenum pname,
658 GLsizei bufsize, 1055 GLsizei bufsize,
659 GLsizei* length, 1056 GLsizei* length,
660 GLfloat* params) { 1057 GLfloat* params) {
1058 // TODO(geofflang): new-style getter
1059 glGetSamplerParameterfv(GetSamplerServiceID(sampler, resources_), pname,
1060 params);
1061 *length = 1;
661 return error::kNoError; 1062 return error::kNoError;
662 } 1063 }
663 1064
664 error::Error GLES2DecoderPassthroughImpl::DoGetSamplerParameteriv( 1065 error::Error GLES2DecoderPassthroughImpl::DoGetSamplerParameteriv(
665 GLuint sampler, 1066 GLuint sampler,
666 GLenum pname, 1067 GLenum pname,
667 GLsizei bufsize, 1068 GLsizei bufsize,
668 GLsizei* length, 1069 GLsizei* length,
669 GLint* params) { 1070 GLint* params) {
1071 NOTIMPLEMENTED();
1072 // TODO(geofflang): new-style getter
1073 // glGetRenderbufferParameterivEXT(target, pname, params);
1074 *length = 1;
670 return error::kNoError; 1075 return error::kNoError;
671 } 1076 }
672 1077
673 error::Error GLES2DecoderPassthroughImpl::DoGetShaderiv(GLuint shader, 1078 error::Error GLES2DecoderPassthroughImpl::DoGetShaderiv(GLuint shader,
674 GLenum pname, 1079 GLenum pname,
675 GLsizei bufsize, 1080 GLsizei bufsize,
676 GLsizei* length, 1081 GLsizei* length,
677 GLint* params) { 1082 GLint* params) {
1083 // TODO(geofflang): new-style getter
1084 glGetShaderiv(GetShaderServiceID(shader, resources_), pname, params);
1085 *length = 1;
678 return error::kNoError; 1086 return error::kNoError;
679 } 1087 }
680 1088
681 error::Error GLES2DecoderPassthroughImpl::DoGetShaderInfoLog( 1089 error::Error GLES2DecoderPassthroughImpl::DoGetShaderInfoLog(
682 GLuint shader, 1090 GLuint shader,
683 std::string* infolog) { 1091 std::string* infolog) {
1092 GLuint service_id = GetShaderServiceID(shader, resources_);
1093 GLint info_log_len = 0;
1094 glGetShaderiv(service_id, GL_INFO_LOG_LENGTH, &info_log_len);
1095 std::vector<char> buffer(info_log_len, 0);
1096 glGetShaderInfoLog(service_id, info_log_len, nullptr, buffer.data());
1097 *infolog = std::string(buffer.data());
684 return error::kNoError; 1098 return error::kNoError;
685 } 1099 }
686 1100
687 error::Error GLES2DecoderPassthroughImpl::DoGetShaderPrecisionFormat( 1101 error::Error GLES2DecoderPassthroughImpl::DoGetShaderPrecisionFormat(
688 GLenum shadertype, 1102 GLenum shadertype,
689 GLenum precisiontype, 1103 GLenum precisiontype,
690 GLint* range, 1104 GLint* range,
691 GLint* precision) { 1105 GLint* precision) {
1106 glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
692 return error::kNoError; 1107 return error::kNoError;
693 } 1108 }
694 1109
695 error::Error GLES2DecoderPassthroughImpl::DoGetShaderSource( 1110 error::Error GLES2DecoderPassthroughImpl::DoGetShaderSource(
696 GLuint shader, 1111 GLuint shader,
697 std::string* source) { 1112 std::string* source) {
1113 NOTIMPLEMENTED();
698 return error::kNoError; 1114 return error::kNoError;
699 } 1115 }
700 1116
701 error::Error GLES2DecoderPassthroughImpl::DoGetString(GLenum name, 1117 error::Error GLES2DecoderPassthroughImpl::DoGetString(GLenum name,
702 const char** result) { 1118 const char** result) {
1119 // TODO(geofflang): Append additional CHROMIUM extension strings?
1120 *result = reinterpret_cast<const char*>(glGetString(name));
703 return error::kNoError; 1121 return error::kNoError;
704 } 1122 }
705 1123
706 error::Error GLES2DecoderPassthroughImpl::DoGetSynciv(GLuint sync, 1124 error::Error GLES2DecoderPassthroughImpl::DoGetSynciv(GLuint sync,
707 GLenum pname, 1125 GLenum pname,
708 GLsizei bufsize, 1126 GLsizei bufsize,
709 GLsizei* length, 1127 GLsizei* length,
710 GLint* values) { 1128 GLint* values) {
1129 glGetSynciv(GetSyncServiceID(sync, resources_), pname, bufsize, length,
1130 values);
711 return error::kNoError; 1131 return error::kNoError;
712 } 1132 }
713 1133
714 error::Error GLES2DecoderPassthroughImpl::DoGetTexParameterfv(GLenum target, 1134 error::Error GLES2DecoderPassthroughImpl::DoGetTexParameterfv(GLenum target,
715 GLenum pname, 1135 GLenum pname,
716 GLsizei bufsize, 1136 GLsizei bufsize,
717 GLsizei* length, 1137 GLsizei* length,
718 GLfloat* params) { 1138 GLfloat* params) {
1139 // TODO(geofflang): new-style getter
1140 glGetTexParameterfv(target, pname, params);
1141 *length = 1;
719 return error::kNoError; 1142 return error::kNoError;
720 } 1143 }
721 1144
722 error::Error GLES2DecoderPassthroughImpl::DoGetTexParameteriv(GLenum target, 1145 error::Error GLES2DecoderPassthroughImpl::DoGetTexParameteriv(GLenum target,
723 GLenum pname, 1146 GLenum pname,
724 GLsizei bufsize, 1147 GLsizei bufsize,
725 GLsizei* length, 1148 GLsizei* length,
726 GLint* params) { 1149 GLint* params) {
1150 // TODO(geofflang): new-style getter
1151 glGetTexParameteriv(target, pname, params);
1152 *length = 1;
727 return error::kNoError; 1153 return error::kNoError;
728 } 1154 }
729 1155
730 error::Error GLES2DecoderPassthroughImpl::DoGetTransformFeedbackVarying( 1156 error::Error GLES2DecoderPassthroughImpl::DoGetTransformFeedbackVarying(
731 GLuint program, 1157 GLuint program,
732 GLuint index, 1158 GLuint index,
733 GLsizei* size, 1159 GLsizei* size,
734 GLenum* type, 1160 GLenum* type,
735 std::string* name) { 1161 std::string* name) {
1162 NOTIMPLEMENTED();
736 return error::kNoError; 1163 return error::kNoError;
737 } 1164 }
738 1165
739 error::Error GLES2DecoderPassthroughImpl::DoGetUniformBlockIndex( 1166 error::Error GLES2DecoderPassthroughImpl::DoGetUniformBlockIndex(
740 GLuint program, 1167 GLuint program,
741 const char* name, 1168 const char* name,
742 GLint* index) { 1169 GLint* index) {
1170 NOTIMPLEMENTED();
743 return error::kNoError; 1171 return error::kNoError;
744 } 1172 }
745 1173
746 error::Error GLES2DecoderPassthroughImpl::DoGetUniformfv(GLuint program, 1174 error::Error GLES2DecoderPassthroughImpl::DoGetUniformfv(GLuint program,
747 GLint location, 1175 GLint location,
748 GLsizei bufsize, 1176 GLsizei bufsize,
749 GLsizei* length, 1177 GLsizei* length,
750 GLfloat* params) { 1178 GLfloat* params) {
1179 // TODO(geofflang): new-style getter
1180 glGetUniformfv(GetProgramServiceID(program, resources_), location, params);
1181 *length = 1;
751 return error::kNoError; 1182 return error::kNoError;
752 } 1183 }
753 1184
754 error::Error GLES2DecoderPassthroughImpl::DoGetUniformiv(GLuint program, 1185 error::Error GLES2DecoderPassthroughImpl::DoGetUniformiv(GLuint program,
755 GLint location, 1186 GLint location,
756 GLsizei bufsize, 1187 GLsizei bufsize,
757 GLsizei* length, 1188 GLsizei* length,
758 GLint* params) { 1189 GLint* params) {
1190 // TODO(geofflang): new-style getter
1191 glGetUniformiv(GetProgramServiceID(program, resources_), location, params);
1192 *length = 1;
759 return error::kNoError; 1193 return error::kNoError;
760 } 1194 }
761 1195
762 error::Error GLES2DecoderPassthroughImpl::DoGetUniformuiv(GLuint program, 1196 error::Error GLES2DecoderPassthroughImpl::DoGetUniformuiv(GLuint program,
763 GLint location, 1197 GLint location,
764 GLsizei bufsize, 1198 GLsizei bufsize,
765 GLsizei* length, 1199 GLsizei* length,
766 GLuint* params) { 1200 GLuint* params) {
1201 // TODO(geofflang): new-style getter
1202 glGetUniformuiv(GetProgramServiceID(program, resources_), location, params);
1203 *length = 1;
767 return error::kNoError; 1204 return error::kNoError;
768 } 1205 }
769 1206
770 error::Error GLES2DecoderPassthroughImpl::DoGetUniformIndices( 1207 error::Error GLES2DecoderPassthroughImpl::DoGetUniformIndices(
771 GLuint program, 1208 GLuint program,
772 GLsizei count, 1209 GLsizei count,
773 const char* const* names, 1210 const char* const* names,
774 GLsizei bufSize, 1211 GLsizei bufSize,
775 GLsizei* length, 1212 GLsizei* length,
776 GLuint* indices) { 1213 GLuint* indices) {
1214 NOTIMPLEMENTED();
777 return error::kNoError; 1215 return error::kNoError;
778 } 1216 }
779 1217
780 error::Error GLES2DecoderPassthroughImpl::DoGetUniformLocation( 1218 error::Error GLES2DecoderPassthroughImpl::DoGetUniformLocation(
781 GLuint program, 1219 GLuint program,
782 const char* name, 1220 const char* name,
783 GLint* location) { 1221 GLint* location) {
1222 *location =
1223 glGetUniformLocation(GetProgramServiceID(program, resources_), name);
784 return error::kNoError; 1224 return error::kNoError;
785 } 1225 }
786 1226
787 error::Error GLES2DecoderPassthroughImpl::DoGetVertexAttribfv(GLuint index, 1227 error::Error GLES2DecoderPassthroughImpl::DoGetVertexAttribfv(GLuint index,
788 GLenum pname, 1228 GLenum pname,
789 GLsizei bufsize, 1229 GLsizei bufsize,
790 GLsizei* length, 1230 GLsizei* length,
791 GLfloat* params) { 1231 GLfloat* params) {
1232 NOTIMPLEMENTED();
792 return error::kNoError; 1233 return error::kNoError;
793 } 1234 }
794 1235
795 error::Error GLES2DecoderPassthroughImpl::DoGetVertexAttribiv(GLuint index, 1236 error::Error GLES2DecoderPassthroughImpl::DoGetVertexAttribiv(GLuint index,
796 GLenum pname, 1237 GLenum pname,
797 GLsizei bufsize, 1238 GLsizei bufsize,
798 GLsizei* length, 1239 GLsizei* length,
799 GLint* params) { 1240 GLint* params) {
1241 NOTIMPLEMENTED();
800 return error::kNoError; 1242 return error::kNoError;
801 } 1243 }
802 1244
803 error::Error GLES2DecoderPassthroughImpl::DoGetVertexAttribIiv(GLuint index, 1245 error::Error GLES2DecoderPassthroughImpl::DoGetVertexAttribIiv(GLuint index,
804 GLenum pname, 1246 GLenum pname,
805 GLsizei bufsize, 1247 GLsizei bufsize,
806 GLsizei* length, 1248 GLsizei* length,
807 GLint* params) { 1249 GLint* params) {
1250 NOTIMPLEMENTED();
808 return error::kNoError; 1251 return error::kNoError;
809 } 1252 }
810 1253
811 error::Error GLES2DecoderPassthroughImpl::DoGetVertexAttribIuiv( 1254 error::Error GLES2DecoderPassthroughImpl::DoGetVertexAttribIuiv(
812 GLuint index, 1255 GLuint index,
813 GLenum pname, 1256 GLenum pname,
814 GLsizei bufsize, 1257 GLsizei bufsize,
815 GLsizei* length, 1258 GLsizei* length,
816 GLuint* params) { 1259 GLuint* params) {
1260 NOTIMPLEMENTED();
817 return error::kNoError; 1261 return error::kNoError;
818 } 1262 }
819 1263
820 error::Error GLES2DecoderPassthroughImpl::DoGetVertexAttribPointerv( 1264 error::Error GLES2DecoderPassthroughImpl::DoGetVertexAttribPointerv(
821 GLuint index, 1265 GLuint index,
822 GLenum pname, 1266 GLenum pname,
823 GLsizei bufsize, 1267 GLsizei bufsize,
824 GLsizei* length, 1268 GLsizei* length,
825 GLuint* pointer) { 1269 GLuint* pointer) {
1270 NOTIMPLEMENTED();
826 return error::kNoError; 1271 return error::kNoError;
827 } 1272 }
828 1273
829 error::Error GLES2DecoderPassthroughImpl::DoHint(GLenum target, GLenum mode) { 1274 error::Error GLES2DecoderPassthroughImpl::DoHint(GLenum target, GLenum mode) {
1275 glHint(target, mode);
830 return error::kNoError; 1276 return error::kNoError;
831 } 1277 }
832 1278
833 error::Error GLES2DecoderPassthroughImpl::DoInvalidateFramebuffer( 1279 error::Error GLES2DecoderPassthroughImpl::DoInvalidateFramebuffer(
834 GLenum target, 1280 GLenum target,
835 GLsizei count, 1281 GLsizei count,
836 const volatile GLenum* attachments) { 1282 const volatile GLenum* attachments) {
1283 std::vector<GLenum> attachments_copy(attachments, attachments + count);
1284 glInvalidateFramebuffer(target, count, attachments_copy.data());
837 return error::kNoError; 1285 return error::kNoError;
838 } 1286 }
839 1287
840 error::Error GLES2DecoderPassthroughImpl::DoInvalidateSubFramebuffer( 1288 error::Error GLES2DecoderPassthroughImpl::DoInvalidateSubFramebuffer(
841 GLenum target, 1289 GLenum target,
842 GLsizei count, 1290 GLsizei count,
843 const volatile GLenum* attachments, 1291 const volatile GLenum* attachments,
844 GLint x, 1292 GLint x,
845 GLint y, 1293 GLint y,
846 GLsizei width, 1294 GLsizei width,
847 GLsizei height) { 1295 GLsizei height) {
1296 std::vector<GLenum> attachments_copy(attachments, attachments + count);
1297 glInvalidateSubFramebuffer(target, count, attachments_copy.data(), x, y,
1298 width, height);
848 return error::kNoError; 1299 return error::kNoError;
849 } 1300 }
850 1301
851 error::Error GLES2DecoderPassthroughImpl::DoIsBuffer(GLuint buffer, 1302 error::Error GLES2DecoderPassthroughImpl::DoIsBuffer(GLuint buffer,
852 uint32_t* result) { 1303 uint32_t* result) {
1304 NOTIMPLEMENTED();
1305 *result = glIsBuffer(GetBufferServiceID(buffer, resources_, false));
853 return error::kNoError; 1306 return error::kNoError;
854 } 1307 }
855 1308
856 error::Error GLES2DecoderPassthroughImpl::DoIsEnabled(GLenum cap, 1309 error::Error GLES2DecoderPassthroughImpl::DoIsEnabled(GLenum cap,
857 uint32_t* result) { 1310 uint32_t* result) {
1311 *result = glIsEnabled(cap);
858 return error::kNoError; 1312 return error::kNoError;
859 } 1313 }
860 1314
861 error::Error GLES2DecoderPassthroughImpl::DoIsFramebuffer(GLuint framebuffer, 1315 error::Error GLES2DecoderPassthroughImpl::DoIsFramebuffer(GLuint framebuffer,
862 uint32_t* result) { 1316 uint32_t* result) {
1317 *result = glIsFramebufferEXT(
1318 GetFramebufferServiceID(framebuffer, &framebuffer_id_map_, false));
863 return error::kNoError; 1319 return error::kNoError;
864 } 1320 }
865 1321
866 error::Error GLES2DecoderPassthroughImpl::DoIsProgram(GLuint program, 1322 error::Error GLES2DecoderPassthroughImpl::DoIsProgram(GLuint program,
867 uint32_t* result) { 1323 uint32_t* result) {
1324 *result = glIsProgram(GetProgramServiceID(program, resources_));
868 return error::kNoError; 1325 return error::kNoError;
869 } 1326 }
870 1327
871 error::Error GLES2DecoderPassthroughImpl::DoIsRenderbuffer(GLuint renderbuffer, 1328 error::Error GLES2DecoderPassthroughImpl::DoIsRenderbuffer(GLuint renderbuffer,
872 uint32_t* result) { 1329 uint32_t* result) {
1330 NOTIMPLEMENTED();
1331 *result = glIsRenderbufferEXT(
1332 GetRenderbufferServiceID(renderbuffer, resources_, false));
873 return error::kNoError; 1333 return error::kNoError;
874 } 1334 }
875 1335
876 error::Error GLES2DecoderPassthroughImpl::DoIsSampler(GLuint sampler, 1336 error::Error GLES2DecoderPassthroughImpl::DoIsSampler(GLuint sampler,
877 uint32_t* result) { 1337 uint32_t* result) {
1338 *result = glIsSampler(GetSamplerServiceID(sampler, resources_));
878 return error::kNoError; 1339 return error::kNoError;
879 } 1340 }
880 1341
881 error::Error GLES2DecoderPassthroughImpl::DoIsShader(GLuint shader, 1342 error::Error GLES2DecoderPassthroughImpl::DoIsShader(GLuint shader,
882 uint32_t* result) { 1343 uint32_t* result) {
1344 *result = glIsShader(GetShaderServiceID(shader, resources_));
883 return error::kNoError; 1345 return error::kNoError;
884 } 1346 }
885 1347
886 error::Error GLES2DecoderPassthroughImpl::DoIsSync(GLuint sync, 1348 error::Error GLES2DecoderPassthroughImpl::DoIsSync(GLuint sync,
887 uint32_t* result) { 1349 uint32_t* result) {
1350 *result = glIsSync(GetSyncServiceID(sync, resources_));
888 return error::kNoError; 1351 return error::kNoError;
889 } 1352 }
890 1353
891 error::Error GLES2DecoderPassthroughImpl::DoIsTexture(GLuint texture, 1354 error::Error GLES2DecoderPassthroughImpl::DoIsTexture(GLuint texture,
892 uint32_t* result) { 1355 uint32_t* result) {
1356 *result = glIsTexture(GetTextureServiceID(texture, resources_, false));
893 return error::kNoError; 1357 return error::kNoError;
894 } 1358 }
895 1359
896 error::Error GLES2DecoderPassthroughImpl::DoIsTransformFeedback( 1360 error::Error GLES2DecoderPassthroughImpl::DoIsTransformFeedback(
897 GLuint transformfeedback, 1361 GLuint transformfeedback,
898 uint32_t* result) { 1362 uint32_t* result) {
1363 *result = glIsTransformFeedback(GetTransformFeedbackServiceID(
1364 transformfeedback, &transform_feedback_id_map_, false));
899 return error::kNoError; 1365 return error::kNoError;
900 } 1366 }
901 1367
902 error::Error GLES2DecoderPassthroughImpl::DoLineWidth(GLfloat width) { 1368 error::Error GLES2DecoderPassthroughImpl::DoLineWidth(GLfloat width) {
1369 glLineWidth(width);
903 return error::kNoError; 1370 return error::kNoError;
904 } 1371 }
905 1372
906 error::Error GLES2DecoderPassthroughImpl::DoLinkProgram(GLuint program) { 1373 error::Error GLES2DecoderPassthroughImpl::DoLinkProgram(GLuint program) {
1374 glLinkProgram(GetProgramServiceID(program, resources_));
907 return error::kNoError; 1375 return error::kNoError;
908 } 1376 }
909 1377
910 error::Error GLES2DecoderPassthroughImpl::DoPauseTransformFeedback() { 1378 error::Error GLES2DecoderPassthroughImpl::DoPauseTransformFeedback() {
1379 glPauseTransformFeedback();
911 return error::kNoError; 1380 return error::kNoError;
912 } 1381 }
913 1382
914 error::Error GLES2DecoderPassthroughImpl::DoPixelStorei(GLenum pname, 1383 error::Error GLES2DecoderPassthroughImpl::DoPixelStorei(GLenum pname,
915 GLint param) { 1384 GLint param) {
1385 glPixelStorei(pname, param);
916 return error::kNoError; 1386 return error::kNoError;
917 } 1387 }
918 1388
919 error::Error GLES2DecoderPassthroughImpl::DoPolygonOffset(GLfloat factor, 1389 error::Error GLES2DecoderPassthroughImpl::DoPolygonOffset(GLfloat factor,
920 GLfloat units) { 1390 GLfloat units) {
1391 glPolygonOffset(factor, units);
921 return error::kNoError; 1392 return error::kNoError;
922 } 1393 }
923 1394
924 error::Error GLES2DecoderPassthroughImpl::DoReadBuffer(GLenum src) { 1395 error::Error GLES2DecoderPassthroughImpl::DoReadBuffer(GLenum src) {
1396 glReadBuffer(src);
925 return error::kNoError; 1397 return error::kNoError;
926 } 1398 }
927 1399
928 error::Error GLES2DecoderPassthroughImpl::DoReadPixels(GLint x, 1400 error::Error GLES2DecoderPassthroughImpl::DoReadPixels(GLint x,
929 GLint y, 1401 GLint y,
930 GLsizei width, 1402 GLsizei width,
931 GLsizei height, 1403 GLsizei height,
932 GLenum format, 1404 GLenum format,
933 GLenum type, 1405 GLenum type,
934 GLsizei bufsize, 1406 GLsizei bufsize,
935 GLsizei* length, 1407 GLsizei* length,
936 void* pixels) { 1408 void* pixels) {
1409 glReadPixels(x, y, width, height, format, type, pixels);
1410
1411 // HACK: Calculate the length here without taking into account the unpack
1412 // parameters.
1413 // Move into an ANGLE extension.
1414 size_t componentCount = 4;
1415 switch (format) {
1416 case GL_RGBA:
1417 componentCount = 4;
1418 break;
1419 case GL_RGB:
1420 componentCount = 3;
1421 break;
1422 case GL_RG:
1423 componentCount = 2;
1424 break;
1425 case GL_RED:
1426 componentCount = 1;
1427 break;
1428 }
1429 *length = width * height * componentCount * 4;
1430
937 return error::kNoError; 1431 return error::kNoError;
938 } 1432 }
939 1433
940 error::Error GLES2DecoderPassthroughImpl::DoReleaseShaderCompiler() { 1434 error::Error GLES2DecoderPassthroughImpl::DoReleaseShaderCompiler() {
1435 glReleaseShaderCompiler();
941 return error::kNoError; 1436 return error::kNoError;
942 } 1437 }
943 1438
944 error::Error GLES2DecoderPassthroughImpl::DoRenderbufferStorage( 1439 error::Error GLES2DecoderPassthroughImpl::DoRenderbufferStorage(
945 GLenum target, 1440 GLenum target,
946 GLenum internalformat, 1441 GLenum internalformat,
947 GLsizei width, 1442 GLsizei width,
948 GLsizei height) { 1443 GLsizei height) {
1444 glRenderbufferStorageEXT(target, internalformat, width, height);
949 return error::kNoError; 1445 return error::kNoError;
950 } 1446 }
951 1447
952 error::Error GLES2DecoderPassthroughImpl::DoResumeTransformFeedback() { 1448 error::Error GLES2DecoderPassthroughImpl::DoResumeTransformFeedback() {
1449 glResumeTransformFeedback();
953 return error::kNoError; 1450 return error::kNoError;
954 } 1451 }
955 1452
956 error::Error GLES2DecoderPassthroughImpl::DoSampleCoverage(GLclampf value, 1453 error::Error GLES2DecoderPassthroughImpl::DoSampleCoverage(GLclampf value,
957 GLboolean invert) { 1454 GLboolean invert) {
1455 glSampleCoverage(value, invert);
958 return error::kNoError; 1456 return error::kNoError;
959 } 1457 }
960 1458
961 error::Error GLES2DecoderPassthroughImpl::DoSamplerParameterf(GLuint sampler, 1459 error::Error GLES2DecoderPassthroughImpl::DoSamplerParameterf(GLuint sampler,
962 GLenum pname, 1460 GLenum pname,
963 GLfloat param) { 1461 GLfloat param) {
1462 glSamplerParameterf(GetSamplerServiceID(sampler, resources_), pname, param);
964 return error::kNoError; 1463 return error::kNoError;
965 } 1464 }
966 1465
967 error::Error GLES2DecoderPassthroughImpl::DoSamplerParameterfv( 1466 error::Error GLES2DecoderPassthroughImpl::DoSamplerParameterfv(
968 GLuint sampler, 1467 GLuint sampler,
969 GLenum pname, 1468 GLenum pname,
970 const volatile GLfloat* params) { 1469 const volatile GLfloat* params) {
1470 // TODO(geofflang): new-style setter, needs to make only one copy
1471 glSamplerParameterfv(GetSamplerServiceID(sampler, resources_), pname,
1472 const_cast<const GLfloat*>(params));
971 return error::kNoError; 1473 return error::kNoError;
972 } 1474 }
973 1475
974 error::Error GLES2DecoderPassthroughImpl::DoSamplerParameteri(GLuint sampler, 1476 error::Error GLES2DecoderPassthroughImpl::DoSamplerParameteri(GLuint sampler,
975 GLenum pname, 1477 GLenum pname,
976 GLint param) { 1478 GLint param) {
1479 glSamplerParameteri(GetSamplerServiceID(sampler, resources_), pname, param);
977 return error::kNoError; 1480 return error::kNoError;
978 } 1481 }
979 1482
980 error::Error GLES2DecoderPassthroughImpl::DoSamplerParameteriv( 1483 error::Error GLES2DecoderPassthroughImpl::DoSamplerParameteriv(
981 GLuint sampler, 1484 GLuint sampler,
982 GLenum pname, 1485 GLenum pname,
983 const volatile GLint* params) { 1486 const volatile GLint* params) {
1487 // TODO(geofflang): new-style setter, needs to make only one copy
1488 glSamplerParameteriv(GetSamplerServiceID(sampler, resources_), pname,
1489 const_cast<const GLint*>(params));
984 return error::kNoError; 1490 return error::kNoError;
985 } 1491 }
986 1492
987 error::Error GLES2DecoderPassthroughImpl::DoScissor(GLint x, 1493 error::Error GLES2DecoderPassthroughImpl::DoScissor(GLint x,
988 GLint y, 1494 GLint y,
989 GLsizei width, 1495 GLsizei width,
990 GLsizei height) { 1496 GLsizei height) {
991 glScissor(x, y, width, height); 1497 glScissor(x, y, width, height);
992 return error::kNoError; 1498 return error::kNoError;
993 } 1499 }
994 1500
995 error::Error GLES2DecoderPassthroughImpl::DoShaderBinary(GLsizei n, 1501 error::Error GLES2DecoderPassthroughImpl::DoShaderBinary(GLsizei n,
996 const GLuint* shaders, 1502 const GLuint* shaders,
997 GLenum binaryformat, 1503 GLenum binaryformat,
998 const void* binary, 1504 const void* binary,
999 GLsizei length) { 1505 GLsizei length) {
1506 NOTIMPLEMENTED();
1000 return error::kNoError; 1507 return error::kNoError;
1001 } 1508 }
1002 1509
1003 error::Error GLES2DecoderPassthroughImpl::DoShaderSource(GLuint shader, 1510 error::Error GLES2DecoderPassthroughImpl::DoShaderSource(GLuint shader,
1004 GLsizei count, 1511 GLsizei count,
1005 const char** string, 1512 const char** string,
1006 const GLint* length) { 1513 const GLint* length) {
1514 glShaderSource(GetShaderServiceID(shader, resources_), count, string, length);
1007 return error::kNoError; 1515 return error::kNoError;
1008 } 1516 }
1009 1517
1010 error::Error GLES2DecoderPassthroughImpl::DoStencilFunc(GLenum func, 1518 error::Error GLES2DecoderPassthroughImpl::DoStencilFunc(GLenum func,
1011 GLint ref, 1519 GLint ref,
1012 GLuint mask) { 1520 GLuint mask) {
1521 glStencilFunc(func, ref, mask);
1013 return error::kNoError; 1522 return error::kNoError;
1014 } 1523 }
1015 1524
1016 error::Error GLES2DecoderPassthroughImpl::DoStencilFuncSeparate(GLenum face, 1525 error::Error GLES2DecoderPassthroughImpl::DoStencilFuncSeparate(GLenum face,
1017 GLenum func, 1526 GLenum func,
1018 GLint ref, 1527 GLint ref,
1019 GLuint mask) { 1528 GLuint mask) {
1529 glStencilFuncSeparate(face, func, ref, mask);
1020 return error::kNoError; 1530 return error::kNoError;
1021 } 1531 }
1022 1532
1023 error::Error GLES2DecoderPassthroughImpl::DoStencilMask(GLuint mask) { 1533 error::Error GLES2DecoderPassthroughImpl::DoStencilMask(GLuint mask) {
1534 glStencilMask(mask);
1024 return error::kNoError; 1535 return error::kNoError;
1025 } 1536 }
1026 1537
1027 error::Error GLES2DecoderPassthroughImpl::DoStencilMaskSeparate(GLenum face, 1538 error::Error GLES2DecoderPassthroughImpl::DoStencilMaskSeparate(GLenum face,
1028 GLuint mask) { 1539 GLuint mask) {
1540 glStencilMaskSeparate(face, mask);
1029 return error::kNoError; 1541 return error::kNoError;
1030 } 1542 }
1031 1543
1032 error::Error GLES2DecoderPassthroughImpl::DoStencilOp(GLenum fail, 1544 error::Error GLES2DecoderPassthroughImpl::DoStencilOp(GLenum fail,
1033 GLenum zfail, 1545 GLenum zfail,
1034 GLenum zpass) { 1546 GLenum zpass) {
1547 glStencilOp(fail, zfail, zpass);
1035 return error::kNoError; 1548 return error::kNoError;
1036 } 1549 }
1037 1550
1038 error::Error GLES2DecoderPassthroughImpl::DoStencilOpSeparate(GLenum face, 1551 error::Error GLES2DecoderPassthroughImpl::DoStencilOpSeparate(GLenum face,
1039 GLenum fail, 1552 GLenum fail,
1040 GLenum zfail, 1553 GLenum zfail,
1041 GLenum zpass) { 1554 GLenum zpass) {
1555 glStencilOpSeparate(face, fail, zfail, zpass);
1042 return error::kNoError; 1556 return error::kNoError;
1043 } 1557 }
1044 1558
1045 error::Error GLES2DecoderPassthroughImpl::DoTexImage2D(GLenum target, 1559 error::Error GLES2DecoderPassthroughImpl::DoTexImage2D(GLenum target,
1046 GLint level, 1560 GLint level,
1047 GLint internalformat, 1561 GLint internalformat,
1048 GLsizei width, 1562 GLsizei width,
1049 GLsizei height, 1563 GLsizei height,
1050 GLint border, 1564 GLint border,
1051 GLenum format, 1565 GLenum format,
1052 GLenum type, 1566 GLenum type,
1053 GLsizei imagesize, 1567 GLsizei imagesize,
1054 const void* pixels) { 1568 const void* pixels) {
1569 // TODO(geofflang): validate using imagesize
1570 glTexImage2D(target, level, internalformat, width, height, border, format,
1571 type, pixels);
1055 return error::kNoError; 1572 return error::kNoError;
1056 } 1573 }
1057 1574
1058 error::Error GLES2DecoderPassthroughImpl::DoTexImage3D(GLenum target, 1575 error::Error GLES2DecoderPassthroughImpl::DoTexImage3D(GLenum target,
1059 GLint level, 1576 GLint level,
1060 GLint internalformat, 1577 GLint internalformat,
1061 GLsizei width, 1578 GLsizei width,
1062 GLsizei height, 1579 GLsizei height,
1063 GLsizei depth, 1580 GLsizei depth,
1064 GLint border, 1581 GLint border,
1065 GLenum format, 1582 GLenum format,
1066 GLenum type, 1583 GLenum type,
1067 GLsizei imagesize, 1584 GLsizei imagesize,
1068 const void* pixels) { 1585 const void* pixels) {
1586 // TODO(geofflang): validate using imagesize
1587 glTexImage3D(target, level, internalformat, width, height, depth, border,
1588 format, type, pixels);
1069 return error::kNoError; 1589 return error::kNoError;
1070 } 1590 }
1071 1591
1072 error::Error GLES2DecoderPassthroughImpl::DoTexParameterf(GLenum target, 1592 error::Error GLES2DecoderPassthroughImpl::DoTexParameterf(GLenum target,
1073 GLenum pname, 1593 GLenum pname,
1074 GLfloat param) { 1594 GLfloat param) {
1595 glTexParameterf(target, pname, param);
1075 return error::kNoError; 1596 return error::kNoError;
1076 } 1597 }
1077 1598
1078 error::Error GLES2DecoderPassthroughImpl::DoTexParameterfv( 1599 error::Error GLES2DecoderPassthroughImpl::DoTexParameterfv(
1079 GLenum target, 1600 GLenum target,
1080 GLenum pname, 1601 GLenum pname,
1081 const volatile GLfloat* params) { 1602 const volatile GLfloat* params) {
1603 // TODO(geofflang): new-style setter, needs to make only one copy
1604 glTexParameterfv(target, pname, const_cast<const GLfloat*>(params));
1082 return error::kNoError; 1605 return error::kNoError;
1083 } 1606 }
1084 1607
1085 error::Error GLES2DecoderPassthroughImpl::DoTexParameteri(GLenum target, 1608 error::Error GLES2DecoderPassthroughImpl::DoTexParameteri(GLenum target,
1086 GLenum pname, 1609 GLenum pname,
1087 GLint param) { 1610 GLint param) {
1088 glTexParameteri(target, pname, param); 1611 glTexParameteri(target, pname, param);
1089 return error::kNoError; 1612 return error::kNoError;
1090 } 1613 }
1091 1614
1092 error::Error GLES2DecoderPassthroughImpl::DoTexParameteriv( 1615 error::Error GLES2DecoderPassthroughImpl::DoTexParameteriv(
1093 GLenum target, 1616 GLenum target,
1094 GLenum pname, 1617 GLenum pname,
1095 const volatile GLint* params) { 1618 const volatile GLint* params) {
1619 // TODO(geofflang): new-style setter, needs to make only one copy
1620 glTexParameteriv(target, pname, const_cast<const GLint*>(params));
1096 return error::kNoError; 1621 return error::kNoError;
1097 } 1622 }
1098 1623
1099 error::Error GLES2DecoderPassthroughImpl::DoTexStorage3D(GLenum target, 1624 error::Error GLES2DecoderPassthroughImpl::DoTexStorage3D(GLenum target,
1100 GLsizei levels, 1625 GLsizei levels,
1101 GLenum internalFormat, 1626 GLenum internalFormat,
1102 GLsizei width, 1627 GLsizei width,
1103 GLsizei height, 1628 GLsizei height,
1104 GLsizei depth) { 1629 GLsizei depth) {
1630 glTexStorage3D(target, levels, internalFormat, width, height, depth);
1105 return error::kNoError; 1631 return error::kNoError;
1106 } 1632 }
1107 1633
1108 error::Error GLES2DecoderPassthroughImpl::DoTexSubImage2D(GLenum target, 1634 error::Error GLES2DecoderPassthroughImpl::DoTexSubImage2D(GLenum target,
1109 GLint level, 1635 GLint level,
1110 GLint xoffset, 1636 GLint xoffset,
1111 GLint yoffset, 1637 GLint yoffset,
1112 GLsizei width, 1638 GLsizei width,
1113 GLsizei height, 1639 GLsizei height,
1114 GLenum format, 1640 GLenum format,
1115 GLenum type, 1641 GLenum type,
1116 GLsizei imagesize, 1642 GLsizei imagesize,
1117 const void* pixels) { 1643 const void* pixels) {
1644 // TODO(geofflang): validate using imagesize
1645 glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type,
1646 pixels);
1118 return error::kNoError; 1647 return error::kNoError;
1119 } 1648 }
1120 1649
1121 error::Error GLES2DecoderPassthroughImpl::DoTexSubImage3D(GLenum target, 1650 error::Error GLES2DecoderPassthroughImpl::DoTexSubImage3D(GLenum target,
1122 GLint level, 1651 GLint level,
1123 GLint xoffset, 1652 GLint xoffset,
1124 GLint yoffset, 1653 GLint yoffset,
1125 GLint zoffset, 1654 GLint zoffset,
1126 GLsizei width, 1655 GLsizei width,
1127 GLsizei height, 1656 GLsizei height,
1128 GLsizei depth, 1657 GLsizei depth,
1129 GLenum format, 1658 GLenum format,
1130 GLenum type, 1659 GLenum type,
1131 GLsizei imagesize, 1660 GLsizei imagesize,
1132 const void* pixels) { 1661 const void* pixels) {
1662 // TODO(geofflang): validate using imagesize
1663 glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height,
1664 depth, format, type, pixels);
1133 return error::kNoError; 1665 return error::kNoError;
1134 } 1666 }
1135 1667
1136 error::Error GLES2DecoderPassthroughImpl::DoTransformFeedbackVaryings( 1668 error::Error GLES2DecoderPassthroughImpl::DoTransformFeedbackVaryings(
1137 GLuint program, 1669 GLuint program,
1138 GLsizei count, 1670 GLsizei count,
1139 const char** varyings, 1671 const char** varyings,
1140 GLenum buffermode) { 1672 GLenum buffermode) {
1673 glTransformFeedbackVaryings(GetProgramServiceID(program, resources_), count,
1674 varyings, buffermode);
1141 return error::kNoError; 1675 return error::kNoError;
1142 } 1676 }
1143 1677
1144 error::Error GLES2DecoderPassthroughImpl::DoUniform1f(GLint location, 1678 error::Error GLES2DecoderPassthroughImpl::DoUniform1f(GLint location,
1145 GLfloat x) { 1679 GLfloat x) {
1680 glUniform1f(location, x);
1146 return error::kNoError; 1681 return error::kNoError;
1147 } 1682 }
1148 1683
1149 error::Error GLES2DecoderPassthroughImpl::DoUniform1fv( 1684 error::Error GLES2DecoderPassthroughImpl::DoUniform1fv(
1150 GLint location, 1685 GLint location,
1151 GLsizei count, 1686 GLsizei count,
1152 const volatile GLfloat* v) { 1687 const volatile GLfloat* v) {
1688 glUniform1fv(location, count, const_cast<const GLfloat*>(v));
1153 return error::kNoError; 1689 return error::kNoError;
1154 } 1690 }
1155 1691
1156 error::Error GLES2DecoderPassthroughImpl::DoUniform1i(GLint location, GLint x) { 1692 error::Error GLES2DecoderPassthroughImpl::DoUniform1i(GLint location, GLint x) {
1693 glUniform1i(location, x);
1157 return error::kNoError; 1694 return error::kNoError;
1158 } 1695 }
1159 1696
1160 error::Error GLES2DecoderPassthroughImpl::DoUniform1iv( 1697 error::Error GLES2DecoderPassthroughImpl::DoUniform1iv(
1161 GLint location, 1698 GLint location,
1162 GLsizei count, 1699 GLsizei count,
1163 const volatile GLint* v) { 1700 const volatile GLint* v) {
1701 glUniform1iv(location, count, const_cast<const GLint*>(v));
1164 return error::kNoError; 1702 return error::kNoError;
1165 } 1703 }
1166 1704
1167 error::Error GLES2DecoderPassthroughImpl::DoUniform1ui(GLint location, 1705 error::Error GLES2DecoderPassthroughImpl::DoUniform1ui(GLint location,
1168 GLuint x) { 1706 GLuint x) {
1707 glUniform1ui(location, x);
1169 return error::kNoError; 1708 return error::kNoError;
1170 } 1709 }
1171 1710
1172 error::Error GLES2DecoderPassthroughImpl::DoUniform1uiv( 1711 error::Error GLES2DecoderPassthroughImpl::DoUniform1uiv(
1173 GLint location, 1712 GLint location,
1174 GLsizei count, 1713 GLsizei count,
1175 const volatile GLuint* v) { 1714 const volatile GLuint* v) {
1715 glUniform1uiv(location, count, const_cast<const GLuint*>(v));
1176 return error::kNoError; 1716 return error::kNoError;
1177 } 1717 }
1178 1718
1179 error::Error GLES2DecoderPassthroughImpl::DoUniform2f(GLint location, 1719 error::Error GLES2DecoderPassthroughImpl::DoUniform2f(GLint location,
1180 GLfloat x, 1720 GLfloat x,
1181 GLfloat y) { 1721 GLfloat y) {
1722 glUniform2f(location, x, y);
1182 return error::kNoError; 1723 return error::kNoError;
1183 } 1724 }
1184 1725
1185 error::Error GLES2DecoderPassthroughImpl::DoUniform2fv( 1726 error::Error GLES2DecoderPassthroughImpl::DoUniform2fv(
1186 GLint location, 1727 GLint location,
1187 GLsizei count, 1728 GLsizei count,
1188 const volatile GLfloat* v) { 1729 const volatile GLfloat* v) {
1730 glUniform2fv(location, count, const_cast<const GLfloat*>(v));
1189 return error::kNoError; 1731 return error::kNoError;
1190 } 1732 }
1191 1733
1192 error::Error GLES2DecoderPassthroughImpl::DoUniform2i(GLint location, 1734 error::Error GLES2DecoderPassthroughImpl::DoUniform2i(GLint location,
1193 GLint x, 1735 GLint x,
1194 GLint y) { 1736 GLint y) {
1737 glUniform2i(location, x, y);
1195 return error::kNoError; 1738 return error::kNoError;
1196 } 1739 }
1197 1740
1198 error::Error GLES2DecoderPassthroughImpl::DoUniform2iv( 1741 error::Error GLES2DecoderPassthroughImpl::DoUniform2iv(
1199 GLint location, 1742 GLint location,
1200 GLsizei count, 1743 GLsizei count,
1201 const volatile GLint* v) { 1744 const volatile GLint* v) {
1745 glUniform2iv(location, count, const_cast<const GLint*>(v));
1202 return error::kNoError; 1746 return error::kNoError;
1203 } 1747 }
1204 1748
1205 error::Error GLES2DecoderPassthroughImpl::DoUniform2ui(GLint location, 1749 error::Error GLES2DecoderPassthroughImpl::DoUniform2ui(GLint location,
1206 GLuint x, 1750 GLuint x,
1207 GLuint y) { 1751 GLuint y) {
1752 glUniform2ui(location, x, y);
1208 return error::kNoError; 1753 return error::kNoError;
1209 } 1754 }
1210 1755
1211 error::Error GLES2DecoderPassthroughImpl::DoUniform2uiv( 1756 error::Error GLES2DecoderPassthroughImpl::DoUniform2uiv(
1212 GLint location, 1757 GLint location,
1213 GLsizei count, 1758 GLsizei count,
1214 const volatile GLuint* v) { 1759 const volatile GLuint* v) {
1760 glUniform2uiv(location, count, const_cast<const GLuint*>(v));
1215 return error::kNoError; 1761 return error::kNoError;
1216 } 1762 }
1217 1763
1218 error::Error GLES2DecoderPassthroughImpl::DoUniform3f(GLint location, 1764 error::Error GLES2DecoderPassthroughImpl::DoUniform3f(GLint location,
1219 GLfloat x, 1765 GLfloat x,
1220 GLfloat y, 1766 GLfloat y,
1221 GLfloat z) { 1767 GLfloat z) {
1768 glUniform3f(location, x, y, z);
1222 return error::kNoError; 1769 return error::kNoError;
1223 } 1770 }
1224 1771
1225 error::Error GLES2DecoderPassthroughImpl::DoUniform3fv( 1772 error::Error GLES2DecoderPassthroughImpl::DoUniform3fv(
1226 GLint location, 1773 GLint location,
1227 GLsizei count, 1774 GLsizei count,
1228 const volatile GLfloat* v) { 1775 const volatile GLfloat* v) {
1776 glUniform3fv(location, count, const_cast<const GLfloat*>(v));
1229 return error::kNoError; 1777 return error::kNoError;
1230 } 1778 }
1231 1779
1232 error::Error GLES2DecoderPassthroughImpl::DoUniform3i(GLint location, 1780 error::Error GLES2DecoderPassthroughImpl::DoUniform3i(GLint location,
1233 GLint x, 1781 GLint x,
1234 GLint y, 1782 GLint y,
1235 GLint z) { 1783 GLint z) {
1784 glUniform3i(location, x, y, z);
1236 return error::kNoError; 1785 return error::kNoError;
1237 } 1786 }
1238 1787
1239 error::Error GLES2DecoderPassthroughImpl::DoUniform3iv( 1788 error::Error GLES2DecoderPassthroughImpl::DoUniform3iv(
1240 GLint location, 1789 GLint location,
1241 GLsizei count, 1790 GLsizei count,
1242 const volatile GLint* v) { 1791 const volatile GLint* v) {
1792 glUniform3iv(location, count, const_cast<const GLint*>(v));
1243 return error::kNoError; 1793 return error::kNoError;
1244 } 1794 }
1245 1795
1246 error::Error GLES2DecoderPassthroughImpl::DoUniform3ui(GLint location, 1796 error::Error GLES2DecoderPassthroughImpl::DoUniform3ui(GLint location,
1247 GLuint x, 1797 GLuint x,
1248 GLuint y, 1798 GLuint y,
1249 GLuint z) { 1799 GLuint z) {
1800 glUniform3ui(location, x, y, z);
1250 return error::kNoError; 1801 return error::kNoError;
1251 } 1802 }
1252 1803
1253 error::Error GLES2DecoderPassthroughImpl::DoUniform3uiv( 1804 error::Error GLES2DecoderPassthroughImpl::DoUniform3uiv(
1254 GLint location, 1805 GLint location,
1255 GLsizei count, 1806 GLsizei count,
1256 const volatile GLuint* v) { 1807 const volatile GLuint* v) {
1808 glUniform3uiv(location, count, const_cast<const GLuint*>(v));
1257 return error::kNoError; 1809 return error::kNoError;
1258 } 1810 }
1259 1811
1260 error::Error GLES2DecoderPassthroughImpl::DoUniform4f(GLint location, 1812 error::Error GLES2DecoderPassthroughImpl::DoUniform4f(GLint location,
1261 GLfloat x, 1813 GLfloat x,
1262 GLfloat y, 1814 GLfloat y,
1263 GLfloat z, 1815 GLfloat z,
1264 GLfloat w) { 1816 GLfloat w) {
1817 glUniform4f(location, x, y, z, w);
1265 return error::kNoError; 1818 return error::kNoError;
1266 } 1819 }
1267 1820
1268 error::Error GLES2DecoderPassthroughImpl::DoUniform4fv( 1821 error::Error GLES2DecoderPassthroughImpl::DoUniform4fv(
1269 GLint location, 1822 GLint location,
1270 GLsizei count, 1823 GLsizei count,
1271 const volatile GLfloat* v) { 1824 const volatile GLfloat* v) {
1825 glUniform4fv(location, count, const_cast<const GLfloat*>(v));
1272 return error::kNoError; 1826 return error::kNoError;
1273 } 1827 }
1274 1828
1275 error::Error GLES2DecoderPassthroughImpl::DoUniform4i(GLint location, 1829 error::Error GLES2DecoderPassthroughImpl::DoUniform4i(GLint location,
1276 GLint x, 1830 GLint x,
1277 GLint y, 1831 GLint y,
1278 GLint z, 1832 GLint z,
1279 GLint w) { 1833 GLint w) {
1834 glUniform4i(location, x, y, z, w);
1280 return error::kNoError; 1835 return error::kNoError;
1281 } 1836 }
1282 1837
1283 error::Error GLES2DecoderPassthroughImpl::DoUniform4iv( 1838 error::Error GLES2DecoderPassthroughImpl::DoUniform4iv(
1284 GLint location, 1839 GLint location,
1285 GLsizei count, 1840 GLsizei count,
1286 const volatile GLint* v) { 1841 const volatile GLint* v) {
1842 glUniform4iv(location, count, const_cast<const GLint*>(v));
1287 return error::kNoError; 1843 return error::kNoError;
1288 } 1844 }
1289 1845
1290 error::Error GLES2DecoderPassthroughImpl::DoUniform4ui(GLint location, 1846 error::Error GLES2DecoderPassthroughImpl::DoUniform4ui(GLint location,
1291 GLuint x, 1847 GLuint x,
1292 GLuint y, 1848 GLuint y,
1293 GLuint z, 1849 GLuint z,
1294 GLuint w) { 1850 GLuint w) {
1851 glUniform4ui(location, x, y, z, w);
1295 return error::kNoError; 1852 return error::kNoError;
1296 } 1853 }
1297 1854
1298 error::Error GLES2DecoderPassthroughImpl::DoUniform4uiv( 1855 error::Error GLES2DecoderPassthroughImpl::DoUniform4uiv(
1299 GLint location, 1856 GLint location,
1300 GLsizei count, 1857 GLsizei count,
1301 const volatile GLuint* v) { 1858 const volatile GLuint* v) {
1859 glUniform4uiv(location, count, const_cast<const GLuint*>(v));
1302 return error::kNoError; 1860 return error::kNoError;
1303 } 1861 }
1304 1862
1305 error::Error GLES2DecoderPassthroughImpl::DoUniformBlockBinding( 1863 error::Error GLES2DecoderPassthroughImpl::DoUniformBlockBinding(
1306 GLuint program, 1864 GLuint program,
1307 GLuint index, 1865 GLuint index,
1308 GLuint binding) { 1866 GLuint binding) {
1867 glUniformBlockBinding(GetProgramServiceID(program, resources_), index,
1868 binding);
1309 return error::kNoError; 1869 return error::kNoError;
1310 } 1870 }
1311 1871
1312 error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix2fv( 1872 error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix2fv(
1313 GLint location, 1873 GLint location,
1314 GLsizei count, 1874 GLsizei count,
1315 GLboolean transpose, 1875 GLboolean transpose,
1316 const volatile GLfloat* value) { 1876 const volatile GLfloat* value) {
1877 glUniformMatrix2fv(location, count, transpose,
1878 const_cast<const GLfloat*>(value));
1317 return error::kNoError; 1879 return error::kNoError;
1318 } 1880 }
1319 1881
1320 error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix2x3fv( 1882 error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix2x3fv(
1321 GLint location, 1883 GLint location,
1322 GLsizei count, 1884 GLsizei count,
1323 GLboolean transpose, 1885 GLboolean transpose,
1324 const volatile GLfloat* value) { 1886 const volatile GLfloat* value) {
1887 glUniformMatrix2x3fv(location, count, transpose,
1888 const_cast<const GLfloat*>(value));
1325 return error::kNoError; 1889 return error::kNoError;
1326 } 1890 }
1327 1891
1328 error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix2x4fv( 1892 error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix2x4fv(
1329 GLint location, 1893 GLint location,
1330 GLsizei count, 1894 GLsizei count,
1331 GLboolean transpose, 1895 GLboolean transpose,
1332 const volatile GLfloat* value) { 1896 const volatile GLfloat* value) {
1897 glUniformMatrix2x4fv(location, count, transpose,
1898 const_cast<const GLfloat*>(value));
1333 return error::kNoError; 1899 return error::kNoError;
1334 } 1900 }
1335 1901
1336 error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix3fv( 1902 error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix3fv(
1337 GLint location, 1903 GLint location,
1338 GLsizei count, 1904 GLsizei count,
1339 GLboolean transpose, 1905 GLboolean transpose,
1340 const volatile GLfloat* value) { 1906 const volatile GLfloat* value) {
1907 glUniformMatrix3fv(location, count, transpose,
1908 const_cast<const GLfloat*>(value));
1341 return error::kNoError; 1909 return error::kNoError;
1342 } 1910 }
1343 1911
1344 error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix3x2fv( 1912 error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix3x2fv(
1345 GLint location, 1913 GLint location,
1346 GLsizei count, 1914 GLsizei count,
1347 GLboolean transpose, 1915 GLboolean transpose,
1348 const volatile GLfloat* value) { 1916 const volatile GLfloat* value) {
1917 glUniformMatrix3x2fv(location, count, transpose,
1918 const_cast<const GLfloat*>(value));
1349 return error::kNoError; 1919 return error::kNoError;
1350 } 1920 }
1351 1921
1352 error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix3x4fv( 1922 error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix3x4fv(
1353 GLint location, 1923 GLint location,
1354 GLsizei count, 1924 GLsizei count,
1355 GLboolean transpose, 1925 GLboolean transpose,
1356 const volatile GLfloat* value) { 1926 const volatile GLfloat* value) {
1927 glUniformMatrix3x4fv(location, count, transpose,
1928 const_cast<const GLfloat*>(value));
1357 return error::kNoError; 1929 return error::kNoError;
1358 } 1930 }
1359 1931
1360 error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix4fv( 1932 error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix4fv(
1361 GLint location, 1933 GLint location,
1362 GLsizei count, 1934 GLsizei count,
1363 GLboolean transpose, 1935 GLboolean transpose,
1364 const volatile GLfloat* value) { 1936 const volatile GLfloat* value) {
1937 glUniformMatrix4fv(location, count, transpose,
1938 const_cast<const GLfloat*>(value));
1365 return error::kNoError; 1939 return error::kNoError;
1366 } 1940 }
1367 1941
1368 error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix4x2fv( 1942 error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix4x2fv(
1369 GLint location, 1943 GLint location,
1370 GLsizei count, 1944 GLsizei count,
1371 GLboolean transpose, 1945 GLboolean transpose,
1372 const volatile GLfloat* value) { 1946 const volatile GLfloat* value) {
1947 glUniformMatrix4x2fv(location, count, transpose,
1948 const_cast<const GLfloat*>(value));
1373 return error::kNoError; 1949 return error::kNoError;
1374 } 1950 }
1375 1951
1376 error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix4x3fv( 1952 error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix4x3fv(
1377 GLint location, 1953 GLint location,
1378 GLsizei count, 1954 GLsizei count,
1379 GLboolean transpose, 1955 GLboolean transpose,
1380 const volatile GLfloat* value) { 1956 const volatile GLfloat* value) {
1957 glUniformMatrix4x3fv(location, count, transpose,
1958 const_cast<const GLfloat*>(value));
1381 return error::kNoError; 1959 return error::kNoError;
1382 } 1960 }
1383 1961
1384 error::Error GLES2DecoderPassthroughImpl::DoUseProgram(GLuint program) { 1962 error::Error GLES2DecoderPassthroughImpl::DoUseProgram(GLuint program) {
1963 glUseProgram(GetProgramServiceID(program, resources_));
1385 return error::kNoError; 1964 return error::kNoError;
1386 } 1965 }
1387 1966
1388 error::Error GLES2DecoderPassthroughImpl::DoValidateProgram(GLuint program) { 1967 error::Error GLES2DecoderPassthroughImpl::DoValidateProgram(GLuint program) {
1968 glValidateProgram(GetProgramServiceID(program, resources_));
1389 return error::kNoError; 1969 return error::kNoError;
1390 } 1970 }
1391 1971
1392 error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib1f(GLuint indx, 1972 error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib1f(GLuint indx,
1393 GLfloat x) { 1973 GLfloat x) {
1974 glVertexAttrib1f(indx, x);
1394 return error::kNoError; 1975 return error::kNoError;
1395 } 1976 }
1396 1977
1397 error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib1fv( 1978 error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib1fv(
1398 GLuint indx, 1979 GLuint indx,
1399 const volatile GLfloat* values) { 1980 const volatile GLfloat* values) {
1981 glVertexAttrib1fv(indx, const_cast<const GLfloat*>(values));
1400 return error::kNoError; 1982 return error::kNoError;
1401 } 1983 }
1402 1984
1403 error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib2f(GLuint indx, 1985 error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib2f(GLuint indx,
1404 GLfloat x, 1986 GLfloat x,
1405 GLfloat y) { 1987 GLfloat y) {
1988 glVertexAttrib2f(indx, x, y);
1406 return error::kNoError; 1989 return error::kNoError;
1407 } 1990 }
1408 1991
1409 error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib2fv( 1992 error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib2fv(
1410 GLuint indx, 1993 GLuint indx,
1411 const volatile GLfloat* values) { 1994 const volatile GLfloat* values) {
1995 glVertexAttrib2fv(indx, const_cast<const GLfloat*>(values));
1412 return error::kNoError; 1996 return error::kNoError;
1413 } 1997 }
1414 1998
1415 error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib3f(GLuint indx, 1999 error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib3f(GLuint indx,
1416 GLfloat x, 2000 GLfloat x,
1417 GLfloat y, 2001 GLfloat y,
1418 GLfloat z) { 2002 GLfloat z) {
2003 glVertexAttrib3f(indx, x, y, z);
1419 return error::kNoError; 2004 return error::kNoError;
1420 } 2005 }
1421 2006
1422 error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib3fv( 2007 error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib3fv(
1423 GLuint indx, 2008 GLuint indx,
1424 const volatile GLfloat* values) { 2009 const volatile GLfloat* values) {
2010 glVertexAttrib3fv(indx, const_cast<const GLfloat*>(values));
1425 return error::kNoError; 2011 return error::kNoError;
1426 } 2012 }
1427 2013
1428 error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib4f(GLuint indx, 2014 error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib4f(GLuint indx,
1429 GLfloat x, 2015 GLfloat x,
1430 GLfloat y, 2016 GLfloat y,
1431 GLfloat z, 2017 GLfloat z,
1432 GLfloat w) { 2018 GLfloat w) {
2019 glVertexAttrib4f(indx, x, y, z, w);
1433 return error::kNoError; 2020 return error::kNoError;
1434 } 2021 }
1435 2022
1436 error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib4fv( 2023 error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib4fv(
1437 GLuint indx, 2024 GLuint indx,
1438 const volatile GLfloat* values) { 2025 const volatile GLfloat* values) {
2026 glVertexAttrib4fv(indx, const_cast<const GLfloat*>(values));
1439 return error::kNoError; 2027 return error::kNoError;
1440 } 2028 }
1441 2029
1442 error::Error GLES2DecoderPassthroughImpl::DoVertexAttribI4i(GLuint indx, 2030 error::Error GLES2DecoderPassthroughImpl::DoVertexAttribI4i(GLuint indx,
1443 GLint x, 2031 GLint x,
1444 GLint y, 2032 GLint y,
1445 GLint z, 2033 GLint z,
1446 GLint w) { 2034 GLint w) {
2035 glVertexAttribI4i(indx, x, y, z, w);
1447 return error::kNoError; 2036 return error::kNoError;
1448 } 2037 }
1449 2038
1450 error::Error GLES2DecoderPassthroughImpl::DoVertexAttribI4iv( 2039 error::Error GLES2DecoderPassthroughImpl::DoVertexAttribI4iv(
1451 GLuint indx, 2040 GLuint indx,
1452 const volatile GLint* values) { 2041 const volatile GLint* values) {
2042 glVertexAttribI4iv(indx, const_cast<const GLint*>(values));
1453 return error::kNoError; 2043 return error::kNoError;
1454 } 2044 }
1455 2045
1456 error::Error GLES2DecoderPassthroughImpl::DoVertexAttribI4ui(GLuint indx, 2046 error::Error GLES2DecoderPassthroughImpl::DoVertexAttribI4ui(GLuint indx,
1457 GLuint x, 2047 GLuint x,
1458 GLuint y, 2048 GLuint y,
1459 GLuint z, 2049 GLuint z,
1460 GLuint w) { 2050 GLuint w) {
2051 glVertexAttribI4ui(indx, x, y, z, w);
1461 return error::kNoError; 2052 return error::kNoError;
1462 } 2053 }
1463 2054
1464 error::Error GLES2DecoderPassthroughImpl::DoVertexAttribI4uiv( 2055 error::Error GLES2DecoderPassthroughImpl::DoVertexAttribI4uiv(
1465 GLuint indx, 2056 GLuint indx,
1466 const volatile GLuint* values) { 2057 const volatile GLuint* values) {
2058 glVertexAttribI4uiv(indx, const_cast<const GLuint*>(values));
1467 return error::kNoError; 2059 return error::kNoError;
1468 } 2060 }
1469 2061
1470 error::Error GLES2DecoderPassthroughImpl::DoVertexAttribIPointer( 2062 error::Error GLES2DecoderPassthroughImpl::DoVertexAttribIPointer(
1471 GLuint indx, 2063 GLuint indx,
1472 GLint size, 2064 GLint size,
1473 GLenum type, 2065 GLenum type,
1474 GLsizei stride, 2066 GLsizei stride,
1475 const void* ptr) { 2067 const void* ptr) {
2068 glVertexAttribIPointer(indx, size, type, stride, ptr);
1476 return error::kNoError; 2069 return error::kNoError;
1477 } 2070 }
1478 2071
1479 error::Error GLES2DecoderPassthroughImpl::DoVertexAttribPointer( 2072 error::Error GLES2DecoderPassthroughImpl::DoVertexAttribPointer(
1480 GLuint indx, 2073 GLuint indx,
1481 GLint size, 2074 GLint size,
1482 GLenum type, 2075 GLenum type,
1483 GLboolean normalized, 2076 GLboolean normalized,
1484 GLsizei stride, 2077 GLsizei stride,
1485 const void* ptr) { 2078 const void* ptr) {
2079 glVertexAttribPointer(indx, size, type, normalized, stride, ptr);
1486 return error::kNoError; 2080 return error::kNoError;
1487 } 2081 }
1488 2082
1489 error::Error GLES2DecoderPassthroughImpl::DoViewport(GLint x, 2083 error::Error GLES2DecoderPassthroughImpl::DoViewport(GLint x,
1490 GLint y, 2084 GLint y,
1491 GLsizei width, 2085 GLsizei width,
1492 GLsizei height) { 2086 GLsizei height) {
2087 glViewport(x, y, width, height);
1493 return error::kNoError; 2088 return error::kNoError;
1494 } 2089 }
1495 2090
1496 error::Error GLES2DecoderPassthroughImpl::DoWaitSync(GLuint sync, 2091 error::Error GLES2DecoderPassthroughImpl::DoWaitSync(GLuint sync,
1497 GLbitfield flags, 2092 GLbitfield flags,
1498 GLuint64 timeout) { 2093 GLuint64 timeout) {
2094 NOTIMPLEMENTED();
1499 return error::kNoError; 2095 return error::kNoError;
1500 } 2096 }
1501 2097
1502 error::Error GLES2DecoderPassthroughImpl::DoBlitFramebufferCHROMIUM( 2098 error::Error GLES2DecoderPassthroughImpl::DoBlitFramebufferCHROMIUM(
1503 GLint srcX0, 2099 GLint srcX0,
1504 GLint srcY0, 2100 GLint srcY0,
1505 GLint srcX1, 2101 GLint srcX1,
1506 GLint srcY1, 2102 GLint srcY1,
1507 GLint dstX0, 2103 GLint dstX0,
1508 GLint dstY0, 2104 GLint dstY0,
1509 GLint dstX1, 2105 GLint dstX1,
1510 GLint dstY1, 2106 GLint dstY1,
1511 GLbitfield mask, 2107 GLbitfield mask,
1512 GLenum filter) { 2108 GLenum filter) {
2109 glBlitFramebufferANGLE(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
2110 mask, filter);
1513 return error::kNoError; 2111 return error::kNoError;
1514 } 2112 }
1515 2113
1516 error::Error 2114 error::Error
1517 GLES2DecoderPassthroughImpl::DoRenderbufferStorageMultisampleCHROMIUM( 2115 GLES2DecoderPassthroughImpl::DoRenderbufferStorageMultisampleCHROMIUM(
1518 GLenum target, 2116 GLenum target,
1519 GLsizei samples, 2117 GLsizei samples,
1520 GLenum internalformat, 2118 GLenum internalformat,
1521 GLsizei width, 2119 GLsizei width,
1522 GLsizei height) { 2120 GLsizei height) {
2121 glRenderbufferStorageMultisampleANGLE(target, samples, internalformat, width,
2122 height);
1523 return error::kNoError; 2123 return error::kNoError;
1524 } 2124 }
1525 2125
1526 error::Error GLES2DecoderPassthroughImpl::DoRenderbufferStorageMultisampleEXT( 2126 error::Error GLES2DecoderPassthroughImpl::DoRenderbufferStorageMultisampleEXT(
1527 GLenum target, 2127 GLenum target,
1528 GLsizei samples, 2128 GLsizei samples,
1529 GLenum internalformat, 2129 GLenum internalformat,
1530 GLsizei width, 2130 GLsizei width,
1531 GLsizei height) { 2131 GLsizei height) {
2132 glRenderbufferStorageMultisampleANGLE(target, samples, internalformat, width,
2133 height);
1532 return error::kNoError; 2134 return error::kNoError;
1533 } 2135 }
1534 2136
1535 error::Error GLES2DecoderPassthroughImpl::DoFramebufferTexture2DMultisampleEXT( 2137 error::Error GLES2DecoderPassthroughImpl::DoFramebufferTexture2DMultisampleEXT(
1536 GLenum target, 2138 GLenum target,
1537 GLenum attachment, 2139 GLenum attachment,
1538 GLenum textarget, 2140 GLenum textarget,
1539 GLuint texture, 2141 GLuint texture,
1540 GLint level, 2142 GLint level,
1541 GLsizei samples) { 2143 GLsizei samples) {
2144 NOTIMPLEMENTED();
1542 return error::kNoError; 2145 return error::kNoError;
1543 } 2146 }
1544 2147
1545 error::Error GLES2DecoderPassthroughImpl::DoTexStorage2DEXT( 2148 error::Error GLES2DecoderPassthroughImpl::DoTexStorage2DEXT(
1546 GLenum target, 2149 GLenum target,
1547 GLsizei levels, 2150 GLsizei levels,
1548 GLenum internalFormat, 2151 GLenum internalFormat,
1549 GLsizei width, 2152 GLsizei width,
1550 GLsizei height) { 2153 GLsizei height) {
1551 glTexStorage2DEXT(target, levels, internalFormat, width, height); 2154 glTexStorage2DEXT(target, levels, internalFormat, width, height);
1552 return error::kNoError; 2155 return error::kNoError;
1553 } 2156 }
1554 2157
1555 error::Error GLES2DecoderPassthroughImpl::DoGenQueriesEXT( 2158 error::Error GLES2DecoderPassthroughImpl::DoGenQueriesEXT(
1556 GLsizei n, 2159 GLsizei n,
1557 volatile GLuint* queries) { 2160 volatile GLuint* queries) {
1558 return error::kNoError; 2161 return GenHelper(n, queries, &query_id_map_, [](GLsizei n, GLuint* queries) {
2162 glGenQueries(n, queries);
2163 });
1559 } 2164 }
1560 2165
1561 error::Error GLES2DecoderPassthroughImpl::DoDeleteQueriesEXT( 2166 error::Error GLES2DecoderPassthroughImpl::DoDeleteQueriesEXT(
1562 GLsizei n, 2167 GLsizei n,
1563 const volatile GLuint* queries) { 2168 const volatile GLuint* queries) {
1564 return error::kNoError; 2169 return DeleteHelper(
2170 n, queries, &query_id_map_,
2171 [](GLsizei n, GLuint* queries) { glDeleteQueries(n, queries); });
1565 } 2172 }
1566 2173
1567 error::Error GLES2DecoderPassthroughImpl::DoQueryCounterEXT(GLuint id, 2174 error::Error GLES2DecoderPassthroughImpl::DoQueryCounterEXT(GLuint id,
1568 GLenum target) { 2175 GLenum target) {
2176 glQueryCounter(GetQueryServiceID(id, &query_id_map_), target);
1569 return error::kNoError; 2177 return error::kNoError;
1570 } 2178 }
1571 2179
1572 error::Error GLES2DecoderPassthroughImpl::DoBeginQueryEXT(GLenum target, 2180 error::Error GLES2DecoderPassthroughImpl::DoBeginQueryEXT(GLenum target,
1573 GLuint id) { 2181 GLuint id) {
2182 // TODO(geofflang): Track active queries
2183 glBeginQuery(target, GetQueryServiceID(id, &query_id_map_));
1574 return error::kNoError; 2184 return error::kNoError;
1575 } 2185 }
1576 2186
1577 error::Error GLES2DecoderPassthroughImpl::DoBeginTransformFeedback( 2187 error::Error GLES2DecoderPassthroughImpl::DoBeginTransformFeedback(
1578 GLenum primitivemode) { 2188 GLenum primitivemode) {
2189 glBeginTransformFeedback(primitivemode);
1579 return error::kNoError; 2190 return error::kNoError;
1580 } 2191 }
1581 2192
1582 error::Error GLES2DecoderPassthroughImpl::DoEndQueryEXT(GLenum target) { 2193 error::Error GLES2DecoderPassthroughImpl::DoEndQueryEXT(GLenum target) {
2194 // TODO(geofflang): Track active queries
2195 glEndQuery(target);
1583 return error::kNoError; 2196 return error::kNoError;
1584 } 2197 }
1585 2198
1586 error::Error GLES2DecoderPassthroughImpl::DoEndTransformFeedback() { 2199 error::Error GLES2DecoderPassthroughImpl::DoEndTransformFeedback() {
2200 glEndTransformFeedback();
1587 return error::kNoError; 2201 return error::kNoError;
1588 } 2202 }
1589 2203
1590 error::Error GLES2DecoderPassthroughImpl::DoSetDisjointValueSyncCHROMIUM( 2204 error::Error GLES2DecoderPassthroughImpl::DoSetDisjointValueSyncCHROMIUM(
1591 DisjointValueSync* sync) { 2205 DisjointValueSync* sync) {
2206 NOTIMPLEMENTED();
1592 return error::kNoError; 2207 return error::kNoError;
1593 } 2208 }
1594 2209
1595 error::Error GLES2DecoderPassthroughImpl::DoInsertEventMarkerEXT( 2210 error::Error GLES2DecoderPassthroughImpl::DoInsertEventMarkerEXT(
1596 GLsizei length, 2211 GLsizei length,
1597 const char* marker) { 2212 const char* marker) {
2213 NOTIMPLEMENTED();
1598 return error::kNoError; 2214 return error::kNoError;
1599 } 2215 }
1600 2216
1601 error::Error GLES2DecoderPassthroughImpl::DoPushGroupMarkerEXT( 2217 error::Error GLES2DecoderPassthroughImpl::DoPushGroupMarkerEXT(
1602 GLsizei length, 2218 GLsizei length,
1603 const char* marker) { 2219 const char* marker) {
2220 NOTIMPLEMENTED();
1604 return error::kNoError; 2221 return error::kNoError;
1605 } 2222 }
1606 2223
1607 error::Error GLES2DecoderPassthroughImpl::DoPopGroupMarkerEXT() { 2224 error::Error GLES2DecoderPassthroughImpl::DoPopGroupMarkerEXT() {
2225 NOTIMPLEMENTED();
1608 return error::kNoError; 2226 return error::kNoError;
1609 } 2227 }
1610 2228
1611 error::Error GLES2DecoderPassthroughImpl::DoGenVertexArraysOES( 2229 error::Error GLES2DecoderPassthroughImpl::DoGenVertexArraysOES(
1612 GLsizei n, 2230 GLsizei n,
1613 volatile GLuint* arrays) { 2231 volatile GLuint* arrays) {
1614 return error::kNoError; 2232 return GenHelper(
2233 n, arrays, &vertex_array_id_map_,
2234 [](GLsizei n, GLuint* arrays) { glGenVertexArraysOES(n, arrays); });
1615 } 2235 }
1616 2236
1617 error::Error GLES2DecoderPassthroughImpl::DoDeleteVertexArraysOES( 2237 error::Error GLES2DecoderPassthroughImpl::DoDeleteVertexArraysOES(
1618 GLsizei n, 2238 GLsizei n,
1619 const volatile GLuint* arrays) { 2239 const volatile GLuint* arrays) {
1620 return error::kNoError; 2240 return DeleteHelper(
2241 n, arrays, &vertex_array_id_map_,
2242 [](GLsizei n, GLuint* arrays) { glDeleteVertexArraysOES(n, arrays); });
1621 } 2243 }
1622 2244
1623 error::Error GLES2DecoderPassthroughImpl::DoIsVertexArrayOES(GLuint array, 2245 error::Error GLES2DecoderPassthroughImpl::DoIsVertexArrayOES(GLuint array,
1624 uint32_t* result) { 2246 uint32_t* result) {
2247 *result = glIsVertexArrayOES(
2248 GetVertexArrayServiceID(array, &vertex_array_id_map_, false));
1625 return error::kNoError; 2249 return error::kNoError;
1626 } 2250 }
1627 2251
1628 error::Error GLES2DecoderPassthroughImpl::DoBindVertexArrayOES(GLuint array) { 2252 error::Error GLES2DecoderPassthroughImpl::DoBindVertexArrayOES(GLuint array) {
2253 glBindVertexArrayOES(GetVertexArrayServiceID(array, &vertex_array_id_map_,
2254 bind_generates_resource_));
1629 return error::kNoError; 2255 return error::kNoError;
1630 } 2256 }
1631 2257
1632 error::Error GLES2DecoderPassthroughImpl::DoSwapBuffers() { 2258 error::Error GLES2DecoderPassthroughImpl::DoSwapBuffers() {
2259 gfx::SwapResult result = surface_->SwapBuffers();
2260 if (result == gfx::SwapResult::SWAP_FAILED) {
2261 LOG(ERROR) << "Context lost because SwapBuffers failed.";
2262 }
2263 // TODO(geofflang): force the context loss?
1633 return error::kNoError; 2264 return error::kNoError;
1634 } 2265 }
1635 2266
1636 error::Error GLES2DecoderPassthroughImpl::DoGetMaxValueInBufferCHROMIUM( 2267 error::Error GLES2DecoderPassthroughImpl::DoGetMaxValueInBufferCHROMIUM(
1637 GLuint buffer_id, 2268 GLuint buffer_id,
1638 GLsizei count, 2269 GLsizei count,
1639 GLenum type, 2270 GLenum type,
1640 GLuint offset, 2271 GLuint offset,
1641 uint32_t* result) { 2272 uint32_t* result) {
2273 NOTIMPLEMENTED();
1642 return error::kNoError; 2274 return error::kNoError;
1643 } 2275 }
1644 2276
1645 error::Error GLES2DecoderPassthroughImpl::DoEnableFeatureCHROMIUM( 2277 error::Error GLES2DecoderPassthroughImpl::DoEnableFeatureCHROMIUM(
1646 const char* feature) { 2278 const char* feature) {
2279 NOTIMPLEMENTED();
1647 return error::kNoError; 2280 return error::kNoError;
1648 } 2281 }
1649 2282
1650 error::Error GLES2DecoderPassthroughImpl::DoMapBufferRange(GLenum target, 2283 error::Error GLES2DecoderPassthroughImpl::DoMapBufferRange(GLenum target,
1651 GLintptr offset, 2284 GLintptr offset,
1652 GLsizeiptr size, 2285 GLsizeiptr size,
1653 GLbitfield access, 2286 GLbitfield access,
1654 void** ptr) { 2287 void** ptr) {
2288 NOTIMPLEMENTED();
1655 return error::kNoError; 2289 return error::kNoError;
1656 } 2290 }
1657 2291
1658 error::Error GLES2DecoderPassthroughImpl::DoUnmapBuffer(GLenum target) { 2292 error::Error GLES2DecoderPassthroughImpl::DoUnmapBuffer(GLenum target) {
2293 NOTIMPLEMENTED();
1659 return error::kNoError; 2294 return error::kNoError;
1660 } 2295 }
1661 2296
1662 error::Error GLES2DecoderPassthroughImpl::DoResizeCHROMIUM(GLuint width, 2297 error::Error GLES2DecoderPassthroughImpl::DoResizeCHROMIUM(GLuint width,
1663 GLuint height, 2298 GLuint height,
1664 GLfloat scale_factor, 2299 GLfloat scale_factor,
1665 GLboolean alpha) { 2300 GLboolean alpha) {
2301 NOTIMPLEMENTED();
1666 return error::kNoError; 2302 return error::kNoError;
1667 } 2303 }
1668 2304
1669 error::Error GLES2DecoderPassthroughImpl::DoGetRequestableExtensionsCHROMIUM( 2305 error::Error GLES2DecoderPassthroughImpl::DoGetRequestableExtensionsCHROMIUM(
1670 const char** extensions) { 2306 const char** extensions) {
2307 *extensions = "";
2308 NOTIMPLEMENTED();
1671 return error::kNoError; 2309 return error::kNoError;
1672 } 2310 }
1673 2311
1674 error::Error GLES2DecoderPassthroughImpl::DoRequestExtensionCHROMIUM( 2312 error::Error GLES2DecoderPassthroughImpl::DoRequestExtensionCHROMIUM(
1675 const char* extension) { 2313 const char* extension) {
2314 NOTIMPLEMENTED();
1676 return error::kNoError; 2315 return error::kNoError;
1677 } 2316 }
1678 2317
1679 error::Error GLES2DecoderPassthroughImpl::DoGetProgramInfoCHROMIUM( 2318 error::Error GLES2DecoderPassthroughImpl::DoGetProgramInfoCHROMIUM(
1680 GLuint program, 2319 GLuint program,
1681 std::vector<uint8_t>* data) { 2320 std::vector<uint8_t>* data) {
2321 GLuint service_program = 0;
2322 if (!resources_->program_id_map.GetServiceID(program, &service_program)) {
2323 return error::kNoError;
2324 }
2325
2326 GLint num_attributes = 0;
2327 glGetProgramiv(service_program, GL_ACTIVE_ATTRIBUTES, &num_attributes);
2328
2329 GLint num_uniforms = 0;
2330 glGetProgramiv(service_program, GL_ACTIVE_UNIFORMS, &num_uniforms);
2331
2332 data->resize(sizeof(ProgramInfoHeader) +
2333 ((num_attributes + num_uniforms) * sizeof(ProgramInput)),
2334 0);
2335
2336 GLint link_status = 0;
2337 glGetProgramiv(service_program, GL_LINK_STATUS, &link_status);
2338
2339 ProgramInfoHeader header;
2340 header.link_status = link_status;
2341 header.num_attribs = num_attributes;
2342 header.num_uniforms = num_uniforms;
2343 InsertValueIntoBuffer(data, header, 0);
2344
2345 GLint active_attribute_max_length = 0;
2346 glGetProgramiv(service_program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH,
2347 &active_attribute_max_length);
2348
2349 std::vector<char> attrib_name_buf(active_attribute_max_length, 0);
2350 for (GLint attrib_index = 0; attrib_index < num_attributes; attrib_index++) {
2351 GLsizei length = 0;
2352 GLint size = 0;
2353 GLenum type = GL_NONE;
2354 glGetActiveAttrib(service_program, attrib_index, attrib_name_buf.size(),
2355 &length, &size, &type, attrib_name_buf.data());
2356
2357 ProgramInput input;
2358 input.size = size;
2359 input.type = type;
2360
2361 int32_t location =
2362 glGetAttribLocation(service_program, attrib_name_buf.data());
2363 input.location_offset = data->size();
2364 AppendValueToBuffer(data, location);
2365
2366 input.name_offset = data->size();
2367 input.name_length = length;
2368 AppendStringToBuffer(data, attrib_name_buf.data(), length);
2369
2370 InsertValueIntoBuffer(
2371 data, input,
2372 sizeof(ProgramInfoHeader) + (attrib_index * sizeof(ProgramInput)));
2373 }
2374
2375 GLint active_uniform_max_length = 0;
2376 glGetProgramiv(service_program, GL_ACTIVE_UNIFORM_MAX_LENGTH,
2377 &active_uniform_max_length);
2378
2379 std::vector<char> uniform_name_buf(active_uniform_max_length, 0);
2380 for (GLint uniform_index = 0; uniform_index < num_uniforms; uniform_index++) {
2381 GLsizei length = 0;
2382 GLint size = 0;
2383 GLenum type = GL_NONE;
2384 glGetActiveUniform(service_program, uniform_index, uniform_name_buf.size(),
2385 &length, &size, &type, uniform_name_buf.data());
2386
2387 ProgramInput input;
2388 input.size = size;
2389 input.type = type;
2390
2391 input.location_offset = data->size();
2392 int32_t base_location =
2393 glGetUniformLocation(service_program, uniform_name_buf.data());
2394 AppendValueToBuffer(data, base_location);
2395
2396 GLSLArrayName parsed_service_name(uniform_name_buf.data());
2397 if (size > 1 || parsed_service_name.IsArrayName()) {
2398 for (GLint location_index = 1; location_index < size; location_index++) {
2399 std::string array_element_name = parsed_service_name.base_name() + "[" +
2400 base::IntToString(location_index) +
2401 "]";
2402 int32_t element_location =
2403 glGetUniformLocation(service_program, array_element_name.c_str());
2404 AppendValueToBuffer(data, element_location);
2405 }
2406 }
2407
2408 input.name_offset = data->size();
2409 input.name_length = length;
2410 AppendStringToBuffer(data, uniform_name_buf.data(), length);
2411
2412 InsertValueIntoBuffer(data, input, sizeof(ProgramInfoHeader) +
2413 ((num_attributes + uniform_index) *
2414 sizeof(ProgramInput)));
2415 }
2416
1682 return error::kNoError; 2417 return error::kNoError;
1683 } 2418 }
1684 2419
1685 error::Error GLES2DecoderPassthroughImpl::DoGetUniformBlocksCHROMIUM( 2420 error::Error GLES2DecoderPassthroughImpl::DoGetUniformBlocksCHROMIUM(
1686 GLuint program, 2421 GLuint program,
1687 std::vector<uint8_t>* data) { 2422 std::vector<uint8_t>* data) {
2423 NOTIMPLEMENTED();
1688 return error::kNoError; 2424 return error::kNoError;
1689 } 2425 }
1690 2426
1691 error::Error 2427 error::Error
1692 GLES2DecoderPassthroughImpl::DoGetTransformFeedbackVaryingsCHROMIUM( 2428 GLES2DecoderPassthroughImpl::DoGetTransformFeedbackVaryingsCHROMIUM(
1693 GLuint program, 2429 GLuint program,
1694 std::vector<uint8_t>* data) { 2430 std::vector<uint8_t>* data) {
2431 NOTIMPLEMENTED();
1695 return error::kNoError; 2432 return error::kNoError;
1696 } 2433 }
1697 2434
1698 error::Error GLES2DecoderPassthroughImpl::DoGetUniformsES3CHROMIUM( 2435 error::Error GLES2DecoderPassthroughImpl::DoGetUniformsES3CHROMIUM(
1699 GLuint program, 2436 GLuint program,
1700 std::vector<uint8_t>* data) { 2437 std::vector<uint8_t>* data) {
2438 NOTIMPLEMENTED();
1701 return error::kNoError; 2439 return error::kNoError;
1702 } 2440 }
1703 2441
1704 error::Error GLES2DecoderPassthroughImpl::DoGetTranslatedShaderSourceANGLE( 2442 error::Error GLES2DecoderPassthroughImpl::DoGetTranslatedShaderSourceANGLE(
1705 GLuint shader, 2443 GLuint shader,
1706 std::string* source) { 2444 std::string* source) {
2445 NOTIMPLEMENTED();
1707 return error::kNoError; 2446 return error::kNoError;
1708 } 2447 }
1709 2448
1710 error::Error GLES2DecoderPassthroughImpl::DoSwapBuffersWithDamageCHROMIUM( 2449 error::Error GLES2DecoderPassthroughImpl::DoSwapBuffersWithDamageCHROMIUM(
1711 GLint x, 2450 GLint x,
1712 GLint y, 2451 GLint y,
1713 GLint width, 2452 GLint width,
1714 GLint height) { 2453 GLint height) {
2454 gfx::SwapResult result = surface_->PostSubBuffer(x, y, width, height);
2455 if (result == gfx::SwapResult::SWAP_FAILED) {
2456 LOG(ERROR) << "Context lost because PostSubBuffer failed.";
2457 }
2458 // TODO(geofflang): force the context loss?
1715 return error::kNoError; 2459 return error::kNoError;
1716 } 2460 }
1717 2461
1718 error::Error GLES2DecoderPassthroughImpl::DoPostSubBufferCHROMIUM( 2462 error::Error GLES2DecoderPassthroughImpl::DoPostSubBufferCHROMIUM(
1719 GLint x, 2463 GLint x,
1720 GLint y, 2464 GLint y,
1721 GLint width, 2465 GLint width,
1722 GLint height) { 2466 GLint height) {
1723 return error::kNoError; 2467 return error::kNoError;
1724 } 2468 }
1725 2469
1726 error::Error GLES2DecoderPassthroughImpl::DoCopyTextureCHROMIUM( 2470 error::Error GLES2DecoderPassthroughImpl::DoCopyTextureCHROMIUM(
1727 GLenum source_id, 2471 GLenum source_id,
1728 GLenum dest_id, 2472 GLenum dest_id,
1729 GLint internalformat, 2473 GLint internalformat,
1730 GLenum dest_type, 2474 GLenum dest_type,
1731 GLboolean unpack_flip_y, 2475 GLboolean unpack_flip_y,
1732 GLboolean unpack_premultiply_alpha, 2476 GLboolean unpack_premultiply_alpha,
1733 GLboolean unpack_unmultiply_alpha) { 2477 GLboolean unpack_unmultiply_alpha) {
2478 glCopyTextureCHROMIUM(GetTextureServiceID(source_id, resources_, false),
2479 GetTextureServiceID(dest_id, resources_, false),
2480 internalformat, dest_type, unpack_flip_y,
2481 unpack_premultiply_alpha, unpack_unmultiply_alpha);
1734 return error::kNoError; 2482 return error::kNoError;
1735 } 2483 }
1736 2484
1737 error::Error GLES2DecoderPassthroughImpl::DoCopySubTextureCHROMIUM( 2485 error::Error GLES2DecoderPassthroughImpl::DoCopySubTextureCHROMIUM(
1738 GLenum source_id, 2486 GLenum source_id,
1739 GLenum dest_id, 2487 GLenum dest_id,
1740 GLint xoffset, 2488 GLint xoffset,
1741 GLint yoffset, 2489 GLint yoffset,
1742 GLint x, 2490 GLint x,
1743 GLint y, 2491 GLint y,
1744 GLsizei width, 2492 GLsizei width,
1745 GLsizei height, 2493 GLsizei height,
1746 GLboolean unpack_flip_y, 2494 GLboolean unpack_flip_y,
1747 GLboolean unpack_premultiply_alpha, 2495 GLboolean unpack_premultiply_alpha,
1748 GLboolean unpack_unmultiply_alpha) { 2496 GLboolean unpack_unmultiply_alpha) {
2497 glCopySubTextureCHROMIUM(GetTextureServiceID(source_id, resources_, false),
2498 GetTextureServiceID(dest_id, resources_, false),
2499 xoffset, yoffset, x, y, width, height, unpack_flip_y,
2500 unpack_premultiply_alpha, unpack_unmultiply_alpha);
1749 return error::kNoError; 2501 return error::kNoError;
1750 } 2502 }
1751 2503
1752 error::Error GLES2DecoderPassthroughImpl::DoCompressedCopyTextureCHROMIUM( 2504 error::Error GLES2DecoderPassthroughImpl::DoCompressedCopyTextureCHROMIUM(
1753 GLenum source_id, 2505 GLenum source_id,
1754 GLenum dest_id) { 2506 GLenum dest_id) {
2507 glCompressedCopyTextureCHROMIUM(
2508 GetTextureServiceID(source_id, resources_, false),
2509 GetTextureServiceID(dest_id, resources_, false));
1755 return error::kNoError; 2510 return error::kNoError;
1756 } 2511 }
1757 2512
1758 error::Error GLES2DecoderPassthroughImpl::DoDrawArraysInstancedANGLE( 2513 error::Error GLES2DecoderPassthroughImpl::DoDrawArraysInstancedANGLE(
1759 GLenum mode, 2514 GLenum mode,
1760 GLint first, 2515 GLint first,
1761 GLsizei count, 2516 GLsizei count,
1762 GLsizei primcount) { 2517 GLsizei primcount) {
2518 glDrawArraysInstancedANGLE(mode, first, count, primcount);
1763 return error::kNoError; 2519 return error::kNoError;
1764 } 2520 }
1765 2521
1766 error::Error GLES2DecoderPassthroughImpl::DoDrawElementsInstancedANGLE( 2522 error::Error GLES2DecoderPassthroughImpl::DoDrawElementsInstancedANGLE(
1767 GLenum mode, 2523 GLenum mode,
1768 GLsizei count, 2524 GLsizei count,
1769 GLenum type, 2525 GLenum type,
1770 const void* indices, 2526 const void* indices,
1771 GLsizei primcount) { 2527 GLsizei primcount) {
2528 glDrawElementsInstancedANGLE(mode, count, type, indices, primcount);
1772 return error::kNoError; 2529 return error::kNoError;
1773 } 2530 }
1774 2531
1775 error::Error GLES2DecoderPassthroughImpl::DoVertexAttribDivisorANGLE( 2532 error::Error GLES2DecoderPassthroughImpl::DoVertexAttribDivisorANGLE(
1776 GLuint index, 2533 GLuint index,
1777 GLuint divisor) { 2534 GLuint divisor) {
2535 glVertexAttribDivisorANGLE(index, divisor);
1778 return error::kNoError; 2536 return error::kNoError;
1779 } 2537 }
1780 2538
1781 error::Error GLES2DecoderPassthroughImpl::DoProduceTextureCHROMIUM( 2539 error::Error GLES2DecoderPassthroughImpl::DoProduceTextureCHROMIUM(
1782 GLenum target, 2540 GLenum target,
1783 const volatile GLbyte* mailbox) { 2541 const volatile GLbyte* mailbox) {
2542 // TODO(geofflang): validation
2543
2544 GLuint texture_client_id = bound_textures_[active_texture_unit_];
2545 scoped_refptr<TexturePassthrough> texture;
2546
2547 auto texture_object_iter =
2548 resources_->texture_object_map.find(texture_client_id);
2549 if (texture_object_iter != resources_->texture_object_map.end()) {
2550 texture = texture_object_iter->second.get();
2551 } else {
2552 GLuint service_id =
2553 GetTextureServiceID(texture_client_id, resources_, false);
2554 texture = new TexturePassthrough(service_id);
2555 resources_->texture_object_map.insert(
2556 std::make_pair(texture_client_id, texture));
2557 }
2558
2559 const Mailbox& mb = Mailbox::FromVolatile(
2560 *reinterpret_cast<const volatile Mailbox*>(mailbox));
2561 mailbox_manager_->ProduceTexture(mb, texture.get());
1784 return error::kNoError; 2562 return error::kNoError;
1785 } 2563 }
1786 2564
1787 error::Error GLES2DecoderPassthroughImpl::DoProduceTextureDirectCHROMIUM( 2565 error::Error GLES2DecoderPassthroughImpl::DoProduceTextureDirectCHROMIUM(
1788 GLuint texture, 2566 GLuint texture_client_id,
1789 GLenum target, 2567 GLenum target,
1790 const volatile GLbyte* mailbox) { 2568 const volatile GLbyte* mailbox) {
2569 // TODO(geofflang): validation
2570
2571 scoped_refptr<TexturePassthrough> texture;
2572 auto texture_object_iter =
2573 resources_->texture_object_map.find(texture_client_id);
2574 if (texture_object_iter != resources_->texture_object_map.end()) {
2575 texture = texture_object_iter->second.get();
2576 } else {
2577 GLuint service_id =
2578 GetTextureServiceID(texture_client_id, resources_, false);
2579 texture = new TexturePassthrough(service_id);
2580 resources_->texture_object_map.insert(
2581 std::make_pair(texture_client_id, texture));
2582 }
2583
2584 const Mailbox& mb = Mailbox::FromVolatile(
2585 *reinterpret_cast<const volatile Mailbox*>(mailbox));
2586 mailbox_manager_->ProduceTexture(mb, texture.get());
1791 return error::kNoError; 2587 return error::kNoError;
1792 } 2588 }
1793 2589
1794 error::Error GLES2DecoderPassthroughImpl::DoConsumeTextureCHROMIUM( 2590 error::Error GLES2DecoderPassthroughImpl::DoConsumeTextureCHROMIUM(
1795 GLenum target, 2591 GLenum target,
1796 const volatile GLbyte* mailbox) { 2592 const volatile GLbyte* mailbox) {
2593 // TODO(geofflang): validation
2594
2595 const Mailbox& mb = Mailbox::FromVolatile(
2596 *reinterpret_cast<const volatile Mailbox*>(mailbox));
2597 scoped_refptr<TexturePassthrough> texture = static_cast<TexturePassthrough*>(
2598 group_->mailbox_manager()->ConsumeTexture(mb));
2599 if (texture == nullptr) {
2600 // TODO(geofflang): error, missing mailbox
2601 return error::kNoError;
2602 }
2603
2604 GLuint client_id = bound_textures_[active_texture_unit_];
2605 resources_->texture_id_map.SetIDMapping(client_id, texture->service_id());
2606 resources_->texture_object_map.erase(client_id);
2607 resources_->texture_object_map.insert(std::make_pair(client_id, texture));
1797 return error::kNoError; 2608 return error::kNoError;
1798 } 2609 }
1799 2610
1800 error::Error GLES2DecoderPassthroughImpl::DoCreateAndConsumeTextureINTERNAL( 2611 error::Error GLES2DecoderPassthroughImpl::DoCreateAndConsumeTextureINTERNAL(
1801 GLenum target, 2612 GLenum target,
1802 GLuint texture, 2613 GLuint texture_client_id,
1803 const volatile GLbyte* mailbox) { 2614 const volatile GLbyte* mailbox) {
2615 // TODO(geofflang): validation
2616
2617 if (resources_->texture_id_map.GetServiceID(texture_client_id, nullptr)) {
2618 return error::kInvalidArguments;
2619 }
2620 const Mailbox& mb = Mailbox::FromVolatile(
2621 *reinterpret_cast<const volatile Mailbox*>(mailbox));
2622 scoped_refptr<TexturePassthrough> texture = static_cast<TexturePassthrough*>(
2623 group_->mailbox_manager()->ConsumeTexture(mb));
2624 if (texture == nullptr) {
2625 // TODO(geofflang): error, missing mailbox
2626 return error::kNoError;
2627 }
2628
2629 resources_->texture_id_map.SetIDMapping(texture_client_id,
2630 texture->service_id());
2631 resources_->texture_object_map.erase(texture_client_id);
2632 resources_->texture_object_map.insert(
2633 std::make_pair(texture_client_id, texture));
1804 return error::kNoError; 2634 return error::kNoError;
1805 } 2635 }
1806 2636
1807 error::Error GLES2DecoderPassthroughImpl::DoBindUniformLocationCHROMIUM( 2637 error::Error GLES2DecoderPassthroughImpl::DoBindUniformLocationCHROMIUM(
1808 GLuint program, 2638 GLuint program,
1809 GLint location, 2639 GLint location,
1810 const char* name) { 2640 const char* name) {
2641 glBindUniformLocationCHROMIUM(GetProgramServiceID(program, resources_),
2642 location, name);
1811 return error::kNoError; 2643 return error::kNoError;
1812 } 2644 }
1813 2645
1814 error::Error GLES2DecoderPassthroughImpl::DoBindTexImage2DCHROMIUM( 2646 error::Error GLES2DecoderPassthroughImpl::DoBindTexImage2DCHROMIUM(
1815 GLenum target, 2647 GLenum target,
1816 GLint imageId) { 2648 GLint imageId) {
2649 // TODO(geofflang): error handling
2650 gl::GLImage* image = image_manager_->LookupImage(imageId);
2651 if (!image->BindTexImage(target)) {
2652 image->CopyTexImage(target);
2653 }
1817 return error::kNoError; 2654 return error::kNoError;
1818 } 2655 }
1819 2656
1820 error::Error GLES2DecoderPassthroughImpl::DoReleaseTexImage2DCHROMIUM( 2657 error::Error GLES2DecoderPassthroughImpl::DoReleaseTexImage2DCHROMIUM(
1821 GLenum target, 2658 GLenum target,
1822 GLint imageId) { 2659 GLint imageId) {
2660 // TODO(geofflang): error handling
2661 gl::GLImage* image = image_manager_->LookupImage(imageId);
2662 image->ReleaseTexImage(target);
1823 return error::kNoError; 2663 return error::kNoError;
1824 } 2664 }
1825 2665
1826 error::Error GLES2DecoderPassthroughImpl::DoTraceBeginCHROMIUM( 2666 error::Error GLES2DecoderPassthroughImpl::DoTraceBeginCHROMIUM(
1827 const char* category_name, 2667 const char* category_name,
1828 const char* trace_name) { 2668 const char* trace_name) {
2669 NOTIMPLEMENTED();
1829 return error::kNoError; 2670 return error::kNoError;
1830 } 2671 }
1831 2672
1832 error::Error GLES2DecoderPassthroughImpl::DoTraceEndCHROMIUM() { 2673 error::Error GLES2DecoderPassthroughImpl::DoTraceEndCHROMIUM() {
2674 NOTIMPLEMENTED();
1833 return error::kNoError; 2675 return error::kNoError;
1834 } 2676 }
1835 2677
1836 error::Error GLES2DecoderPassthroughImpl::DoDiscardFramebufferEXT( 2678 error::Error GLES2DecoderPassthroughImpl::DoDiscardFramebufferEXT(
1837 GLenum target, 2679 GLenum target,
1838 GLsizei count, 2680 GLsizei count,
1839 const volatile GLenum* attachments) { 2681 const volatile GLenum* attachments) {
2682 std::vector<GLenum> attachments_copy(attachments, attachments + count);
2683 glDiscardFramebufferEXT(target, count, attachments_copy.data());
1840 return error::kNoError; 2684 return error::kNoError;
1841 } 2685 }
1842 2686
1843 error::Error GLES2DecoderPassthroughImpl::DoLoseContextCHROMIUM(GLenum current, 2687 error::Error GLES2DecoderPassthroughImpl::DoLoseContextCHROMIUM(GLenum current,
1844 GLenum other) { 2688 GLenum other) {
2689 NOTIMPLEMENTED();
1845 return error::kNoError; 2690 return error::kNoError;
1846 } 2691 }
1847 2692
1848 error::Error GLES2DecoderPassthroughImpl::DoDescheduleUntilFinishedCHROMIUM() { 2693 error::Error GLES2DecoderPassthroughImpl::DoDescheduleUntilFinishedCHROMIUM() {
2694 NOTIMPLEMENTED();
1849 return error::kNoError; 2695 return error::kNoError;
1850 } 2696 }
1851 2697
1852 error::Error GLES2DecoderPassthroughImpl::DoInsertFenceSyncCHROMIUM( 2698 error::Error GLES2DecoderPassthroughImpl::DoInsertFenceSyncCHROMIUM(
1853 GLuint64 release_count) { 2699 GLuint64 release_count) {
2700 if (!fence_sync_release_callback_.is_null())
2701 fence_sync_release_callback_.Run(release_count);
1854 return error::kNoError; 2702 return error::kNoError;
1855 } 2703 }
1856 2704
1857 error::Error GLES2DecoderPassthroughImpl::DoWaitSyncTokenCHROMIUM( 2705 error::Error GLES2DecoderPassthroughImpl::DoWaitSyncTokenCHROMIUM(
1858 CommandBufferNamespace namespace_id, 2706 CommandBufferNamespace namespace_id,
1859 CommandBufferId command_buffer_id, 2707 CommandBufferId command_buffer_id,
1860 GLuint64 release_count) { 2708 GLuint64 release_count) {
1861 return error::kNoError; 2709 if (wait_fence_sync_callback_.is_null()) {
2710 return error::kNoError;
2711 }
2712 return wait_fence_sync_callback_.Run(namespace_id, command_buffer_id,
2713 release_count)
2714 ? error::kNoError
2715 : error::kDeferCommandUntilLater;
1862 } 2716 }
1863 2717
1864 error::Error GLES2DecoderPassthroughImpl::DoDrawBuffersEXT( 2718 error::Error GLES2DecoderPassthroughImpl::DoDrawBuffersEXT(
1865 GLsizei count, 2719 GLsizei count,
1866 const volatile GLenum* bufs) { 2720 const volatile GLenum* bufs) {
2721 std::vector<GLenum> bufs_copy(bufs, bufs + count);
2722 glDrawBuffersARB(count, bufs_copy.data());
1867 return error::kNoError; 2723 return error::kNoError;
1868 } 2724 }
1869 2725
1870 error::Error GLES2DecoderPassthroughImpl::DoDiscardBackbufferCHROMIUM() { 2726 error::Error GLES2DecoderPassthroughImpl::DoDiscardBackbufferCHROMIUM() {
2727 NOTIMPLEMENTED();
1871 return error::kNoError; 2728 return error::kNoError;
1872 } 2729 }
1873 2730
1874 error::Error GLES2DecoderPassthroughImpl::DoScheduleOverlayPlaneCHROMIUM( 2731 error::Error GLES2DecoderPassthroughImpl::DoScheduleOverlayPlaneCHROMIUM(
1875 GLint plane_z_order, 2732 GLint plane_z_order,
1876 GLenum plane_transform, 2733 GLenum plane_transform,
1877 GLuint overlay_texture_id, 2734 GLuint overlay_texture_id,
1878 GLint bounds_x, 2735 GLint bounds_x,
1879 GLint bounds_y, 2736 GLint bounds_y,
1880 GLint bounds_width, 2737 GLint bounds_width,
1881 GLint bounds_height, 2738 GLint bounds_height,
1882 GLfloat uv_x, 2739 GLfloat uv_x,
1883 GLfloat uv_y, 2740 GLfloat uv_y,
1884 GLfloat uv_width, 2741 GLfloat uv_width,
1885 GLfloat uv_height) { 2742 GLfloat uv_height) {
2743 NOTIMPLEMENTED();
1886 return error::kNoError; 2744 return error::kNoError;
1887 } 2745 }
1888 2746
1889 error::Error GLES2DecoderPassthroughImpl::DoScheduleCALayerSharedStateCHROMIUM( 2747 error::Error GLES2DecoderPassthroughImpl::DoScheduleCALayerSharedStateCHROMIUM(
1890 GLfloat opacity, 2748 GLfloat opacity,
1891 GLboolean is_clipped, 2749 GLboolean is_clipped,
1892 const GLfloat* clip_rect, 2750 const GLfloat* clip_rect,
1893 GLint sorting_context_id, 2751 GLint sorting_context_id,
1894 const GLfloat* transform) { 2752 const GLfloat* transform) {
2753 NOTIMPLEMENTED();
1895 return error::kNoError; 2754 return error::kNoError;
1896 } 2755 }
1897 2756
1898 error::Error GLES2DecoderPassthroughImpl::DoScheduleCALayerCHROMIUM( 2757 error::Error GLES2DecoderPassthroughImpl::DoScheduleCALayerCHROMIUM(
1899 GLuint contents_texture_id, 2758 GLuint contents_texture_id,
1900 const GLfloat* contents_rect, 2759 const GLfloat* contents_rect,
1901 GLuint background_color, 2760 GLuint background_color,
1902 GLuint edge_aa_mask, 2761 GLuint edge_aa_mask,
1903 const GLfloat* bounds_rect) { 2762 const GLfloat* bounds_rect) {
2763 NOTIMPLEMENTED();
1904 return error::kNoError; 2764 return error::kNoError;
1905 } 2765 }
1906 2766
1907 error::Error GLES2DecoderPassthroughImpl::DoScheduleCALayerInUseQueryCHROMIUM( 2767 error::Error GLES2DecoderPassthroughImpl::DoScheduleCALayerInUseQueryCHROMIUM(
1908 GLuint n, 2768 GLuint n,
1909 const volatile GLuint* textures) { 2769 const volatile GLuint* textures) {
2770 NOTIMPLEMENTED();
1910 return error::kNoError; 2771 return error::kNoError;
1911 } 2772 }
1912 2773
1913 error::Error GLES2DecoderPassthroughImpl::DoCommitOverlayPlanesCHROMIUM() { 2774 error::Error GLES2DecoderPassthroughImpl::DoCommitOverlayPlanesCHROMIUM() {
2775 NOTIMPLEMENTED();
1914 return error::kNoError; 2776 return error::kNoError;
1915 } 2777 }
1916 2778
1917 error::Error GLES2DecoderPassthroughImpl::DoSwapInterval(GLint interval) { 2779 error::Error GLES2DecoderPassthroughImpl::DoSwapInterval(GLint interval) {
2780 context_->SetSwapInterval(interval);
1918 return error::kNoError; 2781 return error::kNoError;
1919 } 2782 }
1920 2783
1921 error::Error GLES2DecoderPassthroughImpl::DoFlushDriverCachesCHROMIUM() { 2784 error::Error GLES2DecoderPassthroughImpl::DoFlushDriverCachesCHROMIUM() {
2785 NOTIMPLEMENTED();
1922 return error::kNoError; 2786 return error::kNoError;
1923 } 2787 }
1924 2788
1925 error::Error GLES2DecoderPassthroughImpl::DoMatrixLoadfCHROMIUM( 2789 error::Error GLES2DecoderPassthroughImpl::DoMatrixLoadfCHROMIUM(
1926 GLenum matrixMode, 2790 GLenum matrixMode,
1927 const volatile GLfloat* m) { 2791 const volatile GLfloat* m) {
2792 NOTIMPLEMENTED();
1928 return error::kNoError; 2793 return error::kNoError;
1929 } 2794 }
1930 2795
1931 error::Error GLES2DecoderPassthroughImpl::DoMatrixLoadIdentityCHROMIUM( 2796 error::Error GLES2DecoderPassthroughImpl::DoMatrixLoadIdentityCHROMIUM(
1932 GLenum matrixMode) { 2797 GLenum matrixMode) {
2798 NOTIMPLEMENTED();
1933 return error::kNoError; 2799 return error::kNoError;
1934 } 2800 }
1935 2801
1936 error::Error GLES2DecoderPassthroughImpl::DoGenPathsCHROMIUM(GLuint path, 2802 error::Error GLES2DecoderPassthroughImpl::DoGenPathsCHROMIUM(GLuint path,
1937 GLsizei range) { 2803 GLsizei range) {
2804 NOTIMPLEMENTED();
1938 return error::kNoError; 2805 return error::kNoError;
1939 } 2806 }
1940 2807
1941 error::Error GLES2DecoderPassthroughImpl::DoDeletePathsCHROMIUM(GLuint path, 2808 error::Error GLES2DecoderPassthroughImpl::DoDeletePathsCHROMIUM(GLuint path,
1942 GLsizei range) { 2809 GLsizei range) {
2810 NOTIMPLEMENTED();
1943 return error::kNoError; 2811 return error::kNoError;
1944 } 2812 }
1945 2813
1946 error::Error GLES2DecoderPassthroughImpl::DoIsPathCHROMIUM(GLuint path, 2814 error::Error GLES2DecoderPassthroughImpl::DoIsPathCHROMIUM(GLuint path,
1947 uint32_t* result) { 2815 uint32_t* result) {
2816 NOTIMPLEMENTED();
1948 return error::kNoError; 2817 return error::kNoError;
1949 } 2818 }
1950 2819
1951 error::Error GLES2DecoderPassthroughImpl::DoPathCommandsCHROMIUM( 2820 error::Error GLES2DecoderPassthroughImpl::DoPathCommandsCHROMIUM(
1952 GLuint path, 2821 GLuint path,
1953 GLsizei numCommands, 2822 GLsizei numCommands,
1954 const GLubyte* commands, 2823 const GLubyte* commands,
1955 GLsizei numCoords, 2824 GLsizei numCoords,
1956 GLenum coordType, 2825 GLenum coordType,
1957 const GLvoid* coords, 2826 const GLvoid* coords,
1958 GLsizei coords_bufsize) { 2827 GLsizei coords_bufsize) {
2828 NOTIMPLEMENTED();
1959 return error::kNoError; 2829 return error::kNoError;
1960 } 2830 }
1961 2831
1962 error::Error GLES2DecoderPassthroughImpl::DoPathParameterfCHROMIUM( 2832 error::Error GLES2DecoderPassthroughImpl::DoPathParameterfCHROMIUM(
1963 GLuint path, 2833 GLuint path,
1964 GLenum pname, 2834 GLenum pname,
1965 GLfloat value) { 2835 GLfloat value) {
2836 NOTIMPLEMENTED();
1966 return error::kNoError; 2837 return error::kNoError;
1967 } 2838 }
1968 2839
1969 error::Error GLES2DecoderPassthroughImpl::DoPathParameteriCHROMIUM( 2840 error::Error GLES2DecoderPassthroughImpl::DoPathParameteriCHROMIUM(
1970 GLuint path, 2841 GLuint path,
1971 GLenum pname, 2842 GLenum pname,
1972 GLint value) { 2843 GLint value) {
2844 NOTIMPLEMENTED();
1973 return error::kNoError; 2845 return error::kNoError;
1974 } 2846 }
1975 2847
1976 error::Error GLES2DecoderPassthroughImpl::DoPathStencilFuncCHROMIUM( 2848 error::Error GLES2DecoderPassthroughImpl::DoPathStencilFuncCHROMIUM(
1977 GLenum func, 2849 GLenum func,
1978 GLint ref, 2850 GLint ref,
1979 GLuint mask) { 2851 GLuint mask) {
2852 NOTIMPLEMENTED();
1980 return error::kNoError; 2853 return error::kNoError;
1981 } 2854 }
1982 2855
1983 error::Error GLES2DecoderPassthroughImpl::DoStencilFillPathCHROMIUM( 2856 error::Error GLES2DecoderPassthroughImpl::DoStencilFillPathCHROMIUM(
1984 GLuint path, 2857 GLuint path,
1985 GLenum fillMode, 2858 GLenum fillMode,
1986 GLuint mask) { 2859 GLuint mask) {
2860 NOTIMPLEMENTED();
1987 return error::kNoError; 2861 return error::kNoError;
1988 } 2862 }
1989 2863
1990 error::Error GLES2DecoderPassthroughImpl::DoStencilStrokePathCHROMIUM( 2864 error::Error GLES2DecoderPassthroughImpl::DoStencilStrokePathCHROMIUM(
1991 GLuint path, 2865 GLuint path,
1992 GLint reference, 2866 GLint reference,
1993 GLuint mask) { 2867 GLuint mask) {
2868 NOTIMPLEMENTED();
1994 return error::kNoError; 2869 return error::kNoError;
1995 } 2870 }
1996 2871
1997 error::Error GLES2DecoderPassthroughImpl::DoCoverFillPathCHROMIUM( 2872 error::Error GLES2DecoderPassthroughImpl::DoCoverFillPathCHROMIUM(
1998 GLuint path, 2873 GLuint path,
1999 GLenum coverMode) { 2874 GLenum coverMode) {
2875 NOTIMPLEMENTED();
2000 return error::kNoError; 2876 return error::kNoError;
2001 } 2877 }
2002 2878
2003 error::Error GLES2DecoderPassthroughImpl::DoCoverStrokePathCHROMIUM( 2879 error::Error GLES2DecoderPassthroughImpl::DoCoverStrokePathCHROMIUM(
2004 GLuint path, 2880 GLuint path,
2005 GLenum coverMode) { 2881 GLenum coverMode) {
2882 NOTIMPLEMENTED();
2006 return error::kNoError; 2883 return error::kNoError;
2007 } 2884 }
2008 2885
2009 error::Error GLES2DecoderPassthroughImpl::DoStencilThenCoverFillPathCHROMIUM( 2886 error::Error GLES2DecoderPassthroughImpl::DoStencilThenCoverFillPathCHROMIUM(
2010 GLuint path, 2887 GLuint path,
2011 GLenum fillMode, 2888 GLenum fillMode,
2012 GLuint mask, 2889 GLuint mask,
2013 GLenum coverMode) { 2890 GLenum coverMode) {
2891 NOTIMPLEMENTED();
2014 return error::kNoError; 2892 return error::kNoError;
2015 } 2893 }
2016 2894
2017 error::Error GLES2DecoderPassthroughImpl::DoStencilThenCoverStrokePathCHROMIUM( 2895 error::Error GLES2DecoderPassthroughImpl::DoStencilThenCoverStrokePathCHROMIUM(
2018 GLuint path, 2896 GLuint path,
2019 GLint reference, 2897 GLint reference,
2020 GLuint mask, 2898 GLuint mask,
2021 GLenum coverMode) { 2899 GLenum coverMode) {
2900 NOTIMPLEMENTED();
2022 return error::kNoError; 2901 return error::kNoError;
2023 } 2902 }
2024 2903
2025 error::Error GLES2DecoderPassthroughImpl::DoStencilFillPathInstancedCHROMIUM( 2904 error::Error GLES2DecoderPassthroughImpl::DoStencilFillPathInstancedCHROMIUM(
2026 GLsizei numPaths, 2905 GLsizei numPaths,
2027 GLenum pathNameType, 2906 GLenum pathNameType,
2028 const GLvoid* paths, 2907 const GLvoid* paths,
2029 GLsizei pathsBufsize, 2908 GLsizei pathsBufsize,
2030 GLuint pathBase, 2909 GLuint pathBase,
2031 GLenum fillMode, 2910 GLenum fillMode,
2032 GLuint mask, 2911 GLuint mask,
2033 GLenum transformType, 2912 GLenum transformType,
2034 const GLfloat* transformValues, 2913 const GLfloat* transformValues,
2035 GLsizei transformValuesBufsize) { 2914 GLsizei transformValuesBufsize) {
2915 NOTIMPLEMENTED();
2036 return error::kNoError; 2916 return error::kNoError;
2037 } 2917 }
2038 2918
2039 error::Error GLES2DecoderPassthroughImpl::DoStencilStrokePathInstancedCHROMIUM( 2919 error::Error GLES2DecoderPassthroughImpl::DoStencilStrokePathInstancedCHROMIUM(
2040 GLsizei numPaths, 2920 GLsizei numPaths,
2041 GLenum pathNameType, 2921 GLenum pathNameType,
2042 const GLvoid* paths, 2922 const GLvoid* paths,
2043 GLsizei pathsBufsize, 2923 GLsizei pathsBufsize,
2044 GLuint pathBase, 2924 GLuint pathBase,
2045 GLint reference, 2925 GLint reference,
2046 GLuint mask, 2926 GLuint mask,
2047 GLenum transformType, 2927 GLenum transformType,
2048 const GLfloat* transformValues, 2928 const GLfloat* transformValues,
2049 GLsizei transformValuesBufsize) { 2929 GLsizei transformValuesBufsize) {
2930 NOTIMPLEMENTED();
2050 return error::kNoError; 2931 return error::kNoError;
2051 } 2932 }
2052 2933
2053 error::Error GLES2DecoderPassthroughImpl::DoCoverFillPathInstancedCHROMIUM( 2934 error::Error GLES2DecoderPassthroughImpl::DoCoverFillPathInstancedCHROMIUM(
2054 GLsizei numPaths, 2935 GLsizei numPaths,
2055 GLenum pathNameType, 2936 GLenum pathNameType,
2056 const GLvoid* paths, 2937 const GLvoid* paths,
2057 GLsizei pathsBufsize, 2938 GLsizei pathsBufsize,
2058 GLuint pathBase, 2939 GLuint pathBase,
2059 GLenum coverMode, 2940 GLenum coverMode,
2060 GLenum transformType, 2941 GLenum transformType,
2061 const GLfloat* transformValues, 2942 const GLfloat* transformValues,
2062 GLsizei transformValuesBufsize) { 2943 GLsizei transformValuesBufsize) {
2944 NOTIMPLEMENTED();
2063 return error::kNoError; 2945 return error::kNoError;
2064 } 2946 }
2065 2947
2066 error::Error GLES2DecoderPassthroughImpl::DoCoverStrokePathInstancedCHROMIUM( 2948 error::Error GLES2DecoderPassthroughImpl::DoCoverStrokePathInstancedCHROMIUM(
2067 GLsizei numPaths, 2949 GLsizei numPaths,
2068 GLenum pathNameType, 2950 GLenum pathNameType,
2069 const GLvoid* paths, 2951 const GLvoid* paths,
2070 GLsizei pathsBufsize, 2952 GLsizei pathsBufsize,
2071 GLuint pathBase, 2953 GLuint pathBase,
2072 GLenum coverMode, 2954 GLenum coverMode,
2073 GLenum transformType, 2955 GLenum transformType,
2074 const GLfloat* transformValues, 2956 const GLfloat* transformValues,
2075 GLsizei transformValuesBufsize) { 2957 GLsizei transformValuesBufsize) {
2958 NOTIMPLEMENTED();
2076 return error::kNoError; 2959 return error::kNoError;
2077 } 2960 }
2078 2961
2079 error::Error 2962 error::Error
2080 GLES2DecoderPassthroughImpl::DoStencilThenCoverFillPathInstancedCHROMIUM( 2963 GLES2DecoderPassthroughImpl::DoStencilThenCoverFillPathInstancedCHROMIUM(
2081 GLsizei numPaths, 2964 GLsizei numPaths,
2082 GLenum pathNameType, 2965 GLenum pathNameType,
2083 const GLvoid* paths, 2966 const GLvoid* paths,
2084 GLsizei pathsBufsize, 2967 GLsizei pathsBufsize,
2085 GLuint pathBase, 2968 GLuint pathBase,
2086 GLenum fillMode, 2969 GLenum fillMode,
2087 GLuint mask, 2970 GLuint mask,
2088 GLenum coverMode, 2971 GLenum coverMode,
2089 GLenum transformType, 2972 GLenum transformType,
2090 const GLfloat* transformValues, 2973 const GLfloat* transformValues,
2091 GLsizei transformValuesBufsize) { 2974 GLsizei transformValuesBufsize) {
2975 NOTIMPLEMENTED();
2092 return error::kNoError; 2976 return error::kNoError;
2093 } 2977 }
2094 2978
2095 error::Error 2979 error::Error
2096 GLES2DecoderPassthroughImpl::DoStencilThenCoverStrokePathInstancedCHROMIUM( 2980 GLES2DecoderPassthroughImpl::DoStencilThenCoverStrokePathInstancedCHROMIUM(
2097 GLsizei numPaths, 2981 GLsizei numPaths,
2098 GLenum pathNameType, 2982 GLenum pathNameType,
2099 const GLvoid* paths, 2983 const GLvoid* paths,
2100 GLsizei pathsBufsize, 2984 GLsizei pathsBufsize,
2101 GLuint pathBase, 2985 GLuint pathBase,
2102 GLint reference, 2986 GLint reference,
2103 GLuint mask, 2987 GLuint mask,
2104 GLenum coverMode, 2988 GLenum coverMode,
2105 GLenum transformType, 2989 GLenum transformType,
2106 const GLfloat* transformValues, 2990 const GLfloat* transformValues,
2107 GLsizei transformValuesBufsize) { 2991 GLsizei transformValuesBufsize) {
2992 NOTIMPLEMENTED();
2108 return error::kNoError; 2993 return error::kNoError;
2109 } 2994 }
2110 2995
2111 error::Error GLES2DecoderPassthroughImpl::DoBindFragmentInputLocationCHROMIUM( 2996 error::Error GLES2DecoderPassthroughImpl::DoBindFragmentInputLocationCHROMIUM(
2112 GLuint program, 2997 GLuint program,
2113 GLint location, 2998 GLint location,
2114 const char* name) { 2999 const char* name) {
3000 NOTIMPLEMENTED();
2115 return error::kNoError; 3001 return error::kNoError;
2116 } 3002 }
2117 3003
2118 error::Error GLES2DecoderPassthroughImpl::DoProgramPathFragmentInputGenCHROMIUM( 3004 error::Error GLES2DecoderPassthroughImpl::DoProgramPathFragmentInputGenCHROMIUM(
2119 GLuint program, 3005 GLuint program,
2120 GLint location, 3006 GLint location,
2121 GLenum genMode, 3007 GLenum genMode,
2122 GLint components, 3008 GLint components,
2123 const GLfloat* coeffs, 3009 const GLfloat* coeffs,
2124 GLsizei coeffsBufsize) { 3010 GLsizei coeffsBufsize) {
3011 NOTIMPLEMENTED();
2125 return error::kNoError; 3012 return error::kNoError;
2126 } 3013 }
2127 3014
2128 error::Error GLES2DecoderPassthroughImpl::DoCoverageModulationCHROMIUM( 3015 error::Error GLES2DecoderPassthroughImpl::DoCoverageModulationCHROMIUM(
2129 GLenum components) { 3016 GLenum components) {
3017 NOTIMPLEMENTED();
2130 return error::kNoError; 3018 return error::kNoError;
2131 } 3019 }
2132 3020
2133 error::Error GLES2DecoderPassthroughImpl::DoBlendBarrierKHR() { 3021 error::Error GLES2DecoderPassthroughImpl::DoBlendBarrierKHR() {
3022 NOTIMPLEMENTED();
2134 return error::kNoError; 3023 return error::kNoError;
2135 } 3024 }
2136 3025
2137 error::Error 3026 error::Error
2138 GLES2DecoderPassthroughImpl::DoApplyScreenSpaceAntialiasingCHROMIUM() { 3027 GLES2DecoderPassthroughImpl::DoApplyScreenSpaceAntialiasingCHROMIUM() {
3028 NOTIMPLEMENTED();
2139 return error::kNoError; 3029 return error::kNoError;
2140 } 3030 }
2141 3031
2142 error::Error GLES2DecoderPassthroughImpl::DoBindFragDataLocationIndexedEXT( 3032 error::Error GLES2DecoderPassthroughImpl::DoBindFragDataLocationIndexedEXT(
2143 GLuint program, 3033 GLuint program,
2144 GLuint colorNumber, 3034 GLuint colorNumber,
2145 GLuint index, 3035 GLuint index,
2146 const char* name) { 3036 const char* name) {
3037 NOTIMPLEMENTED();
2147 return error::kNoError; 3038 return error::kNoError;
2148 } 3039 }
2149 3040
2150 error::Error GLES2DecoderPassthroughImpl::DoBindFragDataLocationEXT( 3041 error::Error GLES2DecoderPassthroughImpl::DoBindFragDataLocationEXT(
2151 GLuint program, 3042 GLuint program,
2152 GLuint colorNumber, 3043 GLuint colorNumber,
2153 const char* name) { 3044 const char* name) {
3045 NOTIMPLEMENTED();
2154 return error::kNoError; 3046 return error::kNoError;
2155 } 3047 }
2156 3048
2157 error::Error GLES2DecoderPassthroughImpl::DoGetFragDataIndexEXT( 3049 error::Error GLES2DecoderPassthroughImpl::DoGetFragDataIndexEXT(
2158 GLuint program, 3050 GLuint program,
2159 const char* name, 3051 const char* name,
2160 GLint* index) { 3052 GLint* index) {
3053 NOTIMPLEMENTED();
2161 return error::kNoError; 3054 return error::kNoError;
2162 } 3055 }
2163 3056
2164 error::Error 3057 error::Error
2165 GLES2DecoderPassthroughImpl::DoUniformMatrix4fvStreamTextureMatrixCHROMIUM( 3058 GLES2DecoderPassthroughImpl::DoUniformMatrix4fvStreamTextureMatrixCHROMIUM(
2166 GLint location, 3059 GLint location,
2167 GLboolean transpose, 3060 GLboolean transpose,
2168 const volatile GLfloat* defaultValue) { 3061 const volatile GLfloat* defaultValue) {
3062 NOTIMPLEMENTED();
2169 return error::kNoError; 3063 return error::kNoError;
2170 } 3064 }
2171 3065
2172 } // namespace gles2 3066 } // namespace gles2
2173 } // namespace gpu 3067 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698