blob: 8dc248ce9c94a16a2036cbb96ea7bd9f2052e524 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00003// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000013#include "common/utilities.h"
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +000014#include "libGLESv2/formatutils.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000016#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000017#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000020#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000021#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000022#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "libGLESv2/Context.h"
Jamie Madill57a89722013-07-02 11:57:03 -040024#include "libGLESv2/VertexArray.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000025
Geoff Lange8ebe7f2013-08-05 15:03:13 -040026#include "libGLESv2/validationES.h"
27#include "libGLESv2/validationES2.h"
28#include "libGLESv2/validationES3.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040029
30
Jamie Madillfb8a8302013-07-03 14:24:12 -040031gl::Texture *getTargetTexture(gl::Context *context, GLenum target)
32{
33 if (context->getClientVersion() < 3)
34 {
35 if (target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY)
36 {
37 return NULL;
38 }
39 }
40
41 switch (target)
42 {
43 case GL_TEXTURE_2D: return context->getTexture2D();
44 case GL_TEXTURE_CUBE_MAP: return context->getTextureCubeMap();
45 case GL_TEXTURE_3D: return context->getTexture3D();
46 case GL_TEXTURE_2D_ARRAY: return context->getTexture2DArray();
47 default: return NULL;
48 }
49}
Jamie Madill478fdb22013-07-19 16:36:59 -040050
Jamie Madillf6cc8cc2013-07-03 12:44:15 -040051
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000052extern "C"
53{
54
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000055// OpenGL ES 2.0 functions
56
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000057void __stdcall glActiveTexture(GLenum texture)
58{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000059 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000060
61 try
62 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000063 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000064
65 if (context)
66 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000067 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
68 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000069 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000070 }
71
daniel@transgaming.com428d1582010-05-04 03:35:25 +000072 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000073 }
74 }
75 catch(std::bad_alloc&)
76 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000077 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000078 }
79}
80
81void __stdcall glAttachShader(GLuint program, GLuint shader)
82{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000083 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000084
85 try
86 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000087 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000088
89 if (context)
90 {
91 gl::Program *programObject = context->getProgram(program);
92 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000093
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000094 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000095 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000096 if (context->getShader(program))
97 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000098 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000099 }
100 else
101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000102 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000103 }
104 }
105
106 if (!shaderObject)
107 {
108 if (context->getProgram(shader))
109 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000110 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000111 }
112 else
113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000114 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000115 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000116 }
117
118 if (!programObject->attachShader(shaderObject))
119 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000120 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000121 }
122 }
123 }
124 catch(std::bad_alloc&)
125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000126 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000127 }
128}
129
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000130void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
131{
132 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
133
134 try
135 {
136 switch (target)
137 {
138 case GL_ANY_SAMPLES_PASSED_EXT:
139 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
140 break;
141 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000142 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000143 }
144
145 if (id == 0)
146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000147 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000148 }
149
150 gl::Context *context = gl::getNonLostContext();
151
152 if (context)
153 {
154 context->beginQuery(target, id);
155 }
156 }
157 catch(std::bad_alloc&)
158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000159 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000160 }
161}
162
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000163void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000164{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000165 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000166
167 try
168 {
169 if (index >= gl::MAX_VERTEX_ATTRIBS)
170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000171 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000172 }
173
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000174 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000175
176 if (context)
177 {
178 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000179
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000180 if (!programObject)
181 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000182 if (context->getShader(program))
183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000184 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000185 }
186 else
187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000188 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000189 }
190 }
191
192 if (strncmp(name, "gl_", 3) == 0)
193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000194 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000195 }
196
197 programObject->bindAttributeLocation(index, name);
198 }
199 }
200 catch(std::bad_alloc&)
201 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000202 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000203 }
204}
205
206void __stdcall glBindBuffer(GLenum target, GLuint buffer)
207{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000208 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000209
210 try
211 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000212 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000213
214 if (context)
215 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000216 // Check ES3 specific targets
217 switch (target)
218 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000219 case GL_COPY_READ_BUFFER:
220 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000221 case GL_PIXEL_PACK_BUFFER:
222 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000223 case GL_UNIFORM_BUFFER:
224 case GL_TRANSFORM_FEEDBACK_BUFFER:
225 if (context->getClientVersion() < 3)
226 {
227 return gl::error(GL_INVALID_ENUM);
228 }
229 }
230
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000231 switch (target)
232 {
233 case GL_ARRAY_BUFFER:
234 context->bindArrayBuffer(buffer);
235 return;
236 case GL_ELEMENT_ARRAY_BUFFER:
237 context->bindElementArrayBuffer(buffer);
238 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000239 case GL_COPY_READ_BUFFER:
240 context->bindCopyReadBuffer(buffer);
241 return;
242 case GL_COPY_WRITE_BUFFER:
243 context->bindCopyWriteBuffer(buffer);
244 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000245 case GL_PIXEL_PACK_BUFFER:
246 context->bindPixelPackBuffer(buffer);
247 return;
248 case GL_PIXEL_UNPACK_BUFFER:
249 context->bindPixelUnpackBuffer(buffer);
250 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000251 case GL_UNIFORM_BUFFER:
252 context->bindGenericUniformBuffer(buffer);
253 return;
254 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000255 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000256 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000257 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000258 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000259 }
260 }
261 }
262 catch(std::bad_alloc&)
263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000264 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000265 }
266}
267
268void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
269{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000270 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000271
272 try
273 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000274 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000276 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000277 }
278
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000279 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000280
281 if (context)
282 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000283 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
284 {
285 context->bindReadFramebuffer(framebuffer);
286 }
287
288 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
289 {
290 context->bindDrawFramebuffer(framebuffer);
291 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000292 }
293 }
294 catch(std::bad_alloc&)
295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000296 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000297 }
298}
299
300void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
301{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000302 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000303
304 try
305 {
306 if (target != GL_RENDERBUFFER)
307 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000308 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000309 }
310
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000311 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000312
313 if (context)
314 {
315 context->bindRenderbuffer(renderbuffer);
316 }
317 }
318 catch(std::bad_alloc&)
319 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000320 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000321 }
322}
323
324void __stdcall glBindTexture(GLenum target, GLuint texture)
325{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000326 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000327
328 try
329 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000330 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000331
332 if (context)
333 {
334 gl::Texture *textureObject = context->getTexture(texture);
335
336 if (textureObject && textureObject->getTarget() != target && texture != 0)
337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000338 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000339 }
340
341 switch (target)
342 {
343 case GL_TEXTURE_2D:
344 context->bindTexture2D(texture);
345 return;
346 case GL_TEXTURE_CUBE_MAP:
347 context->bindTextureCubeMap(texture);
348 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000349 case GL_TEXTURE_3D:
350 if (context->getClientVersion() < 3)
351 {
352 return gl::error(GL_INVALID_ENUM);
353 }
354 context->bindTexture3D(texture);
355 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000356 case GL_TEXTURE_2D_ARRAY:
357 if (context->getClientVersion() < 3)
358 {
359 return gl::error(GL_INVALID_ENUM);
360 }
361 context->bindTexture2DArray(texture);
362 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000363 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000364 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000365 }
366 }
367 }
368 catch(std::bad_alloc&)
369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000370 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000371 }
372}
373
374void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
375{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000376 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000377 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000378
379 try
380 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000381 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000382
383 if (context)
384 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000385 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000386 }
387 }
388 catch(std::bad_alloc&)
389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000390 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000391 }
392}
393
394void __stdcall glBlendEquation(GLenum mode)
395{
396 glBlendEquationSeparate(mode, mode);
397}
398
399void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
400{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000401 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000402
403 try
404 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000405 gl::Context *context = gl::getNonLostContext();
406
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000407 switch (modeRGB)
408 {
409 case GL_FUNC_ADD:
410 case GL_FUNC_SUBTRACT:
411 case GL_FUNC_REVERSE_SUBTRACT:
412 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000413
414 case GL_MIN:
415 case GL_MAX:
416 if (context && context->getClientVersion() < 3)
417 {
418 return gl::error(GL_INVALID_ENUM);
419 }
420 break;
421
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000422 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000423 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000424 }
425
426 switch (modeAlpha)
427 {
428 case GL_FUNC_ADD:
429 case GL_FUNC_SUBTRACT:
430 case GL_FUNC_REVERSE_SUBTRACT:
431 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000432
433 case GL_MIN:
434 case GL_MAX:
435 if (context && context->getClientVersion() < 3)
436 {
437 return gl::error(GL_INVALID_ENUM);
438 }
439 break;
440
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000441 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000442 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000443 }
444
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000445 if (context)
446 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000447 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000448 }
449 }
450 catch(std::bad_alloc&)
451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000452 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000453 }
454}
455
456void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
457{
458 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
459}
460
461void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
462{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000463 EVENT("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000464 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000465
466 try
467 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000468 gl::Context *context = gl::getNonLostContext();
469
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000470 switch (srcRGB)
471 {
472 case GL_ZERO:
473 case GL_ONE:
474 case GL_SRC_COLOR:
475 case GL_ONE_MINUS_SRC_COLOR:
476 case GL_DST_COLOR:
477 case GL_ONE_MINUS_DST_COLOR:
478 case GL_SRC_ALPHA:
479 case GL_ONE_MINUS_SRC_ALPHA:
480 case GL_DST_ALPHA:
481 case GL_ONE_MINUS_DST_ALPHA:
482 case GL_CONSTANT_COLOR:
483 case GL_ONE_MINUS_CONSTANT_COLOR:
484 case GL_CONSTANT_ALPHA:
485 case GL_ONE_MINUS_CONSTANT_ALPHA:
486 case GL_SRC_ALPHA_SATURATE:
487 break;
488 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000489 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000490 }
491
492 switch (dstRGB)
493 {
494 case GL_ZERO:
495 case GL_ONE:
496 case GL_SRC_COLOR:
497 case GL_ONE_MINUS_SRC_COLOR:
498 case GL_DST_COLOR:
499 case GL_ONE_MINUS_DST_COLOR:
500 case GL_SRC_ALPHA:
501 case GL_ONE_MINUS_SRC_ALPHA:
502 case GL_DST_ALPHA:
503 case GL_ONE_MINUS_DST_ALPHA:
504 case GL_CONSTANT_COLOR:
505 case GL_ONE_MINUS_CONSTANT_COLOR:
506 case GL_CONSTANT_ALPHA:
507 case GL_ONE_MINUS_CONSTANT_ALPHA:
508 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000509
510 case GL_SRC_ALPHA_SATURATE:
511 if (!context || context->getClientVersion() < 3)
512 {
513 return gl::error(GL_INVALID_ENUM);
514 }
515 break;
516
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000517 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000518 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000519 }
520
521 switch (srcAlpha)
522 {
523 case GL_ZERO:
524 case GL_ONE:
525 case GL_SRC_COLOR:
526 case GL_ONE_MINUS_SRC_COLOR:
527 case GL_DST_COLOR:
528 case GL_ONE_MINUS_DST_COLOR:
529 case GL_SRC_ALPHA:
530 case GL_ONE_MINUS_SRC_ALPHA:
531 case GL_DST_ALPHA:
532 case GL_ONE_MINUS_DST_ALPHA:
533 case GL_CONSTANT_COLOR:
534 case GL_ONE_MINUS_CONSTANT_COLOR:
535 case GL_CONSTANT_ALPHA:
536 case GL_ONE_MINUS_CONSTANT_ALPHA:
537 case GL_SRC_ALPHA_SATURATE:
538 break;
539 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000540 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000541 }
542
543 switch (dstAlpha)
544 {
545 case GL_ZERO:
546 case GL_ONE:
547 case GL_SRC_COLOR:
548 case GL_ONE_MINUS_SRC_COLOR:
549 case GL_DST_COLOR:
550 case GL_ONE_MINUS_DST_COLOR:
551 case GL_SRC_ALPHA:
552 case GL_ONE_MINUS_SRC_ALPHA:
553 case GL_DST_ALPHA:
554 case GL_ONE_MINUS_DST_ALPHA:
555 case GL_CONSTANT_COLOR:
556 case GL_ONE_MINUS_CONSTANT_COLOR:
557 case GL_CONSTANT_ALPHA:
558 case GL_ONE_MINUS_CONSTANT_ALPHA:
559 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000560
561 case GL_SRC_ALPHA_SATURATE:
562 if (!context || context->getClientVersion() < 3)
563 {
564 return gl::error(GL_INVALID_ENUM);
565 }
566 break;
567
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000568 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000569 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000570 }
571
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000572 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
573 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
574
575 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
576 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
577
578 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000579 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000580 ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000581 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000582 }
583
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000584 if (context)
585 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000586 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000587 }
588 }
589 catch(std::bad_alloc&)
590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000591 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000592 }
593}
594
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000595void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000596{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000597 EVENT("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000598 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000599
600 try
601 {
602 if (size < 0)
603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000604 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000605 }
606
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000607 gl::Context *context = gl::getNonLostContext();
608
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000609 switch (usage)
610 {
611 case GL_STREAM_DRAW:
612 case GL_STATIC_DRAW:
613 case GL_DYNAMIC_DRAW:
614 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000615
616 case GL_STREAM_READ:
617 case GL_STREAM_COPY:
618 case GL_STATIC_READ:
619 case GL_STATIC_COPY:
620 case GL_DYNAMIC_READ:
621 case GL_DYNAMIC_COPY:
622 if (context && context->getClientVersion() < 3)
623 {
624 return gl::error(GL_INVALID_ENUM);
625 }
626 break;
627
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000628 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000629 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000630 }
631
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000632 if (context)
633 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000634 // Check ES3 specific targets
635 switch (target)
636 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000637 case GL_COPY_READ_BUFFER:
638 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000639 case GL_PIXEL_PACK_BUFFER:
640 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000641 case GL_UNIFORM_BUFFER:
642 case GL_TRANSFORM_FEEDBACK_BUFFER:
643 if (context->getClientVersion() < 3)
644 {
645 return gl::error(GL_INVALID_ENUM);
646 }
647 }
648
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000649 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000650
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000651 switch (target)
652 {
653 case GL_ARRAY_BUFFER:
654 buffer = context->getArrayBuffer();
655 break;
656 case GL_ELEMENT_ARRAY_BUFFER:
657 buffer = context->getElementArrayBuffer();
658 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000659 case GL_COPY_READ_BUFFER:
660 buffer = context->getCopyReadBuffer();
661 break;
662 case GL_COPY_WRITE_BUFFER:
663 buffer = context->getCopyWriteBuffer();
664 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000665 case GL_PIXEL_PACK_BUFFER:
666 buffer = context->getPixelPackBuffer();
667 break;
668 case GL_PIXEL_UNPACK_BUFFER:
669 buffer = context->getPixelUnpackBuffer();
670 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000671 case GL_TRANSFORM_FEEDBACK_BUFFER:
672 buffer = context->getGenericTransformFeedbackBuffer();
673 break;
674 case GL_UNIFORM_BUFFER:
675 buffer = context->getGenericUniformBuffer();
676 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000677 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000678 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000679 }
680
681 if (!buffer)
682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000683 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000684 }
685
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000686 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000687 }
688 }
689 catch(std::bad_alloc&)
690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000691 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000692 }
693}
694
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000695void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000696{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000697 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000698 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000699
700 try
701 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000702 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000704 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000705 }
706
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000707 if (data == NULL)
708 {
709 return;
710 }
711
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000712 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000713
714 if (context)
715 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000716 // Check ES3 specific targets
717 switch (target)
718 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000719 case GL_COPY_READ_BUFFER:
720 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000721 case GL_PIXEL_PACK_BUFFER:
722 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000723 case GL_UNIFORM_BUFFER:
724 case GL_TRANSFORM_FEEDBACK_BUFFER:
725 if (context->getClientVersion() < 3)
726 {
727 return gl::error(GL_INVALID_ENUM);
728 }
729 }
730
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000731 gl::Buffer *buffer;
732
733 switch (target)
734 {
735 case GL_ARRAY_BUFFER:
736 buffer = context->getArrayBuffer();
737 break;
738 case GL_ELEMENT_ARRAY_BUFFER:
739 buffer = context->getElementArrayBuffer();
740 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000741 case GL_COPY_READ_BUFFER:
742 buffer = context->getCopyReadBuffer();
743 break;
744 case GL_COPY_WRITE_BUFFER:
745 buffer = context->getCopyWriteBuffer();
746 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000747 case GL_PIXEL_PACK_BUFFER:
748 buffer = context->getPixelPackBuffer();
749 break;
750 case GL_PIXEL_UNPACK_BUFFER:
751 buffer = context->getPixelUnpackBuffer();
752 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000753 case GL_TRANSFORM_FEEDBACK_BUFFER:
754 buffer = context->getGenericTransformFeedbackBuffer();
755 break;
756 case GL_UNIFORM_BUFFER:
757 buffer = context->getGenericUniformBuffer();
758 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000759 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000760 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000761 }
762
763 if (!buffer)
764 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000765 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000766 }
767
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000768 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000770 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000771 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000772
773 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000774 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000775 }
776 catch(std::bad_alloc&)
777 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000778 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000779 }
780}
781
782GLenum __stdcall glCheckFramebufferStatus(GLenum target)
783{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000784 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000785
786 try
787 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000788 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000790 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000791 }
792
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000793 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000794
795 if (context)
796 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000797 gl::Framebuffer *framebuffer = NULL;
798 if (target == GL_READ_FRAMEBUFFER_ANGLE)
799 {
800 framebuffer = context->getReadFramebuffer();
801 }
802 else
803 {
804 framebuffer = context->getDrawFramebuffer();
805 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000806
807 return framebuffer->completeness();
808 }
809 }
810 catch(std::bad_alloc&)
811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000812 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000813 }
814
815 return 0;
816}
817
818void __stdcall glClear(GLbitfield mask)
819{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000820 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000821
822 try
823 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000824 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000825
826 if (context)
827 {
828 context->clear(mask);
829 }
830 }
831 catch(std::bad_alloc&)
832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000833 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000834 }
835}
836
837void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
838{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000839 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000840 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000841
842 try
843 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000844 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000845
846 if (context)
847 {
848 context->setClearColor(red, green, blue, alpha);
849 }
850 }
851 catch(std::bad_alloc&)
852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000853 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000854 }
855}
856
857void __stdcall glClearDepthf(GLclampf depth)
858{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000859 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000860
861 try
862 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000863 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000864
865 if (context)
866 {
867 context->setClearDepth(depth);
868 }
869 }
870 catch(std::bad_alloc&)
871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000872 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000873 }
874}
875
876void __stdcall glClearStencil(GLint s)
877{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000878 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000879
880 try
881 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000882 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000883
884 if (context)
885 {
886 context->setClearStencil(s);
887 }
888 }
889 catch(std::bad_alloc&)
890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000891 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000892 }
893}
894
895void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
896{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000897 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000898 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000899
900 try
901 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000902 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000903
904 if (context)
905 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000906 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000907 }
908 }
909 catch(std::bad_alloc&)
910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000911 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000912 }
913}
914
915void __stdcall glCompileShader(GLuint shader)
916{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000917 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000918
919 try
920 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000921 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000922
923 if (context)
924 {
925 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000926
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000927 if (!shaderObject)
928 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000929 if (context->getProgram(shader))
930 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000931 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000932 }
933 else
934 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000935 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000936 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000937 }
938
939 shaderObject->compile();
940 }
941 }
942 catch(std::bad_alloc&)
943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000944 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000945 }
946}
947
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000948void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
949 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000950{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000951 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000952 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000953 target, level, internalformat, width, height, border, imageSize, data);
954
955 try
956 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000957 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000958
959 if (context)
960 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000961 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400962 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000963 0, 0, width, height, 0, GL_NONE, GL_NONE, data))
964 {
965 return;
966 }
967
968 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400969 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000970 0, 0, 0, width, height, 1, 0, GL_NONE, GL_NONE))
971 {
972 return;
973 }
974
975 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000976 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000977 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000978 }
979
980 switch (target)
981 {
982 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000983 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000984 gl::Texture2D *texture = context->getTexture2D();
985 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000986 }
987 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000988
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000989 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
990 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
991 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
992 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
993 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
994 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000995 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000996 gl::TextureCubeMap *texture = context->getTextureCubeMap();
997 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000998 }
999 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001000
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001001 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001002 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001003 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001004 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001005 }
1006 catch(std::bad_alloc&)
1007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001008 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001009 }
1010}
1011
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001012void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1013 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001014{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001015 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001016 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001017 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001018 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1019
1020 try
1021 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001022 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001023
1024 if (context)
1025 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001026 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001027 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001028 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
1029 {
1030 return;
1031 }
1032
1033 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001034 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001035 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE))
1036 {
1037 return;
1038 }
1039
1040 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001041 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001042 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001043 }
1044
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001045 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +00001046 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001047 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001048 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001049 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001050 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001051 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001052 break;
1053
1054 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1055 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1056 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1057 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1058 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1059 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001060 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001061 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001062 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001063 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001064 break;
1065
1066 default:
1067 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001068 }
1069 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001070 }
1071 catch(std::bad_alloc&)
1072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001073 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001074 }
1075}
1076
1077void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1078{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001079 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001080 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001081 target, level, internalformat, x, y, width, height, border);
1082
1083 try
1084 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001085 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001086
1087 if (context)
1088 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001089 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001090 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001091 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001092 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001093 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001094 }
1095
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001096 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001097 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001098 0, 0, 0, x, y, width, height, border))
1099 {
1100 return;
1101 }
1102
1103 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
1104
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001105 switch (target)
1106 {
1107 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001108 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001109 gl::Texture2D *texture = context->getTexture2D();
1110 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001111 }
1112 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001113
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001114 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1115 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1116 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1117 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1118 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1119 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001120 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001121 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1122 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001123 }
1124 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001125
1126 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001127 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001128 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001129 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001130 }
1131 catch(std::bad_alloc&)
1132 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001133 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001134 }
1135}
1136
1137void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1138{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001139 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001140 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001141 target, level, xoffset, yoffset, x, y, width, height);
1142
1143 try
1144 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001145 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001146
1147 if (context)
1148 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001149 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001150 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001151 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001152 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001153 return;
1154 }
1155
1156 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001157 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001158 xoffset, yoffset, 0, x, y, width, height, 0))
1159 {
1160 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001161 }
1162
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001163 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001164
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001165 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001166 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001167 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001168 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001169 gl::Texture2D *texture = context->getTexture2D();
1170 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001171 }
1172 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001173
1174 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1175 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1176 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1177 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1178 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1179 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001180 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001181 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1182 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001183 }
1184 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001185
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001186 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001187 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001188 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001189 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001190 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001191
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001192 catch(std::bad_alloc&)
1193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001194 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001195 }
1196}
1197
1198GLuint __stdcall glCreateProgram(void)
1199{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001200 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001201
1202 try
1203 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001204 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001205
1206 if (context)
1207 {
1208 return context->createProgram();
1209 }
1210 }
1211 catch(std::bad_alloc&)
1212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001213 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001214 }
1215
1216 return 0;
1217}
1218
1219GLuint __stdcall glCreateShader(GLenum type)
1220{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001221 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001222
1223 try
1224 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001225 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001226
1227 if (context)
1228 {
1229 switch (type)
1230 {
1231 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001232 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001233 return context->createShader(type);
1234 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001235 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001236 }
1237 }
1238 }
1239 catch(std::bad_alloc&)
1240 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001241 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001242 }
1243
1244 return 0;
1245}
1246
1247void __stdcall glCullFace(GLenum mode)
1248{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001249 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001250
1251 try
1252 {
1253 switch (mode)
1254 {
1255 case GL_FRONT:
1256 case GL_BACK:
1257 case GL_FRONT_AND_BACK:
1258 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001259 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001260
1261 if (context)
1262 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001263 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001264 }
1265 }
1266 break;
1267 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001268 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001269 }
1270 }
1271 catch(std::bad_alloc&)
1272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001273 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001274 }
1275}
1276
1277void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1278{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001279 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001280
1281 try
1282 {
1283 if (n < 0)
1284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001285 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001286 }
1287
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001288 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001289
1290 if (context)
1291 {
1292 for (int i = 0; i < n; i++)
1293 {
1294 context->deleteBuffer(buffers[i]);
1295 }
1296 }
1297 }
1298 catch(std::bad_alloc&)
1299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001300 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001301 }
1302}
1303
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001304void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1305{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001306 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001307
1308 try
1309 {
1310 if (n < 0)
1311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001312 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001313 }
1314
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001315 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001316
1317 if (context)
1318 {
1319 for (int i = 0; i < n; i++)
1320 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001321 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001322 }
1323 }
1324 }
1325 catch(std::bad_alloc&)
1326 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001327 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001328 }
1329}
1330
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001331void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1332{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001333 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001334
1335 try
1336 {
1337 if (n < 0)
1338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001339 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001340 }
1341
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001342 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001343
1344 if (context)
1345 {
1346 for (int i = 0; i < n; i++)
1347 {
1348 if (framebuffers[i] != 0)
1349 {
1350 context->deleteFramebuffer(framebuffers[i]);
1351 }
1352 }
1353 }
1354 }
1355 catch(std::bad_alloc&)
1356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001357 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001358 }
1359}
1360
1361void __stdcall glDeleteProgram(GLuint program)
1362{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001363 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001364
1365 try
1366 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001367 if (program == 0)
1368 {
1369 return;
1370 }
1371
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001372 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001373
1374 if (context)
1375 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001376 if (!context->getProgram(program))
1377 {
1378 if(context->getShader(program))
1379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001380 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001381 }
1382 else
1383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001384 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001385 }
1386 }
1387
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001388 context->deleteProgram(program);
1389 }
1390 }
1391 catch(std::bad_alloc&)
1392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001393 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001394 }
1395}
1396
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001397void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1398{
1399 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1400
1401 try
1402 {
1403 if (n < 0)
1404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001405 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001406 }
1407
1408 gl::Context *context = gl::getNonLostContext();
1409
1410 if (context)
1411 {
1412 for (int i = 0; i < n; i++)
1413 {
1414 context->deleteQuery(ids[i]);
1415 }
1416 }
1417 }
1418 catch(std::bad_alloc&)
1419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001420 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001421 }
1422}
1423
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001424void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1425{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001426 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001427
1428 try
1429 {
1430 if (n < 0)
1431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001432 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001433 }
1434
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001435 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001436
1437 if (context)
1438 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001439 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001440 {
1441 context->deleteRenderbuffer(renderbuffers[i]);
1442 }
1443 }
1444 }
1445 catch(std::bad_alloc&)
1446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001447 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001448 }
1449}
1450
1451void __stdcall glDeleteShader(GLuint shader)
1452{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001453 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001454
1455 try
1456 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001457 if (shader == 0)
1458 {
1459 return;
1460 }
1461
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001462 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001463
1464 if (context)
1465 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001466 if (!context->getShader(shader))
1467 {
1468 if(context->getProgram(shader))
1469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001470 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001471 }
1472 else
1473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001474 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001475 }
1476 }
1477
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001478 context->deleteShader(shader);
1479 }
1480 }
1481 catch(std::bad_alloc&)
1482 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001483 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001484 }
1485}
1486
1487void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1488{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001489 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001490
1491 try
1492 {
1493 if (n < 0)
1494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001495 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001496 }
1497
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001498 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001499
1500 if (context)
1501 {
1502 for (int i = 0; i < n; i++)
1503 {
1504 if (textures[i] != 0)
1505 {
1506 context->deleteTexture(textures[i]);
1507 }
1508 }
1509 }
1510 }
1511 catch(std::bad_alloc&)
1512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001513 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001514 }
1515}
1516
1517void __stdcall glDepthFunc(GLenum func)
1518{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001519 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001520
1521 try
1522 {
1523 switch (func)
1524 {
1525 case GL_NEVER:
1526 case GL_ALWAYS:
1527 case GL_LESS:
1528 case GL_LEQUAL:
1529 case GL_EQUAL:
1530 case GL_GREATER:
1531 case GL_GEQUAL:
1532 case GL_NOTEQUAL:
1533 break;
1534 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001535 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001536 }
1537
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001538 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001539
1540 if (context)
1541 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001542 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001543 }
1544 }
1545 catch(std::bad_alloc&)
1546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001547 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001548 }
1549}
1550
1551void __stdcall glDepthMask(GLboolean flag)
1552{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001553 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001554
1555 try
1556 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001557 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001558
1559 if (context)
1560 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001561 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001562 }
1563 }
1564 catch(std::bad_alloc&)
1565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001566 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001567 }
1568}
1569
1570void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1571{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001572 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001573
1574 try
1575 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001576 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001577
1578 if (context)
1579 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001580 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001581 }
1582 }
1583 catch(std::bad_alloc&)
1584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001585 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001586 }
1587}
1588
1589void __stdcall glDetachShader(GLuint program, GLuint shader)
1590{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001591 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001592
1593 try
1594 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001595 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001596
1597 if (context)
1598 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001599
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001600 gl::Program *programObject = context->getProgram(program);
1601 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001602
1603 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001604 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001605 gl::Shader *shaderByProgramHandle;
1606 shaderByProgramHandle = context->getShader(program);
1607 if (!shaderByProgramHandle)
1608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001609 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001610 }
1611 else
1612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001613 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001614 }
1615 }
1616
1617 if (!shaderObject)
1618 {
1619 gl::Program *programByShaderHandle = context->getProgram(shader);
1620 if (!programByShaderHandle)
1621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001622 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001623 }
1624 else
1625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001626 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001627 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001628 }
1629
1630 if (!programObject->detachShader(shaderObject))
1631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001632 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001633 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001634 }
1635 }
1636 catch(std::bad_alloc&)
1637 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001638 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001639 }
1640}
1641
1642void __stdcall glDisable(GLenum cap)
1643{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001644 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001645
1646 try
1647 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001648 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001649
1650 if (context)
1651 {
1652 switch (cap)
1653 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001654 case GL_CULL_FACE: context->setCullFace(false); break;
1655 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
1656 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
1657 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
1658 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
1659 case GL_STENCIL_TEST: context->setStencilTest(false); break;
1660 case GL_DEPTH_TEST: context->setDepthTest(false); break;
1661 case GL_BLEND: context->setBlend(false); break;
1662 case GL_DITHER: context->setDither(false); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00001663
1664 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1665 case GL_RASTERIZER_DISCARD:
1666 if (context->getClientVersion() < 3)
1667 {
1668 return gl::error(GL_INVALID_ENUM);
1669 }
1670 UNIMPLEMENTED();
1671 break;
1672
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001673 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001674 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001675 }
1676 }
1677 }
1678 catch(std::bad_alloc&)
1679 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001680 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001681 }
1682}
1683
1684void __stdcall glDisableVertexAttribArray(GLuint index)
1685{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001686 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001687
1688 try
1689 {
1690 if (index >= gl::MAX_VERTEX_ATTRIBS)
1691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001692 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001693 }
1694
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001695 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001696
1697 if (context)
1698 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001699 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001700 }
1701 }
1702 catch(std::bad_alloc&)
1703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001704 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001705 }
1706}
1707
1708void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1709{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001710 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001711
1712 try
1713 {
1714 if (count < 0 || first < 0)
1715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001716 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001717 }
1718
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001719 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001720
1721 if (context)
1722 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001723 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001724 }
1725 }
1726 catch(std::bad_alloc&)
1727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001728 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001729 }
1730}
1731
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001732void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1733{
1734 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1735
1736 try
1737 {
1738 if (count < 0 || first < 0 || primcount < 0)
1739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001740 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001741 }
1742
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001743 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001744 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001745 gl::Context *context = gl::getNonLostContext();
1746
1747 if (context)
1748 {
1749 context->drawArrays(mode, first, count, primcount);
1750 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001751 }
1752 }
1753 catch(std::bad_alloc&)
1754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001755 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001756 }
1757}
1758
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001759void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001760{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001761 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001762 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001763
1764 try
1765 {
1766 if (count < 0)
1767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001768 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001769 }
1770
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001771 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001772
1773 if (context)
1774 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001775 switch (type)
1776 {
1777 case GL_UNSIGNED_BYTE:
1778 case GL_UNSIGNED_SHORT:
1779 break;
1780 case GL_UNSIGNED_INT:
1781 if (!context->supports32bitIndices())
1782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001783 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001784 }
1785 break;
1786 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001787 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001788 }
1789
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001790 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001791 }
1792 }
1793 catch(std::bad_alloc&)
1794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001795 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001796 }
1797}
1798
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001799void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1800{
1801 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1802 mode, count, type, indices, primcount);
1803
1804 try
1805 {
1806 if (count < 0 || primcount < 0)
1807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001808 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001809 }
1810
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001811 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001812 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001813 gl::Context *context = gl::getNonLostContext();
1814
1815 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001816 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001817 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001818 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001819 case GL_UNSIGNED_BYTE:
1820 case GL_UNSIGNED_SHORT:
1821 break;
1822 case GL_UNSIGNED_INT:
1823 if (!context->supports32bitIndices())
1824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001825 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001826 }
1827 break;
1828 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001829 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001830 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001831
1832 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001833 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001834 }
1835 }
1836 catch(std::bad_alloc&)
1837 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001838 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001839 }
1840}
1841
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001842void __stdcall glEnable(GLenum cap)
1843{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001844 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001845
1846 try
1847 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001848 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001849
1850 if (context)
1851 {
1852 switch (cap)
1853 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001854 case GL_CULL_FACE: context->setCullFace(true); break;
1855 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
1856 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
1857 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
1858 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
1859 case GL_STENCIL_TEST: context->setStencilTest(true); break;
1860 case GL_DEPTH_TEST: context->setDepthTest(true); break;
1861 case GL_BLEND: context->setBlend(true); break;
1862 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001863 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001864 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001865 }
1866 }
1867 }
1868 catch(std::bad_alloc&)
1869 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001870 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001871 }
1872}
1873
1874void __stdcall glEnableVertexAttribArray(GLuint index)
1875{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001876 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001877
1878 try
1879 {
1880 if (index >= gl::MAX_VERTEX_ATTRIBS)
1881 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001882 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001883 }
1884
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001885 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001886
1887 if (context)
1888 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001889 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001890 }
1891 }
1892 catch(std::bad_alloc&)
1893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001894 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001895 }
1896}
1897
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001898void __stdcall glEndQueryEXT(GLenum target)
1899{
1900 EVENT("GLenum target = 0x%X)", target);
1901
1902 try
1903 {
1904 switch (target)
1905 {
1906 case GL_ANY_SAMPLES_PASSED_EXT:
1907 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
1908 break;
1909 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001910 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001911 }
1912
1913 gl::Context *context = gl::getNonLostContext();
1914
1915 if (context)
1916 {
1917 context->endQuery(target);
1918 }
1919 }
1920 catch(std::bad_alloc&)
1921 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001922 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001923 }
1924}
1925
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001926void __stdcall glFinishFenceNV(GLuint fence)
1927{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001928 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001929
1930 try
1931 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001932 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001933
1934 if (context)
1935 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001936 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001937
1938 if (fenceObject == NULL)
1939 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001940 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001941 }
1942
Jamie Madillfb9a7402013-07-26 11:55:01 -04001943 if (fenceObject->isFence() != GL_TRUE)
1944 {
1945 return gl::error(GL_INVALID_OPERATION);
1946 }
1947
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001948 fenceObject->finishFence();
1949 }
1950 }
1951 catch(std::bad_alloc&)
1952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001953 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001954 }
1955}
1956
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001957void __stdcall glFinish(void)
1958{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001959 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001960
1961 try
1962 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001963 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001964
1965 if (context)
1966 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001967 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001968 }
1969 }
1970 catch(std::bad_alloc&)
1971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001972 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001973 }
1974}
1975
1976void __stdcall glFlush(void)
1977{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001978 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001979
1980 try
1981 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001982 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001983
1984 if (context)
1985 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001986 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001987 }
1988 }
1989 catch(std::bad_alloc&)
1990 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001991 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001992 }
1993}
1994
1995void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1996{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001997 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001998 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001999
2000 try
2001 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002002 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002003 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002004 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002005 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002006 }
2007
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002008 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002009
2010 if (context)
2011 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002012 gl::Framebuffer *framebuffer = NULL;
2013 GLuint framebufferHandle = 0;
2014 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2015 {
2016 framebuffer = context->getReadFramebuffer();
2017 framebufferHandle = context->getReadFramebufferHandle();
2018 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002019 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002020 {
2021 framebuffer = context->getDrawFramebuffer();
2022 framebufferHandle = context->getDrawFramebufferHandle();
2023 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002024
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002025 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002026 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002027 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002028 }
2029
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002030 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002031 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002032 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2033
2034 if (colorAttachment >= context->getMaximumRenderTargets())
2035 {
2036 return gl::error(GL_INVALID_VALUE);
2037 }
2038
Geoff Lang309c92a2013-07-25 16:23:19 -04002039 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002040 }
2041 else
2042 {
2043 switch (attachment)
2044 {
2045 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04002046 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002047 break;
2048 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04002049 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002050 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04002051 case GL_DEPTH_STENCIL_ATTACHMENT:
2052 if (context->getClientVersion() < 3)
2053 {
2054 return gl::error(GL_INVALID_ENUM);
2055 }
2056 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
2057 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002058 default:
2059 return gl::error(GL_INVALID_ENUM);
2060 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002061 }
2062 }
2063 }
2064 catch(std::bad_alloc&)
2065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002066 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002067 }
2068}
2069
2070void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2071{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002072 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002073 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002074
2075 try
2076 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002077 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002078 if (context)
2079 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002080 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002081 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002082 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002083 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002084 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04002085
2086 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002087 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002088 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002089 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002090 }
2091
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002092 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002093 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002094 textarget = GL_NONE;
2095 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002096
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002097 gl::Framebuffer *framebuffer = NULL;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002098 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2099 {
2100 framebuffer = context->getReadFramebuffer();
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002101 }
2102 else
2103 {
2104 framebuffer = context->getDrawFramebuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002105 }
2106
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002107 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002108 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002109 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04002110 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002111 }
2112 else
2113 {
2114 switch (attachment)
2115 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002116 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2117 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2118 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002119 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002120 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002121 }
2122 }
2123 catch(std::bad_alloc&)
2124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002125 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002126 }
2127}
2128
2129void __stdcall glFrontFace(GLenum mode)
2130{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002131 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002132
2133 try
2134 {
2135 switch (mode)
2136 {
2137 case GL_CW:
2138 case GL_CCW:
2139 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002140 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002141
2142 if (context)
2143 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002144 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002145 }
2146 }
2147 break;
2148 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002149 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002150 }
2151 }
2152 catch(std::bad_alloc&)
2153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002154 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002155 }
2156}
2157
2158void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2159{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002160 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002161
2162 try
2163 {
2164 if (n < 0)
2165 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002166 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002167 }
2168
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002169 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002170
2171 if (context)
2172 {
2173 for (int i = 0; i < n; i++)
2174 {
2175 buffers[i] = context->createBuffer();
2176 }
2177 }
2178 }
2179 catch(std::bad_alloc&)
2180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002181 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002182 }
2183}
2184
2185void __stdcall glGenerateMipmap(GLenum target)
2186{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002187 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002188
2189 try
2190 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002191 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002192
2193 if (context)
2194 {
Geoff Langae4852a2013-06-05 15:00:34 -04002195 gl::Texture *texture = NULL;
2196 GLint internalFormat = GL_NONE;
2197 bool isCompressed = false;
2198 bool isDepth = false;
2199
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002200 switch (target)
2201 {
2202 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002203 {
2204 gl::Texture2D *tex2d = context->getTexture2D();
Geoff Langae4852a2013-06-05 15:00:34 -04002205 if (tex2d)
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002206 {
Geoff Langae4852a2013-06-05 15:00:34 -04002207 internalFormat = tex2d->getInternalFormat(0);
2208 isCompressed = tex2d->isCompressed(0);
2209 isDepth = tex2d->isDepth(0);
2210 texture = tex2d;
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002211 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002212 break;
2213 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002214
2215 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002216 {
2217 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
Geoff Langae4852a2013-06-05 15:00:34 -04002218 if (texcube)
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002219 {
Geoff Langae4852a2013-06-05 15:00:34 -04002220 internalFormat = texcube->getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
2221 isCompressed = texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
2222 isDepth = false;
2223 texture = texcube;
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002224 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002225 break;
2226 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002227
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00002228 case GL_TEXTURE_3D:
2229 {
2230 if (context->getClientVersion() < 3)
2231 {
2232 return gl::error(GL_INVALID_ENUM);
2233 }
2234
2235 gl::Texture3D *tex3D = context->getTexture3D();
Geoff Langae4852a2013-06-05 15:00:34 -04002236 if (tex3D)
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00002237 {
Geoff Langae4852a2013-06-05 15:00:34 -04002238 internalFormat = tex3D->getInternalFormat(0);
2239 isCompressed = tex3D->isCompressed(0);
2240 isDepth = tex3D->isDepth(0);
2241 texture = tex3D;
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00002242 }
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00002243 break;
2244 }
2245
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00002246 case GL_TEXTURE_2D_ARRAY:
2247 {
2248 if (context->getClientVersion() < 3)
2249 {
2250 return gl::error(GL_INVALID_ENUM);
2251 }
2252
2253 gl::Texture2DArray *tex2darr = context->getTexture2DArray();
Geoff Langae4852a2013-06-05 15:00:34 -04002254 if (tex2darr)
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00002255 {
Geoff Langae4852a2013-06-05 15:00:34 -04002256 internalFormat = tex2darr->getInternalFormat(0);
2257 isCompressed = tex2darr->isCompressed(0);
2258 isDepth = tex2darr->isDepth(0);
2259 texture = tex2darr;
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00002260 }
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00002261 break;
2262 }
2263
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002264 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002265 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002266 }
Geoff Langae4852a2013-06-05 15:00:34 -04002267
2268 if (!texture)
2269 {
2270 return gl::error(GL_INVALID_OPERATION);
2271 }
2272
2273 // Internally, all texture formats are sized so checking if the format
2274 // is color renderable and filterable will not fail.
2275 if (isDepth || isCompressed ||
2276 !gl::IsColorRenderingSupported(internalFormat, context) ||
2277 !gl::IsTextureFilteringSupported(internalFormat, context))
2278 {
2279 return gl::error(GL_INVALID_OPERATION);
2280 }
2281
2282 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002283 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002284 }
2285 catch(std::bad_alloc&)
2286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002287 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002288 }
2289}
2290
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002291void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2292{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002293 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002294
2295 try
2296 {
2297 if (n < 0)
2298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002299 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002300 }
2301
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002302 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002303
2304 if (context)
2305 {
2306 for (int i = 0; i < n; i++)
2307 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002308 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002309 }
2310 }
2311 }
2312 catch(std::bad_alloc&)
2313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002314 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002315 }
2316}
2317
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002318void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2319{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002320 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002321
2322 try
2323 {
2324 if (n < 0)
2325 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002326 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002327 }
2328
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002329 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002330
2331 if (context)
2332 {
2333 for (int i = 0; i < n; i++)
2334 {
2335 framebuffers[i] = context->createFramebuffer();
2336 }
2337 }
2338 }
2339 catch(std::bad_alloc&)
2340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002341 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002342 }
2343}
2344
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002345void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2346{
2347 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2348
2349 try
2350 {
2351 if (n < 0)
2352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002353 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002354 }
2355
2356 gl::Context *context = gl::getNonLostContext();
2357
2358 if (context)
2359 {
2360 for (int i = 0; i < n; i++)
2361 {
2362 ids[i] = context->createQuery();
2363 }
2364 }
2365 }
2366 catch(std::bad_alloc&)
2367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002368 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002369 }
2370}
2371
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002372void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2373{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002374 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002375
2376 try
2377 {
2378 if (n < 0)
2379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002380 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002381 }
2382
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002383 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002384
2385 if (context)
2386 {
2387 for (int i = 0; i < n; i++)
2388 {
2389 renderbuffers[i] = context->createRenderbuffer();
2390 }
2391 }
2392 }
2393 catch(std::bad_alloc&)
2394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002395 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002396 }
2397}
2398
2399void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2400{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002401 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002402
2403 try
2404 {
2405 if (n < 0)
2406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002407 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002408 }
2409
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002410 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002411
2412 if (context)
2413 {
2414 for (int i = 0; i < n; i++)
2415 {
2416 textures[i] = context->createTexture();
2417 }
2418 }
2419 }
2420 catch(std::bad_alloc&)
2421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002422 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002423 }
2424}
2425
daniel@transgaming.com85423182010-04-22 13:35:27 +00002426void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002427{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002428 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002429 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002430 program, index, bufsize, length, size, type, name);
2431
2432 try
2433 {
2434 if (bufsize < 0)
2435 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002436 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002437 }
2438
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002439 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002440
2441 if (context)
2442 {
2443 gl::Program *programObject = context->getProgram(program);
2444
2445 if (!programObject)
2446 {
2447 if (context->getShader(program))
2448 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002449 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002450 }
2451 else
2452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002453 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002454 }
2455 }
2456
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002457 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002459 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002460 }
2461
2462 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2463 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002464 }
2465 catch(std::bad_alloc&)
2466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002467 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002468 }
2469}
2470
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002471void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002472{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002473 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002474 "GLsizei* length = 0x%0.8p, GLint* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002475 program, index, bufsize, length, size, type, name);
2476
2477 try
2478 {
2479 if (bufsize < 0)
2480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002481 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002482 }
2483
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002484 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002485
2486 if (context)
2487 {
2488 gl::Program *programObject = context->getProgram(program);
2489
2490 if (!programObject)
2491 {
2492 if (context->getShader(program))
2493 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002494 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002495 }
2496 else
2497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002498 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002499 }
2500 }
2501
2502 if (index >= (GLuint)programObject->getActiveUniformCount())
2503 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002504 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002505 }
2506
2507 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2508 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002509 }
2510 catch(std::bad_alloc&)
2511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002512 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002513 }
2514}
2515
2516void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2517{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002518 EVENT("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002519 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002520
2521 try
2522 {
2523 if (maxcount < 0)
2524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002525 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002526 }
2527
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002528 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002529
2530 if (context)
2531 {
2532 gl::Program *programObject = context->getProgram(program);
2533
2534 if (!programObject)
2535 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002536 if (context->getShader(program))
2537 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002538 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002539 }
2540 else
2541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002542 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002543 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002544 }
2545
2546 return programObject->getAttachedShaders(maxcount, count, shaders);
2547 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002548 }
2549 catch(std::bad_alloc&)
2550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002551 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002552 }
2553}
2554
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002555int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002556{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002557 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002558
2559 try
2560 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002561 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002562
2563 if (context)
2564 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002565
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002566 gl::Program *programObject = context->getProgram(program);
2567
2568 if (!programObject)
2569 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002570 if (context->getShader(program))
2571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002572 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002573 }
2574 else
2575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002576 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002577 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002578 }
2579
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002580 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002581 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002583 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002584 }
2585
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002586 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002587 }
2588 }
2589 catch(std::bad_alloc&)
2590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002591 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002592 }
2593
2594 return -1;
2595}
2596
2597void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2598{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002599 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002600
2601 try
2602 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002603 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002604
2605 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002606 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002607 if (!(context->getBooleanv(pname, params)))
2608 {
2609 GLenum nativeType;
2610 unsigned int numParams = 0;
2611 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002612 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002613
2614 if (numParams == 0)
2615 return; // it is known that the pname is valid, but there are no parameters to return
2616
2617 if (nativeType == GL_FLOAT)
2618 {
2619 GLfloat *floatParams = NULL;
2620 floatParams = new GLfloat[numParams];
2621
2622 context->getFloatv(pname, floatParams);
2623
2624 for (unsigned int i = 0; i < numParams; ++i)
2625 {
2626 if (floatParams[i] == 0.0f)
2627 params[i] = GL_FALSE;
2628 else
2629 params[i] = GL_TRUE;
2630 }
2631
2632 delete [] floatParams;
2633 }
2634 else if (nativeType == GL_INT)
2635 {
2636 GLint *intParams = NULL;
2637 intParams = new GLint[numParams];
2638
2639 context->getIntegerv(pname, intParams);
2640
2641 for (unsigned int i = 0; i < numParams; ++i)
2642 {
2643 if (intParams[i] == 0)
2644 params[i] = GL_FALSE;
2645 else
2646 params[i] = GL_TRUE;
2647 }
2648
2649 delete [] intParams;
2650 }
Jamie Madill71fbd602013-07-19 16:36:55 -04002651 else if (nativeType == GL_INT_64_ANGLEX)
2652 {
2653 GLint64 *int64Params = NULL;
2654 int64Params = new GLint64[numParams];
2655
2656 context->getInteger64v(pname, int64Params);
2657
2658 for (unsigned int i = 0; i < numParams; ++i)
2659 {
2660 if (int64Params[i] == 0)
2661 params[i] = GL_FALSE;
2662 else
2663 params[i] = GL_TRUE;
2664 }
2665
2666 delete [] int64Params;
2667 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002668 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002669 }
2670 }
2671 catch(std::bad_alloc&)
2672 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002673 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002674 }
2675}
2676
2677void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2678{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002679 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002680
2681 try
2682 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002683 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002684
2685 if (context)
2686 {
2687 gl::Buffer *buffer;
2688
2689 switch (target)
2690 {
2691 case GL_ARRAY_BUFFER:
2692 buffer = context->getArrayBuffer();
2693 break;
2694 case GL_ELEMENT_ARRAY_BUFFER:
2695 buffer = context->getElementArrayBuffer();
2696 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002697 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002698 }
2699
2700 if (!buffer)
2701 {
2702 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002703 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002704 }
2705
2706 switch (pname)
2707 {
2708 case GL_BUFFER_USAGE:
2709 *params = buffer->usage();
2710 break;
2711 case GL_BUFFER_SIZE:
2712 *params = buffer->size();
2713 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002714 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002715 }
2716 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002717 }
2718 catch(std::bad_alloc&)
2719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002720 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002721 }
2722}
2723
2724GLenum __stdcall glGetError(void)
2725{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002726 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002727
2728 gl::Context *context = gl::getContext();
2729
2730 if (context)
2731 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002732 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002733 }
2734
2735 return GL_NO_ERROR;
2736}
2737
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002738void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2739{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002740 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002741
2742 try
2743 {
2744
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002745 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002746
2747 if (context)
2748 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002749 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002750
2751 if (fenceObject == NULL)
2752 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002753 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002754 }
2755
Jamie Madillfb9a7402013-07-26 11:55:01 -04002756 if (fenceObject->isFence() != GL_TRUE)
2757 {
2758 return gl::error(GL_INVALID_OPERATION);
2759 }
2760
2761 switch (pname)
2762 {
2763 case GL_FENCE_STATUS_NV:
2764 case GL_FENCE_CONDITION_NV:
2765 break;
2766
2767 default: return gl::error(GL_INVALID_ENUM);
2768 }
2769
2770 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002771 }
2772 }
2773 catch(std::bad_alloc&)
2774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002775 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002776 }
2777}
2778
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002779void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2780{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002781 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002782
2783 try
2784 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002785 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002786
2787 if (context)
2788 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002789 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002790 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002791 GLenum nativeType;
2792 unsigned int numParams = 0;
2793 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002794 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002795
2796 if (numParams == 0)
2797 return; // it is known that the pname is valid, but that there are no parameters to return.
2798
2799 if (nativeType == GL_BOOL)
2800 {
2801 GLboolean *boolParams = NULL;
2802 boolParams = new GLboolean[numParams];
2803
2804 context->getBooleanv(pname, boolParams);
2805
2806 for (unsigned int i = 0; i < numParams; ++i)
2807 {
2808 if (boolParams[i] == GL_FALSE)
2809 params[i] = 0.0f;
2810 else
2811 params[i] = 1.0f;
2812 }
2813
2814 delete [] boolParams;
2815 }
2816 else if (nativeType == GL_INT)
2817 {
2818 GLint *intParams = NULL;
2819 intParams = new GLint[numParams];
2820
2821 context->getIntegerv(pname, intParams);
2822
2823 for (unsigned int i = 0; i < numParams; ++i)
2824 {
Jamie Madill71fbd602013-07-19 16:36:55 -04002825 params[i] = static_cast<GLfloat>(intParams[i]);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002826 }
2827
2828 delete [] intParams;
2829 }
Jamie Madill71fbd602013-07-19 16:36:55 -04002830 else if (nativeType == GL_INT_64_ANGLEX)
2831 {
2832 GLint64 *int64Params = NULL;
2833 int64Params = new GLint64[numParams];
2834
2835 context->getInteger64v(pname, int64Params);
2836
2837 for (unsigned int i = 0; i < numParams; ++i)
2838 {
2839 params[i] = static_cast<GLfloat>(int64Params[i]);
2840 }
2841
2842 delete [] int64Params;
2843 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002844 }
2845 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002846 }
2847 catch(std::bad_alloc&)
2848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002849 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002850 }
2851}
2852
2853void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2854{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002855 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002856 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002857
2858 try
2859 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002860 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002861
2862 if (context)
2863 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002864 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002866 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002867 }
2868
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002869 gl::Framebuffer *framebuffer = NULL;
2870 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2871 {
2872 if(context->getReadFramebufferHandle() == 0)
2873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002874 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002875 }
2876
2877 framebuffer = context->getReadFramebuffer();
2878 }
2879 else
2880 {
2881 if (context->getDrawFramebufferHandle() == 0)
2882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002883 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002884 }
2885
2886 framebuffer = context->getDrawFramebuffer();
2887 }
2888
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002889 GLenum attachmentType;
2890 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002891 GLuint attachmentLevel;
2892 GLuint attachmentLayer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002893
2894 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002895 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002896 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2897
2898 if (colorAttachment >= context->getMaximumRenderTargets())
2899 {
2900 return gl::error(GL_INVALID_ENUM);
2901 }
2902
2903 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2904 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
Geoff Lang309c92a2013-07-25 16:23:19 -04002905 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2906 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002907 }
2908 else
2909 {
2910 switch (attachment)
2911 {
2912 case GL_DEPTH_ATTACHMENT:
2913 attachmentType = framebuffer->getDepthbufferType();
2914 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002915 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2916 attachmentLayer = framebuffer->getDepthbufferLayer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002917 break;
2918 case GL_STENCIL_ATTACHMENT:
2919 attachmentType = framebuffer->getStencilbufferType();
2920 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002921 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2922 attachmentLayer = framebuffer->getStencilbufferLayer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002923 break;
Geoff Lang55ba29c2013-07-11 16:57:53 -04002924 case GL_DEPTH_STENCIL_ATTACHMENT:
2925 if (context->getClientVersion() < 3)
2926 {
2927 return gl::error(GL_INVALID_ENUM);
2928 }
2929 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2930 {
2931 return gl::error(GL_INVALID_OPERATION);
2932 }
2933 attachmentType = framebuffer->getDepthStencilbufferType();
2934 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002935 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2936 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002937 default: return gl::error(GL_INVALID_ENUM);
2938 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002939 }
2940
2941 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002942 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002943 {
2944 attachmentObjectType = attachmentType;
2945 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002946 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002947 {
2948 attachmentObjectType = GL_TEXTURE;
2949 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002950 else
2951 {
2952 UNREACHABLE();
2953 return;
2954 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002955
2956 switch (pname)
2957 {
2958 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2959 *params = attachmentObjectType;
2960 break;
2961 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2962 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
2963 {
2964 *params = attachmentHandle;
2965 }
2966 else
2967 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002968 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002969 }
2970 break;
2971 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2972 if (attachmentObjectType == GL_TEXTURE)
2973 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002974 *params = attachmentLevel;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002975 }
2976 else
2977 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002978 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002979 }
2980 break;
2981 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2982 if (attachmentObjectType == GL_TEXTURE)
2983 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00002984 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002985 {
2986 *params = attachmentType;
2987 }
2988 else
2989 {
2990 *params = 0;
2991 }
2992 }
2993 else
2994 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002995 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002996 }
2997 break;
Geoff Lang309c92a2013-07-25 16:23:19 -04002998 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2999 if (context->getClientVersion() < 3)
3000 {
3001 return gl::error(GL_INVALID_ENUM);
3002 }
3003 if (attachmentObjectType == GL_TEXTURE)
3004 {
3005 *params = attachmentLayer;
3006 }
3007 else
3008 {
3009 return gl::error(GL_INVALID_ENUM);
3010 }
3011 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003012 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003013 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003014 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003015 }
3016 }
3017 catch(std::bad_alloc&)
3018 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003019 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003020 }
3021}
3022
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003023GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3024{
3025 EVENT("()");
3026
3027 try
3028 {
3029 gl::Context *context = gl::getContext();
3030
3031 if (context)
3032 {
3033 return context->getResetStatus();
3034 }
3035
3036 return GL_NO_ERROR;
3037 }
3038 catch(std::bad_alloc&)
3039 {
3040 return GL_OUT_OF_MEMORY;
3041 }
3042}
3043
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003044void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3045{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003046 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003047
3048 try
3049 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003050 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003051
3052 if (context)
3053 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003054 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003055 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003056 GLenum nativeType;
3057 unsigned int numParams = 0;
3058 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003059 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003060
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003061 if (numParams == 0)
3062 return; // it is known that pname is valid, but there are no parameters to return
3063
3064 if (nativeType == GL_BOOL)
3065 {
3066 GLboolean *boolParams = NULL;
3067 boolParams = new GLboolean[numParams];
3068
3069 context->getBooleanv(pname, boolParams);
3070
3071 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003072 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003073 if (boolParams[i] == GL_FALSE)
3074 params[i] = 0;
3075 else
3076 params[i] = 1;
3077 }
3078
3079 delete [] boolParams;
3080 }
3081 else if (nativeType == GL_FLOAT)
3082 {
3083 GLfloat *floatParams = NULL;
3084 floatParams = new GLfloat[numParams];
3085
3086 context->getFloatv(pname, floatParams);
3087
3088 for (unsigned int i = 0; i < numParams; ++i)
3089 {
Jamie Madill71fbd602013-07-19 16:36:55 -04003090 // RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003091 if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003092 {
Jamie Madill71fbd602013-07-19 16:36:55 -04003093 params[i] = static_cast<GLint>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003094 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003095 else
Jamie Madill71fbd602013-07-19 16:36:55 -04003096 {
Jamie Madillaf496912013-07-19 16:36:54 -04003097 params[i] = gl::iround<GLint>(floatParams[i]);
Jamie Madill71fbd602013-07-19 16:36:55 -04003098 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003099 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003100
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003101 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003102 }
Jamie Madill71fbd602013-07-19 16:36:55 -04003103 else if (nativeType == GL_INT_64_ANGLEX)
3104 {
3105 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
3106 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
3107 GLint64 *int64Params = NULL;
3108 int64Params = new GLint64[numParams];
3109
3110 context->getInteger64v(pname, int64Params);
3111
3112 for (unsigned int i = 0; i < numParams; ++i)
3113 {
3114 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
3115 params[i] = static_cast<GLint>(clampedValue);
3116 }
3117
3118 delete [] int64Params;
3119 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003120 }
3121 }
3122 }
3123 catch(std::bad_alloc&)
3124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003125 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003126 }
3127}
3128
3129void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3130{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003131 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003132
3133 try
3134 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003135 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003136
3137 if (context)
3138 {
3139 gl::Program *programObject = context->getProgram(program);
3140
3141 if (!programObject)
3142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003143 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003144 }
3145
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003146 if (context->getClientVersion() < 3)
3147 {
3148 switch (pname)
3149 {
3150 case GL_ACTIVE_UNIFORM_BLOCKS:
3151 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3152 return gl::error(GL_INVALID_ENUM);
3153 }
3154 }
3155
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003156 switch (pname)
3157 {
3158 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003159 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003160 return;
3161 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003162 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003163 return;
3164 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003165 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003166 return;
3167 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003168 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003169 return;
3170 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003171 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003172 return;
3173 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003174 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003175 return;
3176 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003177 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003178 return;
3179 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003180 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003181 return;
3182 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003183 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003184 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003185 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003186 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003187 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003188 case GL_ACTIVE_UNIFORM_BLOCKS:
3189 *params = programObject->getActiveUniformBlockCount();
3190 return;
3191 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3192 *params = programObject->getActiveUniformBlockMaxLength();
3193 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003194 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003195 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003196 }
3197 }
3198 }
3199 catch(std::bad_alloc&)
3200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003201 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003202 }
3203}
3204
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003205void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003206{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003207 EVENT("(GLuint program = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003208 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003209
3210 try
3211 {
3212 if (bufsize < 0)
3213 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003214 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003215 }
3216
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003217 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003218
3219 if (context)
3220 {
3221 gl::Program *programObject = context->getProgram(program);
3222
3223 if (!programObject)
3224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003225 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003226 }
3227
3228 programObject->getInfoLog(bufsize, length, infolog);
3229 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003230 }
3231 catch(std::bad_alloc&)
3232 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003233 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003234 }
3235}
3236
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003237void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3238{
3239 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3240
3241 try
3242 {
3243 switch (pname)
3244 {
3245 case GL_CURRENT_QUERY_EXT:
3246 break;
3247 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003248 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003249 }
3250
3251 gl::Context *context = gl::getNonLostContext();
3252
3253 if (context)
3254 {
3255 params[0] = context->getActiveQuery(target);
3256 }
3257 }
3258 catch(std::bad_alloc&)
3259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003260 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003261 }
3262}
3263
3264void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3265{
3266 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3267
3268 try
3269 {
3270 switch (pname)
3271 {
3272 case GL_QUERY_RESULT_EXT:
3273 case GL_QUERY_RESULT_AVAILABLE_EXT:
3274 break;
3275 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003276 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003277 }
3278 gl::Context *context = gl::getNonLostContext();
3279
3280 if (context)
3281 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003282 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3283
3284 if (!queryObject)
3285 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003286 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003287 }
3288
3289 if (context->getActiveQuery(queryObject->getType()) == id)
3290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003291 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003292 }
3293
3294 switch(pname)
3295 {
3296 case GL_QUERY_RESULT_EXT:
3297 params[0] = queryObject->getResult();
3298 break;
3299 case GL_QUERY_RESULT_AVAILABLE_EXT:
3300 params[0] = queryObject->isResultAvailable();
3301 break;
3302 default:
3303 ASSERT(false);
3304 }
3305 }
3306 }
3307 catch(std::bad_alloc&)
3308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003309 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003310 }
3311}
3312
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003313void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3314{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003315 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003316
3317 try
3318 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003319 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003320
3321 if (context)
3322 {
3323 if (target != GL_RENDERBUFFER)
3324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003325 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003326 }
3327
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003328 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003330 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003331 }
3332
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003333 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003334
3335 switch (pname)
3336 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003337 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3338 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3339 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3340 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3341 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3342 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3343 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3344 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3345 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003346 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003347 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003348 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003349 *params = renderbuffer->getSamples();
3350 }
3351 else
3352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003353 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003354 }
3355 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003356 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003357 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003358 }
3359 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003360 }
3361 catch(std::bad_alloc&)
3362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003363 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003364 }
3365}
3366
3367void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3368{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003369 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003370
3371 try
3372 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003373 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003374
3375 if (context)
3376 {
3377 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003378
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003379 if (!shaderObject)
3380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003381 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003382 }
3383
3384 switch (pname)
3385 {
3386 case GL_SHADER_TYPE:
3387 *params = shaderObject->getType();
3388 return;
3389 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003390 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003391 return;
3392 case GL_COMPILE_STATUS:
3393 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3394 return;
3395 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003396 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003397 return;
3398 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003399 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003400 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003401 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3402 *params = shaderObject->getTranslatedSourceLength();
3403 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003404 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003405 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003406 }
3407 }
3408 }
3409 catch(std::bad_alloc&)
3410 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003411 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003412 }
3413}
3414
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003415void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003416{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003417 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003418 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003419
3420 try
3421 {
3422 if (bufsize < 0)
3423 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003424 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003425 }
3426
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003427 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003428
3429 if (context)
3430 {
3431 gl::Shader *shaderObject = context->getShader(shader);
3432
3433 if (!shaderObject)
3434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003435 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003436 }
3437
3438 shaderObject->getInfoLog(bufsize, length, infolog);
3439 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003440 }
3441 catch(std::bad_alloc&)
3442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003443 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003444 }
3445}
3446
3447void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3448{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003449 EVENT("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = 0x%0.8p, GLint* precision = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003450 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003451
3452 try
3453 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003454 switch (shadertype)
3455 {
3456 case GL_VERTEX_SHADER:
3457 case GL_FRAGMENT_SHADER:
3458 break;
3459 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003460 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003461 }
3462
3463 switch (precisiontype)
3464 {
3465 case GL_LOW_FLOAT:
3466 case GL_MEDIUM_FLOAT:
3467 case GL_HIGH_FLOAT:
3468 // Assume IEEE 754 precision
3469 range[0] = 127;
3470 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003471 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003472 break;
3473 case GL_LOW_INT:
3474 case GL_MEDIUM_INT:
3475 case GL_HIGH_INT:
3476 // Some (most) hardware only supports single-precision floating-point numbers,
3477 // which can accurately represent integers up to +/-16777216
3478 range[0] = 24;
3479 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003480 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003481 break;
3482 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003483 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003484 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003485 }
3486 catch(std::bad_alloc&)
3487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003488 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003489 }
3490}
3491
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003492void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003493{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003494 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003495 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003496
3497 try
3498 {
3499 if (bufsize < 0)
3500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003501 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003502 }
3503
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003504 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003505
3506 if (context)
3507 {
3508 gl::Shader *shaderObject = context->getShader(shader);
3509
3510 if (!shaderObject)
3511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003512 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003513 }
3514
3515 shaderObject->getSource(bufsize, length, source);
3516 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003517 }
3518 catch(std::bad_alloc&)
3519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003520 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003521 }
3522}
3523
zmo@google.coma574f782011-10-03 21:45:23 +00003524void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3525{
3526 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3527 shader, bufsize, length, source);
3528
3529 try
3530 {
3531 if (bufsize < 0)
3532 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003533 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003534 }
3535
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003536 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003537
3538 if (context)
3539 {
3540 gl::Shader *shaderObject = context->getShader(shader);
3541
3542 if (!shaderObject)
3543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003544 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003545 }
3546
3547 shaderObject->getTranslatedSource(bufsize, length, source);
3548 }
3549 }
3550 catch(std::bad_alloc&)
3551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003552 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003553 }
3554}
3555
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003556const GLubyte* __stdcall glGetString(GLenum name)
3557{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003558 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003559
3560 try
3561 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003562 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003563
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003564 switch (name)
3565 {
3566 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003567 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003568 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003569 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003570 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003571 if (context->getClientVersion() == 2)
3572 {
3573 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
3574 }
3575 else
3576 {
3577 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
3578 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003579 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003580 if (context->getClientVersion() == 2)
3581 {
3582 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
3583 }
3584 else
3585 {
3586 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
3587 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003588 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003589 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003590 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003591 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003592 }
3593 }
3594 catch(std::bad_alloc&)
3595 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003596 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003597 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003598}
3599
3600void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3601{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003602 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003603
3604 try
3605 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003606 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003607
3608 if (context)
3609 {
Jamie Madillfb8a8302013-07-03 14:24:12 -04003610 gl::Texture *texture = getTargetTexture(context, target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003611
Jamie Madillfb8a8302013-07-03 14:24:12 -04003612 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003614 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003615 }
3616
3617 switch (pname)
3618 {
3619 case GL_TEXTURE_MAG_FILTER:
3620 *params = (GLfloat)texture->getMagFilter();
3621 break;
3622 case GL_TEXTURE_MIN_FILTER:
3623 *params = (GLfloat)texture->getMinFilter();
3624 break;
3625 case GL_TEXTURE_WRAP_S:
3626 *params = (GLfloat)texture->getWrapS();
3627 break;
3628 case GL_TEXTURE_WRAP_T:
3629 *params = (GLfloat)texture->getWrapT();
3630 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003631 case GL_TEXTURE_WRAP_R:
3632 if (context->getClientVersion() < 3)
3633 {
3634 return gl::error(GL_INVALID_ENUM);
3635 }
3636 *params = (GLfloat)texture->getWrapR();
3637 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003638 case GL_TEXTURE_IMMUTABLE_FORMAT:
3639 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003640 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3641 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003642 case GL_TEXTURE_IMMUTABLE_LEVELS:
3643 if (context->getClientVersion() < 3)
3644 {
3645 return gl::error(GL_INVALID_ENUM);
3646 }
3647 *params = (GLfloat)(texture->isImmutable() ? texture->levelCount() : 0);
3648 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003649 case GL_TEXTURE_USAGE_ANGLE:
3650 *params = (GLfloat)texture->getUsage();
3651 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003652 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3653 if (!context->supportsTextureFilterAnisotropy())
3654 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003655 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003656 }
3657 *params = (GLfloat)texture->getMaxAnisotropy();
3658 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003659 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003660 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003661 }
3662 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003663 }
3664 catch(std::bad_alloc&)
3665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003666 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003667 }
3668}
3669
3670void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3671{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003672 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003673
3674 try
3675 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003676 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003677
3678 if (context)
3679 {
Jamie Madillfb8a8302013-07-03 14:24:12 -04003680 gl::Texture *texture = getTargetTexture(context, target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003681
Jamie Madillfb8a8302013-07-03 14:24:12 -04003682 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003684 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003685 }
3686
3687 switch (pname)
3688 {
3689 case GL_TEXTURE_MAG_FILTER:
3690 *params = texture->getMagFilter();
3691 break;
3692 case GL_TEXTURE_MIN_FILTER:
3693 *params = texture->getMinFilter();
3694 break;
3695 case GL_TEXTURE_WRAP_S:
3696 *params = texture->getWrapS();
3697 break;
3698 case GL_TEXTURE_WRAP_T:
3699 *params = texture->getWrapT();
3700 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003701 case GL_TEXTURE_WRAP_R:
3702 if (context->getClientVersion() < 3)
3703 {
3704 return gl::error(GL_INVALID_ENUM);
3705 }
3706 *params = texture->getWrapR();
3707 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003708 case GL_TEXTURE_IMMUTABLE_FORMAT:
3709 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003710 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3711 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003712 case GL_TEXTURE_IMMUTABLE_LEVELS:
3713 if (context->getClientVersion() < 3)
3714 {
3715 return gl::error(GL_INVALID_ENUM);
3716 }
3717 *params = texture->isImmutable() ? texture->levelCount() : 0;
3718 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003719 case GL_TEXTURE_USAGE_ANGLE:
3720 *params = texture->getUsage();
3721 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003722 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3723 if (!context->supportsTextureFilterAnisotropy())
3724 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003725 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003726 }
3727 *params = (GLint)texture->getMaxAnisotropy();
3728 break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00003729
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003730 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003731 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003732 }
3733 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003734 }
3735 catch(std::bad_alloc&)
3736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003737 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003738 }
3739}
3740
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003741void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3742{
3743 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3744 program, location, bufSize, params);
3745
3746 try
3747 {
3748 if (bufSize < 0)
3749 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003750 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003751 }
3752
3753 gl::Context *context = gl::getNonLostContext();
3754
3755 if (context)
3756 {
3757 if (program == 0)
3758 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003759 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003760 }
3761
3762 gl::Program *programObject = context->getProgram(program);
3763
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003764 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003766 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003767 }
3768
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003769 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3770 if (!programBinary)
3771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003772 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003773 }
3774
3775 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003777 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003778 }
3779 }
3780 }
3781 catch(std::bad_alloc&)
3782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003783 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003784 }
3785}
3786
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003787void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3788{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003789 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003790
3791 try
3792 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003793 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003794
3795 if (context)
3796 {
3797 if (program == 0)
3798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003799 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003800 }
3801
3802 gl::Program *programObject = context->getProgram(program);
3803
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003804 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003805 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003806 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003807 }
3808
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003809 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3810 if (!programBinary)
3811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003812 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003813 }
3814
3815 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003817 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003818 }
3819 }
3820 }
3821 catch(std::bad_alloc&)
3822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003823 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003824 }
3825}
3826
3827void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3828{
3829 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3830 program, location, bufSize, params);
3831
3832 try
3833 {
3834 if (bufSize < 0)
3835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003836 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003837 }
3838
3839 gl::Context *context = gl::getNonLostContext();
3840
3841 if (context)
3842 {
3843 if (program == 0)
3844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003845 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003846 }
3847
3848 gl::Program *programObject = context->getProgram(program);
3849
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003850 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003852 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003853 }
3854
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003855 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3856 if (!programBinary)
3857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003858 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003859 }
3860
3861 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003863 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003864 }
3865 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003866 }
3867 catch(std::bad_alloc&)
3868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003869 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003870 }
3871}
3872
3873void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3874{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003875 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003876
3877 try
3878 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003879 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003880
3881 if (context)
3882 {
3883 if (program == 0)
3884 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003885 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003886 }
3887
3888 gl::Program *programObject = context->getProgram(program);
3889
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003890 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003892 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003893 }
3894
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003895 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3896 if (!programBinary)
3897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003898 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003899 }
3900
3901 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003903 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003904 }
3905 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003906 }
3907 catch(std::bad_alloc&)
3908 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003909 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003910 }
3911}
3912
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003913int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003914{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003915 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003916
3917 try
3918 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003919 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003920
3921 if (strstr(name, "gl_") == name)
3922 {
3923 return -1;
3924 }
3925
3926 if (context)
3927 {
3928 gl::Program *programObject = context->getProgram(program);
3929
3930 if (!programObject)
3931 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003932 if (context->getShader(program))
3933 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003934 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003935 }
3936 else
3937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003938 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003939 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003940 }
3941
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003942 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003943 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003945 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003946 }
3947
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003948 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003949 }
3950 }
3951 catch(std::bad_alloc&)
3952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003953 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003954 }
3955
3956 return -1;
3957}
3958
3959void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3960{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003961 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003962
3963 try
3964 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003965 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003966
daniel@transgaming.come0078962010-04-15 20:45:08 +00003967 if (context)
3968 {
3969 if (index >= gl::MAX_VERTEX_ATTRIBS)
3970 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003971 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003972 }
3973
daniel@transgaming.com83921382011-01-08 05:46:00 +00003974 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003975
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003976 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003977 {
Jamie Madillaff71502013-07-02 11:57:05 -04003978 return;
3979 }
3980
3981 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3982 {
3983 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3984 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003985 {
Jamie Madillaff71502013-07-02 11:57:05 -04003986 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003987 }
Jamie Madillaff71502013-07-02 11:57:05 -04003988 }
3989 else
3990 {
3991 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003992 }
3993 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003994 }
3995 catch(std::bad_alloc&)
3996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003997 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003998 }
3999}
4000
4001void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4002{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004003 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004004
4005 try
4006 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004007 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004008
daniel@transgaming.come0078962010-04-15 20:45:08 +00004009 if (context)
4010 {
4011 if (index >= gl::MAX_VERTEX_ATTRIBS)
4012 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004013 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004014 }
4015
daniel@transgaming.com83921382011-01-08 05:46:00 +00004016 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004017
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004018 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00004019 {
Jamie Madillaff71502013-07-02 11:57:05 -04004020 return;
4021 }
4022
4023 if (pname == GL_CURRENT_VERTEX_ATTRIB)
4024 {
4025 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
4026 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00004027 {
Jamie Madillaff71502013-07-02 11:57:05 -04004028 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04004029 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004030 }
Jamie Madillaff71502013-07-02 11:57:05 -04004031 }
4032 else
4033 {
4034 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004035 }
4036 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004037 }
4038 catch(std::bad_alloc&)
4039 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004040 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004041 }
4042}
4043
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004044void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004045{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004046 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004047
4048 try
4049 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004050 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004051
daniel@transgaming.come0078962010-04-15 20:45:08 +00004052 if (context)
4053 {
4054 if (index >= gl::MAX_VERTEX_ATTRIBS)
4055 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004056 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004057 }
4058
4059 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4060 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004061 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004062 }
4063
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004064 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004065 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004066 }
4067 catch(std::bad_alloc&)
4068 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004069 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004070 }
4071}
4072
4073void __stdcall glHint(GLenum target, GLenum mode)
4074{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004075 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004076
4077 try
4078 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004079 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004080 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004081 case GL_FASTEST:
4082 case GL_NICEST:
4083 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004084 break;
4085 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004086 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004087 }
4088
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004089 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004090 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004091 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004092 case GL_GENERATE_MIPMAP_HINT:
4093 if (context) context->setGenerateMipmapHint(mode);
4094 break;
4095 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4096 if (context) context->setFragmentShaderDerivativeHint(mode);
4097 break;
4098 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004099 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004100 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004101 }
4102 catch(std::bad_alloc&)
4103 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004104 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004105 }
4106}
4107
4108GLboolean __stdcall glIsBuffer(GLuint buffer)
4109{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004110 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004111
4112 try
4113 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004114 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004115
4116 if (context && buffer)
4117 {
4118 gl::Buffer *bufferObject = context->getBuffer(buffer);
4119
4120 if (bufferObject)
4121 {
4122 return GL_TRUE;
4123 }
4124 }
4125 }
4126 catch(std::bad_alloc&)
4127 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004128 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004129 }
4130
4131 return GL_FALSE;
4132}
4133
4134GLboolean __stdcall glIsEnabled(GLenum cap)
4135{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004136 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004137
4138 try
4139 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004140 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004141
4142 if (context)
4143 {
4144 switch (cap)
4145 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004146 case GL_CULL_FACE: return context->isCullFaceEnabled();
4147 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4148 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4149 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4150 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4151 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4152 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4153 case GL_BLEND: return context->isBlendEnabled();
4154 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004155 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004156 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004157 }
4158 }
4159 }
4160 catch(std::bad_alloc&)
4161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004162 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004163 }
4164
4165 return false;
4166}
4167
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004168GLboolean __stdcall glIsFenceNV(GLuint fence)
4169{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004170 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004171
4172 try
4173 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004174 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004175
4176 if (context)
4177 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004178 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004179
4180 if (fenceObject == NULL)
4181 {
4182 return GL_FALSE;
4183 }
4184
4185 return fenceObject->isFence();
4186 }
4187 }
4188 catch(std::bad_alloc&)
4189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004190 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004191 }
4192
4193 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004194}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004195
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004196GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4197{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004198 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004199
4200 try
4201 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004202 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004203
4204 if (context && framebuffer)
4205 {
4206 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4207
4208 if (framebufferObject)
4209 {
4210 return GL_TRUE;
4211 }
4212 }
4213 }
4214 catch(std::bad_alloc&)
4215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004216 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004217 }
4218
4219 return GL_FALSE;
4220}
4221
4222GLboolean __stdcall glIsProgram(GLuint program)
4223{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004224 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004225
4226 try
4227 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004228 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004229
4230 if (context && program)
4231 {
4232 gl::Program *programObject = context->getProgram(program);
4233
4234 if (programObject)
4235 {
4236 return GL_TRUE;
4237 }
4238 }
4239 }
4240 catch(std::bad_alloc&)
4241 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004242 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004243 }
4244
4245 return GL_FALSE;
4246}
4247
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004248GLboolean __stdcall glIsQueryEXT(GLuint id)
4249{
4250 EVENT("(GLuint id = %d)", id);
4251
4252 try
4253 {
4254 if (id == 0)
4255 {
4256 return GL_FALSE;
4257 }
4258
4259 gl::Context *context = gl::getNonLostContext();
4260
4261 if (context)
4262 {
4263 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4264
4265 if (queryObject)
4266 {
4267 return GL_TRUE;
4268 }
4269 }
4270 }
4271 catch(std::bad_alloc&)
4272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004273 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004274 }
4275
4276 return GL_FALSE;
4277}
4278
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004279GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4280{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004281 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004282
4283 try
4284 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004285 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004286
4287 if (context && renderbuffer)
4288 {
4289 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4290
4291 if (renderbufferObject)
4292 {
4293 return GL_TRUE;
4294 }
4295 }
4296 }
4297 catch(std::bad_alloc&)
4298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004299 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004300 }
4301
4302 return GL_FALSE;
4303}
4304
4305GLboolean __stdcall glIsShader(GLuint shader)
4306{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004307 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004308
4309 try
4310 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004311 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004312
4313 if (context && shader)
4314 {
4315 gl::Shader *shaderObject = context->getShader(shader);
4316
4317 if (shaderObject)
4318 {
4319 return GL_TRUE;
4320 }
4321 }
4322 }
4323 catch(std::bad_alloc&)
4324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004325 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004326 }
4327
4328 return GL_FALSE;
4329}
4330
4331GLboolean __stdcall glIsTexture(GLuint texture)
4332{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004333 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004334
4335 try
4336 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004337 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004338
4339 if (context && texture)
4340 {
4341 gl::Texture *textureObject = context->getTexture(texture);
4342
4343 if (textureObject)
4344 {
4345 return GL_TRUE;
4346 }
4347 }
4348 }
4349 catch(std::bad_alloc&)
4350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004351 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004352 }
4353
4354 return GL_FALSE;
4355}
4356
4357void __stdcall glLineWidth(GLfloat width)
4358{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004359 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004360
4361 try
4362 {
4363 if (width <= 0.0f)
4364 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004365 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004366 }
4367
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004368 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004369
4370 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004371 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004372 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004373 }
4374 }
4375 catch(std::bad_alloc&)
4376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004377 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004378 }
4379}
4380
4381void __stdcall glLinkProgram(GLuint program)
4382{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004383 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004384
4385 try
4386 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004387 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004388
4389 if (context)
4390 {
4391 gl::Program *programObject = context->getProgram(program);
4392
4393 if (!programObject)
4394 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004395 if (context->getShader(program))
4396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004397 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004398 }
4399 else
4400 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004401 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004402 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004403 }
4404
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004405 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004406 }
4407 }
4408 catch(std::bad_alloc&)
4409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004410 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004411 }
4412}
4413
4414void __stdcall glPixelStorei(GLenum pname, GLint param)
4415{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004416 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004417
4418 try
4419 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004420 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004421
4422 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004423 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004424 switch (pname)
4425 {
4426 case GL_UNPACK_ALIGNMENT:
4427 if (param != 1 && param != 2 && param != 4 && param != 8)
4428 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004429 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004430 }
4431
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004432 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004433 break;
4434
4435 case GL_PACK_ALIGNMENT:
4436 if (param != 1 && param != 2 && param != 4 && param != 8)
4437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004438 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004439 }
4440
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004441 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004442 break;
4443
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004444 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4445 context->setPackReverseRowOrder(param != 0);
4446 break;
4447
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004448 case GL_UNPACK_IMAGE_HEIGHT:
4449 case GL_UNPACK_SKIP_IMAGES:
4450 case GL_UNPACK_ROW_LENGTH:
4451 case GL_UNPACK_SKIP_ROWS:
4452 case GL_UNPACK_SKIP_PIXELS:
4453 case GL_PACK_ROW_LENGTH:
4454 case GL_PACK_SKIP_ROWS:
4455 case GL_PACK_SKIP_PIXELS:
4456 if (context->getClientVersion() < 3)
4457 {
4458 return gl::error(GL_INVALID_ENUM);
4459 }
4460 UNIMPLEMENTED();
4461 break;
4462
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004463 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004464 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004465 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004466 }
4467 }
4468 catch(std::bad_alloc&)
4469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004470 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004471 }
4472}
4473
4474void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4475{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004476 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004477
4478 try
4479 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004480 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004481
4482 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004483 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004484 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004485 }
4486 }
4487 catch(std::bad_alloc&)
4488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004489 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004490 }
4491}
4492
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004493void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4494 GLenum format, GLenum type, GLsizei bufSize,
4495 GLvoid *data)
4496{
4497 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4498 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4499 x, y, width, height, format, type, bufSize, data);
4500
4501 try
4502 {
4503 if (width < 0 || height < 0 || bufSize < 0)
4504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004505 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004506 }
4507
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004508 gl::Context *context = gl::getNonLostContext();
4509
4510 if (context)
4511 {
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004512 GLint currentInternalFormat;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004513 GLenum currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004514
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004515 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4516 // and attempting to read back if that's the case is an error. The error will be registered
4517 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004518 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004519 return;
4520
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004521 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4522 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004523
4524 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004525 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004526 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004527 }
4528
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004529 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4530 }
4531 }
4532 catch(std::bad_alloc&)
4533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004534 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004535 }
4536}
4537
4538void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4539 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004540{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004541 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004542 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004543 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004544
4545 try
4546 {
4547 if (width < 0 || height < 0)
4548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004549 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004550 }
4551
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004552 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004553
4554 if (context)
4555 {
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004556 GLint currentInternalFormat;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004557 GLenum currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004558
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004559 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4560 // and attempting to read back if that's the case is an error. The error will be registered
4561 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004562 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004563 return;
4564
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004565 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4566 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004567
4568 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004570 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004571 }
4572
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004573 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004574 }
4575 }
4576 catch(std::bad_alloc&)
4577 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004578 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004579 }
4580}
4581
4582void __stdcall glReleaseShaderCompiler(void)
4583{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004584 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004585
4586 try
4587 {
4588 gl::Shader::releaseCompiler();
4589 }
4590 catch(std::bad_alloc&)
4591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004592 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004593 }
4594}
4595
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004596void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004597{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004598 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004599 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004600
4601 try
4602 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004603 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004604
4605 if (context)
4606 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004607 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004608 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004609 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004610 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004611 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004612
4613 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004614 }
4615 }
4616 catch(std::bad_alloc&)
4617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004618 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004619 }
4620}
4621
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004622void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4623{
4624 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4625}
4626
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004627void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4628{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004629 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004630
4631 try
4632 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004633 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004634
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004635 if (context)
4636 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004637 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004638 }
4639 }
4640 catch(std::bad_alloc&)
4641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004642 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004643 }
4644}
4645
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004646void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4647{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004648 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004649
4650 try
4651 {
4652 if (condition != GL_ALL_COMPLETED_NV)
4653 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004654 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004655 }
4656
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004657 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004658
4659 if (context)
4660 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004661 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004662
4663 if (fenceObject == NULL)
4664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004665 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004666 }
4667
4668 fenceObject->setFence(condition);
4669 }
4670 }
4671 catch(std::bad_alloc&)
4672 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004673 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004674 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004675}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004676
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004677void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4678{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004679 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004680
4681 try
4682 {
4683 if (width < 0 || height < 0)
4684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004685 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004686 }
4687
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004688 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004689
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004690 if (context)
4691 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004692 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004693 }
4694 }
4695 catch(std::bad_alloc&)
4696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004697 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004698 }
4699}
4700
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004701void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004702{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004703 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004704 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004705 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004706
4707 try
4708 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004709 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004710 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004711 }
4712 catch(std::bad_alloc&)
4713 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004714 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004715 }
4716}
4717
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004718void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004719{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004720 EVENT("(GLuint shader = %d, GLsizei count = %d, const GLchar** string = 0x%0.8p, const GLint* length = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004721 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004722
4723 try
4724 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004725 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004726 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004727 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004728 }
4729
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004730 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004731
4732 if (context)
4733 {
4734 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004735
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004736 if (!shaderObject)
4737 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004738 if (context->getProgram(shader))
4739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004740 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004741 }
4742 else
4743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004744 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004745 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004746 }
4747
4748 shaderObject->setSource(count, string, length);
4749 }
4750 }
4751 catch(std::bad_alloc&)
4752 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004753 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004754 }
4755}
4756
4757void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4758{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004759 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004760}
4761
4762void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4763{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004764 EVENT("(GLenum face = 0x%X, GLenum func = 0x%X, GLint ref = %d, GLuint mask = %d)", face, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004765
4766 try
4767 {
4768 switch (face)
4769 {
4770 case GL_FRONT:
4771 case GL_BACK:
4772 case GL_FRONT_AND_BACK:
4773 break;
4774 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004775 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004776 }
4777
4778 switch (func)
4779 {
4780 case GL_NEVER:
4781 case GL_ALWAYS:
4782 case GL_LESS:
4783 case GL_LEQUAL:
4784 case GL_EQUAL:
4785 case GL_GEQUAL:
4786 case GL_GREATER:
4787 case GL_NOTEQUAL:
4788 break;
4789 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004790 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004791 }
4792
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004793 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004794
4795 if (context)
4796 {
4797 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4798 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004799 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004800 }
4801
4802 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4803 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004804 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004805 }
4806 }
4807 }
4808 catch(std::bad_alloc&)
4809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004810 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004811 }
4812}
4813
4814void __stdcall glStencilMask(GLuint mask)
4815{
4816 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4817}
4818
4819void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4820{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004821 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004822
4823 try
4824 {
4825 switch (face)
4826 {
4827 case GL_FRONT:
4828 case GL_BACK:
4829 case GL_FRONT_AND_BACK:
4830 break;
4831 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004832 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004833 }
4834
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004835 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004836
4837 if (context)
4838 {
4839 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4840 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004841 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004842 }
4843
4844 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4845 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004846 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004847 }
4848 }
4849 }
4850 catch(std::bad_alloc&)
4851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004852 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004853 }
4854}
4855
4856void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4857{
4858 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4859}
4860
4861void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4862{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004863 EVENT("(GLenum face = 0x%X, GLenum fail = 0x%X, GLenum zfail = 0x%X, GLenum zpas = 0x%Xs)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004864 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004865
4866 try
4867 {
4868 switch (face)
4869 {
4870 case GL_FRONT:
4871 case GL_BACK:
4872 case GL_FRONT_AND_BACK:
4873 break;
4874 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004875 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004876 }
4877
4878 switch (fail)
4879 {
4880 case GL_ZERO:
4881 case GL_KEEP:
4882 case GL_REPLACE:
4883 case GL_INCR:
4884 case GL_DECR:
4885 case GL_INVERT:
4886 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004887 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004888 break;
4889 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004890 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004891 }
4892
4893 switch (zfail)
4894 {
4895 case GL_ZERO:
4896 case GL_KEEP:
4897 case GL_REPLACE:
4898 case GL_INCR:
4899 case GL_DECR:
4900 case GL_INVERT:
4901 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004902 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004903 break;
4904 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004905 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004906 }
4907
4908 switch (zpass)
4909 {
4910 case GL_ZERO:
4911 case GL_KEEP:
4912 case GL_REPLACE:
4913 case GL_INCR:
4914 case GL_DECR:
4915 case GL_INVERT:
4916 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004917 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004918 break;
4919 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004920 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004921 }
4922
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004923 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004924
4925 if (context)
4926 {
4927 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4928 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004929 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004930 }
4931
4932 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4933 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004934 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004935 }
4936 }
4937 }
4938 catch(std::bad_alloc&)
4939 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004940 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004941 }
4942}
4943
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004944GLboolean __stdcall glTestFenceNV(GLuint fence)
4945{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004946 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004947
4948 try
4949 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004950 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004951
4952 if (context)
4953 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004954 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004955
4956 if (fenceObject == NULL)
4957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004958 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004959 }
4960
Jamie Madillfb9a7402013-07-26 11:55:01 -04004961 if (fenceObject->isFence() != GL_TRUE)
4962 {
4963 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4964 }
4965
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004966 return fenceObject->testFence();
4967 }
4968 }
4969 catch(std::bad_alloc&)
4970 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004971 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004972 }
4973
4974 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004975}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004976
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004977void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4978 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004979{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004980 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004981 "GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004982 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004983
4984 try
4985 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004986 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004987
4988 if (context)
4989 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004990 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004991 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004992 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004993 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004994 return;
4995 }
4996
4997 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004998 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004999 0, 0, 0, width, height, 1, border, format, type))
5000 {
5001 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005002 }
5003
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005004 switch (target)
5005 {
5006 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005007 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005008 gl::Texture2D *texture = context->getTexture2D();
5009 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005010 }
5011 break;
5012 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005013 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005014 gl::TextureCubeMap *texture = context->getTextureCubeMap();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00005015 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005016 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005017 break;
5018 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5019 {
5020 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5021 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
5022 }
5023 break;
5024 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5025 {
5026 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5027 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
5028 }
5029 break;
5030 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5031 {
5032 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5033 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
5034 }
5035 break;
5036 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5037 {
5038 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5039 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
5040 }
5041 break;
5042 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5043 {
5044 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5045 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
5046 }
5047 break;
5048 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005049 }
5050 }
5051 }
5052 catch(std::bad_alloc&)
5053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005054 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005055 }
5056}
5057
5058void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5059{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005060 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5061
5062 try
5063 {
5064 gl::Context *context = gl::getNonLostContext();
5065
5066 if (context)
5067 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005068 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04005069 {
5070 return;
5071 }
5072
Jamie Madillfb8a8302013-07-03 14:24:12 -04005073 gl::Texture *texture = getTargetTexture(context, target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005074
Jamie Madillfb8a8302013-07-03 14:24:12 -04005075 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005077 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005078 }
5079
5080 switch (pname)
5081 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005082 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
5083 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
5084 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
5085 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
5086 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
5087 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
5088 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(param), context->getTextureMaxAnisotropy()); break;
5089 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
5090 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005091
Jamie Madill478fdb22013-07-19 16:36:59 -04005092 case GL_TEXTURE_SWIZZLE_R:
5093 case GL_TEXTURE_SWIZZLE_G:
5094 case GL_TEXTURE_SWIZZLE_B:
5095 case GL_TEXTURE_SWIZZLE_A:
5096 case GL_TEXTURE_BASE_LEVEL:
5097 case GL_TEXTURE_MAX_LEVEL:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005098 case GL_TEXTURE_MIN_LOD:
5099 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005100 UNIMPLEMENTED();
5101 break;
5102
Jamie Madill478fdb22013-07-19 16:36:59 -04005103 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005104 }
5105 }
5106 }
5107 catch(std::bad_alloc&)
5108 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005109 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005110 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005111}
5112
5113void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5114{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005115 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005116}
5117
5118void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5119{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005120 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005121
5122 try
5123 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005124 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005125
5126 if (context)
5127 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005128 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005129 {
5130 return;
5131 }
5132
Jamie Madillfb8a8302013-07-03 14:24:12 -04005133 gl::Texture *texture = getTargetTexture(context, target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005134
Jamie Madillfb8a8302013-07-03 14:24:12 -04005135 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005136 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005137 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005138 }
5139
5140 switch (pname)
5141 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005142 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5143 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5144 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5145 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5146 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5147 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5148 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5149 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5150 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005151
5152 case GL_TEXTURE_SWIZZLE_R:
5153 case GL_TEXTURE_SWIZZLE_G:
5154 case GL_TEXTURE_SWIZZLE_B:
5155 case GL_TEXTURE_SWIZZLE_A:
5156 case GL_TEXTURE_BASE_LEVEL:
5157 case GL_TEXTURE_MAX_LEVEL:
Jamie Madill478fdb22013-07-19 16:36:59 -04005158 case GL_TEXTURE_MIN_LOD:
5159 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005160 UNIMPLEMENTED();
5161 break;
5162
Jamie Madill478fdb22013-07-19 16:36:59 -04005163 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005164 }
5165 }
5166 }
5167 catch(std::bad_alloc&)
5168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005169 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005170 }
5171}
5172
5173void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5174{
5175 glTexParameteri(target, pname, *params);
5176}
5177
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005178void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5179{
5180 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5181 target, levels, internalformat, width, height);
5182
5183 try
5184 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005185 gl::Context *context = gl::getNonLostContext();
5186
5187 if (context)
5188 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005189 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005190 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005191 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005192 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005193 }
5194
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005195 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005196 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005197 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005198 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005199 }
5200
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005201 switch (target)
5202 {
5203 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005204 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005205 gl::Texture2D *texture2d = context->getTexture2D();
5206 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005207 }
5208 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005209
5210 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5211 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5212 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5213 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5214 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5215 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005216 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005217 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5218 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005219 }
5220 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005221
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005222 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005223 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005224 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005225 }
5226 }
5227 catch(std::bad_alloc&)
5228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005229 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005230 }
5231}
5232
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005233void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5234 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005235{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005236 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005237 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005238 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005239 target, level, xoffset, yoffset, width, height, format, type, pixels);
5240
5241 try
5242 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005243 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005244
5245 if (context)
5246 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005247 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005248 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005249 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005250 {
5251 return;
5252 }
5253
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005254 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005255 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005256 0, 0, 0, width, height, 1, 0, format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005257 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005258 return;
5259 }
5260
5261 switch (target)
5262 {
5263 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005264 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005265 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005266 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005267 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005268 break;
5269
5270 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5271 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5272 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5273 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5274 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5275 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005276 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005277 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005278 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005279 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005280 break;
5281
5282 default:
5283 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005284 }
5285 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005286 }
5287 catch(std::bad_alloc&)
5288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005289 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005290 }
5291}
5292
5293void __stdcall glUniform1f(GLint location, GLfloat x)
5294{
5295 glUniform1fv(location, 1, &x);
5296}
5297
5298void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5299{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005300 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005301
5302 try
5303 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005304 if (count < 0)
5305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005306 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005307 }
5308
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005309 if (location == -1)
5310 {
5311 return;
5312 }
5313
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005314 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005315
5316 if (context)
5317 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005318 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005319 if (!programBinary)
5320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005321 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005322 }
5323
5324 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005325 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005326 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005327 }
5328 }
5329 }
5330 catch(std::bad_alloc&)
5331 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005332 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005333 }
5334}
5335
5336void __stdcall glUniform1i(GLint location, GLint x)
5337{
5338 glUniform1iv(location, 1, &x);
5339}
5340
5341void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5342{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005343 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005344
5345 try
5346 {
5347 if (count < 0)
5348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005349 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005350 }
5351
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005352 if (location == -1)
5353 {
5354 return;
5355 }
5356
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005357 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005358
5359 if (context)
5360 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005361 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005362 if (!programBinary)
5363 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005364 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005365 }
5366
5367 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005369 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005370 }
5371 }
5372 }
5373 catch(std::bad_alloc&)
5374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005375 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005376 }
5377}
5378
5379void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5380{
5381 GLfloat xy[2] = {x, y};
5382
5383 glUniform2fv(location, 1, (GLfloat*)&xy);
5384}
5385
5386void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5387{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005388 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005389
5390 try
5391 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005392 if (count < 0)
5393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005394 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005395 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005396
5397 if (location == -1)
5398 {
5399 return;
5400 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005401
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005402 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005403
5404 if (context)
5405 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005406 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005407 if (!programBinary)
5408 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005409 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005410 }
5411
5412 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005414 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005415 }
5416 }
5417 }
5418 catch(std::bad_alloc&)
5419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005420 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005421 }
5422}
5423
5424void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5425{
5426 GLint xy[4] = {x, y};
5427
5428 glUniform2iv(location, 1, (GLint*)&xy);
5429}
5430
5431void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5432{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005433 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005434
5435 try
5436 {
5437 if (count < 0)
5438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005439 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005440 }
5441
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005442 if (location == -1)
5443 {
5444 return;
5445 }
5446
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005447 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005448
5449 if (context)
5450 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005451 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005452 if (!programBinary)
5453 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005454 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005455 }
5456
5457 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005459 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005460 }
5461 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005462 }
5463 catch(std::bad_alloc&)
5464 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005465 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005466 }
5467}
5468
5469void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5470{
5471 GLfloat xyz[3] = {x, y, z};
5472
5473 glUniform3fv(location, 1, (GLfloat*)&xyz);
5474}
5475
5476void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5477{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005478 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005479
5480 try
5481 {
5482 if (count < 0)
5483 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005484 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005485 }
5486
5487 if (location == -1)
5488 {
5489 return;
5490 }
5491
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005492 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005493
5494 if (context)
5495 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005496 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005497 if (!programBinary)
5498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005499 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005500 }
5501
5502 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005503 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005504 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005505 }
5506 }
5507 }
5508 catch(std::bad_alloc&)
5509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005510 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005511 }
5512}
5513
5514void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5515{
5516 GLint xyz[3] = {x, y, z};
5517
5518 glUniform3iv(location, 1, (GLint*)&xyz);
5519}
5520
5521void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5522{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005523 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005524
5525 try
5526 {
5527 if (count < 0)
5528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005529 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005530 }
5531
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005532 if (location == -1)
5533 {
5534 return;
5535 }
5536
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005537 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005538
5539 if (context)
5540 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005541 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005542 if (!programBinary)
5543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005544 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005545 }
5546
5547 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005549 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005550 }
5551 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005552 }
5553 catch(std::bad_alloc&)
5554 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005555 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005556 }
5557}
5558
5559void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5560{
5561 GLfloat xyzw[4] = {x, y, z, w};
5562
5563 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5564}
5565
5566void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5567{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005568 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005569
5570 try
5571 {
5572 if (count < 0)
5573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005574 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005575 }
5576
5577 if (location == -1)
5578 {
5579 return;
5580 }
5581
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005582 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005583
5584 if (context)
5585 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005586 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005587 if (!programBinary)
5588 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005589 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005590 }
5591
5592 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005594 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005595 }
5596 }
5597 }
5598 catch(std::bad_alloc&)
5599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005600 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005601 }
5602}
5603
5604void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5605{
5606 GLint xyzw[4] = {x, y, z, w};
5607
5608 glUniform4iv(location, 1, (GLint*)&xyzw);
5609}
5610
5611void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5612{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005613 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005614
5615 try
5616 {
5617 if (count < 0)
5618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005619 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005620 }
5621
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005622 if (location == -1)
5623 {
5624 return;
5625 }
5626
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005627 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005628
5629 if (context)
5630 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005631 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005632 if (!programBinary)
5633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005634 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005635 }
5636
5637 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005639 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005640 }
5641 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005642 }
5643 catch(std::bad_alloc&)
5644 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005645 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005646 }
5647}
5648
5649void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5650{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005651 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005652 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005653
5654 try
5655 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005656 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005658 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005659 }
5660
5661 if (location == -1)
5662 {
5663 return;
5664 }
5665
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005666 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005667
5668 if (context)
5669 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005670 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5671 {
5672 return gl::error(GL_INVALID_VALUE);
5673 }
5674
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005675 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005676 if (!programBinary)
5677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005678 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005679 }
5680
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005681 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005683 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005684 }
5685 }
5686 }
5687 catch(std::bad_alloc&)
5688 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005689 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005690 }
5691}
5692
5693void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5694{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005695 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005696 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005697
5698 try
5699 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005700 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005701 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005702 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005703 }
5704
5705 if (location == -1)
5706 {
5707 return;
5708 }
5709
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005710 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005711
5712 if (context)
5713 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005714 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5715 {
5716 return gl::error(GL_INVALID_VALUE);
5717 }
5718
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005719 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005720 if (!programBinary)
5721 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005722 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005723 }
5724
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005725 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005726 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005727 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005728 }
5729 }
5730 }
5731 catch(std::bad_alloc&)
5732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005733 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005734 }
5735}
5736
5737void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5738{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005739 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005740 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005741
5742 try
5743 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005744 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005746 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005747 }
5748
5749 if (location == -1)
5750 {
5751 return;
5752 }
5753
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005754 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005755
5756 if (context)
5757 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005758 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5759 {
5760 return gl::error(GL_INVALID_VALUE);
5761 }
5762
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005763 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005764 if (!programBinary)
5765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005766 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005767 }
5768
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005769 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005771 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005772 }
5773 }
5774 }
5775 catch(std::bad_alloc&)
5776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005777 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005778 }
5779}
5780
5781void __stdcall glUseProgram(GLuint program)
5782{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005783 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005784
5785 try
5786 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005787 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005788
5789 if (context)
5790 {
5791 gl::Program *programObject = context->getProgram(program);
5792
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005793 if (!programObject && program != 0)
5794 {
5795 if (context->getShader(program))
5796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005797 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005798 }
5799 else
5800 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005801 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005802 }
5803 }
5804
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005805 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005807 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005808 }
5809
5810 context->useProgram(program);
5811 }
5812 }
5813 catch(std::bad_alloc&)
5814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005815 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005816 }
5817}
5818
5819void __stdcall glValidateProgram(GLuint program)
5820{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005821 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005822
5823 try
5824 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005825 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005826
5827 if (context)
5828 {
5829 gl::Program *programObject = context->getProgram(program);
5830
5831 if (!programObject)
5832 {
5833 if (context->getShader(program))
5834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005835 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005836 }
5837 else
5838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005839 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005840 }
5841 }
5842
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005843 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005844 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005845 }
5846 catch(std::bad_alloc&)
5847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005848 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005849 }
5850}
5851
5852void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5853{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005854 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005855
5856 try
5857 {
5858 if (index >= gl::MAX_VERTEX_ATTRIBS)
5859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005860 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005861 }
5862
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005863 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005864
5865 if (context)
5866 {
5867 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005868 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005869 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005870 }
5871 catch(std::bad_alloc&)
5872 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005873 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005874 }
5875}
5876
5877void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5878{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005879 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005880
5881 try
5882 {
5883 if (index >= gl::MAX_VERTEX_ATTRIBS)
5884 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005885 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005886 }
5887
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005888 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005889
5890 if (context)
5891 {
5892 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005893 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005894 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005895 }
5896 catch(std::bad_alloc&)
5897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005898 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005899 }
5900}
5901
5902void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5903{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005904 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005905
5906 try
5907 {
5908 if (index >= gl::MAX_VERTEX_ATTRIBS)
5909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005910 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005911 }
5912
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005913 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005914
5915 if (context)
5916 {
5917 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005918 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005919 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005920 }
5921 catch(std::bad_alloc&)
5922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005923 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005924 }
5925}
5926
5927void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5928{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005929 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005930
5931 try
5932 {
5933 if (index >= gl::MAX_VERTEX_ATTRIBS)
5934 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005935 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005936 }
5937
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005938 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005939
5940 if (context)
5941 {
5942 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005943 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005944 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005945 }
5946 catch(std::bad_alloc&)
5947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005948 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005949 }
5950}
5951
5952void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5953{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005954 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f)", index, x, y, z);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005955
5956 try
5957 {
5958 if (index >= gl::MAX_VERTEX_ATTRIBS)
5959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005960 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005961 }
5962
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005963 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005964
5965 if (context)
5966 {
5967 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005968 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005969 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005970 }
5971 catch(std::bad_alloc&)
5972 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005973 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005974 }
5975}
5976
5977void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5978{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005979 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005980
5981 try
5982 {
5983 if (index >= gl::MAX_VERTEX_ATTRIBS)
5984 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005985 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005986 }
5987
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005988 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005989
5990 if (context)
5991 {
5992 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005993 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005994 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005995 }
5996 catch(std::bad_alloc&)
5997 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005998 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005999 }
6000}
6001
6002void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6003{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006004 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f, GLfloat w = %f)", index, x, y, z, w);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006005
6006 try
6007 {
6008 if (index >= gl::MAX_VERTEX_ATTRIBS)
6009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006010 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006011 }
6012
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006013 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006014
6015 if (context)
6016 {
6017 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006018 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006019 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006020 }
6021 catch(std::bad_alloc&)
6022 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006023 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006024 }
6025}
6026
6027void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6028{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006029 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006030
6031 try
6032 {
6033 if (index >= gl::MAX_VERTEX_ATTRIBS)
6034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006035 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006036 }
6037
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006038 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006039
6040 if (context)
6041 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006042 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006043 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006044 }
6045 catch(std::bad_alloc&)
6046 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006047 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006048 }
6049}
6050
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006051void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6052{
6053 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6054
6055 try
6056 {
6057 if (index >= gl::MAX_VERTEX_ATTRIBS)
6058 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006059 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006060 }
6061
6062 gl::Context *context = gl::getNonLostContext();
6063
6064 if (context)
6065 {
6066 context->setVertexAttribDivisor(index, divisor);
6067 }
6068 }
6069 catch(std::bad_alloc&)
6070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006071 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006072 }
6073}
6074
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006075void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006076{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006077 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006078 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006079 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006080
6081 try
6082 {
6083 if (index >= gl::MAX_VERTEX_ATTRIBS)
6084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006085 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006086 }
6087
6088 if (size < 1 || size > 4)
6089 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006090 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006091 }
6092
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006093 gl::Context *context = gl::getNonLostContext();
6094
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006095 switch (type)
6096 {
6097 case GL_BYTE:
6098 case GL_UNSIGNED_BYTE:
6099 case GL_SHORT:
6100 case GL_UNSIGNED_SHORT:
6101 case GL_FIXED:
6102 case GL_FLOAT:
6103 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006104 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006105 case GL_INT:
6106 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006107 case GL_INT_2_10_10_10_REV:
6108 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006109 if (context && context->getClientVersion() < 3)
6110 {
6111 return gl::error(GL_INVALID_ENUM);
6112 }
6113 else
6114 {
6115 break;
6116 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006117 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006118 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006119 }
6120
6121 if (stride < 0)
6122 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006123 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006124 }
6125
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006126 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6127 {
6128 return gl::error(GL_INVALID_OPERATION);
6129 }
6130
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006131 if (context)
6132 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006133 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6134 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6135 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6136 // and the pointer argument is not NULL.
6137 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6138 {
6139 return gl::error(GL_INVALID_OPERATION);
6140 }
6141
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006142 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6143 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006144 }
6145 }
6146 catch(std::bad_alloc&)
6147 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006148 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006149 }
6150}
6151
6152void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6153{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006154 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006155
6156 try
6157 {
6158 if (width < 0 || height < 0)
6159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006160 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006161 }
6162
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006163 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006164
6165 if (context)
6166 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006167 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006168 }
6169 }
6170 catch(std::bad_alloc&)
6171 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006172 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006173 }
6174}
6175
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006176// OpenGL ES 3.0 functions
6177
6178void __stdcall glReadBuffer(GLenum mode)
6179{
6180 EVENT("(GLenum mode = 0x%X)", mode);
6181
6182 try
6183 {
6184 gl::Context *context = gl::getNonLostContext();
6185
6186 if (context)
6187 {
6188 if (context->getClientVersion() < 3)
6189 {
6190 return gl::error(GL_INVALID_OPERATION);
6191 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006192
Jamie Madill54133512013-06-21 09:33:07 -04006193 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006194 UNIMPLEMENTED();
6195 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006196 }
6197 catch(std::bad_alloc&)
6198 {
6199 return gl::error(GL_OUT_OF_MEMORY);
6200 }
6201}
6202
6203void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6204{
6205 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6206 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6207
6208 try
6209 {
6210 gl::Context *context = gl::getNonLostContext();
6211
6212 if (context)
6213 {
6214 if (context->getClientVersion() < 3)
6215 {
6216 return gl::error(GL_INVALID_OPERATION);
6217 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006218
Jamie Madill54133512013-06-21 09:33:07 -04006219 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006220 UNIMPLEMENTED();
6221 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006222 }
6223 catch(std::bad_alloc&)
6224 {
6225 return gl::error(GL_OUT_OF_MEMORY);
6226 }
6227}
6228
6229void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6230{
6231 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6232 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6233 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6234 target, level, internalformat, width, height, depth, border, format, type, pixels);
6235
6236 try
6237 {
6238 gl::Context *context = gl::getNonLostContext();
6239
6240 if (context)
6241 {
6242 if (context->getClientVersion() < 3)
6243 {
6244 return gl::error(GL_INVALID_OPERATION);
6245 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006246
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006247 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006248 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006249 0, 0, 0, width, height, depth, border, format, type))
6250 {
6251 return;
6252 }
6253
6254 switch(target)
6255 {
6256 case GL_TEXTURE_3D:
6257 {
6258 gl::Texture3D *texture = context->getTexture3D();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006259 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackAlignment(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006260 }
6261 break;
6262
6263 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006264 {
6265 gl::Texture2DArray *texture = context->getTexture2DArray();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006266 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackAlignment(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006267 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006268 break;
6269
6270 default:
6271 return gl::error(GL_INVALID_ENUM);
6272 }
6273 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006274 }
6275 catch(std::bad_alloc&)
6276 {
6277 return gl::error(GL_OUT_OF_MEMORY);
6278 }
6279}
6280
6281void __stdcall glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels)
6282{
6283 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6284 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6285 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6286 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6287
6288 try
6289 {
6290 gl::Context *context = gl::getNonLostContext();
6291
6292 if (context)
6293 {
6294 if (context->getClientVersion() < 3)
6295 {
6296 return gl::error(GL_INVALID_OPERATION);
6297 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006298
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006299 if (!pixels)
6300 {
6301 return gl::error(GL_INVALID_VALUE);
6302 }
6303
6304 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006305 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006306 xoffset, yoffset, zoffset, width, height, depth, 0,
6307 format, type))
6308 {
6309 return;
6310 }
6311
6312 switch(target)
6313 {
6314 case GL_TEXTURE_3D:
6315 {
6316 gl::Texture3D *texture = context->getTexture3D();
6317 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
6318 }
6319 break;
6320
6321 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006322 {
6323 gl::Texture2DArray *texture = context->getTexture2DArray();
6324 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
6325 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006326 break;
6327
6328 default:
6329 return gl::error(GL_INVALID_ENUM);
6330 }
6331 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006332 }
6333 catch(std::bad_alloc&)
6334 {
6335 return gl::error(GL_OUT_OF_MEMORY);
6336 }
6337}
6338
6339void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6340{
6341 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6342 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6343 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6344
6345 try
6346 {
6347 gl::Context *context = gl::getNonLostContext();
6348
6349 if (context)
6350 {
6351 if (context->getClientVersion() < 3)
6352 {
6353 return gl::error(GL_INVALID_OPERATION);
6354 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006355
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006356 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006357 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006358 {
6359 return;
6360 }
6361
6362 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6363 gl::Texture *texture = NULL;
6364 switch (target)
6365 {
6366 case GL_TEXTURE_3D:
6367 texture = context->getTexture3D();
6368 break;
6369
6370 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006371 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006372 break;
6373
6374 default:
6375 return gl::error(GL_INVALID_ENUM);
6376 }
6377
6378 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6379 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006380 }
6381 catch(std::bad_alloc&)
6382 {
6383 return gl::error(GL_OUT_OF_MEMORY);
6384 }
6385}
6386
6387void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6388{
6389 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6390 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6391 "const GLvoid* data = 0x%0.8p)",
6392 target, level, internalformat, width, height, depth, border, imageSize, data);
6393
6394 try
6395 {
6396 gl::Context *context = gl::getNonLostContext();
6397
6398 if (context)
6399 {
6400 if (context->getClientVersion() < 3)
6401 {
6402 return gl::error(GL_INVALID_OPERATION);
6403 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006404
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006405 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006406 {
6407 return gl::error(GL_INVALID_VALUE);
6408 }
6409
6410 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006411 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006412 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006413 {
6414 return;
6415 }
6416
6417 switch(target)
6418 {
6419 case GL_TEXTURE_3D:
6420 {
6421 gl::Texture3D *texture = context->getTexture3D();
6422 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6423 }
6424 break;
6425
6426 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006427 {
6428 gl::Texture2DArray *texture = context->getTexture2DArray();
6429 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6430 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006431 break;
6432
6433 default:
6434 return gl::error(GL_INVALID_ENUM);
6435 }
6436 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006437 }
6438 catch(std::bad_alloc&)
6439 {
6440 return gl::error(GL_OUT_OF_MEMORY);
6441 }
6442}
6443
6444void __stdcall glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data)
6445{
6446 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6447 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6448 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6449 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6450
6451 try
6452 {
6453 gl::Context *context = gl::getNonLostContext();
6454
6455 if (context)
6456 {
6457 if (context->getClientVersion() < 3)
6458 {
6459 return gl::error(GL_INVALID_OPERATION);
6460 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006461
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006462 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006463 {
6464 return gl::error(GL_INVALID_VALUE);
6465 }
6466
6467 if (!data)
6468 {
6469 return gl::error(GL_INVALID_VALUE);
6470 }
6471
6472 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006473 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006474 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006475 {
6476 return;
6477 }
6478
6479 switch(target)
6480 {
6481 case GL_TEXTURE_3D:
6482 {
6483 gl::Texture3D *texture = context->getTexture3D();
6484 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6485 format, imageSize, data);
6486 }
6487 break;
6488
6489 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006490 {
6491 gl::Texture2DArray *texture = context->getTexture2DArray();
6492 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6493 format, imageSize, data);
6494 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006495 break;
6496
6497 default:
6498 return gl::error(GL_INVALID_ENUM);
6499 }
6500 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006501 }
6502 catch(std::bad_alloc&)
6503 {
6504 return gl::error(GL_OUT_OF_MEMORY);
6505 }
6506}
6507
6508void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6509{
6510 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6511
6512 try
6513 {
6514 gl::Context *context = gl::getNonLostContext();
6515
6516 if (context)
6517 {
6518 if (context->getClientVersion() < 3)
6519 {
6520 return gl::error(GL_INVALID_OPERATION);
6521 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006522
Jamie Madill3641b4b2013-07-26 12:54:59 -04006523 glGenQueriesEXT(n, ids);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006524 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006525 }
6526 catch(std::bad_alloc&)
6527 {
6528 return gl::error(GL_OUT_OF_MEMORY);
6529 }
6530}
6531
6532void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6533{
6534 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6535
6536 try
6537 {
6538 gl::Context *context = gl::getNonLostContext();
6539
6540 if (context)
6541 {
6542 if (context->getClientVersion() < 3)
6543 {
6544 return gl::error(GL_INVALID_OPERATION);
6545 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006546
Jamie Madill3641b4b2013-07-26 12:54:59 -04006547 glDeleteQueriesEXT(n, ids);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006548 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006549 }
6550 catch(std::bad_alloc&)
6551 {
6552 return gl::error(GL_OUT_OF_MEMORY);
6553 }
6554}
6555
6556GLboolean __stdcall glIsQuery(GLuint id)
6557{
6558 EVENT("(GLuint id = %u)", id);
6559
6560 try
6561 {
6562 gl::Context *context = gl::getNonLostContext();
6563
6564 if (context)
6565 {
6566 if (context->getClientVersion() < 3)
6567 {
6568 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6569 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006570
Jamie Madill3641b4b2013-07-26 12:54:59 -04006571 // TODO: XFB queries
6572 return glIsQueryEXT(id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006573 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006574 }
6575 catch(std::bad_alloc&)
6576 {
6577 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6578 }
6579
6580 return GL_FALSE;
6581}
6582
6583void __stdcall glBeginQuery(GLenum target, GLuint id)
6584{
6585 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6586
6587 try
6588 {
6589 gl::Context *context = gl::getNonLostContext();
6590
6591 if (context)
6592 {
6593 if (context->getClientVersion() < 3)
6594 {
6595 return gl::error(GL_INVALID_OPERATION);
6596 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006597
Jamie Madill3641b4b2013-07-26 12:54:59 -04006598 switch (target)
6599 {
6600 case GL_ANY_SAMPLES_PASSED:
6601 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
6602 case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
6603 break;
6604 default:
6605 return gl::error(GL_INVALID_ENUM);
6606 }
6607
6608 if (id == 0)
6609 {
6610 return gl::error(GL_INVALID_OPERATION);
6611 }
6612
6613 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6614 {
6615 // TODO: XFB queries
6616 UNIMPLEMENTED();
6617 }
6618 else
6619 {
6620 context->beginQuery(target, id);
6621 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006622 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006623 }
6624 catch(std::bad_alloc&)
6625 {
6626 return gl::error(GL_OUT_OF_MEMORY);
6627 }
6628}
6629
6630void __stdcall glEndQuery(GLenum target)
6631{
6632 EVENT("(GLenum target = 0x%X)", target);
6633
6634 try
6635 {
6636 gl::Context *context = gl::getNonLostContext();
6637
6638 if (context)
6639 {
6640 if (context->getClientVersion() < 3)
6641 {
6642 return gl::error(GL_INVALID_OPERATION);
6643 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006644
Jamie Madill3641b4b2013-07-26 12:54:59 -04006645 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6646 {
6647 // TODO: XFB queries
6648 UNIMPLEMENTED();
6649 }
6650 else
6651 {
6652 glEndQueryEXT(target);
6653 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006654 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006655 }
6656 catch(std::bad_alloc&)
6657 {
6658 return gl::error(GL_OUT_OF_MEMORY);
6659 }
6660}
6661
6662void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6663{
6664 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6665
6666 try
6667 {
6668 gl::Context *context = gl::getNonLostContext();
6669
6670 if (context)
6671 {
6672 if (context->getClientVersion() < 3)
6673 {
6674 return gl::error(GL_INVALID_OPERATION);
6675 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006676
Jamie Madill3641b4b2013-07-26 12:54:59 -04006677 if (target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
6678 {
6679 // TODO: XFB queries
6680 UNIMPLEMENTED();
6681 }
6682 else
6683 {
6684 glGetQueryivEXT(target, pname, params);
6685 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006686 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006687 }
6688 catch(std::bad_alloc&)
6689 {
6690 return gl::error(GL_OUT_OF_MEMORY);
6691 }
6692}
6693
6694void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6695{
6696 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6697
6698 try
6699 {
6700 gl::Context *context = gl::getNonLostContext();
6701
6702 if (context)
6703 {
6704 if (context->getClientVersion() < 3)
6705 {
6706 return gl::error(GL_INVALID_OPERATION);
6707 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006708
Jamie Madill3641b4b2013-07-26 12:54:59 -04006709 // TODO: XFB queries
6710 glGetQueryObjectuivEXT(id, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006711 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006712 }
6713 catch(std::bad_alloc&)
6714 {
6715 return gl::error(GL_OUT_OF_MEMORY);
6716 }
6717}
6718
6719GLboolean __stdcall glUnmapBuffer(GLenum target)
6720{
6721 EVENT("(GLenum target = 0x%X)", target);
6722
6723 try
6724 {
6725 gl::Context *context = gl::getNonLostContext();
6726
6727 if (context)
6728 {
6729 if (context->getClientVersion() < 3)
6730 {
6731 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6732 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006733
Jamie Madill54133512013-06-21 09:33:07 -04006734 // glUnmapBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006735 UNIMPLEMENTED();
6736 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006737 }
6738 catch(std::bad_alloc&)
6739 {
6740 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6741 }
6742
6743 return GL_FALSE;
6744}
6745
6746void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6747{
6748 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6749
6750 try
6751 {
6752 gl::Context *context = gl::getNonLostContext();
6753
6754 if (context)
6755 {
6756 if (context->getClientVersion() < 3)
6757 {
6758 return gl::error(GL_INVALID_OPERATION);
6759 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006760
Jamie Madill54133512013-06-21 09:33:07 -04006761 // glGetBufferPointerv
shannonwoods@chromium.org2d2190a2013-05-30 00:17:35 +00006762 UNIMPLEMENTED();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006763 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006764 }
6765 catch(std::bad_alloc&)
6766 {
6767 return gl::error(GL_OUT_OF_MEMORY);
6768 }
6769}
6770
6771void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6772{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006773 try
6774 {
6775 gl::Context *context = gl::getNonLostContext();
6776
6777 if (context)
6778 {
6779 if (context->getClientVersion() < 3)
6780 {
6781 return gl::error(GL_INVALID_OPERATION);
6782 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006783
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006784 glDrawBuffersEXT(n, bufs);
6785 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006786 }
6787 catch(std::bad_alloc&)
6788 {
6789 return gl::error(GL_OUT_OF_MEMORY);
6790 }
6791}
6792
6793void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6794{
6795 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6796 location, count, transpose, value);
6797
6798 try
6799 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006800 if (count < 0)
6801 {
6802 return gl::error(GL_INVALID_VALUE);
6803 }
6804
6805 if (location == -1)
6806 {
6807 return;
6808 }
6809
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006810 gl::Context *context = gl::getNonLostContext();
6811
6812 if (context)
6813 {
6814 if (context->getClientVersion() < 3)
6815 {
6816 return gl::error(GL_INVALID_OPERATION);
6817 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006818
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006819 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6820 if (!programBinary)
6821 {
6822 return gl::error(GL_INVALID_OPERATION);
6823 }
6824
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006825 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006826 {
6827 return gl::error(GL_INVALID_OPERATION);
6828 }
6829 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006830 }
6831 catch(std::bad_alloc&)
6832 {
6833 return gl::error(GL_OUT_OF_MEMORY);
6834 }
6835}
6836
6837void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6838{
6839 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6840 location, count, transpose, value);
6841
6842 try
6843 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006844 if (count < 0)
6845 {
6846 return gl::error(GL_INVALID_VALUE);
6847 }
6848
6849 if (location == -1)
6850 {
6851 return;
6852 }
6853
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006854 gl::Context *context = gl::getNonLostContext();
6855
6856 if (context)
6857 {
6858 if (context->getClientVersion() < 3)
6859 {
6860 return gl::error(GL_INVALID_OPERATION);
6861 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006862
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006863 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6864 if (!programBinary)
6865 {
6866 return gl::error(GL_INVALID_OPERATION);
6867 }
6868
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006869 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006870 {
6871 return gl::error(GL_INVALID_OPERATION);
6872 }
6873 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006874 }
6875 catch(std::bad_alloc&)
6876 {
6877 return gl::error(GL_OUT_OF_MEMORY);
6878 }
6879}
6880
6881void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6882{
6883 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6884 location, count, transpose, value);
6885
6886 try
6887 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006888 if (count < 0)
6889 {
6890 return gl::error(GL_INVALID_VALUE);
6891 }
6892
6893 if (location == -1)
6894 {
6895 return;
6896 }
6897
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006898 gl::Context *context = gl::getNonLostContext();
6899
6900 if (context)
6901 {
6902 if (context->getClientVersion() < 3)
6903 {
6904 return gl::error(GL_INVALID_OPERATION);
6905 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006906
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006907 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6908 if (!programBinary)
6909 {
6910 return gl::error(GL_INVALID_OPERATION);
6911 }
6912
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006913 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006914 {
6915 return gl::error(GL_INVALID_OPERATION);
6916 }
6917 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006918 }
6919 catch(std::bad_alloc&)
6920 {
6921 return gl::error(GL_OUT_OF_MEMORY);
6922 }
6923}
6924
6925void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6926{
6927 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6928 location, count, transpose, value);
6929
6930 try
6931 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006932 if (count < 0)
6933 {
6934 return gl::error(GL_INVALID_VALUE);
6935 }
6936
6937 if (location == -1)
6938 {
6939 return;
6940 }
6941
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006942 gl::Context *context = gl::getNonLostContext();
6943
6944 if (context)
6945 {
6946 if (context->getClientVersion() < 3)
6947 {
6948 return gl::error(GL_INVALID_OPERATION);
6949 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006950
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006951 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6952 if (!programBinary)
6953 {
6954 return gl::error(GL_INVALID_OPERATION);
6955 }
6956
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006957 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006958 {
6959 return gl::error(GL_INVALID_OPERATION);
6960 }
6961 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006962 }
6963 catch(std::bad_alloc&)
6964 {
6965 return gl::error(GL_OUT_OF_MEMORY);
6966 }
6967}
6968
6969void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6970{
6971 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6972 location, count, transpose, value);
6973
6974 try
6975 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006976 if (count < 0)
6977 {
6978 return gl::error(GL_INVALID_VALUE);
6979 }
6980
6981 if (location == -1)
6982 {
6983 return;
6984 }
6985
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006986 gl::Context *context = gl::getNonLostContext();
6987
6988 if (context)
6989 {
6990 if (context->getClientVersion() < 3)
6991 {
6992 return gl::error(GL_INVALID_OPERATION);
6993 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006994
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006995 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6996 if (!programBinary)
6997 {
6998 return gl::error(GL_INVALID_OPERATION);
6999 }
7000
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007001 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007002 {
7003 return gl::error(GL_INVALID_OPERATION);
7004 }
7005 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007006 }
7007 catch(std::bad_alloc&)
7008 {
7009 return gl::error(GL_OUT_OF_MEMORY);
7010 }
7011}
7012
7013void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7014{
7015 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7016 location, count, transpose, value);
7017
7018 try
7019 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007020 if (count < 0)
7021 {
7022 return gl::error(GL_INVALID_VALUE);
7023 }
7024
7025 if (location == -1)
7026 {
7027 return;
7028 }
7029
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007030 gl::Context *context = gl::getNonLostContext();
7031
7032 if (context)
7033 {
7034 if (context->getClientVersion() < 3)
7035 {
7036 return gl::error(GL_INVALID_OPERATION);
7037 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007038
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007039 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7040 if (!programBinary)
7041 {
7042 return gl::error(GL_INVALID_OPERATION);
7043 }
7044
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007045 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007046 {
7047 return gl::error(GL_INVALID_OPERATION);
7048 }
7049 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007050 }
7051 catch(std::bad_alloc&)
7052 {
7053 return gl::error(GL_OUT_OF_MEMORY);
7054 }
7055}
7056
7057void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7058{
7059 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7060 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7061 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7062
7063 try
7064 {
7065 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007066 if (context)
7067 {
7068 if (context->getClientVersion() < 3)
7069 {
7070 return gl::error(GL_INVALID_OPERATION);
7071 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007072
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007073 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04007074 dstX0, dstY0, dstX1, dstY1, mask, filter,
7075 false))
7076 {
7077 return;
7078 }
7079
7080 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
7081 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007082 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007083 }
7084 catch(std::bad_alloc&)
7085 {
7086 return gl::error(GL_OUT_OF_MEMORY);
7087 }
7088}
7089
7090void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7091{
7092 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7093 target, samples, internalformat, width, height);
7094
7095 try
7096 {
7097 gl::Context *context = gl::getNonLostContext();
7098
7099 if (context)
7100 {
7101 if (context->getClientVersion() < 3)
7102 {
7103 return gl::error(GL_INVALID_OPERATION);
7104 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007105
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007106 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007107 width, height, false))
7108 {
7109 return;
7110 }
7111
7112 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007113 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007114 }
7115 catch(std::bad_alloc&)
7116 {
7117 return gl::error(GL_OUT_OF_MEMORY);
7118 }
7119}
7120
7121void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7122{
7123 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7124 target, attachment, texture, level, layer);
7125
7126 try
7127 {
7128 gl::Context *context = gl::getNonLostContext();
7129
7130 if (context)
7131 {
7132 if (context->getClientVersion() < 3)
7133 {
7134 return gl::error(GL_INVALID_OPERATION);
7135 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007136
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007137 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007138 {
7139 return;
7140 }
7141
7142 gl::Framebuffer *framebuffer = NULL;
7143 if (target == GL_READ_FRAMEBUFFER)
7144 {
7145 framebuffer = context->getReadFramebuffer();
7146 }
7147 else
7148 {
7149 framebuffer = context->getDrawFramebuffer();
7150 }
7151
7152 gl::Texture *textureObject = context->getTexture(texture);
7153 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7154
7155 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7156 {
7157 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7158 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7159 }
7160 else
7161 {
7162 switch (attachment)
7163 {
7164 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7165 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7166 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7167 }
7168 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007169 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007170 }
7171 catch(std::bad_alloc&)
7172 {
7173 return gl::error(GL_OUT_OF_MEMORY);
7174 }
7175}
7176
7177GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7178{
7179 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7180 target, offset, length, access);
7181
7182 try
7183 {
7184 gl::Context *context = gl::getNonLostContext();
7185
7186 if (context)
7187 {
7188 if (context->getClientVersion() < 3)
7189 {
7190 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7191 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007192
Jamie Madill54133512013-06-21 09:33:07 -04007193 // glMapBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007194 UNIMPLEMENTED();
7195 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007196 }
7197 catch(std::bad_alloc&)
7198 {
7199 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7200 }
7201
7202 return NULL;
7203}
7204
7205void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7206{
7207 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7208
7209 try
7210 {
7211 gl::Context *context = gl::getNonLostContext();
7212
7213 if (context)
7214 {
7215 if (context->getClientVersion() < 3)
7216 {
7217 return gl::error(GL_INVALID_OPERATION);
7218 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007219
Jamie Madill54133512013-06-21 09:33:07 -04007220 // glFlushMappedBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007221 UNIMPLEMENTED();
7222 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007223 }
7224 catch(std::bad_alloc&)
7225 {
7226 return gl::error(GL_OUT_OF_MEMORY);
7227 }
7228}
7229
7230void __stdcall glBindVertexArray(GLuint array)
7231{
7232 EVENT("(GLuint array = %u)", array);
7233
7234 try
7235 {
7236 gl::Context *context = gl::getNonLostContext();
7237
7238 if (context)
7239 {
7240 if (context->getClientVersion() < 3)
7241 {
7242 return gl::error(GL_INVALID_OPERATION);
7243 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007244
Jamie Madilld1028542013-07-02 11:57:04 -04007245 gl::VertexArray *vao = context->getVertexArray(array);
7246
7247 if (!vao)
7248 {
7249 // The default VAO should always exist
7250 ASSERT(array != 0);
7251 return gl::error(GL_INVALID_OPERATION);
7252 }
7253
7254 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007255 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007256 }
7257 catch(std::bad_alloc&)
7258 {
7259 return gl::error(GL_OUT_OF_MEMORY);
7260 }
7261}
7262
7263void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7264{
7265 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7266
7267 try
7268 {
7269 gl::Context *context = gl::getNonLostContext();
7270
7271 if (context)
7272 {
7273 if (context->getClientVersion() < 3)
7274 {
7275 return gl::error(GL_INVALID_OPERATION);
7276 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007277
Jamie Madilld1028542013-07-02 11:57:04 -04007278 if (n < 0)
7279 {
7280 return gl::error(GL_INVALID_VALUE);
7281 }
7282
7283 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7284 {
7285 if (arrays[arrayIndex] != 0)
7286 {
7287 context->deleteVertexArray(arrays[arrayIndex]);
7288 }
7289 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007290 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007291 }
7292 catch(std::bad_alloc&)
7293 {
7294 return gl::error(GL_OUT_OF_MEMORY);
7295 }
7296}
7297
7298void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7299{
7300 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7301
7302 try
7303 {
7304 gl::Context *context = gl::getNonLostContext();
7305
7306 if (context)
7307 {
7308 if (context->getClientVersion() < 3)
7309 {
7310 return gl::error(GL_INVALID_OPERATION);
7311 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007312
Jamie Madilld1028542013-07-02 11:57:04 -04007313 if (n < 0)
7314 {
7315 return gl::error(GL_INVALID_VALUE);
7316 }
7317
7318 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7319 {
7320 arrays[arrayIndex] = context->createVertexArray();
7321 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007322 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007323 }
7324 catch(std::bad_alloc&)
7325 {
7326 return gl::error(GL_OUT_OF_MEMORY);
7327 }
7328}
7329
7330GLboolean __stdcall glIsVertexArray(GLuint array)
7331{
7332 EVENT("(GLuint array = %u)", array);
7333
7334 try
7335 {
7336 gl::Context *context = gl::getNonLostContext();
7337
7338 if (context)
7339 {
7340 if (context->getClientVersion() < 3)
7341 {
7342 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7343 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007344
Jamie Madilld1028542013-07-02 11:57:04 -04007345 if (array == 0)
7346 {
7347 return GL_FALSE;
7348 }
7349
7350 gl::VertexArray *vao = context->getVertexArray(array);
7351
7352 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007353 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007354 }
7355 catch(std::bad_alloc&)
7356 {
7357 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7358 }
7359
7360 return GL_FALSE;
7361}
7362
7363void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7364{
7365 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7366 target, index, data);
7367
7368 try
7369 {
7370 gl::Context *context = gl::getNonLostContext();
7371
7372 if (context)
7373 {
7374 if (context->getClientVersion() < 3)
7375 {
7376 return gl::error(GL_INVALID_OPERATION);
7377 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007378
Jamie Madill54133512013-06-21 09:33:07 -04007379 // glGetIntegeri_v
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007380 UNIMPLEMENTED();
7381 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007382 }
7383 catch(std::bad_alloc&)
7384 {
7385 return gl::error(GL_OUT_OF_MEMORY);
7386 }
7387}
7388
7389void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7390{
7391 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7392
7393 try
7394 {
7395 gl::Context *context = gl::getNonLostContext();
7396
7397 if (context)
7398 {
7399 if (context->getClientVersion() < 3)
7400 {
7401 return gl::error(GL_INVALID_OPERATION);
7402 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007403
Jamie Madill54133512013-06-21 09:33:07 -04007404 // glBeginTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007405 UNIMPLEMENTED();
7406 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007407 }
7408 catch(std::bad_alloc&)
7409 {
7410 return gl::error(GL_OUT_OF_MEMORY);
7411 }
7412}
7413
7414void __stdcall glEndTransformFeedback(void)
7415{
7416 EVENT("(void)");
7417
7418 try
7419 {
7420 gl::Context *context = gl::getNonLostContext();
7421
7422 if (context)
7423 {
7424 if (context->getClientVersion() < 3)
7425 {
7426 return gl::error(GL_INVALID_OPERATION);
7427 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007428
Jamie Madill54133512013-06-21 09:33:07 -04007429 // glEndTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007430 UNIMPLEMENTED();
7431 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007432 }
7433 catch(std::bad_alloc&)
7434 {
7435 return gl::error(GL_OUT_OF_MEMORY);
7436 }
7437}
7438
7439void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7440{
7441 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7442 target, index, buffer, offset, size);
7443
7444 try
7445 {
7446 gl::Context *context = gl::getNonLostContext();
7447
7448 if (context)
7449 {
7450 if (context->getClientVersion() < 3)
7451 {
7452 return gl::error(GL_INVALID_OPERATION);
7453 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007454
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007455 switch (target)
7456 {
7457 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007458 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007459 {
7460 return gl::error(GL_INVALID_VALUE);
7461 }
7462 break;
7463
7464 case GL_UNIFORM_BUFFER:
7465 if (index >= context->getMaximumCombinedUniformBufferBindings())
7466 {
7467 return gl::error(GL_INVALID_VALUE);
7468 }
7469 break;
7470
7471 default:
7472 return gl::error(GL_INVALID_ENUM);
7473 }
7474
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007475 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007476 {
7477 return gl::error(GL_INVALID_VALUE);
7478 }
7479
7480 switch (target)
7481 {
7482 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007483
7484 // size and offset must be a multiple of 4
7485 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7486 {
7487 return gl::error(GL_INVALID_VALUE);
7488 }
7489
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007490 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7491 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007492 break;
7493
7494 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007495
7496 // it is an error to bind an offset not a multiple of the alignment
7497 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7498 {
7499 return gl::error(GL_INVALID_VALUE);
7500 }
7501
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007502 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7503 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007504 break;
7505
7506 default:
7507 UNREACHABLE();
7508 }
7509 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007510 }
7511 catch(std::bad_alloc&)
7512 {
7513 return gl::error(GL_OUT_OF_MEMORY);
7514 }
7515}
7516
7517void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7518{
7519 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7520 target, index, buffer);
7521
7522 try
7523 {
7524 gl::Context *context = gl::getNonLostContext();
7525
7526 if (context)
7527 {
7528 if (context->getClientVersion() < 3)
7529 {
7530 return gl::error(GL_INVALID_OPERATION);
7531 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007532
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007533 switch (target)
7534 {
7535 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007536 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007537 {
7538 return gl::error(GL_INVALID_VALUE);
7539 }
7540 break;
7541
7542 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007543 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007544 {
7545 return gl::error(GL_INVALID_VALUE);
7546 }
7547 break;
7548
7549 default:
7550 return gl::error(GL_INVALID_ENUM);
7551 }
7552
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007553 switch (target)
7554 {
7555 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007556 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007557 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007558 break;
7559
7560 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007561 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007562 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007563 break;
7564
7565 default:
7566 UNREACHABLE();
7567 }
7568 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007569 }
7570 catch(std::bad_alloc&)
7571 {
7572 return gl::error(GL_OUT_OF_MEMORY);
7573 }
7574}
7575
7576void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7577{
7578 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7579 program, count, varyings, bufferMode);
7580
7581 try
7582 {
7583 gl::Context *context = gl::getNonLostContext();
7584
7585 if (context)
7586 {
7587 if (context->getClientVersion() < 3)
7588 {
7589 return gl::error(GL_INVALID_OPERATION);
7590 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007591
Jamie Madill54133512013-06-21 09:33:07 -04007592 // glTransformFeedbackVaryings
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007593 UNIMPLEMENTED();
7594 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007595 }
7596 catch(std::bad_alloc&)
7597 {
7598 return gl::error(GL_OUT_OF_MEMORY);
7599 }
7600}
7601
7602void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7603{
7604 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7605 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7606 program, index, bufSize, length, size, type, name);
7607
7608 try
7609 {
7610 gl::Context *context = gl::getNonLostContext();
7611
7612 if (context)
7613 {
7614 if (context->getClientVersion() < 3)
7615 {
7616 return gl::error(GL_INVALID_OPERATION);
7617 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007618
Jamie Madill54133512013-06-21 09:33:07 -04007619 // glGetTransformFeedbackVarying
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007620 UNIMPLEMENTED();
7621 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007622 }
7623 catch(std::bad_alloc&)
7624 {
7625 return gl::error(GL_OUT_OF_MEMORY);
7626 }
7627}
7628
7629void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7630{
7631 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7632 index, size, type, stride, pointer);
7633
7634 try
7635 {
7636 gl::Context *context = gl::getNonLostContext();
7637
7638 if (context)
7639 {
7640 if (context->getClientVersion() < 3)
7641 {
7642 return gl::error(GL_INVALID_OPERATION);
7643 }
7644 }
7645
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007646 if (index >= gl::MAX_VERTEX_ATTRIBS)
7647 {
7648 return gl::error(GL_INVALID_VALUE);
7649 }
7650
7651 if (size < 1 || size > 4)
7652 {
7653 return gl::error(GL_INVALID_VALUE);
7654 }
7655
7656 switch (type)
7657 {
7658 case GL_BYTE:
7659 case GL_UNSIGNED_BYTE:
7660 case GL_SHORT:
7661 case GL_UNSIGNED_SHORT:
7662 case GL_INT:
7663 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007664 case GL_INT_2_10_10_10_REV:
7665 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007666 break;
7667 default:
7668 return gl::error(GL_INVALID_ENUM);
7669 }
7670
7671 if (stride < 0)
7672 {
7673 return gl::error(GL_INVALID_VALUE);
7674 }
7675
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007676 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7677 {
7678 return gl::error(GL_INVALID_OPERATION);
7679 }
7680
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007681 if (context)
7682 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007683 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7684 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7685 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7686 // and the pointer argument is not NULL.
7687 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7688 {
7689 return gl::error(GL_INVALID_OPERATION);
7690 }
7691
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007692 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7693 stride, pointer);
7694 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007695 }
7696 catch(std::bad_alloc&)
7697 {
7698 return gl::error(GL_OUT_OF_MEMORY);
7699 }
7700}
7701
7702void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7703{
7704 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7705 index, pname, params);
7706
7707 try
7708 {
7709 gl::Context *context = gl::getNonLostContext();
7710
7711 if (context)
7712 {
7713 if (context->getClientVersion() < 3)
7714 {
7715 return gl::error(GL_INVALID_OPERATION);
7716 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007717
Jamie Madilla7d05862013-07-02 11:57:06 -04007718 if (index >= gl::MAX_VERTEX_ATTRIBS)
7719 {
7720 return gl::error(GL_INVALID_VALUE);
7721 }
7722
7723 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7724
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007725 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007726 {
7727 return;
7728 }
7729
7730 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7731 {
7732 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7733 for (int i = 0; i < 4; ++i)
7734 {
7735 params[i] = currentValueData.IntValues[i];
7736 }
7737 }
7738 else
7739 {
7740 *params = attribState.querySingleParameter<GLint>(pname);
7741 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007742 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007743 }
7744 catch(std::bad_alloc&)
7745 {
7746 return gl::error(GL_OUT_OF_MEMORY);
7747 }
7748}
7749
7750void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7751{
7752 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7753 index, pname, params);
7754
7755 try
7756 {
7757 gl::Context *context = gl::getNonLostContext();
7758
7759 if (context)
7760 {
7761 if (context->getClientVersion() < 3)
7762 {
7763 return gl::error(GL_INVALID_OPERATION);
7764 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007765
Jamie Madilla7d05862013-07-02 11:57:06 -04007766 if (index >= gl::MAX_VERTEX_ATTRIBS)
7767 {
7768 return gl::error(GL_INVALID_VALUE);
7769 }
7770
7771 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7772
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007773 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007774 {
7775 return;
7776 }
7777
7778 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7779 {
7780 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7781 for (int i = 0; i < 4; ++i)
7782 {
7783 params[i] = currentValueData.UnsignedIntValues[i];
7784 }
7785 }
7786 else
7787 {
7788 *params = attribState.querySingleParameter<GLuint>(pname);
7789 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007790 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007791 }
7792 catch(std::bad_alloc&)
7793 {
7794 return gl::error(GL_OUT_OF_MEMORY);
7795 }
7796}
7797
7798void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7799{
7800 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7801 index, x, y, z, w);
7802
7803 try
7804 {
7805 gl::Context *context = gl::getNonLostContext();
7806
7807 if (context)
7808 {
7809 if (context->getClientVersion() < 3)
7810 {
7811 return gl::error(GL_INVALID_OPERATION);
7812 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007813
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007814 if (index >= gl::MAX_VERTEX_ATTRIBS)
7815 {
7816 return gl::error(GL_INVALID_VALUE);
7817 }
7818
7819 GLint vals[4] = { x, y, z, w };
7820 context->setVertexAttribi(index, vals);
7821 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007822 }
7823 catch(std::bad_alloc&)
7824 {
7825 return gl::error(GL_OUT_OF_MEMORY);
7826 }
7827}
7828
7829void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7830{
7831 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7832 index, x, y, z, w);
7833
7834 try
7835 {
7836 gl::Context *context = gl::getNonLostContext();
7837
7838 if (context)
7839 {
7840 if (context->getClientVersion() < 3)
7841 {
7842 return gl::error(GL_INVALID_OPERATION);
7843 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007844
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007845 if (index >= gl::MAX_VERTEX_ATTRIBS)
7846 {
7847 return gl::error(GL_INVALID_VALUE);
7848 }
7849
7850 GLuint vals[4] = { x, y, z, w };
7851 context->setVertexAttribu(index, vals);
7852 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007853 }
7854 catch(std::bad_alloc&)
7855 {
7856 return gl::error(GL_OUT_OF_MEMORY);
7857 }
7858}
7859
7860void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7861{
7862 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7863
7864 try
7865 {
7866 gl::Context *context = gl::getNonLostContext();
7867
7868 if (context)
7869 {
7870 if (context->getClientVersion() < 3)
7871 {
7872 return gl::error(GL_INVALID_OPERATION);
7873 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007874
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007875 if (index >= gl::MAX_VERTEX_ATTRIBS)
7876 {
7877 return gl::error(GL_INVALID_VALUE);
7878 }
7879
7880 context->setVertexAttribi(index, v);
7881 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007882 }
7883 catch(std::bad_alloc&)
7884 {
7885 return gl::error(GL_OUT_OF_MEMORY);
7886 }
7887}
7888
7889void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7890{
7891 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7892
7893 try
7894 {
7895 gl::Context *context = gl::getNonLostContext();
7896
7897 if (context)
7898 {
7899 if (context->getClientVersion() < 3)
7900 {
7901 return gl::error(GL_INVALID_OPERATION);
7902 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007903
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007904 if (index >= gl::MAX_VERTEX_ATTRIBS)
7905 {
7906 return gl::error(GL_INVALID_VALUE);
7907 }
7908
7909 context->setVertexAttribu(index, v);
7910 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007911 }
7912 catch(std::bad_alloc&)
7913 {
7914 return gl::error(GL_OUT_OF_MEMORY);
7915 }
7916}
7917
7918void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7919{
7920 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7921 program, location, params);
7922
7923 try
7924 {
7925 gl::Context *context = gl::getNonLostContext();
7926
7927 if (context)
7928 {
7929 if (context->getClientVersion() < 3)
7930 {
7931 return gl::error(GL_INVALID_OPERATION);
7932 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007933
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00007934 if (program == 0)
7935 {
7936 return gl::error(GL_INVALID_VALUE);
7937 }
7938
7939 gl::Program *programObject = context->getProgram(program);
7940
7941 if (!programObject || !programObject->isLinked())
7942 {
7943 return gl::error(GL_INVALID_OPERATION);
7944 }
7945
7946 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7947 if (!programBinary)
7948 {
7949 return gl::error(GL_INVALID_OPERATION);
7950 }
7951
7952 if (!programBinary->getUniformuiv(location, NULL, params))
7953 {
7954 return gl::error(GL_INVALID_OPERATION);
7955 }
7956 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007957 }
7958 catch(std::bad_alloc&)
7959 {
7960 return gl::error(GL_OUT_OF_MEMORY);
7961 }
7962}
7963
7964GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
7965{
7966 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
7967 program, name);
7968
7969 try
7970 {
7971 gl::Context *context = gl::getNonLostContext();
7972
7973 if (context)
7974 {
7975 if (context->getClientVersion() < 3)
7976 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04007977 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007978 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007979
Jamie Madilld1e78c92013-06-20 11:55:50 -04007980 if (program == 0)
7981 {
7982 return gl::error(GL_INVALID_VALUE, -1);
7983 }
7984
7985 gl::Program *programObject = context->getProgram(program);
7986
7987 if (!programObject || !programObject->isLinked())
7988 {
7989 return gl::error(GL_INVALID_OPERATION, -1);
7990 }
7991
7992 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7993 if (!programBinary)
7994 {
7995 return gl::error(GL_INVALID_OPERATION, -1);
7996 }
7997
7998 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007999 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008000 }
8001 catch(std::bad_alloc&)
8002 {
8003 return gl::error(GL_OUT_OF_MEMORY, 0);
8004 }
8005
8006 return 0;
8007}
8008
8009void __stdcall glUniform1ui(GLint location, GLuint v0)
8010{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008011 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008012}
8013
8014void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8015{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008016 const GLuint xy[] = { v0, v1 };
8017 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008018}
8019
8020void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8021{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008022 const GLuint xyz[] = { v0, v1, v2 };
8023 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008024}
8025
8026void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8027{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008028 const GLuint xyzw[] = { v0, v1, v2, v3 };
8029 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008030}
8031
8032void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8033{
8034 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8035 location, count, value);
8036
8037 try
8038 {
8039 gl::Context *context = gl::getNonLostContext();
8040
8041 if (context)
8042 {
8043 if (context->getClientVersion() < 3)
8044 {
8045 return gl::error(GL_INVALID_OPERATION);
8046 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008047
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008048 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8049 if (!programBinary)
8050 {
8051 return gl::error(GL_INVALID_OPERATION);
8052 }
8053
8054 if (!programBinary->setUniform1uiv(location, count, value))
8055 {
8056 return gl::error(GL_INVALID_OPERATION);
8057 }
8058 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008059 }
8060 catch(std::bad_alloc&)
8061 {
8062 return gl::error(GL_OUT_OF_MEMORY);
8063 }
8064}
8065
8066void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8067{
8068 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8069 location, count, value);
8070
8071 try
8072 {
8073 gl::Context *context = gl::getNonLostContext();
8074
8075 if (context)
8076 {
8077 if (context->getClientVersion() < 3)
8078 {
8079 return gl::error(GL_INVALID_OPERATION);
8080 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008081
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008082 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8083 if (!programBinary)
8084 {
8085 return gl::error(GL_INVALID_OPERATION);
8086 }
8087
8088 if (!programBinary->setUniform2uiv(location, count, value))
8089 {
8090 return gl::error(GL_INVALID_OPERATION);
8091 }
8092 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008093 }
8094 catch(std::bad_alloc&)
8095 {
8096 return gl::error(GL_OUT_OF_MEMORY);
8097 }
8098}
8099
8100void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8101{
8102 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8103 location, count, value);
8104
8105 try
8106 {
8107 gl::Context *context = gl::getNonLostContext();
8108
8109 if (context)
8110 {
8111 if (context->getClientVersion() < 3)
8112 {
8113 return gl::error(GL_INVALID_OPERATION);
8114 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008115
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008116 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8117 if (!programBinary)
8118 {
8119 return gl::error(GL_INVALID_OPERATION);
8120 }
8121
8122 if (!programBinary->setUniform3uiv(location, count, value))
8123 {
8124 return gl::error(GL_INVALID_OPERATION);
8125 }
8126 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008127 }
8128 catch(std::bad_alloc&)
8129 {
8130 return gl::error(GL_OUT_OF_MEMORY);
8131 }
8132}
8133
8134void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8135{
8136 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8137 location, count, value);
8138
8139 try
8140 {
8141 gl::Context *context = gl::getNonLostContext();
8142
8143 if (context)
8144 {
8145 if (context->getClientVersion() < 3)
8146 {
8147 return gl::error(GL_INVALID_OPERATION);
8148 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008149
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008150 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8151 if (!programBinary)
8152 {
8153 return gl::error(GL_INVALID_OPERATION);
8154 }
8155
8156 if (!programBinary->setUniform4uiv(location, count, value))
8157 {
8158 return gl::error(GL_INVALID_OPERATION);
8159 }
8160 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008161 }
8162 catch(std::bad_alloc&)
8163 {
8164 return gl::error(GL_OUT_OF_MEMORY);
8165 }
8166}
8167
8168void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8169{
8170 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8171 buffer, drawbuffer, value);
8172
8173 try
8174 {
8175 gl::Context *context = gl::getNonLostContext();
8176
8177 if (context)
8178 {
8179 if (context->getClientVersion() < 3)
8180 {
8181 return gl::error(GL_INVALID_OPERATION);
8182 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008183
Jamie Madill54133512013-06-21 09:33:07 -04008184 // glClearBufferiv
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008185 UNIMPLEMENTED();
8186 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008187 }
8188 catch(std::bad_alloc&)
8189 {
8190 return gl::error(GL_OUT_OF_MEMORY);
8191 }
8192}
8193
8194void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8195{
8196 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8197 buffer, drawbuffer, value);
8198
8199 try
8200 {
8201 gl::Context *context = gl::getNonLostContext();
8202
8203 if (context)
8204 {
8205 if (context->getClientVersion() < 3)
8206 {
8207 return gl::error(GL_INVALID_OPERATION);
8208 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008209
Jamie Madill54133512013-06-21 09:33:07 -04008210 // glClearBufferuiv
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008211 UNIMPLEMENTED();
8212 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008213 }
8214 catch(std::bad_alloc&)
8215 {
8216 return gl::error(GL_OUT_OF_MEMORY);
8217 }
8218}
8219
8220void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8221{
8222 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8223 buffer, drawbuffer, value);
8224
8225 try
8226 {
8227 gl::Context *context = gl::getNonLostContext();
8228
8229 if (context)
8230 {
8231 if (context->getClientVersion() < 3)
8232 {
8233 return gl::error(GL_INVALID_OPERATION);
8234 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008235
Jamie Madill54133512013-06-21 09:33:07 -04008236 // glClearBufferfv
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008237 UNIMPLEMENTED();
8238 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008239 }
8240 catch(std::bad_alloc&)
8241 {
8242 return gl::error(GL_OUT_OF_MEMORY);
8243 }
8244}
8245
8246void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8247{
8248 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8249 buffer, drawbuffer, depth, stencil);
8250
8251 try
8252 {
8253 gl::Context *context = gl::getNonLostContext();
8254
8255 if (context)
8256 {
8257 if (context->getClientVersion() < 3)
8258 {
8259 return gl::error(GL_INVALID_OPERATION);
8260 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008261
Jamie Madill54133512013-06-21 09:33:07 -04008262 // glClearBufferfi
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008263 UNIMPLEMENTED();
8264 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008265 }
8266 catch(std::bad_alloc&)
8267 {
8268 return gl::error(GL_OUT_OF_MEMORY);
8269 }
8270}
8271
8272const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8273{
8274 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8275
8276 try
8277 {
8278 gl::Context *context = gl::getNonLostContext();
8279
8280 if (context)
8281 {
8282 if (context->getClientVersion() < 3)
8283 {
8284 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8285 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008286
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008287 if (name != GL_EXTENSIONS)
8288 {
8289 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8290 }
8291
8292 if (index >= context->getNumExtensions())
8293 {
8294 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8295 }
8296
8297 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8298 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008299 }
8300 catch(std::bad_alloc&)
8301 {
8302 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8303 }
8304
8305 return NULL;
8306}
8307
8308void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8309{
8310 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8311 readTarget, writeTarget, readOffset, writeOffset, size);
8312
8313 try
8314 {
8315 gl::Context *context = gl::getNonLostContext();
8316
8317 if (context)
8318 {
8319 if (context->getClientVersion() < 3)
8320 {
8321 return gl::error(GL_INVALID_OPERATION);
8322 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008323
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008324 gl::Buffer *readBuffer = NULL;
8325 switch (readTarget)
8326 {
8327 case GL_ARRAY_BUFFER:
8328 readBuffer = context->getArrayBuffer();
8329 break;
8330 case GL_COPY_READ_BUFFER:
8331 readBuffer = context->getCopyReadBuffer();
8332 break;
8333 case GL_COPY_WRITE_BUFFER:
8334 readBuffer = context->getCopyWriteBuffer();
8335 break;
8336 case GL_ELEMENT_ARRAY_BUFFER:
8337 readBuffer = context->getElementArrayBuffer();
8338 break;
8339 case GL_PIXEL_PACK_BUFFER:
8340 readBuffer = context->getPixelPackBuffer();
8341 break;
8342 case GL_PIXEL_UNPACK_BUFFER:
8343 readBuffer = context->getPixelUnpackBuffer();
8344 break;
8345 case GL_TRANSFORM_FEEDBACK_BUFFER:
8346 readBuffer = context->getGenericTransformFeedbackBuffer();
8347 break;
8348 case GL_UNIFORM_BUFFER:
8349 readBuffer = context->getGenericUniformBuffer();
8350 break;
8351 default:
8352 return gl::error(GL_INVALID_ENUM);
8353 }
8354
8355 gl::Buffer *writeBuffer = NULL;
8356 switch (writeTarget)
8357 {
8358 case GL_ARRAY_BUFFER:
8359 writeBuffer = context->getArrayBuffer();
8360 break;
8361 case GL_COPY_READ_BUFFER:
8362 writeBuffer = context->getCopyReadBuffer();
8363 break;
8364 case GL_COPY_WRITE_BUFFER:
8365 writeBuffer = context->getCopyWriteBuffer();
8366 break;
8367 case GL_ELEMENT_ARRAY_BUFFER:
8368 writeBuffer = context->getElementArrayBuffer();
8369 break;
8370 case GL_PIXEL_PACK_BUFFER:
8371 writeBuffer = context->getPixelPackBuffer();
8372 break;
8373 case GL_PIXEL_UNPACK_BUFFER:
8374 writeBuffer = context->getPixelUnpackBuffer();
8375 break;
8376 case GL_TRANSFORM_FEEDBACK_BUFFER:
8377 writeBuffer = context->getGenericTransformFeedbackBuffer();
8378 break;
8379 case GL_UNIFORM_BUFFER:
8380 writeBuffer = context->getGenericUniformBuffer();
8381 break;
8382 default:
8383 return gl::error(GL_INVALID_ENUM);
8384 }
8385
8386 if (!readBuffer || !writeBuffer)
8387 {
8388 return gl::error(GL_INVALID_OPERATION);
8389 }
8390
8391 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8392 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8393 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8394 {
8395 return gl::error(GL_INVALID_VALUE);
8396 }
8397
8398 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8399 {
8400 return gl::error(GL_INVALID_VALUE);
8401 }
8402
8403 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8404
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008405 // if size is zero, the copy is a successful no-op
8406 if (size > 0)
8407 {
8408 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8409 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008410 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008411 }
8412 catch(std::bad_alloc&)
8413 {
8414 return gl::error(GL_OUT_OF_MEMORY);
8415 }
8416}
8417
8418void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8419{
8420 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8421 program, uniformCount, uniformNames, uniformIndices);
8422
8423 try
8424 {
8425 gl::Context *context = gl::getNonLostContext();
8426
8427 if (context)
8428 {
8429 if (context->getClientVersion() < 3)
8430 {
8431 return gl::error(GL_INVALID_OPERATION);
8432 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008433
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008434 if (uniformCount < 0)
8435 {
8436 return gl::error(GL_INVALID_VALUE);
8437 }
8438
8439 gl::Program *programObject = context->getProgram(program);
8440
8441 if (!programObject)
8442 {
8443 if (context->getShader(program))
8444 {
8445 return gl::error(GL_INVALID_OPERATION);
8446 }
8447 else
8448 {
8449 return gl::error(GL_INVALID_VALUE);
8450 }
8451 }
8452
8453 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8454 if (!programObject->isLinked() || !programBinary)
8455 {
8456 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8457 {
8458 uniformIndices[uniformId] = GL_INVALID_INDEX;
8459 }
8460 }
8461 else
8462 {
8463 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8464 {
8465 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8466 }
8467 }
8468 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008469 }
8470 catch(std::bad_alloc&)
8471 {
8472 return gl::error(GL_OUT_OF_MEMORY);
8473 }
8474}
8475
8476void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8477{
8478 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8479 program, uniformCount, uniformIndices, pname, params);
8480
8481 try
8482 {
8483 gl::Context *context = gl::getNonLostContext();
8484
8485 if (context)
8486 {
8487 if (context->getClientVersion() < 3)
8488 {
8489 return gl::error(GL_INVALID_OPERATION);
8490 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008491
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008492 if (uniformCount < 0)
8493 {
8494 return gl::error(GL_INVALID_VALUE);
8495 }
8496
8497 gl::Program *programObject = context->getProgram(program);
8498
8499 if (!programObject)
8500 {
8501 if (context->getShader(program))
8502 {
8503 return gl::error(GL_INVALID_OPERATION);
8504 }
8505 else
8506 {
8507 return gl::error(GL_INVALID_VALUE);
8508 }
8509 }
8510
8511 switch (pname)
8512 {
8513 case GL_UNIFORM_TYPE:
8514 case GL_UNIFORM_SIZE:
8515 case GL_UNIFORM_NAME_LENGTH:
8516 case GL_UNIFORM_BLOCK_INDEX:
8517 case GL_UNIFORM_OFFSET:
8518 case GL_UNIFORM_ARRAY_STRIDE:
8519 case GL_UNIFORM_MATRIX_STRIDE:
8520 case GL_UNIFORM_IS_ROW_MAJOR:
8521 break;
8522 default:
8523 return gl::error(GL_INVALID_ENUM);
8524 }
8525
8526 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8527
8528 if (!programBinary && uniformCount > 0)
8529 {
8530 return gl::error(GL_INVALID_VALUE);
8531 }
8532
8533 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8534 {
8535 const GLuint index = uniformIndices[uniformId];
8536
8537 if (index >= (GLuint)programBinary->getActiveUniformCount())
8538 {
8539 return gl::error(GL_INVALID_VALUE);
8540 }
8541 }
8542
8543 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8544 {
8545 const GLuint index = uniformIndices[uniformId];
8546 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8547 }
8548 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008549 }
8550 catch(std::bad_alloc&)
8551 {
8552 return gl::error(GL_OUT_OF_MEMORY);
8553 }
8554}
8555
8556GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8557{
8558 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8559
8560 try
8561 {
8562 gl::Context *context = gl::getNonLostContext();
8563
8564 if (context)
8565 {
8566 if (context->getClientVersion() < 3)
8567 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008568 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008569 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008570
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008571 gl::Program *programObject = context->getProgram(program);
8572
8573 if (!programObject)
8574 {
8575 if (context->getShader(program))
8576 {
8577 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8578 }
8579 else
8580 {
8581 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8582 }
8583 }
8584
8585 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8586 if (!programBinary)
8587 {
8588 return GL_INVALID_INDEX;
8589 }
8590
8591 return programBinary->getUniformBlockIndex(uniformBlockName);
8592 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008593 }
8594 catch(std::bad_alloc&)
8595 {
8596 return gl::error(GL_OUT_OF_MEMORY, 0);
8597 }
8598
8599 return 0;
8600}
8601
8602void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8603{
8604 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8605 program, uniformBlockIndex, pname, params);
8606
8607 try
8608 {
8609 gl::Context *context = gl::getNonLostContext();
8610
8611 if (context)
8612 {
8613 if (context->getClientVersion() < 3)
8614 {
8615 return gl::error(GL_INVALID_OPERATION);
8616 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008617 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008618
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008619 if (!programObject)
8620 {
8621 if (context->getShader(program))
8622 {
8623 return gl::error(GL_INVALID_OPERATION);
8624 }
8625 else
8626 {
8627 return gl::error(GL_INVALID_VALUE);
8628 }
8629 }
8630
8631 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8632
8633 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8634 {
8635 return gl::error(GL_INVALID_VALUE);
8636 }
8637
8638 switch (pname)
8639 {
8640 case GL_UNIFORM_BLOCK_BINDING:
8641 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8642 break;
8643
8644 case GL_UNIFORM_BLOCK_DATA_SIZE:
8645 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8646 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8647 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8648 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8649 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8650 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8651 break;
8652
8653 default:
8654 return gl::error(GL_INVALID_ENUM);
8655 }
8656 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008657 }
8658 catch(std::bad_alloc&)
8659 {
8660 return gl::error(GL_OUT_OF_MEMORY);
8661 }
8662}
8663
8664void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8665{
8666 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8667 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8668
8669 try
8670 {
8671 gl::Context *context = gl::getNonLostContext();
8672
8673 if (context)
8674 {
8675 if (context->getClientVersion() < 3)
8676 {
8677 return gl::error(GL_INVALID_OPERATION);
8678 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008679
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008680 gl::Program *programObject = context->getProgram(program);
8681
8682 if (!programObject)
8683 {
8684 if (context->getShader(program))
8685 {
8686 return gl::error(GL_INVALID_OPERATION);
8687 }
8688 else
8689 {
8690 return gl::error(GL_INVALID_VALUE);
8691 }
8692 }
8693
8694 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8695
8696 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8697 {
8698 return gl::error(GL_INVALID_VALUE);
8699 }
8700
8701 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8702 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008703 }
8704 catch(std::bad_alloc&)
8705 {
8706 return gl::error(GL_OUT_OF_MEMORY);
8707 }
8708}
8709
8710void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8711{
8712 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8713 program, uniformBlockIndex, uniformBlockBinding);
8714
8715 try
8716 {
8717 gl::Context *context = gl::getNonLostContext();
8718
8719 if (context)
8720 {
8721 if (context->getClientVersion() < 3)
8722 {
8723 return gl::error(GL_INVALID_OPERATION);
8724 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008725
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008726 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8727 {
8728 return gl::error(GL_INVALID_VALUE);
8729 }
8730
8731 gl::Program *programObject = context->getProgram(program);
8732
8733 if (!programObject)
8734 {
8735 if (context->getShader(program))
8736 {
8737 return gl::error(GL_INVALID_OPERATION);
8738 }
8739 else
8740 {
8741 return gl::error(GL_INVALID_VALUE);
8742 }
8743 }
8744
8745 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8746
8747 // if never linked, there won't be any uniform blocks
8748 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8749 {
8750 return gl::error(GL_INVALID_VALUE);
8751 }
8752
8753 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8754 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008755 }
8756 catch(std::bad_alloc&)
8757 {
8758 return gl::error(GL_OUT_OF_MEMORY);
8759 }
8760}
8761
8762void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8763{
8764 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8765 mode, first, count, instanceCount);
8766
8767 try
8768 {
8769 gl::Context *context = gl::getNonLostContext();
8770
8771 if (context)
8772 {
8773 if (context->getClientVersion() < 3)
8774 {
8775 return gl::error(GL_INVALID_OPERATION);
8776 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008777
Jamie Madill54133512013-06-21 09:33:07 -04008778 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008779 UNIMPLEMENTED();
8780 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008781 }
8782 catch(std::bad_alloc&)
8783 {
8784 return gl::error(GL_OUT_OF_MEMORY);
8785 }
8786}
8787
8788void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8789{
8790 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8791 mode, count, type, indices, instanceCount);
8792
8793 try
8794 {
8795 gl::Context *context = gl::getNonLostContext();
8796
8797 if (context)
8798 {
8799 if (context->getClientVersion() < 3)
8800 {
8801 return gl::error(GL_INVALID_OPERATION);
8802 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008803
Jamie Madill54133512013-06-21 09:33:07 -04008804 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008805 UNIMPLEMENTED();
8806 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008807 }
8808 catch(std::bad_alloc&)
8809 {
8810 return gl::error(GL_OUT_OF_MEMORY);
8811 }
8812}
8813
8814GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8815{
8816 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8817
8818 try
8819 {
8820 gl::Context *context = gl::getNonLostContext();
8821
8822 if (context)
8823 {
8824 if (context->getClientVersion() < 3)
8825 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008826 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008827 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008828
Jamie Madill5215e1a2013-07-26 11:55:19 -04008829 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8830 {
8831 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8832 }
8833
8834 if (flags != 0)
8835 {
8836 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8837 }
8838
8839 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008840 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008841 }
8842 catch(std::bad_alloc&)
8843 {
8844 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8845 }
8846
8847 return NULL;
8848}
8849
8850GLboolean __stdcall glIsSync(GLsync sync)
8851{
8852 EVENT("(GLsync sync = 0x%0.8p)", sync);
8853
8854 try
8855 {
8856 gl::Context *context = gl::getNonLostContext();
8857
8858 if (context)
8859 {
8860 if (context->getClientVersion() < 3)
8861 {
8862 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8863 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008864
Jamie Madill5215e1a2013-07-26 11:55:19 -04008865 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008866 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008867 }
8868 catch(std::bad_alloc&)
8869 {
8870 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8871 }
8872
8873 return GL_FALSE;
8874}
8875
8876void __stdcall glDeleteSync(GLsync sync)
8877{
8878 EVENT("(GLsync sync = 0x%0.8p)", sync);
8879
8880 try
8881 {
8882 gl::Context *context = gl::getNonLostContext();
8883
8884 if (context)
8885 {
8886 if (context->getClientVersion() < 3)
8887 {
8888 return gl::error(GL_INVALID_OPERATION);
8889 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008890
Jamie Madill5215e1a2013-07-26 11:55:19 -04008891 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8892 {
8893 return gl::error(GL_INVALID_VALUE);
8894 }
8895
8896 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008897 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008898 }
8899 catch(std::bad_alloc&)
8900 {
8901 return gl::error(GL_OUT_OF_MEMORY);
8902 }
8903}
8904
8905GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8906{
8907 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8908 sync, flags, timeout);
8909
8910 try
8911 {
8912 gl::Context *context = gl::getNonLostContext();
8913
8914 if (context)
8915 {
8916 if (context->getClientVersion() < 3)
8917 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008918 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008919 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008920
Jamie Madill5215e1a2013-07-26 11:55:19 -04008921 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
8922 {
8923 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8924 }
8925
8926 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8927
8928 if (!fenceSync)
8929 {
8930 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8931 }
8932
8933 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008934 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008935 }
8936 catch(std::bad_alloc&)
8937 {
8938 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8939 }
8940
8941 return GL_FALSE;
8942}
8943
8944void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8945{
8946 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8947 sync, flags, timeout);
8948
8949 try
8950 {
8951 gl::Context *context = gl::getNonLostContext();
8952
8953 if (context)
8954 {
8955 if (context->getClientVersion() < 3)
8956 {
8957 return gl::error(GL_INVALID_OPERATION);
8958 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008959
Jamie Madill5215e1a2013-07-26 11:55:19 -04008960 if (flags != 0)
8961 {
8962 return gl::error(GL_INVALID_VALUE);
8963 }
8964
8965 if (timeout != GL_TIMEOUT_IGNORED)
8966 {
8967 return gl::error(GL_INVALID_VALUE);
8968 }
8969
8970 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8971
8972 if (!fenceSync)
8973 {
8974 return gl::error(GL_INVALID_VALUE);
8975 }
8976
8977 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008978 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008979 }
8980 catch(std::bad_alloc&)
8981 {
8982 return gl::error(GL_OUT_OF_MEMORY);
8983 }
8984}
8985
8986void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
8987{
8988 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8989 pname, params);
8990
8991 try
8992 {
8993 gl::Context *context = gl::getNonLostContext();
8994
8995 if (context)
8996 {
8997 if (context->getClientVersion() < 3)
8998 {
8999 return gl::error(GL_INVALID_OPERATION);
9000 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009001
Jamie Madill71fbd602013-07-19 16:36:55 -04009002 if (!(context->getInteger64v(pname, params)))
9003 {
9004 GLenum nativeType;
9005 unsigned int numParams = 0;
9006 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9007 return gl::error(GL_INVALID_ENUM);
9008
9009 if (numParams == 0)
9010 return; // it is known that the pname is valid, but that there are no parameters to return.
9011
9012 if (nativeType == GL_BOOL)
9013 {
9014 GLboolean *boolParams = NULL;
9015 boolParams = new GLboolean[numParams];
9016
9017 context->getBooleanv(pname, boolParams);
9018
9019 for (unsigned int i = 0; i < numParams; ++i)
9020 {
9021 if (boolParams[i] == GL_FALSE)
9022 params[i] = 0;
9023 else
9024 params[i] = 1;
9025 }
9026
9027 delete [] boolParams;
9028 }
9029 else if (nativeType == GL_INT)
9030 {
9031 GLint *intParams = NULL;
9032 intParams = new GLint[numParams];
9033
9034 context->getIntegerv(pname, intParams);
9035
9036 for (unsigned int i = 0; i < numParams; ++i)
9037 {
9038 params[i] = static_cast<GLint64>(intParams[i]);
9039 }
9040
9041 delete [] intParams;
9042 }
9043 else if (nativeType == GL_FLOAT)
9044 {
9045 GLfloat *floatParams = NULL;
9046 floatParams = new GLfloat[numParams];
9047
9048 context->getFloatv(pname, floatParams);
9049
9050 for (unsigned int i = 0; i < numParams; ++i)
9051 {
9052 // RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
9053 if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
9054 {
9055 params[i] = static_cast<GLint64>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
9056 }
9057 else
9058 {
9059 params[i] = gl::iround<GLint64>(floatParams[i]);
9060 }
9061 }
9062
9063 delete [] floatParams;
9064 }
9065 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009066 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009067 }
9068 catch(std::bad_alloc&)
9069 {
9070 return gl::error(GL_OUT_OF_MEMORY);
9071 }
9072}
9073
9074void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9075{
9076 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9077 sync, pname, bufSize, length, values);
9078
9079 try
9080 {
9081 gl::Context *context = gl::getNonLostContext();
9082
9083 if (context)
9084 {
9085 if (context->getClientVersion() < 3)
9086 {
9087 return gl::error(GL_INVALID_OPERATION);
9088 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009089
Jamie Madill5215e1a2013-07-26 11:55:19 -04009090 if (bufSize < 0)
9091 {
9092 return gl::error(GL_INVALID_VALUE);
9093 }
9094
9095 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9096
9097 if (!fenceSync)
9098 {
9099 return gl::error(GL_INVALID_VALUE);
9100 }
9101
9102 switch (pname)
9103 {
9104 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9105 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9106 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9107 case GL_SYNC_FLAGS: values[0] = 0; break;
9108
9109 default:
9110 return gl::error(GL_INVALID_ENUM);
9111 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009112 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009113 }
9114 catch(std::bad_alloc&)
9115 {
9116 return gl::error(GL_OUT_OF_MEMORY);
9117 }
9118}
9119
9120void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9121{
9122 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9123 target, index, data);
9124
9125 try
9126 {
9127 gl::Context *context = gl::getNonLostContext();
9128
9129 if (context)
9130 {
9131 if (context->getClientVersion() < 3)
9132 {
9133 return gl::error(GL_INVALID_OPERATION);
9134 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009135
Jamie Madill54133512013-06-21 09:33:07 -04009136 // glGetInteger64i_v
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009137 UNIMPLEMENTED();
9138 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009139 }
9140 catch(std::bad_alloc&)
9141 {
9142 return gl::error(GL_OUT_OF_MEMORY);
9143 }
9144}
9145
9146void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9147{
9148 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9149 target, pname, params);
9150
9151 try
9152 {
9153 gl::Context *context = gl::getNonLostContext();
9154
9155 if (context)
9156 {
9157 if (context->getClientVersion() < 3)
9158 {
9159 return gl::error(GL_INVALID_OPERATION);
9160 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009161
Jamie Madill54133512013-06-21 09:33:07 -04009162 // glGetBufferParameteri64v
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009163 UNIMPLEMENTED();
9164 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009165 }
9166 catch(std::bad_alloc&)
9167 {
9168 return gl::error(GL_OUT_OF_MEMORY);
9169 }
9170}
9171
9172void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9173{
9174 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9175
9176 try
9177 {
9178 gl::Context *context = gl::getNonLostContext();
9179
9180 if (context)
9181 {
9182 if (context->getClientVersion() < 3)
9183 {
9184 return gl::error(GL_INVALID_OPERATION);
9185 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009186
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009187 if (count < 0)
9188 {
9189 return gl::error(GL_INVALID_VALUE);
9190 }
9191
9192 for (int i = 0; i < count; i++)
9193 {
9194 samplers[i] = context->createSampler();
9195 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009196 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009197 }
9198 catch(std::bad_alloc&)
9199 {
9200 return gl::error(GL_OUT_OF_MEMORY);
9201 }
9202}
9203
9204void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9205{
9206 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9207
9208 try
9209 {
9210 gl::Context *context = gl::getNonLostContext();
9211
9212 if (context)
9213 {
9214 if (context->getClientVersion() < 3)
9215 {
9216 return gl::error(GL_INVALID_OPERATION);
9217 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009218
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009219 if (count < 0)
9220 {
9221 return gl::error(GL_INVALID_VALUE);
9222 }
9223
9224 for (int i = 0; i < count; i++)
9225 {
9226 context->deleteSampler(samplers[i]);
9227 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009228 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009229 }
9230 catch(std::bad_alloc&)
9231 {
9232 return gl::error(GL_OUT_OF_MEMORY);
9233 }
9234}
9235
9236GLboolean __stdcall glIsSampler(GLuint sampler)
9237{
9238 EVENT("(GLuint sampler = %u)", sampler);
9239
9240 try
9241 {
9242 gl::Context *context = gl::getNonLostContext();
9243
9244 if (context)
9245 {
9246 if (context->getClientVersion() < 3)
9247 {
9248 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9249 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009250
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009251 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009252 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009253 }
9254 catch(std::bad_alloc&)
9255 {
9256 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9257 }
9258
9259 return GL_FALSE;
9260}
9261
9262void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9263{
9264 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9265
9266 try
9267 {
9268 gl::Context *context = gl::getNonLostContext();
9269
9270 if (context)
9271 {
9272 if (context->getClientVersion() < 3)
9273 {
9274 return gl::error(GL_INVALID_OPERATION);
9275 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009276
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009277 if (sampler != 0 && !context->isSampler(sampler))
9278 {
9279 return gl::error(GL_INVALID_OPERATION);
9280 }
9281
9282 if (unit >= context->getMaximumCombinedTextureImageUnits())
9283 {
9284 return gl::error(GL_INVALID_VALUE);
9285 }
9286
9287 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009288 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009289 }
9290 catch(std::bad_alloc&)
9291 {
9292 return gl::error(GL_OUT_OF_MEMORY);
9293 }
9294}
9295
9296void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9297{
9298 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9299
9300 try
9301 {
9302 gl::Context *context = gl::getNonLostContext();
9303
9304 if (context)
9305 {
9306 if (context->getClientVersion() < 3)
9307 {
9308 return gl::error(GL_INVALID_OPERATION);
9309 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009310
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009311 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009312 {
9313 return;
9314 }
9315
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009316 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009317 {
9318 return;
9319 }
9320
9321 if (!context->isSampler(sampler))
9322 {
9323 return gl::error(GL_INVALID_OPERATION);
9324 }
9325
9326 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009327 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009328 }
9329 catch(std::bad_alloc&)
9330 {
9331 return gl::error(GL_OUT_OF_MEMORY);
9332 }
9333}
9334
9335void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9336{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009337 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009338}
9339
9340void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9341{
9342 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9343
9344 try
9345 {
9346 gl::Context *context = gl::getNonLostContext();
9347
9348 if (context)
9349 {
9350 if (context->getClientVersion() < 3)
9351 {
9352 return gl::error(GL_INVALID_OPERATION);
9353 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009354
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009355 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009356 {
9357 return;
9358 }
9359
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009360 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009361 {
9362 return;
9363 }
9364
9365 if (!context->isSampler(sampler))
9366 {
9367 return gl::error(GL_INVALID_OPERATION);
9368 }
9369
9370 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009371 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009372 }
9373 catch(std::bad_alloc&)
9374 {
9375 return gl::error(GL_OUT_OF_MEMORY);
9376 }
9377}
9378
9379void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9380{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009381 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009382}
9383
9384void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9385{
9386 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9387
9388 try
9389 {
9390 gl::Context *context = gl::getNonLostContext();
9391
9392 if (context)
9393 {
9394 if (context->getClientVersion() < 3)
9395 {
9396 return gl::error(GL_INVALID_OPERATION);
9397 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009398
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009399 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009400 {
9401 return;
9402 }
9403
9404 if (!context->isSampler(sampler))
9405 {
9406 return gl::error(GL_INVALID_OPERATION);
9407 }
9408
9409 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009410 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009411 }
9412 catch(std::bad_alloc&)
9413 {
9414 return gl::error(GL_OUT_OF_MEMORY);
9415 }
9416}
9417
9418void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9419{
9420 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9421
9422 try
9423 {
9424 gl::Context *context = gl::getNonLostContext();
9425
9426 if (context)
9427 {
9428 if (context->getClientVersion() < 3)
9429 {
9430 return gl::error(GL_INVALID_OPERATION);
9431 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009432
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009433 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009434 {
9435 return;
9436 }
9437
9438 if (!context->isSampler(sampler))
9439 {
9440 return gl::error(GL_INVALID_OPERATION);
9441 }
9442
9443 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009444 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009445 }
9446 catch(std::bad_alloc&)
9447 {
9448 return gl::error(GL_OUT_OF_MEMORY);
9449 }
9450}
9451
9452void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9453{
9454 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9455
9456 try
9457 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009458 if (index >= gl::MAX_VERTEX_ATTRIBS)
9459 {
9460 return gl::error(GL_INVALID_VALUE);
9461 }
9462
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009463 gl::Context *context = gl::getNonLostContext();
9464
9465 if (context)
9466 {
9467 if (context->getClientVersion() < 3)
9468 {
9469 return gl::error(GL_INVALID_OPERATION);
9470 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009471
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009472 context->setVertexAttribDivisor(index, divisor);
9473 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009474 }
9475 catch(std::bad_alloc&)
9476 {
9477 return gl::error(GL_OUT_OF_MEMORY);
9478 }
9479}
9480
9481void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9482{
9483 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9484
9485 try
9486 {
9487 gl::Context *context = gl::getNonLostContext();
9488
9489 if (context)
9490 {
9491 if (context->getClientVersion() < 3)
9492 {
9493 return gl::error(GL_INVALID_OPERATION);
9494 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009495
Jamie Madill54133512013-06-21 09:33:07 -04009496 // glBindTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009497 UNIMPLEMENTED();
9498 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009499 }
9500 catch(std::bad_alloc&)
9501 {
9502 return gl::error(GL_OUT_OF_MEMORY);
9503 }
9504}
9505
9506void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9507{
9508 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9509
9510 try
9511 {
9512 gl::Context *context = gl::getNonLostContext();
9513
9514 if (context)
9515 {
9516 if (context->getClientVersion() < 3)
9517 {
9518 return gl::error(GL_INVALID_OPERATION);
9519 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009520
Jamie Madill54133512013-06-21 09:33:07 -04009521 // glDeleteTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009522 UNIMPLEMENTED();
9523 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009524 }
9525 catch(std::bad_alloc&)
9526 {
9527 return gl::error(GL_OUT_OF_MEMORY);
9528 }
9529}
9530
9531void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9532{
9533 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9534
9535 try
9536 {
9537 gl::Context *context = gl::getNonLostContext();
9538
9539 if (context)
9540 {
9541 if (context->getClientVersion() < 3)
9542 {
9543 return gl::error(GL_INVALID_OPERATION);
9544 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009545
Jamie Madill54133512013-06-21 09:33:07 -04009546 // glGenTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009547 UNIMPLEMENTED();
9548 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009549 }
9550 catch(std::bad_alloc&)
9551 {
9552 return gl::error(GL_OUT_OF_MEMORY);
9553 }
9554}
9555
9556GLboolean __stdcall glIsTransformFeedback(GLuint id)
9557{
9558 EVENT("(GLuint id = %u)", id);
9559
9560 try
9561 {
9562 gl::Context *context = gl::getNonLostContext();
9563
9564 if (context)
9565 {
9566 if (context->getClientVersion() < 3)
9567 {
9568 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9569 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009570
Jamie Madill54133512013-06-21 09:33:07 -04009571 // glIsTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009572 UNIMPLEMENTED();
9573 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009574 }
9575 catch(std::bad_alloc&)
9576 {
9577 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9578 }
9579
9580 return GL_FALSE;
9581}
9582
9583void __stdcall glPauseTransformFeedback(void)
9584{
9585 EVENT("(void)");
9586
9587 try
9588 {
9589 gl::Context *context = gl::getNonLostContext();
9590
9591 if (context)
9592 {
9593 if (context->getClientVersion() < 3)
9594 {
9595 return gl::error(GL_INVALID_OPERATION);
9596 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009597
Jamie Madill54133512013-06-21 09:33:07 -04009598 // glPauseTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009599 UNIMPLEMENTED();
9600 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009601 }
9602 catch(std::bad_alloc&)
9603 {
9604 return gl::error(GL_OUT_OF_MEMORY);
9605 }
9606}
9607
9608void __stdcall glResumeTransformFeedback(void)
9609{
9610 EVENT("(void)");
9611
9612 try
9613 {
9614 gl::Context *context = gl::getNonLostContext();
9615
9616 if (context)
9617 {
9618 if (context->getClientVersion() < 3)
9619 {
9620 return gl::error(GL_INVALID_OPERATION);
9621 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009622
Jamie Madill54133512013-06-21 09:33:07 -04009623 // glResumeTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009624 UNIMPLEMENTED();
9625 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009626 }
9627 catch(std::bad_alloc&)
9628 {
9629 return gl::error(GL_OUT_OF_MEMORY);
9630 }
9631}
9632
9633void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9634{
9635 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9636 program, bufSize, length, binaryFormat, binary);
9637
9638 try
9639 {
9640 gl::Context *context = gl::getNonLostContext();
9641
9642 if (context)
9643 {
9644 if (context->getClientVersion() < 3)
9645 {
9646 return gl::error(GL_INVALID_OPERATION);
9647 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009648
Jamie Madill54133512013-06-21 09:33:07 -04009649 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009650 UNIMPLEMENTED();
9651 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009652 }
9653 catch(std::bad_alloc&)
9654 {
9655 return gl::error(GL_OUT_OF_MEMORY);
9656 }
9657}
9658
9659void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9660{
9661 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9662 program, binaryFormat, binary, length);
9663
9664 try
9665 {
9666 gl::Context *context = gl::getNonLostContext();
9667
9668 if (context)
9669 {
9670 if (context->getClientVersion() < 3)
9671 {
9672 return gl::error(GL_INVALID_OPERATION);
9673 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009674
Jamie Madill54133512013-06-21 09:33:07 -04009675 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009676 UNIMPLEMENTED();
9677 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009678 }
9679 catch(std::bad_alloc&)
9680 {
9681 return gl::error(GL_OUT_OF_MEMORY);
9682 }
9683}
9684
9685void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9686{
9687 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9688 program, pname, value);
9689
9690 try
9691 {
9692 gl::Context *context = gl::getNonLostContext();
9693
9694 if (context)
9695 {
9696 if (context->getClientVersion() < 3)
9697 {
9698 return gl::error(GL_INVALID_OPERATION);
9699 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009700
Jamie Madill54133512013-06-21 09:33:07 -04009701 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009702 UNIMPLEMENTED();
9703 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009704 }
9705 catch(std::bad_alloc&)
9706 {
9707 return gl::error(GL_OUT_OF_MEMORY);
9708 }
9709}
9710
9711void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9712{
9713 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9714 target, numAttachments, attachments);
9715
9716 try
9717 {
9718 gl::Context *context = gl::getNonLostContext();
9719
9720 if (context)
9721 {
9722 if (context->getClientVersion() < 3)
9723 {
9724 return gl::error(GL_INVALID_OPERATION);
9725 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009726
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009727 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009728 {
9729 return;
9730 }
9731
9732 int maxDimension = context->getMaximumRenderbufferDimension();
9733 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9734 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009735 }
9736 catch(std::bad_alloc&)
9737 {
9738 return gl::error(GL_OUT_OF_MEMORY);
9739 }
9740}
9741
9742void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9743{
9744 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9745 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9746 target, numAttachments, attachments, x, y, width, height);
9747
9748 try
9749 {
9750 gl::Context *context = gl::getNonLostContext();
9751
9752 if (context)
9753 {
9754 if (context->getClientVersion() < 3)
9755 {
9756 return gl::error(GL_INVALID_OPERATION);
9757 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009758
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009759 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009760 {
9761 return;
9762 }
9763
9764 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9765 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009766 }
9767 catch(std::bad_alloc&)
9768 {
9769 return gl::error(GL_OUT_OF_MEMORY);
9770 }
9771}
9772
9773void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9774{
9775 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9776 target, levels, internalformat, width, height);
9777
9778 try
9779 {
9780 gl::Context *context = gl::getNonLostContext();
9781
9782 if (context)
9783 {
9784 if (context->getClientVersion() < 3)
9785 {
9786 return gl::error(GL_INVALID_OPERATION);
9787 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009788
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009789 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009790 {
9791 return;
9792 }
9793
9794 switch (target)
9795 {
9796 case GL_TEXTURE_2D:
9797 {
9798 gl::Texture2D *texture2d = context->getTexture2D();
9799 texture2d->storage(levels, internalformat, width, height);
9800 }
9801 break;
9802
9803 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
9804 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
9805 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
9806 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
9807 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
9808 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
9809 {
9810 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9811 textureCube->storage(levels, internalformat, width);
9812 }
9813 break;
9814
9815 default:
9816 return gl::error(GL_INVALID_ENUM);
9817 }
9818 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009819 }
9820 catch(std::bad_alloc&)
9821 {
9822 return gl::error(GL_OUT_OF_MEMORY);
9823 }
9824}
9825
9826void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9827{
9828 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9829 "GLsizei height = %d, GLsizei depth = %d)",
9830 target, levels, internalformat, width, height, depth);
9831
9832 try
9833 {
9834 gl::Context *context = gl::getNonLostContext();
9835
9836 if (context)
9837 {
9838 if (context->getClientVersion() < 3)
9839 {
9840 return gl::error(GL_INVALID_OPERATION);
9841 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009842
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009843 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009844 {
9845 return;
9846 }
9847
9848 switch (target)
9849 {
9850 case GL_TEXTURE_3D:
9851 {
9852 gl::Texture3D *texture3d = context->getTexture3D();
9853 texture3d->storage(levels, internalformat, width, height, depth);
9854 }
9855 break;
9856
9857 case GL_TEXTURE_2D_ARRAY:
9858 {
9859 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
9860 texture2darray->storage(levels, internalformat, width, height, depth);
9861 }
9862 break;
9863
9864 default:
9865 return gl::error(GL_INVALID_ENUM);
9866 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009867 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009868 }
9869 catch(std::bad_alloc&)
9870 {
9871 return gl::error(GL_OUT_OF_MEMORY);
9872 }
9873}
9874
9875void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9876{
9877 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9878 "GLint* params = 0x%0.8p)",
9879 target, internalformat, pname, bufSize, params);
9880
9881 try
9882 {
9883 gl::Context *context = gl::getNonLostContext();
9884
9885 if (context)
9886 {
9887 if (context->getClientVersion() < 3)
9888 {
9889 return gl::error(GL_INVALID_OPERATION);
9890 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009891
Shannon Woods809d2502013-07-08 10:32:18 -04009892 if (!gl::IsColorRenderingSupported(internalformat, context) &&
9893 !gl::IsDepthRenderingSupported(internalformat, context) &&
9894 !gl::IsStencilRenderingSupported(internalformat, context))
9895 {
9896 return gl::error(GL_INVALID_ENUM);
9897 }
9898
9899 if (target != GL_RENDERBUFFER)
9900 {
9901 return gl::error(GL_INVALID_ENUM);
9902 }
9903
9904 if (bufSize < 0)
9905 {
9906 return gl::error(GL_INVALID_VALUE);
9907 }
9908
9909 switch (pname)
9910 {
9911 case GL_NUM_SAMPLE_COUNTS:
9912 if (bufSize != 0)
9913 *params = context->getNumSampleCounts(internalformat);
9914 break;
9915 case GL_SAMPLES:
9916 context->getSampleCounts(internalformat, bufSize, params);
9917 break;
9918 default:
9919 return gl::error(GL_INVALID_ENUM);
9920 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009921 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009922 }
9923 catch(std::bad_alloc&)
9924 {
9925 return gl::error(GL_OUT_OF_MEMORY);
9926 }
9927}
9928
9929// Extension functions
9930
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009931void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9932 GLbitfield mask, GLenum filter)
9933{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009934 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009935 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9936 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9937 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9938
9939 try
9940 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009941 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009942
9943 if (context)
9944 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009945 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04009946 dstX0, dstY0, dstX1, dstY1, mask, filter,
9947 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009948 {
Geoff Lang758d5b22013-06-11 11:42:50 -04009949 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009950 }
9951
Geoff Lang758d5b22013-06-11 11:42:50 -04009952 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
9953 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009954 }
9955 }
9956 catch(std::bad_alloc&)
9957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009958 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009959 }
9960}
9961
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009962void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
9963 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009964{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009965 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00009966 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009967 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009968 target, level, internalformat, width, height, depth, border, format, type, pixels);
9969
9970 try
9971 {
9972 UNIMPLEMENTED(); // FIXME
9973 }
9974 catch(std::bad_alloc&)
9975 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009976 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009977 }
9978}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009979
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009980void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
9981 GLenum *binaryFormat, void *binary)
9982{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009983 EVENT("(GLenum program = 0x%X, bufSize = %d, length = 0x%0.8p, binaryFormat = 0x%0.8p, binary = 0x%0.8p)",
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009984 program, bufSize, length, binaryFormat, binary);
9985
9986 try
9987 {
9988 gl::Context *context = gl::getNonLostContext();
9989
9990 if (context)
9991 {
9992 gl::Program *programObject = context->getProgram(program);
9993
daniel@transgaming.com716056c2012-07-24 18:38:59 +00009994 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009996 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009997 }
9998
9999 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10000
10001 if (!programBinary)
10002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010003 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010004 }
10005
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010006 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010008 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010009 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010010
10011 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010012 }
10013 }
10014 catch(std::bad_alloc&)
10015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010016 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010017 }
10018}
10019
10020void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10021 const void *binary, GLint length)
10022{
10023 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10024 program, binaryFormat, binary, length);
10025
10026 try
10027 {
10028 gl::Context *context = gl::getNonLostContext();
10029
10030 if (context)
10031 {
10032 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010034 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010035 }
10036
10037 gl::Program *programObject = context->getProgram(program);
10038
10039 if (!programObject)
10040 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010041 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010042 }
10043
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010044 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010045 }
10046 }
10047 catch(std::bad_alloc&)
10048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010049 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010050 }
10051}
10052
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010053void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10054{
10055 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10056
10057 try
10058 {
10059 gl::Context *context = gl::getNonLostContext();
10060
10061 if (context)
10062 {
10063 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10064 {
10065 return gl::error(GL_INVALID_VALUE);
10066 }
10067
10068 if (context->getDrawFramebufferHandle() == 0)
10069 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010070 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010071 {
10072 return gl::error(GL_INVALID_OPERATION);
10073 }
10074
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010075 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010076 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010077 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010078 }
10079 }
10080 else
10081 {
10082 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10083 {
10084 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10085 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10086 {
10087 return gl::error(GL_INVALID_OPERATION);
10088 }
10089 }
10090 }
10091
10092 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10093
10094 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10095 {
10096 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10097 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010098
10099 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10100 {
10101 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10102 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010103 }
10104 }
10105 catch (std::bad_alloc&)
10106 {
10107 return gl::error(GL_OUT_OF_MEMORY);
10108 }
10109}
10110
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010111__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10112{
10113 struct Extension
10114 {
10115 const char *name;
10116 __eglMustCastToProperFunctionPointerType address;
10117 };
10118
10119 static const Extension glExtensions[] =
10120 {
10121 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010122 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010123 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010124 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10125 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10126 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10127 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10128 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10129 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10130 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010131 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010132 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010133 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10134 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10135 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10136 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010137 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10138 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10139 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10140 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10141 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10142 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10143 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010144 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010145 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10146 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10147 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010148 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10149 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010150
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010151 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010152 {
10153 if (strcmp(procname, glExtensions[ext].name) == 0)
10154 {
10155 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10156 }
10157 }
10158
10159 return NULL;
10160}
10161
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010162// Non-public functions used by EGL
10163
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010164bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010165{
10166 EVENT("(egl::Surface* surface = 0x%0.8p)",
10167 surface);
10168
10169 try
10170 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010171 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010172
10173 if (context)
10174 {
10175 gl::Texture2D *textureObject = context->getTexture2D();
10176
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010177 if (textureObject->isImmutable())
10178 {
10179 return false;
10180 }
10181
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010182 if (textureObject)
10183 {
10184 textureObject->bindTexImage(surface);
10185 }
10186 }
10187 }
10188 catch(std::bad_alloc&)
10189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010190 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010191 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010192
10193 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010194}
10195
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010196}